NEURON
rxd.h
Go to the documentation of this file.
1 #include <pthread.h>
2 #include <matrix2.h>
3 /*borrowed from Meschach Version 1.2b*/
4 #define v_get_val(x,i) ((x)->ve[(i)])
5 #define m_get_val(A,i,j) ((A)->me[(i)][(j)])
6 #define SPECIES_ABSENT -1
7 #define PREFETCH 4
8 
9 typedef void (*fptr)(void);
10 
11 typedef struct OcPtrVector_{
12  PyObject_HEAD
15  int (*size)(int);
16  void (*resize)();
17  void (*pset)(int, double*);
18  double (*getval)(int);
19  void (*setval)(int,double);
20  void (*scatter)(double*,int);
21  void (*gather)(double*, int);
22  void (*ptr_update_cmd)(void*);
24  void* update_cmd_;
25  int size_;
26  double ** pd_;
27 } OcPtrVector;
28 /*
29  OcPtrVector* newOcPtrVector();
30  } ;
31 */
32 
33 typedef struct {
35  int idx;
36 } ReactSet;
37 
38 typedef struct {
42 
43 
44 typedef struct {
46  int onset, offset;
47  double* val;
48 } CurrentData;
49 
50 
51 typedef struct SpeciesIndexList {
52  int id;
53  double atolscale;
54  int* indices;
55  int length;
58 
59 typedef struct ICSReactions {
65  int*** state_idx; /*[segment][species][region]*/
66  int icsN; /*total number species*regions per segment*/
67  /*NOTE: icsN != num_species*num_regions as every species may not be defined
68  *on every region - the missing elements of state_idx are SPECIES_ABSENT*/
69 
70  /*ECS for MultiCompartment reactions*/
73  double*** ecs_state; /*[segment][ecs_species]*/
76  int** ecs_index;
77  int ecsN; /*total number of ecs species*regions per segment*/
78 
79  int num_mult;
80  double **mc_multiplier;
82  double** vptrs;
83  struct ICSReactions* next;
84 } ICSReactions;
85 
86 typedef struct {
87  /*variables for reactions*/
92  double* result_array;
93  double* result_array_dx;
94  double* result_ecs;
95  double* result_ecs_dx;
97  VEC *x;
98  VEC *b;
100 
102 
103 typedef struct TaskList
104 {
105  void *(*task)(void*);
106  void *args;
107  void *result;
108  struct TaskList* next;
109 } TaskList;
110 
111 typedef struct TaskQueue
112 {
113  pthread_mutex_t* task_mutex;
114  pthread_cond_t* task_cond;
115  pthread_mutex_t* waiting_mutex;
116  pthread_cond_t* waiting_cond;
117  int length;
118  struct TaskList* first;
119  struct TaskList* last;
120 } TaskQueue;
121 
122 extern "C" void set_num_threads(const int);
123 void _fadvance(void);
124 void _fadvance_fixed_step_3D(void);
125 
126 extern "C" int get_num_threads(void);
130 
131 void dg_transfer_data(AdiLineData * const, double* const, int const, int const, int const);
132 void ecs_run_threaded_dg_adi(const int, const int, ECS_Grid_node*, ECSAdiDirection*, const int);
134 void* do_reactions(void*);
135 
136 void current_reaction(double *states);
137 
140 void ics_dg_adi_x(ICS_Grid_node* g, int, int, int, double, double*, double*, double*, double*, double*, double*);
141 void ics_dg_adi_y(ICS_Grid_node* g, int, int, int, double, double*, double*, double*, double*, double*, double*);
142 void ics_dg_adi_z(ICS_Grid_node* g, int, int, int, double, double*, double*, double*, double*, double*, double*);
143 void ics_dg_adi_x_inhom(ICS_Grid_node* g, int, int, int, double, double*, double*, double*, double*, double*, double*);
144 void ics_dg_adi_y_inhom(ICS_Grid_node* g, int, int, int, double, double*, double*, double*, double*, double*, double*);
145 void ics_dg_adi_z_inhom(ICS_Grid_node* g, int, int, int, double, double*, double*, double*, double*, double*, double*);
146 
147 /*Variable step function declarations*/
148 void _rhs_variable_step(const double*, double*);
149 
150 void _ode_reinit(double*);
151 
152 int ode_count(const int);
153 
154 extern "C" void scatter_concentrations(void);
155 
156 
157 int find(const int, const int, const int, const int, const int);
158 
160 void _ics_variable_hybrid_helper(ICS_Grid_node*, const double*, double* const, const double*, double *const);
161 
162 void _ics_rhs_variable_step_helper(ICS_Grid_node*, double const* const, double*);
163 void _rhs_variable_step_helper(Grid_node*, double const * const, double*);
164 
165 void ics_ode_solve(double, double*, const double*);
166 void ics_ode_solve_helper(ICS_Grid_node*, double, double*);
167 
168 void _rhs_variable_step_helper_tort(Grid_node*, double const * const, double*);
169 
170 void _rhs_variable_step_helper_vol(Grid_node*, double const * const, double*);
171 
172 void set_num_threads_3D(int n);
173 
174 void _rhs_variable_step_ecs(const double*, double*);
175 
176 void clear_rates_ecs();
177 void do_ics_reactions(double*, double*, double*, double*);
178 void get_all_reaction_rates(double*, double*, double*);
179 void _ecs_ode_reinit(double*);
180 void do_currents(Grid_node*, double*, double, int);
181 void TaskQueue_add_task(TaskQueue*, void* (*task)(void* args), void*, void*);
182 void *TaskQueue_exe_tasks(void*);
183 void start_threads(const int);
185 void ecs_atolscale(double*);
186 void apply_node_flux3D(Grid_node*, double, double*);
187 
int * indices
Definition: rxd.h:54
void(* fptr)(void)
Definition: rxd.h:9
int idx
Definition: rxd.h:35
void current_reaction(double *states)
void * TaskQueue_exe_tasks(void *)
Definition: rxd.cpp:1242
void set_num_threads(const int)
Definition: rxd.cpp:1287
double * states_for_reaction_dx
Definition: rxd.h:89
void ics_dg_adi_y(ICS_Grid_node *g, int, int, int, double, double *, double *, double *, double *, double *, double *)
void * result
Definition: rxd.h:107
int *** state_idx
Definition: rxd.h:65
void TaskQueue_sync(TaskQueue *)
Definition: rxd.cpp:1324
void _ecs_ode_reinit(double *)
Definition: rxd.h:111
int length
Definition: rxd.h:55
VEC * x
Definition: rxd.h:97
ReactSet * onset
Definition: rxd.h:39
void * args
Definition: rxd.h:106
struct TaskList * last
Definition: rxd.h:119
struct ICSReactions * next
Definition: rxd.h:83
Definition: rxd.h:103
#define g
Definition: passive0.cpp:23
void(* scatter)(double *, int)
Definition: rxd.h:20
void clear_rates_ecs()
struct TaskList * next
Definition: rxd.h:108
void * update_cmd_
Definition: rxd.h:24
ECS_Grid_node ** ecs_grid
Definition: rxd.h:75
void
void(* resize)()
Definition: rxd.h:16
void ics_dg_adi_x_inhom(ICS_Grid_node *g, int, int, int, double, double *, double *, double *, double *, double *, double *)
void ecs_set_adi_homogeneous(ECS_Grid_node *)
void run_threaded_ics_dg_adi(ICS_Grid_node *g, ICSAdiDirection *ics_adi_dir)
int onset
Definition: rxd.h:46
int * ecs_offset_index
Definition: rxd.h:74
void _fadvance(void)
Definition: rxd.cpp:1338
void dg_transfer_data(AdiLineData *const, double *const, int const, int const, int const)
struct SpeciesIndexList * next
Definition: rxd.h:56
struct SpeciesIndexList SpeciesIndexList
double(* getval)(int)
Definition: rxd.h:18
void _ics_variable_hybrid_helper(ICS_Grid_node *, const double *, double *const, const double *, double *const)
void _ics_rhs_variable_step_helper(ICS_Grid_node *, double const *const, double *)
void ecs_atolscale(double *)
void do_currents(Grid_node *, double *, double, int)
double * val
Definition: rxd.h:47
void(* ptr_update_cmd)(void *)
Definition: rxd.h:22
struct TaskQueue TaskQueue
double * result_ecs
Definition: rxd.h:94
int(* size)(int)
Definition: rxd.h:15
void(* gather)(double *, int)
Definition: rxd.h:21
double ** mc_multiplier
Definition: rxd.h:80
pthread_cond_t * task_cond
Definition: rxd.h:114
Definition: matrix.h:67
void _ics_hybrid_helper(ICS_Grid_node *)
void _rhs_variable_step_ecs(const double *, double *)
PyObject_HEAD struct OcPtrVector_(* newOcPtrVector)()
Definition: rxd.h:13
int const size_t const size_t n
Definition: nrngsl.h:12
double * result_array
Definition: rxd.h:92
void * do_reactions(void *)
void(* setval)(int, double)
Definition: rxd.h:19
int get_num_threads(void)
Definition: rxd.cpp:1333
int icsN
Definition: rxd.h:66
Definition: rxd.h:33
void ecs_set_adi_tort(ECS_Grid_node *)
Definition: rxd_vol.cpp:748
pthread_mutex_t * task_mutex
Definition: rxd.h:113
void TaskQueue_add_task(TaskQueue *, void *(*task)(void *args), void *, void *)
int
Definition: nrnmusic.cpp:71
void scatter_concentrations(void)
int size_
Definition: rxd.h:25
double * result_array_dx
Definition: rxd.h:93
void ics_dg_adi_x(ICS_Grid_node *g, int, int, int, double, double *, double *, double *, double *, double *, double *)
int num_segments
Definition: rxd.h:64
void start_threads(const int)
Definition: rxd.cpp:1188
int num_ecs_species
Definition: rxd.h:71
void ecs_run_threaded_dg_adi(const int, const int, ECS_Grid_node *, ECSAdiDirection *, const int)
double ** pd_
Definition: rxd.h:26
void _ode_reinit(double *)
Definition: rxd.cpp:1382
int num_regions
Definition: rxd.h:62
double *** ecs_state
Definition: rxd.h:73
double * ecs_states_for_reaction_dx
Definition: rxd.h:91
double * result_ecs_dx
Definition: rxd.h:95
int ode_count(const int)
void _fadvance_fixed_step_3D(void)
ReactGridData * create_threaded_reactions(const int)
void _rhs_variable_step(const double *, double *)
Definition: rxd.cpp:1407
double ** vptrs
Definition: rxd.h:82
double atolscale
Definition: rxd.h:53
void ics_dg_adi_z(ICS_Grid_node *g, int, int, int, double, double *, double *, double *, double *, double *, double *)
void _rhs_variable_step_helper(Grid_node *, double const *const, double *)
int num_params
Definition: rxd.h:63
struct OcPtrVector_ OcPtrVector
Reaction * reaction
Definition: rxd.h:34
VEC * b
Definition: rxd.h:98
void ecs_set_adi_vol(ECS_Grid_node *)
Definition: rxd_vol.cpp:412
PERM * pivot
Definition: rxd.h:99
int length
Definition: rxd.h:117
pthread_mutex_t * waiting_mutex
Definition: rxd.h:115
void ics_dg_adi_z_inhom(ICS_Grid_node *g, int, int, int, double, double *, double *, double *, double *, double *, double *)
void _rhs_variable_step_helper_vol(Grid_node *, double const *const, double *)
Definition: rxd_vol.cpp:870
double * states_for_reaction
Definition: rxd.h:88
pthread_cond_t * waiting_cond
Definition: rxd.h:116
void do_ics_reactions(double *, double *, double *, double *)
Definition: rxd.cpp:2009
ReactSet * offset
Definition: rxd.h:40
void ics_ode_solve_helper(ICS_Grid_node *, double, double *)
int num_ecs_params
Definition: rxd.h:72
struct TaskList * first
Definition: rxd.h:118
void run_threaded_deltas(ICS_Grid_node *g, ICSAdiDirection *ics_adi_dir)
Grid_node * g
Definition: rxd.h:45
int ecsN
Definition: rxd.h:77
int * mc_flux_idx
Definition: rxd.h:81
void(* ptr_update)()
Definition: rxd.h:23
void _rhs_variable_step_helper_tort(Grid_node *, double const *const, double *)
Definition: rxd_vol.cpp:762
ReactionRate reaction
Definition: rxd.h:60
void(* deleteOcPtrVector)()
Definition: rxd.h:14
void(* pset)(int, double *)
Definition: rxd.h:17
void apply_node_flux3D(Grid_node *, double, double *)
int find(const int, const int, const int, const int, const int)
void set_num_threads_3D(int n)
struct ICSReactions ICSReactions
double * ecs_states_for_reaction
Definition: rxd.h:90
void ics_ode_solve(double, double *, const double *)
int num_mult
Definition: rxd.h:79
int num_species
Definition: rxd.h:61
Definition: matrix.h:87
MAT * jacobian
Definition: rxd.h:96
void(* ReactionRate)(double **, double **, double **, double *, double *, double *, double *, double **, double)
Definition: grids.h:84
struct TaskList TaskList
void get_all_reaction_rates(double *, double *, double *)
Definition: rxd.cpp:2019
Definition: matrix.h:73
void *(* task)(void *)
Definition: rxd.h:105
void ics_dg_adi_y_inhom(ICS_Grid_node *g, int, int, int, double, double *, double *, double *, double *, double *, double *)
double * states
Definition: rxd.cpp:62
int ** ecs_index
Definition: rxd.h:76