33 static double ranf (
void);
43 debug (2,
"dft_transform (..., sign = %d)\n", sign);
45 if (sign > 0) kind = FFTW_R2HC;
46 else kind = FFTW_HC2R;
48 assert(in->
dim == 3 && out->
dim == 3);
55 plans =
xmalloc (
sizeof (fftw_plan) * (in->
nz + 4));
57 for (i = 0; i < in->
nz + 4; i++) {
58 plans[
i] = fftw_plan_many_r2r (1,
79 for (i = 0; i < in->
nz + 4; i++) {
80 fftw_execute (plans[i]);
85 for (i = 0; i < in->
nz + 4; i++) {
86 fftw_destroy_plan (plans[i]);
107 #pragma omp for private(ir, iz)
108 for (k = 0; k < grid->ntheta / 2 + 1; k++) {
109 if (k < grid->ntheta / 2) {
111 double re, im, re_f, im_f;
114 re_f =
RZT (f, ir, iz, k);
115 im_f = (k == 0? 0:
RZT (f, ir, iz, grid->ntheta - k));
117 re = re_f *
wk[k] - (k == 0? 0: im_f *
wk[grid->ntheta - k]);
118 im = (k == 0? 0: re_f *
wk[grid->ntheta - k] + im_f *
wk[k]);
120 RZT (f, ir, iz, k) = re /
r_at (ir, grid->level);
122 RZT (f, ir, iz, grid->ntheta - k) = im /
r_at (ir, grid->level);
124 }
else if ((grid->ntheta % 2) == 0) {
127 RZT (f, ir, iz, k) =
wk[k] *
RZT (f, ir, iz, k)
128 /
r_at (ir, grid->level);
152 #pragma omp for private(ir, iz, pwr, tmp)
153 for (k = 0; k < cdr->ntheta; k++) {
159 tmp = pow(
RZT(var, ir, iz, k), power);
160 pwr += (tmp *
r_at(ir, cdr->level));
162 weights[k] =
twopi * pwr *
dr[cdr->level] *
dz[cdr->level];
179 static FILE *fp_charge = NULL;
180 static FILE *fp_electrons = NULL;
181 static double *powers_charge = NULL;
182 static double *powers_electrons = NULL;
185 if (NULL == fp_charge) {
187 asprintf (&fname,
"%s/charge-weights.tsv", prefix);
188 fp_charge = fopen (fname,
"w");
190 if (NULL == fp_charge) {
191 fatal (
"Unable to open %s\n", fname);
196 asprintf (&fname,
"%s/electrons-weights.tsv", prefix);
197 fp_electrons = fopen (fname,
"w");
199 if (NULL == fp_electrons) {
200 fatal (
"Unable to open %s\n", fname);
206 if (NULL == powers_charge) {
207 powers_charge =
xmalloc (
sizeof(
double) * grid->ntheta);
208 powers_electrons =
xmalloc (
sizeof(
double) * grid->ntheta);
221 fprintf (fp_charge,
"%g", t);
222 fprintf (fp_electrons,
"%g", t);
224 for (i = 0; i < grid->ntheta; i++) {
225 fprintf (fp_charge,
"\t%g", powers_charge[i]);
226 fprintf (fp_electrons,
"\t%g", powers_electrons[i]);
229 fprintf (fp_charge,
"\n");
230 fprintf (fp_electrons,
"\n");
233 fflush(fp_electrons);
252 #pragma omp for private(ir, iz)
253 for (k = 1; k < cdr->ntheta; k++) {
258 RZT (var, ir, iz, k) =
261 epsilon_k[k - 1] *
RZT (var, ir, iz, 0) *
r_at (ir, cdr->level);
272 int ir, iz, k, allocated =
FALSE;
282 if (NULL == epsilon_k) {
283 epsilon_k = (
double*)
xmalloc (
sizeof(
double) * (grid->ntheta - 1));
285 for (k = 1; k < grid->ntheta; k++) {
305 if (allocated) free (epsilon_k);
325 #pragma omp for private(ir, iz)
326 for (itheta = 0; itheta < grid->ntheta; itheta++) {
328 RZT(var, ir, iz, itheta) /= grid->ntheta;
342 static double y1, y2;
343 static int has_more =
FALSE;
348 return mu + y2 * sigma;
352 x1 = 2.0 *
ranf() - 1.0;
353 x2 = 2.0 *
ranf() - 1.0;
354 w = x1 * x1 + x2 * x2;
357 w = sqrt ((-2.0 * log (w)) / w);
363 return mu + y1 * sigma;
366 #define AM (1.0 / RAND_MAX)