Compare commits
6 Commits
main
...
cjy-dystop
| Author | SHA1 | Date | |
|---|---|---|---|
| f1fe9fd443 | |||
| 7bb9042b18 | |||
| 9991b7f41e | |||
| 57abf12bbd | |||
| 51efc47c1b | |||
| 234c4f7344 |
@@ -1139,6 +1139,7 @@ int f_compute_rhs_bssn(int *ex, double &T,
|
|||||||
fderivs(ex,Ayy,gyyx,gyyy,gyyz,X,Y,Z,SYM ,SYM ,SYM ,Symmetry,0);
|
fderivs(ex,Ayy,gyyx,gyyy,gyyz,X,Y,Z,SYM ,SYM ,SYM ,Symmetry,0);
|
||||||
fderivs(ex,Ayz,gyzx,gyzy,gyzz,X,Y,Z,SYM ,ANTI,ANTI,Symmetry,0);
|
fderivs(ex,Ayz,gyzx,gyzy,gyzz,X,Y,Z,SYM ,ANTI,ANTI,Symmetry,0);
|
||||||
fderivs(ex,Azz,gzzx,gzzy,gzzz,X,Y,Z,SYM ,SYM ,SYM ,Symmetry,0);
|
fderivs(ex,Azz,gzzx,gzzy,gzzz,X,Y,Z,SYM ,SYM ,SYM ,Symmetry,0);
|
||||||
|
}
|
||||||
// 7ms //
|
// 7ms //
|
||||||
for (int i=0;i<all;i+=1) {
|
for (int i=0;i<all;i+=1) {
|
||||||
gxxx[i] = gxxx[i] - ( Gamxxx[i] * Axx[i] + Gamyxx[i] * Axy[i] + Gamzxx[i] * Axz[i]
|
gxxx[i] = gxxx[i] - ( Gamxxx[i] * Axx[i] + Gamyxx[i] * Axy[i] + Gamzxx[i] * Axz[i]
|
||||||
@@ -1192,7 +1193,6 @@ int f_compute_rhs_bssn(int *ex, double &T,
|
|||||||
movy_Res[i] = movy_Res[i] - F2o3*Ky[i] - F8*PI*Sy[i];
|
movy_Res[i] = movy_Res[i] - F2o3*Ky[i] - F8*PI*Sy[i];
|
||||||
movz_Res[i] = movz_Res[i] - F2o3*Kz[i] - F8*PI*Sz[i];
|
movz_Res[i] = movz_Res[i] - F2o3*Kz[i] - F8*PI*Sz[i];
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -71,131 +71,106 @@ void fdderivs(const int ex[3],
|
|||||||
const double Fdxdz = F1o144 / (dX * dZ);
|
const double Fdxdz = F1o144 / (dX * dZ);
|
||||||
const double Fdydz = F1o144 / (dY * dZ);
|
const double Fdydz = F1o144 / (dY * dZ);
|
||||||
|
|
||||||
/* 只清零不被主循环覆盖的边界面 */
|
const size_t all = (size_t)ex1 * (size_t)ex2 * (size_t)ex3;
|
||||||
{
|
for (size_t p = 0; p < all; ++p) {
|
||||||
/* 高边界:k0=ex3-1 */
|
fxx[p] = ZEO; fxy[p] = ZEO; fxz[p] = ZEO;
|
||||||
for (int j0 = 0; j0 < ex2; ++j0)
|
fyy[p] = ZEO; fyz[p] = ZEO; fzz[p] = ZEO;
|
||||||
for (int i0 = 0; i0 < ex1; ++i0) {
|
|
||||||
const size_t p = idx_ex(i0, j0, ex3 - 1, ex);
|
|
||||||
fxx[p]=ZEO; fyy[p]=ZEO; fzz[p]=ZEO;
|
|
||||||
fxy[p]=ZEO; fxz[p]=ZEO; fyz[p]=ZEO;
|
|
||||||
}
|
|
||||||
/* 高边界:j0=ex2-1 */
|
|
||||||
for (int k0 = 0; k0 < ex3 - 1; ++k0)
|
|
||||||
for (int i0 = 0; i0 < ex1; ++i0) {
|
|
||||||
const size_t p = idx_ex(i0, ex2 - 1, k0, ex);
|
|
||||||
fxx[p]=ZEO; fyy[p]=ZEO; fzz[p]=ZEO;
|
|
||||||
fxy[p]=ZEO; fxz[p]=ZEO; fyz[p]=ZEO;
|
|
||||||
}
|
|
||||||
/* 高边界:i0=ex1-1 */
|
|
||||||
for (int k0 = 0; k0 < ex3 - 1; ++k0)
|
|
||||||
for (int j0 = 0; j0 < ex2 - 1; ++j0) {
|
|
||||||
const size_t p = idx_ex(ex1 - 1, j0, k0, ex);
|
|
||||||
fxx[p]=ZEO; fyy[p]=ZEO; fzz[p]=ZEO;
|
|
||||||
fxy[p]=ZEO; fxz[p]=ZEO; fyz[p]=ZEO;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 低边界:当二阶模板也不可用时,对应 i0/j0/k0=0 面 */
|
// Match Fortran (ghost_width=3, "for bam comparison") exactly:
|
||||||
if (kminF == 1) {
|
// only compute when x/y/z all satisfy the same-order stencil at this point.
|
||||||
for (int j0 = 0; j0 < ex2; ++j0)
|
for (int k0 = 0; k0 <= ex3 - 2; ++k0) {
|
||||||
for (int i0 = 0; i0 < ex1; ++i0) {
|
|
||||||
const size_t p = idx_ex(i0, j0, 0, ex);
|
|
||||||
fxx[p]=ZEO; fyy[p]=ZEO; fzz[p]=ZEO;
|
|
||||||
fxy[p]=ZEO; fxz[p]=ZEO; fyz[p]=ZEO;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (jminF == 1) {
|
|
||||||
for (int k0 = 0; k0 < ex3; ++k0)
|
|
||||||
for (int i0 = 0; i0 < ex1; ++i0) {
|
|
||||||
const size_t p = idx_ex(i0, 0, k0, ex);
|
|
||||||
fxx[p]=ZEO; fyy[p]=ZEO; fzz[p]=ZEO;
|
|
||||||
fxy[p]=ZEO; fxz[p]=ZEO; fyz[p]=ZEO;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (iminF == 1) {
|
|
||||||
for (int k0 = 0; k0 < ex3; ++k0)
|
|
||||||
for (int j0 = 0; j0 < ex2; ++j0) {
|
|
||||||
const size_t p = idx_ex(0, j0, k0, ex);
|
|
||||||
fxx[p]=ZEO; fyy[p]=ZEO; fzz[p]=ZEO;
|
|
||||||
fxy[p]=ZEO; fxz[p]=ZEO; fyz[p]=ZEO;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 两段式:
|
|
||||||
* 1) 二阶可用区域先计算二阶模板
|
|
||||||
* 2) 高阶可用区域再覆盖四阶模板
|
|
||||||
*/
|
|
||||||
const int i2_lo = (iminF > 0) ? iminF : 0;
|
|
||||||
const int j2_lo = (jminF > 0) ? jminF : 0;
|
|
||||||
const int k2_lo = (kminF > 0) ? kminF : 0;
|
|
||||||
const int i2_hi = ex1 - 2;
|
|
||||||
const int j2_hi = ex2 - 2;
|
|
||||||
const int k2_hi = ex3 - 2;
|
|
||||||
|
|
||||||
const int i4_lo = (iminF + 1 > 0) ? (iminF + 1) : 0;
|
|
||||||
const int j4_lo = (jminF + 1 > 0) ? (jminF + 1) : 0;
|
|
||||||
const int k4_lo = (kminF + 1 > 0) ? (kminF + 1) : 0;
|
|
||||||
const int i4_hi = ex1 - 3;
|
|
||||||
const int j4_hi = ex2 - 3;
|
|
||||||
const int k4_hi = ex3 - 3;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Strategy A:
|
|
||||||
* Avoid redundant work in overlap of 2nd/4th-order regions.
|
|
||||||
* Only compute 2nd-order on shell points that are NOT overwritten by
|
|
||||||
* the 4th-order pass.
|
|
||||||
*/
|
|
||||||
const int has4 = (i4_lo <= i4_hi && j4_lo <= j4_hi && k4_lo <= k4_hi);
|
|
||||||
|
|
||||||
if (i2_lo <= i2_hi && j2_lo <= j2_hi && k2_lo <= k2_hi) {
|
|
||||||
for (int k0 = k2_lo; k0 <= k2_hi; ++k0) {
|
|
||||||
const int kF = k0 + 1;
|
const int kF = k0 + 1;
|
||||||
for (int j0 = j2_lo; j0 <= j2_hi; ++j0) {
|
for (int j0 = 0; j0 <= ex2 - 2; ++j0) {
|
||||||
const int jF = j0 + 1;
|
const int jF = j0 + 1;
|
||||||
for (int i0 = i2_lo; i0 <= i2_hi; ++i0) {
|
for (int i0 = 0; i0 <= ex1 - 2; ++i0) {
|
||||||
if (has4 &&
|
|
||||||
i0 >= i4_lo && i0 <= i4_hi &&
|
|
||||||
j0 >= j4_lo && j0 <= j4_hi &&
|
|
||||||
k0 >= k4_lo && k0 <= k4_hi) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
const int iF = i0 + 1;
|
const int iF = i0 + 1;
|
||||||
const size_t p = idx_ex(i0, j0, k0, ex);
|
const size_t p = idx_ex(i0, j0, k0, ex);
|
||||||
|
|
||||||
|
if ((iF + 2 <= imaxF && iF - 2 >= iminF) &&
|
||||||
|
(jF + 2 <= jmaxF && jF - 2 >= jminF) &&
|
||||||
|
(kF + 2 <= kmaxF && kF - 2 >= kminF)) {
|
||||||
|
fxx[p] = Fdxdx * (
|
||||||
|
-fh[idx_fh_F_ord2(iF - 2, jF, kF, ex)] +
|
||||||
|
F16 * fh[idx_fh_F_ord2(iF - 1, jF, kF, ex)] -
|
||||||
|
F30 * fh[idx_fh_F_ord2(iF, jF, kF, ex)] -
|
||||||
|
fh[idx_fh_F_ord2(iF + 2, jF, kF, ex)] +
|
||||||
|
F16 * fh[idx_fh_F_ord2(iF + 1, jF, kF, ex)]
|
||||||
|
);
|
||||||
|
fyy[p] = Fdydy * (
|
||||||
|
-fh[idx_fh_F_ord2(iF, jF - 2, kF, ex)] +
|
||||||
|
F16 * fh[idx_fh_F_ord2(iF, jF - 1, kF, ex)] -
|
||||||
|
F30 * fh[idx_fh_F_ord2(iF, jF, kF, ex)] -
|
||||||
|
fh[idx_fh_F_ord2(iF, jF + 2, kF, ex)] +
|
||||||
|
F16 * fh[idx_fh_F_ord2(iF, jF + 1, kF, ex)]
|
||||||
|
);
|
||||||
|
fzz[p] = Fdzdz * (
|
||||||
|
-fh[idx_fh_F_ord2(iF, jF, kF - 2, ex)] +
|
||||||
|
F16 * fh[idx_fh_F_ord2(iF, jF, kF - 1, ex)] -
|
||||||
|
F30 * fh[idx_fh_F_ord2(iF, jF, kF, ex)] -
|
||||||
|
fh[idx_fh_F_ord2(iF, jF, kF + 2, ex)] +
|
||||||
|
F16 * fh[idx_fh_F_ord2(iF, jF, kF + 1, ex)]
|
||||||
|
);
|
||||||
|
fxy[p] = Fdxdy * (
|
||||||
|
(fh[idx_fh_F_ord2(iF - 2, jF - 2, kF, ex)] - F8 * fh[idx_fh_F_ord2(iF - 1, jF - 2, kF, ex)] +
|
||||||
|
F8 * fh[idx_fh_F_ord2(iF + 1, jF - 2, kF, ex)] - fh[idx_fh_F_ord2(iF + 2, jF - 2, kF, ex)])
|
||||||
|
- F8 * (fh[idx_fh_F_ord2(iF - 2, jF - 1, kF, ex)] - F8 * fh[idx_fh_F_ord2(iF - 1, jF - 1, kF, ex)] +
|
||||||
|
F8 * fh[idx_fh_F_ord2(iF + 1, jF - 1, kF, ex)] - fh[idx_fh_F_ord2(iF + 2, jF - 1, kF, ex)])
|
||||||
|
+ F8 * (fh[idx_fh_F_ord2(iF - 2, jF + 1, kF, ex)] - F8 * fh[idx_fh_F_ord2(iF - 1, jF + 1, kF, ex)] +
|
||||||
|
F8 * fh[idx_fh_F_ord2(iF + 1, jF + 1, kF, ex)] - fh[idx_fh_F_ord2(iF + 2, jF + 1, kF, ex)])
|
||||||
|
- (fh[idx_fh_F_ord2(iF - 2, jF + 2, kF, ex)] - F8 * fh[idx_fh_F_ord2(iF - 1, jF + 2, kF, ex)] +
|
||||||
|
F8 * fh[idx_fh_F_ord2(iF + 1, jF + 2, kF, ex)] - fh[idx_fh_F_ord2(iF + 2, jF + 2, kF, ex)])
|
||||||
|
);
|
||||||
|
fxz[p] = Fdxdz * (
|
||||||
|
(fh[idx_fh_F_ord2(iF - 2, jF, kF - 2, ex)] - F8 * fh[idx_fh_F_ord2(iF - 1, jF, kF - 2, ex)] +
|
||||||
|
F8 * fh[idx_fh_F_ord2(iF + 1, jF, kF - 2, ex)] - fh[idx_fh_F_ord2(iF + 2, jF, kF - 2, ex)])
|
||||||
|
- F8 * (fh[idx_fh_F_ord2(iF - 2, jF, kF - 1, ex)] - F8 * fh[idx_fh_F_ord2(iF - 1, jF, kF - 1, ex)] +
|
||||||
|
F8 * fh[idx_fh_F_ord2(iF + 1, jF, kF - 1, ex)] - fh[idx_fh_F_ord2(iF + 2, jF, kF - 1, ex)])
|
||||||
|
+ F8 * (fh[idx_fh_F_ord2(iF - 2, jF, kF + 1, ex)] - F8 * fh[idx_fh_F_ord2(iF - 1, jF, kF + 1, ex)] +
|
||||||
|
F8 * fh[idx_fh_F_ord2(iF + 1, jF, kF + 1, ex)] - fh[idx_fh_F_ord2(iF + 2, jF, kF + 1, ex)])
|
||||||
|
- (fh[idx_fh_F_ord2(iF - 2, jF, kF + 2, ex)] - F8 * fh[idx_fh_F_ord2(iF - 1, jF, kF + 2, ex)] +
|
||||||
|
F8 * fh[idx_fh_F_ord2(iF + 1, jF, kF + 2, ex)] - fh[idx_fh_F_ord2(iF + 2, jF, kF + 2, ex)])
|
||||||
|
);
|
||||||
|
fyz[p] = Fdydz * (
|
||||||
|
(fh[idx_fh_F_ord2(iF, jF - 2, kF - 2, ex)] - F8 * fh[idx_fh_F_ord2(iF, jF - 1, kF - 2, ex)] +
|
||||||
|
F8 * fh[idx_fh_F_ord2(iF, jF + 1, kF - 2, ex)] - fh[idx_fh_F_ord2(iF, jF + 2, kF - 2, ex)])
|
||||||
|
- F8 * (fh[idx_fh_F_ord2(iF, jF - 2, kF - 1, ex)] - F8 * fh[idx_fh_F_ord2(iF, jF - 1, kF - 1, ex)] +
|
||||||
|
F8 * fh[idx_fh_F_ord2(iF, jF + 1, kF - 1, ex)] - fh[idx_fh_F_ord2(iF, jF + 2, kF - 1, ex)])
|
||||||
|
+ F8 * (fh[idx_fh_F_ord2(iF, jF - 2, kF + 1, ex)] - F8 * fh[idx_fh_F_ord2(iF, jF - 1, kF + 1, ex)] +
|
||||||
|
F8 * fh[idx_fh_F_ord2(iF, jF + 1, kF + 1, ex)] - fh[idx_fh_F_ord2(iF, jF + 2, kF + 1, ex)])
|
||||||
|
- (fh[idx_fh_F_ord2(iF, jF - 2, kF + 2, ex)] - F8 * fh[idx_fh_F_ord2(iF, jF - 1, kF + 2, ex)] +
|
||||||
|
F8 * fh[idx_fh_F_ord2(iF, jF + 1, kF + 2, ex)] - fh[idx_fh_F_ord2(iF, jF + 2, kF + 2, ex)])
|
||||||
|
);
|
||||||
|
} else if ((iF + 1 <= imaxF && iF - 1 >= iminF) &&
|
||||||
|
(jF + 1 <= jmaxF && jF - 1 >= jminF) &&
|
||||||
|
(kF + 1 <= kmaxF && kF - 1 >= kminF)) {
|
||||||
fxx[p] = Sdxdx * (
|
fxx[p] = Sdxdx * (
|
||||||
fh[idx_fh_F_ord2(iF - 1, jF, kF, ex)] -
|
fh[idx_fh_F_ord2(iF - 1, jF, kF, ex)] -
|
||||||
TWO * fh[idx_fh_F_ord2(iF, jF, kF, ex)] +
|
TWO * fh[idx_fh_F_ord2(iF, jF, kF, ex)] +
|
||||||
fh[idx_fh_F_ord2(iF + 1, jF, kF, ex)]
|
fh[idx_fh_F_ord2(iF + 1, jF, kF, ex)]
|
||||||
);
|
);
|
||||||
|
|
||||||
fyy[p] = Sdydy * (
|
fyy[p] = Sdydy * (
|
||||||
fh[idx_fh_F_ord2(iF, jF - 1, kF, ex)] -
|
fh[idx_fh_F_ord2(iF, jF - 1, kF, ex)] -
|
||||||
TWO * fh[idx_fh_F_ord2(iF, jF, kF, ex)] +
|
TWO * fh[idx_fh_F_ord2(iF, jF, kF, ex)] +
|
||||||
fh[idx_fh_F_ord2(iF, jF + 1, kF, ex)]
|
fh[idx_fh_F_ord2(iF, jF + 1, kF, ex)]
|
||||||
);
|
);
|
||||||
|
|
||||||
fzz[p] = Sdzdz * (
|
fzz[p] = Sdzdz * (
|
||||||
fh[idx_fh_F_ord2(iF, jF, kF - 1, ex)] -
|
fh[idx_fh_F_ord2(iF, jF, kF - 1, ex)] -
|
||||||
TWO * fh[idx_fh_F_ord2(iF, jF, kF, ex)] +
|
TWO * fh[idx_fh_F_ord2(iF, jF, kF, ex)] +
|
||||||
fh[idx_fh_F_ord2(iF, jF, kF + 1, ex)]
|
fh[idx_fh_F_ord2(iF, jF, kF + 1, ex)]
|
||||||
);
|
);
|
||||||
|
|
||||||
fxy[p] = Sdxdy * (
|
fxy[p] = Sdxdy * (
|
||||||
fh[idx_fh_F_ord2(iF - 1, jF - 1, kF, ex)] -
|
fh[idx_fh_F_ord2(iF - 1, jF - 1, kF, ex)] -
|
||||||
fh[idx_fh_F_ord2(iF + 1, jF - 1, kF, ex)] -
|
fh[idx_fh_F_ord2(iF + 1, jF - 1, kF, ex)] -
|
||||||
fh[idx_fh_F_ord2(iF - 1, jF + 1, kF, ex)] +
|
fh[idx_fh_F_ord2(iF - 1, jF + 1, kF, ex)] +
|
||||||
fh[idx_fh_F_ord2(iF + 1, jF + 1, kF, ex)]
|
fh[idx_fh_F_ord2(iF + 1, jF + 1, kF, ex)]
|
||||||
);
|
);
|
||||||
|
|
||||||
fxz[p] = Sdxdz * (
|
fxz[p] = Sdxdz * (
|
||||||
fh[idx_fh_F_ord2(iF - 1, jF, kF - 1, ex)] -
|
fh[idx_fh_F_ord2(iF - 1, jF, kF - 1, ex)] -
|
||||||
fh[idx_fh_F_ord2(iF + 1, jF, kF - 1, ex)] -
|
fh[idx_fh_F_ord2(iF + 1, jF, kF - 1, ex)] -
|
||||||
fh[idx_fh_F_ord2(iF - 1, jF, kF + 1, ex)] +
|
fh[idx_fh_F_ord2(iF - 1, jF, kF + 1, ex)] +
|
||||||
fh[idx_fh_F_ord2(iF + 1, jF, kF + 1, ex)]
|
fh[idx_fh_F_ord2(iF + 1, jF, kF + 1, ex)]
|
||||||
);
|
);
|
||||||
|
|
||||||
fyz[p] = Sdydz * (
|
fyz[p] = Sdydz * (
|
||||||
fh[idx_fh_F_ord2(iF, jF - 1, kF - 1, ex)] -
|
fh[idx_fh_F_ord2(iF, jF - 1, kF - 1, ex)] -
|
||||||
fh[idx_fh_F_ord2(iF, jF + 1, kF - 1, ex)] -
|
fh[idx_fh_F_ord2(iF, jF + 1, kF - 1, ex)] -
|
||||||
@@ -207,126 +182,5 @@ void fdderivs(const int ex[3],
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (has4) {
|
|
||||||
for (int k0 = k4_lo; k0 <= k4_hi; ++k0) {
|
|
||||||
const int kF = k0 + 1;
|
|
||||||
for (int j0 = j4_lo; j0 <= j4_hi; ++j0) {
|
|
||||||
const int jF = j0 + 1;
|
|
||||||
for (int i0 = i4_lo; i0 <= i4_hi; ++i0) {
|
|
||||||
const int iF = i0 + 1;
|
|
||||||
const size_t p = idx_ex(i0, j0, k0, ex);
|
|
||||||
|
|
||||||
fxx[p] = Fdxdx * (
|
|
||||||
-fh[idx_fh_F_ord2(iF - 2, jF, kF, ex)] +
|
|
||||||
F16 * fh[idx_fh_F_ord2(iF - 1, jF, kF, ex)] -
|
|
||||||
F30 * fh[idx_fh_F_ord2(iF, jF, kF, ex)] -
|
|
||||||
fh[idx_fh_F_ord2(iF + 2, jF, kF, ex)] +
|
|
||||||
F16 * fh[idx_fh_F_ord2(iF + 1, jF, kF, ex)]
|
|
||||||
);
|
|
||||||
|
|
||||||
fyy[p] = Fdydy * (
|
|
||||||
-fh[idx_fh_F_ord2(iF, jF - 2, kF, ex)] +
|
|
||||||
F16 * fh[idx_fh_F_ord2(iF, jF - 1, kF, ex)] -
|
|
||||||
F30 * fh[idx_fh_F_ord2(iF, jF, kF, ex)] -
|
|
||||||
fh[idx_fh_F_ord2(iF, jF + 2, kF, ex)] +
|
|
||||||
F16 * fh[idx_fh_F_ord2(iF, jF + 1, kF, ex)]
|
|
||||||
);
|
|
||||||
|
|
||||||
fzz[p] = Fdzdz * (
|
|
||||||
-fh[idx_fh_F_ord2(iF, jF, kF - 2, ex)] +
|
|
||||||
F16 * fh[idx_fh_F_ord2(iF, jF, kF - 1, ex)] -
|
|
||||||
F30 * fh[idx_fh_F_ord2(iF, jF, kF, ex)] -
|
|
||||||
fh[idx_fh_F_ord2(iF, jF, kF + 2, ex)] +
|
|
||||||
F16 * fh[idx_fh_F_ord2(iF, jF, kF + 1, ex)]
|
|
||||||
);
|
|
||||||
|
|
||||||
{
|
|
||||||
const double t_jm2 =
|
|
||||||
( fh[idx_fh_F_ord2(iF - 2, jF - 2, kF, ex)]
|
|
||||||
-F8*fh[idx_fh_F_ord2(iF - 1, jF - 2, kF, ex)]
|
|
||||||
+F8*fh[idx_fh_F_ord2(iF + 1, jF - 2, kF, ex)]
|
|
||||||
- fh[idx_fh_F_ord2(iF + 2, jF - 2, kF, ex)] );
|
|
||||||
|
|
||||||
const double t_jm1 =
|
|
||||||
( fh[idx_fh_F_ord2(iF - 2, jF - 1, kF, ex)]
|
|
||||||
-F8*fh[idx_fh_F_ord2(iF - 1, jF - 1, kF, ex)]
|
|
||||||
+F8*fh[idx_fh_F_ord2(iF + 1, jF - 1, kF, ex)]
|
|
||||||
- fh[idx_fh_F_ord2(iF + 2, jF - 1, kF, ex)] );
|
|
||||||
|
|
||||||
const double t_jp1 =
|
|
||||||
( fh[idx_fh_F_ord2(iF - 2, jF + 1, kF, ex)]
|
|
||||||
-F8*fh[idx_fh_F_ord2(iF - 1, jF + 1, kF, ex)]
|
|
||||||
+F8*fh[idx_fh_F_ord2(iF + 1, jF + 1, kF, ex)]
|
|
||||||
- fh[idx_fh_F_ord2(iF + 2, jF + 1, kF, ex)] );
|
|
||||||
|
|
||||||
const double t_jp2 =
|
|
||||||
( fh[idx_fh_F_ord2(iF - 2, jF + 2, kF, ex)]
|
|
||||||
-F8*fh[idx_fh_F_ord2(iF - 1, jF + 2, kF, ex)]
|
|
||||||
+F8*fh[idx_fh_F_ord2(iF + 1, jF + 2, kF, ex)]
|
|
||||||
- fh[idx_fh_F_ord2(iF + 2, jF + 2, kF, ex)] );
|
|
||||||
|
|
||||||
fxy[p] = Fdxdy * ( t_jm2 - F8 * t_jm1 + F8 * t_jp1 - t_jp2 );
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
const double t_km2 =
|
|
||||||
( fh[idx_fh_F_ord2(iF - 2, jF, kF - 2, ex)]
|
|
||||||
-F8*fh[idx_fh_F_ord2(iF - 1, jF, kF - 2, ex)]
|
|
||||||
+F8*fh[idx_fh_F_ord2(iF + 1, jF, kF - 2, ex)]
|
|
||||||
- fh[idx_fh_F_ord2(iF + 2, jF, kF - 2, ex)] );
|
|
||||||
|
|
||||||
const double t_km1 =
|
|
||||||
( fh[idx_fh_F_ord2(iF - 2, jF, kF - 1, ex)]
|
|
||||||
-F8*fh[idx_fh_F_ord2(iF - 1, jF, kF - 1, ex)]
|
|
||||||
+F8*fh[idx_fh_F_ord2(iF + 1, jF, kF - 1, ex)]
|
|
||||||
- fh[idx_fh_F_ord2(iF + 2, jF, kF - 1, ex)] );
|
|
||||||
|
|
||||||
const double t_kp1 =
|
|
||||||
( fh[idx_fh_F_ord2(iF - 2, jF, kF + 1, ex)]
|
|
||||||
-F8*fh[idx_fh_F_ord2(iF - 1, jF, kF + 1, ex)]
|
|
||||||
+F8*fh[idx_fh_F_ord2(iF + 1, jF, kF + 1, ex)]
|
|
||||||
- fh[idx_fh_F_ord2(iF + 2, jF, kF + 1, ex)] );
|
|
||||||
|
|
||||||
const double t_kp2 =
|
|
||||||
( fh[idx_fh_F_ord2(iF - 2, jF, kF + 2, ex)]
|
|
||||||
-F8*fh[idx_fh_F_ord2(iF - 1, jF, kF + 2, ex)]
|
|
||||||
+F8*fh[idx_fh_F_ord2(iF + 1, jF, kF + 2, ex)]
|
|
||||||
- fh[idx_fh_F_ord2(iF + 2, jF, kF + 2, ex)] );
|
|
||||||
|
|
||||||
fxz[p] = Fdxdz * ( t_km2 - F8 * t_km1 + F8 * t_kp1 - t_kp2 );
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
const double t_km2 =
|
|
||||||
( fh[idx_fh_F_ord2(iF, jF - 2, kF - 2, ex)]
|
|
||||||
-F8*fh[idx_fh_F_ord2(iF, jF - 1, kF - 2, ex)]
|
|
||||||
+F8*fh[idx_fh_F_ord2(iF, jF + 1, kF - 2, ex)]
|
|
||||||
- fh[idx_fh_F_ord2(iF, jF + 2, kF - 2, ex)] );
|
|
||||||
|
|
||||||
const double t_km1 =
|
|
||||||
( fh[idx_fh_F_ord2(iF, jF - 2, kF - 1, ex)]
|
|
||||||
-F8*fh[idx_fh_F_ord2(iF, jF - 1, kF - 1, ex)]
|
|
||||||
+F8*fh[idx_fh_F_ord2(iF, jF + 1, kF - 1, ex)]
|
|
||||||
- fh[idx_fh_F_ord2(iF, jF + 2, kF - 1, ex)] );
|
|
||||||
|
|
||||||
const double t_kp1 =
|
|
||||||
( fh[idx_fh_F_ord2(iF, jF - 2, kF + 1, ex)]
|
|
||||||
-F8*fh[idx_fh_F_ord2(iF, jF - 1, kF + 1, ex)]
|
|
||||||
+F8*fh[idx_fh_F_ord2(iF, jF + 1, kF + 1, ex)]
|
|
||||||
- fh[idx_fh_F_ord2(iF, jF + 2, kF + 1, ex)] );
|
|
||||||
|
|
||||||
const double t_kp2 =
|
|
||||||
( fh[idx_fh_F_ord2(iF, jF - 2, kF + 2, ex)]
|
|
||||||
-F8*fh[idx_fh_F_ord2(iF, jF - 1, kF + 2, ex)]
|
|
||||||
+F8*fh[idx_fh_F_ord2(iF, jF + 1, kF + 2, ex)]
|
|
||||||
- fh[idx_fh_F_ord2(iF, jF + 2, kF + 2, ex)] );
|
|
||||||
|
|
||||||
fyz[p] = Fdydz * ( t_km2 - F8 * t_km1 + F8 * t_kp1 - t_kp2 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// free(fh);
|
// free(fh);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,46 +80,48 @@ void fderivs(const int ex[3],
|
|||||||
fz[p] = ZEO;
|
fz[p] = ZEO;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
// Match Fortran (ghost_width=3, "for bam comparison") exactly:
|
||||||
* 两段式:
|
// only compute when x/y/z all satisfy the same-order stencil at this point.
|
||||||
* 1) 先在二阶可用区域计算二阶模板
|
for (int k0 = 0; k0 <= ex3 - 2; ++k0) {
|
||||||
* 2) 再在高阶可用区域覆盖为四阶模板
|
|
||||||
*
|
|
||||||
* 与原 if/elseif 逻辑等价,但减少逐点分支判断。
|
|
||||||
*/
|
|
||||||
const int i2_lo = (iminF > 0) ? iminF : 0;
|
|
||||||
const int j2_lo = (jminF > 0) ? jminF : 0;
|
|
||||||
const int k2_lo = (kminF > 0) ? kminF : 0;
|
|
||||||
const int i2_hi = ex1 - 2;
|
|
||||||
const int j2_hi = ex2 - 2;
|
|
||||||
const int k2_hi = ex3 - 2;
|
|
||||||
|
|
||||||
const int i4_lo = (iminF + 1 > 0) ? (iminF + 1) : 0;
|
|
||||||
const int j4_lo = (jminF + 1 > 0) ? (jminF + 1) : 0;
|
|
||||||
const int k4_lo = (kminF + 1 > 0) ? (kminF + 1) : 0;
|
|
||||||
const int i4_hi = ex1 - 3;
|
|
||||||
const int j4_hi = ex2 - 3;
|
|
||||||
const int k4_hi = ex3 - 3;
|
|
||||||
|
|
||||||
if (i2_lo <= i2_hi && j2_lo <= j2_hi && k2_lo <= k2_hi) {
|
|
||||||
for (int k0 = k2_lo; k0 <= k2_hi; ++k0) {
|
|
||||||
const int kF = k0 + 1;
|
const int kF = k0 + 1;
|
||||||
for (int j0 = j2_lo; j0 <= j2_hi; ++j0) {
|
for (int j0 = 0; j0 <= ex2 - 2; ++j0) {
|
||||||
const int jF = j0 + 1;
|
const int jF = j0 + 1;
|
||||||
for (int i0 = i2_lo; i0 <= i2_hi; ++i0) {
|
for (int i0 = 0; i0 <= ex1 - 2; ++i0) {
|
||||||
const int iF = i0 + 1;
|
const int iF = i0 + 1;
|
||||||
const size_t p = idx_ex(i0, j0, k0, ex);
|
const size_t p = idx_ex(i0, j0, k0, ex);
|
||||||
|
|
||||||
|
if ((iF + 2 <= imaxF && iF - 2 >= iminF) &&
|
||||||
|
(jF + 2 <= jmaxF && jF - 2 >= jminF) &&
|
||||||
|
(kF + 2 <= kmaxF && kF - 2 >= kminF)) {
|
||||||
|
fx[p] = d12dx * (
|
||||||
|
fh[idx_fh_F_ord2(iF - 2, jF, kF, ex)] -
|
||||||
|
EIT * fh[idx_fh_F_ord2(iF - 1, jF, kF, ex)] +
|
||||||
|
EIT * fh[idx_fh_F_ord2(iF + 1, jF, kF, ex)] -
|
||||||
|
fh[idx_fh_F_ord2(iF + 2, jF, kF, ex)]
|
||||||
|
);
|
||||||
|
fy[p] = d12dy * (
|
||||||
|
fh[idx_fh_F_ord2(iF, jF - 2, kF, ex)] -
|
||||||
|
EIT * fh[idx_fh_F_ord2(iF, jF - 1, kF, ex)] +
|
||||||
|
EIT * fh[idx_fh_F_ord2(iF, jF + 1, kF, ex)] -
|
||||||
|
fh[idx_fh_F_ord2(iF, jF + 2, kF, ex)]
|
||||||
|
);
|
||||||
|
fz[p] = d12dz * (
|
||||||
|
fh[idx_fh_F_ord2(iF, jF, kF - 2, ex)] -
|
||||||
|
EIT * fh[idx_fh_F_ord2(iF, jF, kF - 1, ex)] +
|
||||||
|
EIT * fh[idx_fh_F_ord2(iF, jF, kF + 1, ex)] -
|
||||||
|
fh[idx_fh_F_ord2(iF, jF, kF + 2, ex)]
|
||||||
|
);
|
||||||
|
} else if ((iF + 1 <= imaxF && iF - 1 >= iminF) &&
|
||||||
|
(jF + 1 <= jmaxF && jF - 1 >= jminF) &&
|
||||||
|
(kF + 1 <= kmaxF && kF - 1 >= kminF)) {
|
||||||
fx[p] = d2dx * (
|
fx[p] = d2dx * (
|
||||||
-fh[idx_fh_F_ord2(iF - 1, jF, kF, ex)] +
|
-fh[idx_fh_F_ord2(iF - 1, jF, kF, ex)] +
|
||||||
fh[idx_fh_F_ord2(iF + 1, jF, kF, ex)]
|
fh[idx_fh_F_ord2(iF + 1, jF, kF, ex)]
|
||||||
);
|
);
|
||||||
|
|
||||||
fy[p] = d2dy * (
|
fy[p] = d2dy * (
|
||||||
-fh[idx_fh_F_ord2(iF, jF - 1, kF, ex)] +
|
-fh[idx_fh_F_ord2(iF, jF - 1, kF, ex)] +
|
||||||
fh[idx_fh_F_ord2(iF, jF + 1, kF, ex)]
|
fh[idx_fh_F_ord2(iF, jF + 1, kF, ex)]
|
||||||
);
|
);
|
||||||
|
|
||||||
fz[p] = d2dz * (
|
fz[p] = d2dz * (
|
||||||
-fh[idx_fh_F_ord2(iF, jF, kF - 1, ex)] +
|
-fh[idx_fh_F_ord2(iF, jF, kF - 1, ex)] +
|
||||||
fh[idx_fh_F_ord2(iF, jF, kF + 1, ex)]
|
fh[idx_fh_F_ord2(iF, jF, kF + 1, ex)]
|
||||||
@@ -129,39 +131,5 @@ void fderivs(const int ex[3],
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i4_lo <= i4_hi && j4_lo <= j4_hi && k4_lo <= k4_hi) {
|
|
||||||
for (int k0 = k4_lo; k0 <= k4_hi; ++k0) {
|
|
||||||
const int kF = k0 + 1;
|
|
||||||
for (int j0 = j4_lo; j0 <= j4_hi; ++j0) {
|
|
||||||
const int jF = j0 + 1;
|
|
||||||
for (int i0 = i4_lo; i0 <= i4_hi; ++i0) {
|
|
||||||
const int iF = i0 + 1;
|
|
||||||
const size_t p = idx_ex(i0, j0, k0, ex);
|
|
||||||
|
|
||||||
fx[p] = d12dx * (
|
|
||||||
fh[idx_fh_F_ord2(iF - 2, jF, kF, ex)] -
|
|
||||||
EIT * fh[idx_fh_F_ord2(iF - 1, jF, kF, ex)] +
|
|
||||||
EIT * fh[idx_fh_F_ord2(iF + 1, jF, kF, ex)] -
|
|
||||||
fh[idx_fh_F_ord2(iF + 2, jF, kF, ex)]
|
|
||||||
);
|
|
||||||
|
|
||||||
fy[p] = d12dy * (
|
|
||||||
fh[idx_fh_F_ord2(iF, jF - 2, kF, ex)] -
|
|
||||||
EIT * fh[idx_fh_F_ord2(iF, jF - 1, kF, ex)] +
|
|
||||||
EIT * fh[idx_fh_F_ord2(iF, jF + 1, kF, ex)] -
|
|
||||||
fh[idx_fh_F_ord2(iF, jF + 2, kF, ex)]
|
|
||||||
);
|
|
||||||
|
|
||||||
fz[p] = d12dz * (
|
|
||||||
fh[idx_fh_F_ord2(iF, jF, kF - 2, ex)] -
|
|
||||||
EIT * fh[idx_fh_F_ord2(iF, jF, kF - 1, ex)] +
|
|
||||||
EIT * fh[idx_fh_F_ord2(iF, jF, kF + 1, ex)] -
|
|
||||||
fh[idx_fh_F_ord2(iF, jF, kF + 2, ex)]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// free(fh);
|
// free(fh);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,12 +46,12 @@ endif
|
|||||||
## Kernel implementation switch
|
## Kernel implementation switch
|
||||||
## 1 (default) : use C++ rewrite of bssn_rhs and helper kernels (faster)
|
## 1 (default) : use C++ rewrite of bssn_rhs and helper kernels (faster)
|
||||||
## 0 : fall back to original Fortran kernels
|
## 0 : fall back to original Fortran kernels
|
||||||
USE_CXX_KERNELS ?= 1
|
USE_CXX_KERNELS ?= 0
|
||||||
|
|
||||||
## RK4 kernel implementation switch
|
## RK4 kernel implementation switch
|
||||||
## 1 (default) : use C/C++ rewrite of rungekutta4_rout (for optimization experiments)
|
## 1 (default) : use C/C++ rewrite of rungekutta4_rout (for optimization experiments)
|
||||||
## 0 : use original Fortran rungekutta4_rout.o
|
## 0 : use original Fortran rungekutta4_rout.o
|
||||||
USE_CXX_RK4 ?= 1
|
USE_CXX_RK4 ?= 0
|
||||||
|
|
||||||
f90 = ifx
|
f90 = ifx
|
||||||
f77 = ifx
|
f77 = ifx
|
||||||
|
|||||||
Reference in New Issue
Block a user