Ejemplo n.º 1
0
/*--------------------------------------------------------------------------*/
SCICOS_BLOCKS_IMPEXP void variable_delay(scicos_block *block, int flag)
{
    /*  rpar[0]=max delay, rpar[1]=init value, ipar[0]=buffer length */
    double** work = (double**) block->work;
    double* pw = NULL, del = 0., t = 0., td = 0.;
    int* iw = NULL;
    int i = 0, j = 0, k = 0;
    if (flag == 4) /* the workspace is used to store previous values */
    {
        if ((*work = (double*)
                     scicos_malloc(sizeof(int) + sizeof(double) *
                                   block->ipar[0] * (1 + block->insz[0]))) == NULL )
        {
            set_block_error(-16);
            return;
        }
        pw = *work;
        pw[0] = -block->rpar[0] * block->ipar[0];
        for (i = 1; i < block->ipar[0]; i++)
        {
            pw[i] = pw[i - 1] + block->rpar[0];
            for (j = 1; j < block->insz[0] + 1; j++)
            {
                pw[i + block->ipar[0]*j] = block->rpar[1];
            }
        }
        iw = (int *) (pw + block->ipar[0] * (1 + block->insz[0]));
        *iw = 0;
    }
    else  if (flag == 5)
    {
        scicos_free(*work);
    }
    else if (flag == 1)
    {
        if (get_phase_simulation() == 1)
        {
            do_cold_restart();
        }
        pw = *work;
        iw = (int *) (pw + block->ipar[0] * (1 + block->insz[0]));
        t = get_scicos_time();
        del = Min(Max(0, block->inptr[1][0]), block->rpar[0]);
        td = t - del;
        if (td < pw[*iw])
        {
            scicos_print(_("delayed time=%f but last stored time=%f\n"), td, pw[*iw]);
            scicos_print(_("Consider increasing the length of buffer in variable delay block\n"));
        }
        if (t > pw[(block->ipar[0] + *iw - 1) % block->ipar[0]])
        {
            for (j = 1; j < block->insz[0] + 1; j++)
            {
                pw[*iw + block->ipar[0]*j] = block->inptr[0][j - 1];
            }
            pw[*iw] = t;
            *iw = (*iw + 1) % block->ipar[0];
        }
        else
        {
            for (j = 1; j < block->insz[0] + 1; j++)
            {
                pw[(block->ipar[0] + *iw - 1) % block->ipar[0] + block->ipar[0]*j] = block->inptr[0][j - 1];
            }
            pw[(block->ipar[0] + *iw - 1) % block->ipar[0]] = t;
        }

        i = 0;
        j = block->ipar[0] - 1;

        while (j - i > 1)
        {
            k = (i + j) / 2;
            if (td < pw[(k + *iw) % block->ipar[0]])
            {
                j = k;
            }
            else if (td > pw[(k + *iw) % block->ipar[0]])
            {
                i = k;
            }
            else
            {
                i = k;
                j = k;
                break;
            }
        }
        i = (i + *iw) % block->ipar[0];
        j = (j + *iw) % block->ipar[0];
        del = pw[j] - pw[i];
        if (del != 0.0)
        {
            for (k = 1; k < block->insz[0] + 1; k++)
            {
                block->outptr[0][k - 1] = ((pw[j] - td) * pw[i + block->ipar[0] * k] +
                                           (td - pw[i]) * pw[j + block->ipar[0] * k]) / del;
            }
        }
        else
        {
            for (k = 1; k < block->insz[0] + 1; k++)
            {
                block->outptr[0][k - 1] = pw[i + block->ipar[0] * k];
            }
        }
    }
}
Ejemplo n.º 2
0
/*--------------------------------------------------------------------------*/
SCICOS_BLOCKS_IMPEXP void time_delay(scicos_block *block, int flag)
{
    /*  rpar[0]=delay, rpar[1]=init value, ipar[0]=buffer length */
    double** work = (double**) block->work;
    double *pw = NULL, del = 0., t = 0., td = 0., eps = 0.;
    int* iw = NULL;
    int i = 0, j = 0, k = 0;

    if (flag == 4)
    {
        /* the workspace is used to store previous values */
        if ((*work = (double*) scicos_malloc(sizeof(int) + sizeof(double) *
                                             block->ipar[0] * (1 + block->insz[0]))) == NULL )
        {
            set_block_error(-16);
            return;
        }
        eps = 1.0e-9; /* shift times to left to avoid replacing 0 */
        pw = *work;
        pw[0] = -block->rpar[0] * (block->ipar[0] - 1) - eps;
        for (j = 1; j < block->insz[0] + 1; j++)
        {
            pw[block->ipar[0]*j] = block->rpar[1];
        }

        for (i = 1; i < block->ipar[0]; i++)
        {
            pw[i] = pw[i - 1] + block->rpar[0] - eps;
            for (j = 1; j < block->insz[0] + 1; j++)
            {
                pw[i + block->ipar[0]*j] = block->rpar[1];
            }
        }

        iw = (int *)(pw + block->ipar[0] * (1 + block->insz[0]));
        *iw = 0;
        for (k = 0; k < block->insz[0]; k++)
        {
            block->outptr[0][k] = block->rpar[1];
        }
    }
    else  if (flag == 5)
    {
        scicos_free(*work);

    }
    else if (flag == 0 || flag == 2)
    {
        if (flag == 2)
        {
            do_cold_restart();
        }
        pw = *work;
        iw = (int *)(pw + block->ipar[0] * (1 + block->insz[0]));
        t = get_scicos_time();
        td = t - block->rpar[0];
        if (td < pw[*iw])
        {
            scicos_print(_("delayed time=%f but last stored time=%f \n"), td, pw[*iw]);
            scicos_print(_("Consider increasing the length of buffer in delay block \n"));
        }

        if (t > pw[(block->ipar[0] + *iw - 1) % block->ipar[0]])
        {
            for (j = 1; j < block->insz[0] + 1; j++)
            {
                pw[*iw + block->ipar[0]*j] = block->inptr[0][j - 1];
            }
            pw[*iw] = t;
            /*scicos_print(_("**time is %f. I put %f, in %d \n"), t,block->inptr[0][0],*iw);*/
            *iw = (*iw + 1) % block->ipar[0];

        }
        else
        {
            for (j = 1; j < block->insz[0] + 1; j++)
            {
                pw[(block->ipar[0] + *iw - 1) % block->ipar[0] + block->ipar[0]*j] = block->inptr[0][j - 1];
            }
            pw[(block->ipar[0] + *iw - 1) % block->ipar[0]] = t;
            /*scicos_print("**time is %f. I put %f, in %d \n", t,block->inptr[0][0],*iw);*/

        }

    }
    else if (flag == 1)
    {
        pw = *work;
        iw = (int *) (pw + block->ipar[0] * (1 + block->insz[0]));
        t = get_scicos_time();
        td = t - block->rpar[0];

        i = 0;
        j = block->ipar[0] - 1;

        while (j - i > 1)
        {
            k = (i + j) / 2;
            if (td < pw[(k + *iw) % block->ipar[0]])
            {
                j = k;
            }
            else if (td > pw[(k + *iw) % block->ipar[0]])
            {
                i = k;
            }
            else
            {
                i = k;
                j = k;
                break;
            }
        }
        i = (i + *iw) % block->ipar[0];
        j = (j + *iw) % block->ipar[0];
        del = pw[j] - pw[i];
        /*    scicos_print(_("time is %f. interpolating %d and %d, i.e. %f, %f\n"), t,i,j,pw[i],pw[j]);
        scicos_print(_("values are  %f   %f.\n"),pw[i+block->ipar[0]],pw[j+block->ipar[0]]);*/
        if (del != 0.0)
        {
            for (k = 1; k < block->insz[0] + 1; k++)
            {
                block->outptr[0][k - 1] = ((pw[j] - td) * pw[i + block->ipar[0] * k] +
                                           (td - pw[i]) * pw[j + block->ipar[0] * k]) / del;
            }
        }
        else
        {
            for (k = 1; k < block->insz[0] + 1; k++)
            {
                block->outptr[0][k - 1] = pw[i + block->ipar[0] * k];
            }
        }
    }
}
Ejemplo n.º 3
0
/*--------------------------------------------------------------------------*/ 
SCICOS_BLOCKS_IMPEXP void ratelimiter(scicos_block *block,int flag)
{
	/*  rpar[0]=rising rate limit, rpar[1]=falling rate limit */
	double* pw = NULL;
	double rate = 0. , t = 0.;

	if (flag == 4)
	{
		/* the workspace is used to store previous values */
		if ((*block->work = scicos_malloc(sizeof(double)*4))== NULL ) 
		{
			set_block_error(-16);
			return;
		}
		pw=*block->work; 
		pw[0]=0.0;
		pw[1]=0.0;
		pw[2]=0.0;
		pw[3]=0.0;
	}
	else  if (flag == 5)
	{
		scicos_free(*block->work);
	} 
	else if (flag==1) 
	{
		if (get_phase_simulation()==1) do_cold_restart();
		pw=*block->work; 
		t=get_scicos_time();
		if(t>pw[2])
		{
			pw[0]=pw[2];
			pw[1]=pw[3];
			rate=(block->inptr[0][0]-pw[1])/(t-pw[0]);
		}
		else if(t<=pw[2])
		{
			if(t>pw[0])
			{
				rate=(block->inptr[0][0]-pw[1])/(t-pw[0]);
			}
			else
			{
				rate=0.0;
			}
		}

		if(rate>block->rpar[0])
		{
			block->outptr[0][0]=(t-pw[0])*block->rpar[0]+pw[1];
		}
		else if(rate<block->rpar[1])
		{
			block->outptr[0][0]=(t-pw[0])*block->rpar[1]+pw[1];
		}
		else
		{
			block->outptr[0][0]=block->inptr[0][0];
		}
		pw[2]=t;
		pw[3]=block->outptr[0][0];
	}
}