Ejemplo n.º 1
0
/*--------------------------------------------------------------------------*/
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));
        }
    }
}
Ejemplo n.º 2
0
/*--------------------------------------------------------------------------*/
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);
    }
}
Ejemplo n.º 3
0
/*--------------------------------------------------------------------------*/
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);
    }
}
Ejemplo n.º 4
0
    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);
                }
            }
        }
    }