优化 compute_rhs_bssn 热点路径并加入 NaN 检查开关
- 用 DEBUG_NAN_CHECK 宏按需启用 NaN 检查,并在输入/宏生成器中新增 Debug_NaN_Check 配置 - 逆度量改为先求行列式再乘法展开,减少除法;并在 Gam^i/Christoffel 处提取公共子表达式 - 预置批量 fderivs 辅助例程,便于后续矢量化/合并导数计算 - 将默认 MPI_processes 调整为 8 变更涉及: - AMSS_NCKU_source/bssn_rhs.f90 - generate_macrodef.py - AMSS_NCKU_Input.py - AMSS_NCKU_Input_Mini.py - inputfile_example/AMSS_NCKU_Input.py - AMSS_NCKU_source/diff_new.f90 TODO: fmisc.f90 polint()
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -1939,6 +1939,309 @@
|
||||
return
|
||||
|
||||
end subroutine fddyz
|
||||
subroutine fderivs_batch4(ex,f1,f2,f3,f4, &
|
||||
f1x,f1y,f1z,f2x,f2y,f2z,f3x,f3y,f3z,f4x,f4y,f4z, &
|
||||
X,Y,Z,SYM1,SYM2,SYM3,symmetry,onoff)
|
||||
implicit none
|
||||
|
||||
integer, intent(in ):: ex(1:3),symmetry,onoff
|
||||
real*8, dimension(ex(1),ex(2),ex(3)), intent(in ):: f1,f2,f3,f4
|
||||
real*8, dimension(ex(1),ex(2),ex(3)), intent(out):: f1x,f1y,f1z
|
||||
real*8, dimension(ex(1),ex(2),ex(3)), intent(out):: f2x,f2y,f2z
|
||||
real*8, dimension(ex(1),ex(2),ex(3)), intent(out):: f3x,f3y,f3z
|
||||
real*8, dimension(ex(1),ex(2),ex(3)), intent(out):: f4x,f4y,f4z
|
||||
real*8, intent(in) :: X(ex(1)),Y(ex(2)),Z(ex(3))
|
||||
real*8, intent(in ):: SYM1,SYM2,SYM3
|
||||
|
||||
!~~~~~~ other variables
|
||||
|
||||
real*8 :: dX,dY,dZ
|
||||
real*8,dimension(-1:ex(1),-1:ex(2),-1:ex(3)) :: fh1,fh2,fh3,fh4
|
||||
real*8, dimension(3) :: SoA
|
||||
integer :: imin,jmin,kmin,imax,jmax,kmax,i,j,k
|
||||
real*8 :: d12dx,d12dy,d12dz,d2dx,d2dy,d2dz
|
||||
integer, parameter :: NO_SYMM = 0, EQ_SYMM = 1, OCTANT = 2
|
||||
real*8, parameter :: ZEO=0.d0,ONE=1.d0
|
||||
real*8, parameter :: TWO=2.d0,EIT=8.d0
|
||||
real*8, parameter :: F12=1.2d1
|
||||
|
||||
dX = X(2)-X(1)
|
||||
dY = Y(2)-Y(1)
|
||||
dZ = Z(2)-Z(1)
|
||||
|
||||
imax = ex(1)
|
||||
jmax = ex(2)
|
||||
kmax = ex(3)
|
||||
|
||||
imin = 1
|
||||
jmin = 1
|
||||
kmin = 1
|
||||
if(Symmetry > NO_SYMM .and. dabs(Z(1)) < dZ) kmin = -1
|
||||
if(Symmetry > EQ_SYMM .and. dabs(X(1)) < dX) imin = -1
|
||||
if(Symmetry > EQ_SYMM .and. dabs(Y(1)) < dY) jmin = -1
|
||||
|
||||
SoA(1) = SYM1
|
||||
SoA(2) = SYM2
|
||||
SoA(3) = SYM3
|
||||
|
||||
call symmetry_bd(2,ex,f1,fh1,SoA)
|
||||
call symmetry_bd(2,ex,f2,fh2,SoA)
|
||||
call symmetry_bd(2,ex,f3,fh3,SoA)
|
||||
call symmetry_bd(2,ex,f4,fh4,SoA)
|
||||
|
||||
d12dx = ONE/F12/dX
|
||||
d12dy = ONE/F12/dY
|
||||
d12dz = ONE/F12/dZ
|
||||
|
||||
d2dx = ONE/TWO/dX
|
||||
d2dy = ONE/TWO/dY
|
||||
d2dz = ONE/TWO/dZ
|
||||
|
||||
f1x = ZEO; f1y = ZEO; f1z = ZEO
|
||||
f2x = ZEO; f2y = ZEO; f2z = ZEO
|
||||
f3x = ZEO; f3y = ZEO; f3z = ZEO
|
||||
f4x = ZEO; f4y = ZEO; f4z = ZEO
|
||||
|
||||
do k=1,ex(3)-1
|
||||
do j=1,ex(2)-1
|
||||
do i=1,ex(1)-1
|
||||
if(i+2 <= imax .and. i-2 >= imin .and. &
|
||||
j+2 <= jmax .and. j-2 >= jmin .and. &
|
||||
k+2 <= kmax .and. k-2 >= kmin) then
|
||||
f1x(i,j,k)=d12dx*(fh1(i-2,j,k)-EIT*fh1(i-1,j,k)+EIT*fh1(i+1,j,k)-fh1(i+2,j,k))
|
||||
f1y(i,j,k)=d12dy*(fh1(i,j-2,k)-EIT*fh1(i,j-1,k)+EIT*fh1(i,j+1,k)-fh1(i,j+2,k))
|
||||
f1z(i,j,k)=d12dz*(fh1(i,j,k-2)-EIT*fh1(i,j,k-1)+EIT*fh1(i,j,k+1)-fh1(i,j,k+2))
|
||||
|
||||
f2x(i,j,k)=d12dx*(fh2(i-2,j,k)-EIT*fh2(i-1,j,k)+EIT*fh2(i+1,j,k)-fh2(i+2,j,k))
|
||||
f2y(i,j,k)=d12dy*(fh2(i,j-2,k)-EIT*fh2(i,j-1,k)+EIT*fh2(i,j+1,k)-fh2(i,j+2,k))
|
||||
f2z(i,j,k)=d12dz*(fh2(i,j,k-2)-EIT*fh2(i,j,k-1)+EIT*fh2(i,j,k+1)-fh2(i,j,k+2))
|
||||
|
||||
f3x(i,j,k)=d12dx*(fh3(i-2,j,k)-EIT*fh3(i-1,j,k)+EIT*fh3(i+1,j,k)-fh3(i+2,j,k))
|
||||
f3y(i,j,k)=d12dy*(fh3(i,j-2,k)-EIT*fh3(i,j-1,k)+EIT*fh3(i,j+1,k)-fh3(i,j+2,k))
|
||||
f3z(i,j,k)=d12dz*(fh3(i,j,k-2)-EIT*fh3(i,j,k-1)+EIT*fh3(i,j,k+1)-fh3(i,j,k+2))
|
||||
|
||||
f4x(i,j,k)=d12dx*(fh4(i-2,j,k)-EIT*fh4(i-1,j,k)+EIT*fh4(i+1,j,k)-fh4(i+2,j,k))
|
||||
f4y(i,j,k)=d12dy*(fh4(i,j-2,k)-EIT*fh4(i,j-1,k)+EIT*fh4(i,j+1,k)-fh4(i,j+2,k))
|
||||
f4z(i,j,k)=d12dz*(fh4(i,j,k-2)-EIT*fh4(i,j,k-1)+EIT*fh4(i,j,k+1)-fh4(i,j,k+2))
|
||||
elseif(i+1 <= imax .and. i-1 >= imin .and. &
|
||||
j+1 <= jmax .and. j-1 >= jmin .and. &
|
||||
k+1 <= kmax .and. k-1 >= kmin) then
|
||||
f1x(i,j,k)=d2dx*(-fh1(i-1,j,k)+fh1(i+1,j,k))
|
||||
f1y(i,j,k)=d2dy*(-fh1(i,j-1,k)+fh1(i,j+1,k))
|
||||
f1z(i,j,k)=d2dz*(-fh1(i,j,k-1)+fh1(i,j,k+1))
|
||||
|
||||
f2x(i,j,k)=d2dx*(-fh2(i-1,j,k)+fh2(i+1,j,k))
|
||||
f2y(i,j,k)=d2dy*(-fh2(i,j-1,k)+fh2(i,j+1,k))
|
||||
f2z(i,j,k)=d2dz*(-fh2(i,j,k-1)+fh2(i,j,k+1))
|
||||
|
||||
f3x(i,j,k)=d2dx*(-fh3(i-1,j,k)+fh3(i+1,j,k))
|
||||
f3y(i,j,k)=d2dy*(-fh3(i,j-1,k)+fh3(i,j+1,k))
|
||||
f3z(i,j,k)=d2dz*(-fh3(i,j,k-1)+fh3(i,j,k+1))
|
||||
|
||||
f4x(i,j,k)=d2dx*(-fh4(i-1,j,k)+fh4(i+1,j,k))
|
||||
f4y(i,j,k)=d2dy*(-fh4(i,j-1,k)+fh4(i,j+1,k))
|
||||
f4z(i,j,k)=d2dz*(-fh4(i,j,k-1)+fh4(i,j,k+1))
|
||||
endif
|
||||
enddo
|
||||
enddo
|
||||
enddo
|
||||
|
||||
return
|
||||
|
||||
end subroutine fderivs_batch4
|
||||
!-----------------------------------------------------------------------------
|
||||
! batch first derivatives (3 fields), same symmetry setup
|
||||
!-----------------------------------------------------------------------------
|
||||
subroutine fderivs_batch3(ex,f1,f2,f3, &
|
||||
f1x,f1y,f1z,f2x,f2y,f2z,f3x,f3y,f3z, &
|
||||
X,Y,Z,SYM1,SYM2,SYM3,symmetry,onoff)
|
||||
implicit none
|
||||
|
||||
integer, intent(in ):: ex(1:3),symmetry,onoff
|
||||
real*8, dimension(ex(1),ex(2),ex(3)), intent(in ):: f1,f2,f3
|
||||
real*8, dimension(ex(1),ex(2),ex(3)), intent(out):: f1x,f1y,f1z
|
||||
real*8, dimension(ex(1),ex(2),ex(3)), intent(out):: f2x,f2y,f2z
|
||||
real*8, dimension(ex(1),ex(2),ex(3)), intent(out):: f3x,f3y,f3z
|
||||
real*8, intent(in) :: X(ex(1)),Y(ex(2)),Z(ex(3))
|
||||
real*8, intent(in ):: SYM1,SYM2,SYM3
|
||||
|
||||
!~~~~~~ other variables
|
||||
|
||||
real*8 :: dX,dY,dZ
|
||||
real*8,dimension(-1:ex(1),-1:ex(2),-1:ex(3)) :: fh1,fh2,fh3
|
||||
real*8, dimension(3) :: SoA
|
||||
integer :: imin,jmin,kmin,imax,jmax,kmax,i,j,k
|
||||
real*8 :: d12dx,d12dy,d12dz,d2dx,d2dy,d2dz
|
||||
integer, parameter :: NO_SYMM = 0, EQ_SYMM = 1, OCTANT = 2
|
||||
real*8, parameter :: ZEO=0.d0,ONE=1.d0
|
||||
real*8, parameter :: TWO=2.d0,EIT=8.d0
|
||||
real*8, parameter :: F12=1.2d1
|
||||
|
||||
dX = X(2)-X(1)
|
||||
dY = Y(2)-Y(1)
|
||||
dZ = Z(2)-Z(1)
|
||||
|
||||
imax = ex(1)
|
||||
jmax = ex(2)
|
||||
kmax = ex(3)
|
||||
|
||||
imin = 1
|
||||
jmin = 1
|
||||
kmin = 1
|
||||
if(Symmetry > NO_SYMM .and. dabs(Z(1)) < dZ) kmin = -1
|
||||
if(Symmetry > EQ_SYMM .and. dabs(X(1)) < dX) imin = -1
|
||||
if(Symmetry > EQ_SYMM .and. dabs(Y(1)) < dY) jmin = -1
|
||||
|
||||
SoA(1) = SYM1
|
||||
SoA(2) = SYM2
|
||||
SoA(3) = SYM3
|
||||
|
||||
call symmetry_bd(2,ex,f1,fh1,SoA)
|
||||
call symmetry_bd(2,ex,f2,fh2,SoA)
|
||||
call symmetry_bd(2,ex,f3,fh3,SoA)
|
||||
|
||||
d12dx = ONE/F12/dX
|
||||
d12dy = ONE/F12/dY
|
||||
d12dz = ONE/F12/dZ
|
||||
|
||||
d2dx = ONE/TWO/dX
|
||||
d2dy = ONE/TWO/dY
|
||||
d2dz = ONE/TWO/dZ
|
||||
|
||||
f1x = ZEO; f1y = ZEO; f1z = ZEO
|
||||
f2x = ZEO; f2y = ZEO; f2z = ZEO
|
||||
f3x = ZEO; f3y = ZEO; f3z = ZEO
|
||||
|
||||
do k=1,ex(3)-1
|
||||
do j=1,ex(2)-1
|
||||
do i=1,ex(1)-1
|
||||
if(i+2 <= imax .and. i-2 >= imin .and. &
|
||||
j+2 <= jmax .and. j-2 >= jmin .and. &
|
||||
k+2 <= kmax .and. k-2 >= kmin) then
|
||||
f1x(i,j,k)=d12dx*(fh1(i-2,j,k)-EIT*fh1(i-1,j,k)+EIT*fh1(i+1,j,k)-fh1(i+2,j,k))
|
||||
f1y(i,j,k)=d12dy*(fh1(i,j-2,k)-EIT*fh1(i,j-1,k)+EIT*fh1(i,j+1,k)-fh1(i,j+2,k))
|
||||
f1z(i,j,k)=d12dz*(fh1(i,j,k-2)-EIT*fh1(i,j,k-1)+EIT*fh1(i,j,k+1)-fh1(i,j,k+2))
|
||||
|
||||
f2x(i,j,k)=d12dx*(fh2(i-2,j,k)-EIT*fh2(i-1,j,k)+EIT*fh2(i+1,j,k)-fh2(i+2,j,k))
|
||||
f2y(i,j,k)=d12dy*(fh2(i,j-2,k)-EIT*fh2(i,j-1,k)+EIT*fh2(i,j+1,k)-fh2(i,j+2,k))
|
||||
f2z(i,j,k)=d12dz*(fh2(i,j,k-2)-EIT*fh2(i,j,k-1)+EIT*fh2(i,j,k+1)-fh2(i,j,k+2))
|
||||
|
||||
f3x(i,j,k)=d12dx*(fh3(i-2,j,k)-EIT*fh3(i-1,j,k)+EIT*fh3(i+1,j,k)-fh3(i+2,j,k))
|
||||
f3y(i,j,k)=d12dy*(fh3(i,j-2,k)-EIT*fh3(i,j-1,k)+EIT*fh3(i,j+1,k)-fh3(i,j+2,k))
|
||||
f3z(i,j,k)=d12dz*(fh3(i,j,k-2)-EIT*fh3(i,j,k-1)+EIT*fh3(i,j,k+1)-fh3(i,j,k+2))
|
||||
elseif(i+1 <= imax .and. i-1 >= imin .and. &
|
||||
j+1 <= jmax .and. j-1 >= jmin .and. &
|
||||
k+1 <= kmax .and. k-1 >= kmin) then
|
||||
f1x(i,j,k)=d2dx*(-fh1(i-1,j,k)+fh1(i+1,j,k))
|
||||
f1y(i,j,k)=d2dy*(-fh1(i,j-1,k)+fh1(i,j+1,k))
|
||||
f1z(i,j,k)=d2dz*(-fh1(i,j,k-1)+fh1(i,j,k+1))
|
||||
|
||||
f2x(i,j,k)=d2dx*(-fh2(i-1,j,k)+fh2(i+1,j,k))
|
||||
f2y(i,j,k)=d2dy*(-fh2(i,j-1,k)+fh2(i,j+1,k))
|
||||
f2z(i,j,k)=d2dz*(-fh2(i,j,k-1)+fh2(i,j,k+1))
|
||||
|
||||
f3x(i,j,k)=d2dx*(-fh3(i-1,j,k)+fh3(i+1,j,k))
|
||||
f3y(i,j,k)=d2dy*(-fh3(i,j-1,k)+fh3(i,j+1,k))
|
||||
f3z(i,j,k)=d2dz*(-fh3(i,j,k-1)+fh3(i,j,k+1))
|
||||
endif
|
||||
enddo
|
||||
enddo
|
||||
enddo
|
||||
|
||||
return
|
||||
|
||||
end subroutine fderivs_batch3
|
||||
!-----------------------------------------------------------------------------
|
||||
! batch first derivatives (2 fields), same symmetry setup
|
||||
!-----------------------------------------------------------------------------
|
||||
subroutine fderivs_batch2(ex,f1,f2, &
|
||||
f1x,f1y,f1z,f2x,f2y,f2z, &
|
||||
X,Y,Z,SYM1,SYM2,SYM3,symmetry,onoff)
|
||||
implicit none
|
||||
|
||||
integer, intent(in ):: ex(1:3),symmetry,onoff
|
||||
real*8, dimension(ex(1),ex(2),ex(3)), intent(in ):: f1,f2
|
||||
real*8, dimension(ex(1),ex(2),ex(3)), intent(out):: f1x,f1y,f1z
|
||||
real*8, dimension(ex(1),ex(2),ex(3)), intent(out):: f2x,f2y,f2z
|
||||
real*8, intent(in) :: X(ex(1)),Y(ex(2)),Z(ex(3))
|
||||
real*8, intent(in ):: SYM1,SYM2,SYM3
|
||||
|
||||
!~~~~~~ other variables
|
||||
|
||||
real*8 :: dX,dY,dZ
|
||||
real*8,dimension(-1:ex(1),-1:ex(2),-1:ex(3)) :: fh1,fh2
|
||||
real*8, dimension(3) :: SoA
|
||||
integer :: imin,jmin,kmin,imax,jmax,kmax,i,j,k
|
||||
real*8 :: d12dx,d12dy,d12dz,d2dx,d2dy,d2dz
|
||||
integer, parameter :: NO_SYMM = 0, EQ_SYMM = 1, OCTANT = 2
|
||||
real*8, parameter :: ZEO=0.d0,ONE=1.d0
|
||||
real*8, parameter :: TWO=2.d0,EIT=8.d0
|
||||
real*8, parameter :: F12=1.2d1
|
||||
|
||||
dX = X(2)-X(1)
|
||||
dY = Y(2)-Y(1)
|
||||
dZ = Z(2)-Z(1)
|
||||
|
||||
imax = ex(1)
|
||||
jmax = ex(2)
|
||||
kmax = ex(3)
|
||||
|
||||
imin = 1
|
||||
jmin = 1
|
||||
kmin = 1
|
||||
if(Symmetry > NO_SYMM .and. dabs(Z(1)) < dZ) kmin = -1
|
||||
if(Symmetry > EQ_SYMM .and. dabs(X(1)) < dX) imin = -1
|
||||
if(Symmetry > EQ_SYMM .and. dabs(Y(1)) < dY) jmin = -1
|
||||
|
||||
SoA(1) = SYM1
|
||||
SoA(2) = SYM2
|
||||
SoA(3) = SYM3
|
||||
|
||||
call symmetry_bd(2,ex,f1,fh1,SoA)
|
||||
call symmetry_bd(2,ex,f2,fh2,SoA)
|
||||
|
||||
d12dx = ONE/F12/dX
|
||||
d12dy = ONE/F12/dY
|
||||
d12dz = ONE/F12/dZ
|
||||
|
||||
d2dx = ONE/TWO/dX
|
||||
d2dy = ONE/TWO/dY
|
||||
d2dz = ONE/TWO/dZ
|
||||
|
||||
f1x = ZEO; f1y = ZEO; f1z = ZEO
|
||||
f2x = ZEO; f2y = ZEO; f2z = ZEO
|
||||
|
||||
do k=1,ex(3)-1
|
||||
do j=1,ex(2)-1
|
||||
do i=1,ex(1)-1
|
||||
if(i+2 <= imax .and. i-2 >= imin .and. &
|
||||
j+2 <= jmax .and. j-2 >= jmin .and. &
|
||||
k+2 <= kmax .and. k-2 >= kmin) then
|
||||
f1x(i,j,k)=d12dx*(fh1(i-2,j,k)-EIT*fh1(i-1,j,k)+EIT*fh1(i+1,j,k)-fh1(i+2,j,k))
|
||||
f1y(i,j,k)=d12dy*(fh1(i,j-2,k)-EIT*fh1(i,j-1,k)+EIT*fh1(i,j+1,k)-fh1(i,j+2,k))
|
||||
f1z(i,j,k)=d12dz*(fh1(i,j,k-2)-EIT*fh1(i,j,k-1)+EIT*fh1(i,j,k+1)-fh1(i,j,k+2))
|
||||
|
||||
f2x(i,j,k)=d12dx*(fh2(i-2,j,k)-EIT*fh2(i-1,j,k)+EIT*fh2(i+1,j,k)-fh2(i+2,j,k))
|
||||
f2y(i,j,k)=d12dy*(fh2(i,j-2,k)-EIT*fh2(i,j-1,k)+EIT*fh2(i,j+1,k)-fh2(i,j+2,k))
|
||||
f2z(i,j,k)=d12dz*(fh2(i,j,k-2)-EIT*fh2(i,j,k-1)+EIT*fh2(i,j,k+1)-fh2(i,j,k+2))
|
||||
elseif(i+1 <= imax .and. i-1 >= imin .and. &
|
||||
j+1 <= jmax .and. j-1 >= jmin .and. &
|
||||
k+1 <= kmax .and. k-1 >= kmin) then
|
||||
f1x(i,j,k)=d2dx*(-fh1(i-1,j,k)+fh1(i+1,j,k))
|
||||
f1y(i,j,k)=d2dy*(-fh1(i,j-1,k)+fh1(i,j+1,k))
|
||||
f1z(i,j,k)=d2dz*(-fh1(i,j,k-1)+fh1(i,j,k+1))
|
||||
|
||||
f2x(i,j,k)=d2dx*(-fh2(i-1,j,k)+fh2(i+1,j,k))
|
||||
f2y(i,j,k)=d2dy*(-fh2(i,j-1,k)+fh2(i,j+1,k))
|
||||
f2z(i,j,k)=d2dz*(-fh2(i,j,k-1)+fh2(i,j,k+1))
|
||||
endif
|
||||
enddo
|
||||
enddo
|
||||
enddo
|
||||
|
||||
return
|
||||
|
||||
end subroutine fderivs_batch2
|
||||
|
||||
#elif (ghost_width == 4)
|
||||
! sixth order code
|
||||
@@ -2077,6 +2380,9 @@
|
||||
|
||||
end subroutine fderivs
|
||||
!-----------------------------------------------------------------------------
|
||||
! batch first derivatives (4 fields), same symmetry setup
|
||||
!-----------------------------------------------------------------------------
|
||||
!-----------------------------------------------------------------------------
|
||||
!
|
||||
! single derivatives dx
|
||||
!
|
||||
|
||||
Reference in New Issue
Block a user