ASCOT5
Loading...
Searching...
No Matches
hdf5_efield.c
Go to the documentation of this file.
1
17#include <stdio.h>
18#include <stdlib.h>
19#include <hdf5.h>
20#include <hdf5_hl.h>
21#include "../ascot5.h"
22#include "../E_field.h"
23#include "../Efield/E_TC.h"
24#include "../Efield/E_1DS.h"
25#include "../Efield/E_2DS.h"
26#include "../print.h"
27#include "hdf5_helpers.h"
28#include "hdf5_efield.h"
29
30#define EPATH
31
32int hdf5_efield_read_2DS(hid_t f, E_2DS_data* data, char* qid);
33int hdf5_efield_read_1DS(hid_t f, E_1DS_data* data, char* qid);
34int hdf5_efield_read_TC(hid_t f, E_TC_data* data, char* qid);
35
55int hdf5_efield_init(hid_t f, E_field_data* data, char* qid) {
56 char path[256];
57 int err = 1;
58
59 /* Read data the QID corresponds to */
60 hdf5_gen_path("/efield/E_TC_XXXXXXXXXX", qid, path);
61 if( !hdf5_find_group(f, path) ) {
62 data->type = E_field_type_TC;
63 err = hdf5_efield_read_TC(f, &data->ETC, qid);
64 }
65 hdf5_gen_path("/efield/E_1DS_XXXXXXXXXX", qid, path);
66 if(hdf5_find_group(f, path) == 0) {
67 data->type = E_field_type_1DS;
68 err = hdf5_efield_read_1DS(f, &data->E1DS, qid);
69 }
70 hdf5_gen_path("/efield/E_2DS_XXXXXXXXXX", qid, path);
71 if(hdf5_find_group(f, path) == 0) {
72 data->type = E_field_type_2DS;
73 err = hdf5_efield_read_2DS(f, &data->E2DS, qid);
74 }
75 return err;
76}
77
87int hdf5_efield_read_2DS(hid_t f, E_2DS_data* data, char* qid) {
88 #undef EPATH
89 #define EPATH "/efield/E_2DS_XXXXXXXXXX/"
90
91 int nr, nz;
92 real rmin, rmax, zmin, zmax;
93 if( hdf5_read_int(EPATH "nr", &nr,
94 f, qid, __FILE__, __LINE__) ) {return 1;}
95 if( hdf5_read_double(EPATH "rmin", &rmin,
96 f, qid, __FILE__, __LINE__) ) {return 1;}
97 if( hdf5_read_double(EPATH "rmax", &rmax,
98 f, qid, __FILE__, __LINE__) ) {return 1;}
99 if( hdf5_read_int(EPATH "nz", &nz,
100 f, qid, __FILE__, __LINE__) ) {return 1;}
101 if( hdf5_read_double(EPATH "zmin", &zmin,
102 f, qid, __FILE__, __LINE__) ) {return 1;}
103 if( hdf5_read_double(EPATH "zmax", &zmax,
104 f, qid, __FILE__, __LINE__) ) {return 1;}
105
106 real* vpot = (real*) malloc( nr*nz*sizeof(real) );
107 if( hdf5_read_double(EPATH "vpot", vpot,
108 f, qid, __FILE__, __LINE__) ) {return 1;}
109 int err = E_2DS_init(data, nr, rmin, rmax, nz, zmin, zmax, vpot);
110 free(vpot);
111 return err;
112}
113
123int hdf5_efield_read_1DS(hid_t f, E_1DS_data* data, char* qid) {
124 #undef EPATH
125 #define EPATH "/efield/E_1DS_XXXXXXXXXX/"
126
127 int nrho;
128 real rhomin, rhomax, reff;
129 if( hdf5_read_int(EPATH "nrho", &nrho,
130 f, qid, __FILE__, __LINE__) ) {return 1;}
131 if( hdf5_read_double(EPATH "rhomin", &rhomin,
132 f, qid, __FILE__, __LINE__) ) {return 1;}
133 if( hdf5_read_double(EPATH "rhomax", &rhomax,
134 f, qid, __FILE__, __LINE__) ) {return 1;}
135 if( hdf5_read_double(EPATH "reff", &reff,
136 f, qid, __FILE__, __LINE__) ) {return 1;}
137
138 real* dvdrho = (real*) malloc( nrho*sizeof(real) );
139 if( hdf5_read_double(EPATH "dvdrho", dvdrho,
140 f, qid, __FILE__, __LINE__) ) {return 1;}
141 int err = E_1DS_init(data, nrho, rhomin, rhomax, reff, dvdrho);
142 free(dvdrho);
143 return err;
144}
145
163int hdf5_efield_read_TC(hid_t f, E_TC_data* data, char* qid) {
164 #undef EPATH
165 #define EPATH "/efield/E_TC_XXXXXXXXXX/"
166
167 real exyz[3];
168 if( hdf5_read_double(EPATH "exyz", exyz,
169 f, qid, __FILE__, __LINE__) ) {return 1;}
170 int err = E_TC_init(data, exyz);
171 return err;
172}
int E_1DS_init(E_1DS_data *data, int nrho, real rhomin, real rhomax, real reff, real *dvdrho)
Initialize 1DS electric field data.
Definition E_1DS.c:29
Header file for E_1DS.c.
Header file for E_2DS.c.
int E_TC_init(E_TC_data *data, real exyz[3])
Initialize electric field data and check inputs.
Definition E_TC.c:25
Header file for E_TC.c.
Header file for E_field.c.
@ E_field_type_2DS
Definition E_field.h:29
@ E_field_type_TC
Definition E_field.h:27
@ E_field_type_1DS
Definition E_field.h:28
Main header file for ASCOT5.
double real
Definition ascot5.h:85
int hdf5_efield_read_2DS(hid_t f, E_2DS_data *data, char *qid)
Read E2DS electric field data from HDF5 file.
Definition hdf5_efield.c:87
int hdf5_efield_init(hid_t f, E_field_data *data, char *qid)
Read electric field data from HDF5 file.
Definition hdf5_efield.c:55
int hdf5_efield_read_TC(hid_t f, E_TC_data *data, char *qid)
Read magnetic field data of type E_TC.
int hdf5_efield_read_1DS(hid_t f, E_1DS_data *data, char *qid)
Read E1DS electric field data from HDF5 file.
#define EPATH
Definition hdf5_efield.c:30
Header file for hdf5_efielc.c.
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.
Macros for printing console output.
1D spline electric field parameters on the target
Definition E_1DS.h:20
2D spline electric field parameters
Definition E_2DS.h:17
Trivial Cartesian electric field simulation data.
Definition E_TC.h:18
Electric field simulation data.
Definition E_field.h:38
E_TC_data ETC
Definition E_field.h:40
E_2DS_data E2DS
Definition E_field.h:42
E_field_type type
Definition E_field.h:39
E_1DS_data E1DS
Definition E_field.h:41