MPI-AMRVAC  3.1
The MPI - Adaptive Mesh Refinement - Versatile Advection Code (development version)
mod_gravity.t
Go to the documentation of this file.
1 !> Module for including gravity in (magneto)hydrodynamics simulations
2 module mod_gravity
3  implicit none
4 
5  !> source split or not
6  logical :: grav_split= .false.
7 
8 contains
9  !> Read this module's parameters from a file
10  subroutine grav_params_read(files)
12  character(len=*), intent(in) :: files(:)
13  integer :: n
14 
15  namelist /grav_list/ grav_split
16 
17  do n = 1, size(files)
18  open(unitpar, file=trim(files(n)), status="old")
19  read(unitpar, grav_list, end=111)
20 111 close(unitpar)
21  end do
22  end subroutine grav_params_read
23 
24  !> Initialize the module
25  subroutine gravity_init()
27  use mod_usr_methods
28  use mod_comm_lib, only: mpistop
29  integer :: nwx,idir
30 
31  if (.not. associated(usr_gravity)) then
32  write(*,*) "mod_usr.t: please define usr_gravity before (m)hd activate"
33  write(*,*) "like the phys_gravity in mod_usr_methods.t"
34  call mpistop("usr_gravity not defined or pointed")
35  end if
37  if(grav_split) any_source_split=.true.
38  end subroutine gravity_init
39 
40  !> w[iw]=w[iw]+qdt*S[wCT,qtC,x] where S is the source based on wCT within ixO
41  subroutine gravity_add_source(qdt,ixI^L,ixO^L,wCT,wCTprim,w,x,&
42  energy,rhov,qsourcesplit,active)
44  use mod_usr_methods
45  use mod_comm_lib, only: mpistop
46  integer, intent(in) :: ixI^L, ixO^L
47  double precision, intent(in) :: qdt, x(ixI^S,1:ndim)
48  double precision, intent(in) :: wCT(ixI^S,1:nw),wCTprim(ixI^S,1:nw)
49  double precision, intent(inout) :: w(ixI^S,1:nw)
50  logical, intent(in) :: energy,rhov,qsourcesplit
51  logical, intent(inout) :: active
52 
53  double precision :: gravity_field(ixI^S,ndim)
54  integer :: idim
55 
56  if(qsourcesplit .eqv. grav_split) then
57  active = .true.
58  call usr_gravity(ixi^l,ixo^l,wct,x,gravity_field)
59  do idim = 1, ndim
60  if(size(iw_mom)<ndim) then
61  w(ixo^s,iw_mom(1)) = w(ixo^s,iw_mom(1)) &
62  + qdt*gravity_field(ixo^s,idim)*wct(ixo^s,iw_rho)*block%B0(ixo^s,idim,0)
63  else
64  w(ixo^s,iw_mom(idim)) = w(ixo^s,iw_mom(idim)) &
65  + qdt*gravity_field(ixo^s,idim)*wct(ixo^s,iw_rho)
66  endif
67  if(energy) then
68  if(rhov) then
69  if(size(iw_mom)<ndim) call mpistop("rhov is not supported for ffHD")
70  w(ixo^s,iw_e)=w(ixo^s,iw_e) &
71  +qdt*gravity_field(ixo^s,idim)*wctprim(ixo^s,iw_mom(idim))*wctprim(ixo^s,iw_rho)
72  else
73  if(size(iw_mom)<ndim) then
74  w(ixo^s,iw_e)=w(ixo^s,iw_e) &
75  + qdt*gravity_field(ixo^s,idim)*wct(ixo^s,iw_mom(1))*block%B0(ixo^s,idim,0)
76  else
77  w(ixo^s,iw_e)=w(ixo^s,iw_e) &
78  + qdt*gravity_field(ixo^s,idim)*wct(ixo^s,iw_mom(idim))
79  endif
80  end if
81  end if
82  end do
83  end if
84  end subroutine gravity_add_source
85 
86  subroutine gravity_get_dt(w,ixI^L,ixO^L,dtnew,dx^D,x)
88  use mod_usr_methods
89 
90  integer, intent(in) :: ixI^L, ixO^L
91  double precision, intent(in) :: dx^D, x(ixI^S,1:ndim), w(ixI^S,1:nw)
92  double precision, intent(inout) :: dtnew
93 
94  double precision :: dxinv(1:ndim), max_grav
95  double precision :: gravity_field(ixI^S,ndim)
96  integer :: idim
97 
98  ^d&dxinv(^d)=one/dx^d;
99  call usr_gravity(ixi^l,ixo^l,w,x,gravity_field)
100  do idim = 1, ndim
101  max_grav = maxval(abs(gravity_field(ixo^s,idim)))
102  max_grav = max(max_grav, epsilon(1.0d0))
103  dtnew = min(dtnew, 1.0d0 / sqrt(max_grav * dxinv(idim)))
104  end do
105  end subroutine gravity_get_dt
106 end module mod_gravity
subroutine, public mpistop(message)
Exit MPI-AMRVAC with an error message.
Definition: mod_comm_lib.t:208
This module contains definitions of global parameters and variables and some generic functions/subrou...
type(state), pointer block
Block pointer for using one block and its previous state.
integer, parameter unitpar
file handle for IO
logical any_source_split
if any normal source term is added in split fasion
character(len=std_len), dimension(:), allocatable par_files
Which par files are used as input.
Module for including gravity in (magneto)hydrodynamics simulations.
Definition: mod_gravity.t:2
logical grav_split
source split or not
Definition: mod_gravity.t:6
subroutine gravity_get_dt(w, ixIL, ixOL, dtnew, dxD, x)
Definition: mod_gravity.t:87
subroutine gravity_add_source(qdt, ixIL, ixOL, wCT, wCTprim, w, x, energy, rhov, qsourcesplit, active)
w[iw]=w[iw]+qdt*S[wCT,qtC,x] where S is the source based on wCT within ixO
Definition: mod_gravity.t:43
subroutine grav_params_read(files)
Read this module's parameters from a file.
Definition: mod_gravity.t:11
subroutine gravity_init()
Initialize the module.
Definition: mod_gravity.t:26
Module with all the methods that users can customize in AMRVAC.
procedure(phys_gravity), pointer usr_gravity