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"
18#include "../consts.h"
19#include "hdf5_helpers.h"
20#include "hdf5_plasma.h"
21
22#define PLSPATH
23
24int hdf5_plasma_read_1D(hid_t f, plasma_1D_data* data, char* qid);
25int hdf5_plasma_read_1Dt(hid_t f, plasma_1Dt_data* data, char* qid);
26int hdf5_plasma_read_1DS(hid_t f, plasma_1DS_data* data, char* qid);
36int hdf5_plasma_init(hid_t f, plasma_data* data, char* qid) {
37
38 char path[256];
39 int err = 1;
40
41 /* Read data the QID corresponds to */
42 hdf5_gen_path("/plasma/plasma_1D_XXXXXXXXXX", qid, path);
43 if(hdf5_find_group(f, path) == 0) {
44 data->type = plasma_type_1D;
45 err = hdf5_plasma_read_1D(f, &data->plasma_1D, qid);
46 }
47 hdf5_gen_path("/plasma/plasma_1Dt_XXXXXXXXXX", qid, path);
48 if(hdf5_find_group(f, path) == 0) {
49 data->type = plasma_type_1Dt;
50 err = hdf5_plasma_read_1Dt(f, &data->plasma_1Dt, qid);
51 }
52 hdf5_gen_path("/plasma/plasma_1DS_XXXXXXXXXX", qid, path);
53 if(hdf5_find_group(f, path) == 0) {
54 data->type = plasma_type_1DS;
55 err = hdf5_plasma_read_1DS(f, &data->plasma_1DS, qid);
56 }
57 return err;
58}
59
69int hdf5_plasma_read_1D(hid_t f, plasma_1D_data* data, char* qid) {
70 #undef PLSPATH
71 #define PLSPATH "/plasma/plasma_1D_XXXXXXXXXX/"
72
73 int n_rho, n_ions;
74 if( hdf5_read_int(PLSPATH "nion", &n_ions,
75 f, qid, __FILE__, __LINE__) ) {return 1;}
76 if( hdf5_read_int(PLSPATH "nrho", &n_rho,
77 f, qid, __FILE__, __LINE__) ) {return 1;}
78
79 int* q = (int*) malloc( n_ions * sizeof(int) );
80 int* znum = (int*) malloc( n_ions * sizeof(int) );
81 int* anum = (int*) malloc( n_ions * sizeof(int) );
82 real* mass = (real*) malloc( ( n_ions + 1 ) * sizeof(real) );
83 real* charge = (real*) malloc( ( n_ions + 1 ) * sizeof(real) );
84 if( hdf5_read_int(PLSPATH "znum", znum,
85 f, qid, __FILE__, __LINE__) ) {return 1;}
86 if( hdf5_read_int(PLSPATH "anum", anum,
87 f, qid, __FILE__, __LINE__) ) {return 1;}
88 if( hdf5_read_int(PLSPATH "charge", q,
89 f, qid, __FILE__, __LINE__) ) {return 1;}
90 if( hdf5_read_double(PLSPATH "mass", &mass[1],
91 f, qid, __FILE__, __LINE__) ) {return 1;}
92 charge[0] = -1 * CONST_E;
93 for(int i = 0; i < n_ions; i++) {
94 charge[i+1] = q[i] * CONST_E;
95 }
96 mass[0] = CONST_M_E;
97 for(int i = 0; i < n_ions; i++) {
98 mass[i+1] *= CONST_U;
99 }
100 free(q);
101
102 real* Te = (real*) malloc( n_rho*sizeof(real) );
103 real* Ti = (real*) malloc( n_rho*sizeof(real) );
104 real* ne = (real*) malloc( n_rho*sizeof(real) );
105 real* ni = (real*) malloc( n_rho*n_ions*sizeof(real) );
106 real* rho = (real*) malloc( n_rho*sizeof(real) );
107 if( hdf5_read_double(PLSPATH "rho", rho,
108 f, qid, __FILE__, __LINE__) ) {return 1;}
109 if( hdf5_read_double(PLSPATH "etemperature", Te,
110 f, qid, __FILE__, __LINE__) ) {return 1;}
111 if( hdf5_read_double(PLSPATH "edensity", ne,
112 f, qid, __FILE__, __LINE__) ) {return 1;}
113 if( hdf5_read_double(PLSPATH "itemperature", Ti,
114 f, qid, __FILE__, __LINE__) ) {return 1;}
115 if( hdf5_read_double(PLSPATH "idensity", ni,
116 f, qid, __FILE__, __LINE__) ) {return 1;}
117
118 for(int i = 0; i < n_rho; i++) {
119 Te[i] = Te[i] * CONST_E;
120 Ti[i] = Ti[i] * CONST_E;
121 }
122
123 int err = plasma_1D_init(data, n_rho, n_ions, rho, anum, znum, mass, charge,
124 Te, Ti, ne, ni);
125 free(Te);
126 free(Ti);
127 free(ne);
128 free(ni);
129 free(rho);
130 free(znum);
131 free(anum);
132 free(mass);
133 free(charge);
134 return err;
135}
136
146int hdf5_plasma_read_1Dt(hid_t f, plasma_1Dt_data* data, char* qid) {
147 #undef PLSPATH
148 #define PLSPATH "/plasma/plasma_1Dt_XXXXXXXXXX/"
149
150 /* Read rhogrid size and number of species */
151 int n_rho, n_time, n_ions;
152 if( hdf5_read_int(PLSPATH "nion", &n_ions,
153 f, qid, __FILE__, __LINE__) ) {return 1;}
154 if( hdf5_read_int(PLSPATH "nrho", &n_rho,
155 f, qid, __FILE__, __LINE__) ) {return 1;}
156 if( hdf5_read_int(PLSPATH "ntime", &n_time,
157 f, qid, __FILE__, __LINE__) ) {return 1;}
158
159 int* q = (int*) malloc( n_ions * sizeof(int) );
160 int* znum = (int*) malloc( n_ions * sizeof(int) );
161 int* anum = (int*) malloc( n_ions * sizeof(int) );
162 real* mass = (real*) malloc( ( n_ions + 1 ) * sizeof(real) );
163 real* charge = (real*) malloc( ( n_ions + 1 ) * sizeof(real) );
164 if( hdf5_read_int(PLSPATH "znum", znum,
165 f, qid, __FILE__, __LINE__) ) {return 1;}
166 if( hdf5_read_int(PLSPATH "anum", anum,
167 f, qid, __FILE__, __LINE__) ) {return 1;}
168 if( hdf5_read_int(PLSPATH "charge", q,
169 f, qid, __FILE__, __LINE__) ) {return 1;}
170 if( hdf5_read_double(PLSPATH "mass", &mass[1],
171 f, qid, __FILE__, __LINE__) ) {return 1;}
172 charge[0] = -1 * CONST_E;
173 for(int i = 0; i < n_ions; i++) {
174 charge[i+1] = q[i] * CONST_E;
175 }
176 mass[0] = CONST_M_E;
177 for(int i = 0; i < n_ions; i++) {
178 mass[i+1] *= CONST_U;
179 }
180 free(q);
181
182 real* rho = (real*) malloc( n_rho * sizeof(real) );
183 real* time = (real*) malloc( n_time * sizeof(real) );
184 if( hdf5_read_double(PLSPATH "rho", rho,
185 f, qid, __FILE__, __LINE__) ) {return 1;}
186 if( hdf5_read_double(PLSPATH "time", time,
187 f, qid, __FILE__, __LINE__) ) {return 1;}
188
189 real* Te = (real*) malloc( n_time*n_rho*sizeof(real) );
190 real* Ti = (real*) malloc( n_time*n_rho*sizeof(real) );
191 real* ne = (real*) malloc( n_time*n_rho*sizeof(real) );
192 real* ni = (real*) malloc( n_time*n_ions*n_rho*sizeof(real) );
193 if( hdf5_read_double(PLSPATH "etemperature", Te,
194 f, qid, __FILE__, __LINE__) ) {return 1;}
195 if( hdf5_read_double(PLSPATH "itemperature", Ti,
196 f, qid, __FILE__, __LINE__) ) {return 1;}
197
198 for(int i_time = 0; i_time < n_time; i_time++) {
199 for(int i_rho = 0; i_rho < n_rho; i_rho++) {
200 Te[i_time*n_rho+i_rho] *= CONST_E;
201 Ti[i_time*n_rho+i_rho] *= CONST_E;
202 }
203 }
204
205 if( hdf5_read_double(PLSPATH "edensity", ne,
206 f, qid, __FILE__, __LINE__) ) {return 1;}
207 if( hdf5_read_double(PLSPATH "idensity", ni,
208 f, qid, __FILE__, __LINE__) ) {return 1;}
209 int err = plasma_1Dt_init(data, n_rho, n_time, n_ions, rho, time, anum,
210 znum, mass, charge, Te, Ti, ne, ni);
211 free(Te);
212 free(Ti);
213 free(ne);
214 free(ni);
215 free(znum);
216 free(anum);
217 free(mass);
218 free(charge);
219 return err;
220}
221
231int hdf5_plasma_read_1DS(hid_t f, plasma_1DS_data* data, char* qid) {
232
233 #undef PLSPATH
234 #define PLSPATH "/plasma/plasma_1DS_XXXXXXXXXX/"
235
236 /* Read rhogrid and number of species */
237 int n_rho, n_ions;
238 real rhomin, rhomax;
239 if( hdf5_read_int(PLSPATH "nion", &n_ions,
240 f, qid, __FILE__, __LINE__) ) {return 1;}
241 if( hdf5_read_int(PLSPATH "nrho", &n_rho,
242 f, qid, __FILE__, __LINE__) ) {return 1;}
243 if( hdf5_read_double(PLSPATH "rhomin", &rhomin,
244 f, qid, __FILE__, __LINE__) ) {return 1;}
245 if( hdf5_read_double(PLSPATH "rhomax", &rhomax,
246 f, qid, __FILE__, __LINE__) ) {return 1;}
247
248 int* q = (int*) malloc( n_ions * sizeof(int) );
249 int* znum = (int*) malloc( n_ions * sizeof(int) );
250 int* anum = (int*) malloc( n_ions * sizeof(int) );
251 real* mass = (real*) malloc( ( n_ions + 1 ) * sizeof(real) );
252 real* charge = (real*) malloc( ( n_ions + 1 ) * sizeof(real) );
253 if( hdf5_read_int(PLSPATH "znum", znum,
254 f, qid, __FILE__, __LINE__) ) {return 1;}
255 if( hdf5_read_int(PLSPATH "anum", anum,
256 f, qid, __FILE__, __LINE__) ) {return 1;}
257 if( hdf5_read_int(PLSPATH "charge", q,
258 f, qid, __FILE__, __LINE__) ) {return 1;}
259 if( hdf5_read_double(PLSPATH "mass", &mass[1],
260 f, qid, __FILE__, __LINE__) ) {return 1;}
261 charge[0] = -1 * CONST_E;
262 for(int i = 0; i < n_ions; i++) {
263 charge[i+1] = q[i] * CONST_E;
264 }
265 mass[0] = CONST_M_E;
266 for(int i = 0; i < n_ions; i++) {
267 mass[i+1] *= CONST_U;
268 }
269 free(q);
270
271 real* Te = (real*) malloc( n_rho*sizeof(real) );
272 real* Ti = (real*) malloc( n_rho*sizeof(real) );
273 real* ne = (real*) malloc( n_rho*sizeof(real) );
274 real* ni = (real*) malloc( n_rho*n_ions*sizeof(real) );
275 if( hdf5_read_double(PLSPATH "etemperature", Te,
276 f, qid, __FILE__, __LINE__) ) {return 1;}
277 if( hdf5_read_double(PLSPATH "edensity", ne,
278 f, qid, __FILE__, __LINE__) ) {return 1;}
279 if( hdf5_read_double(PLSPATH "itemperature", Ti,
280 f, qid, __FILE__, __LINE__) ) {return 1;}
281 if( hdf5_read_double(PLSPATH "idensity", ni,
282 f, qid, __FILE__, __LINE__) ) {return 1;}
283
284 for(int i = 0; i < n_rho; i++) {
285 Te[i] = Te[i] * CONST_E;
286 Ti[i] = Ti[i] * CONST_E;
287 }
288
289 int err = plasma_1DS_init(data, n_rho, rhomin, rhomax, n_ions, anum, znum,
290 mass, charge, Te, Ti, ne, ni);
291
292 free(Te);
293 free(Ti);
294 free(ne);
295 free(ni);
296 free(znum);
297 free(anum);
298 free(mass);
299 free(charge);
300 return err;
301}
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:29
#define CONST_M_E
Electron mass [kg].
Definition consts.h:38
#define CONST_E
Elementary charge [C].
Definition consts.h:32
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.
#define PLSPATH
Definition hdf5_plasma.c:22
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:69
int hdf5_plasma_init(hid_t f, plasma_data *data, char *qid)
Read plasma data from HDF5 file.
Definition hdf5_plasma.c:36
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:21
@ plasma_type_1Dt
Definition plasma.h:22
@ plasma_type_1DS
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)
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)
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)
Initialize 1Dt plasma data and check inputs.
Definition plasma_1Dt.c:22
Header file for plasma_1Dt.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
Plasma simulation data.
Definition plasma.h:32
plasma_1D_data plasma_1D
Definition plasma.h:34
plasma_1Dt_data plasma_1Dt
Definition plasma.h:35
plasma_1DS_data plasma_1DS
Definition plasma.h:36
plasma_type type
Definition plasma.h:33