ASCOT5
Toggle main menu visibility
Loading...
Searching...
No Matches
plasma
plasma_1D.c
Go to the documentation of this file.
1
8
#include <stdio.h>
9
#include <stdlib.h>
10
#include <
math.h
>
11
#include "
../ascot5.h
"
12
#include "
../error.h
"
13
#include "
../consts.h
"
14
#include "
../print.h
"
15
#include "
plasma_1D.h
"
16
17
25
int
plasma_1D_init
(
plasma_1D_data
* data,
int
nrho,
int
nion,
real
* rho,
26
int
* anum,
int
* znum,
real
* mass,
real
* charge,
27
real
* Te,
real
* Ti,
real
* ne,
real
* ni,
real
* vtor) {
28
29
data->
n_rho
= nrho;
30
data->
n_species
= nion + 1;
31
32
data->
anum
= (
int
*) malloc( nion*
sizeof
(
int
) );
33
data->
znum
= (
int
*) malloc( nion*
sizeof
(
int
) );
34
data->
mass
= (
real
*) malloc( (nion+1)*
sizeof
(
real
) );
35
data->
charge
= (
real
*) malloc( (nion+1)*
sizeof
(
real
) );
36
for
(
int
i = 0; i < data->
n_species
; i++) {
37
if
(i < nion) {
38
data->
znum
[i] = znum[i];
39
data->
anum
[i] = anum[i];
40
}
41
data->
mass
[i] = mass[i];
42
data->
charge
[i] = charge[i];
43
}
44
data->
rho
= (
real
*) malloc( nrho*
sizeof
(
real
) );
45
data->
vtor
= (
real
*) malloc( nrho*
sizeof
(
real
) );
46
data->
temp
= (
real
*) malloc( 2*nrho*
sizeof
(
real
) );
47
data->
dens
= (
real
*) malloc( (nion+1)*nrho*
sizeof
(
real
) );
48
for
(
int
i = 0; i < data->
n_rho
; i++) {
49
data->
rho
[i] = rho[i];
50
data->
vtor
[i] = vtor[i];
51
data->
temp
[i] = Te[i];
52
data->
temp
[nrho + i] = Ti[i];
53
data->
dens
[i] = ne[i];
54
for
(
int
j = 0; j < nion; j++) {
55
data->
dens
[(j+1) * nrho + i] = ni[j*nrho + i];
56
}
57
}
58
59
print_out
(
VERBOSE_IO
,
"\n1D plasma profiles (P_1D)\n"
);
60
print_out
(
VERBOSE_IO
,
61
"Min rho = %1.2le, Max rho = %1.2le,"
62
" Number of rho grid points = %d,"
63
" Number of ion species = %d\n"
,
64
data->
rho
[0], data->
rho
[data->
n_rho
-1], data->
n_rho
, nion);
65
print_out
(
VERBOSE_IO
,
66
"Species Z/A charge [e]/mass [amu] Density [m^-3] at Min/Max rho"
67
" Temperature [eV] at Min/Max rho\n"
);
68
for
(
int
i=0; i < nion; i++) {
69
print_out
(
VERBOSE_IO
,
70
" %3d /%3d %3d /%7.3f %1.2le/%1.2le "
71
" %1.2le/%1.2le \n"
,
72
data->
znum
[i], data->
anum
[i],
73
(
int
)round(data->
charge
[i+1]/
CONST_E
),
74
data->
mass
[i+1]/
CONST_U
,
75
data->
dens
[(i+1)*nrho], data->
dens
[(i+2)*nrho - 1],
76
data->
temp
[nrho] /
CONST_E
, data->
temp
[2*nrho-1] /
CONST_E
);
77
}
78
print_out
(
VERBOSE_IO
,
79
"[electrons] %3d /%7.3f %1.2le/%1.2le "
80
" %1.2le/%1.2le \n"
,
81
-1,
CONST_M_E
/
CONST_U
,
82
data->
dens
[0], data->
dens
[nrho - 1],
83
data->
temp
[0] /
CONST_E
, data->
temp
[nrho-1] /
CONST_E
);
84
print_out
(
VERBOSE_IO
,
"Toroidal rotation [rad/s] at Min/Max rho: "
85
"%1.2le/%1.2le\n"
,
86
data->
vtor
[0], data->
vtor
[nrho - 1]);
87
real
quasineutrality = 0;
88
for
(
int
k = 0; k < nrho; k++) {
89
real
ele_qdens = data->
dens
[k] *
CONST_E
;
90
real
ion_qdens = 0;
91
for
(
int
i = 0; i < nion; i++) {
92
ion_qdens += data->
dens
[(i+1)*nrho + k] * data->
charge
[i+1];
93
}
94
quasineutrality = fmax( quasineutrality,
95
fabs( 1 - ion_qdens / ele_qdens ) );
96
}
97
print_out
(
VERBOSE_IO
,
"Quasi-neutrality is (electron / ion charge density)"
98
" %.2f\n"
, 1+quasineutrality);
99
print_out
(
VERBOSE_IO
,
"Toroidal rotation [rad/s] at Min/Max rho: "
100
"%1.2le/%1.2le\n"
, data->
vtor
[0], data->
vtor
[nrho - 1]);
101
return
0;
102
}
103
109
void
plasma_1D_free
(
plasma_1D_data
* data) {
110
free(data->
mass
);
111
free(data->
charge
);
112
free(data->
anum
);
113
free(data->
znum
);
114
free(data->
rho
);
115
free(data->
temp
);
116
free(data->
dens
);
117
}
118
124
void
plasma_1D_offload
(
plasma_1D_data
* data) {
125
GPU_MAP_TO_DEVICE(
126
data->
mass
[0:data->
n_species
], data->
charge
[0:data->
n_species
], \
127
data->
anum
[0:data->
n_species
-1], data->
znum
[0:data->
n_species
-1], \
128
data->
rho
[0:data->
n_rho
], data->
temp
[0:2*data->
n_rho
], \
129
data->
vtor
[0:data->
n_rho
], \
130
data->
dens
[0:data->
n_rho
*data->
n_species
]
131
)
132
}
133
147
a5err
plasma_1D_eval_temp
(
real
* temp,
real
rho,
int
species,
148
plasma_1D_data
* pls_data) {
149
150
a5err
err = 0;
151
if
(rho < pls_data->rho[0]) {
152
err = error_raise(
ERR_INPUT_EVALUATION
, __LINE__,
EF_PLASMA_1D
);
153
}
154
else
if
(rho >= pls_data->
rho
[pls_data->
n_rho
-1]) {
155
err = error_raise(
ERR_INPUT_EVALUATION
, __LINE__,
EF_PLASMA_1D
);
156
}
157
else
{
158
int
i_rho = 0;
159
while
(i_rho < pls_data->n_rho - 1 && pls_data->
rho
[i_rho] <= rho) {
160
i_rho++;
161
}
162
i_rho--;
163
real
t_rho = (rho - pls_data->
rho
[i_rho])
164
/ (pls_data->
rho
[i_rho+1] - pls_data->
rho
[i_rho]);
165
166
real
p1 = pls_data->
temp
[(species>0)*pls_data->
n_rho
+ i_rho];
167
real
p2 = pls_data->
temp
[(species>0)*pls_data->
n_rho
+ i_rho+1];
168
temp[0] = p1 + t_rho * (p2 - p1);
169
}
170
171
return
err;
172
}
173
187
a5err
plasma_1D_eval_dens
(
real
* dens,
real
rho,
int
species,
188
plasma_1D_data
* pls_data) {
189
190
a5err
err = 0;
191
if
(rho < pls_data->rho[0]) {
192
err = error_raise(
ERR_INPUT_EVALUATION
, __LINE__,
EF_PLASMA_1D
);
193
}
194
else
if
(rho >= pls_data->
rho
[pls_data->
n_rho
-1]) {
195
err = error_raise(
ERR_INPUT_EVALUATION
, __LINE__,
EF_PLASMA_1D
);
196
}
197
else
{
198
int
i_rho = 0;
199
while
(i_rho < pls_data->n_rho - 1 && pls_data->
rho
[i_rho] <= rho) {
200
i_rho++;
201
}
202
i_rho--;
203
real
t_rho = (rho - pls_data->
rho
[i_rho])
204
/ (pls_data->
rho
[i_rho+1] - pls_data->
rho
[i_rho]);
205
206
real
p1 = pls_data->
dens
[species*pls_data->
n_rho
+ i_rho];
207
real
p2 = pls_data->
dens
[species*pls_data->
n_rho
+ i_rho+1];
208
dens[0] = p1 + t_rho * (p2 - p1);
209
}
210
211
return
err;
212
}
213
227
a5err
plasma_1D_eval_densandtemp
(
real
* dens,
real
* temp,
real
rho,
228
plasma_1D_data
* pls_data) {
229
a5err
err = 0;
230
if
(rho < pls_data->rho[0]) {
231
err = error_raise(
ERR_INPUT_EVALUATION
, __LINE__,
EF_PLASMA_1D
);
232
}
233
else
if
(rho >= pls_data->
rho
[pls_data->
n_rho
-1]) {
234
err = error_raise(
ERR_INPUT_EVALUATION
, __LINE__,
EF_PLASMA_1D
);
235
}
236
else
{
237
int
i_rho = 0;
238
while
(i_rho < pls_data->n_rho-1 && pls_data->
rho
[i_rho] <= rho) {
239
i_rho++;
240
}
241
i_rho--;
242
243
real
t_rho = (rho - pls_data->
rho
[i_rho])
244
/ (pls_data->
rho
[i_rho+1] - pls_data->
rho
[i_rho]);
245
246
real
p1, p2;
247
for
(
int
i = 0; i < pls_data->
n_species
; i++) {
248
p1 = pls_data->
dens
[i*pls_data->
n_rho
+ i_rho];
249
p2 = pls_data->
dens
[i*pls_data->
n_rho
+ i_rho+1];
250
dens[i] = p1 + t_rho * (p2 - p1);
251
252
if
(i < 2) {
253
/* Electron and ion temperature */
254
p1 = pls_data->
temp
[i*pls_data->
n_rho
+ i_rho];
255
p2 = pls_data->
temp
[i*pls_data->
n_rho
+ i_rho+1];
256
temp[i] = p1 + t_rho * (p2 - p1);
257
}
258
else
{
259
/* Temperature is same for all ion species */
260
temp[i] = temp[1];
261
}
262
}
263
}
264
265
return
err;
266
}
267
276
a5err
plasma_1D_eval_flow
(
real
* vflow,
real
rho,
real
r,
277
plasma_1D_data
* pls_data) {
278
a5err
err = 0;
279
if
(rho < pls_data->rho[0]) {
280
err = error_raise(
ERR_INPUT_EVALUATION
, __LINE__,
EF_PLASMA_1D
);
281
}
282
else
if
(rho >= pls_data->
rho
[pls_data->
n_rho
-1]) {
283
err = error_raise(
ERR_INPUT_EVALUATION
, __LINE__,
EF_PLASMA_1D
);
284
}
285
else
{
286
int
i_rho = 0;
287
while
(i_rho < pls_data->n_rho-1 && pls_data->
rho
[i_rho] <= rho) {
288
i_rho++;
289
}
290
i_rho--;
291
*vflow = pls_data->
vtor
[i_rho];
292
}
293
*vflow *= r;
294
return
err;
295
}
ascot5.h
Main header file for ASCOT5.
real
double real
Definition
ascot5.h:85
consts.h
Header file containing physical and mathematical constants.
CONST_U
#define CONST_U
Atomic mass unit in kilograms [kg].
Definition
consts.h:32
CONST_M_E
#define CONST_M_E
Electron mass [kg].
Definition
consts.h:41
CONST_E
#define CONST_E
Elementary charge [C].
Definition
consts.h:35
error.h
Error module for ASCOT5.
a5err
unsigned long int a5err
Simulation error flag.
Definition
error.h:17
EF_PLASMA_1D
@ EF_PLASMA_1D
Definition
error.h:40
ERR_INPUT_EVALUATION
@ ERR_INPUT_EVALUATION
Definition
error.h:65
math.h
Header file for math.c.
plasma_1D_eval_dens
a5err plasma_1D_eval_dens(real *dens, real rho, int species, plasma_1D_data *pls_data)
Evaluate plasma density.
Definition
plasma_1D.c:187
plasma_1D_eval_densandtemp
a5err plasma_1D_eval_densandtemp(real *dens, real *temp, real rho, plasma_1D_data *pls_data)
Evaluate plasma density and temperature for all species.
Definition
plasma_1D.c:227
plasma_1D_free
void plasma_1D_free(plasma_1D_data *data)
Free allocated resources.
Definition
plasma_1D.c:109
plasma_1D_offload
void plasma_1D_offload(plasma_1D_data *data)
Offload data to the accelerator.
Definition
plasma_1D.c:124
plasma_1D_init
int plasma_1D_init(plasma_1D_data *data, int nrho, int nion, real *rho, int *anum, int *znum, real *mass, real *charge, real *Te, real *Ti, real *ne, real *ni, real *vtor)
Initialize 1D plasma data and check inputs.
Definition
plasma_1D.c:25
plasma_1D_eval_flow
a5err plasma_1D_eval_flow(real *vflow, real rho, real r, plasma_1D_data *pls_data)
Evalate plasma flow along the field lines.
Definition
plasma_1D.c:276
plasma_1D_eval_temp
a5err plasma_1D_eval_temp(real *temp, real rho, int species, plasma_1D_data *pls_data)
Evaluate plasma temperature.
Definition
plasma_1D.c:147
plasma_1D.h
Header file for plasma_1D.c.
print.h
Macros for printing console output.
print_out
#define print_out(v,...)
Print to standard output.
Definition
print.h:31
VERBOSE_IO
@ VERBOSE_IO
Definition
print.h:20
plasma_1D_data
1D plasma parameters on the target
Definition
plasma_1D.h:14
plasma_1D_data::temp
real * temp
Definition
plasma_1D.h:22
plasma_1D_data::anum
int * anum
Definition
plasma_1D.h:19
plasma_1D_data::znum
int * znum
Definition
plasma_1D.h:20
plasma_1D_data::dens
real * dens
Definition
plasma_1D.h:23
plasma_1D_data::n_species
int n_species
Definition
plasma_1D.h:16
plasma_1D_data::mass
real * mass
Definition
plasma_1D.h:17
plasma_1D_data::n_rho
int n_rho
Definition
plasma_1D.h:15
plasma_1D_data::charge
real * charge
Definition
plasma_1D.h:18
plasma_1D_data::vtor
real * vtor
Definition
plasma_1D.h:24
plasma_1D_data::rho
real * rho
Definition
plasma_1D.h:21
Generated on
for ASCOT5 by
1.18.0