ASCOT5
Loading...
Searching...
No Matches
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
25int 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");
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);
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++) {
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+1)*nrho - 1],
76 data->temp[nrho] / CONST_E, data->temp[2*nrho-1] / CONST_E);
77 }
79 "[electrons] %3d /%7.3f %1.2le/%1.2le "
80 " %1.2le/%1.2le \n",
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
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
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
147a5err 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]) {
153 }
154 else if(rho >= pls_data->rho[pls_data->n_rho-1]) {
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
187a5err 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]) {
193 }
194 else if(rho >= pls_data->rho[pls_data->n_rho-1]) {
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
228 plasma_1D_data* pls_data) {
229 a5err err = 0;
230 if(rho < pls_data->rho[0]) {
232 }
233 else if(rho >= pls_data->rho[pls_data->n_rho-1]) {
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
277 plasma_1D_data* pls_data) {
278 a5err err = 0;
279 if(rho < pls_data->rho[0]) {
281 }
282 else if(rho >= pls_data->rho[pls_data->n_rho-1]) {
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}
Main header file for ASCOT5.
double real
Definition ascot5.h:85
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.
a5err plasma_1D_eval_dens(real *dens, real rho, int species, plasma_1D_data *pls_data)
Evaluate plasma density.
Definition plasma_1D.c:187
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
void plasma_1D_free(plasma_1D_data *data)
Free allocated resources.
Definition plasma_1D.c:109
void plasma_1D_offload(plasma_1D_data *data)
Offload data to the accelerator.
Definition plasma_1D.c:124
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
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
a5err plasma_1D_eval_temp(real *temp, real rho, int species, plasma_1D_data *pls_data)
Evaluate plasma temperature.
Definition plasma_1D.c:147
Header file for plasma_1D.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_1D.h:14
real * charge
Definition plasma_1D.h:18