Beispiel #1
0
void matlib_xvwrite_csv
(
    char*        file_name, 
    matlib_index n,
    matlib_xv    v[n]
)
{
    FILE *fp = fopen(file_name, "w+");
    if(fp==NULL)
    {
        term_exec("failed to create the file '%s'", file_name );
    }

    matlib_index i, j;

    for (i=0; i<v->len; i++)
    {
        for (j=0; j<n-1; j++)
        {
            fprintf(fp, "% 0.16f\t", v[j].elem_p[i]);
        }
        fprintf(fp, "% 0.16f\n", v[j].elem_p[i]);
    }
    fclose(fp);
}
Beispiel #2
0
void matlib_xmwrite_csv(char* file_name, matlib_xm M)
{

    FILE *fp = fopen(file_name, "w+");
#if 1
    if(fp==NULL)
    {
        term_exec("failed to create the file '%s'", file_name );
    }
#endif

    matlib_index i, j, col_st, row_st;
    if(M.order == MATLIB_COL_MAJOR)
    {
        col_st = 1;
        row_st = M.lenc;
    }
    else if(M.order == MATLIB_ROW_MAJOR)
    {
        col_st = M.lenr;
        row_st = 1;
    }
    else
    {
        term_exec( "Storage order unknown (order: %d)", M.order);
    }

    for (i=0; i<M.lenc; i++)
    {
        for (j=0; j<M.lenr-1; j++)
        {
            fprintf(fp, "% 0.16f\t", M.elem_p[i*col_st+j*row_st]);
        }
        fprintf(fp, "% 0.16f\n", M.elem_p[i*col_st+j*row_st]);
    }
    fclose(fp);
}
Beispiel #3
0
void matlib_xzvwrite_csv
(
    char*        file_name, 
    matlib_index m,
    matlib_xv    u[m],
    matlib_index n,
    matlib_zv    v[n]
)
{
    FILE *fp = fopen(file_name, "w+");
    if(fp==NULL)
    {
        term_exec("failed to create the file '%s'", file_name );
    }

    matlib_index i, j, k;

    for (i=0; i<u->len; i++)
    {
        for (j=0; j<m-1; j++)
        {
            fprintf(fp, "% 0.16f\t", u[j].elem_p[i]);
        }
        if(n>0)
        {
            fprintf(fp, "% 0.16f\t", u[j].elem_p[i]);
            for (k=0; k<n-1; k++)
            {
                fprintf(fp, "% 0.16f%+0.16fi\t", v[k].elem_p[i]);
            }
            fprintf(fp, "% 0.16f%+0.16fi\n", v[k].elem_p[i]);
        }
        else
        {
            fprintf(fp, "% 0.16f\n", u[j].elem_p[i]);
        }
    }
    fclose(fp);
}
Beispiel #4
0
static void execterm(char **args)
{
	if (!mainterm())
		term_exec(args);
}
Beispiel #5
0
void jacobi_find_zeros
( 
    matlib_index n, 
    double a, 
    double b, 
    double *zeros, 
    double tol
)
/*
 * Description: This function calculates the zeros of the Jacobi polynomial   
 * $J^{(a,b)_n(x)}$. A combination of bisection and Newton's method is used to
 * find the roots.                                                            
 *                                                                            
 * Input(s):                                                                  
 *  n   - order of the Jacobi polynomials                                     
 *  a,b - Jacobi polynomial parameters, $a,b \in[-1/2,1/2]$                   
 *  tol - numerical tolerance                                                 
 *                                                                            
 * Output(s):                                                                 
 *  zeros - roots of the Jacobi polynomial                                    
 *                                                                            
 **/

{
    double JP[2], dJP, *C, e;
    double x, xa, xb, xmid;
    double JPa, tmp;
    matlib_index i, j = 0;
    
    double theta = M_PI/(n+0.5);

    /* Perform the check on a and b parameters. */
    bool param_valid = ((fabs(a)<0.5) & (fabs(b)<0.5));
    if (!param_valid)
    {
        term_exec( "parameters outside the range (-0.5,0.5): a=%0.4f, b=%0.4f", a, b);
    }

    /* Coefficients for the recurrence relation for Jacobi polynomials */
    double C1[n+1], D[n-1], E[n-1];
    C1[0] = 0.5*(a-b);
    C1[1] = 0.5*(a+b+2);
    for( i=2; i<(n+1); i++){
        tmp = 2*i*(i+a+b)*(2*i-2+a+b);
        C1[i] = (2*i-1+a+b)*(a*a-b*b)/tmp;
        D[i-2] = (2*i-2+a+b)*(2*i-1+a+b)*(2*i+a+b)/tmp;
        E[i-2] = 2*(i-1+a)*(i-1+b)*(2*i+a+b)/tmp;
    }
    
    C = calloc(3, sizeof(double));
    tmp = 2.0*n+a+b;
    *(C+0) = n*(a-b)/tmp;
    *(C+1) = n*(2.0*n+a+b)/tmp;
    *(C+2) = 2.0*(n+a)*(n+b)/tmp;


    if(n>0)
    {
        for( i=0; i<n; i++)
        {
            /* Determine the bracketting interval */
            xa = -cos((i+0.5)*theta);
            xb = -cos((i+1)*theta);
            jacobi_calcjp( n, a, b, xa, C1, D, E, JP);
            JPa = *(JP+1);
            jacobi_calcjp( n, a, b, xb, C1, D, E, JP);
            tmp = JPa**(JP+1);
            /* exit if the bracketting interval does not contain even one root 
             * */
            if(tmp>0)
            {
                term_exec("Root does not lie in: [% 0.16f, % 0.16f]", xa, xb);
            }
            xmid = 0.5*(xa+xb);

            jacobi_calcjp( n, a, b, xmid, C1, D, E, JP);
            
            e = fabs(*(JP+1));
            if(e>tol)
            {
                tmp = JPa**(JP+1);
                if(tmp<0)
                    xb = xmid;
                else 
                {
                    xa = xmid;
                    JPa = *(JP+1);
                }
            }
            x = xmid;
            while(e>tol && j<JCOBI_ITER_MAX)
            {
                /* Newton step is only used to find a better bracketting
                 * interval. 
                 * */ 
                dJP = ((*(C+0)-x**(C+1))**(JP+1)+*(C+2)**(JP+0))/(1-x*x);
                xmid = x-*(JP+1)/dJP;
                jacobi_calcjp( n, a, b, xmid, C1, D, E, JP);
                e = fabs(*(JP+1));
                if(e>tol)
                {
                    if(xmid>xa && xmid<xb)
                    {
                        tmp = JPa**(JP+1);
                        if(tmp<0)
                            xb = xmid;
                        else 
                        {
                            xa = xmid;
                            JPa = *(JP+1);
                        }
                    } 
                    else 
                        xmid = 0.5*(xa+xb);

                    x = xmid;
                }
                j++;
            }
            if (j>JCOBI_ITER_MAX)
            {
                term_exec("Threshold iteration reached (j=%d)", j);
            }
            j = 0;
            *zeros = xmid;
            zeros++;
        }
    }
}