static void PmlTableGen(int bw, int m, double *storeplm, double *workspace) { double *prev, *prevprev, *temp1, *temp2, *temp3, *temp4, *x_i, *eval_args; int i; /* double *storeplm_ptr; */ prevprev = workspace; prev = prevprev + (2*bw); temp1 = prev + (2*bw); temp2 = temp1 + (2*bw); temp3 = temp2 + (2*bw); temp4 = temp3 + (2*bw); x_i = temp4 + (2*bw); eval_args = x_i + (2*bw); /* storeplm_ptr = storeplm; */ /* get the evaluation nodes */ EvalPts(2*bw,x_i); ArcCosEvalPts(2*bw,eval_args); /* set initial values of first two Pmls */ for (i=0; i<2*bw; i++) prevprev[i] = 0.0; if (m == 0) for (i=0; i<2*bw; i++) { /* prev[i] = 0.5; */ prev[i] = 0.707106781186547 ; /* 1/sqrt(2) */ } else Pmm_L2(m, eval_args, 2*bw, prev); memcpy(storeplm, prev, (size_t) sizeof(double) * 2 * bw); for(i = 0; i < bw - m - 1; i++) { vec_mul(L2_cn(m,m+i),prevprev,temp1,2*bw); vec_pt_mul(prev, x_i, temp2, 2*bw); vec_mul(L2_an(m,m+i), temp2, temp3, 2*bw); vec_add(temp3, temp1, temp4, 2*bw); /* temp4 now contains P(m,m+i+1) */ storeplm += (2 * bw); memcpy(storeplm, temp4, (size_t) sizeof(double) * 2 * bw); memcpy(prevprev, prev, (size_t) sizeof(double) * 2 * bw); memcpy(prev, temp4, (size_t) sizeof(double) * 2 * bw); } /* storeplm = storeplm_ptr; */ }
void CosPmlTableGen(int bw, int m, double *tablespace, double *workspace) { double *prev, *prevprev, *temp1, *temp2, *temp3, *temp4; double *x_i, *eval_args; double *tableptr, *cosres ; int i, j, k; /* fftw stuff now */ double fudge ; fftw_plan p ; prevprev = workspace; prev = prevprev + bw; temp1 = prev + bw; temp2 = temp1 + bw; temp3 = temp2 + bw; temp4 = temp3 + bw; x_i = temp4 + bw; eval_args = x_i + bw; cosres = eval_args + bw; tableptr = tablespace; /* make fftw plan */ p = fftw_plan_r2r_1d( bw, temp4, cosres, FFTW_REDFT10, FFTW_ESTIMATE ) ; /* main loop */ /* Set the initial number of evaluation points to appropriate amount */ /* now get the evaluation nodes */ EvalPts(bw,x_i); ArcCosEvalPts(bw,eval_args); /* set initial values of first two Pmls */ for (i=0; i<bw; i++) prevprev[i] = 0.0; if (m == 0) for (i=0; i<bw; i++) prev[i] = 0.707106781186547; /* sqrt(1/2) */ else Pmm_L2(m, eval_args, bw, prev); if ( m % 2 ) /* need to divide out sin x */ for (i=0; i<bw; i++) prev[i] /= sin(eval_args[i]); /* set k to highest degree coefficient */ if ((m % 2) == 0) k = m; else k = m-1; /* now compute cosine transform */ memcpy( temp4, prev, sizeof(double) * bw ); fftw_execute( p ); cosres[0] *= 0.707106781186547 ; fudge = 1. / sqrt(((double) bw ) ); for ( i = 0 ; i < bw ; i ++ ) cosres[i] *= fudge ; /* store what I've got so far */ for (i=0; i<=k; i+=2) tableptr[i/2] = cosres[i]; /* update tableptr */ tableptr += k/2+1; /* now generate remaining pmls */ for (i=0; i<bw-m-1; i++) { vec_mul(L2_cn(m,m+i),prevprev,temp1,bw); vec_pt_mul(prev, x_i, temp2, bw); vec_mul(L2_an(m,m+i), temp2, temp3, bw); vec_add(temp3, temp1, temp4, bw); /* temp4 now contains P(m,m+i+1) */ /* compute cosine transform */ fftw_execute( p ); cosres[0] *= 0.707106781186547 ; for ( j = 0 ; j < bw ; j ++ ) cosres[j] *= fudge ; /* update degree counter */ k++; /* now put decimated result into table */ if ( i % 2 ) for (j=0; j<=k; j+=2) tableptr[j/2] = cosres[j]; else for (j=1; j<=k; j+=2) tableptr[j/2] = cosres[j]; /* update tableptr */ tableptr += k/2+1; /* now update Pi and P(i+1) */ memcpy(prevprev, prev, sizeof(double) * bw); memcpy(prev, temp4, sizeof(double) * bw); } fftw_destroy_plan( p ); }
void CosPmlTableGenLim( int bw, int m, int lim, double *tablespace, double *workspace) { double *prev, *prevprev, *temp1, *temp2, *temp3, *temp4; double *x_i, *eval_args; double *tableptr, *cosres, *cosworkspace; int i, j, k; prevprev = workspace; prev = prevprev + bw; temp1 = prev + bw; temp2 = temp1 + bw; temp3 = temp2 + bw; temp4 = temp3 + bw; x_i = temp4 + bw; eval_args = x_i + bw; cosres = eval_args + bw; cosworkspace = cosres + bw; tableptr = tablespace; /* main loop */ /* Set the initial number of evaluation points to appropriate amount */ /* now get the evaluation nodes */ EvalPts(bw,x_i); ArcCosEvalPts(bw,eval_args); /* set initial values of first two Pmls */ for (i=0; i<bw; i++) prevprev[i] = 0.0; if (m == 0) { for (i=0; i<bw; i++) { prev[i] = 1.0; } } else Pmm_L2(m, eval_args, bw, prev); if ((m % 2) == 1) { /* need to divide out sin x */ for (i=0; i<bw; i++) prev[i] /= sin(eval_args[i]); } /* set k to highest degree coefficient */ if ((m % 2) == 0) k = m; else k = m-1; /* now compute cosine transform */ kFCT(prev, cosres, cosworkspace, bw, bw, 1); for (i=0; i<=k; i+=2) tableptr[i/2] = cosres[i]; /* update tableptr */ tableptr += k/2+1; /* now generate remaining pmls */ for (i = 0 ; i < lim - m - 1 ; i ++) { vec_mul(L2_cn(m,m+i),prevprev,temp1,bw); vec_pt_mul(prev, x_i, temp2, bw); vec_mul(L2_an(m,m+i), temp2, temp3, bw); vec_add(temp3, temp1, temp4, bw); /* temp4 now contains P(m,m+i+1) */ /* compute cosine transform */ kFCT(temp4, cosres, cosworkspace, bw, bw, 1); /* update degree counter */ k++; /* now put decimated result into table */ if ((i % 2) == 1) { for (j=0; j<=k; j+=2) tableptr[j/2] = cosres[j]; } else { for (j=1; j<=k; j+=2) tableptr[j/2] = cosres[j]; } /* update tableptr */ tableptr += k/2+1; /* now update Pi and P(i+1) */ memcpy(prevprev, prev, sizeof(double) * bw); memcpy(prev, temp4, sizeof(double) * bw); } }