/*--------------------------------------------------------------------------*/ SCICOS_BLOCKS_IMPEXP void rndblk_m(scicos_block *block, int flag) { double *y = NULL; double *rpar = NULL; double *z = NULL; int *ipar = NULL; int ny = 0, my = 0, i = 0, iy = 0; double sr = 0., si = 0., tl = 0; my = GetOutPortRows(block, 1); ny = GetOutPortCols(block, 1); ipar = GetIparPtrs(block); rpar = GetRparPtrs(block); y = GetRealOutPortPtrs(block, 1); z = GetDstate(block); if (flag == 2 || flag == 4) { if (ipar[0] == 0) { iy = (int)z[0]; for (i = 0; i < my * ny; i++) { *(z + i + 1) = C2F(urand)(&iy); } } else { iy = (int)z[0]; for (i = 0; i < my * ny; i++) { do { sr = 2.0 * C2F(urand)(&iy) - 1.0; si = 2.0 * C2F(urand)(&iy) - 1.0; tl = sr * sr + si * si; } while (tl > 1.0); z[i + 1] = sr * (sqrt(-2.0 * log(tl) / tl)); } } *(z) = iy; } if (flag == 1 || flag == 6) { for (i = 0; i < my * ny; i++) { *(y + i) = *(rpar + i) + (*(rpar + i + my * ny)) * (*(z + i + 1)); } } }
/*--------------------------------------------------------------------------*/ SCICOS_BLOCKS_IMPEXP void selector_m(scicos_block *block, int flag) { void *u = NULL; void *y = NULL; double *z = NULL; int nu = 0, mu = 0, ic = 0, nev = 0, nin = 0, so = 0; z = GetDstate(block); nin = GetNin(block); ic = (int)z[0]; if (flag < 3) { ic = 0; nev = GetNevIn(block); while (nev >= 1) { ic = ic + 1; nev = nev / 2; } } if (nin > 1) { mu = GetInPortRows(block, ic); nu = GetInPortCols(block, ic); u = GetInPortPtrs(block, ic); so = GetSizeOfOut(block, 1); y = GetOutPortPtrs(block, 1); memcpy(y, u, mu * nu * so); } else { mu = GetInPortRows(block, 1); nu = GetInPortCols(block, 1); u = GetInPortPtrs(block, 1); y = GetOutPortPtrs(block, ic); so = GetSizeOfIn(block, 1); memcpy(y, u, mu * nu * so); } }
/*--------------------------------------------------------------------------*/ SCICOS_BLOCKS_IMPEXP void counter(scicos_block *block, int flag) { double *y = NULL, *z = NULL; int *ipar = NULL; y = GetRealOutPortPtrs(block, 1); z = GetDstate(block); ipar = GetIparPtrs(block); if (flag == 1) { if (*ipar == 1) { *y = *z + *(ipar + 2); } else { *y = *(ipar + 1) - *z; } } else if (flag == 2) { *z = (1 + (int) * z) % (*(ipar + 1) - * (ipar + 2) + 1); } }
void sci_zeroOrderHold(scicos_block *block,scicos::enumScicosFlags flag) { // get block data pointers, etc double *_z=GetDstate(block); double *_u1=GetRealInPortPtrs(block,1); double *_u2=GetRealInPortPtrs(block,2); double *_y1=GetRealOutPortPtrs(block,1); int *_ipar=GetIparPtrs(block); int & evtFlag = GetNevIn(block); int & evtPortTime = _ipar[0]; int & evtPortReset = _ipar[1]; // compute flags int evtFlagTime = scicos::evtPortNumToFlag(evtPortTime); int evtFlagReset = scicos::evtPortNumToFlag(evtPortReset); // loop over all rows of data int i,j; int nRows = GetInPortRows(block,1); int nCols = GetInPortCols(block,1); size_t nBytes = sizeof(double)*nRows*nCols; for(i=0; i<nRows; i++) { for(j=0; j<nCols; j++) { if (flag ==scicos::computeOutput || flag ==scicos::reinitialize || flag ==scicos::initialize) memcpy(_y1,_z,nBytes); else if (flag == scicos::updateState) { // bitwise comparison for flag if(evtFlag & evtFlagReset && _u2) { memcpy(_z,_u2,nBytes); } else if(evtFlag & evtFlagTime && _u1) { memcpy(_z,_u1,nBytes); } else { printf("\nunhandled event flat %d\n",evtFlag); printf("\nknown flags:\n"); printf("\ttime flag: %d\n",evtFlagTime); printf("\ttime flag & event flag: %d\n",evtFlagTime & evtFlag); printf("\treset flag: %d\n",evtFlagReset); printf("\treset flag & event flag: %d\n",evtFlagReset & evtFlag); } } else if (flag == scicos::terminate) { } else { char msg[50]; sprintf(msg,"unhandled block flag %d\n",flag); Coserror(msg); } } } }