USER_PROBLEM: Implement reconnection boundaries along X.
Signed-off-by: Grzegorz Kowal <grzegorz@amuncode.org>
This commit is contained in:
parent
6a9ef98fd6
commit
7ac4f2f8a7
@ -569,7 +569,9 @@ module user_problem
|
|||||||
! import external procedures and variables
|
! import external procedures and variables
|
||||||
!
|
!
|
||||||
use coordinates , only : im, jm, km
|
use coordinates , only : im, jm, km
|
||||||
|
use coordinates , only : ib, ibl, ie, ieu
|
||||||
use equations , only : nv
|
use equations , only : nv
|
||||||
|
use equations , only : idn, ivx, ivy, ivz, ipr, ibx, iby, ibz, ibp
|
||||||
|
|
||||||
! local variables are not implicit by default
|
! local variables are not implicit by default
|
||||||
!
|
!
|
||||||
@ -585,6 +587,13 @@ module user_problem
|
|||||||
real(kind=8), dimension(1:jm) , intent(in) :: y
|
real(kind=8), dimension(1:jm) , intent(in) :: y
|
||||||
real(kind=8), dimension(1:km) , intent(in) :: z
|
real(kind=8), dimension(1:km) , intent(in) :: z
|
||||||
real(kind=8), dimension(1:nv,1:im,1:jm,1:km), intent(inout) :: qn
|
real(kind=8), dimension(1:nv,1:im,1:jm,1:km), intent(inout) :: qn
|
||||||
|
|
||||||
|
! local variables
|
||||||
|
!
|
||||||
|
integer :: im2, im1, i, ip1, ip2
|
||||||
|
integer :: jm2, jm1, j, jp1, jp2
|
||||||
|
integer :: km2, km1, k, kp1, kp2
|
||||||
|
real(kind=8) :: dx, dy, dz, dxy, dxz
|
||||||
!
|
!
|
||||||
!-------------------------------------------------------------------------------
|
!-------------------------------------------------------------------------------
|
||||||
!
|
!
|
||||||
@ -594,6 +603,132 @@ module user_problem
|
|||||||
call start_timer(imb)
|
call start_timer(imb)
|
||||||
#endif /* PROFILE */
|
#endif /* PROFILE */
|
||||||
|
|
||||||
|
! process case with magnetic field, otherwise revert to standard outflow
|
||||||
|
!
|
||||||
|
if (ibx > 0) then
|
||||||
|
|
||||||
|
! get the cell sizes and their ratios
|
||||||
|
!
|
||||||
|
dx = x(2) - x(1)
|
||||||
|
dy = y(2) - y(1)
|
||||||
|
#if NDIMS == 3
|
||||||
|
dz = z(2) - z(1)
|
||||||
|
#endif /* NDIMS == 3 */
|
||||||
|
dxy = dx / dy
|
||||||
|
#if NDIMS == 3
|
||||||
|
dxz = dx / dz
|
||||||
|
#endif /* NDIMS == 3 */
|
||||||
|
|
||||||
|
! process left and right side boundary separatelly
|
||||||
|
!
|
||||||
|
if (ic == 1) then
|
||||||
|
|
||||||
|
! iterate over left-side ghost layers
|
||||||
|
!
|
||||||
|
do i = ibl, 1, -1
|
||||||
|
|
||||||
|
! calculate neighbor cell indices
|
||||||
|
!
|
||||||
|
ip1 = min(im, i + 1)
|
||||||
|
ip2 = min(im, i + 2)
|
||||||
|
|
||||||
|
! iterate over boundary layer
|
||||||
|
!
|
||||||
|
do k = kl, ku
|
||||||
|
#if NDIMS == 3
|
||||||
|
km2 = max( 1, k - 2)
|
||||||
|
km1 = max( 1, k - 1)
|
||||||
|
kp1 = min(km, k + 1)
|
||||||
|
kp2 = min(km, k + 2)
|
||||||
|
#endif /* NDIMS == 3 */
|
||||||
|
do j = jl, ju
|
||||||
|
jm2 = max( 1, j - 2)
|
||||||
|
jm1 = max( 1, j - 1)
|
||||||
|
jp1 = min(jm, j + 1)
|
||||||
|
jp2 = min(jm, j + 2)
|
||||||
|
|
||||||
|
! make the normal derivative zero
|
||||||
|
!
|
||||||
|
qn(1:nv,i,j,k) = qn(1:nv,ib,j,k)
|
||||||
|
|
||||||
|
! prevent the inflow
|
||||||
|
!
|
||||||
|
qn(ivx,i,j,k) = min(0.0d+00, qn(ivx,ib,j,k))
|
||||||
|
|
||||||
|
! update the normal component of magnetic field from divergence-free condition
|
||||||
|
!
|
||||||
|
qn(ibx,i,j,k) = qn(ibx,ip2,j,k) &
|
||||||
|
+ (qn(iby,ip1,jp1,k) - qn(iby,ip1,jm1,k)) * dxy
|
||||||
|
#if NDIMS == 3
|
||||||
|
qn(ibx,i,j,k) = qn(ibx,i ,j,k) &
|
||||||
|
+ (qn(ibz,ip1,j,kp1) - qn(ibz,ip1,j,km1)) * dxz
|
||||||
|
#endif /* NDIMS == 3 */
|
||||||
|
qn(ibp,i,j,k) = 0.0d+00
|
||||||
|
end do ! j = jl, ju
|
||||||
|
end do ! k = kl, ku
|
||||||
|
end do ! i = ibl, 1, -1
|
||||||
|
|
||||||
|
else ! ic == 1
|
||||||
|
|
||||||
|
! iterate over right-side ghost layers
|
||||||
|
!
|
||||||
|
do i = ieu, im
|
||||||
|
|
||||||
|
! calculate neighbor cell indices
|
||||||
|
!
|
||||||
|
im1 = max( 1, i - 1)
|
||||||
|
im2 = max( 1, i - 2)
|
||||||
|
|
||||||
|
! iterate over boundary layer
|
||||||
|
!
|
||||||
|
do k = kl, ku
|
||||||
|
#if NDIMS == 3
|
||||||
|
km1 = max( 1, k - 1)
|
||||||
|
kp1 = min(km, k + 1)
|
||||||
|
km2 = max( 1, k - 2)
|
||||||
|
kp2 = min(km, k + 2)
|
||||||
|
#endif /* NDIMS == 3 */
|
||||||
|
do j = jl, ju
|
||||||
|
jm1 = max( 1, j - 1)
|
||||||
|
jp1 = min(jm, j + 1)
|
||||||
|
jm2 = max( 1, j - 2)
|
||||||
|
jp2 = min(jm, j + 2)
|
||||||
|
|
||||||
|
! make the normal derivative zero
|
||||||
|
!
|
||||||
|
qn(1:nv,i,j,k) = qn(1:nv,ie,j,k)
|
||||||
|
|
||||||
|
! prevent the inflow
|
||||||
|
!
|
||||||
|
qn(ivx,i,j,k) = max(0.0d+00, qn(ivx,ie,j,k))
|
||||||
|
|
||||||
|
! update the normal component of magnetic field from divergence-free condition
|
||||||
|
!
|
||||||
|
qn(ibx,i,j,k) = qn(ibx,im2,j,k) &
|
||||||
|
+ (qn(iby,im1,jm1,k) - qn(iby,im1,jp1,k)) * dxy
|
||||||
|
#if NDIMS == 3
|
||||||
|
qn(ibx,i,j,k) = qn(ibx,i ,j,k) &
|
||||||
|
+ (qn(ibz,im1,j,km1) - qn(ibz,im1,j,kp1)) * dxz
|
||||||
|
#endif /* NDIMS == 3 */
|
||||||
|
qn(ibp,i,j,k) = 0.0d+00
|
||||||
|
end do ! j = jl, ju
|
||||||
|
end do ! k = kl, ku
|
||||||
|
end do ! i = ieu, im
|
||||||
|
end if ! ic == 1
|
||||||
|
else ! ibx > 0
|
||||||
|
if (ic == 1) then
|
||||||
|
do i = ibl, 1, -1
|
||||||
|
qn(1:nv,i,jl:ju,kl:ku) = qn(1:nv,ib,jl:ju,kl:ku)
|
||||||
|
qn(ivx ,i,jl:ju,kl:ku) = min(0.0d+00, qn(ivx,ib,jl:ju,kl:ku))
|
||||||
|
end do ! i = ibl, 1, -1
|
||||||
|
else
|
||||||
|
do i = ieu, im
|
||||||
|
qn(1:nv,i,jl:ju,kl:ku) = qn(1:nv,ie,jl:ju,kl:ku)
|
||||||
|
qn(ivx ,i,jl:ju,kl:ku) = max(0.0d+00, qn(ivx,ie,jl:ju,kl:ku))
|
||||||
|
end do ! i = ieu, im
|
||||||
|
end if
|
||||||
|
end if ! ibx > 0
|
||||||
|
|
||||||
#ifdef PROFILE
|
#ifdef PROFILE
|
||||||
! stop accounting time for the boundary update
|
! stop accounting time for the boundary update
|
||||||
!
|
!
|
||||||
|
Loading…
x
Reference in New Issue
Block a user