13 #define SAFE_FREE(ptr){if((ptr)!=NULL) free(ptr);} 14 #define IDX(x,y,z) ((z) + (y) * g->size_z + (x) * g->size_z * g->size_y) 15 #define INDEX(x,y,z) ((z) + (y) * grid->size_z + (x) * grid->size_z * grid->size_y) 16 #define ALPHA(x,y,z) (g->get_alpha(g->alpha,IDX(x,y,z))) 17 #define VOLFRAC(idx) (g->get_alpha(g->alpha,idx)) 18 #define TORT(idx) (g->get_permeability(g->permeability,idx)) 19 #define PERM(x,y,z) (g->get_permeability(g->permeability,IDX(x,y,z))) 20 #define SQ(x) ((x)*(x)) 21 #define CU(x) ((x)*(x)*(x)) 25 #define VOLUME_FRACTION 3 31 #define MAX(a,b) ((a)>(b)?(a):(b)) 32 #define MIN(a,b) ((a)<(b)?(a):(b)) 84 typedef void (*
ReactionRate)(
double**,
double**,
double**,
double*,
double*,
double*,
double*,
double**, double);
154 double (*get_alpha)(
double*,
int);
155 double (*get_permeability)(
double*,
int);
165 int insert(
int grid_list_index);
175 virtual void do_grid_currents(
double*,
double,
int) = 0;
177 virtual void volume_setup() = 0;
178 virtual int dg_adi() = 0;
179 virtual void variable_step_diffusion(
const double* states,
double* ydot) = 0;
180 virtual void variable_step_ode_solve(
double*
RHS,
double dt) = 0;
181 virtual void scatter_grid_concentrations() = 0;
182 virtual void hybrid_connections() = 0;
183 virtual void variable_step_hybrid_connections(
const double* cvode_states_3d,
double*
const ydot_3d,
const double* cvode_states_1d,
double *
const ydot_1d) = 0;
219 void do_grid_currents(
double *,
double,
int);
223 void variable_step_diffusion(
const double*
states,
double* ydot);
224 void variable_step_ode_solve(
double*
RHS,
double dt);
225 void variable_step_hybrid_connections(
const double* cvode_states_3d,
double*
const ydot_3d,
const double* cvode_states_1d,
double *
const ydot_1d);
226 void scatter_grid_concentrations();
227 void hybrid_connections();
231 void do_multicompartment_reactions(
double*);
232 void initialize_multicompartment_reaction();
233 void clear_multicompartment_reaction();
234 int add_multicompartment_reaction(
int,
int*,
int);
235 double* set_rxd_currents(
int,
int*,
PyHocObject**);
239 void (*ecs_dg_adi_dir)(
ECS_Grid_node*,
const double,
const int,
const int,
double const *
const,
double*
const,
double*
const);
290 long*,
long,
double*,
double*,
double,
bool,
double,
292 void divide_x_work(
const int nthreads);
293 void divide_y_work(
const int nthreads);
294 void divide_z_work(
const int nthreads);
296 void do_grid_currents(
double*,
double,
int);
300 void variable_step_diffusion(
const double*
states,
double* ydot);
301 void variable_step_ode_solve(
double*
RHS,
double dt);
302 void hybrid_connections();
303 void variable_step_hybrid_connections(
const double* cvode_states_3d,
double*
const ydot_3d,
const double* cvode_states_1d,
double *
const ydot_1d);
304 void scatter_grid_concentrations();
307 void do_multicompartment_reactions(
double*);
308 void initialize_multicompartment_reaction();
309 void clear_multicompartment_reaction();
310 int add_multicompartment_reaction(
int,
int*,
int);
311 double* set_rxd_currents(
int,
int*,
PyHocObject**);
315 void (*ics_dg_adi_dir)(
ICS_Grid_node*
g,
int,
int,
int, double,
double*,
double*,
double*,
double*,
double*,
double*);
347 extern double *
t_ptr;
369 int my_num_states_y,
int my_num_states_z,
double my_dc_x,
double my_dc_y,
370 double my_dc_z,
double my_dx,
double my_dy,
double my_dz,
374 long* x_line_defs,
long x_lines_length,
long* y_line_defs,
long y_lines_length,
long* z_line_defs,
375 long z_lines_length,
double* dcs,
double dx,
bool is_diffusable,
double atolscale,
double* ics_alphas);
378 extern "C" int ICS_insert(
int grid_list_index,
PyHocObject* my_states,
long num_nodes,
long* neighbors,
379 long* x_line_defs,
long x_lines_length,
long* y_line_defs,
long y_lines_length,
long* z_line_defs,
380 long z_lines_length,
double* dcs,
double dx,
bool is_diffusable,
double atolscale,
double* ics_alphas);
383 long* x_line_defs,
long x_lines_length,
long* y_line_defs,
long y_lines_length,
long* z_line_defs,
384 long z_lines_length,
double* dcs,
double dx,
bool is_diffusable,
double atolscale,
double* ics_alphas);
397 void apply_node_flux(
int,
long*,
double*, PyObject**,
double,
double*);
uint64_t * mc3d_indices_offsets
void empty_list(int list_index)
unsigned char multicompartment_inititalized
int * proc_induced_current_offset
double * local_induced_currents
double * ics_scale_factors
int ECS_insert(int grid_list_index, PyHocObject *my_states, int my_num_states_x, int my_num_states_y, int my_num_states_z, double my_dc_x, double my_dc_y, double my_dc_z, double my_dx, double my_dy, double my_dz, PyHocObject *my_alpha, PyHocObject *my_permeability, int, double, double)
long * ordered_start_stop_indices
ICSAdiDirection * ics_adi_dir
void make_dt_ptr(PyHocObject *my_dt_ptr)
void run_threaded_ics_dg_adi(ICS_Grid_node *g, ICSAdiDirection *ics_adi_dir)
int64_t * ics_surface_nodes_per_seg
struct ICSAdiDirection * ics_adi_dir_y
void set_num_threads(const int n)
int * induced_currents_index
unsigned int num_params_involved
void apply_node_flux(int, long *, double *, PyObject **, double, double *)
int total_reaction_states
Concentration_Pair * concentration_list
void(* ECSReactionRate)(double *, double *, double *, double *)
ECSAdiDirection * ecs_adi_dir
long * line_start_stop_indices
double ** ics_current_seg_ptrs
double * all_reaction_states
unsigned char VARIABLE_ECS_VOLUME
int ICS_insert_inhom(int grid_list_index, PyHocObject *my_states, long num_nodes, long *neighbors, long *x_line_defs, long x_lines_length, long *y_line_defs, long y_lines_length, long *z_line_defs, long z_lines_length, double *dcs, double dx, bool is_diffusable, double atolscale, double *ics_alphas)
struct ICSAdiGridData ICSAdiGridData
Current_Triple * current_list
struct ECSAdiDirection ECSAdiDirection
int const size_t const size_t n
Grid_node * Parallel_grids[100]
double * induced_currents_scale
static double insert(void *v)
unsigned int num_species_involved
struct Hybrid_data Hybrid_data
int set_volume_fraction(int grid_list_index, int grid_id, PyHocObject *my_alpha)
int64_t * ics_surface_nodes_per_seg_start_indices
int induced_current_count
int set_tortuosity(int grid_list_index, int grid_id, PyHocObject *my_permeability)
struct ECSAdiGridData ECSAdiGridData
struct ECSAdiDirection * ecs_adi_dir_z
struct ICSAdiDirection ICSAdiDirection
struct ECSAdiGridData * ecs_tasks
int set_diffusion(int, int, double *, int)
struct ICSAdiDirection * ics_adi_dir_x
PyObject ** node_flux_src
double ** ics_concentration_seg_ptrs
Hybrid_data * hybrid_data
struct ICSAdiDirection * ics_adi_dir_z
struct ECSAdiDirection * ecs_adi_dir_y
unsigned char * subregion
void apply_node_flux3D(Grid_node *, double, double *)
int find(const int, const int, const int, const int, const int)
int * all_reaction_indices
int * proc_num_reaction_states
int * proc_induced_current_count
void(* ReactionRate)(double **, double **, double **, double *, double *, double *, double *, double **, double)
double * induced_currents
long * num_3d_indices_per_1d_seg
struct ECSAdiDirection * ecs_adi_dir_x
int ICS_insert(int grid_list_index, PyHocObject *my_states, long num_nodes, long *neighbors, long *x_line_defs, long x_lines_length, long *y_line_defs, long y_lines_length, long *z_line_defs, long z_lines_length, double *dcs, double dx, bool is_diffusable, double atolscale, double *ics_alphas)
struct ICSAdiGridData * ics_tasks
Grid_node * ICS_make_Grid(PyHocObject *my_states, long num_nodes, long *neighbors, long *x_line_defs, long x_lines_length, long *y_line_defs, long y_lines_length, long *z_line_defs, long z_lines_length, double *dcs, double dx, bool is_diffusable, double atolscale, double *ics_alphas)