71 #pragma omp parallel for
72 for(
int k = 0; k < Neval; k++) {
113 #pragma omp parallel for
114 for(
int k = 0; k < Neval; k++) {
115 real rhoval[2], psival[4];
121 dpsidr[k] = psival[1];
122 dpsidphi[k] = psival[2];
123 dpsidz[k] = psival[3];
128 drhodpsi[k] = rhoval[1];
144 #pragma omp parallel for
145 for(
int k = 0; k < Neval; k++) {
150 Raxis[k] = axisrz[0];
151 zaxis[k] = axisrz[1];
178 #pragma omp parallel for
179 for(
int j=0; j<Neval; j++) {
189 if( rhodrho[0] > rho[j] ) {
197 real a = 0.0, b = 5.0;
198 real costh = cos(theta[j]);
199 real sinth = sin(theta[j]);
200 for(
int i=0; i<maxiter; i++) {
201 real c = 0.5*(a + b);
202 real rj = axisrz[0] + c * costh;
203 real zj = axisrz[1] + c * sinth;
212 if( fabs(rho[j] - rhodrho[0]) < tol ) {
217 if( rho[j] < rhodrho[0]) {
250 real psidpsi[4], nextrz[2];
259 nextrz[0] = rz[0] - step * psidpsi[1];
260 nextrz[1] = rz[1] - step * psidpsi[3];
263 if(sqrt( (nextrz[0] - rz[0]) * (nextrz[0] - rz[0])
264 + (nextrz[1] - rz[1]) * (nextrz[1] - rz[1]) ) < tol) {
271 psidpsi, rz[0], phi, rz[1], time, &sim->
B_data);
272 psi[0] = psi[0] + (tol * psidpsi[1] + tol * psidpsi[3]);
280 if(iter == maxiter) {
314 real psidpsi[4], nextrzphi[3];
324 nextrzphi[0] = rzphi[0] - step * psidpsi[1];
325 nextrzphi[1] = rzphi[1] - step * psidpsi[3];
326 nextrzphi[2] = rzphi[2] - step/rzphi[0] * psidpsi[2];
335 if (nextrzphi[2] > phimax) {nextrzphi[2] = phimax;}
336 if (nextrzphi[2] < phimin) {nextrzphi[2]=phimin;}
340 if(sqrt( (nextrzphi[0] - rzphi[0]) * (nextrzphi[0] - rzphi[0])
341 + (nextrzphi[1] - rzphi[1]) * (nextrzphi[1] - rzphi[1])
342 + rzphi[0]*(nextrzphi[2] - rzphi[2]) *
343 rzphi[0]*(nextrzphi[2] - rzphi[2])) < tol){
345 rzphi[0] = nextrzphi[0];
346 rzphi[1] = nextrzphi[1];
347 rzphi[2] = nextrzphi[2];
351 psidpsi, rzphi[0], rzphi[2], rzphi[1], time, &sim->
B_data);
353 + (tol * ( psidpsi[1] + psidpsi[2]/rzphi[0] + psidpsi[3] ));
357 rzphi[0] = nextrzphi[0];
358 rzphi[1] = nextrzphi[1];
359 rzphi[2] = nextrzphi[2];
362 if(iter == maxiter) {
386 #pragma omp parallel for
387 for(
int k = 0; k < Neval; k++) {
431 for(
int i=1; i<n_species; i++) {
457 #pragma omp parallel for
458 for(
int k = 0; k < Neval; k++) {
470 for(
int i=0; i<n_species; i++) {
471 dens[k + i*Neval] = n[i];
472 temp[k + i*Neval] = T[i]/
CONST_E;
491 #pragma omp parallel for
492 for(
int k = 0; k < Neval; k++) {
493 real psi[1], rho[2], n0[1];
538 #pragma omp parallel for
539 for(
int k = 0; k < Neval; k++) {
541 real psithetazeta[12], rhoval[2];
552 psi[k] = psithetazeta[0];
553 theta[k] = psithetazeta[4];
554 zeta[k] = psithetazeta[8];
555 dpsidr[k] = psithetazeta[1];
556 dpsidphi[k] = psithetazeta[2];
557 dpsidz[k] = psithetazeta[3];
558 dthetadr[k] = psithetazeta[5];
559 dthetadphi[k] = psithetazeta[6];
560 dthetadz[k] = psithetazeta[7];
561 dzetadr[k] = psithetazeta[9];
562 dzetadphi[k] = psithetazeta[10];
563 dzetadz[k] = psithetazeta[11];
585 #pragma omp parallel for
586 for(
int k = 0; k < Neval; k++) {
588 real psithetazeta[12], B[15];
600 real bvec[] = {B[0], B[4], B[8]};
601 real gradpsi[] = {psithetazeta[1],
602 psithetazeta[2]/
R[k],
604 real gradtheta[] = {psithetazeta[5],
605 psithetazeta[6]/
R[k],
607 real gradzeta[] = {psithetazeta[9],
608 psithetazeta[10]/
R[k],
611 real veca[3], vecb[3];
615 qprof[k] = (veca[1] - bvec[1]) / vecb[1];
618 jac[k] = -1.0 /
math_dot(veca, gradpsi);
655 for(
int i=0; i<n_modes; i++) {
691 #pragma omp parallel for
692 for(
int k = 0; k < Neval; k++) {
694 if(
mhd_eval(mhd_dmhd,
R[k], phi[k], z[k], t[k], includemode,
698 alpha[k] = mhd_dmhd[0];
699 dadr[k] = mhd_dmhd[2];
700 dadphi[k] = mhd_dmhd[3];
701 dadz[k] = mhd_dmhd[4];
702 dadt[k] = mhd_dmhd[1];
703 Phi[k] = mhd_dmhd[5];
704 dPhidr[k] = mhd_dmhd[7];
705 dPhidphi[k] = mhd_dmhd[8];
706 dPhidz[k] = mhd_dmhd[9];
707 dPhidt[k] = mhd_dmhd[6];
736 #pragma omp parallel for
737 for(
int k = 0; k < Neval; k++) {
744 mhd_br[k] = pert_field[0];
745 mhd_bphi[k] = pert_field[1];
746 mhd_bz[k] = pert_field[2];
747 mhd_er[k] = pert_field[3];
748 mhd_ephi[k] = pert_field[4];
749 mhd_ez[k] = pert_field[5];
750 mhd_phi[k] = pert_field[6];
791 #pragma omp parallel for
792 for(
int k=0; k<Neval; k++) {
793 real mufun[3] = {0., 0., 0.};
811 for(
int iv=0; iv<Nv; iv++) {
814 for(
int ib=0; ib<n_species; ib++) {
822 real vb = sqrt( 2 * Tb[ib] / mb[ib] );
823 real x = va[iv] / vb;
828 clogab[ib], mufun[0]);
830 clogab[ib], mufun[0]);
832 clogab[ib], mufun[2]);
834 vb, clogab[ib], mufun[0]);
836 vb, clogab[ib], mufun[1]);
838 vb, clogab[ib], mufun[0],
844 int idx = ib*Nv*Neval + Nv * k + iv;
845 if(mu0 != NULL) { mu0[idx] = mufun[0]; }
846 if(mu1 != NULL) { mu1[idx] = mufun[1]; }
847 if(dmu0 != NULL) { dmu0[idx] = mufun[2]; }
848 if(clog != NULL) { clog[idx] = clogab[ib]; }
849 if(F != NULL) { F[idx] = Fb; }
850 if(Dpara != NULL) { Dpara[idx] = Dparab; }
851 if(Dperp != NULL) { Dperp[idx] = Dperpb; }
852 if(K != NULL) { K[idx] = Kb; }
853 if(nu != NULL) { nu[idx] = nub; }
854 if(Q != NULL) { Q[idx] = Qb; }
855 if(dQ != NULL) { dQ[idx] = dQb; }
856 if(dDpara != NULL) { dDpara[idx] = dDparab; }
882 int Aa,
int Za,
real ma,
int reac_type,
real* ratecoeff) {
889 #pragma omp parallel for
890 for (
int k=0; k < Neval; k++) {
911 for (
int j=0; j < Nv; j++) {
917 &val, Za, Aa, E, ma, nspec, Zb, Ab, T0[0], n0,
921 ratecoeff[Nv*k + j] = val;
925 &val, Za, Aa, E, ma, nion, Zb, Ab, T[0], n,
929 ratecoeff[Nv*k + j] = val * n[0];
998 real dummy_real = -999.0;
1002 for(
int k = 0; k < Neval; k++) {
1007 real B_magn = sqrt(B[0]*B[0] + B[1]*B[1] + B[2]*B[2]);
1008 real gyrofreq = q * B_magn / mass;
1009 rfof_set_marker_manually(&rfof_mrk, &dummy_int,
1010 &dummy_real, &(
R[k]), &dummy_real, &dummy_real, &dummy_real,
1011 &dummy_real, &dummy_real, &dummy_real, &dummy_real, &dummy_real,
1012 &dummy_real, &vpar, &dummy_real, &gyrofreq, &dummy_real,
1013 &dummy_real, &dummy_int, &dummy_int);
1016 rfof_eval_resonance_function(
1017 &(res_cond[k]), &nharm, &rfof_mrk, &sim->
rfof_data);
1021 &(Eplus_real[k]), &(Eminus_real[k]), &(Eplus_imag[k]),
1022 &(Eminus_imag[k]),
R[k], z[k], &sim->
rfof_data);
1024 rfof_tear_down(&rfof_mrk);
a5err B_field_eval_psi_dpsi(real psi_dpsi[4], real r, real phi, real z, real t, B_field_data *Bdata)
Evaluate poloidal flux psi and its derivatives.
a5err B_field_eval_rho(real rho[2], real psi, B_field_data *Bdata)
Evaluate normalized poloidal flux rho and its psi derivative.
a5err B_field_eval_psi(real *psi, real r, real phi, real z, real t, B_field_data *Bdata)
Evaluate poloidal flux psi.
a5err B_field_eval_B_dB(real B_dB[15], real r, real phi, real z, real t, B_field_data *Bdata)
Evaluate magnetic field and its derivatives.
a5err B_field_eval_rho_drho(real rho_drho[4], real r, real phi, real z, B_field_data *Bdata)
Evaluate normalized poloidal flux rho and its derivatives.
a5err B_field_get_axis_rz(real rz[2], B_field_data *Bdata, real phi)
Return magnetic axis Rz-coordinates.
a5err B_field_eval_B(real B[3], real r, real phi, real z, real t, B_field_data *Bdata)
Evaluate magnetic field.
Header file for B_field.c.
a5err E_field_eval_E(real E[3], real r, real phi, real z, real t, E_field_data *Edata, B_field_data *Bdata)
Evaluate electric field.
Header file for E_field.c.
Main header file for ASCOT5.
#define MAX_SPECIES
Maximum number of plasma species.
a5err asigma_eval_cx(real *ratecoeff, int z_1, int a_1, real E, real mass, int nspec, const int *znum, const int *anum, real T_0, real *n_0, asigma_data *asigma_data)
Evaluate charge exchange rate coefficient.
a5err asigma_eval_bms(real *ratecoeff, int z_1, int a_1, real E, real mass, int nion, const int *znum, const int *anum, real T_e, real *n_i, asigma_data *asigma_data)
Evaluate beam stopping rate coefficient.
Header file for asigma.c.
a5err boozer_eval_psithetazeta(real psithetazeta[12], int *isinside, real r, real phi, real z, B_field_data *Bdata, boozer_data *boozerdata)
Evaluate Boozer coordinates and partial derivatives.
Header file for boozer.c.
Header file containing physical and mathematical constants.
#define CONST_M_E
Electron mass [kg].
#define CONST_C
Speed of light [m/s].
#define CONST_E
Elementary charge [C].
Header file for hdf5_bfield.c.
Header file for hdf5_boozer.c.
Header file for hdf5_efielc.c.
Header file for hdf5_helpers.h.
Header file for hdf5_interface.c.
Header file for hdf5_mhd.c.
Header file for hdf5_neutral.c.
Header file for hdf5_plasma.c.
Header file for hdf5_wall.c.
void libascot_neutral_eval_density(sim_data *sim, int Neval, real *R, real *phi, real *z, real *t, real *dens)
Evaluate neutral density at given coordinates.
void libascot_eval_rfof(sim_data *sim, real *B_offload_array, int Neval, real *R, real *phi, real *z, real *t, real mass, real q, real vpar, real *Eplus_real, real *Eminus_real, real *Eplus_imag, real *Eminus_imag, real *res_cond)
Evaluate ICRH electric field and the resonance condition.
void libascot_E_field_eval_E(sim_data *sim, int Neval, real *R, real *phi, real *z, real *t, real *ER, real *Ephi, real *Ez)
Evaluate electric field vector at given coordinates.
void libascot_eval_collcoefs(sim_data *sim, int Neval, real *R, real *phi, real *z, real *t, int Nv, real *va, real ma, real qa, real *F, real *Dpara, real *Dperp, real *K, real *nu, real *Q, real *dQ, real *dDpara, real *clog, real *mu0, real *mu1, real *dmu0)
Evaluate collision coefficients.
void libascot_boozer_eval_fun(sim_data *sim, int Neval, real *R, real *phi, real *z, real *t, real *qprof, real *jac, real *jacB2)
Evaluate boozer coordinates related quantities.
void libascot_B_field_gradient_descent_3d(sim_data *sim, real psi[1], real rzphi[3], real phimin, real phimax, real step, real tol, int maxiter, int ascent)
Find one psi minimum using the gradient descent method for 3D field inside a sector (phimin < phi < p...
void libascot_eval_ratecoeff(sim_data *sim, int Neval, real *R, real *phi, real *z, real *t, int Nv, real *va, int Aa, int Za, real ma, int reac_type, real *ratecoeff)
Evaluate atomic reaction rate coefficient.
void libascot_mhd_eval_perturbation(sim_data *sim, int Neval, real *R, real *phi, real *z, real *t, int includemode, real *mhd_br, real *mhd_bphi, real *mhd_bz, real *mhd_er, real *mhd_ephi, real *mhd_ez, real *mhd_phi)
Evaluate MHD perturbation EM-field components.
int libascot_plasma_get_n_species(sim_data *sim)
Get number of plasma species.
void libascot_mhd_get_mode_specs(sim_data *sim, int *nmode, int *mmode, real *amplitude, real *omega, real *phase)
Get MHD mode amplitude, frequency, phase, and mode numbers.
void libascot_plasma_eval_background(sim_data *sim, int Neval, real *R, real *phi, real *z, real *t, real *dens, real *temp)
Evaluate plasma density and temperature at given coordinates.
void libascot_boozer_eval_psithetazeta(sim_data *sim, int Neval, real *R, real *phi, real *z, real *t, real *psi, real *theta, real *zeta, real *dpsidr, real *dpsidphi, real *dpsidz, real *dthetadr, real *dthetadphi, real *dthetadz, real *dzetadr, real *dzetadphi, real *dzetadz, real *rho)
Evaluate boozer coordinates and derivatives.
int libascot_mhd_get_n_modes(sim_data *sim)
Get number of MHD modes.
void libascot_B_field_gradient_descent(sim_data *sim, real psi[1], real rz[2], real phi, real step, real tol, int maxiter, int ascent)
Find psi on axis using the gradient descent method.
void libascot_B_field_rhotheta2rz(sim_data *sim, int Neval, real *rho, real *theta, real *phi, real t, int maxiter, real tol, real *r, real *z)
Map (rho, theta, phi) to (R,z) coordinates.
void libascot_B_field_eval_B_dB(sim_data *sim, int Neval, real *R, real *phi, real *z, real *t, real *BR, real *Bphi, real *Bz, real *BR_dR, real *BR_dphi, real *BR_dz, real *Bphi_dR, real *Bphi_dphi, real *Bphi_dz, real *Bz_dR, real *Bz_dphi, real *Bz_dz)
Evaluate magnetic field vector and derivatives at given coordinates.
void libascot_B_field_get_axis(sim_data *sim, int Neval, real *phi, real *Raxis, real *zaxis)
Get magnetic axis at given coordinates.
void libascot_plasma_get_species_mass_and_charge(sim_data *sim, real *mass, real *charge, int *anum, int *znum)
Get mass and charge of all plasma species.
void libascot_mhd_eval(sim_data *sim, int Neval, real *R, real *phi, real *z, real *t, int includemode, real *alpha, real *dadr, real *dadphi, real *dadz, real *dadt, real *Phi, real *dPhidr, real *dPhidphi, real *dPhidz, real *dPhidt)
Evaluate MHD perturbation potentials.
void libascot_B_field_eval_rho(sim_data *sim, int Neval, real *R, real *phi, real *z, real *t, real *rho, real *drhodpsi, real *psi, real *dpsidr, real *dpsidphi, real *dpsidz)
Evaluate normalized poloidal flux at given coordinates.
#define math_dot(a, b)
Calculate dot product a[3] dot b[3].
#define math_cross(a, b, c)
Calculate cross product for 3D vectors c = a x b.
#define math_norm(a)
Calculate norm of 3D vector a.
Routines to evaluate coefficients needed to evaluate collisions.
#define mccc_coefs_Dpara(ma, qa, va, qb, nb, vb, clogab, mu0)
Evaluate non-relativistic parallel diffusion coefficient [m^2/s^3].
#define mccc_coefs_dDpara(ma, qa, va, qb, nb, vb, clogab, mu0, dmu0)
Evaluate derivative of non-relativistic parallel diffusion coefficient [m/s^2].
#define mccc_coefs_dQ(ma, qa, mb, qb, nb, vb, clogab, dmu0)
Evaluate derivative of non-relativistic drag coefficient [m/s^2].
#define mccc_coefs_K(va, Dpara, dDpara, Q)
Evaluate guiding center drag coefficient [m/s^2].
static void mccc_coefs_mufun(real mufun[3], real x, mccc_data *mdata)
Evaluate special functions needed by collision coefficients.
#define mccc_coefs_Dperp(ma, qa, va, qb, nb, vb, clogab, mu1)
Evaluate non-relativistic perpendicular diffusion coefficient [m^2/s^3].
#define mccc_coefs_nu(va, Dperp)
Evaluate pitch collision frequency [1/s].
#define mccc_coefs_F(ma, qa, mb, qb, nb, vb, clogab, mu0)
Evaluate non-relativistic friction coefficient [m/s^2].
static DECLARE_TARGET_END void mccc_coefs_clog(real *clogab, real ma, real qa, real va, int nspec, const real *mb, const real *qb, const real *nb, const real *Tb)
Evaluate Coulomb logarithm.
#define mccc_coefs_Q(ma, qa, mb, qb, nb, vb, clogab, mu0)
Evaluate non-relativistic drag coefficient [m/s^2].
int mhd_get_n_modes(mhd_data *mhddata)
Return number of modes.
const real * mhd_get_amplitude(mhd_data *mhddata)
Return mode amplitudes.
const int * mhd_get_nmode(mhd_data *mhddata)
Return mode toroidal numbers.
a5err mhd_perturbations(real pert_field[7], real r, real phi, real z, real t, int pertonly, int includemode, boozer_data *boozerdata, mhd_data *mhddata, B_field_data *Bdata)
Evaluate perturbed fields Btilde, Etilde and potential Phi explicitly.
const int * mhd_get_mmode(mhd_data *mhddata)
Return mode poloidal numbers.
const real * mhd_get_frequency(mhd_data *mhddata)
Return mode frequencies.
a5err mhd_eval(real mhd_dmhd[10], real r, real phi, real z, real t, int includemode, boozer_data *boozerdata, mhd_data *mhddata, B_field_data *Bdata)
Evaluate the needed quantities from MHD mode for orbit following.
const real * mhd_get_phase(mhd_data *mhddata)
Return mode phases.
int neutral_get_n_species(neutral_data *ndata)
Get the number of neutral species.
a5err neutral_eval_n0(real *n0, real rho, real r, real phi, real z, real t, neutral_data *ndata)
Evaluate neutral density.
a5err neutral_eval_t0(real *t0, real rho, real r, real phi, real z, real t, neutral_data *ndata)
Evaluate neutral temperature.
Header file for neutral.c.
Methods to evaluate elementary physical quantities.
#define physlib_gamma_vnorm(v)
Evaluate Lorentz factor from velocity norm.
const real * plasma_get_species_mass(plasma_data *pls_data)
Get mass of all plasma species.
const int * plasma_get_species_znum(plasma_data *pls_data)
Get charge number of ion species.
int plasma_get_n_species(plasma_data *pls_data)
Get the number of plasma species.
const real * plasma_get_species_charge(plasma_data *pls_data)
Get charge of all plasma species.
a5err plasma_eval_densandtemp(real *dens, real *temp, real rho, real r, real phi, real z, real t, plasma_data *pls_data)
Evaluate plasma density and temperature for all species.
const int * plasma_get_species_anum(plasma_data *pls_data)
Get atomic mass number of ion species.
Header file for plasma.c.
Header file for simulate.c.
Reusable struct for storing marker specific data during the simulation loop.
neutral_data neutral_data