USER_PROBLEM: Calculate reconnection rate terms in user_time_statistics().

Signed-off-by: Grzegorz Kowal <grzegorz@amuncode.org>
This commit is contained in:
Grzegorz Kowal 2021-10-26 12:25:29 -03:00
parent 62f0ca2deb
commit e4a7890959

View File

@ -74,6 +74,13 @@ module user_problem
real(kind=8), save :: xdec = 1.00d-01 real(kind=8), save :: xdec = 1.00d-01
real(kind=8), save :: ydec = 1.00d-01 real(kind=8), save :: ydec = 1.00d-01
real(kind=8), save :: ylo = -9.00d+99
real(kind=8), save :: yup = 9.00d+99
integer(kind=4), save :: runit = 33
logical, save :: resistive = .false.
! flag indicating if the gravitational source term is enabled ! flag indicating if the gravitational source term is enabled
! !
logical, save :: user_gravity_enabled = .false. logical, save :: user_gravity_enabled = .false.
@ -120,7 +127,7 @@ module user_problem
use constants , only : pi use constants , only : pi
#endif /* NDIMS == 3 */ #endif /* NDIMS == 3 */
use constants , only : pi2 use constants , only : pi2
use coordinates, only : ng => nghosts, ady, xlen, zlen use coordinates, only : ng => nghosts, ady, xlen, zlen, ymax
use equations , only : magnetized, csnd, csnd2 use equations , only : magnetized, csnd, csnd2
use helpers , only : print_section, print_parameter use helpers , only : print_section, print_parameter
use parameters , only : get_parameter use parameters , only : get_parameter
@ -139,9 +146,10 @@ module user_problem
! local variables ! local variables
! !
character(len=64) :: perturbation = "noise" character(len=64) :: perturbation = "noise", append = "off", fname
logical :: flag
integer :: n, kd integer :: n, kd
real(kind=8) :: thh, fc, ka real(kind=8) :: thh, fc, ka, ydis = 9.00d+99
#if NDIMS == 3 #if NDIMS == 3
real(kind=8) :: thv, tx, ty, tz, tt real(kind=8) :: thv, tx, ty, tz, tt
#endif /* NDIMS == 3 */ #endif /* NDIMS == 3 */
@ -216,6 +224,8 @@ module user_problem
write(*,*) write(*,*)
end if end if
status = 1 status = 1
else
resistive = .true.
end if end if
call get_parameter("dens", dens) call get_parameter("dens", dens)
if (dens <= 0.0d+00) then if (dens <= 0.0d+00) then
@ -353,6 +363,64 @@ module user_problem
end if end if
end if ! status end if ! status
! prepare file to store reconnection rate terms
!
if (status == 0) then
! determine if to append or create another file
!
call get_parameter("reconnection_append", append)
select case(trim(append))
case ("on", "ON", "t", "T", "y", "Y", "true", "TRUE", "yes", "YES")
write(fname, "('reconnection-new.dat')")
inquire(file = fname, exist = flag)
case default
write(fname, "('reconnection-new_',i2.2,'.dat')") rcount
flag = .false.
end select
! check if the file exists; if not, create a new one, otherwise move to the end
!
if (flag .and. rcount > 1) then
#ifdef __INTEL_COMPILER
open(newunit = runit, file = fname, form = 'formatted', status = 'old' &
, position = 'append', buffered = 'yes')
#else /* __INTEL_COMPILER */
open(newunit = runit, file = fname, form = 'formatted', status = 'old' &
, position = 'append')
#endif /* __INTEL_COMPILER */
write(runit,"('#')")
else
#ifdef __INTEL_COMPILER
open(newunit = runit, file = fname, form = 'formatted' &
, status = 'replace', buffered = 'yes')
#else /* __INTEL_COMPILER */
open(newunit = runit, file = fname, form = 'formatted' &
, status = 'replace')
#endif /* __INTEL_COMPILER */
end if
! write the integral file header
!
write(runit,'("#",a24,26a25)') &
'time', '|Bx| int', '|Bx| inf' &
, '|Bx| y-adv', '|Bx| z-adv', '|Bx| y-shr', '|Bx| z-shr' &
, '|Bx| y-dif', '|Bx| z-dif', '|Bx| Psi' &
, 'Vin lower' , 'Vin upper' &
, 'Emag', 'Emag inf' &
, 'Emag x-adv', 'Emag y-adv', 'Emag z-adv' &
, 'Emag x-v.b', 'Emag y-v.b', 'Emag z-v.b' &
, 'Emag x-dif', 'Emag y-dif', 'Emag z-dif' &
, 'Emag-Ekin', 'Emag-Eint', 'Emag-Psi'
write(runit,"('#')")
call get_parameter("ydistance", ydis)
ydis = min(ydis, ymax)
ylo = - ydis
yup = ydis
end if ! status
! proceed if no errors ! proceed if no errors
! !
if (status == 0) then if (status == 0) then
@ -370,7 +438,7 @@ module user_problem
call print_parameter(verbose, '( ) ptot (total pressure)', ptot) call print_parameter(verbose, '( ) ptot (total pressure)', ptot)
call print_parameter(verbose, '( ) csnd (sound speed)' , csnd) call print_parameter(verbose, '( ) csnd (sound speed)' , csnd)
call print_parameter(verbose, '( ) Valf (Alfven speed)' , valf) call print_parameter(verbose, '( ) Valf (Alfven speed)' , valf)
if (eta > 0.0d+00) then if (resistive) then
call print_parameter(verbose, '( ) S (Lundquist number)', lund) call print_parameter(verbose, '( ) S (Lundquist number)', lund)
end if end if
call print_parameter(verbose, '(*) delta (thickness)', dlta) call print_parameter(verbose, '(*) delta (thickness)', dlta)
@ -388,6 +456,7 @@ module user_problem
call print_parameter(verbose, '(*) ycut' , ycut) call print_parameter(verbose, '(*) ycut' , ycut)
call print_parameter(verbose, '(*) xdec' , xdec) call print_parameter(verbose, '(*) xdec' , xdec)
call print_parameter(verbose, '(*) ydec' , ydec) call print_parameter(verbose, '(*) ydec' , ydec)
call print_parameter(verbose, '(*) ydistance' , ydis)
end if ! status end if ! status
#ifdef PROFILE #ifdef PROFILE
@ -435,6 +504,10 @@ module user_problem
! !
status = 0 status = 0
! close the reconnection file
!
close(runit)
! deallocate wave vector components, random directions, and random phase ! deallocate wave vector components, random directions, and random phase
! !
if (allocated(kx)) deallocate(kx, ky, kz, stat = status) if (allocated(kx)) deallocate(kx, ky, kz, stat = status)
@ -1555,16 +1628,408 @@ module user_problem
! !
subroutine user_time_statistics(time) subroutine user_time_statistics(time)
use blocks , only : block_meta, block_data, list_data
use coordinates, only : nn => bcells, nb, ne
use coordinates, only : adx, ady, adz, advol, ay, yarea
use equations , only : ivx, ivy, ivz, ibx, iby, ibz, ibp
use helpers , only : flush_and_sync
#ifdef MPI
use mpitools , only : reduce_sum
#endif /* MPI */
use operators , only : curl, gradient
implicit none implicit none
real(kind=8), intent(in) :: time real(kind=8), intent(in) :: time
type(block_meta), pointer :: pmeta
type(block_data), pointer :: pdata
integer :: ni, nl, nu, nm, np
real(kind=8) :: dvol, dvolh, dxz
real(kind=8), dimension(3) :: dh
real(kind=8), dimension(nn) :: yc
real(kind=8), dimension(32) :: rterms
#if NDIMS == 3
real(kind=8), dimension(3,nn,nn,nn) :: cur
#else /* NDIMS == 3 */
real(kind=8), dimension(3,nn,nn, 1) :: cur
#endif /* NDIMS == 3 */
!------------------------------------------------------------------------------- !-------------------------------------------------------------------------------
! !
#ifdef PROFILE #ifdef PROFILE
call start_timer(imt) call start_timer(imt)
#endif /* PROFILE */ #endif /* PROFILE */
rterms(:) = 0.0d+00
pdata => list_data
do while(associated(pdata))
pmeta => pdata%meta
dh(1) = adx(pmeta%level)
dh(2) = ady(pmeta%level)
dh(3) = adz(pmeta%level)
dvol = advol(pmeta%level)
dvolh = 5.0d-01 * dvol
dxz = adx(pmeta%level) * adz(pmeta%level)
yc(:) = pmeta%ymin + ay(pmeta%level,:)
ni = -1
nl = nb
nu = ne
do while (yc(nl) < ylo .and. nl < ne)
nl = nl + 1
end do
do while (yc(nu) > yup .and. nu > nb)
nu = nu - 1
end do
! calculate current density (J = xB)
!
call curl(dh(:), pdata%q(ibx:ibz,:,:,:), cur(1:3,:,:,:))
! the integral of |Bx|
!
rterms(1) = rterms(1) &
#if NDIMS == 3
+ sum(abs(pdata%q(ibx,nb:ne,nl:nu,nb:ne))) * dvol
#else /* NDIMS == 3 */
+ sum(abs(pdata%q(ibx,nb:ne,nl:nu, : ))) * dvol
#endif /* NDIMS == 3 */
! the integral of magnetic energy
!
rterms(12) = rterms(12) &
#if NDIMS == 3
+ sum(pdata%u(ibx:ibz,nb:ne,nl:nu,nb:ne)**2) * dvolh
#else /* NDIMS == 3 */
+ sum(pdata%u(ibx:ibz,nb:ne,nl:nu, : )**2) * dvolh
#endif /* NDIMS == 3 */
if (pmeta%ymin <= ylo .and. ylo < pmeta%ymax) then
ni = nl
nm = ni - 1
! get the inflow speed
!
rterms(10) = rterms(10) &
#if NDIMS == 3
+ sum(pdata%q(ivy,nb:ne,ni,nb:ne)) * dxz
#else /* NDIMS == 3 */
+ sum(pdata%q(ivy,nb:ne,ni, : )) * dxz
#endif /* NDIMS == 3 */
! mean Bx at boundary
!
rterms(2) = rterms(2) &
#if NDIMS == 3
+ sum(abs(pdata%q(ibx,nb:ne,nm:ni,nb:ne))) * dxz
#else /* NDIMS == 3 */
+ sum(abs(pdata%q(ibx,nb:ne,nm:ni, : ))) * dxz
#endif /* NDIMS == 3 */
! advection of Bx along Y
!
rterms(3) = rterms(3) &
#if NDIMS == 3
+ sum(abs(pdata%q(ibx,nb:ne,nm:ni,nb:ne)) &
* pdata%q(ivy,nb:ne,nm:ni,nb:ne)) * dxz
#else /* NDIMS == 3 */
+ sum(abs(pdata%q(ibx,nb:ne,nm:ni, : )) &
* pdata%q(ivy,nb:ne,nm:ni, : )) * dxz
#endif /* NDIMS == 3 */
! shear of By along X
!
rterms(5) = rterms(5) &
#if NDIMS == 3
- sum(sign(pdata%q(iby,nb:ne,nm:ni,nb:ne) &
* pdata%q(ivx,nb:ne,nm:ni,nb:ne), &
pdata%q(ibx,nb:ne,nm:ni,nb:ne))) * dxz
#else /* NDIMS == 3 */
- sum(sign(pdata%q(iby,nb:ne,nm:ni, : ) &
* pdata%q(ivx,nb:ne,nm:ni, : ), &
pdata%q(ibx,nb:ne,nm:ni, : ))) * dxz
#endif /* NDIMS == 3 */
! mean magnetic energy
!
rterms(13) = rterms(13) &
#if NDIMS == 3
+ sum(pdata%q(ibx:ibz,nb:ne,nm:ni,nb:ne)**2) * dxz
#else /* NDIMS == 3 */
+ sum(pdata%q(ibx:ibz,nb:ne,nm:ni, : )**2) * dxz
#endif /* NDIMS == 3 */
! advection of magnetic energy
!
rterms(15) = rterms(15) &
#if NDIMS == 3
+ sum(sum(pdata%q(ibx:ibz,nb:ne,nm:ni,nb:ne)**2,1) &
* pdata%q(ivy ,nb:ne,nm:ni,nb:ne)) * dxz
#else /* NDIMS == 3 */
+ sum(sum(pdata%q(ibx:ibz,nb:ne,nm:ni, : )**2,1) &
* pdata%q(ivy ,nb:ne,nm:ni, : )) * dxz
#endif /* NDIMS == 3 */
! advection of magnetic energy
!
rterms(18) = rterms(18) &
#if NDIMS == 3
- sum(sum(pdata%q(ivx:ivz,nb:ne,nm:ni,nb:ne) &
* pdata%q(ibx:ibz,nb:ne,nm:ni,nb:ne),1) &
* pdata%q(iby ,nb:ne,nm:ni,nb:ne)) * dxz
#else /* NDIMS == 3 */
- sum(sum(pdata%q(ivx:ivz,nb:ne,nm:ni, : ) &
* pdata%q(ibx:ibz,nb:ne,nm:ni, : ),1) &
* pdata%q(iby ,nb:ne,nm:ni, : )) * dxz
#endif /* NDIMS == 3 */
if (resistive) then
! diffusion of Bx through
!
rterms(7) = rterms(7) &
#if NDIMS == 3
+ sum(sign(cur(3,nb:ne,nm:ni,nb:ne), &
pdata%q(ibx,nb:ne,nm:ni,nb:ne))) * dxz
#else /* NDIMS == 3 */
+ sum(sign(cur(3,nb:ne,nm:ni, : ), &
pdata%q(ibx,nb:ne,nm:ni, : ))) * dxz
#endif /* NDIMS == 3 */
! diffusion of magnetic energy through the lower Y boundary
!
rterms(21) = rterms(21) &
#if NDIMS == 3
+ sum(cur(3,nb:ne,nm:ni,nb:ne) &
* pdata%q(ibx,nb:ne,nm:ni,nb:ne) &
- cur(1,nb:ne,nm:ni,nb:ne) &
* pdata%q(ibz,nb:ne,nm:ni,nb:ne)) * dxz
#else /* NDIMS == 3 */
+ sum(cur(3,nb:ne,nm:ni, : ) &
* pdata%q(ibx,nb:ne,nm:ni, : ) &
- cur(1,nb:ne,nm:ni, : ) &
* pdata%q(ibz,nb:ne,nm:ni, : )) * dxz
#endif /* NDIMS == 3 */
end if ! resistivity
end if
if (pmeta%ymin < yup .and. yup <= pmeta%ymax) then
ni = nu
np = ni + 1
! get the inflow speed
!
rterms(11) = rterms(11) &
#if NDIMS == 3
- sum(pdata%q(ivy,nb:ne,ni,nb:ne)) * dxz
#else /* NDIMS == 3 */
- sum(pdata%q(ivy,nb:ne,ni, : )) * dxz
#endif /* NDIMS == 3 */
! mean Bx at boundary
!
rterms(2) = rterms(2) &
#if NDIMS == 3
+ sum(abs(pdata%q(ibx,nb:ne,ni:np,nb:ne))) * dxz
#else /* NDIMS == 3 */
+ sum(abs(pdata%q(ibx,nb:ne,ni:np, : ))) * dxz
#endif /* NDIMS == 3 */
! advection of Bx along Y
!
rterms(3) = rterms(3) &
#if NDIMS == 3
- sum(abs(pdata%q(ibx,nb:ne,ni:np,nb:ne)) &
* pdata%q(ivy,nb:ne,ni:np,nb:ne)) * dxz
#else /* NDIMS == 3 */
- sum(abs(pdata%q(ibx,nb:ne,ni:np, : )) &
* pdata%q(ivy,nb:ne,ni:np, : )) * dxz
#endif /* NDIMS == 3 */
! shear of By along X
!
rterms(5) = rterms(5) &
#if NDIMS == 3
+ sum(sign(pdata%q(iby,nb:ne,ni:np,nb:ne) &
* pdata%q(ivx,nb:ne,ni:np,nb:ne), &
pdata%q(ibx,nb:ne,ni:np,nb:ne))) * dxz
#else /* NDIMS == 3 */
+ sum(sign(pdata%q(iby,nb:ne,ni:np, : ) &
* pdata%q(ivx,nb:ne,ni:np, : ), &
pdata%q(ibx,nb:ne,ni:np, : ))) * dxz
#endif /* NDIMS == 3 */
! mean magnetic energy
!
rterms(13) = rterms(13) &
#if NDIMS == 3
+ sum(pdata%q(ibx:ibz,nb:ne,ni:np,nb:ne)**2) * dxz
#else /* NDIMS == 3 */
+ sum(pdata%q(ibx:ibz,nb:ne,ni:np, : )**2) * dxz
#endif /* NDIMS == 3 */
! advection of magnetic energy
!
rterms(15) = rterms(15) &
#if NDIMS == 3
- sum(sum(pdata%q(ibx:ibz,nb:ne,ni:np,nb:ne)**2,1) &
* pdata%q(ivy ,nb:ne,ni:np,nb:ne)) * dxz
#else /* NDIMS == 3 */
- sum(sum(pdata%q(ibx:ibz,nb:ne,ni:np, : )**2,1) &
* pdata%q(ivy ,nb:ne,ni:np, : )) * dxz
#endif /* NDIMS == 3 */
rterms(18) = rterms(18) &
#if NDIMS == 3
+ sum(sum(pdata%q(ivx:ivz,nb:ne,ni:np,nb:ne) &
* pdata%q(ibx:ibz,nb:ne,ni:np,nb:ne),1) &
* pdata%q(iby ,nb:ne,ni:np,nb:ne)) * dxz
#else /* NDIMS == 3 */
+ sum(sum(pdata%q(ivx:ivz,nb:ne,ni:np, : ) &
* pdata%q(ibx:ibz,nb:ne,ni:np, : ),1) &
* pdata%q(iby ,nb:ne,ni:np, : )) * dxz
#endif /* NDIMS == 3 */
if (resistive) then
! diffusion of Bx
!
rterms(7) = rterms(7) &
#if NDIMS == 3
- sum(sign(cur(3,nb:ne,ni:np,nb:ne), &
pdata%q(ibx,nb:ne,ni:np,nb:ne))) * dxz
#else /* NDIMS == 3 */
- sum(sign(cur(3,nb:ne,ni:np, : ), &
pdata%q(ibx,nb:ne,ni:np, : ))) * dxz
#endif /* NDIMS == 3 */
! diffusion of magnetic energy
!
rterms(21) = rterms(21) &
#if NDIMS == 3
- sum(cur(3,nb:ne,ni:np,nb:ne) &
* pdata%q(ibx,nb:ne,ni:np,nb:ne) &
- cur(1,nb:ne,ni:np,nb:ne) &
* pdata%q(ibz,nb:ne,ni:np,nb:ne)) * dxz
#else /* NDIMS == 3 */
- sum(cur(3,nb:ne,ni:np, : ) &
* pdata%q(ibx,nb:ne,ni:np, : ) &
- cur(1,nb:ne,ni:np, : ) &
* pdata%q(ibz,nb:ne,ni:np, : )) * dxz
#endif /* NDIMS == 3 */
end if ! resistivity
end if
! get the conversion between the magnetic energy and kinetic and
! internal energies
!
rterms(23) = rterms(23) &
#if NDIMS == 3
+ sum((pdata%q(ivy,nb:ne,nl:nu,nb:ne) &
* pdata%q(ibz,nb:ne,nl:nu,nb:ne) &
- pdata%q(ivz,nb:ne,nl:nu,nb:ne) &
* pdata%q(iby,nb:ne,nl:nu,nb:ne)) &
* cur(1,nb:ne,nl:nu,nb:ne)) * dvol
#else /* NDIMS == 3 */
+ sum((pdata%q(ivy,nb:ne,nl:nu, : ) &
* pdata%q(ibz,nb:ne,nl:nu, : ) &
- pdata%q(ivz,nb:ne,nl:nu, : ) &
* pdata%q(iby,nb:ne,nl:nu, : )) &
* cur(1,nb:ne,nl:nu, : )) * dvol
#endif /* NDIMS == 3 */
rterms(23) = rterms(23) &
#if NDIMS == 3
+ sum((pdata%q(ivz,nb:ne,nl:nu,nb:ne) &
* pdata%q(ibx,nb:ne,nl:nu,nb:ne) &
- pdata%q(ivx,nb:ne,nl:nu,nb:ne) &
* pdata%q(ibz,nb:ne,nl:nu,nb:ne)) &
* cur(2,nb:ne,nl:nu,nb:ne)) * dvol
#else /* NDIMS == 3 */
+ sum((pdata%q(ivz,nb:ne,nl:nu, : ) &
* pdata%q(ibx,nb:ne,nl:nu, : ) &
- pdata%q(ivx,nb:ne,nl:nu, : ) &
* pdata%q(ibz,nb:ne,nl:nu, : )) &
* cur(2,nb:ne,nl:nu, : )) * dvol
#endif /* NDIMS == 3 */
rterms(23) = rterms(23) &
#if NDIMS == 3
+ sum((pdata%q(ivx,nb:ne,nl:nu,nb:ne) &
* pdata%q(iby,nb:ne,nl:nu,nb:ne) &
- pdata%q(ivy,nb:ne,nl:nu,nb:ne) &
* pdata%q(ibx,nb:ne,nl:nu,nb:ne)) &
* cur(3,nb:ne,nl:nu,nb:ne)) * dvol
#else /* NDIMS == 3 */
+ sum((pdata%q(ivx,nb:ne,nl:nu, : ) &
* pdata%q(iby,nb:ne,nl:nu, : ) &
- pdata%q(ivy,nb:ne,nl:nu, : ) &
* pdata%q(ibx,nb:ne,nl:nu, : )) &
* cur(3,nb:ne,nl:nu, : )) * dvol
#endif /* NDIMS == 3 */
if (resistive) then
rterms(24) = rterms(24) &
#if NDIMS == 3
- sum(cur(1:3,nb:ne,nl:nu,nb:ne)**2) * dvol
#else /* NDIMS == 3 */
- sum(cur(1:3,nb:ne,nl:nu, : )**2) * dvol
#endif /* NDIMS == 3 */
end if
! calculate gradient (ψ)
!
call gradient(dh(:), pdata%q(ibp,:,:,:), cur(1:3,:,:,:))
rterms(25) = rterms(25) &
#if NDIMS == 3
- sum(pdata%q(ibx:ibz,nb:ne,nl:nu,nb:ne) &
* cur(1:3,nb:ne,nl:nu,nb:ne)) * dvol
#else /* NDIMS == 3 */
- sum(pdata%q(ibx:ibz,nb:ne,nl:nu, : ) &
* cur(1:3,nb:ne,nl:nu, : )) * dvol
#endif /* NDIMS == 3 */
! contribution to |Bx| from ψ
!
rterms(9) = rterms(9) &
#if NDIMS == 3
- sum(sign(cur(1,nb:ne,nl:nu,nb:ne), &
pdata%q(ibx,nb:ne,nl:nu,nb:ne))) * dvol
#else /* NDIMS == 3 */
- sum(sign(cur(1,nb:ne,nl:nu, : ), &
pdata%q(ibx,nb:ne,nl:nu, : ))) * dvol
#endif /* NDIMS == 3 */
pdata => pdata%next
end do
#ifdef MPI
call reduce_sum(rterms(:))
#endif /* MPI */
rterms(2) = 2.50d-01 * rterms(2) / yarea
rterms(13) = 1.25d-01 * rterms(13) / yarea
rterms(3:6) = 5.00d-01 * rterms(3:6)
rterms(14:19) = 5.00d-01 * rterms(14:19)
rterms(7:8) = 5.00d-01 * eta * rterms(7:8)
rterms(20:22) = 5.00d-01 * eta * rterms(20:22)
rterms(24) = eta * rterms(24)
write(runit,"(26es25.15e3)") time, rterms(1:25)
call flush_and_sync(runit)
#ifdef PROFILE #ifdef PROFILE
call stop_timer(imt) call stop_timer(imt)
#endif /* PROFILE */ #endif /* PROFILE */