31 logical,
public,
protected ::
rhd_dust = .false.
49 integer,
public,
protected ::
rho_
52 integer,
allocatable,
public,
protected ::
mom(:)
55 integer,
allocatable,
public,
protected ::
tracer(:)
58 integer,
public,
protected ::
e_
61 integer,
public,
protected ::
p_
64 integer,
public,
protected ::
r_e
76 double precision,
protected :: small_e
79 double precision,
public,
protected ::
small_r_e = 0.d0
82 logical,
public,
protected ::
rhd_trac = .false.
110 logical,
protected :: radio_acoustic_filter = .false.
111 integer,
protected :: size_ra_filter = 1
117 logical :: dt_c = .false.
137 subroutine rhd_read_params(files)
139 character(len=*),
intent(in) :: files(:)
149 do n = 1,
size(files)
150 open(
unitpar, file=trim(files(n)), status=
"old")
151 read(
unitpar, rhd_list,
end=111)
155 end subroutine rhd_read_params
160 integer,
intent(in) :: fh
161 integer,
parameter :: n_par = 1
162 double precision :: values(n_par)
163 character(len=name_len) :: names(n_par)
164 integer,
dimension(MPI_STATUS_SIZE) :: st
167 call mpi_file_write(fh, n_par, 1, mpi_integer, st, er)
171 call mpi_file_write(fh, values, n_par, mpi_double_precision, st, er)
172 call mpi_file_write(fh, names, n_par * name_len, mpi_character, st, er)
180 double precision,
intent(in) :: x(ixI^S,1:ndim)
181 double precision,
intent(inout) :: fC(ixI^S,1:nwflux,1:ndim), wnew(ixI^S,1:nw)
182 integer,
intent(in) :: ixI^L, ixO^L
183 integer,
intent(in) :: idim
184 integer :: hxO^L, kxC^L, iw
185 double precision :: inv_volume(ixI^S)
190 hxo^l=ixo^l-
kr(idim,^
d);
195 inv_volume(ixo^s) = 1.0d0/
block%dvolume(ixo^s)
200 isangmom = (iw==iw_mom(
phi_))
203 if (idim==
r_ .and. isangmom)
then
204 fc(kxc^s,iw,idim)= fc(kxc^s,iw,idim)*(x(kxc^s,
r_)+half*
block%dx(kxc^s,idim))
205 wnew(ixo^s,iw)=wnew(ixo^s,iw) + (fc(ixo^s,iw,idim)-fc(hxo^s,iw,idim)) * &
206 (inv_volume(ixo^s)/x(ixo^s,idim))
208 wnew(ixo^s,iw)=wnew(ixo^s,iw) + (fc(ixo^s,iw,idim)-fc(hxo^s,iw,idim)) * &
214 call mpistop(
"Error: rhd_angmomfix is not implemented &\\
215 &with dust and coordinate=='spherical'")
217 if (idim==
r_ .and. (iw==iw_mom(2) .or. iw==iw_mom(
phi_)))
then
218 fc(kxc^s,iw,idim)= fc(kxc^s,iw,idim)*(x(kxc^s,idim)+half*
block%dx(kxc^s,idim))
219 wnew(ixo^s,iw)=wnew(ixo^s,iw) + (fc(ixo^s,iw,idim)-fc(hxo^s,iw,idim)) * &
220 (inv_volume(ixo^s)/x(ixo^s,idim))
221 elseif (idim==2 .and. iw==iw_mom(
phi_))
then
222 fc(kxc^s,iw,idim)=fc(kxc^s,iw,idim)*sin(x(kxc^s,idim)+half*
block%dx(kxc^s,idim))
223 wnew(ixo^s,iw)=wnew(ixo^s,iw) + (fc(ixo^s,iw,idim)-fc(hxo^s,iw,idim)) * &
224 (inv_volume(ixo^s)/sin(x(ixo^s,idim)))
226 wnew(ixo^s,iw)=wnew(ixo^s,iw) + (fc(ixo^s,iw,idim)-fc(hxo^s,iw,idim)) * &
265 if(
mype==0)
write(*,*)
'WARNING: set rhd_trac_type=1'
270 if(
mype==0)
write(*,*)
'WARNING: set rhd_trac=F when ndim>=2'
278 if(
mype==0)
write(*,*)
'WARNING: set rhd_thermal_conduction=F when rhd_energy=F'
282 if(
mype==0)
write(*,*)
'WARNING: set rhd_radiative_cooling=F when rhd_energy=F'
287 allocate(start_indices(number_species),stop_indices(number_species))
295 mom(:) = var_set_momentum(
ndir)
299 e_ = var_set_energy()
307 r_e = var_set_radiation_energy()
348 call mpistop(
'Radiation formalism unknown')
361 tracer(itr) = var_set_fluxvar(
"trc",
"trp", itr, need_bc=.false.)
368 stop_indices(1)=nwflux
380 call mpistop(
"thermal conduction needs rhd_energy=T")
400 call mpistop(
"radiative cooling needs rhd_energy=T")
436 call mpistop(
"phys_check error: flux_type has wrong shape")
440 allocate(iw_vector(nvector))
441 iw_vector(1) =
mom(1) - 1
453 case(
'EIvtiCCmpi',
'EIvtuCCmpi')
455 case(
'ESvtiCCmpi',
'ESvtuCCmpi')
457 case(
'SIvtiCCmpi',
'SIvtuCCmpi')
460 call mpistop(
"Error in synthesize emission: Unknown convert_type")
471 integer,
intent(in) :: ixI^L, ixO^L, igrid, nflux
472 double precision,
intent(in) :: x(ixI^S,1:ndim)
473 double precision,
intent(inout) :: wres(ixI^S,1:nw), w(ixI^S,1:nw)
474 double precision,
intent(in) :: my_dt
475 logical,
intent(in) :: fix_conserve_at_step
487 integer,
intent(in) :: ixi^
l, ixo^
l
488 double precision,
intent(in) ::
dx^
d, x(ixi^s,1:
ndim)
489 double precision,
intent(in) :: w(ixi^s,1:nw)
490 double precision :: dtnew
501 integer,
intent(in) :: ixI^L,ixO^L
502 double precision,
intent(inout) :: w(ixI^S,1:nw)
503 double precision,
intent(in) :: x(ixI^S,1:ndim)
504 integer,
intent(in) :: step
507 logical :: flag(ixI^S,1:nw)
508 character(len=140) :: error_msg
511 where(w(ixo^s,
e_)<small_e) flag(ixo^s,
e_)=.true.
512 if(any(flag(ixo^s,
e_)))
then
515 where(flag(ixo^s,
e_)) w(ixo^s,
e_)=small_e
522 w(ixo^s, iw_mom(idir)) = w(ixo^s, iw_mom(idir))/w(ixo^s,
rho_)
524 write(error_msg,
"(a,i3)")
"Thermal conduction step ", step
534 type(tc_fluid),
intent(inout) :: fl
536 logical :: tc_saturate=.false.
537 double precision :: tc_k_para=0d0
539 namelist /tc_list/ tc_saturate, tc_k_para
541 do n = 1,
size(par_files)
542 open(
unitpar, file=trim(par_files(n)), status=
"old")
543 read(
unitpar, tc_list,
end=111)
546 fl%tc_saturate = tc_saturate
547 fl%tc_k_para = tc_k_para
553 integer,
intent(in) :: ixI^L, ixO^L
554 double precision,
intent(in) :: w(ixI^S,1:nw),x(ixI^S,1:ndim)
555 double precision,
intent(out) :: rho(ixI^S)
557 rho(ixo^s) = w(ixo^s,
rho_)
567 type(rc_fluid),
intent(inout) :: fl
570 integer :: ncool = 4000
571 double precision :: cfrac=0.1d0
574 character(len=std_len) :: coolcurve=
'JCcorona'
577 character(len=std_len) :: coolmethod=
'exact'
580 logical :: Tfix=.false.
586 logical :: rc_split=.false.
589 namelist /rc_list/ coolcurve, coolmethod, ncool, cfrac, tlow, tfix, rc_split
593 read(
unitpar, rc_list,
end=111)
598 fl%coolcurve=coolcurve
599 fl%coolmethod=coolmethod
619 call mpistop (
"Error: rhd_gamma <= 0 or rhd_gamma == 1.0")
629 call mpistop(
"Use an IMEX scheme when doing FLD")
648 mg%bc(ib, mg_iphi)%bc_type = mg_bc_neumann
649 mg%bc(ib, mg_iphi)%bc_value = 0.0_dp
652 mg%bc(ib, mg_iphi)%bc_type = mg_bc_dirichlet
653 mg%bc(ib, mg_iphi)%bc_value = 0.0_dp
657 mg%bc(ib, mg_iphi)%bc_type = mg_bc_neumann
658 mg%bc(ib, mg_iphi)%bc_value = 0.0_dp
666 call mpistop(
"divE_multigrid warning: unknown b.c. ")
674 double precision :: mp,kB
718 logical,
intent(in) :: primitive
719 integer,
intent(in) :: ixi^
l, ixo^
l
720 double precision,
intent(in) :: w(ixi^s, nw)
721 logical,
intent(inout) :: flag(ixi^s,1:nw)
722 double precision :: tmp(ixi^s)
748 integer,
intent(in) :: ixi^
l, ixo^
l
749 double precision,
intent(inout) :: w(ixi^s, nw)
750 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
751 double precision :: invgam
761 w(ixo^s,
e_) = w(ixo^s,
e_) * invgam + &
762 0.5d0 * sum(w(ixo^s,
mom(:))**2, dim=
ndim+1) * w(ixo^s,
rho_)
767 w(ixo^s,
mom(idir)) = w(ixo^s,
rho_) * w(ixo^s,
mom(idir))
780 integer,
intent(in) :: ixi^
l, ixo^
l
781 double precision,
intent(inout) :: w(ixi^s, nw)
782 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
784 double precision :: inv_rho(ixo^s)
790 inv_rho = 1.0d0 / w(ixo^s,
rho_)
800 w(ixo^s,
mom(idir)) = w(ixo^s,
mom(idir)) * inv_rho
813 integer,
intent(in) :: ixI^L, ixO^L
814 double precision,
intent(inout) :: w(ixI^S, nw)
815 double precision,
intent(in) :: x(ixI^S, 1:ndim)
818 w(ixo^s,
e_)=w(ixo^s,
e_)&
826 integer,
intent(in) :: ixI^L, ixO^L
827 double precision,
intent(inout) :: w(ixI^S, nw)
828 double precision,
intent(in) :: x(ixI^S, 1:ndim)
831 w(ixo^s,
e_)=w(ixo^s,
e_)&
839 integer,
intent(in) :: ixI^L, ixO^L
840 double precision :: w(ixI^S, nw)
841 double precision,
intent(in) :: x(ixI^S, 1:ndim)
847 call mpistop(
"energy from entropy can not be used with -eos = iso !")
854 integer,
intent(in) :: ixI^L, ixO^L
855 double precision :: w(ixI^S, nw)
856 double precision,
intent(in) :: x(ixI^S, 1:ndim)
862 call mpistop(
"entropy from energy can not be used with -eos = iso !")
869 integer,
intent(in) :: ixI^L, ixO^L, idim
870 double precision,
intent(in) :: w(ixI^S, nw), x(ixI^S, 1:ndim)
871 double precision,
intent(out) :: v(ixI^S)
873 v(ixo^s) = w(ixo^s,
mom(idim)) / w(ixo^s,
rho_)
881 integer,
intent(in) :: ixI^L, ixO^L, idim
882 double precision,
intent(in) :: w(ixI^S, nw), x(ixI^S, 1:ndim)
883 double precision,
intent(inout) :: cmax(ixI^S)
884 double precision :: csound(ixI^S)
885 double precision :: v(ixI^S)
887 call rhd_get_v(w, x, ixi^l, ixo^l, idim, v)
889 csound(ixo^s) = dsqrt(csound(ixo^s))
891 cmax(ixo^s) = dabs(v(ixo^s))+csound(ixo^s)
901 integer,
intent(in) :: ixI^L, ixO^L
902 double precision,
intent(in) :: w(ixI^S, nw), x(ixI^S,1:ndim)
903 double precision,
intent(inout) :: a2max(ndim)
904 double precision :: a2(ixI^S,ndim,nw)
905 integer :: gxO^L,hxO^L,jxO^L,kxO^L,i,j
910 hxo^l=ixo^l-
kr(i,^
d);
911 gxo^l=hxo^l-
kr(i,^
d);
912 jxo^l=ixo^l+
kr(i,^
d);
913 kxo^l=jxo^l+
kr(i,^
d);
914 a2(ixo^s,i,1:nw)=dabs(-w(kxo^s,1:nw)+16.d0*w(jxo^s,1:nw)&
915 -30.d0*w(ixo^s,1:nw)+16.d0*w(hxo^s,1:nw)-w(gxo^s,1:nw))
916 a2max(i)=maxval(a2(ixo^s,i,1:nw))/12.d0/
dxlevel(i)**2
923 integer,
intent(in) :: ixI^L,ixO^L
924 double precision,
intent(in) :: x(ixI^S,1:ndim)
925 double precision,
intent(inout) :: w(ixI^S,1:nw)
926 double precision,
intent(out) :: tco_local, Tmax_local
928 double precision,
parameter :: trac_delta=0.25d0
929 double precision :: tmp1(ixI^S),Te(ixI^S),lts(ixI^S)
930 double precision :: ltr(ixI^S),ltrc,ltrp,tcoff(ixI^S)
931 integer :: jxO^L,hxO^L
932 integer :: jxP^L,hxP^L,ixP^L
933 logical :: lrlt(ixI^S)
936 tmp1(ixi^s)=w(ixi^s,
e_)-0.5d0*sum(w(ixi^s,iw_mom(:))**2,dim=ndim+1)/w(ixi^s,
rho_)
940 tmax_local=maxval(te(ixo^s))
947 lts(ixo^s)=0.5d0*dabs(te(jxo^s)-te(hxo^s))/te(ixo^s)
949 where(lts(ixo^s) > trac_delta)
952 if(any(lrlt(ixo^s)))
then
953 tco_local=maxval(te(ixo^s), mask=lrlt(ixo^s))
964 lts(ixp^s)=0.5d0*abs(te(jxp^s)-te(hxp^s))/te(ixp^s)
965 ltr(ixp^s)=max(one, (exp(lts(ixp^s))/ltrc)**ltrp)
966 w(ixo^s,
tcoff_)=te(ixo^s)*&
967 (0.25*(ltr(jxo^s)+two*ltr(ixo^s)+ltr(hxo^s)))**0.4d0
969 call mpistop(
"mrhd_trac_type not allowed for 1D simulation")
975 subroutine rhd_get_cbounds(wLC, wRC, wLp, wRp, x, ixI^L, ixO^L, idim,Hspeed,cmax, cmin)
980 integer,
intent(in) :: ixI^L, ixO^L, idim
982 double precision,
intent(in) :: wLC(ixI^S, nw), wRC(ixI^S, nw)
984 double precision,
intent(in) :: wLp(ixI^S, nw), wRp(ixI^S, nw)
985 double precision,
intent(in) :: x(ixI^S, 1:ndim)
986 double precision,
intent(inout) :: cmax(ixI^S,1:number_species)
987 double precision,
intent(inout),
optional :: cmin(ixI^S,1:number_species)
988 double precision,
intent(in) :: Hspeed(ixI^S,1:number_species)
990 double precision :: wmean(ixI^S,nw)
991 double precision,
dimension(ixI^S) :: umean, dmean, csoundL, csoundR, tmp1,tmp2,tmp3
999 tmp1(ixo^s)=dsqrt(wlp(ixo^s,
rho_))
1000 tmp2(ixo^s)=dsqrt(wrp(ixo^s,
rho_))
1001 tmp3(ixo^s)=1.d0/(dsqrt(wlp(ixo^s,
rho_))+dsqrt(wrp(ixo^s,
rho_)))
1002 umean(ixo^s)=(wlp(ixo^s,
mom(idim))*tmp1(ixo^s)+wrp(ixo^s,
mom(idim))*tmp2(ixo^s))*tmp3(ixo^s)
1018 dmean(ixo^s) = (tmp1(ixo^s)*csoundl(ixo^s)+tmp2(ixo^s)*csoundr(ixo^s)) * &
1019 tmp3(ixo^s) + 0.5d0*tmp1(ixo^s)*tmp2(ixo^s)*tmp3(ixo^s)**2 * &
1020 (wrp(ixo^s,
mom(idim))-wlp(ixo^s,
mom(idim)))**2
1022 dmean(ixo^s)=dsqrt(dmean(ixo^s))
1023 if(
present(cmin))
then
1024 cmin(ixo^s,1)=umean(ixo^s)-dmean(ixo^s)
1025 cmax(ixo^s,1)=umean(ixo^s)+dmean(ixo^s)
1027 {
do ix^db=ixomin^db,ixomax^db\}
1028 cmin(ix^d,1)=sign(one,cmin(ix^d,1))*max(abs(cmin(ix^d,1)),hspeed(ix^d,1))
1029 cmax(ix^d,1)=sign(one,cmax(ix^d,1))*max(abs(cmax(ix^d,1)),hspeed(ix^d,1))
1033 cmax(ixo^s,1)=dabs(umean(ixo^s))+dmean(ixo^s)
1037 wmean(ixo^s,1:nwflux)=0.5d0*(wlc(ixo^s,1:nwflux)+wrc(ixo^s,1:nwflux))
1038 call dust_get_cmax(wmean, x, ixi^l, ixo^l, idim, cmax, cmin)
1042 wmean(ixo^s,1:nwflux)=0.5d0*(wlc(ixo^s,1:nwflux)+wrc(ixo^s,1:nwflux))
1043 tmp1(ixo^s)=wmean(ixo^s,
mom(idim))/wmean(ixo^s,
rho_)
1045 csoundr(ixo^s) = dsqrt(csoundr(ixo^s))
1047 if(
present(cmin))
then
1048 cmax(ixo^s,1)=max(tmp1(ixo^s)+csoundr(ixo^s),zero)
1049 cmin(ixo^s,1)=min(tmp1(ixo^s)-csoundr(ixo^s),zero)
1050 if(h_correction)
then
1051 {
do ix^db=ixomin^db,ixomax^db\}
1052 cmin(ix^d,1)=sign(one,cmin(ix^d,1))*max(abs(cmin(ix^d,1)),hspeed(ix^d,1))
1053 cmax(ix^d,1)=sign(one,cmax(ix^d,1))*max(abs(cmax(ix^d,1)),hspeed(ix^d,1))
1057 cmax(ixo^s,1)=dabs(tmp1(ixo^s))+csoundr(ixo^s)
1061 call dust_get_cmax(wmean, x, ixi^l, ixo^l, idim, cmax, cmin)
1078 csoundl(ixo^s)=max(dsqrt(csoundl(ixo^s)),dsqrt(csoundr(ixo^s)))
1079 if(
present(cmin))
then
1080 cmin(ixo^s,1)=min(wlp(ixo^s,
mom(idim)),wrp(ixo^s,
mom(idim)))-csoundl(ixo^s)
1081 cmax(ixo^s,1)=max(wlp(ixo^s,
mom(idim)),wrp(ixo^s,
mom(idim)))+csoundl(ixo^s)
1082 if(h_correction)
then
1083 {
do ix^db=ixomin^db,ixomax^db\}
1084 cmin(ix^d,1)=sign(one,cmin(ix^d,1))*max(abs(cmin(ix^d,1)),hspeed(ix^d,1))
1085 cmax(ix^d,1)=sign(one,cmax(ix^d,1))*max(abs(cmax(ix^d,1)),hspeed(ix^d,1))
1089 cmax(ixo^s,1)=max(wlp(ixo^s,
mom(idim)),wrp(ixo^s,
mom(idim)))+csoundl(ixo^s)
1092 wmean(ixo^s,1:nwflux)=0.5d0*(wlc(ixo^s,1:nwflux)+wrc(ixo^s,1:nwflux))
1093 call dust_get_cmax(wmean, x, ixi^l, ixo^l, idim, cmax, cmin)
1103 integer,
intent(in) :: ixi^
l, ixo^
l
1104 double precision,
intent(in) :: w(ixi^s,nw)
1105 double precision,
intent(in) :: x(ixi^s,1:
ndim)
1106 double precision,
intent(out) :: csound2(ixi^s)
1109 csound2(ixo^s)=max(
rhd_gamma,4.d0/3.d0)*csound2(ixo^s)/w(ixo^s,
rho_)
1120 integer,
intent(in) :: ixi^
l, ixo^
l
1121 double precision,
intent(in) :: w(ixi^s, 1:nw)
1122 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1123 double precision,
intent(out):: pth(ixi^s)
1127 pth(ixi^s) = (
rhd_gamma - 1.d0) * (w(ixi^s,
e_) - &
1128 0.5d0 * sum(w(ixi^s,
mom(:))**2, dim=
ndim+1) / w(ixi^s,
rho_))
1140 call mpistop(
'rhd_pressure unknown, use Trad or adiabatic')
1148 {
do ix^db= ixo^lim^db\}
1150 write(*,*)
"Error: small value of gas pressure",pth(ix^
d),&
1151 " encountered when call rhd_get_pthermal"
1153 write(*,*)
"Location: ", x(ix^
d,:)
1154 write(*,*)
"Cell number: ", ix^
d
1156 write(*,*) trim(cons_wnames(iw)),
": ",w(ix^
d,iw)
1160 write(*,*)
"Saving status at the previous time step"
1167 {
do ix^db= ixo^lim^db\}
1183 integer,
intent(in) :: ixi^
l, ixo^
l
1184 double precision,
intent(in) :: w(ixi^s, 1:nw)
1185 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1186 double precision,
intent(out):: prad(ixo^s, 1:
ndim, 1:
ndim)
1194 call mpistop(
'Radiation formalism unknown')
1202 integer,
intent(in) :: ixi^
l, ixo^
l
1203 double precision,
intent(in) :: w(ixi^s, 1:nw)
1204 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1205 double precision :: pth(ixi^s)
1206 double precision :: prad_tensor(ixo^s, 1:
ndim, 1:
ndim)
1207 double precision :: prad_max(ixo^s)
1208 double precision,
intent(out):: ptot(ixi^s)
1214 {
do ix^
d = ixomin^
d,ixomax^
d\}
1215 prad_max(ix^
d) = maxval(prad_tensor(ix^
d,:,:))
1219 if (radio_acoustic_filter)
then
1223 ptot(ixo^s) = pth(ixo^s) + prad_max(ixo^s)
1231 integer,
intent(in) :: ixI^L, ixO^L
1232 double precision,
intent(in) :: x(ixI^S, 1:ndim)
1233 double precision,
intent(inout) :: prad_max(ixO^S)
1235 double precision :: tmp_prad(ixI^S)
1236 integer :: ix^D, filter, idim
1238 if (size_ra_filter .lt. 1)
call mpistop(
"ra filter of size < 1 makes no sense")
1239 if (size_ra_filter .gt.
nghostcells)
call mpistop(
"ra filter of size < nghostcells makes no sense")
1241 tmp_prad(ixi^s) = zero
1242 tmp_prad(ixo^s) = prad_max(ixo^s)
1244 do filter = 1,size_ra_filter
1247 {
do ix^d = ixomin^d,ixomax^d\}
1248 prad_max(ix^d) = min(tmp_prad(ix^d),tmp_prad(ix^d+filter*
kr(idim,^d)))
1249 prad_max(ix^d) = min(tmp_prad(ix^d),tmp_prad(ix^d-filter*
kr(idim,^d)))
1258 integer,
intent(in) :: ixI^L, ixO^L
1259 double precision,
intent(in) :: w(ixI^S, 1:nw)
1260 double precision,
intent(in) :: x(ixI^S, 1:ndim)
1261 double precision,
intent(out):: res(ixI^S)
1264 res(ixo^s)=res(ixo^s)/w(ixo^s,
rho_)
1271 integer,
intent(in) :: ixI^L, ixO^L
1272 double precision,
intent(in) :: w(ixI^S, 1:nw)
1273 double precision,
intent(in) :: x(ixI^S, 1:ndim)
1274 double precision,
intent(out):: res(ixI^S)
1282 integer,
intent(in) :: ixi^
l, ixo^
l
1283 double precision,
intent(in) :: w(ixi^s, 1:nw)
1284 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1285 double precision :: pth(ixi^s)
1286 double precision,
intent(out):: tgas(ixi^s)
1289 tgas(ixi^s) = pth(ixi^s)/w(ixi^s,
rho_)
1298 integer,
intent(in) :: ixi^
l, ixo^
l
1299 double precision,
intent(in) :: w(ixi^s, 1:nw)
1300 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1301 double precision,
intent(out):: trad(ixi^s)
1313 integer,
intent(in) :: ixI^L, ixO^L
1314 double precision,
intent(inout) :: w(ixI^S, nw)
1315 double precision,
intent(in) :: x(ixI^S, 1:ndim)
1318 w(ixo^s,
e_)=w(ixo^s,
e_)&
1327 integer,
intent(in) :: ixI^L, ixO^L
1328 double precision,
intent(inout) :: w(ixI^S, nw)
1329 double precision,
intent(in) :: x(ixI^S, 1:ndim)
1332 w(ixo^s,
e_)=w(ixo^s,
e_)&
1343 integer,
intent(in) :: ixI^L, ixO^L, idim
1344 double precision,
intent(in) :: w(ixI^S, 1:nw), x(ixI^S, 1:ndim)
1345 double precision,
intent(out) :: f(ixI^S, nwflux)
1346 double precision :: pth(ixI^S), v(ixI^S),frame_vel(ixI^S)
1347 integer :: idir, itr
1350 call rhd_get_v(w, x, ixi^l, ixo^l, idim, v)
1352 f(ixo^s,
rho_) = v(ixo^s) * w(ixo^s,
rho_)
1356 f(ixo^s,
mom(idir)) = v(ixo^s) * w(ixo^s,
mom(idir))
1359 f(ixo^s,
mom(idir)) = f(ixo^s,
mom(idir)) + v(ixo^s) * frame_vel(ixo^s)*w(ixo^s,
rho_)
1363 f(ixo^s,
mom(idim)) = f(ixo^s,
mom(idim)) + pth(ixo^s)
1367 f(ixo^s,
e_) = v(ixo^s) * (w(ixo^s,
e_) + pth(ixo^s))
1371 f(ixo^s,
r_e) = v(ixo^s) * w(ixo^s,
r_e)
1373 f(ixo^s,
r_e) = zero
1377 f(ixo^s,
tracer(itr)) = v(ixo^s) * w(ixo^s,
tracer(itr))
1394 integer,
intent(in) :: ixI^L, ixO^L, idim
1396 double precision,
intent(in) :: wC(ixI^S, 1:nw)
1398 double precision,
intent(in) :: w(ixI^S, 1:nw)
1399 double precision,
intent(in) :: x(ixI^S, 1:ndim)
1400 double precision,
intent(out) :: f(ixI^S, nwflux)
1401 double precision :: pth(ixI^S),frame_vel(ixI^S)
1402 integer :: idir, itr
1405 pth(ixo^s) = w(ixo^s,
p_)
1410 f(ixo^s,
rho_) = w(ixo^s,
mom(idim)) * w(ixo^s,
rho_)
1414 f(ixo^s,
mom(idir)) = w(ixo^s,
mom(idim)) * wc(ixo^s,
mom(idir))
1416 call mpistop(
"rhd_rotating_frame not implemented yet with angmomfix")
1419 f(ixo^s,
mom(idir)) = f(ixo^s,
mom(idir)) + w(ixo^s,
mom(idim))* wc(ixo^s,
rho_) * frame_vel(ixo^s)
1423 f(ixo^s,
mom(idim)) = f(ixo^s,
mom(idim)) + pth(ixo^s)
1427 f(ixo^s,
e_) = w(ixo^s,
mom(idim)) * (wc(ixo^s,
e_) + w(ixo^s,
p_))
1431 f(ixo^s,
r_e) = w(ixo^s,
mom(idim)) * wc(ixo^s,
r_e)
1433 f(ixo^s,
r_e) = zero
1466 integer,
intent(in) :: ixI^L, ixO^L
1467 double precision,
intent(in) :: qdt, x(ixI^S, 1:ndim)
1468 double precision,
intent(inout) :: wCT(ixI^S, 1:nw), w(ixI^S, 1:nw)
1472 double precision :: pth(ixI^S), source(ixI^S), minrho
1473 integer :: iw,idir, h1x^L{^NOONED, h2x^L}
1474 integer :: mr_,mphi_
1475 integer :: irho, ifluid, n_fluids
1476 double precision :: exp_factor(ixI^S), del_exp_factor(ixI^S), exp_factor_primitive(ixI^S)
1490 source(ixo^s) =
source(ixo^s)*del_exp_factor(ixo^s)/exp_factor(ixo^s)
1495 call mpistop(
"Diffusion term not implemented yet with cylkindrical geometries")
1498 do ifluid = 0, n_fluids-1
1500 if (ifluid == 0)
then
1516 where (wct(ixo^s, irho) > minrho)
1517 source(ixo^s) =
source(ixo^s) + wct(ixo^s, mphi_)**2 / wct(ixo^s, irho)
1518 w(ixo^s, mr_) = w(ixo^s, mr_) + qdt *
source(ixo^s) / x(ixo^s,
r_)
1522 where (wct(ixo^s, irho) > minrho)
1523 source(ixo^s) = -wct(ixo^s, mphi_) * wct(ixo^s, mr_) / wct(ixo^s, irho)
1524 w(ixo^s, mphi_) = w(ixo^s, mphi_) + qdt *
source(ixo^s) / x(ixo^s,
r_)
1529 w(ixo^s, mr_) = w(ixo^s, mr_) + qdt *
source(ixo^s) / x(ixo^s,
r_)
1535 call mpistop(
"Diffusion term not implemented yet with spherical geometries")
1539 call mpistop(
"Dust geom source terms not implemented yet with spherical geometries")
1543 h1x^l=ixo^l-
kr(1,^
d); {^nooned h2x^l=ixo^l-
kr(2,^
d);}
1546 source(ixo^s) = pth(ixo^s) * x(ixo^s, 1) &
1547 *(
block%surfaceC(ixo^s, 1) -
block%surfaceC(h1x^s, 1)) &
1548 /
block%dvolume(ixo^s)
1554 w(ixo^s, mr_) = w(ixo^s, mr_) + qdt *
source(ixo^s) / x(ixo^s, 1)
1558 source(ixo^s) = pth(ixo^s) * x(ixo^s, 1) &
1559 * (
block%surfaceC(ixo^s, 2) -
block%surfaceC(h2x^s, 2)) &
1560 /
block%dvolume(ixo^s)
1562 source(ixo^s) =
source(ixo^s) + (wct(ixo^s,
mom(3))**2 / wct(ixo^s,
rho_)) / tan(x(ixo^s, 2))
1567 w(ixo^s,
mom(2)) = w(ixo^s,
mom(2)) + qdt *
source(ixo^s) / x(ixo^s, 1)
1572 source(ixo^s) = -(wct(ixo^s,
mom(3)) * wct(ixo^s, mr_)) / wct(ixo^s,
rho_)&
1573 - (wct(ixo^s,
mom(2)) * wct(ixo^s,
mom(3))) / wct(ixo^s,
rho_) / tan(x(ixo^s, 2))
1574 w(ixo^s,
mom(3)) = w(ixo^s,
mom(3)) + qdt *
source(ixo^s) / x(ixo^s, 1)
1584 call mpistop(
"Rotating frame not implemented yet with dust")
1601 integer,
intent(in) :: ixI^L, ixO^L
1602 double precision,
intent(in) :: qdt
1603 double precision,
intent(in) :: wCT(ixI^S, 1:nw), x(ixI^S, 1:ndim)
1604 double precision,
intent(inout) :: w(ixI^S, 1:nw)
1605 logical,
intent(in) :: qsourcesplit
1606 logical,
intent(inout) :: active
1607 double precision,
intent(in),
optional :: wCTprim(ixI^S, 1:nw)
1609 double precision :: gravity_field(ixI^S, 1:ndim)
1610 integer :: idust, idim
1618 qsourcesplit,active,
rc_fl)
1633 call usr_gravity(ixi^l, ixo^l, wct, x, gravity_field)
1637 + qdt * gravity_field(ixo^s, idim) * wct(ixo^s,
dust_rho(idust))
1655 integer,
intent(in) :: ixI^L, ixO^L
1656 double precision,
intent(in) :: qdt, x(ixI^S,1:ndim)
1657 double precision,
intent(in) :: wCT(ixI^S,1:nw)
1658 double precision,
intent(inout) :: w(ixI^S,1:nw)
1659 logical,
intent(in) :: qsourcesplit
1660 logical,
intent(inout) :: active
1661 double precision :: cmax(ixI^S)
1699 call mpistop(
'Radiation formalism unknown')
1717 integer,
intent(in) :: ixI^L, ixO^L
1718 double precision,
intent(in) :: dx^D, x(ixI^S, 1:^ND)
1719 double precision,
intent(in) :: w(ixI^S, 1:nw)
1720 double precision,
intent(inout) :: dtnew
1724 if (.not. dt_c)
then
1737 call mpistop(
'Radiation formalism unknown')
1761 integer,
intent(in) :: ixi^l, ixo^l
1762 double precision,
intent(in) :: w(ixi^s, nw)
1763 double precision :: ke(ixo^s)
1764 double precision,
intent(in),
optional :: inv_rho(ixo^s)
1766 if (
present(inv_rho))
then
1767 ke = 0.5d0 * sum(w(ixo^s,
mom(:))**2, dim=
ndim+1) * inv_rho
1769 ke = 0.5d0 * sum(w(ixo^s,
mom(:))**2, dim=
ndim+1) / w(ixo^s,
rho_)
1775 integer,
intent(in) :: ixi^l, ixo^l
1776 double precision,
intent(in) :: w(ixi^s, nw)
1777 double precision :: inv_rho(ixo^s)
1780 inv_rho = 1.0d0 / w(ixo^s,
rho_)
1790 logical,
intent(in) :: primitive
1791 integer,
intent(in) :: ixI^L,ixO^L
1792 double precision,
intent(inout) :: w(ixI^S,1:nw)
1793 double precision,
intent(in) :: x(ixI^S,1:ndim)
1794 character(len=*),
intent(in) :: subname
1797 logical :: flag(ixI^S,1:nw)
1801 call rhd_check_w(primitive, ixi^l, ixo^l, w, flag)
1809 where(flag(ixo^s,
rho_)) w(ixo^s,
mom(idir)) = 0.0d0
1831 where(flag(ixo^s,
e_))
1856 -0.5d0*sum(w(ixi^s,
mom(:))**2, dim=ndim+1)/w(ixi^s,
rho_))
1859 +0.5d0*sum(w(ixi^s,
mom(:))**2, dim=ndim+1)/w(ixi^s,
rho_)
1873 if(.not.primitive)
then
1881 w(ixo^s,
mom(idir)) = w(ixo^s,
mom(idir))/w(ixo^s,
rho_)
subroutine mpistop(message)
Exit MPI-AMRVAC with an error message.
Calculate w(iw)=w(iw)+qdt*SOURCE[wCT,qtC,x] within ixO for all indices iw=iwmin......
Module for including anisotropic flux limited diffusion (AFLD)-approximation in Radiation-hydrodynami...
subroutine, public afld_radforce_get_dt(w, ixIL, ixOL, dtnew, dxD, x)
subroutine, public get_afld_energy_interact(qdt, ixIL, ixOL, wCT, w, x, energy, qsourcesplit, active)
w[iw]=w[iw]+qdt*S[wCT,qtC,x] where S is the source based on wCT within ixO This subroutine handles th...
subroutine, public afld_init(He_abundance, rhd_radiation_diffusion, afld_gamma)
Initialising FLD-module: Read opacities Initialise Multigrid adimensionalise kappa Add extra variable...
subroutine afld_get_diffcoef_central(w, wCT, x, ixIL, ixOL)
Calculates cell-centered diffusion coefficient to be used in multigrid.
subroutine, public get_afld_rad_force(qdt, ixIL, ixOL, wCT, w, x, energy, qsourcesplit, active)
w[iw]=w[iw]+qdt*S[wCT,qtC,x] where S is the source based on wCT within ixO This subroutine handles th...
subroutine, public afld_get_radpress(w, x, ixIL, ixOL, rad_pressure)
Calculate Radiation Pressure Returns Radiation Pressure as tensor.
Module with basic data types used in amrvac.
integer, parameter std_len
Default length for strings.
Module for physical and numeric constants.
double precision, parameter bigdouble
A very large real number.
double precision, parameter const_rad_a
Module for including dust species, which interact with the gas through a drag force.
subroutine, public dust_check_w(ixIL, ixOL, w, flag)
subroutine, public dust_get_flux(w, x, ixIL, ixOL, idim, f)
subroutine, public dust_get_dt(w, ixIL, ixOL, dtnew, dxD, x)
Get dt related to dust and gas stopping time (Laibe 2011)
subroutine, public dust_add_source(qdt, ixIL, ixOL, wCT, w, x, qsourcesplit, active)
w[iw]= w[iw]+qdt*S[wCT, x] where S is the source based on wCT within ixO
subroutine, public dust_to_primitive(ixIL, ixOL, w, x)
integer, dimension(:, :), allocatable, public, protected dust_mom
Indices of the dust momentum densities.
subroutine, public dust_get_cmax(w, x, ixIL, ixOL, idim, cmax, cmin)
integer, public, protected dust_n_species
The number of dust species.
integer, dimension(:), allocatable, public, protected dust_rho
Indices of the dust densities.
subroutine, public dust_get_flux_prim(w, x, ixIL, ixOL, idim, f)
subroutine, public dust_check_params()
subroutine, public dust_init(g_rho, g_mom, g_energy)
subroutine, public dust_to_conserved(ixIL, ixOL, w, x)
Module for flux conservation near refinement boundaries.
Nicolas Moens Module for including flux limited diffusion (FLD)-approximation in Radiation-hydrodynam...
double precision, public fld_mu
mean particle mass
subroutine, public fld_radforce_get_dt(w, ixIL, ixOL, dtnew, dxD, x)
character(len=8) fld_diff_scheme
Which method to solve diffusion part.
subroutine, public get_fld_rad_force(qdt, ixIL, ixOL, wCT, w, x, energy, qsourcesplit, active)
w[iw]=w[iw]+qdt*S[wCT,qtC,x] where S is the source based on wCT within ixO This subroutine handles th...
subroutine, public fld_get_radpress(w, x, ixIL, ixOL, rad_pressure)
Calculate Radiation Pressure Returns Radiation Pressure as tensor.
subroutine, public fld_init(He_abundance, rhd_radiation_diffusion, rhd_gamma)
Initialising FLD-module: Read opacities Initialise Multigrid adimensionalise kappa Add extra variable...
subroutine, public get_fld_energy_interact(qdt, ixIL, ixOL, wCT, w, x, energy, qsourcesplit, active)
w[iw]=w[iw]+qdt*S[wCT,qtC,x] where S is the source based on wCT within ixO This subroutine handles th...
subroutine fld_get_diffcoef_central(w, wCT, x, ixIL, ixOL)
Calculates cell-centered diffusion coefficient to be used in multigrid.
Module with geometry-related routines (e.g., divergence, curl)
integer, parameter spherical
integer, parameter cylindrical
integer, parameter cartesian_expansion
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.
logical h_correction
If true, do H-correction to fix the carbuncle problem at grid-aligned shocks.
integer, parameter bc_noinflow
double precision small_pressure
double precision unit_time
Physical scaling factor for time.
double precision unit_density
Physical scaling factor for density.
double precision unit_opacity
Physical scaling factor for Opacity.
integer, parameter unitpar
file handle for IO
integer, parameter bc_asymm
double precision global_time
The global simulation time.
logical use_imex_scheme
whether IMEX in use or not
integer, dimension(3, 3) kr
Kronecker delta tensor.
integer it
Number of time steps taken.
integer, dimension(:, :), allocatable typeboundary
Array indicating the type of boundary condition per variable and per physical boundary.
double precision unit_numberdensity
Physical scaling factor for number density.
character(len=std_len) convert_type
Which format to use when converting.
double precision unit_pressure
Physical scaling factor for pressure.
integer, parameter ndim
Number of spatial dimensions for grid variables.
logical angmomfix
Enable to strictly conserve the angular momentum (works both in cylindrical and spherical coordinates...
double precision unit_length
Physical scaling factor for length.
logical use_particles
Use particles module or not.
character(len=std_len), dimension(:), allocatable par_files
Which par files are used as input.
integer mype
The rank of the current MPI task.
integer, dimension(:), allocatable, parameter d
integer ndir
Number of spatial dimensions (components) for vector variables.
integer, parameter bc_periodic
integer, parameter bc_special
boundary condition types
double precision unit_velocity
Physical scaling factor for velocity.
double precision unit_temperature
Physical scaling factor for temperature.
double precision unit_radflux
Physical scaling factor for radiation flux.
integer, parameter bc_cont
logical si_unit
Use SI units (.true.) or use cgs units (.false.)
double precision, dimension(:,:), allocatable dx
integer nghostcells
Number of ghost cells surrounding a grid.
integer, parameter bc_symm
logical phys_trac
Use TRAC (Johnston 2019 ApJL, 873, L22) for MHD or 1D HD.
logical crash
Save a snapshot before crash a run met unphysical values.
logical use_multigrid
Use multigrid (only available in 2D and 3D)
double precision small_density
integer r_
Indices for cylindrical coordinates FOR TESTS, negative value when not used:
integer boundspeed
bound (left/min and right.max) speed of Riemann fan
integer, parameter unitconvert
double precision, dimension(ndim) dxlevel
logical check_small_values
check and optionally fix unphysical small values (density, gas pressure)
Module for including gravity in (magneto)hydrodynamics simulations.
logical grav_split
source split or not
subroutine gravity_get_dt(w, ixIL, ixOL, dtnew, dxD, x)
subroutine gravity_add_source(qdt, ixIL, ixOL, wCT, w, x, energy, qsourcesplit, active)
w[iw]=w[iw]+qdt*S[wCT,qtC,x] where S is the source based on wCT within ixO
subroutine gravity_init()
Initialize the module.
Module to couple the octree-mg library to AMRVAC. This file uses the VACPP preprocessor,...
type(mg_t) mg
Data structure containing the multigrid tree.
Module containing all the particle routines.
subroutine particles_init()
Initialize particle data and parameters.
This module defines the procedures of a physics module. It contains function pointers for the various...
procedure(sub_get_a2max), pointer phys_get_a2max
procedure(sub_convert), pointer phys_to_primitive
procedure(sub_get_tgas), pointer phys_get_tgas
procedure(sub_small_values), pointer phys_handle_small_values
procedure(sub_write_info), pointer phys_write_info
procedure(sub_get_flux), pointer phys_get_flux
logical phys_req_diagonal
Whether the physics routines require diagonal ghost cells, for example for computing a curl.
procedure(sub_get_cbounds), pointer phys_get_cbounds
procedure(sub_check_params), pointer phys_te_images
procedure(sub_get_dt), pointer phys_get_dt
logical phys_total_energy
Solve total energy equation or not.
procedure(sub_get_pthermal), pointer phys_get_pthermal
procedure(sub_get_tcutoff), pointer phys_get_tcutoff
procedure(sub_add_source_geom), pointer phys_add_source_geom
procedure(sub_check_params), pointer phys_check_params
integer, parameter flux_default
Indicates a normal flux.
integer, dimension(:, :), allocatable flux_type
Array per direction per variable, which can be used to specify that certain fluxes have to be treated...
integer phys_wider_stencil
To use wider stencils in flux calculations. A value of 1 will extend it by one cell in both direction...
procedure(sub_convert), pointer phys_to_conserved
character(len=name_len) physics_type
String describing the physics type of the simulation.
procedure(sub_check_w), pointer phys_check_w
procedure(sub_set_mg_bounds), pointer phys_set_mg_bounds
procedure(sub_get_trad), pointer phys_get_trad
double precision phys_gamma
procedure(sub_add_source), pointer phys_add_source
procedure(sub_angmomfix), pointer phys_angmomfix
procedure(sub_get_cmax), pointer phys_get_cmax
logical phys_energy
Solve energy equation or not.
module radiative cooling – add optically thin radiative cooling for HD and MHD
subroutine radiative_cooling_init(fl, read_params)
subroutine cooling_get_dt(w, ixIL, ixOL, dtnew, dxD, x, fl)
subroutine radiative_cooling_add_source(qdt, ixIL, ixOL, wCT, w, x, qsourcesplit, active, fl)
subroutine radiative_cooling_init_params(phys_gamma, He_abund)
Radiative cooling initialization.
Radiation-Hydrodynamics physics module Module aims at solving the Hydrodynamic equations toghether wi...
logical, public, protected rhd_radiative_cooling
Whether radiative cooling is added.
integer, public, protected rhd_n_tracer
Number of tracer species.
subroutine, public rhd_to_primitive(ixIL, ixOL, w, x)
Transform conservative variables into primitive ones.
integer, public, protected p_
Index of the gas pressure (-1 if not present) should equal e_.
type(tc_fluid), allocatable, public tc_fl
subroutine rhd_ei_to_e(ixIL, ixOL, w, x)
Transform internal energy to total energy.
logical, public, protected rhd_dust
Whether dust is added.
integer, public, protected rhd_trac_type
subroutine rhd_ei_to_e1(ixIL, ixOL, w, x)
logical, public, protected rhd_rotating_frame
Whether rotating frame is activated.
double precision function, dimension(ixo^s), public rhd_kin_en(w, ixIL, ixOL, inv_rho)
subroutine rhd_get_dt(w, ixIL, ixOL, dtnew, dxD, x)
subroutine, public rhd_get_pradiation(w, x, ixIL, ixOL, prad)
Calculate radiation pressure within ixO^L.
subroutine, public rhd_to_conserved(ixIL, ixOL, w, x)
Transform primitive variables into conservative ones.
logical, public, protected rhd_viscosity
Whether viscosity is added.
double precision, public kbmpmua4
kb/(m_p mu)* 1/a_rad**4,
subroutine rhd_get_temperature_from_eint(w, x, ixIL, ixOL, res)
Calculate temperature=p/rho when in e_ the internal energy is stored.
subroutine, public rhd_get_tgas(w, x, ixIL, ixOL, tgas)
Calculates gas temperature.
subroutine, public rhd_check_params
subroutine rhd_get_cbounds(wLC, wRC, wLp, wRp, x, ixIL, ixOL, idim, Hspeed, cmax, cmin)
Calculate cmax_idim = csound + abs(v_idim) within ixO^L.
logical, public, protected rhd_trac
Whether TRAC method is used.
subroutine, public rhd_phys_init()
Initialize the module.
character(len=8), public rhd_radiation_formalism
Formalism to treat radiation.
integer, public, protected rho_
Index of the density (in the w array)
integer, public, protected r_e
Index of the radiation energy.
logical, public, protected rhd_radiation_diffusion
Treat radiation energy diffusion.
integer, dimension(:), allocatable, public, protected mom
Indices of the momentum density.
character(len=8), public rhd_pressure
In the case of no rhd_energy, how to compute pressure.
subroutine rhd_add_source_geom(qdt, ixIL, ixOL, wCT, w, x)
Add geometrical source terms to w.
subroutine rhd_e_to_ei(ixIL, ixOL, w, x)
Transform total energy to internal energy.
subroutine rhd_add_radiation_source(qdt, ixIL, ixOL, wCT, w, x, qsourcesplit, active)
subroutine, public rhd_get_trad(w, x, ixIL, ixOL, trad)
Calculates radiation temperature.
subroutine rhd_get_tcutoff(ixIL, ixOL, w, x, tco_local, Tmax_local)
get adaptive cutoff temperature for TRAC (Johnston 2019 ApJL, 873, L22)
subroutine rhd_write_info(fh)
Write this module's parameters to a snapsoht.
subroutine rhos_to_e(ixIL, ixOL, w, x)
logical, public, protected rhd_force_diagonal
Allows overruling default corner filling (for debug mode, since otherwise corner primitives fail)
subroutine, public rhd_get_csound2(w, x, ixIL, ixOL, csound2)
Calculate the square of the thermal sound speed csound2 within ixO^L. csound2=gamma*p/rho.
logical, public, protected rhd_radiation_force
Treat radiation fld_Rad_force.
logical, public, protected rhd_energy
Whether an energy equation is used.
subroutine, public rhd_get_ptot(w, x, ixIL, ixOL, ptot)
calculates the sum of the gas pressure and max Prad tensor element
double precision, public rhd_adiab
The adiabatic constant.
subroutine rhd_e_to_ei1(ixIL, ixOL, w, x)
Transform total energy to internal energy.
double precision, public, protected small_r_e
The smallest allowed radiation energy.
subroutine tc_params_read_rhd(fl)
subroutine rhd_get_rho(w, x, ixIL, ixOL, rho)
subroutine rhd_tc_handle_small_e(w, x, ixIL, ixOL, step)
subroutine rhd_handle_small_values(primitive, w, x, ixIL, ixOL, subname)
subroutine rhd_get_v(w, x, ixIL, ixOL, idim, v)
Calculate v_i = m_i / rho within ixO^L.
double precision function rhd_get_tc_dt_rhd(w, ixIL, ixOL, dxD, x)
subroutine rhd_add_source(qdt, ixIL, ixOL, wCT, w, x, qsourcesplit, active, wCTprim)
subroutine rhd_get_temperature_from_etot(w, x, ixIL, ixOL, res)
Calculate temperature=p/rho when in e_ the total energy is stored.
subroutine rhd_get_flux(wC, w, x, ixIL, ixOL, idim, f)
integer, dimension(:), allocatable, public, protected tracer
Indices of the tracers.
subroutine rhd_get_cmax(w, x, ixIL, ixOL, idim, cmax)
Calculate cmax_idim = csound + abs(v_idim) within ixO^L.
integer, public, protected e_
Index of the energy density (-1 if not present)
subroutine rhd_radio_acoustic_filter(x, ixIL, ixOL, prad_max)
Filter peaks in cmax due to radiation energy density, used for debugging.
double precision, public, protected he_abundance
Helium abundance over Hydrogen.
subroutine, public rhd_set_mg_bounds
Set the boundaries for the diffusion of E.
subroutine e_to_rhos(ixIL, ixOL, w, x)
logical, public, protected rhd_thermal_conduction
Whether thermal conduction is added.
subroutine rhd_physical_units
subroutine, public rhd_get_pthermal(w, x, ixIL, ixOL, pth)
Calculate thermal pressure=(gamma-1)*(e-0.5*m**2/rho) within ixO^L.
subroutine rhd_sts_set_source_tc_rhd(ixIL, ixOL, w, x, wres, fix_conserve_at_step, my_dt, igrid, nflux)
double precision function, dimension(ixo^s) rhd_inv_rho(w, ixIL, ixOL)
logical, public, protected rhd_radiation_advection
Treat radiation advection.
logical, public, protected rhd_particles
Whether particles module is added.
subroutine rhd_get_a2max(w, x, ixIL, ixOL, a2max)
subroutine rc_params_read(fl)
type(te_fluid), allocatable, public te_fl_rhd
logical, public, protected rhd_energy_interact
Treat radiation-gas energy interaction.
type(rc_fluid), allocatable, public rc_fl
logical, public, protected rhd_gravity
Whether gravity is added.
subroutine rhd_get_flux_cons(w, x, ixIL, ixOL, idim, f)
integer, public, protected tcoff_
Index of the cutoff temperature for the TRAC method.
subroutine, public rhd_check_w(primitive, ixIL, ixOL, w, flag)
Returns logical argument flag where values are ok.
subroutine rhd_angmomfix(fC, x, wnew, ixIL, ixOL, idim)
Add fluxes in an angular momentum conserving way.
subroutine rhd_te_images()
double precision, public rhd_gamma
The adiabatic index.
Module for including rotating frame in hydrodynamics simulations The rotation vector is assumed to be...
subroutine rotating_frame_add_source(qdt, ixIL, ixOL, wCT, w, x)
w[iw]=w[iw]+qdt*S[wCT,qtC,x] where S is the source based on wCT within ixO
subroutine rotating_frame_init()
Initialize the module.
subroutine rotating_frame_velocity(x, ixIL, ixOL, frame_vel)
Module for handling problematic values in simulations, such as negative pressures.
logical, public trace_small_values
trace small values in the source file using traceback flag of compiler
subroutine, public small_values_average(ixIL, ixOL, w, x, w_flag, windex)
logical, dimension(:), allocatable, public small_values_fix_iw
Whether to apply small value fixes to certain variables.
subroutine, public small_values_error(wprim, x, ixIL, ixOL, w_flag, subname)
character(len=20), public small_values_method
How to handle small values.
Generic supertimestepping method 1) in amrvac.par in sts_list set the following parameters which have...
subroutine, public add_sts_method(sts_getdt, sts_set_sources, startVar, nflux, startwbc, nwbc, evolve_B)
subroutine which added programatically a term to be calculated using STS Params: sts_getdt function c...
subroutine, public set_conversion_methods_to_head(sts_before_first_cycle, sts_after_last_cycle)
Set the hooks called before the first cycle and after the last cycle in the STS update This method sh...
subroutine, public set_error_handling_to_head(sts_error_handling)
Set the hook of error handling in the STS update. This method is called before updating the BC....
subroutine, public sts_init()
Initialize sts module.
Thermal conduction for HD and MHD Adaptation of mod_thermal_conduction for the mod_supertimestepping ...
subroutine, public sts_set_source_tc_hd(ixIL, ixOL, w, x, wres, fix_conserve_at_step, my_dt, igrid, nflux, fl)
subroutine, public tc_get_hd_params(fl, read_hd_params)
Read tc module parameters from par file: MHD case.
subroutine tc_init_params(phys_gamma)
double precision function, public get_tc_dt_hd(w, ixIL, ixOL, dxD, x, fl)
subroutine get_euv_image(qunit, fl)
subroutine get_sxr_image(qunit, fl)
subroutine get_euv_spectrum(qunit, fl)
Module with all the methods that users can customize in AMRVAC.
procedure(set_surface), pointer usr_set_surface
procedure(phys_gravity), pointer usr_gravity
procedure(special_mg_bc), pointer usr_special_mg_bc
procedure(hd_pthermal), pointer usr_set_pthermal
The module add viscous source terms and check time step.
subroutine viscosity_get_dt(w, ixIL, ixOL, dtnew, dxD, x)
subroutine viscosity_add_source(qdt, ixIL, ixOL, wCT, w, x, energy, qsourcesplit, active)
subroutine viscosity_init(phys_wider_stencil, phys_req_diagonal)
Initialize the module.
subroutine visc_add_source_geom(qdt, ixIL, ixOL, wCT, w, x)
subroutine, public visc_get_flux_prim(w, x, ixIL, ixOL, idim, f, energy)