ASCOT5
Loading...
Searching...
No Matches
plasma_1Dt.c
Go to the documentation of this file.
1
5#include <stdio.h>
6#include <stdlib.h>
7#include <math.h>
8#include "../ascot5.h"
9#include "../error.h"
10#include "../consts.h"
11#include "../print.h"
12#include "plasma_1Dt.h"
13
14
22int plasma_1Dt_init(plasma_1Dt_data* data, int nrho, int ntime, int nion,
23 real* rho, real* time, int* anum, int* znum, real* mass,
24 real* charge, real* Te, real* Ti, real* ne, real* ni,
25 real* vtor) {
26
27 data->n_rho = nrho;
28 data->n_time = ntime;
29 data->n_species = nion + 1;
30
31 data->anum = (int*) malloc( nion*sizeof(int) );
32 data->znum = (int*) malloc( nion*sizeof(int) );
33 data->mass = (real*) malloc( (nion+1)*sizeof(real) );
34 data->charge = (real*) malloc( (nion+1)*sizeof(real) );
35 for(int i = 0; i < data->n_species; i++) {
36 if(i < nion) {
37 data->znum[i] = znum[i];
38 data->anum[i] = anum[i];
39 }
40 data->mass[i] = mass[i];
41 data->charge[i] = charge[i];
42 }
43 data->rho = (real*) malloc( nrho*sizeof(real) );
44 for(int i = 0; i < nrho; i++) {
45 data->rho[i] = rho[i];
46 }
47 data->time = (real*) malloc( ntime*sizeof(real) );
48 for(int i = 0; i < ntime; i++) {
49 data->time[i] = time[i];
50 }
51 data->vtor = (real*) malloc( nrho*ntime*sizeof(real) );
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];
63 }
64 }
65 }
66
67 print_out(VERBOSE_IO, "\n1D plasma profiles (P_1Dt)\n");
69 "Min rho = %1.2le, Max rho = %1.2le,"
70 " Number of rho grid points = %d\n",
71 data->rho[0], data->rho[data->n_rho-1], data->n_rho);
73 "Min time = %1.2le, Max time = %1.2le,"
74 " Number of time points = %d\n",
75 data->time[0], data->time[data->n_time-1], data->n_time);
76 print_out(VERBOSE_IO, "Number of ion species = %d\n", nion);
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 "
84 " %1.2le/%1.2le \n",
85 data->znum[i], data->anum[i],
86 (int)round(data->charge[i+1]/CONST_E),
87 data->mass[i+1]/CONST_U,
88 data->dens[nrho*ntime + i*nrho],
89 data->dens[nrho*ntime + (i+1)*nrho - 1],
90 data->temp[ntime*nrho] / CONST_E,
91 data->temp[ntime*nrho + nrho - 1] / CONST_E);
92 }
94 "[electrons] %3d /%7.3f %1.2le/%1.2le "
95 "%1.2le/%1.2le \n",
97 data->dens[0], data->dens[nrho-1],
98 data->temp[0] / CONST_E, data->temp[nrho-1] / CONST_E);
99 print_out(VERBOSE_IO, "Toroidal rotation [rad/s] at Min/Max rho: "
100 "%1.2le/%1.2le\n",
101 data->vtor[0], data->vtor[nrho-1]);
102 real quasineutrality = 0;
103 for(int k = 0; k < nrho; k++) {
104 real ele_qdens =
105 data->dens[ntime + nrho + k] * CONST_E;
106 real ion_qdens = 0;
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];
110 }
111 quasineutrality = fmax( quasineutrality,
112 fabs( 1 - ion_qdens / ele_qdens ) );
113 }
114 print_out(VERBOSE_IO, "Quasi-neutrality is (electron / ion charge density)"
115 " %.2f\n", 1+quasineutrality);
116 return 0;
117}
118
125 free(data->mass);
126 free(data->charge);
127 free(data->anum);
128 free(data->znum);
129 free(data->rho);
130 free(data->time);
131 free(data->temp);
132 free(data->dens);
133}
134
141 GPU_MAP_TO_DEVICE(
142 data->mass[0:data->n_species], data->charge[0:data->n_species], \
143 data->anum[0:data->n_species-1], data->znum[0:data->n_species-1], \
144 data->rho[0:data->n_rho], data->time[0:data->n_time], \
145 data->vtor[0:data->n_time*data->n_rho], \
146 data->temp[0:data->n_time*data->n_rho*2], \
147 data->dens[0:data->n_rho*data->n_species*data->n_time]
148 )
149}
150
165a5err plasma_1Dt_eval_temp(real* temp, real rho, real t, int species,
166 plasma_1Dt_data* pls_data) {
167
168 real temp_dens[MAX_SPECIES], temp_temp[MAX_SPECIES];
169
170 a5err err = plasma_1Dt_eval_densandtemp(temp_dens, temp_temp, rho, t,
171 pls_data);
172
173 *temp = temp_temp[species];
174
175 return err;
176
177}
178
193a5err plasma_1Dt_eval_dens(real* dens, real rho, real t, int species,
194 plasma_1Dt_data* pls_data) {
195 real temp_dens[MAX_SPECIES], temp_temp[MAX_SPECIES];
196
197 a5err err = plasma_1Dt_eval_densandtemp(temp_dens, temp_temp, rho, t,
198 pls_data);
199
200 *dens = temp_dens[species];
201
202 return err;
203
204}
205
221 plasma_1Dt_data* pls_data) {
222
223 a5err err = 0;
224 if(rho < pls_data->rho[0]) {
226 }
227 else if(rho >= pls_data->rho[pls_data->n_rho-1]) {
229 }
230 else {
231 int i_rho = 0;
232 while(i_rho < pls_data->n_rho-1 && pls_data->rho[i_rho] <= rho) {
233 i_rho++;
234 }
235 i_rho--;
236
237 real t_rho = (rho - pls_data->rho[i_rho])
238 / (pls_data->rho[i_rho+1] - pls_data->rho[i_rho]);
239
240 int i_time = 0;
241 while(i_time < pls_data->n_time-1 && pls_data->time[i_time] <= t) {
242 i_time++;
243 }
244 i_time--;
245
246 real t_time = (t - pls_data->time[i_time])
247 / (pls_data->time[i_time+1] - pls_data->time[i_time]);
248
249 if(i_time < 0) {
250 /* time < t[0], use first profile */
251 i_time = 0;
252 t_time = 0;
253 }
254 else if(i_time >= pls_data->n_time-2) {
255 /* time > t[n_time-1], use last profile */
256 i_time = pls_data->n_time-2;
257 t_time = 1;
258 }
259
260 for(int i = 0; i < pls_data->n_species; i++) {
261 real p11, p12, p21, p22, p1, p2;
262
263 p11 = pls_data->dens[i_time*pls_data->n_species*pls_data->n_rho
264 + i*pls_data->n_rho
265 + i_rho];
266 p12 = pls_data->dens[i_time*pls_data->n_species*pls_data->n_rho
267 + i*pls_data->n_rho
268 + i_rho + 1];
269 p21 = pls_data->dens[(i_time+1)*pls_data->n_species*pls_data->n_rho
270 + i*pls_data->n_rho
271 + i_rho];
272 p22 = pls_data->dens[(i_time+1)*pls_data->n_species*pls_data->n_rho
273 + i*pls_data->n_rho
274 + i_rho + 1];
275
276 p1 = p11 + t_rho * (p12 - p11);
277 p2 = p21 + t_rho * (p22 - p21);
278
279 dens[i] = p1 + t_time * (p2 - p1);
280
281 if(i < 2) {
282 /* Electron and ion temperature */
283 p11 = pls_data->temp[i_time*2*pls_data->n_rho
284 + i*pls_data->n_rho
285 +i_rho];
286 p12 = pls_data->temp[i_time*2*pls_data->n_rho
287 + i*pls_data->n_rho
288 + i_rho + 1];
289 p21 = pls_data->temp[(i_time+1)*2*pls_data->n_rho
290 + i*pls_data->n_rho
291 + i_rho];
292 p22 = pls_data->temp[(i_time+1)*2*pls_data->n_rho
293 + i*pls_data->n_rho
294 + i_rho + 1];
295
296 p1 = p11 + t_rho * (p12 - p11);
297 p2 = p21 + t_rho * (p22 - p21);
298
299 temp[i] = p1 + t_time * (p2 - p1);
300 }
301 else {
302 /* Temperature is same for all ion species */
303 temp[i] = temp[1];
304 }
305 }
306 }
307
308 return err;
309}
310
321 plasma_1Dt_data* pls_data) {
322 a5err err = 0;
323 if(rho < pls_data->rho[0]) {
325 }
326 else if(rho >= pls_data->rho[pls_data->n_rho-1]) {
328 }
329 else {
330 int i_rho = 0;
331 while(i_rho < pls_data->n_rho-1 && pls_data->rho[i_rho] <= rho) {
332 i_rho++;
333 }
334 i_rho--;
335
336 real t_rho = (rho - pls_data->rho[i_rho])
337 / (pls_data->rho[i_rho+1] - pls_data->rho[i_rho]);
338
339 int i_time = 0;
340 while(i_time < pls_data->n_time-1 && pls_data->time[i_time] <= t) {
341 i_time++;
342 }
343 i_time--;
344
345 real t_time = (t - pls_data->time[i_time])
346 / (pls_data->time[i_time+1] - pls_data->time[i_time]);
347
348 if(i_time < 0) {
349 /* time < t[0], use first profile */
350 i_time = 0;
351 t_time = 0;
352 }
353 else if(i_time >= pls_data->n_time-2) {
354 /* time > t[n_time-1], use last profile */
355 i_time = pls_data->n_time-2;
356 t_time = 1;
357 }
358
359 real p11, p12, p21, p22, p1, p2;
360
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];
365
366 p1 = p11 + t_rho * (p12 - p11);
367 p2 = p21 + t_rho * (p22 - p21);
368
369 *vflow = p1 + t_time * (p2 - p1);
370 }
371 *vflow *= r;
372 return err;
373}
Main header file for ASCOT5.
double real
Definition ascot5.h:85
#define MAX_SPECIES
Maximum number of plasma species.
Definition ascot5.h:95
Header file containing physical and mathematical constants.
#define CONST_U
Atomic mass unit in kilograms [kg].
Definition consts.h:32
#define CONST_M_E
Electron mass [kg].
Definition consts.h:41
#define CONST_E
Elementary charge [C].
Definition consts.h:35
Error module for ASCOT5.
unsigned long int a5err
Simulation error flag.
Definition error.h:17
@ EF_PLASMA_1D
Definition error.h:40
@ ERR_INPUT_EVALUATION
Definition error.h:63
static DECLARE_TARGET_SIMD a5err error_raise(error_type type, int line, error_file file)
Raise a new error.
Definition error.h:86
Header file for math.c.
void plasma_1Dt_offload(plasma_1Dt_data *data)
Offload data to the accelerator.
Definition plasma_1Dt.c:140
void plasma_1Dt_free(plasma_1Dt_data *data)
Free allocated resources.
Definition plasma_1Dt.c:124
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.
Definition plasma_1Dt.c:22
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.
Definition plasma_1Dt.c:220
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.
Definition plasma_1Dt.c:320
a5err plasma_1Dt_eval_temp(real *temp, real rho, real t, int species, plasma_1Dt_data *pls_data)
Evaluate plasma temperature.
Definition plasma_1Dt.c:165
a5err plasma_1Dt_eval_dens(real *dens, real rho, real t, int species, plasma_1Dt_data *pls_data)
Evaluate plasma density.
Definition plasma_1Dt.c:193
Header file for plasma_1Dt.c.
Macros for printing console output.
#define print_out(v,...)
Print to standard output.
Definition print.h:31
@ VERBOSE_IO
Definition print.h:20
1D plasma parameters on the target
Definition plasma_1Dt.h:14