24 logical,
public,
protected ::
hd_dust = .false.
57 integer,
public,
protected ::
rho_
60 integer,
allocatable,
public,
protected ::
mom(:)
63 integer,
public,
protected :: ^
c&m^C_
66 integer,
allocatable,
public,
protected ::
tracer(:)
69 integer,
public,
protected ::
e_
72 integer,
public,
protected ::
p_
75 integer,
public,
protected ::
r_e
78 integer,
public,
protected ::
te_
84 double precision,
public ::
hd_gamma = 5.d0/3.0d0
87 double precision :: gamma_1, inv_gamma_1
93 double precision,
protected :: small_e
99 logical,
public,
protected ::
hd_trac = .false.
106 double precision,
public,
protected ::
h_ion_fr=1d0
116 double precision,
public,
protected ::
rr=1d0
150 subroutine hd_read_params(files)
152 character(len=*),
intent(in) :: files(:)
162 do n = 1,
size(files)
163 open(
unitpar, file=trim(files(n)), status=
"old")
164 read(
unitpar, hd_list,
end=111)
168 end subroutine hd_read_params
171 subroutine hd_write_info(fh)
173 integer,
intent(in) :: fh
174 integer,
parameter :: n_par = 1
175 double precision :: values(n_par)
176 character(len=name_len) :: names(n_par)
177 integer,
dimension(MPI_STATUS_SIZE) :: st
180 call mpi_file_write(fh, n_par, 1, mpi_integer, st, er)
184 call mpi_file_write(fh, values, n_par, mpi_double_precision, st, er)
185 call mpi_file_write(fh, names, n_par * name_len, mpi_character, st, er)
186 end subroutine hd_write_info
213 phys_internal_e = .false.
222 if(
mype==0)
write(*,*)
'WARNING: set hd_trac_type=1'
227 if(
mype==0)
write(*,*)
'WARNING: set hd_trac=F when ndim>=2'
235 if(
mype==0)
write(*,*)
'WARNING: set hd_thermal_conduction=F when hd_energy=F'
239 if(
mype==0)
write(*,*)
'WARNING: set hd_radiative_cooling=F when hd_energy=F'
245 if(
mype==0)
write(*,*)
'WARNING: set hd_partial_ionization=F when eq_state_units=F'
250 allocate(start_indices(number_species),stop_indices(number_species))
258 mom(:) = var_set_momentum(
ndir)
263 e_ = var_set_energy()
273 write(*,*)
'Warning: CAK force addition together with FLD radiation'
278 write(*,*)
'Warning: Optically thin cooling together with FLD radiation'
282 call mpistop(
'implicit dust addition not compatible with FLD radiation')
285 call mpistop(
'using FLD implies the use of cgs units')
288 call mpistop(
'using FLD implies the use of an energy equation, set hd_energy=T')
291 r_e = var_set_radiation_energy()
300 call mpistop(
'using anisotropic FLD implies multidimensional setup')
304 call mpistop(
'Radiation formalism unknown')
311 phys_get_dt => hd_get_dt
312 phys_get_cmax => hd_get_cmax
313 phys_get_tcutoff => hd_get_tcutoff
314 phys_get_cbounds => hd_get_cbounds
315 phys_get_flux => hd_get_flux
316 phys_add_source_geom => hd_add_source_geom
317 phys_add_source => hd_add_source
323 phys_get_v => hd_get_v
324 phys_get_rho => hd_get_rho
325 phys_write_info => hd_write_info
326 phys_handle_small_values => hd_handle_small_values
329 call hd_physical_units()
339 tracer(itr) = var_set_fluxvar(
"trc",
"trp", itr, need_bc=.false.)
344 te_ = var_set_auxvar(
'Te',
'Te')
353 stop_indices(1)=nwflux
365 phys_update_temperature => hd_update_temperature
375 call mpistop(
"thermal conduction needs hd_energy=T")
386 tc_fl%get_temperature_from_eint => hd_get_temperature_from_eint
387 tc_fl%get_rho => hd_get_rho
394 call mpistop(
"radiative cooling needs hd_energy=T")
398 rc_fl%get_rho => hd_get_rho
409 phys_te_images => hd_te_images
429 if (.not.
allocated(flux_type))
then
430 allocate(flux_type(
ndir, nw))
431 flux_type = flux_default
432 else if (any(shape(flux_type) /= [
ndir, nw]))
then
433 call mpistop(
"phys_check error: flux_type has wrong shape")
437 allocate(iw_vector(nvector))
438 iw_vector(1) =
mom(1) - 1
445 subroutine hd_te_images
449 case(
'EIvtiCCmpi',
'EIvtuCCmpi')
451 case(
'ESvtiCCmpi',
'ESvtuCCmpi')
453 case(
'SIvtiCCmpi',
'SIvtuCCmpi')
455 case(
'WIvtiCCmpi',
'WIvtuCCmpi')
458 call mpistop(
"Error in synthesize emission: Unknown convert_type")
460 end subroutine hd_te_images
465 subroutine hd_sts_set_source_tc_hd(ixI^L,ixO^L,w,x,wres,fix_conserve_at_step,my_dt,igrid,nflux)
469 integer,
intent(in) :: ixi^
l, ixo^
l, igrid, nflux
470 double precision,
intent(in) :: x(ixi^s,1:
ndim)
471 double precision,
intent(inout) :: wres(ixi^s,1:nw), w(ixi^s,1:nw)
472 double precision,
intent(in) :: my_dt
473 logical,
intent(in) :: fix_conserve_at_step
475 end subroutine hd_sts_set_source_tc_hd
477 function hd_get_tc_dt_hd(w,ixI^L,ixO^L,dx^D,x)
result(dtnew)
483 integer,
intent(in) :: ixi^
l, ixo^
l
484 double precision,
intent(in) ::
dx^
d, x(ixi^s,1:
ndim)
485 double precision,
intent(in) :: w(ixi^s,1:nw)
486 double precision :: dtnew
489 end function hd_get_tc_dt_hd
491 subroutine hd_tc_handle_small_e(w, x, ixI^L, ixO^L, step)
496 integer,
intent(in) :: ixi^
l,ixo^
l
497 double precision,
intent(inout) :: w(ixi^s,1:nw)
498 double precision,
intent(in) :: x(ixi^s,1:
ndim)
499 integer,
intent(in) :: step
502 logical :: flag(ixi^s,1:nw)
503 character(len=140) :: error_msg
506 where(w(ixo^s,
e_)<small_e) flag(ixo^s,
e_)=.true.
507 if(any(flag(ixo^s,
e_)))
then
510 where(flag(ixo^s,
e_)) w(ixo^s,
e_)=small_e
517 w(ixo^s, iw_mom(idir)) = w(ixo^s, iw_mom(idir))/w(ixo^s,
rho_)
519 write(error_msg,
"(a,i3)")
"Thermal conduction step ", step
523 end subroutine hd_tc_handle_small_e
526 subroutine tc_params_read_hd(fl)
528 type(tc_fluid),
intent(inout) :: fl
530 logical :: tc_saturate=.false.
531 double precision :: tc_k_para=0d0
533 namelist /tc_list/ tc_saturate, tc_k_para
537 read(
unitpar, tc_list,
end=111)
540 fl%tc_saturate = tc_saturate
541 fl%tc_k_para = tc_k_para
543 end subroutine tc_params_read_hd
545 subroutine hd_get_rho(w,x,ixI^L,ixO^L,rho)
547 integer,
intent(in) :: ixi^
l, ixo^
l
548 double precision,
intent(in) :: w(ixi^s,1:nw),x(ixi^s,1:
ndim)
549 double precision,
intent(out) :: rho(ixi^s)
551 rho(ixo^s) = w(ixo^s,
rho_)
553 end subroutine hd_get_rho
557 subroutine rc_params_read(fl)
561 type(rc_fluid),
intent(inout) :: fl
564 integer :: ncool = 4000
567 character(len=std_len) :: coolcurve=
'JCcorona'
570 logical :: tfix=.false.
576 logical :: rc_split=.false.
579 namelist /rc_list/ coolcurve, ncool, tlow, tfix, rc_split
583 read(
unitpar, rc_list,
end=111)
588 fl%coolcurve=coolcurve
592 end subroutine rc_params_read
600 if (
hd_gamma <= 0.0d0)
call mpistop (
"Error: hd_gamma <= 0")
601 if (
hd_adiab < 0.0d0)
call mpistop (
"Error: hd_adiab < 0")
605 call mpistop (
"Error: hd_gamma <= 0 or hd_gamma == 1.0")
615 call mpistop(
'select IMEX scheme for implicit dust update')
623 call mpistop(
'select IMEX scheme for FLD radiation use')
628 call mpistop(
'multigrid must have BCs for IMEX and FLD radiation use')
647 mg%bc(ib, mg_iphi)%bc_type = mg_bc_neumann
648 mg%bc(ib, mg_iphi)%bc_value = 0.0_dp
651 mg%bc(ib, mg_iphi)%bc_type = mg_bc_dirichlet
652 mg%bc(ib, mg_iphi)%bc_value = 0.0_dp
656 mg%bc(ib, mg_iphi)%bc_type = mg_bc_neumann
657 mg%bc(ib, mg_iphi)%bc_value = 0.0_dp
665 call mpistop(
"divE_multigrid warning: unknown b.c. ")
670 subroutine hd_physical_units
672 double precision :: mp,kb
673 double precision :: a,b
765 end subroutine hd_physical_units
772 logical,
intent(in) :: primitive
773 integer,
intent(in) :: ixi^
l, ixo^
l
774 double precision,
intent(in) :: w(ixi^s, nw)
775 logical,
intent(inout) :: flag(ixi^s,1:nw)
776 double precision :: tmp(ixi^s)
785 half*(^
c&w(ixo^s,
m^
c_)**2+)/w(ixo^s,
rho_))
803 integer,
intent(in) :: ixi^
l, ixo^
l
804 double precision,
intent(inout) :: w(ixi^s, nw)
805 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
809 {
do ix^db=ixomin^db,ixomax^db\}
812 w(ix^
d,
e_)=w(ix^
d,
e_)*inv_gamma_1+&
820 call dust_to_conserved(ixi^l, ixo^l, w, x)
829 integer,
intent(in) :: ixi^
l, ixo^
l
830 double precision,
intent(inout) :: w(ixi^s, nw)
831 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
833 double precision :: inv_rho
837 call hd_handle_small_values(.false., w, x, ixi^
l, ixo^
l,
'hd_to_primitive')
840 {
do ix^db=ixomin^db,ixomax^db\}
841 inv_rho = 1.d0/w(ix^
d,
rho_)
854 call dust_to_primitive(ixi^l, ixo^l, w, x)
862 integer,
intent(in) :: ixi^
l, ixo^
l
863 double precision,
intent(inout) :: w(ixi^s, nw)
864 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
867 w(ixo^s,
e_)=w(ixo^s,
e_)+half*(^
c&w(ixo^s,
m^
c_)**2+)/w(ixo^s,
rho_)
874 integer,
intent(in) :: ixi^
l, ixo^
l
875 double precision,
intent(inout) :: w(ixi^s, nw)
876 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
879 w(ixo^s,
e_)=w(ixo^s,
e_)-half*(^
c&w(ixo^s,
m^
c_)**2+)/w(ixo^s,
rho_)
884 subroutine hd_get_v_idim(w, x, ixI^L, ixO^L, idim, v)
886 integer,
intent(in) :: ixi^
l, ixo^
l, idim
887 double precision,
intent(in) :: w(ixi^s, nw), x(ixi^s, 1:
ndim)
888 double precision,
intent(out) :: v(ixi^s)
890 v(ixo^s) = w(ixo^s,
mom(idim)) / w(ixo^s,
rho_)
891 end subroutine hd_get_v_idim
894 subroutine hd_get_v(w,x,ixI^L,ixO^L,v)
897 integer,
intent(in) :: ixi^
l, ixo^
l
898 double precision,
intent(in) :: w(ixi^s,nw), x(ixi^s,1:^nd)
899 double precision,
intent(out) :: v(ixi^s,1:
ndir)
904 v(ixo^s,idir) = w(ixo^s,
mom(idir)) / w(ixo^s,
rho_)
907 end subroutine hd_get_v
910 subroutine hd_get_cmax(w, x, ixI^L, ixO^L, idim, cmax)
915 integer,
intent(in) :: ixi^
l, ixo^
l, idim
917 double precision,
intent(in) :: w(ixi^s, nw), x(ixi^s, 1:
ndim)
918 double precision,
intent(inout) :: cmax(ixi^s)
928 cmax(ixo^s)=dabs(w(ixo^s,
mom(idim)))+dsqrt(
hd_gamma*cmax(ixo^s)/w(ixo^s,
rho_))
934 end subroutine hd_get_cmax
937 subroutine hd_get_tcutoff(ixI^L,ixO^L,w,x,tco_local,Tmax_local)
939 integer,
intent(in) :: ixi^
l,ixo^
l
940 double precision,
intent(in) :: x(ixi^s,1:
ndim)
942 double precision,
intent(inout) :: w(ixi^s,1:nw)
943 double precision,
intent(out) :: tco_local, tmax_local
945 double precision,
parameter :: trac_delta=0.25d0
946 double precision :: tmp1(ixi^s),te(ixi^s),lts(ixi^s)
947 double precision :: ltr(ixi^s),ltrc,ltrp,tcoff(ixi^s)
948 integer :: jxo^
l,hxo^
l
949 integer :: jxp^
l,hxp^
l,ixp^
l
950 logical :: lrlt(ixi^s)
954 te(ixi^s)=w(ixi^s,
p_)/(te(ixi^s)*w(ixi^s,
rho_))
957 tmax_local=maxval(te(ixo^s))
964 lts(ixo^s)=0.5d0*dabs(te(jxo^s)-te(hxo^s))/te(ixo^s)
966 where(lts(ixo^s) > trac_delta)
969 if(any(lrlt(ixo^s)))
then
970 tco_local=maxval(te(ixo^s), mask=lrlt(ixo^s))
981 lts(ixp^s)=0.5d0*abs(te(jxp^s)-te(hxp^s))/te(ixp^s)
982 ltr(ixp^s)=max(one, (exp(lts(ixp^s))/ltrc)**ltrp)
983 w(ixo^s,
tcoff_)=te(ixo^s)*&
984 (0.25*(ltr(jxo^s)+two*ltr(ixo^s)+ltr(hxo^s)))**0.4d0
986 call mpistop(
"hd_trac_type not allowed for 1D simulation")
989 end subroutine hd_get_tcutoff
992 subroutine hd_get_cbounds(wLC, wRC, wLp, wRp, x, ixI^L, ixO^L, idim,Hspeed,cmax, cmin)
997 integer,
intent(in) :: ixi^
l, ixo^
l, idim
999 double precision,
intent(in) :: wlc(ixi^s,
nw), wrc(ixi^s,
nw)
1001 double precision,
intent(in) :: wlp(ixi^s,
nw), wrp(ixi^s,
nw)
1002 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1004 double precision,
intent(inout),
optional :: cmin(ixi^s,1:
number_species)
1007 double precision :: wmean(ixi^s,
nw)
1008 double precision,
dimension(ixI^S) :: umean, dmean, csoundl, csoundr, tmp1,tmp2,tmp3
1016 tmp1(ixo^s)=dsqrt(wlp(ixo^s,
rho_))
1017 tmp2(ixo^s)=dsqrt(wrp(ixo^s,
rho_))
1018 tmp3(ixo^s)=1.d0/(tmp1(ixo^s)+tmp2(ixo^s))
1019 umean(ixo^s)=(wlp(ixo^s,
mom(idim))*tmp1(ixo^s)+wrp(ixo^s,
mom(idim))*tmp2(ixo^s))*tmp3(ixo^s)
1029 dmean(ixo^s) = (tmp1(ixo^s)*csoundl(ixo^s)+tmp2(ixo^s)*csoundr(ixo^s)) * &
1030 tmp3(ixo^s) + 0.5d0*tmp1(ixo^s)*tmp2(ixo^s)*tmp3(ixo^s)**2 * &
1031 (wrp(ixo^s,
mom(idim))-wlp(ixo^s,
mom(idim)))**2
1033 dmean(ixo^s)=dsqrt(dmean(ixo^s))
1034 if(
present(cmin))
then
1035 cmin(ixo^s,1)=umean(ixo^s)-dmean(ixo^s)
1036 cmax(ixo^s,1)=umean(ixo^s)+dmean(ixo^s)
1038 {
do ix^db=ixomin^db,ixomax^db\}
1039 cmin(ix^
d,1)=sign(one,cmin(ix^
d,1))*max(abs(cmin(ix^
d,1)),hspeed(ix^
d,1))
1040 cmax(ix^
d,1)=sign(one,cmax(ix^
d,1))*max(abs(cmax(ix^
d,1)),hspeed(ix^
d,1))
1044 cmax(ixo^s,1)=dabs(umean(ixo^s))+dmean(ixo^s)
1048 wmean(ixo^s,1:nwflux)=0.5d0*(wlc(ixo^s,1:nwflux)+wrc(ixo^s,1:nwflux))
1049 call dust_get_cmax(wmean, x, ixi^l, ixo^l, idim, cmax, cmin)
1053 wmean(ixo^s,1:nwflux)=0.5d0*(wlc(ixo^s,1:nwflux)+wrc(ixo^s,1:nwflux))
1054 tmp1(ixo^s)=wmean(ixo^s,
mom(idim))/wmean(ixo^s,
rho_)
1056 csoundr(ixo^s) = dsqrt(csoundr(ixo^s))
1058 if(
present(cmin))
then
1059 cmax(ixo^s,1)=max(tmp1(ixo^s)+csoundr(ixo^s),zero)
1060 cmin(ixo^s,1)=min(tmp1(ixo^s)-csoundr(ixo^s),zero)
1061 if(h_correction)
then
1062 {
do ix^db=ixomin^db,ixomax^db\}
1063 cmin(ix^d,1)=sign(one,cmin(ix^d,1))*max(abs(cmin(ix^d,1)),hspeed(ix^d,1))
1064 cmax(ix^d,1)=sign(one,cmax(ix^d,1))*max(abs(cmax(ix^d,1)),hspeed(ix^d,1))
1068 cmax(ixo^s,1)=dabs(tmp1(ixo^s))+csoundr(ixo^s)
1072 call dust_get_cmax(wmean, x, ixi^l, ixo^l, idim, cmax, cmin)
1083 csoundl(ixo^s)=max(dsqrt(csoundl(ixo^s)),dsqrt(csoundr(ixo^s)))
1084 if(
present(cmin))
then
1085 cmin(ixo^s,1)=min(wlp(ixo^s,
mom(idim)),wrp(ixo^s,
mom(idim)))-csoundl(ixo^s)
1086 cmax(ixo^s,1)=max(wlp(ixo^s,
mom(idim)),wrp(ixo^s,
mom(idim)))+csoundl(ixo^s)
1087 if(h_correction)
then
1088 {
do ix^db=ixomin^db,ixomax^db\}
1089 cmin(ix^d,1)=sign(one,cmin(ix^d,1))*max(abs(cmin(ix^d,1)),hspeed(ix^d,1))
1090 cmax(ix^d,1)=sign(one,cmax(ix^d,1))*max(abs(cmax(ix^d,1)),hspeed(ix^d,1))
1094 cmax(ixo^s,1)=max(wlp(ixo^s,
mom(idim)),wrp(ixo^s,
mom(idim)))+csoundl(ixo^s)
1097 wmean(ixo^s,1:nwflux)=0.5d0*(wlc(ixo^s,1:nwflux)+wrc(ixo^s,1:nwflux))
1098 call dust_get_cmax(wmean, x, ixi^l, ixo^l, idim, cmax, cmin)
1102 end subroutine hd_get_cbounds
1108 integer,
intent(in) :: ixi^
l, ixo^
l
1109 double precision,
intent(in) :: w(ixi^s,nw)
1110 double precision,
intent(in) :: x(ixi^s,1:
ndim)
1111 double precision,
intent(out) :: csound2(ixi^s)
1124 integer,
intent(in) :: ixi^
l, ixo^
l
1125 double precision,
intent(in) :: w(ixi^s, 1:nw)
1126 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1127 double precision,
intent(out):: pth(ixi^s)
1131 pth(ixo^s) = (
hd_gamma - 1.0d0) * (w(ixo^s,
e_) - &
1142 {
do ix^db= ixo^lim^db\}
1148 {
do ix^db= ixo^lim^db\}
1150 write(*,*)
"Error: small value of gas pressure",pth(ix^
d),&
1151 " encountered when call hd_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"
1174 integer,
intent(in) :: ixi^
l, ixo^
l
1175 double precision,
intent(in) :: w(ixi^s, 1:nw)
1176 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1177 double precision,
intent(out):: prad(ixo^s, 1:
ndim, 1:
ndim)
1185 call mpistop(
'Radiation formalism unknown')
1193 integer,
intent(in) :: ixi^
l, ixo^
l
1194 double precision,
intent(in) :: w(ixi^s, 1:nw)
1195 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1196 double precision :: pth(ixi^s)
1197 double precision :: prad_tensor(ixo^s, 1:
ndim, 1:
ndim)
1198 double precision :: prad_max(ixo^s)
1199 double precision,
intent(out):: ptot(ixi^s)
1205 {
do ix^
d = ixomin^
d,ixomax^
d\}
1206 prad_max(ix^
d) = maxval(prad_tensor(ix^
d,:,:))
1209 ptot(ixo^s) = pth(ixo^s) + prad_max(ixo^s)
1219 integer,
intent(in) :: ixi^
l, ixo^
l
1220 double precision,
intent(in) :: w(ixi^s, 1:nw)
1221 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1222 double precision,
intent(out):: trad(ixi^s)
1232 integer,
intent(in) :: ixi^
l, ixo^
l
1233 double precision,
intent(in) :: w(ixi^s, 1:nw)
1234 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1235 double precision,
intent(out):: res(ixi^s)
1237 double precision :: r(ixi^s)
1241 res(ixo^s)=res(ixo^s)/(r(ixo^s)*w(ixo^s,
rho_))
1245 subroutine hd_get_temperature_from_eint(w, x, ixI^L, ixO^L, res)
1247 integer,
intent(in) :: ixi^
l, ixo^
l
1248 double precision,
intent(in) :: w(ixi^s, 1:nw)
1249 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1250 double precision,
intent(out):: res(ixi^s)
1252 double precision :: r(ixi^s)
1255 res(ixo^s) = (
hd_gamma - 1.0d0) * w(ixo^s,
e_)/(w(ixo^s,
rho_)*r(ixo^s))
1256 end subroutine hd_get_temperature_from_eint
1259 subroutine hd_get_flux(wC, w, x, ixI^L, ixO^L, idim, f)
1263 integer,
intent(in) :: ixi^
l, ixo^
l, idim
1265 double precision,
intent(in) :: wc(ixi^s, 1:nw)
1267 double precision,
intent(in) :: w(ixi^s, 1:nw)
1268 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1269 double precision,
intent(out) :: f(ixi^s, nwflux)
1271 double precision :: pth(ixi^s)
1275 {
do ix^db=ixomin^db,ixomax^db\}
1285 {
do ix^db=ixomin^db,ixomax^db\}
1288 ^
c&f(ix^d,
m^
c_)=w(ix^d,
mom(idim))*wc(ix^d,
m^
c_)\
1289 f(ix^d,
mom(idim))=f(ix^d,
mom(idim))+pth(ix^d)
1294 {
do ix^db=ixomin^db,ixomax^db\}
1296 f(ix^d,
r_e)=w(ix^d,
mom(idim))*wc(ix^d,
r_e)
1306 call dust_get_flux_prim(w, x, ixi^l, ixo^l, idim, f)
1309 end subroutine hd_get_flux
1316 subroutine hd_add_source_geom(qdt, dtfactor, ixI^L, ixO^L, wCT, wprim, w, x)
1322 integer,
intent(in) :: ixi^
l, ixo^
l
1323 double precision,
intent(in) :: qdt, dtfactor, x(ixi^s, 1:
ndim)
1324 double precision,
intent(inout) :: wct(ixi^s, 1:nw), wprim(ixi^s,1:nw),w(ixi^s, 1:nw)
1325 double precision :: pth(ixi^s),
source(ixi^s), minrho
1326 integer :: iw,idir, h1x^
l{^nooned, h2x^
l}
1327 integer :: mr_,mphi_
1328 integer :: irho, ifluid, n_fluids
1329 double precision :: exp_factor(ixi^s), del_exp_factor(ixi^s), exp_factor_primitive(ixi^s)
1351 source(ixo^s) =
source(ixo^s)*del_exp_factor(ixo^s)/exp_factor(ixo^s)
1355 do ifluid = 0, n_fluids-1
1357 if (ifluid == 0)
then
1381 where (wct(ixo^s, irho) > minrho)
1382 source(ixo^s) =
source(ixo^s) + wct(ixo^s,mphi_)*wprim(ixo^s,mphi_)
1383 w(ixo^s, mr_) = w(ixo^s, mr_) + qdt*
source(ixo^s)/x(ixo^s,
r_)
1386 where (wct(ixo^s, irho) > minrho)
1387 source(ixo^s) = -wct(ixo^s, mphi_) * wprim(ixo^s, mr_)
1388 w(ixo^s, mphi_) = w(ixo^s, mphi_) + qdt *
source(ixo^s) / x(ixo^s,
r_)
1392 w(ixo^s, mr_) = w(ixo^s, mr_) + qdt *
source(ixo^s) / x(ixo^s,
r_)
1397 call mpistop(
"Dust geom source terms not implemented yet with spherical geometries")
1401 h1x^
l=ixo^
l-
kr(1,^
d); {^nooned h2x^
l=ixo^
l-
kr(2,^
d);}
1403 pth(ixo^s)=wprim(ixo^s,
p_)
1412 source(ixo^s) = pth(ixo^s) * x(ixo^s, 1) &
1413 *(
block%surfaceC(ixo^s, 1) -
block%surfaceC(h1x^s, 1)) &
1414 /
block%dvolume(ixo^s)
1418 w(ixo^s, mr_) = w(ixo^s, mr_) + qdt *
source(ixo^s) / x(ixo^s, 1)
1422 source(ixo^s) = pth(ixo^s) * x(ixo^s, 1) &
1423 * (
block%surfaceC(ixo^s, 2) -
block%surfaceC(h2x^s, 2)) &
1424 /
block%dvolume(ixo^s)
1426 source(ixo^s) =
source(ixo^s) + (wprim(ixo^s,
mom(3))**2 * wprim(ixo^s,
rho_)) / tan(x(ixo^s, 2))
1428 source(ixo^s) =
source(ixo^s) - (wprim(ixo^s,
mom(2)) * wprim(ixo^s, mr_)) * wprim(ixo^s,
rho_)
1429 w(ixo^s,
mom(2)) = w(ixo^s,
mom(2)) + qdt *
source(ixo^s) / x(ixo^s, 1)
1433 source(ixo^s) = -(wprim(ixo^s,
mom(3)) * wprim(ixo^s, mr_)) * wprim(ixo^s,
rho_)&
1434 - (wprim(ixo^s,
mom(2)) * wprim(ixo^s,
mom(3))) * wprim(ixo^s,
rho_) / tan(x(ixo^s, 2))
1435 w(ixo^s,
mom(3)) = w(ixo^s,
mom(3)) + qdt *
source(ixo^s) / x(ixo^s, 1)
1442 call mpistop(
"Rotating frame not implemented yet with dust")
1448 end subroutine hd_add_source_geom
1451 subroutine hd_add_source(qdt,dtfactor, ixI^L,ixO^L,wCT,wCTprim,w,x,qsourcesplit,active)
1460 integer,
intent(in) :: ixi^
l, ixo^
l
1461 double precision,
intent(in) :: qdt, dtfactor
1462 double precision,
intent(in) :: wct(ixi^s, 1:nw),wctprim(ixi^s,1:nw), x(ixi^s, 1:
ndim)
1463 double precision,
intent(inout) :: w(ixi^s, 1:nw)
1464 logical,
intent(in) :: qsourcesplit
1465 logical,
intent(inout) :: active
1467 double precision :: gravity_field(ixi^s, 1:
ndim)
1468 integer :: idust, idim
1476 qsourcesplit,active,
rc_fl)
1495 + qdt * gravity_field(ixo^s, idim) * wct(ixo^s,
dust_rho(idust))
1507 call hd_add_radiation_source(qdt,ixi^
l,ixo^
l,wct,w,x,qsourcesplit,active)
1511 if(.not.qsourcesplit)
then
1513 call hd_update_temperature(ixi^
l,ixo^
l,wct,w,x)
1517 end subroutine hd_add_source
1519 subroutine hd_add_radiation_source(qdt,ixI^L,ixO^L,wCT,w,x,qsourcesplit,active)
1526 integer,
intent(in) :: ixi^
l, ixo^
l
1527 double precision,
intent(in) :: qdt, x(ixi^s,1:
ndim)
1528 double precision,
intent(in) :: wct(ixi^s,1:nw)
1529 double precision,
intent(inout) :: w(ixi^s,1:nw)
1530 logical,
intent(in) :: qsourcesplit
1531 logical,
intent(inout) :: active
1532 double precision :: cmax(ixi^s)
1540 call hd_handle_small_values(.true., w, x, ixi^
l, ixo^
l,
'fld_add_radiation')
1546 call hd_handle_small_values(.true., w, x, ixi^
l, ixo^
l,
'afld_add_radiation')
1551 call mpistop(
'Radiation formalism unknown')
1554 end subroutine hd_add_radiation_source
1556 subroutine hd_get_dt(w, ixI^L, ixO^L, dtnew, dx^D, x)
1565 integer,
intent(in) :: ixi^
l, ixo^
l
1566 double precision,
intent(in) ::
dx^
d, x(ixi^s, 1:^nd)
1567 double precision,
intent(in) :: w(ixi^s, 1:nw)
1568 double precision,
intent(inout) :: dtnew
1595 call mpistop(
'Radiation formalism unknown')
1599 end subroutine hd_get_dt
1603 integer,
intent(in) :: ixi^
l, ixo^
l
1604 double precision,
intent(in) :: w(ixi^s, nw)
1605 double precision :: ke(ixo^s)
1606 double precision,
intent(in),
optional :: inv_rho(ixo^s)
1608 if (
present(inv_rho))
then
1609 ke = 0.5d0 * sum(w(ixo^s,
mom(:))**2, dim=
ndim+1) * inv_rho
1611 ke = 0.5d0 * sum(w(ixo^s,
mom(:))**2, dim=
ndim+1) / w(ixo^s,
rho_)
1615 function hd_inv_rho(w, ixI^L, ixO^L)
result(inv_rho)
1617 integer,
intent(in) :: ixi^
l, ixo^
l
1618 double precision,
intent(in) :: w(ixi^s, nw)
1619 double precision :: inv_rho(ixo^s)
1622 inv_rho = 1.0d0 / w(ixo^s,
rho_)
1623 end function hd_inv_rho
1625 subroutine hd_handle_small_values(primitive, w, x, ixI^L, ixO^L, subname)
1632 logical,
intent(in) :: primitive
1633 integer,
intent(in) :: ixi^
l,ixo^
l
1634 double precision,
intent(inout) :: w(ixi^s,1:nw)
1635 double precision,
intent(in) :: x(ixi^s,1:
ndim)
1636 character(len=*),
intent(in) :: subname
1639 logical :: flag(ixi^s,1:nw)
1649 where(flag(ixo^s,
rho_)) w(ixo^s,
mom(idir)) = 0.0d0
1671 where(flag(ixo^s,
e_))
1696 -0.5d0*sum(w(ixi^s,
mom(:))**2, dim=
ndim+1)/w(ixi^s,
rho_))
1699 +0.5d0*sum(w(ixi^s,
mom(:))**2, dim=
ndim+1)/w(ixi^s,
rho_)
1715 if(.not.primitive)
then
1723 w(ixo^s,
mom(idir)) = w(ixo^s,
mom(idir))/w(ixo^s,
rho_)
1730 end subroutine hd_handle_small_values
1732 subroutine rfactor_from_temperature_ionization(w,x,ixI^L,ixO^L,Rfactor)
1735 integer,
intent(in) :: ixi^
l, ixo^
l
1736 double precision,
intent(in) :: w(ixi^s,1:nw)
1737 double precision,
intent(in) :: x(ixi^s,1:
ndim)
1738 double precision,
intent(out):: rfactor(ixi^s)
1740 double precision :: iz_h(ixo^s),iz_he(ixo^s)
1744 rfactor(ixo^s)=(1.d0+iz_h(ixo^s)+0.1d0*(1.d0+iz_he(ixo^s)*(1.d0+iz_he(ixo^s))))/2.3d0
1746 end subroutine rfactor_from_temperature_ionization
1748 subroutine rfactor_from_constant_ionization(w,x,ixI^L,ixO^L,Rfactor)
1750 integer,
intent(in) :: ixi^
l, ixo^
l
1751 double precision,
intent(in) :: w(ixi^s,1:nw)
1752 double precision,
intent(in) :: x(ixi^s,1:
ndim)
1753 double precision,
intent(out):: rfactor(ixi^s)
1757 end subroutine rfactor_from_constant_ionization
1759 subroutine hd_update_temperature(ixI^L,ixO^L,wCT,w,x)
1763 integer,
intent(in) :: ixi^
l, ixo^
l
1764 double precision,
intent(in) :: wct(ixi^s,1:nw), x(ixi^s,1:
ndim)
1765 double precision,
intent(inout) :: w(ixi^s,1:nw)
1767 double precision :: iz_h(ixo^s),iz_he(ixo^s), pth(ixi^s)
1776 end subroutine hd_update_temperature
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 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_radforce_get_dt(w, ixil, ixol, dtnew, dxd, x)
subroutine, public afld_get_radpress(w, x, ixil, ixol, rad_pressure, nth)
Calculate Radiation Pressure Returns Radiation Pressure as tensor.
subroutine, public afld_init(he_abundance, afld_gamma)
Initialising FLD-module: Read opacities Initialise Multigrid adimensionalise kappa Add extra variable...
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...
Module with basic data types used in amrvac.
integer, parameter std_len
Default length for strings.
Module to include CAK radiation line force in (magneto)hydrodynamic models Computes both the force fr...
subroutine cak_get_dt(w, ixil, ixol, dtnew, dxd, x)
Check time step for total radiation contribution.
subroutine cak_init(phys_gamma)
Initialize the module.
subroutine cak_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, public mpistop(message)
Exit MPI-AMRVAC with an error message.
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_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_evaluate_implicit(qtc, psa)
inplace update of psa==>F_im(psa)
subroutine, public dust_to_primitive(ixil, ixol, w, x)
subroutine, public dust_get_dt(w, ixil, ixol, dtnew, dxd, x)
Get dt related to dust and gas stopping time (Laibe 2011)
integer, dimension(:, :), allocatable, public, protected dust_mom
Indices of the dust momentum densities.
subroutine, public dust_to_conserved(ixil, ixol, w, x)
integer, public, protected dust_n_species
The number of dust species.
subroutine, public dust_get_flux_prim(w, x, ixil, ixol, idim, f)
subroutine, public dust_check_w(ixil, ixol, w, flag)
integer, dimension(:), allocatable, public, protected dust_rho
Indices of the dust densities.
subroutine, public dust_get_cmax(w, x, ixil, ixol, idim, cmax, cmin)
subroutine, public dust_check_params()
subroutine, public dust_get_cmax_prim(w, x, ixil, ixol, idim, cmax, cmin)
subroutine, public dust_init(g_rho, g_mom, g_energy)
subroutine, public dust_implicit_update(dtfactor, qdt, qtc, psb, psa)
Implicit solve of psb=psa+dtfactor*dt*F_im(psb)
Module for flux conservation near refinement boundaries.
Nicolas Moens Module for including flux limited diffusion (FLD)-approximation in Radiation-hydrodynam...
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, nth)
Calculate Radiation Pressure Returns Radiation Pressure as tensor.
subroutine fld_get_diffcoef_central(w, wct, x, ixil, ixol)
Calculates cell-centered diffusion coefficient to be used in multigrid.
subroutine, public fld_init(he_abundance, r_gamma)
Initialising FLD-module: Read opacities Initialise Multigrid adimensionalise kappa Add extra variable...
subroutine, public fld_radforce_get_dt(w, ixil, ixol, dtnew, dxd, x)
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.
double precision unit_mass
Physical scaling factor for mass.
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.
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.
double precision, 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
spatial steps for all dimensions at all levels
integer nghostcells
Number of ghost cells surrounding a grid.
integer, parameter bc_symm
logical phys_trac
Use TRAC for MHD or 1D HD.
logical fix_small_values
fix small values with average or replace methods
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
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_init()
Initialize the module.
subroutine gravity_add_source(qdt, ixil, ixol, wct, wctprim, w, x, energy, qsourcesplit, active)
w[iw]=w[iw]+qdt*S[wCT,qtC,x] where S is the source based on wCT within ixO
Hydrodynamics physics module.
integer, public, protected m
subroutine, public hd_check_params
logical, public, protected hd_energy
Whether an energy equation is used.
logical, public, protected hd_dust
Whether dust is added.
subroutine, public hd_ei_to_e(ixil, ixol, w, x)
Transform internal energy to total energy.
integer, public, protected e_
Index of the energy density (-1 if not present)
logical, public, protected hd_radiative_cooling
Whether radiative cooling is added.
double precision, public, protected rr
double precision, public hd_gamma
The adiabatic index.
subroutine, public hd_get_temperature_from_etot(w, x, ixil, ixol, res)
Calculate temperature=p/rho when in e_ the total energy is stored.
integer, public, protected hd_trac_type
logical, public, protected hd_particles
Whether particles module is added.
logical, public, protected hd_radiation_fld
Whether radiation-gas interaction is handled using flux limited diffusion.
type(tc_fluid), allocatable, public tc_fl
subroutine, public hd_check_w(primitive, ixil, ixol, w, flag)
Returns logical argument flag where values are ok.
logical, public, protected hd_viscosity
Whether viscosity is added.
integer, public, protected r_e
Index of the radiation energy (when fld active)
procedure(sub_get_pthermal), pointer, public hd_get_rfactor
integer, public, protected c
Indices of the momentum density for the form of better vectorization.
subroutine, public hd_get_ptot(w, x, ixil, ixol, ptot)
calculates the sum of the gas pressure and max Prad tensor element
subroutine, public hd_get_csound2(w, x, ixil, ixol, csound2)
Calculate the square of the thermal sound speed csound2 within ixO^L. csound2=gamma*p/rho.
integer, public, protected tcoff_
Index of the cutoff temperature for the TRAC method.
double precision, public, protected he_ion_fr2
Ratio of number He2+ / number He+ + He2+ He_ion_fr2 = He2+/(He2+ + He+)
integer, public, protected te_
Indices of temperature.
integer, dimension(:), allocatable, public, protected mom
Indices of the momentum density.
double precision, public, protected h_ion_fr
Ionization fraction of H H_ion_fr = H+/(H+ + H)
double precision function, dimension(ixo^s), public hd_kin_en(w, ixil, ixol, inv_rho)
subroutine, public hd_to_conserved(ixil, ixol, w, x)
Transform primitive variables into conservative ones.
logical, public, protected hd_cak_force
Whether CAK radiation line force is activated.
subroutine, public hd_phys_init()
Initialize the module.
integer, dimension(:), allocatable, public, protected tracer
Indices of the tracers.
logical, public, protected hd_thermal_conduction
Whether thermal conduction is added.
logical, public, protected eq_state_units
double precision, public hd_adiab
The adiabatic constant.
subroutine, public hd_get_trad(w, x, ixil, ixol, trad)
Calculates radiation temperature.
subroutine, public hd_to_primitive(ixil, ixol, w, x)
Transform conservative variables into primitive ones.
subroutine, public hd_set_mg_bounds
Set the boundaries for the diffusion of E.
integer, public, protected rho_
Index of the density (in the w array)
logical, public, protected hd_partial_ionization
Whether plasma is partially ionized.
double precision, public, protected small_r_e
The smallest allowed radiation energy (when fld active)
double precision, public, protected he_ion_fr
Ionization fraction of He He_ion_fr = (He2+ + He+)/(He2+ + He+ + He)
double precision, public, protected he_abundance
Helium abundance over Hydrogen.
logical, public, protected hd_gravity
Whether gravity is added.
integer, public, protected c_
type(rc_fluid), allocatable, public rc_fl
logical, public, protected hd_dust_implicit
Whether dust is added using and implicit update in IMEX.
subroutine, public hd_get_pradiation(w, x, ixil, ixol, prad)
Calculate radiation pressure within ixO^L.
logical, public, protected hd_trac
Whether TRAC method is used.
integer, public, protected hd_n_tracer
Number of tracer species.
type(te_fluid), allocatable, public te_fl_hd
logical, public, protected hd_rotating_frame
Whether rotating frame is activated.
subroutine, public hd_get_pthermal(w, x, ixil, ixol, pth)
Calculate thermal pressure=(gamma-1)*(e-0.5*m**2/rho) within ixO^L.
character(len=8), public hd_radiation_fld_formalism
Formalism to treat radiation: either fld or afld (anisotropic fld)
integer, public, protected p_
Index of the gas pressure (-1 if not present) should equal e_.
subroutine, public hd_e_to_ei(ixil, ixol, w, x)
Transform total energy to internal energy.
module ionization degree - get ionization degree for given temperature
subroutine ionization_degree_from_temperature(ixil, ixol, te, iz_h, iz_he)
subroutine ionization_degree_init()
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...
module radiative cooling – add optically thin radiative cooling
subroutine radiative_cooling_init_params(phys_gamma, he_abund)
Radiative cooling initialization.
subroutine radiative_cooling_init(fl, read_params)
subroutine radiative_cooling_add_source(qdt, ixil, ixol, wct, wctprim, w, x, qsourcesplit, active, fl)
Module for including rotating frame in (magneto)hydrodynamics simulations The rotation vector is assu...
subroutine rotating_frame_add_source(qdt, dtfactor, 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.
Module for handling problematic values in simulations, such as negative pressures.
subroutine, public small_values_average(ixil, ixol, w, x, w_flag, windex)
logical, public trace_small_values
trace small values in the source file using traceback flag of compiler
subroutine, public small_values_error(wprim, x, ixil, ixol, w_flag, subname)
logical, dimension(:), allocatable, public small_values_fix_iw
Whether to apply small value fixes to certain variables.
character(len=20), public small_values_method
How to handle small values.
Generic supertimestepping method which can be used for multiple source terms in the governing equatio...
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 or RHD and RMHD or twofl (plasma-neutral) module Adaptation of mod_...
subroutine, public tc_get_hd_params(fl, read_hd_params)
Init TC coefficients: HD case.
double precision function, public get_tc_dt_hd(w, ixil, ixol, dxd, x, fl)
Get the explicit timestep for the TC (hd implementation) Note: also used in 1D MHD (or for neutrals i...
subroutine tc_init_params(phys_gamma)
subroutine, public sts_set_source_tc_hd(ixil, ixol, w, x, wres, fix_conserve_at_step, my_dt, igrid, nflux, fl)
subroutine get_euv_image(qunit, fl)
subroutine get_sxr_image(qunit, fl)
subroutine get_euv_spectrum(qunit, fl)
subroutine get_whitelight_image(qunit, fl)
Module with all the methods that users can customize in AMRVAC.
procedure(rfactor), pointer usr_rfactor
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
integer nw
Total number of variables.
integer number_species
number of species: each species has different characterictic speeds and should be used accordingly in...
The module add viscous source terms and check time step.
subroutine viscosity_init(phys_wider_stencil)
Initialize the module.
subroutine viscosity_get_dt(w, ixil, ixol, dtnew, dxd, x)
procedure(sub_add_source), pointer, public viscosity_add_source