49 return permeability[idx];
55 int my_num_states_y,
int my_num_states_z,
double my_dc_x,
double my_dc_y,
56 double my_dc_z,
double my_dx,
double my_dy,
double my_dz,
PyHocObject* my_alpha,
63 states_x = (
double*)malloc(
sizeof(
double)*my_num_states_x*my_num_states_y*my_num_states_z);
64 states_y = (
double*)malloc(
sizeof(
double)*my_num_states_x*my_num_states_y*my_num_states_z);
65 states_cur = (
double*)malloc(
sizeof(
double)*my_num_states_x*my_num_states_y*my_num_states_z);
89 if(PyFloat_Check(my_permeability))
93 permeability[0] = PyFloat_AsDouble((PyObject*)my_permeability);
98 dc_y = my_dc_y*permeability[0];
99 dc_z = my_dc_z*permeability[0];
108 if(PyFloat_Check(my_alpha))
110 alpha = (
double*)malloc(
sizeof(
double));
111 alpha[0] = PyFloat_AsDouble((PyObject*)my_alpha);
196 int my_num_states_y,
int my_num_states_z,
double my_dc_x,
double my_dc_y,
197 double my_dc_z,
double my_dx,
double my_dy,
double my_dz,
201 my_num_states_z, my_dc_x, my_dc_y, my_dc_z, my_dx, my_dy, my_dz,
202 my_alpha, my_permeability, bc, bc_value, atolscale);
204 return new_Grid->
insert(grid_list_index);
209 long* x_line_defs,
long x_lines_length,
long* y_line_defs,
long y_lines_length,
long* z_line_defs,
210 long z_lines_length,
double*
dc,
double* dcgrid,
double dx,
bool is_diffusable,
double atolscale,
double* ics_alphas) {
214 _num_nodes = num_nodes;
219 states_x = (
double*)malloc(
sizeof(
double)*_num_nodes);
220 states_y = (
double*)malloc(
sizeof(
double)*_num_nodes);
221 states_z = (
double*)malloc(
sizeof(
double)*_num_nodes);
222 states_cur = (
double*)malloc(
sizeof(
double)*_num_nodes);
255 _ics_alphas = ics_alphas;
259 _neighbors = neighbors;
263 _sorted_x_lines = x_line_defs;
264 _sorted_y_lines = y_line_defs;
265 _sorted_z_lines = z_line_defs;
268 _x_lines_length = x_lines_length;
269 _y_lines_length = y_lines_length;
270 _z_lines_length = z_lines_length;
273 long x_max = x_line_defs[1];
274 long y_max = y_line_defs[1];
275 long z_max = z_line_defs[1];
276 long xy_max = (x_max > y_max) ? x_max : y_max;
277 _line_length_max = (z_max > xy_max) ? z_max : xy_max;
283 ics_tasks[
k].RHS = (
double*)malloc(
sizeof(
double) * (_line_length_max));
284 ics_tasks[
k].scratchpad = (
double*)malloc(
sizeof(
double) * (_line_length_max-1));
285 ics_tasks[
k].g =
this;
286 ics_tasks[
k].u_diag = (
double*)malloc(
sizeof(
double) * _line_length_max - 1);
287 ics_tasks[
k].diag = (
double*)malloc(
sizeof(
double) * _line_length_max);
288 ics_tasks[
k].l_diag = (
double*)malloc(
sizeof(
double) * _line_length_max - 1);
295 ics_adi_dir_x->states_in =
states_x;
296 ics_adi_dir_x->states_out =
states;
297 ics_adi_dir_x->ordered_start_stop_indices = (
long*)malloc(
sizeof(
long)*NUM_THREADS*2);
298 ics_adi_dir_x->line_start_stop_indices = (
long*)malloc(
sizeof(
long)*NUM_THREADS*2);
299 ics_adi_dir_x->ordered_nodes = (
long*)malloc(
sizeof(
long)*_num_nodes);
300 ics_adi_dir_x->ordered_line_defs = (
long*)malloc(
sizeof(
long)*_x_lines_length);
301 ics_adi_dir_x->deltas = (
double*)malloc(
sizeof(
double)*_num_nodes);
302 ics_adi_dir_x->d =
dx;
305 ics_adi_dir_y->states_in =
states_y;
306 ics_adi_dir_y->states_out =
states;
307 ics_adi_dir_y->ordered_start_stop_indices = (
long*)malloc(
sizeof(
long)*NUM_THREADS*2);
308 ics_adi_dir_y->line_start_stop_indices = (
long*)malloc(
sizeof(
long)*NUM_THREADS*2);
309 ics_adi_dir_y->ordered_nodes = (
long*)malloc(
sizeof(
long)*_num_nodes);
310 ics_adi_dir_y->ordered_line_defs = (
long*)malloc(
sizeof(
long)*_y_lines_length);
311 ics_adi_dir_y->deltas = (
double*)malloc(
sizeof(
double)*_num_nodes);
312 ics_adi_dir_y->d =
dx;
315 ics_adi_dir_z->states_in =
states_z;
316 ics_adi_dir_z->states_out =
states;
317 ics_adi_dir_z->ordered_start_stop_indices = (
long*)malloc(
sizeof(
long)*NUM_THREADS*2);
318 ics_adi_dir_z->line_start_stop_indices = (
long*)malloc(
sizeof(
long)*NUM_THREADS*2);
319 ics_adi_dir_z->ordered_nodes = (
long*)malloc(
sizeof(
long)*_num_nodes);
320 ics_adi_dir_z->ordered_line_defs = (
long*)malloc(
sizeof(
long)*_z_lines_length);
321 ics_adi_dir_z->deltas = (
double*)malloc(
sizeof(
double)*_num_nodes);
322 ics_adi_dir_z->d =
dx;
326 ics_adi_dir_x->dc = dc[0];
327 ics_adi_dir_y->dc = dc[1];
328 ics_adi_dir_z->dc = dc[2];
329 ics_adi_dir_x->dcgrid =
NULL;
330 ics_adi_dir_y->dcgrid =
NULL;
331 ics_adi_dir_z->dcgrid =
NULL;
335 ics_adi_dir_x->dcgrid = dcgrid;
336 ics_adi_dir_y->dcgrid = &dcgrid[_num_nodes];
337 ics_adi_dir_z->dcgrid = &dcgrid[2*_num_nodes];
340 divide_x_work(NUM_THREADS);
341 divide_y_work(NUM_THREADS);
342 divide_z_work(NUM_THREADS);
355 long* x_line_defs,
long x_lines_length,
long* y_line_defs,
long y_lines_length,
long* z_line_defs,
356 long z_lines_length,
double* dcs,
double dx,
bool is_diffusable,
double atolscale,
double* ics_alphas) {
359 x_line_defs, x_lines_length, y_line_defs,
360 y_lines_length, z_line_defs, z_lines_length, dcs,
NULL, dx, is_diffusable, atolscale, ics_alphas);
362 return new_Grid->
insert(grid_list_index);
366 long* x_line_defs,
long x_lines_length,
long* y_line_defs,
long y_lines_length,
long* z_line_defs,
367 long z_lines_length,
double* dcs,
double dx,
bool is_diffusable,
double atolscale,
double* ics_alphas) {
370 y_lines_length, z_line_defs, z_lines_length,
NULL, dcs, dx, is_diffusable, atolscale, ics_alphas);
371 return new_Grid->
insert(grid_list_index);
375 extern "C" int set_diffusion(
int grid_list_index,
int grid_id,
double*
dc,
int length)
413 if(PyFloat_Check(my_permeability))
417 double new_permeability = PyFloat_AsDouble((PyObject*)my_permeability);
427 permeability[0] = PyFloat_AsDouble((PyObject*)my_permeability);
476 if(PyFloat_Check(my_alpha))
480 alpha[0] = PyFloat_AsDouble((PyObject*)my_alpha);
484 alpha = (
double*)malloc(
sizeof(
double));
485 alpha[0] = PyFloat_AsDouble((PyObject*)my_alpha);
506 ics_adi_dir_x->dc = dc[0];
507 ics_adi_dir_y->dc = dc[1];
508 ics_adi_dir_z->dc = dc[2];
510 if(ics_adi_dir_x->dcgrid !=
NULL)
512 ics_adi_dir_x->dcgrid =
NULL;
513 ics_adi_dir_y->dcgrid =
NULL;
514 ics_adi_dir_z->dcgrid =
NULL;
519 assert(length == _num_nodes);
520 ics_adi_dir_x->dcgrid =
dc;
521 ics_adi_dir_y->dcgrid = &dc[_num_nodes];
522 ics_adi_dir_z->dcgrid = &dc[2*_num_nodes];
535 dc_y = dc[1]*permeability[0];
536 dc_z = dc[2]*permeability[0];
548 extern "C" void ics_set_grid_concentrations(
int grid_list_index,
int index_in_list, int64_t* nodes_per_seg, int64_t* nodes_per_seg_start_indices, PyObject* neuron_pointers) {
551 ssize_t
n = (ssize_t)PyList_Size(neuron_pointers);
554 g = Parallel_grids[grid_list_index];
555 for (i = 0; i < index_in_list; i++) {
564 for(i = 0; i <
n; i++){
572 extern "C" void ics_set_grid_currents(
int grid_list_index,
int index_in_list, PyObject* neuron_pointers,
double* scale_factors) {
575 ssize_t
n = (ssize_t)PyList_Size(neuron_pointers);
577 g = Parallel_grids[grid_list_index];
578 for (i = 0; i < index_in_list; i++) {
585 for(i = 0; i <
n; i++){
593 extern "C" void set_grid_concentrations(
int grid_list_index,
int index_in_list, PyObject* grid_indices, PyObject* neuron_pointers) {
603 ssize_t
n = (ssize_t)PyList_Size(grid_indices);
606 g = Parallel_grids[grid_list_index];
607 for (i = 0; i < index_in_list; i++) {
620 for (i = 0; i <
n; i++) {
628 extern "C" void set_grid_currents(
int grid_list_index,
int index_in_list, PyObject* grid_indices, PyObject* neuron_pointers, PyObject* scale_factors) {
638 ssize_t
n = (ssize_t)PyList_Size(grid_indices);
642 g = Parallel_grids[grid_list_index];
643 for (i = 0; i < index_in_list; i++) {
656 for (i = 0; i <
n; i++) {
689 for(i = 0; i <
n; i++)
712 *head = (*head)->
next;
730 for(k = 0, grid = Parallel_grids[0]; grid !=
NULL; grid = grid ->
next, k++)
743 Grid_node **head = &(Parallel_grids[list_index]);
744 while(*head !=
NULL) {
746 *head = (*head)->
next;
754 Grid_node **head = &(Parallel_grids[grid_list_index]);
805 for(i = start; i <
stop; i++)
811 for(i = start; i <
stop; i++)
816 for(i = start; i <
stop; i++)
817 val[i] = c[i].scale_factor * (*c[i].source)/grid->
alpha[0];
850 tasks[
i].
onset = i * tasks_per_thread;
851 tasks[
i].
offset =
MIN((i+1)*tasks_per_thread,m);
854 for (i = 0; i < NUM_THREADS-1; i++)
869 for(i = 0; i <
n; i++)
874 for(i = 0; i <
n; i++)
881 for(i = 0; i <
n; i++)
894 double volume_fraction;
902 for(i = 0; i < current_count; i++)
1021 for (i = 0; i <
n; i++) {
1046 for(i = 0,
j = 0; i < nstates; i++,
j+=
step)
1084 int total_react = 0;
1095 nrnmpi_int_allgather_inplace(proc_num_init, 1);
1097 if(!proc_num_init[i])
break;
1099 if(i != nrnmpi_numprocs)
1149 sizeof(
double)*proc_induced_current_count[nrnmpi_myid]);
1153 sizeof(
int)*proc_induced_current_count[nrnmpi_myid]);
1155 nrnmpi_dbl_allgatherv_inplace(all_scales,
1156 proc_induced_current_count,
1159 nrnmpi_int_allgatherv_inplace(all_indices,
1160 proc_induced_current_count,
1277 int new_min_index = 0;
1278 int min_element = thread_sizes[0];
1279 for(
int i = 0;
i < nthreads;
i++){
1280 if(min_element > thread_sizes[
i]){
1281 min_element = thread_sizes[
i];
1285 return new_min_index;
1291 int* nodes_per_thread = (
int*)calloc(nthreads,
sizeof(
int));
1293 int* lines_per_thread = (
int*)calloc(nthreads,
sizeof(
int));
1295 int* thread_idx_counter = (
int*)calloc(nthreads,
sizeof(
int));
1297 int line_thread_id[_x_lines_length / 2];
1299 int** thread_line_defs = (
int**)malloc(nthreads*
sizeof(
int*));
1304 for(i = 0; i < _x_lines_length; i+=2){
1306 nodes_per_thread[min_index] += _sorted_x_lines[i+1];
1307 line_thread_id[i/2] = min_index;
1308 lines_per_thread[min_index] += 1;
1312 for(i = 0; i < nthreads; i++){
1313 thread_line_defs[
i] = (
int*)malloc(lines_per_thread[i]*2*
sizeof(
int));
1320 for(i = 0; i < _x_lines_length; i+=2){
1321 thread_idx = line_thread_id[i/2];
1322 line_idx = thread_idx_counter[thread_idx];
1323 thread_line_defs[thread_idx][line_idx] = _sorted_x_lines[
i];
1324 thread_line_defs[thread_idx][line_idx+1] = _sorted_x_lines[i+1];
1325 thread_idx_counter[thread_idx] += 2;
1329 int ordered_line_def_counter = 0;
1330 for(i = 0; i< nthreads; i++){
1331 for(j=0; j<lines_per_thread[
i]*2;j++){
1332 ics_adi_dir_x->ordered_line_defs[ordered_line_def_counter] = thread_line_defs[
i][
j];
1333 ordered_line_def_counter++;
1338 ics_adi_dir_x->ordered_start_stop_indices[0] = 0;
1339 ics_adi_dir_x->ordered_start_stop_indices[1] = nodes_per_thread[0];
1340 ics_adi_dir_x->line_start_stop_indices[0] = 0;
1341 ics_adi_dir_x->line_start_stop_indices[1] = lines_per_thread[0]*2;
1343 long line_start_node;
1344 for(i = 2; i < nthreads * 2; i+=2){
1345 start_node = ics_adi_dir_x->ordered_start_stop_indices[i-1];
1346 ics_adi_dir_x->ordered_start_stop_indices[
i] = start_node;
1347 ics_adi_dir_x->ordered_start_stop_indices[i+1] = start_node + nodes_per_thread[i/2];
1349 line_start_node = ics_adi_dir_x->line_start_stop_indices[i-1];
1350 ics_adi_dir_x->line_start_stop_indices[
i] = line_start_node;
1351 ics_adi_dir_x->line_start_stop_indices[i+1] = line_start_node + lines_per_thread[i/2]*2;
1356 int ordered_node_idx_counter = 0;
1358 for(i = 0; i < nthreads; i++){
1359 for(j = 0; j < lines_per_thread[
i] * 2; j+=2){
1360 current_node = thread_line_defs[
i][
j];
1361 ics_adi_dir_x->ordered_nodes[ordered_node_idx_counter] = current_node;
1362 ics_adi_dir_x->states_in[ordered_node_idx_counter] =
states[current_node];
1363 ordered_node_idx_counter++;
1364 for(k = 1; k < thread_line_defs[
i][j+1]; k++){
1365 current_node = _neighbors[current_node * 3];
1366 ics_adi_dir_x->ordered_nodes[ordered_node_idx_counter] = current_node;
1367 ics_adi_dir_x->states_in[ordered_node_idx_counter] =
states[current_node];
1368 ordered_node_idx_counter++;
1374 for(i = 0; i < nthreads; i++){
1375 free(thread_line_defs[i]);
1377 free(thread_line_defs);
1378 free(nodes_per_thread);
1379 free(lines_per_thread);
1380 free(thread_idx_counter);
1386 int* nodes_per_thread = (
int*)calloc(nthreads,
sizeof(
int));
1388 int* lines_per_thread = (
int*)calloc(nthreads,
sizeof(
int));
1390 int* thread_idx_counter = (
int*)calloc(nthreads,
sizeof(
int));
1392 int line_thread_id[_y_lines_length / 2];
1394 int** thread_line_defs = (
int**)malloc(nthreads*
sizeof(
int*));
1399 for(i = 0; i < _y_lines_length; i+=2){
1401 nodes_per_thread[min_index] += _sorted_y_lines[i+1];
1402 line_thread_id[i/2] = min_index;
1403 lines_per_thread[min_index] += 1;
1407 for(i = 0; i < nthreads; i++){
1408 thread_line_defs[
i] = (
int*)malloc(lines_per_thread[i]*2*
sizeof(
int));
1415 for(i = 0; i < _y_lines_length; i+=2){
1416 thread_idx = line_thread_id[i/2];
1417 line_idx = thread_idx_counter[thread_idx];
1418 thread_line_defs[thread_idx][line_idx] = _sorted_y_lines[
i];
1419 thread_line_defs[thread_idx][line_idx+1] = _sorted_y_lines[i+1];
1420 thread_idx_counter[thread_idx] += 2;
1424 int ordered_line_def_counter = 0;
1425 for(i = 0; i< nthreads; i++){
1426 for(j=0; j<lines_per_thread[
i]*2;j++){
1427 ics_adi_dir_y->ordered_line_defs[ordered_line_def_counter] = thread_line_defs[
i][
j];
1428 ordered_line_def_counter++;
1434 ics_adi_dir_y->ordered_start_stop_indices[0] = 0;
1435 ics_adi_dir_y->ordered_start_stop_indices[1] = nodes_per_thread[0];
1436 ics_adi_dir_y->line_start_stop_indices[0] = 0;
1437 ics_adi_dir_y->line_start_stop_indices[1] = lines_per_thread[0]*2;
1440 long line_start_node;
1441 for(i = 2; i < nthreads * 2; i+=2){
1442 start_node = ics_adi_dir_y->ordered_start_stop_indices[i-1];
1443 ics_adi_dir_y->ordered_start_stop_indices[
i] = start_node;
1444 ics_adi_dir_y->ordered_start_stop_indices[i+1] = start_node + nodes_per_thread[i/2];
1446 line_start_node = ics_adi_dir_y->line_start_stop_indices[i-1];
1447 ics_adi_dir_y->line_start_stop_indices[
i] = line_start_node;
1448 ics_adi_dir_y->line_start_stop_indices[i+1] = line_start_node + (lines_per_thread[i/2]*2);
1452 int ordered_node_idx_counter = 0;
1454 for(i = 0; i < nthreads; i++){
1455 for(j = 0; j < lines_per_thread[
i] * 2; j+=2){
1456 current_node = thread_line_defs[
i][
j];
1457 ics_adi_dir_y->ordered_nodes[ordered_node_idx_counter] = current_node;
1458 ics_adi_dir_y->states_in[ordered_node_idx_counter] =
states[current_node];
1459 ordered_node_idx_counter++;
1460 for(k = 1; k < thread_line_defs[
i][j+1]; k++){
1461 current_node = _neighbors[(current_node * 3) + 1];
1462 ics_adi_dir_y->ordered_nodes[ordered_node_idx_counter] = current_node;
1463 ics_adi_dir_y->states_in[ordered_node_idx_counter] =
states[current_node];
1464 ordered_node_idx_counter++;
1470 for(i = 0; i < nthreads; i++){
1471 free(thread_line_defs[i]);
1473 free(thread_line_defs);
1474 free(nodes_per_thread);
1475 free(lines_per_thread);
1476 free(thread_idx_counter);
1482 int* nodes_per_thread = (
int*)calloc(nthreads,
sizeof(
int));
1484 int* lines_per_thread = (
int*)calloc(nthreads,
sizeof(
int));
1486 int* thread_idx_counter = (
int*)calloc(nthreads,
sizeof(
int));
1488 int line_thread_id[_z_lines_length / 2];
1490 int** thread_line_defs = (
int**)malloc(nthreads*
sizeof(
int*));
1495 for(i = 0; i < _z_lines_length; i+=2){
1497 nodes_per_thread[min_index] += _sorted_z_lines[i+1];
1498 line_thread_id[i/2] = min_index;
1499 lines_per_thread[min_index] += 1;
1504 for(i = 0; i < nthreads; i++){
1505 thread_line_defs[
i] = (
int*)malloc(lines_per_thread[i]*2*
sizeof(
int));
1512 for(i = 0; i < _z_lines_length; i+=2){
1513 thread_idx = line_thread_id[i/2];
1514 line_idx = thread_idx_counter[thread_idx];
1515 thread_line_defs[thread_idx][line_idx] = _sorted_z_lines[
i];
1516 thread_line_defs[thread_idx][line_idx+1] = _sorted_z_lines[i+1];
1517 thread_idx_counter[thread_idx] += 2;
1521 int ordered_line_def_counter = 0;
1522 for(i = 0; i< nthreads; i++){
1523 for(j=0; j<lines_per_thread[
i]*2;j++){
1524 ics_adi_dir_z->ordered_line_defs[ordered_line_def_counter] = thread_line_defs[
i][
j];
1525 ordered_line_def_counter++;
1531 ics_adi_dir_z->ordered_start_stop_indices[0] = 0;
1532 ics_adi_dir_z->ordered_start_stop_indices[1] = nodes_per_thread[0];
1533 ics_adi_dir_z->line_start_stop_indices[0] = 0;
1534 ics_adi_dir_z->line_start_stop_indices[1] = lines_per_thread[0]*2;
1537 long line_start_node;
1538 for(i = 2; i < nthreads * 2; i+=2){
1539 start_node = ics_adi_dir_z->ordered_start_stop_indices[i-1];
1540 ics_adi_dir_z->ordered_start_stop_indices[
i] = start_node;
1541 ics_adi_dir_z->ordered_start_stop_indices[i+1] = start_node + nodes_per_thread[i/2];
1543 line_start_node = ics_adi_dir_z->line_start_stop_indices[i-1];
1544 ics_adi_dir_z->line_start_stop_indices[
i] = line_start_node;
1545 ics_adi_dir_z->line_start_stop_indices[i+1] = line_start_node + lines_per_thread[i/2]*2;
1549 int ordered_node_idx_counter = 0;
1551 for(i = 0; i < nthreads; i++){
1552 for(j = 0; j < lines_per_thread[
i] * 2; j+=2){
1553 current_node = thread_line_defs[
i][
j];
1554 ics_adi_dir_z->ordered_nodes[ordered_node_idx_counter] = current_node;
1555 ics_adi_dir_z->states_in[ordered_node_idx_counter] =
states[current_node];
1556 ordered_node_idx_counter++;
1557 for(k = 1; k < thread_line_defs[
i][j+1]; k++){
1558 current_node = _neighbors[(current_node * 3) + 2];
1559 ics_adi_dir_z->ordered_nodes[ordered_node_idx_counter] = current_node;
1560 ics_adi_dir_z->states_in[ordered_node_idx_counter] =
states[current_node];
1561 ordered_node_idx_counter++;
1567 for(i = 0; i < nthreads; i++){
1568 free(thread_line_defs[i]);
1570 free(thread_line_defs);
1571 free(nodes_per_thread);
1572 free(lines_per_thread);
1573 free(thread_idx_counter);
1580 if(ics_tasks !=
NULL)
1584 free(ics_tasks[i].scratchpad);
1585 free(ics_tasks[i].
RHS);
1592 ics_tasks[
i].RHS = (
double*)malloc(
sizeof(
double) * _line_length_max);
1593 ics_tasks[
i].scratchpad = (
double*)malloc(
sizeof(
double) * _line_length_max - 1);
1594 ics_tasks[
i].g =
this;
1595 ics_tasks[
i].u_diag = (
double*)malloc(
sizeof(
double) * _line_length_max - 1);
1596 ics_tasks[
i].diag = (
double*)malloc(
sizeof(
double) * _line_length_max);
1597 ics_tasks[
i].l_diag = (
double*)malloc(
sizeof(
double) * _line_length_max - 1);
1600 free(ics_adi_dir_x->ordered_start_stop_indices);
1601 free(ics_adi_dir_x->line_start_stop_indices);
1603 free(ics_adi_dir_y->ordered_start_stop_indices);
1604 free(ics_adi_dir_y->line_start_stop_indices);
1606 free(ics_adi_dir_z->ordered_start_stop_indices);
1607 free(ics_adi_dir_z->line_start_stop_indices);
1609 ics_adi_dir_x->ordered_start_stop_indices = (
long*)malloc(
sizeof(
long)*n*2);
1610 ics_adi_dir_x->line_start_stop_indices = (
long*)malloc(
sizeof(
long)*n*2);
1612 ics_adi_dir_y->ordered_start_stop_indices = (
long*)malloc(
sizeof(
long)*n*2);
1613 ics_adi_dir_y->line_start_stop_indices = (
long*)malloc(
sizeof(
long)*n*2);
1615 ics_adi_dir_z->ordered_start_stop_indices = (
long*)malloc(
sizeof(
long)*n*2);
1616 ics_adi_dir_z->line_start_stop_indices = (
long*)malloc(
sizeof(
long)*n*2);
1640 int seg_start_index, seg_stop_index;
1644 for(i = 0; i <
n; i++){
1648 for(j = seg_start_index; j < seg_stop_index; j++){
1658 if(ics_adi_dir_x->dcgrid ==
NULL)
1729 double total_seg_concentration;
1730 double average_seg_concentration;
1731 int seg_start_index, seg_stop_index;
1735 for (i = 0; i <
n; i++) {
1736 total_seg_concentration = 0.0;
1739 for(j = seg_start_index; j < seg_stop_index; j++){
1742 average_seg_concentration = total_seg_concentration / (seg_stop_index - seg_start_index);
1766 free(ics_adi_dir_x->ordered_start_stop_indices);
1767 free(ics_adi_dir_x->line_start_stop_indices);
1768 free(ics_adi_dir_x->ordered_nodes);
1769 free(ics_adi_dir_x->deltas);
1770 free(ics_adi_dir_x);
1772 free(ics_adi_dir_y->ordered_start_stop_indices);
1773 free(ics_adi_dir_y->line_start_stop_indices);
1774 free(ics_adi_dir_y->ordered_nodes);
1775 free(ics_adi_dir_y->deltas);
1776 free(ics_adi_dir_y);
1778 free(ics_adi_dir_z->ordered_start_stop_indices);
1779 free(ics_adi_dir_z->line_start_stop_indices);
1780 free(ics_adi_dir_z->ordered_nodes);
1781 free(ics_adi_dir_z->deltas);
1782 free(ics_adi_dir_z);
1792 if(ics_tasks !=
NULL)
1796 free(ics_tasks[i].scratchpad);
1797 free(ics_tasks[i].
RHS);
1798 free(ics_tasks[i].u_diag);
1799 free(ics_tasks[i].l_diag);
void variable_step_hybrid_connections(const double *cvode_states_3d, double *const ydot_3d, const double *cvode_states_1d, double *const ydot_1d)
void set_num_threads(const int n)
void ics_dg_adi_y(ICS_Grid_node *g, int, int, int, double, double *, double *, double *, double *, double *, double *)
void variable_step_hybrid_connections(const double *cvode_states_3d, double *const ydot_3d, const double *cvode_states_1d, double *const ydot_1d)
unsigned char multicompartment_inititalized
void divide_x_work(const int nthreads)
void ics_set_grid_currents(int grid_list_index, int index_in_list, PyObject *neuron_pointers, double *scale_factors)
void set_diffusion(double *, int)
int * proc_induced_current_offset
double * local_induced_currents
void set_volume_fraction(PyHocObject *)
void set_tortuosity(PyHocObject *)
void do_grid_currents(double *, double, int)
double * ics_scale_factors
void apply_node_flux3D(double dt, double *states)
void apply_node_flux3D(double dt, double *states)
void divide_z_work(const int nthreads)
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 *)
int insert(int grid_list_index)
void run_threaded_ics_dg_adi(ICS_Grid_node *g, ICSAdiDirection *ics_adi_dir)
void TaskQueue_sync(TaskQueue *q)
int64_t * ics_surface_nodes_per_seg
void set_diffusion(double *, int)
int * induced_currents_index
void _ics_variable_hybrid_helper(ICS_Grid_node *, const double *, double *const, const double *, double *const)
void apply_node_flux(int, long *, double *, PyObject **, double, double *)
int total_reaction_states
void _ics_rhs_variable_step_helper(ICS_Grid_node *, double const *const, double *)
static philox4x32_key_t k
Concentration_Pair * concentration_list
void make_time_ptr(PyHocObject *my_dt_ptr, PyHocObject *my_t_ptr)
void hybrid_connections()
double(* get_permeability)(double *, int)
int * _rxd_induced_currents_ecs_idx
double * set_rxd_currents(int, int *, PyHocObject **)
void delete_by_id(int id)
double ** ics_current_seg_ptrs
double * _rxd_induced_currents_scale
double * all_reaction_states
Grid_node * Parallel_grids[100]
unsigned char VARIABLE_ECS_VOLUME
void _ics_hybrid_helper(ICS_Grid_node *)
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)
Current_Triple * current_list
int const size_t const size_t n
void hybrid_connections()
int * _rxd_induced_currents_grid
void do_grid_currents(double *, double, int)
void ecs_set_adi_tort(ECS_Grid_node *)
double * induced_currents_scale
void clear_multicompartment_reaction()
static double get_alpha_array(double *alpha, int idx)
void divide_y_work(const int nthreads)
static double get_permeability_array(double *permeability, int idx)
static double get_alpha_scalar(double *alpha, int)
void ics_dg_adi_x(ICS_Grid_node *g, int, int, int, double, double *, double *, double *, double *, double *, double *)
void ecs_run_threaded_dg_adi(const int, const int, ECS_Grid_node *, ECSAdiDirection *, const int)
void variable_step_diffusion(const double *states, double *ydot)
void variable_step_ode_solve(double *RHS, double dt)
int64_t * ics_surface_nodes_per_seg_start_indices
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 bc, double bc_value, double atolscale)
void scatter_grid_concentrations()
int induced_current_count
void set_grid_currents(int grid_list_index, int index_in_list, PyObject *grid_indices, PyObject *neuron_pointers, PyObject *scale_factors)
void scatter_grid_concentrations()
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 *)
static int find_min_element_index(const int thread_sizes[], const int nthreads)
struct ECSAdiDirection * ecs_adi_dir_z
void ecs_set_adi_vol(ECS_Grid_node *)
struct ECSAdiGridData * ecs_tasks
void ics_dg_adi_z_inhom(ICS_Grid_node *g, int, int, int, double, double *, double *, double *, double *, double *, double *)
void ics_set_grid_concentrations(int grid_list_index, int index_in_list, int64_t *nodes_per_seg, int64_t *nodes_per_seg_start_indices, PyObject *neuron_pointers)
void _rhs_variable_step_helper_vol(Grid_node *, double const *const, double *)
virtual void set_diffusion(double *, int)=0
void ics_ode_solve_helper(ICS_Grid_node *, double, double *)
PyObject ** node_flux_src
static void * gather_currents(void *dataptr)
double ** ics_concentration_seg_ptrs
Hybrid_data * hybrid_data
ssize_t num_concentrations
void run_threaded_deltas(ICS_Grid_node *g, ICSAdiDirection *ics_adi_dir)
double * _rxd_induced_currents_ecs
void _rhs_variable_step_helper_tort(Grid_node *, double const *const, double *)
struct ECSAdiDirection * ecs_adi_dir_y
int find(const int, const int, const int, const int, const int)
int * all_reaction_indices
int * proc_num_reaction_states
void variable_step_diffusion(const double *states, double *ydot)
void initialize_multicompartment_reaction()
static Node * node(Object *)
int * proc_induced_current_count
void set_grid_concentrations(int grid_list_index, int index_in_list, PyObject *grid_indices, PyObject *neuron_pointers)
static double get_permeability_scalar(double *, int)
void empty_list(int list_index)
double * induced_currents
void TaskQueue_add_task(TaskQueue *q, void *(*task)(void *), void *args, void *result)
struct ECSAdiDirection * ecs_adi_dir_x
double(* get_alpha)(double *, int)
void ics_dg_adi_y_inhom(ICS_Grid_node *g, int, int, int, double, double *, double *, double *, double *, double *, double *)
void do_multicompartment_reactions(double *)
void set_num_threads(const int n)
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)
int add_multicompartment_reaction(int, int *, int)
void variable_step_ode_solve(double *RHS, double dt)