18 int i_pz,
int i_time,
int i_q,
size_t step_7,
19 size_t step_6,
size_t step_5,
size_t step_4,
20 size_t step_3,
size_t step_2,
size_t step_1) {
21 return (
size_t)(i_rho) * step_7
22 + (
size_t)(i_theta) * step_6
23 + (
size_t)(i_phi) * step_5
24 + (
size_t)(i_pr) * step_4
25 + (
size_t)(i_pphi) * step_3
26 + (
size_t)(i_pz) * step_2
27 + (
size_t)(i_time) * step_1
36 size_t n_q = (size_t)(data->
n_q);
37 size_t n_time = (size_t)(data->
n_time);
38 size_t n_pz = (size_t)(data->
n_pz);
39 size_t n_pphi = (size_t)(data->
n_pphi);
40 size_t n_pr = (size_t)(data->
n_pr);
41 size_t n_phi = (size_t)(data->
n_phi);
42 size_t n_theta = (size_t)(data->
n_theta);
43 data->
step_7 = n_q * n_time * n_pz * n_pphi * n_pr * n_phi * n_theta;
44 data->
step_6 = n_q * n_time * n_pz * n_pphi * n_pr * n_phi;
45 data->
step_5 = n_q * n_time * n_pz * n_pphi * n_pr;
46 data->
step_4 = n_q * n_time * n_pz * n_pphi;
47 data->
step_3 = n_q * n_time * n_pz;
48 data->
step_2 = n_q * n_time;
79 GPU_UPDATE_FROM_DEVICE(
106 GPU_PARALLEL_LOOP_ALL_LEVELS
107 for(
int i = 0; i < p_f->
n_mrk; i++) {
110 int i_rho = floor((p_f->
rho[i] - dist->
min_rho)
117 int i_phi = floor((phi - dist->
min_phi)
124 int i_theta = floor((theta - dist->
min_theta)
128 int i_pr = floor((p_f->
p_r[i] - dist->
min_pr)
135 int i_pz = floor((p_f->
p_z[i] - dist->
min_pz)
144 if(i_rho >= 0 && i_rho <= dist->n_rho - 1 &&
145 i_theta >=0 && i_theta <= dist->n_theta -1 &&
146 i_phi >=0 && i_phi <= dist->n_phi - 1 &&
147 i_pr >= 0 && i_pr <= dist->n_pr - 1 &&
148 i_pphi >= 0 && i_pphi <= dist->n_pphi - 1 &&
149 i_pz >= 0 && i_pz <= dist->n_pz - 1 &&
150 i_time >= 0 && i_time <= dist->n_time - 1 &&
151 i_q >= 0 && i_q <= dist->n_q - 1 ) {
154 i_rho, i_theta, i_phi, i_pr, i_pphi, i_pz,
162 i_rho, i_theta, i_phi, i_pr, i_pphi, i_pz,
171 for(
int i = 0; i < p_f->
n_mrk; i++) {
172 if(p_f->
running[i] && index[i] >= 0 &&
210 for(
int i = 0; i <
NSIMD; i++) {
211 if(p_f->running[i]) {
214 real B_dB[12] = {p_f->B_r[i],
227 p_f->phi[i], p_f->ppar[i],
228 p_f->mu[i], p_f->zeta[i],
231 i_rho[i] = floor((p_f->rho[i] - dist->
min_rho)
238 i_phi[i] = floor((phi[i] - dist->
min_phi)
245 i_theta[i] = floor((theta[i] - dist->
min_theta)
249 i_pr[i] = floor((pr - dist->
min_pr)
252 i_pphi[i] = floor((pphi - dist->
min_pphi)
256 i_pz[i] = floor((pz - dist->
min_pz)
259 i_time[i] = floor((p_f->time[i] - dist->
min_time)
265 if(i_rho[i] >= 0 && i_rho[i] <= dist->
n_rho - 1 &&
266 i_theta[i] >= 0 && i_theta[i] <= dist->
n_theta -1 &&
267 i_phi[i] >= 0 && i_phi[i] <= dist->
n_phi - 1 &&
268 i_pr[i] >= 0 && i_pr[i] <= dist->
n_pr - 1 &&
269 i_pphi[i] >= 0 && i_pphi[i] <= dist->
n_pphi - 1 &&
270 i_pz[i] >= 0 && i_pz[i] <= dist->
n_pz - 1 &&
271 i_time[i] >= 0 && i_time[i] <= dist->
n_time - 1 &&
272 i_q[i] >= 0 && i_q[i] <= dist->
n_q - 1 ) {
274 weight[i] = p_f->weight[i] * (p_f->time[i] - p_i->time[i]);
282 for(
int i = 0; i <
NSIMD; i++) {
283 if(p_f->running[i] && ok[i]) {
285 i_rho[i], i_theta[i], i_phi[i], i_pr[i], i_pphi[i], i_pz[i],
Main header file for ASCOT5.
#define NSIMD
Number of particles simulated simultaneously in a particle group operations.
Header file containing physical and mathematical constants.
#define CONST_E
Elementary charge [C].
void dist_rho6D_onload(dist_rho6D_data *data)
Onload data back to the host.
int dist_rho6D_init(dist_rho6D_data *data)
Initializes distribution data.
void dist_rho6D_update_gc(dist_rho6D_data *dist, particle_simd_gc *p_f, particle_simd_gc *p_i)
Update the histogram from guiding-center particles.
size_t dist_rho6D_index(int i_rho, int i_theta, int i_phi, int i_pr, int i_pphi, int i_pz, int i_time, int i_q, size_t step_7, size_t step_6, size_t step_5, size_t step_4, size_t step_3, size_t step_2, size_t step_1)
Internal function calculating the index in the histogram array.
void dist_rho6D_free(dist_rho6D_data *data)
Free allocated resources.
void dist_rho6D_update_fo(dist_rho6D_data *dist, particle_simd_fo *p_f, particle_simd_fo *p_i)
Update the histogram from full-orbit particles.
void dist_rho6D_offload(dist_rho6D_data *data)
Offload data to the accelerator.
Header file for dist_rho6D.c.
real fmod(real x, real y)
Compute the modulus of two real numbers.
Methods to evaluate elementary physical quantities.
Histogram parameters on target.
Struct representing NSIMD particle markers.
Struct representing NSIMD guiding center markers.