diff --git a/AMSS_NCKU_source/kodiss_c.C b/AMSS_NCKU_source/kodiss_c.C index 2a04abe..36f80ef 100644 --- a/AMSS_NCKU_source/kodiss_c.C +++ b/AMSS_NCKU_source/kodiss_c.C @@ -63,19 +63,28 @@ void kodis(const int ex[3], * C: k0=0..ex3-1, j0=0..ex2-1, i0=0..ex1-1 * 并定义 Fortran index: iF=i0+1, ... */ - for (int k0 = 0; k0 < ex3; ++k0) { + // 收紧循环范围:只遍历满足 iF±3/jF±3/kF±3 条件的内部点 + // iF-3 >= iminF => iF >= iminF+3 => i0 >= iminF+2 (因为 iF=i0+1) + // iF+3 <= imaxF => iF <= imaxF-3 => i0 <= imaxF-4 + const int i0_lo = (iminF + 2 > 0) ? iminF + 2 : 0; + const int j0_lo = (jminF + 2 > 0) ? jminF + 2 : 0; + const int k0_lo = (kminF + 2 > 0) ? kminF + 2 : 0; + const int i0_hi = imaxF - 4; // inclusive + const int j0_hi = jmaxF - 4; + const int k0_hi = kmaxF - 4; + + if (i0_lo > i0_hi || j0_lo > j0_hi || k0_lo > k0_hi) { + free(fh); + return; + } + + for (int k0 = k0_lo; k0 <= k0_hi; ++k0) { const int kF = k0 + 1; - for (int j0 = 0; j0 < ex2; ++j0) { + for (int j0 = j0_lo; j0 <= j0_hi; ++j0) { const int jF = j0 + 1; - for (int i0 = 0; i0 < ex1; ++i0) { + for (int i0 = i0_lo; i0 <= i0_hi; ++i0) { const int iF = i0 + 1; - // Fortran if 条件: - // i-3 >= imin .and. i+3 <= imax 等(都是 Fortran 索引) - if ((iF - 3) >= iminF && (iF + 3) <= imaxF && - (jF - 3) >= jminF && (jF + 3) <= jmaxF && - (kF - 3) >= kminF && (kF + 3) <= kmaxF) - { const size_t p = idx_ex(i0, j0, k0, ex); // 三个方向各一份同型的 7 点组合(实际上是对称的 6th-order dissipation/filter 核) @@ -100,7 +109,6 @@ void kodis(const int ex[3], // Fortran: // f_rhs(i,j,k) = f_rhs(i,j,k) + eps/cof*(Dx_term + Dy_term + Dz_term) f_rhs[p] += (eps / cof) * (Dx_term + Dy_term + Dz_term); - } } } }