fix prolong/restrict index bounds after cherry-pick 12e1f63

This commit is contained in:
2026-03-02 13:59:47 +08:00
parent 61ccef9f97
commit 466b084a58

View File

@@ -1956,11 +1956,11 @@
real*8,dimension(3) :: CD,FD real*8,dimension(3) :: CD,FD
real*8 :: tmp_yz(extc(1), 6) ! 存储整条 X 线上 6 个 Y 轴偏置的 Z 向插值结果 real*8 :: tmp_yz(extc(1), 6) ! 存储整条 X 线上 6 个 Y 轴偏置的 Z 向插值结果
real*8 :: tmp_xyz_line(extc(1)) ! 存储整条 X 线上完成 Y 向融合后的结果 real*8 :: tmp_xyz_line(-2:extc(1)) ! 包含 X 向 6 点模板访问所需下界
real*8 :: v1, v2, v3, v4, v5, v6 real*8 :: v1, v2, v3, v4, v5, v6
integer :: ic, jc, kc, ix_offset,ix,iy,iz,jc_min,jc_max integer :: ic, jc, kc, ix_offset,ix,iy,iz,jc_min,jc_max,ic_min,ic_max
real*8 :: res_line real*8 :: res_line
real*8 :: tmp_z_slab(extc(1), extc(2)) ! 分配在 k 循环外 real*8 :: tmp_z_slab(-2:extc(1), -2:extc(2)) ! 包含 Y/X 向模板访问所需下界
if(wei.ne.3)then if(wei.ne.3)then
write(*,*)"prolongrestrict.f90::prolong3: this routine only surport 3 dimension" write(*,*)"prolongrestrict.f90::prolong3: this routine only surport 3 dimension"
write(*,*)"dim = ",wei write(*,*)"dim = ",wei
@@ -2073,24 +2073,26 @@
call symmetry_bd(3,extc,func,funcc,SoA) call symmetry_bd(3,extc,func,funcc,SoA)
! 对每个 kpz, kc 固定)预计算 Z 向插值的 2D 切片 ! 对每个 kpz, kc 固定)预计算 Z 向插值的 2D 切片
jc_min = minval(ciy(jmino:jmaxo)) jc_min = minval(ciy(jmino:jmaxo))
jc_max = maxval(ciy(jmino:jmaxo)) jc_max = maxval(ciy(jmino:jmaxo))
ic_min = minval(cix(imino:imaxo))
do k = kmino, kmaxo ic_max = maxval(cix(imino:imaxo))
pz = piz(k); kc = ciz(k)
! --- Pass 1: Z 方向,只算一次 --- do k = kmino, kmaxo
do iy = jc_min-3, jc_max+3 ! 仅需的 iy 范围 pz = piz(k); kc = ciz(k)
do ii = imini-3, imaxi+3 ! 仅需的 ii 范围 ! --- Pass 1: Z 方向,只算一次 ---
tmp_z_slab(ii, iy) = sum(WC(:,pz) * funcc(ii, iy, kc-2:kc+3)) do iy = jc_min-2, jc_max+3 ! 仅需的 iy 范围(对应 jc-2:jc+3
end do do ii = ic_min-2, ic_max+3 ! 仅需的 ii 范围(对应 cix-2:cix+3
end do tmp_z_slab(ii, iy) = sum(WC(:,pz) * funcc(ii, iy, kc-2:kc+3))
end do
do j = jmino, jmaxo end do
py = piy(j); jc = ciy(j)
! --- Pass 2: Y 方向 --- do j = jmino, jmaxo
do ii = imini-3, imaxi+3 py = piy(j); jc = ciy(j)
tmp_xyz_line(ii) = sum(WC(:,py) * tmp_z_slab(ii, jc-2:jc+3)) ! --- Pass 2: Y 方向 ---
end do do ii = ic_min-2, ic_max+3
tmp_xyz_line(ii) = sum(WC(:,py) * tmp_z_slab(ii, jc-2:jc+3))
end do
! --- Pass 3: X 方向 --- ! --- Pass 3: X 方向 ---
do i = imino, imaxo do i = imino, imaxo
funf(i,j,k) = sum(WC(:,pix(i)) * tmp_xyz_line(cix(i)-2:cix(i)+3)) funf(i,j,k) = sum(WC(:,pix(i)) * tmp_xyz_line(cix(i)-2:cix(i)+3))
@@ -2351,8 +2353,8 @@ end do
real*8,dimension(3) :: CD,FD real*8,dimension(3) :: CD,FD
real*8 :: tmp_xz_plane(extf(1), 6) real*8 :: tmp_xz_plane(-1:extf(1), 6)
real*8 :: tmp_x_line(extf(1)) real*8 :: tmp_x_line(-1:extf(1))
integer :: fi, fj, fk, ii, jj, kk integer :: fi, fj, fk, ii, jj, kk
if(wei.ne.3)then if(wei.ne.3)then
@@ -2445,7 +2447,7 @@ do k = kmino, kmaxo
! 优化点 1: 显式展开 Z 方向计算,减少循环开销 ! 优化点 1: 显式展开 Z 方向计算,减少循环开销
! 确保 ii 循环是最内层且连续访问 ! 确保 ii 循环是最内层且连续访问
!DIR$ VECTOR ALWAYS !DIR$ VECTOR ALWAYS
do ii = 1, extf(1) do ii = -1, extf(1)
! 预计算当前 j 对应的 6 行在 Z 方向的压缩结果 ! 预计算当前 j 对应的 6 行在 Z 方向的压缩结果
! 这里直接硬编码 jj 的偏移,彻底消除一层循环 ! 这里直接硬编码 jj 的偏移,彻底消除一层循环
tmp_xz_plane(ii, 1) = C1*(funff(ii,fj-2,fk-2)+funff(ii,fj-2,fk+3)) + & tmp_xz_plane(ii, 1) = C1*(funff(ii,fj-2,fk-2)+funff(ii,fj-2,fk+3)) + &
@@ -2470,7 +2472,7 @@ do k = kmino, kmaxo
! 优化点 2: 同样向量化 Y 方向压缩 ! 优化点 2: 同样向量化 Y 方向压缩
!DIR$ VECTOR ALWAYS !DIR$ VECTOR ALWAYS
do ii = 1, extf(1) do ii = -1, extf(1)
tmp_x_line(ii) = C1*(tmp_xz_plane(ii, 1) + tmp_xz_plane(ii, 6)) + & tmp_x_line(ii) = C1*(tmp_xz_plane(ii, 1) + tmp_xz_plane(ii, 6)) + &
C2*(tmp_xz_plane(ii, 2) + tmp_xz_plane(ii, 5)) + & C2*(tmp_xz_plane(ii, 2) + tmp_xz_plane(ii, 5)) + &
C3*(tmp_xz_plane(ii, 3) + tmp_xz_plane(ii, 4)) C3*(tmp_xz_plane(ii, 3) + tmp_xz_plane(ii, 4))