31 data->
anum = (
int*) malloc( nion*
sizeof(
int) );
32 data->
znum = (
int*) malloc( nion*
sizeof(
int) );
35 for(
int i = 0; i < data->
n_species; i++) {
37 data->
znum[i] = znum[i];
38 data->
anum[i] = anum[i];
40 data->
mass[i] = mass[i];
41 data->
charge[i] = charge[i];
44 for(
int i = 0; i < nrho; i++) {
45 data->
rho[i] = rho[i];
48 for(
int i = 0; i < ntime; i++) {
49 data->
time[i] = time[i];
52 data->
temp = (
real*) malloc( 2*nrho*ntime*
sizeof(
real) );
53 data->
dens = (
real*) malloc( (nion+1)*nrho*ntime*
sizeof(
real) );
54 for(
int i = 0; i < nrho; i++) {
55 for(
int j = 0; j < ntime; j++) {
56 data->
vtor[j*nrho + i] = vtor[j*nrho + i];
57 data->
temp[j*2*nrho + i] = Te[j*nrho + i];
58 data->
temp[(j*2+1)*nrho + i] = Ti[j*nrho + i];
59 data->
dens[j*nrho + i] = ne[j*nrho + i];
60 for(
int k = 0; k < nion; k++) {
61 data->
dens[(k+1)*nrho*ntime + j*nrho + i] =
62 ni[k*nrho*ntime + j*nrho + i];
69 "Min rho = %1.2le, Max rho = %1.2le,"
70 " Number of rho grid points = %d\n",
73 "Min time = %1.2le, Max time = %1.2le,"
74 " Number of time points = %d\n",
78 "Species Z/A charge [e]/mass [amu] "
79 "Density [m^-3] at Min/Max rho(t=t0)"
80 " Temperature [eV] at Min/Max rho(t=t0)\n");
81 for(
int i=0; i < nion; i++) {
83 " %3d /%3d %3d /%7.3f %1.2le/%1.2le "
88 data->
dens[nrho*ntime + i*nrho],
89 data->
dens[nrho*ntime + (i+1)*nrho - 1],
94 "[electrons] %3d /%7.3f %1.2le/%1.2le "
102 real quasineutrality = 0;
103 for(
int k = 0; k < nrho; k++) {
107 for(
int i=0; i < nion; i++) {
108 int idx = nrho*ntime + ntime + nrho * (2+1) + k;
109 ion_qdens += data->
dens[idx] * data->
charge[i+1];
111 quasineutrality = fmax( quasineutrality,
112 fabs( 1 - ion_qdens / ele_qdens ) );
115 " %.2f\n", 1+quasineutrality);
173 *temp = temp_temp[species];
200 *dens = temp_dens[species];
224 if(rho < pls_data->rho[0]) {
227 else if(rho >= pls_data->
rho[pls_data->
n_rho-1]) {
232 while(i_rho < pls_data->n_rho-1 && pls_data->
rho[i_rho] <= rho) {
237 real t_rho = (rho - pls_data->
rho[i_rho])
238 / (pls_data->
rho[i_rho+1] - pls_data->
rho[i_rho]);
241 while(i_time < pls_data->n_time-1 && pls_data->
time[i_time] <= t) {
246 real t_time = (t - pls_data->
time[i_time])
247 / (pls_data->
time[i_time+1] - pls_data->
time[i_time]);
254 else if(i_time >= pls_data->
n_time-2) {
256 i_time = pls_data->
n_time-2;
260 for(
int i = 0; i < pls_data->
n_species; i++) {
261 real p11, p12, p21, p22, p1, p2;
276 p1 = p11 + t_rho * (p12 - p11);
277 p2 = p21 + t_rho * (p22 - p21);
279 dens[i] = p1 + t_time * (p2 - p1);
283 p11 = pls_data->
temp[i_time*2*pls_data->
n_rho
286 p12 = pls_data->
temp[i_time*2*pls_data->
n_rho
289 p21 = pls_data->
temp[(i_time+1)*2*pls_data->
n_rho
292 p22 = pls_data->
temp[(i_time+1)*2*pls_data->
n_rho
296 p1 = p11 + t_rho * (p12 - p11);
297 p2 = p21 + t_rho * (p22 - p21);
299 temp[i] = p1 + t_time * (p2 - p1);
323 if(rho < pls_data->rho[0]) {
326 else if(rho >= pls_data->
rho[pls_data->
n_rho-1]) {
331 while(i_rho < pls_data->n_rho-1 && pls_data->
rho[i_rho] <= rho) {
336 real t_rho = (rho - pls_data->
rho[i_rho])
337 / (pls_data->
rho[i_rho+1] - pls_data->
rho[i_rho]);
340 while(i_time < pls_data->n_time-1 && pls_data->
time[i_time] <= t) {
345 real t_time = (t - pls_data->
time[i_time])
346 / (pls_data->
time[i_time+1] - pls_data->
time[i_time]);
353 else if(i_time >= pls_data->
n_time-2) {
355 i_time = pls_data->
n_time-2;
359 real p11, p12, p21, p22, p1, p2;
361 p11 = pls_data->
vtor[i_time*pls_data->
n_rho + i_rho];
362 p12 = pls_data->
vtor[(i_time+1)*pls_data->
n_rho + i_rho];
363 p21 = pls_data->
vtor[i_time*pls_data->
n_rho + i_rho + 1];
364 p22 = pls_data->
vtor[(i_time+1)*pls_data->
n_rho + i_rho + 1];
366 p1 = p11 + t_rho * (p12 - p11);
367 p2 = p21 + t_rho * (p22 - p21);
369 *vflow = p1 + t_time * (p2 - p1);
Main header file for ASCOT5.
#define MAX_SPECIES
Maximum number of plasma species.
Header file containing physical and mathematical constants.
#define CONST_U
Atomic mass unit in kilograms [kg].
#define CONST_M_E
Electron mass [kg].
#define CONST_E
Elementary charge [C].
unsigned long int a5err
Simulation error flag.
static DECLARE_TARGET_SIMD a5err error_raise(error_type type, int line, error_file file)
Raise a new error.
void plasma_1Dt_offload(plasma_1Dt_data *data)
Offload data to the accelerator.
void plasma_1Dt_free(plasma_1Dt_data *data)
Free allocated resources.
int plasma_1Dt_init(plasma_1Dt_data *data, int nrho, int ntime, int nion, real *rho, real *time, int *anum, int *znum, real *mass, real *charge, real *Te, real *Ti, real *ne, real *ni, real *vtor)
Initialize 1Dt plasma data and check inputs.
a5err plasma_1Dt_eval_densandtemp(real *dens, real *temp, real rho, real t, plasma_1Dt_data *pls_data)
Evaluate plasma density and temperature for all species.
a5err plasma_1Dt_eval_flow(real *vflow, real rho, real t, real r, plasma_1Dt_data *pls_data)
Evalate plasma flow along the field lines.
a5err plasma_1Dt_eval_temp(real *temp, real rho, real t, int species, plasma_1Dt_data *pls_data)
Evaluate plasma temperature.
a5err plasma_1Dt_eval_dens(real *dens, real rho, real t, int species, plasma_1Dt_data *pls_data)
Evaluate plasma density.
Header file for plasma_1Dt.c.
Macros for printing console output.
#define print_out(v,...)
Print to standard output.
1D plasma parameters on the target