1 #include <../../nrnconf.h>
10 #define DcX(x, y, z) (g->dc_x * PERM(x, y, z))
11 #define DcY(x, y, z) (g->dc_y * PERM(x, y, z))
12 #define DcZ(x, y, z) (g->dc_z * PERM(x, y, z))
17 (ALPHA(x1, y, z) * ALPHA(x2, y, z) * DcX(x1, y, z) * \
18 (g->states[IDX(x1, y, z)] - g->states[IDX(x2, y, z)]) / \
19 ((ALPHA(x1, y, z) + ALPHA(x2, y, z))))
20 #define Fxy(y1, y1d, y2) \
21 (ALPHA(x, y1, z) * ALPHA(x, y2, z) * DcY(x, y1d, z) * \
22 (g->states[IDX(x, y1, z)] - g->states[IDX(x, y2, z)]) / \
23 ((ALPHA(x, y1, z) + ALPHA(x, y2, z))))
24 #define Fxz(z1, z1d, z2) \
25 (ALPHA(x, y, z1) * ALPHA(x, y, z2) * DcZ(x, y, z1d) * \
26 (g->states[IDX(x, y, z1)] - g->states[IDX(x, y, z2)]) / \
27 ((ALPHA(x, y, z1) + ALPHA(x, y, z2))))
29 (ALPHA(x, y1, z) * ALPHA(x, y2, z) * DcY(x, y1, z) * \
30 (g->states[IDX(x, y1, z)] - g->states[IDX(x, y2, z)]) / \
31 ((ALPHA(x, y1, z) + ALPHA(x, y2, z))))
33 (ALPHA(x, y, z1) * ALPHA(x, y, z2) * DcZ(x, y, z1) * \
34 (g->states[IDX(x, y, z1)] - g->states[IDX(x, y, z2)]) / \
35 ((ALPHA(x, y, z1) + ALPHA(x, y, z2))))
38 #define FLUX(pidx, idx) \
39 (VOLFRAC(pidx) * VOLFRAC(idx) * (states[pidx] - states[idx])) / \
40 (0.5 * (VOLFRAC(pidx) + VOLFRAC(idx)))
61 c[0] = u_diag[0] /
diag[0];
62 b[0] = b[0] /
diag[0];
64 for (
i = 1;
i < N - 1;
i++) {
65 c[
i] = u_diag[
i] / (
diag[
i] - l_diag[
i - 1] *
c[
i - 1]);
66 b[
i] = (b[
i] - l_diag[
i - 1] * b[
i - 1]) / (
diag[
i] - l_diag[
i - 1] *
c[
i - 1]);
68 b[N - 1] = (b[N - 1] - l_diag[N - 2] * b[N - 2]) / (
diag[N - 1] - l_diag[N - 2] *
c[N - 2]);
72 for (
i = N - 2;
i >= 0;
i--) {
73 b[
i] = b[
i] -
c[
i] * b[
i + 1];
93 double const*
const state,
96 int yp, ypd, ym, ymd, zp, zpd, zm, zmd;
105 (y == 0 || z == 0 || y ==
g->size_y - 1 || z ==
g->size_z - 1)) {
106 for (x = 0; x <
g->size_x; x++)
107 RHS[x] =
g->bc->value;
112 div_y = ((y == 0 || y ==
g->size_y - 1) ? 1.0 : 0.5) *
SQ(
g->dy);
113 div_z = ((z == 0 || z ==
g->size_z - 1) ? 1.0 : 0.5) *
SQ(
g->dz);
114 if (
g->size_y == 1) {
120 yp = (y ==
g->size_y - 1) ? y - 1 : y + 1;
121 ypd = (y ==
g->size_y - 1) ? y : y + 1;
122 ym = (y == 0) ? y + 1 : y - 1;
123 ymd = (y == 0) ? 1 : y;
125 if (
g->size_z == 1) {
131 zp = (z ==
g->size_z - 1) ? z - 1 : z + 1;
132 zpd = (z ==
g->size_z - 1) ? z : z + 1;
133 zm = (z == 0) ? z + 1 : z - 1;
134 zmd = (z == 0) ? 1 : z;
137 if (
g->size_x == 1) {
139 RHS[0] =
g->bc->value;
144 RHS[0] += (
Fxy(yp, ypd, y) -
Fxy(y, ymd, ym)) / div_y;
146 RHS[0] += (
Fxz(zp, zpd, z) -
Fxz(z, zmd, zm)) / div_z;
148 RHS[0] += state[
IDX(0, y, z)] +
g->states_cur[
IDX(0, y, z)];
154 diag = (
double*) malloc(
g->size_x *
sizeof(
double));
155 l_diag = (
double*) malloc((
g->size_x - 1) *
sizeof(double));
156 u_diag = (
double*) malloc((
g->size_x - 1) *
sizeof(double));
158 for (x = 1; x <
g->size_x - 1; x++) {
175 (
ALPHA(
g->size_x - 1, y, z) +
ALPHA(
g->size_x - 2, y, z));
177 l_diag[
g->size_x - 2] = -
dt *
prev /
SQ(
g->dx);
180 RHS[x] = state[
IDX(x, y, z)] +
182 ((
Fxx(x + 1, x) /
SQ(
g->dx)) + (
Fxy(yp, ypd, y) -
Fxy(y, ymd, ym)) / div_y +
183 (
Fxz(zp, zpd, z) -
Fxz(z, zmd, zm)) / div_z) +
184 g->states_cur[
IDX(x, y, z)];
187 RHS[x] = state[
IDX(x, y, z)] +
189 ((
Fxx(x - 1, x)) /
SQ(
g->dx) + (
Fxy(yp, ypd, y) -
Fxy(y, ymd, ym)) / div_y +
190 (
Fxz(zp, zpd, z) -
Fxz(z, zmd, zm)) / div_z) +
191 g->states_cur[
IDX(x, y, z)];
195 diag[
g->size_x - 1] = 1.0;
196 l_diag[
g->size_x - 2] = 0;
197 RHS[0] =
g->bc->value;
198 RHS[
g->size_x - 1] =
g->bc->value;
201 for (x = 1; x <
g->size_x - 1; x++) {
203 __builtin_prefetch(&(state[
IDX(x +
PREFETCH, y, z)]), 0, 1);
204 __builtin_prefetch(&(state[
IDX(x +
PREFETCH, yp, z)]), 0, 0);
205 __builtin_prefetch(&(state[
IDX(x +
PREFETCH, ym, z)]), 0, 0);
206 __builtin_prefetch(&(state[
IDX(x +
PREFETCH, ypd, z)]), 0, 0);
207 __builtin_prefetch(&(state[
IDX(x +
PREFETCH, ymd, z)]), 0, 0);
209 RHS[x] = state[
IDX(x, y, z)] +
211 (
Fxy(yp, ypd, y) -
Fxy(y, ymd, ym)) / div_y +
212 (
Fxz(zp, zpd, z) -
Fxz(z, zmd, zm)) / div_z) +
213 g->states_cur[
IDX(x, y, z)];
237 double const*
const state,
248 (x == 0 || z == 0 || x ==
g->size_x - 1 || z ==
g->size_z - 1)) {
249 for (y = 0; y <
g->size_y; y++)
250 RHS[y] =
g->bc->value;
254 if (
g->size_y == 1) {
256 RHS[0] =
g->bc->value;
258 RHS[0] = state[x + z *
g->size_x];
263 diag = (
double*) malloc(
g->size_y *
sizeof(
double));
264 l_diag = (
double*) malloc((
g->size_y - 1) *
sizeof(double));
265 u_diag = (
double*) malloc((
g->size_y - 1) *
sizeof(double));
267 for (y = 1; y <
g->size_y - 1; y++) {
284 (
ALPHA(x,
g->size_y - 1, z) +
ALPHA(x,
g->size_y - 2, z));
287 l_diag[
g->size_y - 2] = -
dt *
prev /
SQ(
g->dy);
289 RHS[0] = state[x + z *
g->size_x] -
dt *
Fyy(1, 0) / (
SQ(
g->dy) *
ALPHA(x, 0, z));
291 RHS[y] = state[x + (z + y *
g->size_z) *
g->size_x] +
296 diag[
g->size_y - 1] = 1.0;
297 l_diag[
g->size_y - 2] = 0;
298 RHS[0] =
g->bc->value;
299 RHS[
g->size_y - 1] =
g->bc->value;
301 for (y = 1; y <
g->size_y - 1; y++) {
303 __builtin_prefetch(&state[x + (z + (y +
PREFETCH) *
g->size_z) *
g->size_x], 0, 0);
304 __builtin_prefetch(&(
g->states[
IDX(x, y +
PREFETCH, z)]), 0, 1);
306 RHS[y] = state[x + (z + y *
g->size_z) *
g->size_x] -
331 double const*
const state,
342 (x == 0 || y == 0 || x ==
g->size_x - 1 || y ==
g->size_y - 1)) {
343 for (z = 0; z <
g->size_z; z++)
344 RHS[z] =
g->bc->value;
347 if (
g->size_z == 1) {
349 RHS[0] =
g->bc->value;
351 RHS[0] = state[y +
g->size_y * x];
356 diag = (
double*) malloc(
g->size_z *
sizeof(
double));
357 l_diag = (
double*) malloc((
g->size_z - 1) *
sizeof(double));
358 u_diag = (
double*) malloc((
g->size_z - 1) *
sizeof(double));
360 for (z = 1; z <
g->size_z - 1; z++) {
376 (
ALPHA(x, y,
g->size_z - 1) +
ALPHA(x, y,
g->size_z - 2));
379 l_diag[
g->size_z - 2] = -
dt *
prev /
SQ(
g->dz);
381 RHS[0] = state[y +
g->size_y * (x *
g->size_z)] -
384 RHS[z] = state[y +
g->size_y * (x *
g->size_z + z)] +
389 diag[
g->size_z - 1] = 1.0;
390 l_diag[
g->size_z - 2] = 0;
391 RHS[0] =
g->bc->value;
392 RHS[
g->size_z - 1] =
g->bc->value;
394 for (z = 1; z <
g->size_z - 1; z++) {
395 RHS[z] = state[y +
g->size_y * (x *
g->size_z + z)] -
432 double const*
const state,
435 int yp, ypd, ym, ymd, zp, zpd, zm, zmd, div_y, div_z;
442 (y == 0 || z == 0 || y ==
g->size_y - 1 || z ==
g->size_z - 1)) {
443 for (x = 0; x <
g->size_x; x++)
444 RHS[x] =
g->bc->value;
449 div_y = (y == 0 || y ==
g->size_y - 1) ? 2 : 1;
450 div_z = (z == 0 || z ==
g->size_z - 1) ? 2 : 1;
451 if (
g->size_y == 1) {
457 yp = (y ==
g->size_y - 1) ? y - 1 : y + 1;
458 ypd = (y ==
g->size_y - 1) ? y : y + 1;
459 ym = (y == 0) ? y + 1 : y - 1;
460 ymd = (y == 0) ? 1 : y;
462 if (
g->size_z == 1) {
468 zp = (z ==
g->size_z - 1) ? z - 1 : z + 1;
469 zpd = (z ==
g->size_z - 1) ? z : z + 1;
470 zm = (z == 0) ? z + 1 : z - 1;
471 zmd = (z == 0) ? 1 : z;
474 if (
g->size_x == 1) {
476 RHS[0] =
g->bc->value;
480 RHS[0] += (
DcY(0, ypd, z) * state[
IDX(0, yp, z)] -
481 (
DcY(0, ypd, z) +
DcY(0, ymd, z)) * state[
IDX(0, y, z)] +
482 DcY(0, ymd, z) * state[
IDX(0, ym, z)]) /
485 RHS[0] += (
DcZ(0, y, zpd) * state[
IDX(0, y, zp)] -
486 (
DcZ(0, y, zpd) +
DcZ(0, y, zmd)) * state[
IDX(0, y, z)] +
487 DcZ(0, y, zmd) * state[
IDX(0, y, zm)]) /
490 RHS[0] += state[
IDX(0, y, z)] +
g->states_cur[
IDX(0, y, z)];
495 diag = (
double*) malloc(
g->size_x *
sizeof(
double));
496 l_diag = (
double*) malloc((
g->size_x - 1) *
sizeof(double));
497 u_diag = (
double*) malloc((
g->size_x - 1) *
sizeof(double));
499 for (x = 1; x <
g->size_x - 1; x++) {
500 l_diag[x - 1] = -
dt *
DcX(x, y, z) / (2. *
SQ(
g->dx));
501 diag[x] = 1. +
dt * (
DcX(x, y, z) +
DcX(x + 1, y, z)) / (2. *
SQ(
g->dx));
502 u_diag[x] = -
dt *
DcX(x + 1, y, z) / (2. *
SQ(
g->dx));
508 u_diag[0] = -0.5 *
dt *
DcX(1, y, z) /
SQ(
g->dx);
509 diag[
g->size_x - 1] = 1. + 0.5 *
dt *
DcX(
g->size_x - 1, y, z) /
SQ(
g->dx);
510 l_diag[
g->size_x - 2] = -0.5 *
dt *
DcX(
g->size_x - 1, y, z) /
SQ(
g->dx);
513 RHS[0] = state[
IDX(0, y, z)] +
514 dt * ((
DcX(1, y, z) * state[
IDX(1, y, z)] -
DcX(1, y, z) * state[
IDX(0, y, z)]) /
516 (
DcY(0, ypd, z) * state[
IDX(0, yp, z)] -
517 (
DcY(0, ypd, z) +
DcY(0, ymd, z)) * state[
IDX(0, y, z)] +
518 DcY(0, ymd, z) * state[
IDX(0, ym, z)]) /
519 (div_y *
SQ(
g->dy)) +
520 (
DcZ(0, y, zpd) * state[
IDX(0, y, zp)] -
521 (
DcZ(0, y, zpd) +
DcZ(0, y, zmd)) * state[
IDX(0, y, z)] +
522 DcZ(0, y, zmd) * state[
IDX(0, y, zm)]) /
523 (div_z *
SQ(
g->dz))) +
524 g->states_cur[
IDX(0, y, z)];
527 state[
IDX(x, y, z)] +
528 dt * ((
DcX(x, y, z) * state[
IDX(x - 1, y, z)] -
DcX(x, y, z) * state[
IDX(x, y, z)]) /
530 (
DcY(x, ypd, z) * state[
IDX(x, yp, z)] -
531 (
DcY(x, ypd, z) +
DcY(x, ymd, z)) * state[
IDX(x, y, z)] +
532 DcY(x, ymd, z) * state[
IDX(x, ym, z)]) /
533 (div_y *
SQ(
g->dy)) +
534 (
DcZ(x, y, zpd) * state[
IDX(x, y, zp)] -
535 (
DcZ(x, y, zpd) +
DcZ(x, y, zmd)) * state[
IDX(x, y, z)] +
536 DcZ(x, y, zmd) * state[
IDX(x, y, zm)]) /
537 (div_z *
SQ(
g->dz))) +
538 g->states_cur[
IDX(x, y, z)];
543 diag[
g->size_x - 1] = 1.0;
544 l_diag[
g->size_x - 2] = 0.0;
545 RHS[0] =
g->bc->value;
546 RHS[
g->size_x - 1] =
g->bc->value;
549 for (x = 1; x <
g->size_x - 1; x++) {
551 __builtin_prefetch(&(state[
IDX(x +
PREFETCH, y, z)]), 0, 1);
552 __builtin_prefetch(&(state[
IDX(x +
PREFETCH, yp, z)]), 0, 0);
553 __builtin_prefetch(&(state[
IDX(x +
PREFETCH, ym, z)]), 0, 0);
556 RHS[x] = state[
IDX(x, y, z)] +
557 dt * ((
DcX(x + 1, y, z) * state[
IDX(x + 1, y, z)] -
558 (
DcX(x + 1, y, z) +
DcX(x, y, z)) * state[
IDX(x, y, z)] +
559 DcX(x, y, z) * state[
IDX(x - 1, y, z)]) /
561 (
DcY(x, ypd, z) * state[
IDX(x, yp, z)] -
562 (
DcY(x, ypd, z) +
DcY(x, ymd, z)) * state[
IDX(x, y, z)] +
563 DcY(x, ymd, z) * state[
IDX(x, ym, z)]) /
564 (div_y *
SQ(
g->dy)) +
565 (
DcZ(x, y, zpd) * state[
IDX(x, y, zp)] -
566 (
DcZ(x, y, zpd) +
DcZ(x, y, zmd)) * state[
IDX(x, y, z)] +
567 DcZ(x, y, zmd) * state[
IDX(x, y, zm)]) /
568 (div_z *
SQ(
g->dz))) +
569 g->states_cur[
IDX(x, y, z)];
594 double const*
const state,
604 (x == 0 || z == 0 || x ==
g->size_x - 1 || z ==
g->size_z - 1)) {
605 for (y = 0; y <
g->size_y; y++)
606 RHS[y] =
g->bc->value;
610 if (
g->size_y == 1) {
612 RHS[0] =
g->bc->value;
614 RHS[0] = state[x + z *
g->size_x];
619 diag = (
double*) malloc(
g->size_y *
sizeof(
double));
620 l_diag = (
double*) malloc((
g->size_y - 1) *
sizeof(double));
621 u_diag = (
double*) malloc((
g->size_y - 1) *
sizeof(double));
623 for (y = 1; y <
g->size_y - 1; y++) {
624 l_diag[y - 1] = -
dt *
DcY(x, y, z) / (2. *
SQ(
g->dy));
625 diag[y] = 1. +
dt * (
DcY(x, y, z) +
DcY(x, y + 1, z)) / (2. *
SQ(
g->dy));
626 u_diag[y] = -
dt *
DcY(x, y + 1, z) / (2. *
SQ(
g->dy));
632 u_diag[0] = -0.5 *
dt *
DcY(x, 1, z) /
SQ(
g->dy);
633 diag[
g->size_y - 1] = 1. + 0.5 *
dt *
DcY(x,
g->size_y - 1, z) /
SQ(
g->dy);
634 l_diag[
g->size_y - 2] = -0.5 *
dt *
DcY(x,
g->size_y - 1, z) /
SQ(
g->dy);
637 RHS[0] = state[x + z *
g->size_x] -
dt * ((
DcY(x, 1, z) *
g->states[
IDX(x, 1, z)] -
638 DcY(x, 1, z) *
g->states[
IDX(x, 0, z)]) /
641 RHS[y] = state[x + (z + y *
g->size_z) *
g->size_x] -
643 (
DcY(x, y, z) *
g->states[
IDX(x, y - 1, z)] -
644 DcY(x, y, z) *
g->states[
IDX(x, y, z)]) /
649 diag[
g->size_y - 1] = 1.0;
650 l_diag[
g->size_y - 2] = 0.0;
651 RHS[0] =
g->bc->value;
652 RHS[
g->size_y - 1] =
g->bc->value;
656 for (y = 1; y <
g->size_y - 1; y++) {
658 __builtin_prefetch(&state[x + (z + (y +
PREFETCH) *
g->size_z) *
g->size_x], 0, 0);
659 __builtin_prefetch(&(
g->states[
IDX(x, y +
PREFETCH, z)]), 0, 1);
661 RHS[y] = state[x + (z + y *
g->size_z) *
g->size_x] -
663 (
DcY(x, y + 1, z) *
g->states[
IDX(x, y + 1, z)] -
664 (
DcY(x, y + 1, z) +
DcY(x, y, z)) *
g->states[
IDX(x, y, z)] +
665 DcY(x, y, z) *
g->states[
IDX(x, y - 1, z)]) /
690 double const*
const state,
700 (x == 0 || y == 0 || x ==
g->size_x - 1 || y ==
g->size_y - 1)) {
701 for (z = 0; z <
g->size_z; z++)
702 RHS[z] =
g->bc->value;
706 if (
g->size_z == 1) {
708 RHS[0] =
g->bc->value;
710 RHS[0] = state[y +
g->size_y * x];
714 diag = (
double*) malloc(
g->size_z *
sizeof(
double));
715 l_diag = (
double*) malloc((
g->size_z - 1) *
sizeof(double));
716 u_diag = (
double*) malloc((
g->size_z - 1) *
sizeof(double));
719 for (z = 1; z <
g->size_z - 1; z++) {
720 l_diag[z - 1] = -
dt *
DcZ(x, y, z) / (2. *
SQ(
g->dz));
721 diag[z] = 1. +
dt * (
DcZ(x, y, z) +
DcZ(x, y, z + 1)) / (2. *
SQ(
g->dz));
722 u_diag[z] = -
dt *
DcZ(x, y, z + 1) / (2. *
SQ(
g->dz));
728 u_diag[0] = -0.5 *
dt *
DcZ(x, y, 1) /
SQ(
g->dz);
729 diag[
g->size_z - 1] = 1. + 0.5 *
dt *
DcZ(x, y,
g->size_z - 1) /
SQ(
g->dz);
730 l_diag[
g->size_z - 2] = -0.5 *
dt *
DcZ(x, y,
g->size_z - 1) /
SQ(
g->dz);
732 RHS[0] = state[y +
g->size_y * (x *
g->size_z)] -
733 dt * ((
DcZ(x, y, 1) *
g->states[
IDX(x, y, 1)] -
734 DcZ(x, y, 1) *
g->states[
IDX(x, y, 0)]) /
737 RHS[z] = state[y +
g->size_y * (x *
g->size_z + z)] -
739 (
DcZ(x, y, z) *
g->states[
IDX(x, y, z - 1)] -
740 DcZ(x, y, z) *
g->states[
IDX(x, y, z)]) /
745 diag[
g->size_z - 1] = 1.0;
746 l_diag[
g->size_z - 2] = 0.0;
747 RHS[0] =
g->bc->value;
748 RHS[
g->size_z - 1] =
g->bc->value;
752 for (z = 1; z <
g->size_z - 1; z++) {
753 RHS[z] = state[y +
g->size_y * (x *
g->size_z + z)] -
755 (
DcZ(x, y, z + 1) *
g->states[
IDX(x, y, z + 1)] -
756 (
DcZ(x, y, z + 1) +
DcZ(x, y, z)) *
g->states[
IDX(x, y, z)] +
757 DcZ(x, y, z) *
g->states[
IDX(x, y, z - 1)]) /
787 int num_states_x =
g->size_x, num_states_y =
g->size_y, num_states_z =
g->size_z;
788 double dx =
g->dx, dy =
g->dy, dz =
g->dz;
789 int i,
j,
k, stop_i, stop_j, stop_k;
790 double rate_x = 1. / (dx * dx);
791 double rate_y = 1. / (dy * dy);
792 double rate_z = 1. / (dz * dz);
795 int index, prev_i, prev_j, prev_k, next_i, next_j, next_k;
796 int xpd, xmd, ypd, ymd, zpd, zmd;
797 double div_x, div_y, div_z;
800 stop_i = num_states_x - 1;
801 stop_j = num_states_y - 1;
802 stop_k = num_states_z - 1;
806 prev_i = num_states_y * num_states_z,
807 next_i = num_states_y * num_states_z;
811 div_x = (
i == 0 ||
i == stop_i) ? 2. : 1.;
812 xpd = (
i == stop_i) ?
i :
i + 1;
813 xmd = (
i == 0) ? 1 :
i;
815 for (
j = 0, prev_j =
index + num_states_z, next_j =
index + num_states_z;
818 div_y = (
j == 0 ||
j == stop_j) ? 2. : 1.;
819 ypd = (
j == stop_j) ?
j :
j + 1;
820 ymd = (
j == 0) ? 1 :
j;
822 for (
k = 0, prev_k =
index + 1, next_k =
index + 1;
k < num_states_z;
823 k++,
index++, prev_i++, next_i++, prev_j++, next_j++) {
824 div_z = (
k == 0 ||
k == stop_k) ? 2. : 1.;
825 zpd = (
k == stop_k) ?
k :
k + 1;
826 zmd = (
k == 0) ? 1 :
k;
829 ydot[
index] += rate_x *
836 ydot[
index] += rate_y *
844 ydot[
index] += rate_z *
854 prev_j =
index - num_states_z;
855 next_j = (
j == stop_j - 1) ? prev_j :
index + num_states_z;
857 prev_i =
index - num_states_y * num_states_z;
858 next_i = (
i == stop_i - 1) ? prev_i :
index + num_states_y * num_states_z;
861 for (
i = 0,
index = 0, prev_i = 0, next_i = num_states_y * num_states_z;
i < num_states_x;
863 for (
j = 0, prev_j =
index - num_states_z, next_j =
index + num_states_z;
866 for (
k = 0, prev_k =
index - 1, next_k =
index + 1;
k < num_states_z;
867 k++,
index++, prev_i++, next_i++, prev_j++, next_j++, next_k++, prev_k++) {
868 if (
i == 0 ||
i == stop_i ||
j == 0 ||
j == stop_j ||
k == 0 ||
k == stop_k) {
885 prev_j =
index - num_states_z;
886 next_j =
index + num_states_z;
888 prev_i =
index - num_states_y * num_states_z;
889 next_i =
index + num_states_y * num_states_z;
896 int num_states_x =
g->size_x, num_states_y =
g->size_y, num_states_z =
g->size_z;
897 double dx =
g->dx, dy =
g->dy, dz =
g->dz;
898 int i,
j,
k, stop_i, stop_j, stop_k;
899 double rate_x =
g->dc_x / (dx * dx);
900 double rate_y =
g->dc_y / (dy * dy);
901 double rate_z =
g->dc_z / (dz * dz);
905 int index, prev_i, prev_j, prev_k, next_i, next_j, next_k;
908 int xpd, xmd, ypd, ymd, zpd, zmd;
909 double div_x, div_y, div_z;
912 stop_i = num_states_x - 1;
913 stop_j = num_states_y - 1;
914 stop_k = num_states_z - 1;
918 prev_i = num_states_y * num_states_z,
919 next_i = num_states_y * num_states_z;
923 div_x = (
i == 0 ||
i == stop_i) ? 2. : 1.;
924 xpd = (
i == stop_i) ?
i :
i + 1;
925 xmd = (
i == 0) ? 1 :
i;
927 for (
j = 0, prev_j =
index + num_states_z, next_j =
index + num_states_z;
930 div_y = (
j == 0 ||
j == stop_j) ? 2. : 1.;
931 ypd = (
j == stop_j) ?
j :
j + 1;
932 ymd = (
j == 0) ? 1 :
j;
934 for (
k = 0, prev_k =
index + 1, next_k =
index + 1;
k < num_states_z;
935 k++,
index++, prev_i++, next_i++, prev_j++, next_j++) {
936 div_z = (
k == 0 ||
k == stop_k) ? 2. : 1.;
937 zpd = (
k == stop_k) ?
k :
k + 1;
938 zmd = (
k == 0) ? 1 :
k;
942 ydot[
index] += rate_x *
950 ydot[
index] += rate_y *
958 ydot[
index] += rate_z *
967 prev_j =
index - num_states_z;
968 next_j = (
j == stop_j - 1) ? prev_j :
index + num_states_z;
970 prev_i =
index - num_states_y * num_states_z;
971 next_i = (
i == stop_i - 1) ? prev_i :
index + num_states_y * num_states_z;
974 for (
i = 0,
index = 0, prev_i = 0, next_i = num_states_y * num_states_z;
i < num_states_x;
976 for (
j = 0, prev_j =
index - num_states_z, next_j =
index + num_states_z;
979 for (
k = 0, prev_k =
index - 1, next_k =
index + 1;
k < num_states_z;
980 k++,
index++, prev_i++, next_i++, prev_j++, next_j++, next_k++, prev_k++) {
981 if (
i == 0 ||
i == stop_i ||
j == 0 ||
j == stop_j ||
k == 0 ||
k == stop_k) {
986 ydot[
index] += rate_x *
992 ydot[
index] += rate_y *
998 ydot[
index] += rate_z *
1004 prev_j =
index - num_states_z;
1005 next_j =
index + num_states_z;
1007 prev_i =
index - num_states_y * num_states_z;
1008 next_i =
index + num_states_y * num_states_z;
static philox4x32_key_t k
static char scratch[MAXLINE+1]
static void ecs_dg_adi_vol_y(ECS_Grid_node *g, double const dt, int const x, int const z, double const *const state, double *const RHS, double *const scratch)
static void ecs_dg_adi_vol_x(ECS_Grid_node *g, const double dt, const int y, const int z, double const *const state, double *const RHS, double *const scratch)
void ecs_set_adi_tort(ECS_Grid_node *g)
static int solve_dd_tridiag(int N, const double *l_diag, const double *diag, const double *u_diag, double *b, double *c)
void _rhs_variable_step_helper_tort(Grid_node *g, double const *const states, double *ydot)
static void ecs_dg_adi_tort_z(ECS_Grid_node *g, double const dt, int const x, int const y, double const *const state, double *const RHS, double *const scratch)
void _rhs_variable_step_helper_vol(Grid_node *g, double const *const states, double *ydot)
static void ecs_dg_adi_tort_x(ECS_Grid_node *g, const double dt, const int y, const int z, double const *const state, double *const RHS, double *const scratch)
static void ecs_dg_adi_vol_z(ECS_Grid_node *g, double const dt, int const x, int const y, double const *const state, double *const RHS, double *const scratch)
void ecs_set_adi_vol(ECS_Grid_node *g)
static void ecs_dg_adi_tort_y(ECS_Grid_node *g, double const dt, int const x, int const z, double const *const state, double *const RHS, double *const scratch)