ASCOT5
Loading...
Searching...
No Matches
hdf5_neutral.c
Go to the documentation of this file.
1
9#include <stdio.h>
10#include <stdlib.h>
11#include <string.h>
12#include <hdf5.h>
13#include <hdf5_hl.h>
14#include "../ascot5.h"
15#include "../neutral.h"
16#include "../neutral/N0_1D.h"
17#include "../neutral/N0_3D.h"
18#include "../consts.h"
19#include "../math.h"
20#include "hdf5_neutral.h"
21#include "hdf5_helpers.h"
22
23#define NPATH
24
25int hdf5_neutral_init_1D(hid_t f, N0_1D_data* data, char* qid);
26int hdf5_neutral_init_3D(hid_t f, N0_3D_data* data, char* qid);
27
38int hdf5_neutral_init(hid_t f, neutral_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("/neutral/N0_1D_XXXXXXXXXX", qid, path);
45 if( !hdf5_find_group(f, path) ) {
46 data->type = neutral_type_1D;
47 err = hdf5_neutral_init_1D(f, &(data->N01D), qid);
48 }
49 hdf5_gen_path("/neutral/N0_3D_XXXXXXXXXX", qid, path);
50 if( !hdf5_find_group(f, path) ) {
51 data->type = neutral_type_3D;
52 err = hdf5_neutral_init_3D(f, &(data->N03D), qid);
53 }
54 return err;
55}
56
66int hdf5_neutral_init_1D(hid_t f, N0_1D_data* data, char* qid) {
67 #undef NPATH
68 #define NPATH "/neutral/N0_1D_XXXXXXXXXX/"
69
70 /* Read and initialize rho coordinate */
71 int n_rho;
72 real rho_min, rho_max;
73 if( hdf5_read_int(NPATH "nrho", &n_rho,
74 f, qid, __FILE__, __LINE__) ) {return 1;}
75 if( hdf5_read_double(NPATH "rhomin", &rho_min,
76 f, qid, __FILE__, __LINE__) ) {return 1;}
77 if( hdf5_read_double(NPATH "rhomax", &rho_max,
78 f, qid, __FILE__, __LINE__) ) {return 1;}
79
80 /* Read n_species, anum, znum and distribution type */
81 int n_species;
82 if( hdf5_read_int(NPATH "nspecies", &n_species,
83 f, qid, __FILE__, __LINE__) ) {return 1;}
84 int* anum = (int*) malloc(n_species * sizeof(int));
85 int* znum = (int*) malloc(n_species * sizeof(int));
86 int* maxwellian = (int*) malloc(n_species * sizeof(int));
87 if( hdf5_read_int(NPATH "anum", anum,
88 f, qid, __FILE__, __LINE__) ) {return 1;}
89 if( hdf5_read_int(NPATH "znum", znum,
90 f, qid, __FILE__, __LINE__) ) {return 1;}
91 if( hdf5_read_int(NPATH "maxwellian", maxwellian,
92 f, qid, __FILE__, __LINE__) ) {return 1;}
93
94 /* Read the neutral density and temperature */
95 real* density = (real*) malloc(n_species*n_rho*sizeof(real));
96 real* temperature = (real*) malloc(n_species*n_rho*sizeof(real));
97 if( hdf5_read_double(NPATH "density", density,
98 f, qid, __FILE__, __LINE__) ) {return 1;}
99 if( hdf5_read_double(NPATH "temperature", temperature,
100 f, qid, __FILE__, __LINE__) ) {return 1;}
101
102 for(int i = 0; i < n_species * n_rho; i++) {
103 temperature[i] = temperature[i] * CONST_E;
104 }
105
106 int err = N0_1D_init(data, n_rho, rho_min, rho_max, n_species, anum, znum,
107 maxwellian, density, temperature);
108 free(anum);
109 free(znum);
110 free(maxwellian);
111 free(density);
112 free(temperature);
113
114 return err;
115}
116
126int hdf5_neutral_init_3D(hid_t f, N0_3D_data* data, char* qid) {
127 #undef NPATH
128 #define NPATH "/neutral/N0_3D_XXXXXXXXXX/"
129
130 /* Read and initialize Rpz-grid */
131 int n_r, n_phi, n_z;
132 real r_min, r_max, phi_min, phi_max, z_min, z_max;
133 if( hdf5_read_int(NPATH "nr", &n_r,
134 f, qid, __FILE__, __LINE__) ) {return 1;}
135 if( hdf5_read_int(NPATH "nphi", &n_phi,
136 f, qid, __FILE__, __LINE__) ) {return 1;}
137 if( hdf5_read_int(NPATH "nz", &n_z,
138 f, qid, __FILE__, __LINE__) ) {return 1;}
139 if( hdf5_read_double(NPATH "rmin", &r_min,
140 f, qid, __FILE__, __LINE__) ) {return 1;}
141 if( hdf5_read_double(NPATH "rmax", &r_max,
142 f, qid, __FILE__, __LINE__) ) {return 1;}
143 if( hdf5_read_double(NPATH "phimin", &phi_min,
144 f, qid, __FILE__, __LINE__) ) {return 1;}
145 if( hdf5_read_double(NPATH "phimax", &phi_max,
146 f, qid, __FILE__, __LINE__) ) {return 1;}
147 if( hdf5_read_double(NPATH "zmin", &z_min,
148 f, qid, __FILE__, __LINE__) ) {return 1;}
149 if( hdf5_read_double(NPATH "zmax", &z_max,
150 f, qid, __FILE__, __LINE__) ) {return 1;}
151
152 /* Convert to radians */
153 phi_max = math_deg2rad(phi_max);
154 phi_min = math_deg2rad(phi_min);
155
156 /* Read n_species, anum, znum and distribution type */
157 int n_species;
158 if( hdf5_read_int(NPATH "nspecies", &n_species,
159 f, qid, __FILE__, __LINE__) ) {return 1;}
160 int* anum = (int*) malloc(n_species * sizeof(int));
161 int* znum = (int*) malloc(n_species * sizeof(int));
162 int* maxwellian = (int*) malloc(n_species * sizeof(int));
163 if( hdf5_read_int(NPATH "anum", anum,
164 f, qid, __FILE__, __LINE__) ) {return 1;}
165 if( hdf5_read_int(NPATH "znum", znum,
166 f, qid, __FILE__, __LINE__) ) {return 1;}
167 if( hdf5_read_int(NPATH "maxwellian", maxwellian,
168 f, qid, __FILE__, __LINE__) ) {return 1;}
169
170 /* Read the neutral density and temperature */
171 real* density = (real*) malloc(n_species*n_r*n_phi*n_z*sizeof(real));
172 real* temperature = (real*) malloc(n_species*n_r*n_phi*n_z*sizeof(real));
173 if( hdf5_read_double(NPATH "density", density,
174 f, qid, __FILE__, __LINE__) ) {return 1;}
175 if( hdf5_read_double(NPATH "temperature", temperature,
176 f, qid, __FILE__, __LINE__) ) {return 1;}
177
178 for(int i = 0; i < n_species*n_r*n_phi*n_z; i++) {
179 temperature[i] = temperature[i] * CONST_E;
180 }
181
182 int err = N0_3D_init(data, n_r, r_min, r_max, n_phi, phi_min, phi_max,
183 n_z, z_min, z_max, n_species, anum, znum, maxwellian,
184 density, temperature);
185 free(anum);
186 free(znum);
187 free(maxwellian);
188 free(density);
189 free(temperature);
190 return err;
191}
int N0_1D_init(N0_1D_data *data, int n_rho, real rho_min, real rho_max, int n_species, int *anum, int *znum, int *maxwellian, real *density, real *temperature)
Initialize data.
Definition N0_1D.c:30
Header file for N0_1D.c.
int N0_3D_init(N0_3D_data *data, int n_r, real r_min, real r_max, int n_phi, real phi_min, real phi_max, int n_z, real z_min, real z_max, int n_species, int *anum, int *znum, int *maxwellian, real *density, real *temperature)
Initialize neutral data.
Definition N0_3D.c:21
Header file for N0_3D.c.
Main header file for ASCOT5.
double real
Definition ascot5.h:85
Header file containing physical and mathematical constants.
#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_neutral_init(hid_t f, neutral_data *data, char *qid)
Initialize neutral data from HDF5 file.
int hdf5_neutral_init_3D(hid_t f, N0_3D_data *data, char *qid)
Load 3D neutral data from HDF5 file and initialize it.
int hdf5_neutral_init_1D(hid_t f, N0_1D_data *data, char *qid)
Load 1D neutral data from HDF5 file and initialize it.
#define NPATH
Header file for hdf5_neutral.c.
Header file for math.c.
#define math_deg2rad(a)
Convert degrees to radians.
Definition math.h:107
Header file for neutral.c.
@ neutral_type_1D
Definition neutral.h:20
@ neutral_type_3D
Definition neutral.h:21
1D neutral parameters on the target
Definition N0_1D.h:14
3D neutral parameters on the target
Definition N0_3D.h:14
Neutral simulation data.
Definition neutral.h:30
N0_1D_data N01D
Definition neutral.h:32
N0_3D_data N03D
Definition neutral.h:33
neutral_type type
Definition neutral.h:31