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); }
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); }
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); }
static void execterm(char **args) { if (!mainterm()) term_exec(args); }
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++; } } }