250 lines
9.6 KiB
Fortran
250 lines
9.6 KiB
Fortran
|
|
! Compute advection terms in right hand sides of field equations
|
|
|
|
#include "macrodef.fh"
|
|
|
|
! we need only distinguish different finite difference order
|
|
! Vertex or Cell is distinguished in routine symmetry_bd which locates in
|
|
! file "fmisc.f90"
|
|
|
|
|
|
! fourth order code
|
|
|
|
!-----------------------------------------------------------------------------
|
|
!
|
|
! Compute advection terms in right hand sides of field equations
|
|
! v
|
|
! D f = ------[ - 3f - 10f + 18f - 6f + f ]
|
|
! i 12dx i-v i i+v i+2v i+3v
|
|
!
|
|
! where
|
|
!
|
|
! i
|
|
! |B |
|
|
! v = -----
|
|
! i
|
|
! B
|
|
!
|
|
!-----------------------------------------------------------------------------
|
|
|
|
subroutine lopsided(ex,X,Y,Z,f,f_rhs,Sfx,Sfy,Sfz,Symmetry,SoA)
|
|
implicit none
|
|
|
|
!~~~~~~> Input parameters:
|
|
|
|
integer, intent(in) :: ex(1:3),Symmetry
|
|
real*8, intent(in) :: X(1:ex(1)),Y(1:ex(2)),Z(1:ex(3))
|
|
real*8,dimension(ex(1),ex(2),ex(3)),intent(in) :: f,Sfx,Sfy,Sfz
|
|
|
|
real*8,dimension(ex(1),ex(2),ex(3)),intent(inout):: f_rhs
|
|
real*8,dimension(3),intent(in) ::SoA
|
|
|
|
!~~~~~~> local variables:
|
|
! note index -2,-1,0, so we have 3 extra points
|
|
real*8,dimension(-2:ex(1),-2:ex(2),-2:ex(3)) :: fh
|
|
integer :: imin,jmin,kmin,imax,jmax,kmax,i,j,k
|
|
real*8 :: dX,dY,dZ
|
|
real*8 :: d12dx,d12dy,d12dz,d2dx,d2dy,d2dz
|
|
real*8, parameter :: ZEO=0.d0,ONE=1.d0, F3=3.d0
|
|
real*8, parameter :: TWO=2.d0,F6=6.0d0,F18=1.8d1
|
|
real*8, parameter :: F12=1.2d1, F10=1.d1,EIT=8.d0
|
|
integer, parameter :: NO_SYMM = 0, EQ_SYMM = 1, OCTANT = 2
|
|
|
|
dX = X(2)-X(1)
|
|
dY = Y(2)-Y(1)
|
|
dZ = Z(2)-Z(1)
|
|
|
|
d12dx = ONE/F12/dX
|
|
d12dy = ONE/F12/dY
|
|
d12dz = ONE/F12/dZ
|
|
|
|
d2dx = ONE/TWO/dX
|
|
d2dy = ONE/TWO/dY
|
|
d2dz = ONE/TWO/dZ
|
|
|
|
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 = -2
|
|
if(Symmetry > EQ_SYMM .and. dabs(X(1)) < dX) imin = -2
|
|
if(Symmetry > EQ_SYMM .and. dabs(Y(1)) < dY) jmin = -2
|
|
|
|
call symmetry_bd(3,ex,f,fh,SoA)
|
|
|
|
! upper bound set ex-1 only for efficiency,
|
|
! the loop body will set ex 0 also
|
|
do k=1,ex(3)-1
|
|
do j=1,ex(2)-1
|
|
do i=1,ex(1)-1
|
|
|
|
!! new code, 2012dec27, based on bam
|
|
! x direction
|
|
if(Sfx(i,j,k) > ZEO)then
|
|
if(i+3 <= imax)then
|
|
! v
|
|
! D f = ------[ - 3f - 10f + 18f - 6f + f ]
|
|
! i 12dx i-v i i+v i+2v i+3v
|
|
f_rhs(i,j,k)=f_rhs(i,j,k)+ &
|
|
Sfx(i,j,k)*d12dx*(-F3*fh(i-1,j,k)-F10*fh(i,j,k)+F18*fh(i+1,j,k) &
|
|
-F6*fh(i+2,j,k)+ fh(i+3,j,k))
|
|
elseif(i+2 <= imax)then
|
|
!
|
|
! f(i-2) - 8 f(i-1) + 8 f(i+1) - f(i+2)
|
|
! fx(i) = ---------------------------------------------
|
|
! 12 dx
|
|
f_rhs(i,j,k)=f_rhs(i,j,k)+ &
|
|
Sfx(i,j,k)*d12dx*(fh(i-2,j,k)-EIT*fh(i-1,j,k)+EIT*fh(i+1,j,k)-fh(i+2,j,k))
|
|
|
|
elseif(i+1 <= imax)then
|
|
! v
|
|
! D f = ------[ 3f + 10f - 18f + 6f - f ]
|
|
! i 12dx i+v i i-v i-2v i-3v
|
|
f_rhs(i,j,k)=f_rhs(i,j,k)- &
|
|
Sfx(i,j,k)*d12dx*(-F3*fh(i+1,j,k)-F10*fh(i,j,k)+F18*fh(i-1,j,k) &
|
|
-F6*fh(i-2,j,k)+ fh(i-3,j,k))
|
|
! set imax and imin 0
|
|
endif
|
|
elseif(Sfx(i,j,k) < ZEO)then
|
|
if(i-3 >= imin)then
|
|
! v
|
|
! D f = ------[ - 3f - 10f + 18f - 6f + f ]
|
|
! i 12dx i-v i i+v i+2v i+3v
|
|
f_rhs(i,j,k)=f_rhs(i,j,k)- &
|
|
Sfx(i,j,k)*d12dx*(-F3*fh(i+1,j,k)-F10*fh(i,j,k)+F18*fh(i-1,j,k) &
|
|
-F6*fh(i-2,j,k)+ fh(i-3,j,k))
|
|
elseif(i-2 >= imin)then
|
|
!
|
|
! f(i-2) - 8 f(i-1) + 8 f(i+1) - f(i+2)
|
|
! fx(i) = ---------------------------------------------
|
|
! 12 dx
|
|
f_rhs(i,j,k)=f_rhs(i,j,k)+ &
|
|
Sfx(i,j,k)*d12dx*(fh(i-2,j,k)-EIT*fh(i-1,j,k)+EIT*fh(i+1,j,k)-fh(i+2,j,k))
|
|
|
|
elseif(i-1 >= imin)then
|
|
! v
|
|
! D f = ------[ 3f + 10f - 18f + 6f - f ]
|
|
! i 12dx i+v i i-v i-2v i-3v
|
|
f_rhs(i,j,k)=f_rhs(i,j,k)+ &
|
|
Sfx(i,j,k)*d12dx*(-F3*fh(i-1,j,k)-F10*fh(i,j,k)+F18*fh(i+1,j,k) &
|
|
-F6*fh(i+2,j,k)+ fh(i+3,j,k))
|
|
! set imax and imin 0
|
|
endif
|
|
endif
|
|
|
|
! y direction
|
|
if(Sfy(i,j,k) > ZEO)then
|
|
if(j+3 <= jmax)then
|
|
! v
|
|
! D f = ------[ - 3f - 10f + 18f - 6f + f ]
|
|
! i 12dx i-v i i+v i+2v i+3v
|
|
f_rhs(i,j,k)=f_rhs(i,j,k)+ &
|
|
Sfy(i,j,k)*d12dy*(-F3*fh(i,j-1,k)-F10*fh(i,j,k)+F18*fh(i,j+1,k) &
|
|
-F6*fh(i,j+2,k)+ fh(i,j+3,k))
|
|
elseif(j+2 <= jmax)then
|
|
!
|
|
! f(i-2) - 8 f(i-1) + 8 f(i+1) - f(i+2)
|
|
! fx(i) = ---------------------------------------------
|
|
! 12 dx
|
|
f_rhs(i,j,k)=f_rhs(i,j,k)+ &
|
|
Sfy(i,j,k)*d12dy*(fh(i,j-2,k)-EIT*fh(i,j-1,k)+EIT*fh(i,j+1,k)-fh(i,j+2,k))
|
|
|
|
elseif(j+1 <= jmax)then
|
|
! v
|
|
! D f = ------[ 3f + 10f - 18f + 6f - f ]
|
|
! i 12dx i+v i i-v i-2v i-3v
|
|
f_rhs(i,j,k)=f_rhs(i,j,k)- &
|
|
Sfy(i,j,k)*d12dy*(-F3*fh(i,j+1,k)-F10*fh(i,j,k)+F18*fh(i,j-1,k) &
|
|
-F6*fh(i,j-2,k)+ fh(i,j-3,k))
|
|
! set imax and imin 0
|
|
endif
|
|
elseif(Sfy(i,j,k) < ZEO)then
|
|
if(j-3 >= jmin)then
|
|
! v
|
|
! D f = ------[ - 3f - 10f + 18f - 6f + f ]
|
|
! i 12dx i-v i i+v i+2v i+3v
|
|
f_rhs(i,j,k)=f_rhs(i,j,k)- &
|
|
Sfy(i,j,k)*d12dy*(-F3*fh(i,j+1,k)-F10*fh(i,j,k)+F18*fh(i,j-1,k) &
|
|
-F6*fh(i,j-2,k)+ fh(i,j-3,k))
|
|
elseif(j-2 >= jmin)then
|
|
!
|
|
! f(i-2) - 8 f(i-1) + 8 f(i+1) - f(i+2)
|
|
! fx(i) = ---------------------------------------------
|
|
! 12 dx
|
|
f_rhs(i,j,k)=f_rhs(i,j,k)+ &
|
|
Sfy(i,j,k)*d12dy*(fh(i,j-2,k)-EIT*fh(i,j-1,k)+EIT*fh(i,j+1,k)-fh(i,j+2,k))
|
|
|
|
elseif(j-1 >= jmin)then
|
|
! v
|
|
! D f = ------[ 3f + 10f - 18f + 6f - f ]
|
|
! i 12dx i+v i i-v i-2v i-3v
|
|
f_rhs(i,j,k)=f_rhs(i,j,k)+ &
|
|
Sfy(i,j,k)*d12dy*(-F3*fh(i,j-1,k)-F10*fh(i,j,k)+F18*fh(i,j+1,k) &
|
|
-F6*fh(i,j+2,k)+ fh(i,j+3,k))
|
|
! set jmax and jmin 0
|
|
endif
|
|
endif
|
|
|
|
! z direction
|
|
if(Sfz(i,j,k) > ZEO)then
|
|
if(k+3 <= kmax)then
|
|
! v
|
|
! D f = ------[ - 3f - 10f + 18f - 6f + f ]
|
|
! i 12dx i-v i i+v i+2v i+3v
|
|
f_rhs(i,j,k)=f_rhs(i,j,k)+ &
|
|
Sfz(i,j,k)*d12dz*(-F3*fh(i,j,k-1)-F10*fh(i,j,k)+F18*fh(i,j,k+1) &
|
|
-F6*fh(i,j,k+2)+ fh(i,j,k+3))
|
|
elseif(k+2 <= kmax)then
|
|
!
|
|
! f(i-2) - 8 f(i-1) + 8 f(i+1) - f(i+2)
|
|
! fx(i) = ---------------------------------------------
|
|
! 12 dx
|
|
f_rhs(i,j,k)=f_rhs(i,j,k)+ &
|
|
Sfz(i,j,k)*d12dz*(fh(i,j,k-2)-EIT*fh(i,j,k-1)+EIT*fh(i,j,k+1)-fh(i,j,k+2))
|
|
|
|
elseif(k+1 <= kmax)then
|
|
! v
|
|
! D f = ------[ 3f + 10f - 18f + 6f - f ]
|
|
! i 12dx i+v i i-v i-2v i-3v
|
|
f_rhs(i,j,k)=f_rhs(i,j,k)- &
|
|
Sfz(i,j,k)*d12dz*(-F3*fh(i,j,k+1)-F10*fh(i,j,k)+F18*fh(i,j,k-1) &
|
|
-F6*fh(i,j,k-2)+ fh(i,j,k-3))
|
|
! set imax and imin 0
|
|
endif
|
|
elseif(Sfz(i,j,k) < ZEO)then
|
|
if(k-3 >= kmin)then
|
|
! v
|
|
! D f = ------[ - 3f - 10f + 18f - 6f + f ]
|
|
! i 12dx i-v i i+v i+2v i+3v
|
|
f_rhs(i,j,k)=f_rhs(i,j,k)- &
|
|
Sfz(i,j,k)*d12dz*(-F3*fh(i,j,k+1)-F10*fh(i,j,k)+F18*fh(i,j,k-1) &
|
|
-F6*fh(i,j,k-2)+ fh(i,j,k-3))
|
|
elseif(k-2 >= kmin)then
|
|
!
|
|
! f(i-2) - 8 f(i-1) + 8 f(i+1) - f(i+2)
|
|
! fx(i) = ---------------------------------------------
|
|
! 12 dx
|
|
f_rhs(i,j,k)=f_rhs(i,j,k)+ &
|
|
Sfz(i,j,k)*d12dz*(fh(i,j,k-2)-EIT*fh(i,j,k-1)+EIT*fh(i,j,k+1)-fh(i,j,k+2))
|
|
|
|
elseif(k-1 >= kmin)then
|
|
! v
|
|
! D f = ------[ 3f + 10f - 18f + 6f - f ]
|
|
! i 12dx i+v i i-v i-2v i-3v
|
|
f_rhs(i,j,k)=f_rhs(i,j,k)+ &
|
|
Sfz(i,j,k)*d12dz*(-F3*fh(i,j,k-1)-F10*fh(i,j,k)+F18*fh(i,j,k+1) &
|
|
-F6*fh(i,j,k+2)+ fh(i,j,k+3))
|
|
! set kmax and kmin 0
|
|
endif
|
|
endif
|
|
enddo
|
|
enddo
|
|
enddo
|
|
|
|
return
|
|
|
|
end subroutine lopsided
|