From 8010ad27edd04adbaa81708b83725430d8370f42 Mon Sep 17 00:00:00 2001 From: CGH0S7 <776459475@qq.com> Date: Sat, 28 Feb 2026 13:04:21 +0800 Subject: [PATCH] =?UTF-8?q?kodiss=5Fc:=20=E6=94=B6=E7=B4=A7=E5=BE=AA?= =?UTF-8?q?=E7=8E=AF=E8=8C=83=E5=9B=B4=E6=B6=88=E9=99=A4=E8=BE=B9=E7=95=8C?= =?UTF-8?q?=E6=97=A0=E7=94=A8=E8=BF=AD=E4=BB=A3=E5=92=8C=E5=88=86=E6=94=AF?= =?UTF-8?q?=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 (1M context) --- AMSS_NCKU_source/kodiss_c.C | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) 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); - } } } }