ASCOT5
Loading...
Searching...
No Matches
hdf5_plasma.c
Go to the documentation of this file.
1
9#include <stdio.h>
10#include <stdlib.h>
11#include <hdf5.h>
12#include <hdf5_hl.h>
13#include "../ascot5.h"
14#include "../plasma.h"
15#include "../plasma/plasma_1D.h"
16#include "../plasma/plasma_2D.h"
19#include "../consts.h"
20#include "hdf5_helpers.h"
21#include "hdf5_plasma.h"
22
23#define PLSPATH
24
25int hdf5_plasma_read_1D(hid_t f, plasma_1D_data* data, char* qid);
26int hdf5_plasma_read_2D(hid_t f, plasma_2D_data* data, char* qid);
27int hdf5_plasma_read_1Dt(hid_t f, plasma_1Dt_data* data, char* qid);
28int hdf5_plasma_read_1DS(hid_t f, plasma_1DS_data* data, char* qid);
38int hdf5_plasma_init(hid_t f, plasma_data* data, char* qid) {
39
40 char path[256];
41 int err = 1;
42
43 /* Read data the QID corresponds to */
44 hdf5_gen_path("/plasma/plasma_1D_XXXXXXXXXX", qid, path);
45 if(hdf5_find_group(f, path) == 0) {
46 data->type = plasma_type_1D;
47 err = hdf5_plasma_read_1D(f, &data->plasma_1D, qid);
48 }
49 hdf5_gen_path("/plasma/plasma_2D_XXXXXXXXXX", qid, path);
50 if(hdf5_find_group(f, path) == 0) {
51 data->type = plasma_type_2D;
52 err = hdf5_plasma_read_2D(f, &data->plasma_2D, qid);
53 }
54 hdf5_gen_path("/plasma/plasma_1Dt_XXXXXXXXXX", qid, path);
55 if(hdf5_find_group(f, path) == 0) {
56 data->type = plasma_type_1Dt;
57 err = hdf5_plasma_read_1Dt(f, &data->plasma_1Dt, qid);
58 }
59 hdf5_gen_path("/plasma/plasma_1DS_XXXXXXXXXX", qid, path);
60 if(hdf5_find_group(f, path) == 0) {
61 data->type = plasma_type_1DS;
62 err = hdf5_plasma_read_1DS(f, &data->plasma_1DS, qid);
63 }
64 return err;
65}
66
76int hdf5_plasma_read_1D(hid_t f, plasma_1D_data* data, char* qid) {
77 #undef PLSPATH
78 #define PLSPATH "/plasma/plasma_1D_XXXXXXXXXX/"
79
80 int n_rho, n_ions;
81 if( hdf5_read_int(PLSPATH "nion", &n_ions,
82 f, qid, __FILE__, __LINE__) ) {return 1;}
83 if( hdf5_read_int(PLSPATH "nrho", &n_rho,
84 f, qid, __FILE__, __LINE__) ) {return 1;}
85
86 int* q = (int*) malloc( n_ions * sizeof(int) );
87 int* znum = (int*) malloc( n_ions * sizeof(int) );
88 int* anum = (int*) malloc( n_ions * sizeof(int) );
89 real* mass = (real*) malloc( ( n_ions + 1 ) * sizeof(real) );
90 real* charge = (real*) malloc( ( n_ions + 1 ) * sizeof(real) );
91 if( hdf5_read_int(PLSPATH "znum", znum,
92 f, qid, __FILE__, __LINE__) ) {return 1;}
93 if( hdf5_read_int(PLSPATH "anum", anum,
94 f, qid, __FILE__, __LINE__) ) {return 1;}
95 if( hdf5_read_int(PLSPATH "charge", q,
96 f, qid, __FILE__, __LINE__) ) {return 1;}
97 if( hdf5_read_double(PLSPATH "mass", &mass[1],
98 f, qid, __FILE__, __LINE__) ) {return 1;}
99 charge[0] = -1 * CONST_E;
100 for(int i = 0; i < n_ions; i++) {
101 charge[i+1] = q[i] * CONST_E;
102 }
103 mass[0] = CONST_M_E;
104 for(int i = 0; i < n_ions; i++) {
105 mass[i+1] *= CONST_U;
106 }
107 free(q);
108
109 real* Te = (real*) malloc( n_rho*sizeof(real) );
110 real* Ti = (real*) malloc( n_rho*sizeof(real) );
111 real* ne = (real*) malloc( n_rho*sizeof(real) );
112 real* ni = (real*) malloc( n_rho*n_ions*sizeof(real) );
113 real* rho = (real*) malloc( n_rho*sizeof(real) );
114 real* vtor = (real*) malloc( n_rho*sizeof(real) );
115 if( hdf5_read_double(PLSPATH "rho", rho,
116 f, qid, __FILE__, __LINE__) ) {return 1;}
117 if( hdf5_read_double(PLSPATH "vtor", vtor,
118 f, qid, __FILE__, __LINE__) ) {return 1;}
119 if( hdf5_read_double(PLSPATH "etemperature", Te,
120 f, qid, __FILE__, __LINE__) ) {return 1;}
121 if( hdf5_read_double(PLSPATH "edensity", ne,
122 f, qid, __FILE__, __LINE__) ) {return 1;}
123 if( hdf5_read_double(PLSPATH "itemperature", Ti,
124 f, qid, __FILE__, __LINE__) ) {return 1;}
125 if( hdf5_read_double(PLSPATH "idensity", ni,
126 f, qid, __FILE__, __LINE__) ) {return 1;}
127
128 for(int i = 0; i < n_rho; i++) {
129 Te[i] = Te[i] * CONST_E;
130 Ti[i] = Ti[i] * CONST_E;
131 }
132
133 int err = plasma_1D_init(data, n_rho, n_ions, rho, anum, znum, mass, charge,
134 Te, Ti, ne, ni, vtor);
135 free(Te);
136 free(Ti);
137 free(ne);
138 free(ni);
139 free(rho);
140 free(znum);
141 free(anum);
142 free(mass);
143 free(charge);
144 return err;
145}
146
156int hdf5_plasma_read_2D(hid_t f, plasma_2D_data* data, char* qid) {
157 #undef PLSPATH
158 #define PLSPATH "/plasma/plasma_2D_XXXXXXXXXX/"
159
160 int nr, nz, n_ions;
161 real rmin, rmax, zmin, zmax;
162 if( hdf5_read_int(PLSPATH "nion", &n_ions,
163 f, qid, __FILE__, __LINE__) ) {return 1;}
164 if( hdf5_read_int(PLSPATH "nr", &nr,
165 f, qid, __FILE__, __LINE__) ) {return 1;}
166 if( hdf5_read_int(PLSPATH "nz", &nz,
167 f, qid, __FILE__, __LINE__) ) {return 1;}
168 if( hdf5_read_double(PLSPATH "rmin", &rmin,
169 f, qid, __FILE__, __LINE__) ) {return 1;}
170 if( hdf5_read_double(PLSPATH "rmax", &rmax,
171 f, qid, __FILE__, __LINE__) ) {return 1;}
172 if( hdf5_read_double(PLSPATH "zmin", &zmin,
173 f, qid, __FILE__, __LINE__) ) {return 1;}
174 if( hdf5_read_double(PLSPATH "zmax", &zmax,
175 f, qid, __FILE__, __LINE__) ) {return 1;}
176
177 int* q = (int*) malloc( n_ions * sizeof(int) );
178 int* znum = (int*) malloc( n_ions * sizeof(int) );
179 int* anum = (int*) malloc( n_ions * sizeof(int) );
180 real* mass = (real*) malloc( ( n_ions + 1 ) * sizeof(real) );
181 real* charge = (real*) malloc( ( n_ions + 1 ) * sizeof(real) );
182 if( hdf5_read_int(PLSPATH "znum", znum,
183 f, qid, __FILE__, __LINE__) ) {return 1;}
184 if( hdf5_read_int(PLSPATH "anum", anum,
185 f, qid, __FILE__, __LINE__) ) {return 1;}
186 if( hdf5_read_int(PLSPATH "charge", q,
187 f, qid, __FILE__, __LINE__) ) {return 1;}
188 if( hdf5_read_double(PLSPATH "mass", &mass[1],
189 f, qid, __FILE__, __LINE__) ) {return 1;}
190 charge[0] = -1 * CONST_E;
191 for(int i = 0; i < n_ions; i++) {
192 charge[i+1] = q[i] * CONST_E;
193 }
194 mass[0] = CONST_M_E;
195 for(int i = 0; i < n_ions; i++) {
196 mass[i+1] *= CONST_U;
197 }
198 free(q);
199
200 real* Te = (real*) malloc( nr*nz*sizeof(real) );
201 real* Ti = (real*) malloc( nr*nz*sizeof(real) );
202 real* ne = (real*) malloc( nr*nz*sizeof(real) );
203 real* ni = (real*) malloc( nr*nz*n_ions*sizeof(real) );
204 real* vtor = (real*) malloc( nr*nz*sizeof(real) );
205 if( hdf5_read_double(PLSPATH "vtor", vtor,
206 f, qid, __FILE__, __LINE__) ) {return 1;}
207 if( hdf5_read_double(PLSPATH "etemperature", Te,
208 f, qid, __FILE__, __LINE__) ) {return 1;}
209 if( hdf5_read_double(PLSPATH "edensity", ne,
210 f, qid, __FILE__, __LINE__) ) {return 1;}
211 if( hdf5_read_double(PLSPATH "itemperature", Ti,
212 f, qid, __FILE__, __LINE__) ) {return 1;}
213 if( hdf5_read_double(PLSPATH "idensity", ni,
214 f, qid, __FILE__, __LINE__) ) {return 1;}
215
216 for(int i = 0; i < nr * nz; i++) {
217 Te[i] = Te[i] * CONST_E;
218 Ti[i] = Ti[i] * CONST_E;
219 }
220
221 int err = plasma_2D_init(
222 data, nr, nz, n_ions, rmin, rmax, zmin, zmax, anum, znum, mass, charge,
223 Te, Ti, ne, ni, vtor);
224 free(Te);
225 free(Ti);
226 free(ne);
227 free(ni);
228 free(znum);
229 free(anum);
230 free(mass);
231 free(charge);
232 return err;
233}
234
244int hdf5_plasma_read_1Dt(hid_t f, plasma_1Dt_data* data, char* qid) {
245 #undef PLSPATH
246 #define PLSPATH "/plasma/plasma_1Dt_XXXXXXXXXX/"
247
248 /* Read rhogrid size and number of species */
249 int n_rho, n_time, n_ions;
250 if( hdf5_read_int(PLSPATH "nion", &n_ions,
251 f, qid, __FILE__, __LINE__) ) {return 1;}
252 if( hdf5_read_int(PLSPATH "nrho", &n_rho,
253 f, qid, __FILE__, __LINE__) ) {return 1;}
254 if( hdf5_read_int(PLSPATH "ntime", &n_time,
255 f, qid, __FILE__, __LINE__) ) {return 1;}
256
257 int* q = (int*) malloc( n_ions * sizeof(int) );
258 int* znum = (int*) malloc( n_ions * sizeof(int) );
259 int* anum = (int*) malloc( n_ions * sizeof(int) );
260 real* mass = (real*) malloc( ( n_ions + 1 ) * sizeof(real) );
261 real* charge = (real*) malloc( ( n_ions + 1 ) * sizeof(real) );
262 if( hdf5_read_int(PLSPATH "znum", znum,
263 f, qid, __FILE__, __LINE__) ) {return 1;}
264 if( hdf5_read_int(PLSPATH "anum", anum,
265 f, qid, __FILE__, __LINE__) ) {return 1;}
266 if( hdf5_read_int(PLSPATH "charge", q,
267 f, qid, __FILE__, __LINE__) ) {return 1;}
268 if( hdf5_read_double(PLSPATH "mass", &mass[1],
269 f, qid, __FILE__, __LINE__) ) {return 1;}
270 charge[0] = -1 * CONST_E;
271 for(int i = 0; i < n_ions; i++) {
272 charge[i+1] = q[i] * CONST_E;
273 }
274 mass[0] = CONST_M_E;
275 for(int i = 0; i < n_ions; i++) {
276 mass[i+1] *= CONST_U;
277 }
278 free(q);
279
280 real* rho = (real*) malloc( n_rho * sizeof(real) );
281 real* time = (real*) malloc( n_time * sizeof(real) );
282 if( hdf5_read_double(PLSPATH "rho", rho,
283 f, qid, __FILE__, __LINE__) ) {return 1;}
284 if( hdf5_read_double(PLSPATH "time", time,
285 f, qid, __FILE__, __LINE__) ) {return 1;}
286
287 real* vtor = (real*) malloc( n_time*n_rho*sizeof(real) );
288 real* Te = (real*) malloc( n_time*n_rho*sizeof(real) );
289 real* Ti = (real*) malloc( n_time*n_rho*sizeof(real) );
290 real* ne = (real*) malloc( n_time*n_rho*sizeof(real) );
291 real* ni = (real*) malloc( n_time*n_ions*n_rho*sizeof(real) );
292 if( hdf5_read_double(PLSPATH "etemperature", Te,
293 f, qid, __FILE__, __LINE__) ) {return 1;}
294 if( hdf5_read_double(PLSPATH "itemperature", Ti,
295 f, qid, __FILE__, __LINE__) ) {return 1;}
296 if( hdf5_read_double(PLSPATH "vtor", vtor,
297 f, qid, __FILE__, __LINE__) ) {return 1;}
298
299 for(int i_time = 0; i_time < n_time; i_time++) {
300 for(int i_rho = 0; i_rho < n_rho; i_rho++) {
301 Te[i_time*n_rho+i_rho] *= CONST_E;
302 Ti[i_time*n_rho+i_rho] *= CONST_E;
303 }
304 }
305
306 if( hdf5_read_double(PLSPATH "edensity", ne,
307 f, qid, __FILE__, __LINE__) ) {return 1;}
308 if( hdf5_read_double(PLSPATH "idensity", ni,
309 f, qid, __FILE__, __LINE__) ) {return 1;}
310 int err = plasma_1Dt_init(data, n_rho, n_time, n_ions, rho, time, anum,
311 znum, mass, charge, Te, Ti, ne, ni, vtor);
312 free(Te);
313 free(Ti);
314 free(ne);
315 free(ni);
316 free(vtor);
317 free(znum);
318 free(anum);
319 free(mass);
320 free(charge);
321 return err;
322}
323
333int hdf5_plasma_read_1DS(hid_t f, plasma_1DS_data* data, char* qid) {
334
335 #undef PLSPATH
336 #define PLSPATH "/plasma/plasma_1DS_XXXXXXXXXX/"
337
338 /* Read rhogrid and number of species */
339 int n_rho, n_ions;
340 real rhomin, rhomax;
341 if( hdf5_read_int(PLSPATH "nion", &n_ions,
342 f, qid, __FILE__, __LINE__) ) {return 1;}
343 if( hdf5_read_int(PLSPATH "nrho", &n_rho,
344 f, qid, __FILE__, __LINE__) ) {return 1;}
345 if( hdf5_read_double(PLSPATH "rhomin", &rhomin,
346 f, qid, __FILE__, __LINE__) ) {return 1;}
347 if( hdf5_read_double(PLSPATH "rhomax", &rhomax,
348 f, qid, __FILE__, __LINE__) ) {return 1;}
349
350 int* q = (int*) malloc( n_ions * sizeof(int) );
351 int* znum = (int*) malloc( n_ions * sizeof(int) );
352 int* anum = (int*) malloc( n_ions * sizeof(int) );
353 real* mass = (real*) malloc( ( n_ions + 1 ) * sizeof(real) );
354 real* charge = (real*) malloc( ( n_ions + 1 ) * sizeof(real) );
355 if( hdf5_read_int(PLSPATH "znum", znum,
356 f, qid, __FILE__, __LINE__) ) {return 1;}
357 if( hdf5_read_int(PLSPATH "anum", anum,
358 f, qid, __FILE__, __LINE__) ) {return 1;}
359 if( hdf5_read_int(PLSPATH "charge", q,
360 f, qid, __FILE__, __LINE__) ) {return 1;}
361 if( hdf5_read_double(PLSPATH "mass", &mass[1],
362 f, qid, __FILE__, __LINE__) ) {return 1;}
363 charge[0] = -1 * CONST_E;
364 for(int i = 0; i < n_ions; i++) {
365 charge[i+1] = q[i] * CONST_E;
366 }
367 mass[0] = CONST_M_E;
368 for(int i = 0; i < n_ions; i++) {
369 mass[i+1] *= CONST_U;
370 }
371 free(q);
372
373 real* vtor = (real*) malloc( n_rho*sizeof(real) );
374 real* Te = (real*) malloc( n_rho*sizeof(real) );
375 real* Ti = (real*) malloc( n_rho*sizeof(real) );
376 real* ne = (real*) malloc( n_rho*sizeof(real) );
377 real* ni = (real*) malloc( n_rho*n_ions*sizeof(real) );
378 if( hdf5_read_double(PLSPATH "vtor", vtor,
379 f, qid, __FILE__, __LINE__) ) {return 1;}
380 if( hdf5_read_double(PLSPATH "etemperature", Te,
381 f, qid, __FILE__, __LINE__) ) {return 1;}
382 if( hdf5_read_double(PLSPATH "edensity", ne,
383 f, qid, __FILE__, __LINE__) ) {return 1;}
384 if( hdf5_read_double(PLSPATH "itemperature", Ti,
385 f, qid, __FILE__, __LINE__) ) {return 1;}
386 if( hdf5_read_double(PLSPATH "idensity", ni,
387 f, qid, __FILE__, __LINE__) ) {return 1;}
388
389 for(int i = 0; i < n_rho; i++) {
390 Te[i] = Te[i] * CONST_E;
391 Ti[i] = Ti[i] * CONST_E;
392 }
393
394 int err = plasma_1DS_init(data, n_rho, rhomin, rhomax, n_ions, anum, znum,
395 mass, charge, Te, Ti, ne, ni, vtor);
396
397 free(Te);
398 free(Ti);
399 free(ne);
400 free(ni);
401 free(vtor);
402 free(znum);
403 free(anum);
404 free(mass);
405 free(charge);
406 return err;
407}
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
herr_t hdf5_find_group(hid_t loc, const char *path)
Checks if given group exists within given hdf5 file. Negative value is returned if the group doesn't ...
int hdf5_read_double(const char *var, real *ptr, hid_t file, char *qid, const char *errfile, int errline)
Read double-valued data from ASCOT5 HDF5 file.
char * hdf5_gen_path(const char *original, char *qid, char *path)
Generate a valid path from a given template and qid.
int hdf5_read_int(const char *var, int *ptr, hid_t file, char *qid, const char *errfile, int errline)
Read int-valued data from ASCOT5 HDF5 file.
Header file for hdf5_helpers.h.
int hdf5_plasma_read_1Dt(hid_t f, plasma_1Dt_data *data, char *qid)
Read 1Dt plasma data from HDF5 file.
int hdf5_plasma_read_2D(hid_t f, plasma_2D_data *data, char *qid)
Read 2D plasma data from HDF5 file.
#define PLSPATH
Definition hdf5_plasma.c:23
int hdf5_plasma_read_1D(hid_t f, plasma_1D_data *data, char *qid)
Read 1D plasma data from HDF5 file.
Definition hdf5_plasma.c:76
int hdf5_plasma_init(hid_t f, plasma_data *data, char *qid)
Read plasma data from HDF5 file.
Definition hdf5_plasma.c:38
int hdf5_plasma_read_1DS(hid_t f, plasma_1DS_data *data, char *qid)
Load plasma data from HDF5 file and prepare parameters.
Header file for hdf5_plasma.c.
Header file for plasma.c.
@ plasma_type_1D
Definition plasma.h:22
@ plasma_type_1Dt
Definition plasma.h:24
@ plasma_type_1DS
Definition plasma.h:25
@ plasma_type_2D
Definition plasma.h:23
int plasma_1DS_init(plasma_1DS_data *data, int nrho, real rhomin, real rhomax, int nion, int *anum, int *znum, real *mass, real *charge, real *Te, real *Ti, real *ne, real *ni, real *vtor)
Initialize 1DS plasma data and check inputs.
Definition plasma_1DS.c:43
Header file for plasma_1DS.c.
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
Header file for plasma_1D.c.
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
Header file for plasma_1Dt.c.
int plasma_2D_init(plasma_2D_data *data, int nr, int nz, int nion, real r_min, real r_max, real z_min, real z_max, int *anum, int *znum, real *mass, real *charge, real *Te, real *Ti, real *ne, real *ni, real *vtor)
Initialize 2D plasma data and check inputs.
Definition plasma_2D.c:25
Header file for plasma_2D.c.
1D spline plasma parameters on the target
Definition plasma_1DS.h:15
1D plasma parameters on the target
Definition plasma_1D.h:14
1D plasma parameters on the target
Definition plasma_1Dt.h:14
1D plasma parameters on the target
Definition plasma_2D.h:15
Plasma simulation data.
Definition plasma.h:34
plasma_1D_data plasma_1D
Definition plasma.h:36
plasma_1Dt_data plasma_1Dt
Definition plasma.h:38
plasma_1DS_data plasma_1DS
Definition plasma.h:39
plasma_type type
Definition plasma.h:35
plasma_2D_data plasma_2D
Definition plasma.h:37