HP-HEM  1.0.2
High Performance implementation of the Hybrid Electromagnetic Model
electrode.h
Go to the documentation of this file.
1 /* High Performance implementation of the Hybrid Electromagnetic Model
2 Released under the General Public License 3 (GPLv3).
3 All parameters' units are in the SI base if omitted.
4 
5 Routines to manipulate the Electrode struct and do the base calculations, i.e.,
6 numerical integration and impedances calculation. It also includes any routines
7 to build the linear system to be solved that do not depend on linear algebra
8 libraries.
9 */
10 #ifndef ELECTRODE_H_
11 #define ELECTRODE_H_
12 
13 #include <complex.h>
14 #include <stdlib.h>
15 #include <stdbool.h>
16 
18 enum
21  INTG_NONE = 1,
31 };
32 
34 typedef struct {
36  double start_point[3];
38  double end_point[3];
40  double middle_point[3];
42  double length;
44  double radius;
45 } Electrode;
46 
50 typedef struct {
52  const Electrode* sender;
57  _Complex double gamma;
59 
64 typedef struct {
66  const double* point1;
68  const double* point2;
74  const _Complex double* il;
76  const _Complex double* it;
79  _Complex double gamma;
82  _Complex double s;
84  double mur;
87  _Complex double kappa;
89  size_t max_eval;
91  double req_abs_error;
93  double req_rel_error;
95 
96 
104 int
105 populate_electrode (Electrode *electrode, const double start_point[3],
106  const double end_point[3], double radius);
107 
114 bool
115 equal_electrodes (const Electrode *sender, const Electrode *receiver);
116 
127 int
128 electrodes_file (const char file_name[], Electrode *electrodes, size_t num_electrodes);
129 
140 int
141 nodes_file (const char file_name[], double *nodes, size_t num_nodes);
142 
153 int
154 segment_electrode (Electrode *electrodes, double *nodes, size_t num_segments,
155  const double *start_point, const double *end_point, double radius);
156 
167 size_t
168 nodes_from_elecs (double *nodes, Electrode *electrodes, size_t num_electrodes);
169 
183 int
184 integrand_double (unsigned ndim, const double *t, void *auxdata, unsigned fdim,
185  double *fval);
186 
200 int
201 integrand_single (unsigned ndim, const double *t, void *auxdata, unsigned fdim,
202  double *fval);
203 
218 int
219 logNf (unsigned ndim, const double *t, void *auxdata, unsigned fdim, double *fval);
220 
226 _Complex double
227 self_integral (const Electrode *sender);
228 
247 int
248 integral (const Electrode *sender, const Electrode *receiver, _Complex double gamma,
249  size_t max_eval, double req_abs_error, double req_rel_error,
250  int integration_type, double result[2], double error[2]);
251 
276 int
277 calculate_impedances (_Complex double *zl, _Complex double *zt,
278  const Electrode *electrodes, size_t num_electrodes,
279  _Complex double gamma, _Complex double s, double mur,
280  _Complex double kappa, size_t max_eval, double req_abs_error,
281  double req_rel_error, int integration_type);
282 
310 int
311 impedances_images (_Complex double *zl, _Complex double *zt,
312  const Electrode *electrodes, const Electrode *images,
313  size_t num_electrodes, _Complex double gamma,
314  _Complex double s, double mur, _Complex double kappa,
315  _Complex double ref_l, _Complex double ref_t,
316  size_t max_eval, double req_abs_error, double req_rel_error,
317  int integration_type);
318 
333 _Complex double
334 electric_potential (const double *point, const Electrode *electrodes,
335  size_t num_electrodes, const _Complex double *it,
336  _Complex double gamma, _Complex double kappa,
337  size_t max_eval, double req_abs_error, double req_rel_error);
338 
355 int
356 magnetic_potential (const double *point, const Electrode *electrodes,
357  size_t num_electrodes, const _Complex double *il,
358  _Complex double gamma, double mur, size_t max_eval,
359  double req_abs_error, double req_rel_error,
360  _Complex double *va);
361 
375 int
376 elec_field_integrand (unsigned ndim, const double *t, void *auxdata,
377  unsigned fdim, double *fval);
378 
398 int
399 electric_field (const double *point, const Electrode *electrodes,
400  size_t num_electrodes, const _Complex double *il,
401  const _Complex double *it, _Complex double gamma,
402  _Complex double s, double mur, _Complex double kappa,
403  size_t max_eval, double req_abs_error, double req_rel_error,
404  _Complex double *ve);
405 
416 int
417 v_mag_pot_integrand (unsigned ndim, const double *t, void *auxdata, unsigned fdim,
418  double *fval);
419 
440 _Complex double
441 voltage (const double *point1, const double *point2,
442  const Electrode *electrodes, size_t num_electrodes,
443  const _Complex double *il, const _Complex double *it,
444  _Complex double gamma, _Complex double s, double mur,
445  _Complex double kappa, size_t max_eval, double req_abs_error,
446  double req_rel_error);
447 
448 #endif /* ELECTRODE_H_ */
int electric_field(const double *point, const Electrode *electrodes, size_t num_electrodes, const _Complex double *il, const _Complex double *it, _Complex double gamma, _Complex double s, double mur, _Complex double kappa, size_t max_eval, double req_abs_error, double req_rel_error, _Complex double *ve)
int integral(const Electrode *sender, const Electrode *receiver, _Complex double gamma, size_t max_eval, double req_abs_error, double req_rel_error, int integration_type, double result[2], double error[2])
_Complex double electric_potential(const double *point, const Electrode *electrodes, size_t num_electrodes, const _Complex double *it, _Complex double gamma, _Complex double kappa, size_t max_eval, double req_abs_error, double req_rel_error)
const double * point2
Definition: electrode.h:68
_Complex double kappa
Definition: electrode.h:87
int impedances_images(_Complex double *zl, _Complex double *zt, const Electrode *electrodes, const Electrode *images, size_t num_electrodes, _Complex double gamma, _Complex double s, double mur, _Complex double kappa, _Complex double ref_l, _Complex double ref_t, size_t max_eval, double req_abs_error, double req_rel_error, int integration_type)
_Complex double self_integral(const Electrode *sender)
double length
Definition: electrode.h:42
int populate_electrode(Electrode *electrode, const double start_point[3], const double end_point[3], double radius)
const double * point1
Definition: electrode.h:66
int nodes_file(const char file_name[], double *nodes, size_t num_nodes)
bool equal_electrodes(const Electrode *sender, const Electrode *receiver)
_Complex double s
Definition: electrode.h:82
int integrand_double(unsigned ndim, const double *t, void *auxdata, unsigned fdim, double *fval)
int elec_field_integrand(unsigned ndim, const double *t, void *auxdata, unsigned fdim, double *fval)
_Complex double gamma
Definition: electrode.h:57
const _Complex double * il
Definition: electrode.h:74
int integrand_single(unsigned ndim, const double *t, void *auxdata, unsigned fdim, double *fval)
int magnetic_potential(const double *point, const Electrode *electrodes, size_t num_electrodes, const _Complex double *il, _Complex double gamma, double mur, size_t max_eval, double req_abs_error, double req_rel_error, _Complex double *va)
const Electrode * electrodes
Definition: electrode.h:70
size_t nodes_from_elecs(double *nodes, Electrode *electrodes, size_t num_electrodes)
int electrodes_file(const char file_name[], Electrode *electrodes, size_t num_electrodes)
int v_mag_pot_integrand(unsigned ndim, const double *t, void *auxdata, unsigned fdim, double *fval)
int segment_electrode(Electrode *electrodes, double *nodes, size_t num_segments, const double *start_point, const double *end_point, double radius)
_Complex double voltage(const double *point1, const double *point2, const Electrode *electrodes, size_t num_electrodes, const _Complex double *il, const _Complex double *it, _Complex double gamma, _Complex double s, double mur, _Complex double kappa, size_t max_eval, double req_abs_error, double req_rel_error)
const Electrode * sender
Definition: electrode.h:52
const Electrode * receiver
Definition: electrode.h:54
int logNf(unsigned ndim, const double *t, void *auxdata, unsigned fdim, double *fval)
const _Complex double * it
Definition: electrode.h:76
Integration_type
Definition: electrode.h:18
int calculate_impedances(_Complex double *zl, _Complex double *zt, const Electrode *electrodes, size_t num_electrodes, _Complex double gamma, _Complex double s, double mur, _Complex double kappa, size_t max_eval, double req_abs_error, double req_rel_error, int integration_type)
double radius
Definition: electrode.h:44
_Complex double gamma
Definition: electrode.h:79