ASCOT5
Loading...
Searching...
No Matches
afsi.c
Go to the documentation of this file.
1
5#include <string.h>
6#include <math.h>
7#include <hdf5_hl.h>
8#include "ascot5.h"
9#include "print.h"
10#include "gitver.h"
11#include "math.h"
12#include "physlib.h"
13#include "consts.h"
14#include "offload.h"
15#include "random.h"
16#include "simulate.h"
17#include "boschhale.h"
18#include "diag/hist.h"
19#include "hdf5_interface.h"
20#include "hdf5io/hdf5_helpers.h"
21#include "hdf5io/hdf5_dist.h"
23#include "afsi.h"
24
27
29 int i, real m1, real m2, real mprod1, real mprod2, real Q, int prodmomspace,
30 real* ppara1, real* pperp1, real* ppara2, real* pperp2, real* vcom2,
31 real* prod1_p1, real* prod1_p2, real* prod2_p1, real* prod2_p2);
33 sim_data* sim, afsi_data* afsi, real mass1, real mass2,
34 real vol, int nsample, size_t i0, size_t i1, size_t i2,
35 real r, real phi, real z, real time, real rho,
36 real* density1, real* ppara1, real* pperp1,
37 real* density2, real* ppara2, real* pperp2);
38void afsi_sample_beam_2d(histogram* hist, real mass, real vol, int nsample,
39 size_t i0, size_t i1, size_t i2, real* density, real* ppara,
40 real* pperp);
41void afsi_sample_thermal_2d(sim_data* sim, int ispecies, real mass, int nsample,
42 real r, real phi, real z, real time, real rho,
43 real* density, real* pppara, real* ppperp);
44
60void afsi_run(sim_data* sim, afsi_data* afsi, int n,
61 histogram* prod1, histogram* prod2) {
62 /* QID for this run */
63 char qid[11];
65 strcpy(sim->qid, qid);
66
67 int mpi_rank = 0, mpi_root = 0; /* AFSI does not support MPI */
68 print_out0(VERBOSE_MINIMAL, mpi_rank, mpi_root, "AFSI5\n");
69 print_out0(VERBOSE_MINIMAL, mpi_rank, mpi_root,
70 "Tag %s\nBranch %s\n\n", GIT_VERSION, GIT_BRANCH);
71
72 random_init(&rdata, time((NULL)));
73 strcpy(sim->hdf5_out, sim->hdf5_in);
74 simulate_init(sim);
75
76 if( hdf5_interface_init_results(sim, qid, "afsi") ) {
77 print_out0(VERBOSE_MINIMAL, mpi_rank, mpi_root,
78 "\nInitializing output failed.\n"
79 "See stderr for details.\n");
80 /* Free data and terminate */
81 abort();
82 }
83
84 real m1, q1, m2, q2, mprod1, qprod1, mprod2, qprod2, Q;
86 afsi->reaction, &m1, &q1, &m2, &q2,
87 &mprod1, &qprod1, &mprod2, &qprod2, &Q);
88
89 int prod_mom_space;
90 int i0coord, i1coord, i2coord, p1coord, p2coord;
91 if(prod1->axes[0].n) {
92 i0coord = 0;
93 i1coord = 1;
94 i2coord = 2;
95 }
96 else if(prod1->axes[3].n) {
97 i0coord = 3;
98 i1coord = 4;
99 i2coord = 1;
100 }
101 else {
102 return;
103 }
104 if(prod1->axes[5].n) {
105 p1coord = 5;
106 p2coord = 6;
107 prod_mom_space = PPARPPERP;
108 }
109 else if(prod1->axes[10].n) {
110 p1coord = 10;
111 p2coord = 11;
112 prod_mom_space = EKINXI;
113 }
114 else {
115 return;
116 }
117
118 real time = 0.0;
119 #pragma omp parallel for
120 for(size_t i0 = 0; i0 < afsi->volshape[0]; i0++) {
121 real* ppara1 = (real*) malloc(n*sizeof(real));
122 real* pperp1 = (real*) malloc(n*sizeof(real));
123 real* ppara2 = (real*) malloc(n*sizeof(real));
124 real* pperp2 = (real*) malloc(n*sizeof(real));
125 real* prod1_p1 = (real*) malloc(n*sizeof(real));
126 real* prod1_p2 = (real*) malloc(n*sizeof(real));
127 real* prod2_p1 = (real*) malloc(n*sizeof(real));
128 real* prod2_p2 = (real*) malloc(n*sizeof(real));
129
130 for(size_t i1 = 0; i1 < afsi->volshape[1]; i1++) {
131 for(size_t i2 = 0; i2 < afsi->volshape[2]; i2++) {
132 size_t spatial_index = i0*afsi->volshape[1]*afsi->volshape[2]
133 + i1*afsi->volshape[2] + i2;
134 real r = afsi->r[spatial_index];
135 real z = afsi->z[spatial_index];
136 real phi = afsi->phi[spatial_index];
137 real vol = afsi->vol[spatial_index];
138
139 real psi, rho[2];
140 if(B_field_eval_psi(&psi, r, phi, z, time, &sim->B_data) ||
141 B_field_eval_rho(rho, psi, &sim->B_data) ) {
142 continue;
143 }
144
145 real density1, density2;
147 sim, afsi, m1, m2, vol, n, i0, i1, i2,
148 r, phi, z, time, rho[0],
149 &density1, ppara1, pperp1, &density2, ppara2, pperp2);
150 if(density1 == 0 || density2 == 0) {
151 continue;
152 }
153 for(size_t i = 0; i < n; i++) {
154 real vcom2;
156 i, m1, m2, mprod1, mprod2, Q, prod_mom_space,
157 ppara1, pperp1, ppara2, pperp2, &vcom2,
158 prod1_p1, prod1_p2, prod2_p1, prod2_p2);
159 real E = 0.5 * ( m1 * m2 ) / ( m1 + m2 ) * vcom2;
160
161 real weight = density1 * density2 * sqrt(vcom2)
162 * boschhale_sigma(afsi->reaction, E)/n*vol;
163
164 size_t ip1 = math_bin_index(
165 prod1_p1[i], prod1->axes[p1coord].n,
166 prod1->axes[p1coord].min, prod1->axes[p1coord].max);
167 size_t ip2 = math_bin_index(
168 prod1_p2[i], prod1->axes[p2coord].n,
169 prod1->axes[p2coord].min, prod1->axes[p2coord].max);
170 if( 0 <= ip1 && ip1 < prod1->axes[p1coord].n &&
171 0 <= ip2 && ip2 < prod1->axes[p2coord].n) {
172 size_t index = i0*prod1->strides[i0coord]
173 + i1*prod1->strides[i1coord]
174 + i2*prod1->strides[i2coord]
175 + ip1*prod1->strides[p1coord]
176 + ip2*prod1->strides[p2coord];
177 prod1->bins[index] += weight * afsi->mult;
178 }
179
180 ip1 = math_bin_index(
181 prod2_p1[i], prod2->axes[p1coord].n,
182 prod2->axes[p1coord].min, prod2->axes[p1coord].max);
183 ip2 = math_bin_index(
184 prod2_p2[i], prod2->axes[p2coord].n,
185 prod2->axes[p2coord].min, prod2->axes[p2coord].max);
186 if( 0 <= ip1 && ip1 < prod2->axes[p1coord].n &&
187 0 <= ip2 && ip2 < prod2->axes[p2coord].n) {
188 size_t index = i0*prod2->strides[i0coord]
189 + i1*prod2->strides[i1coord]
190 + i2*prod2->strides[i2coord]
191 + ip1*prod2->strides[p1coord]
192 + ip2*prod2->strides[p2coord];
193 prod2->bins[index] += weight * afsi->mult;
194 }
195 }
196 }
197 }
198 free(ppara1);
199 free(ppara2);
200 free(pperp1);
201 free(pperp2);
202 free(prod1_p1);
203 free(prod1_p2);
204 free(prod2_p1);
205 free(prod2_p2);
206 }
207
208 m1 = m1 / CONST_U;
209 m2 = m2 / CONST_U;
210 mprod1 = mprod1 / CONST_U;
211 mprod2 = mprod2 / CONST_U;
212 int c1 = (int)rint(q1 / CONST_E);
213 int c2 = (int)rint(q2 / CONST_E);
214 int cprod1 = (int)rint(qprod1 / CONST_E);
215 int cprod2 = (int)rint(qprod2 / CONST_E);
216
217 hid_t f = hdf5_open(sim->hdf5_out);
218 if(f < 0) {
219 print_err("Error: File not found.\n");
220 abort();
221 }
222 char path[300];
223 sprintf(path, "/results/afsi_%s/reaction", sim->qid);
224 hid_t reactiondata = H5Gcreate2(f, path, H5P_DEFAULT, H5P_DEFAULT,
225 H5P_DEFAULT);
226 if(reactiondata < 0) {
227 print_err("Failed to write reaction data.\n");
228 abort();
229 }
230 hsize_t size = 1;
231 real q = Q / CONST_E;
232 if(H5LTmake_dataset_double(reactiondata, "m1", 1, &size, &m1)) {
233 print_err("Failed to write reaction data.\n");
234 abort();
235 }
236 if(H5LTmake_dataset_double(reactiondata, "m2", 1, &size, &m2)) {
237 print_err("Failed to write reaction data.\n");
238 abort();
239 }
240 if(H5LTmake_dataset_double(reactiondata, "mprod1", 1, &size, &mprod1)) {
241 print_err("Failed to write reaction data.\n");
242 abort();
243 }
244 if(H5LTmake_dataset_double(reactiondata, "mprod2", 1, &size, &mprod2)) {
245 print_err("Failed to write reaction data.\n");
246 abort();
247 }
248 if(H5LTmake_dataset_double(reactiondata, "q", 1, &size, &q)) {
249 print_err("Failed to write reaction data.\n");
250 abort();
251 }
252 if(H5LTmake_dataset_int(reactiondata, "q1", 1, &size, &c1)) {
253 print_err("Failed to write reaction data.\n");
254 abort();
255 }
256 if(H5LTmake_dataset_int(reactiondata, "q2", 1, &size, &c2)) {
257 print_err("Failed to write reaction data.\n");
258 abort();
259 }
260 if(H5LTmake_dataset_int(reactiondata, "qprod1", 1, &size, &cprod1)) {
261 print_err("Failed to write reaction data.\n");
262 abort();
263 }
264 if(H5LTmake_dataset_int(reactiondata, "qprod2", 1, &size, &cprod2)) {
265 print_err("Failed to write reaction data.\n");
266 abort();
267 }
268 if(H5Gclose(reactiondata)) {
269 print_err("Failed to write reaction data.\n");
270 abort();
271 }
272
273 sprintf(path, "/results/afsi_%s/prod1dist5d", sim->qid);
274 if( hdf5_hist_write(f, path, prod1) ) {
275 print_err("Warning: 5D distribution could not be written.\n");
276 }
277 sprintf(path, "/results/afsi_%s/prod2dist5d", sim->qid);
278 if( hdf5_hist_write(f, path, prod2) ) {
279 print_err("Warning: 5D distribution could not be written.\n");
280 }
281 if(hdf5_close(f)) {
282 print_err("Failed to close the file.\n");
283 abort();
284 }
285
286 print_out0(VERBOSE_MINIMAL, mpi_rank, mpi_root, "\nDone\n");
287}
288
309 int i, real m1, real m2, real mprod1, real mprod2, real Q, int prodmomspace,
310 real* ppara1, real* pperp1, real* ppara2, real* pperp2, real* vcom2,
311 real* prod1_p1, real* prod1_p2, real* prod2_p1, real* prod2_p2) {
312
315
316 real v1x = cos(rn1) * pperp1[i] / m1;
317 real v1y = sin(rn1) * pperp1[i] / m1;
318 real v1z = ppara1[i] / m1;
319
320 real v2x = cos(rn2) * pperp2[i] / m2;
321 real v2y = sin(rn2) * pperp2[i] / m2;
322 real v2z = ppara2[i] / m2;
323
324 *vcom2 = (v1x - v2x) * (v1x - v2x)
325 + (v1y - v2y) * (v1y - v2y)
326 + (v1z - v2z) * (v1z - v2z);
327
328 // Velocity of the system's center of mass
329 real v_cm[3];
330 v_cm[0] = ( m1 * v1x + m2 * v2x ) / ( m1 + m2 );
331 v_cm[1] = ( m1 * v1y + m2 * v2y ) / ( m1 + m2 );
332 v_cm[2] = ( m1 * v1z + m2 * v2z ) / ( m1 + m2 );
333
334 // Total kinetic energy after the reaction in CM frame
335 real ekin = Q
336 + 0.5 * m1 * ( (v1x - v_cm[0])*(v1x - v_cm[0])
337 + (v1y - v_cm[1])*(v1y - v_cm[1])
338 + (v1z - v_cm[2])*(v1z - v_cm[2]) )
339 + 0.5 * m2 * ( (v2x - v_cm[0])*(v2x - v_cm[0])
340 + (v2y - v_cm[1])*(v2y - v_cm[1])
341 + (v2z - v_cm[2])*(v2z - v_cm[2]) );
342
343 // Speed and velocity of product 2 in CM frame
344 rn1 = random_uniform(rdata);
345 rn2 = random_uniform(rdata);
346 real phi = CONST_2PI * rn1;
347 real theta = acos( 2 * ( rn2 - 0.5 ) );
348 real vnorm = sqrt( 2.0 * ekin / ( mprod2 * ( 1.0 + mprod2 / mprod1 ) ) );
349
350 real v2_cm[3];
351 v2_cm[0] = vnorm * sin(theta) * cos(phi);
352 v2_cm[1] = vnorm * sin(theta) * sin(phi);
353 v2_cm[2] = vnorm * cos(theta);
354
355 // Products' velocities in lab frame
356 real vprod1[3], vprod2[3];
357 vprod1[0] = -(mprod2/mprod1) * v2_cm[0] + v_cm[0];
358 vprod1[1] = -(mprod2/mprod1) * v2_cm[1] + v_cm[1];
359 vprod1[2] = -(mprod2/mprod1) * v2_cm[2] + v_cm[2];
360 vprod2[0] = v2_cm[0] + v_cm[0];
361 vprod2[1] = v2_cm[1] + v_cm[1];
362 vprod2[2] = v2_cm[2] + v_cm[2];
363
364 if(prodmomspace == PPARPPERP) {
365 prod1_p1[i] = vprod1[2] * mprod1;
366 prod1_p2[i] = sqrt(vprod1[0]*vprod1[0] + vprod1[1]*vprod1[1]) * mprod1;
367 prod2_p1[i] = vprod2[2] * mprod2;
368 prod2_p2[i] = sqrt(vprod2[0]*vprod2[0] + vprod2[1]*vprod2[1]) * mprod2;
369 }
370 else {
371 real vnorm1 = math_norm(vprod1);
372 prod1_p2[i] = vprod1[2] / vnorm1;
373 prod1_p1[i] = physlib_Ekin_gamma(mprod1, physlib_gamma_vnorm(vnorm1));
374
375 real vnorm2 = math_norm(vprod2);
376 prod2_p2[i] = vprod2[2] / vnorm2;
377 prod2_p1[i] = physlib_Ekin_gamma(mprod2, physlib_gamma_vnorm(vnorm2));
378 }
379}
380
398 sim_data* sim, afsi_data* afsi, real mass1, real mass2, real vol,
399 int nsample, size_t i0, size_t i1, size_t i2,
400 real r, real phi, real z, real time, real rho,
401 real* density1, real* ppara1, real* pperp1,
402 real* density2, real* ppara2, real* pperp2) {
403 if(afsi->type1 == 1) {
404 afsi_sample_beam_2d(afsi->beam1, mass1, vol, nsample, i0, i1, i2,
405 density1, ppara1, pperp1);
406 }
407 else if(afsi->type1 == 2) {
408 afsi_sample_thermal_2d(sim, afsi->thermal1, mass1, nsample, r, phi, z,
409 time, rho, density1, ppara1, pperp1);
410 }
411 if(afsi->type2 == 1) {
412 afsi_sample_beam_2d(afsi->beam2, mass2, vol, nsample, i0, i1, i2,
413 density2, ppara2, pperp2);
414 }
415 else if(afsi->type2 == 2) {
416 afsi_sample_thermal_2d(sim, afsi->thermal2, mass2, nsample, r, phi, z,
417 time, rho, density2, ppara2, pperp2);
418 }
419}
420
430void afsi_sample_beam_2d(histogram* hist, real mass, real vol, int nsample,
431 size_t i0, size_t i1, size_t i2,
432 real* density, real* ppara, real* pperp) {
433 int mom_space;
434 size_t p1coord, p2coord;
435 if(hist->axes[5].n) {
436 p1coord = 5;
437 p2coord = 6;
438 mom_space = PPARPPERP;
439 }
440 else if(hist->axes[10].n) {
441 p1coord = 10;
442 p2coord = 11;
443 mom_space = EKINXI;
444 }
445 else {
446 return;
447 }
448
449 real* cumdist = (real*) malloc(
450 hist->axes[p1coord].n*hist->axes[p2coord].n*sizeof(real));
451
452 *density = 0.0;
453 for(size_t ip1 = 0; ip1 < hist->axes[p1coord].n; ip1++) {
454 for(size_t ip2 = 0; ip2 < hist->axes[p2coord].n; ip2++) {
455 size_t index = i0*hist->strides[0]
456 + i1*hist->strides[1]
457 + i2*hist->strides[2]
458 + ip1*hist->strides[p1coord]
459 + ip2*hist->strides[p2coord];
460 if(ip1 == 0 && ip2 == 0) {
461 cumdist[0] = hist->bins[index];
462 } else {
463 cumdist[ip1*hist->axes[p2coord].n+ip2] =
464 cumdist[ip1*hist->axes[p2coord].n+ip2-1]
465 + hist->bins[index];
466 }
467 *density += hist->bins[index] / vol;
468 }
469 }
470 if(*density == 0) {
471 return;
472 }
473
474 for(size_t i = 0; i < nsample; i++) {
476 r *= cumdist[hist->axes[p1coord].n*hist->axes[p2coord].n-1];
477 for(size_t j = 0; j < hist->axes[p1coord].n*hist->axes[p2coord].n; j++) {
478 if(cumdist[j] > r) {
479 if(mom_space == PPARPPERP) {
480 ppara[i] = hist->axes[5].min + (j / hist->axes[6].n + 0.5)
481 * (hist->axes[5].max - hist->axes[5].min) / hist->axes[5].n;
482 pperp[i] = hist->axes[6].min + (j % hist->axes[6].n + 0.5)
483 * (hist->axes[6].max - hist->axes[6].min) / hist->axes[6].n;
484 }
485 else {
486 real ekin = hist->axes[10].min + (j / hist->axes[10].n + 0.5)
487 * (hist->axes[10].max - hist->axes[10].min) / hist->axes[10].n;
488 real pitch = hist->axes[11].min + (j / hist->axes[11].n + 0.5)
489 * (hist->axes[11].max - hist->axes[11].min) / hist->axes[11].n;
490 real gamma = physlib_gamma_Ekin(mass, ekin);
491 real pnorm = sqrt(gamma * gamma - 1.0) * mass * CONST_C;
492 ppara[i] = pitch * pnorm;
493 pperp[i] = sqrt( 1.0 - pitch*pitch ) * pnorm;
494 }
495 break;
496 }
497 }
498 }
499 free(cumdist);
500}
501
516void afsi_sample_thermal_2d(sim_data* sim, int ispecies, real mass, int nsample,
517 real r, real phi, real z, real time, real rho,
518 real* density, real* ppara, real* pperp) {
519 real ni, ti;
520 if( plasma_eval_dens(&ni, rho, r, phi, z, time, ispecies,
521 &sim->plasma_data) ||
522 plasma_eval_temp(&ti, rho, r, phi, z, time, ispecies,
523 &sim->plasma_data) ) {
524 *density = 0.0;
525 return;
526 }
527 *density = ni;
528 for(int i = 0; i < nsample; i++) {
529 real r1, r2, r3, r4, E;
530
531 r1 = random_uniform(rdata);
532 r2 = random_uniform(rdata);
533 r3 = cos( 0.5 * random_uniform(rdata) * CONST_PI );
534 E = -ti * ( log(r1) + log(r2) * r3 * r3 );
535
536 r4 = 1.0 - 2 * random_uniform(rdata);
537 pperp[i] = sqrt( ( 1 - r4*r4 ) * 2 * E * mass);
538 ppara[i] = r4 * sqrt(2 * E * mass);
539 }
540}
a5err B_field_eval_rho(real rho[2], real psi, B_field_data *Bdata)
Evaluate normalized poloidal flux rho and its psi derivative.
Definition B_field.c:228
a5err B_field_eval_psi(real *psi, real r, real phi, real z, real t, B_field_data *Bdata)
Evaluate poloidal flux psi.
Definition B_field.c:102
random_data rdata
Definition afsi.c:26
void afsi_sample_reactant_momenta_2d(sim_data *sim, afsi_data *afsi, real mass1, real mass2, real vol, int nsample, size_t i0, size_t i1, size_t i2, real r, real phi, real z, real time, real rho, real *density1, real *ppara1, real *pperp1, real *density2, real *ppara2, real *pperp2)
Sample velocities from reactant distributions.
Definition afsi.c:397
void afsi_sample_thermal_2d(sim_data *sim, int ispecies, real mass, int nsample, real r, real phi, real z, real time, real rho, real *density, real *pppara, real *ppperp)
Sample ppara and pperp from a thermal (Maxwellian) population.
Definition afsi.c:516
void afsi_sample_beam_2d(histogram *hist, real mass, real vol, int nsample, size_t i0, size_t i1, size_t i2, real *density, real *ppara, real *pperp)
Sample ppara and pperp from a 5D distribution.
Definition afsi.c:430
void afsi_run(sim_data *sim, afsi_data *afsi, int n, histogram *prod1, histogram *prod2)
Calculate fusion source from two arbitrary ion distributions.
Definition afsi.c:60
void afsi_compute_product_momenta_2d(int i, real m1, real m2, real mprod1, real mprod2, real Q, int prodmomspace, real *ppara1, real *pperp1, real *ppara2, real *pperp2, real *vcom2, real *prod1_p1, real *prod1_p2, real *prod2_p1, real *prod2_p2)
Compute momenta of reaction products.
Definition afsi.c:308
Main header file for ASCOT5.
double real
Definition ascot5.h:85
void boschhale_reaction(Reaction reaction, real *m1, real *q1, real *m2, real *q2, real *mprod1, real *qprod1, real *mprod2, real *qprod2, real *Q)
Get masses and charges of particles participating in the reaction and the released energy.
Definition boschhale.c:28
real boschhale_sigma(Reaction reaction, real E)
Estimate cross-section for a given fusion reaction.
Definition boschhale.c:87
Header file for boschdale.c.
Header file containing physical and mathematical constants.
#define CONST_U
Atomic mass unit in kilograms [kg].
Definition consts.h:32
#define CONST_PI
pi
Definition consts.h:11
#define CONST_C
Speed of light [m/s].
Definition consts.h:23
#define CONST_2PI
2*pi
Definition consts.h:14
#define CONST_E
Elementary charge [C].
Definition consts.h:35
herr_t hdf5_close(hid_t file_id)
Close access to given hdf5 file identifier. A negative value is returned on failure.
hid_t hdf5_open(const char *filename)
Open a hdf5 file for reading and writing. A negative value is returned on failure.
Header file for hdf5_helpers.h.
int hdf5_hist_write(hid_t f, char *path, histogram *hist)
Write a histogram object to HDF5 file.
Header file for hdf5_histogram.c.
int hdf5_interface_init_results(sim_data *sim, char *qid, char *run)
Initialize run group.
void hdf5_generate_qid(char *qid)
Generate an identification number for a run.
Header file for hdf5_interface.c.
Header file for hist.c.
Header file for math.c.
#define math_bin_index(x, nx, xmin, xmax)
Find the bin index on a uniform grid.
Definition math.h:21
#define math_norm(a)
Calculate norm of 3D vector a.
Definition math.h:67
Methods to evaluate elementary physical quantities.
#define physlib_gamma_Ekin(m, ekin)
Evaluate Lorentz factor from kinetic energy [J].
Definition physlib.h:103
#define physlib_Ekin_gamma(m, gamma)
Evaluate kinetic energy [J] from Lorentz factor.
Definition physlib.h:91
#define physlib_gamma_vnorm(v)
Evaluate Lorentz factor from velocity norm.
Definition physlib.h:21
a5err plasma_eval_temp(real *temp, real rho, real r, real phi, real z, real t, int species, plasma_data *pls_data)
Evaluate plasma temperature.
Definition plasma.c:90
a5err plasma_eval_dens(real *dens, real rho, real r, real phi, real z, real t, int species, plasma_data *pls_data)
Evaluate plasma density.
Definition plasma.c:138
Macros for printing console output.
@ VERBOSE_MINIMAL
Definition print.h:19
#define print_out0(v, rank, root,...)
Print to standard output only for root process.
Definition print.h:36
#define print_err(...)
Print to standard error.
Definition print.h:42
Header file for random.c.
void * random_data
Definition random.h:87
#define random_uniform(data)
Definition random.h:96
#define random_init(data, seed)
Definition random.h:94
void simulate_init(sim_data *sim)
Initialize simulation data struct.
Definition simulate.c:312
Header file for simulate.c.
Wrapper around input data structures.
Definition afsi.h:27
real * vol
Definition afsi.h:37
real * z
Definition afsi.h:36
histogram * beam1
Definition afsi.h:32
real * r
Definition afsi.h:34
int thermal1
Definition afsi.h:30
real * phi
Definition afsi.h:35
Reaction reaction
Definition afsi.h:39
int thermal2
Definition afsi.h:31
int type2
Definition afsi.h:29
real mult
Definition afsi.h:40
size_t volshape[3]
Definition afsi.h:38
histogram * beam2
Definition afsi.h:33
int type1
Definition afsi.h:28
real min
Definition hist.h:41
real max
Definition hist.h:42
size_t n
Definition hist.h:43
Histogram parameters.
Definition hist.h:52
hist_axis axes[HIST_ALLDIM]
Definition hist.h:53
size_t strides[HIST_ALLDIM-1]
Definition hist.h:54
real * bins
Definition hist.h:56
Simulation data struct.
Definition simulate.h:58
char qid[256]
Definition simulate.h:132
plasma_data plasma_data
Definition simulate.h:62
char hdf5_in[256]
Definition simulate.h:130
B_field_data B_data
Definition simulate.h:60
char hdf5_out[256]
Definition simulate.h:131