32 logical,
public,
protected ::
hd_dust = .false.
64 integer,
public,
protected ::
rho_
67 integer,
allocatable,
public,
protected ::
mom(:)
70 integer,
public,
protected :: ^
c&m^C_
73 integer,
allocatable,
public,
protected ::
tracer(:)
76 integer,
public,
protected ::
e_
79 integer,
public,
protected ::
p_
82 integer,
public,
protected ::
ne_
85 integer,
public,
protected ::
r_e
88 integer,
public,
protected ::
te_
91 integer,
public,
protected ::
fip_ = -1
94 logical,
public,
protected ::
hd_fip = .false.
100 integer,
public,
protected ::
q_
176 logical,
public,
protected ::
hd_trac = .false.
190 double precision,
public,
protected ::
h_ion_fr=1d0
200 double precision,
public,
protected ::
rr=1d0
231 subroutine hd_read_params(files)
233 character(len=*),
intent(in) :: files(:)
249 do n = 1,
size(files)
250 open(
unitpar, file=trim(files(n)), status=
"old")
251 read(
unitpar, hd_list,
end=111)
255 end subroutine hd_read_params
258 subroutine hd_write_info(fh)
260 integer,
intent(in) :: fh
261 integer,
parameter :: n_par = 1
262 double precision :: values(n_par)
263 character(len=name_len) :: names(n_par)
264 integer,
dimension(MPI_STATUS_SIZE) :: st
267 call mpi_file_write(fh, n_par, 1, mpi_integer, st, er)
270 values(1) = eos%gamma
271 call mpi_file_write(fh, values, n_par, mpi_double_precision, st, er)
272 call mpi_file_write(fh, names, n_par * name_len, mpi_character, st, er)
273 end subroutine hd_write_info
299 phys_internal_e = .false.
300 phys_gamma = eos%gamma
307 if(
mype==0)
write(*,*)
'WARNING: set hd_trac_type=1'
311 call mpistop(
"hd_trac_type=7 requires usr_get_heating to be set in mod_usr.t")
322 call mpistop(
"hd_trac_type=7 requires usr_get_heating to be set in mod_usr.t")
327 if(
mype==0)
write(*,*)
'WARNING: hd_trac disabled for ndim>=2 (only trac_type=7 supported)'
336 if(
mype==0)
write(*,*)
'WARNING: set hd_thermal_conduction=F when hd_energy=F'
340 if(
mype==0)
write(*,*)
'WARNING: set hd_hyperbolic_thermal_conduction=F when hd_energy=F'
344 if(
mype==0)
write(*,*)
'WARNING: set hd_radiative_cooling=F when hd_energy=F'
349 allocate(start_indices(number_species),stop_indices(number_species))
357 mom(:) = var_set_momentum(
ndir)
362 e_ = var_set_energy()
385 if (eos%eos_type ==
'LTE')
then
388 else if (eos%eos_type ==
'PI')
then
399 write(*,*)
'Warning: CAK force addition together with FLD radiation'
404 write(*,*)
'Warning: Optically thin cooling together with FLD radiation'
408 call mpistop(
'implicit dust addition not compatible with FLD radiation')
411 call mpistop(
'using FLD implies the use of an energy equation, set hd_energy=T')
414 r_e = var_set_radiation_energy()
423 phys_implicit_update => hd_fld_implicit_update
424 phys_evaluate_implicit => hd_fld_evaluate_implicit
431 phys_get_dt => hd_get_dt
432 phys_get_cmax => hd_get_cmax
433 phys_get_tcutoff => hd_get_tcutoff
434 phys_get_cbounds => hd_get_cbounds
435 phys_get_flux => hd_get_flux
436 phys_add_source_geom => hd_add_source_geom
437 phys_add_source => hd_add_source
438 phys_modify_wlr => hd_modify_wlr
442 phys_get_v => hd_get_v
444 phys_write_info => hd_write_info
448 phys_get_ei => hd_get_ei
451 call hd_physical_units()
472 fip_ = var_set_fluxvar(
'rho_fip',
'fip', need_bc=.false.)
481 tracer(itr) = var_set_fluxvar(
"trc",
"trp", itr, need_bc=.false.)
493 if (iw_ne > 0) nwgc = max(nwgc, iw_ne)
494 if (iw_te > 0) nwgc = max(nwgc, iw_te)
497 stop_indices(1)=nwflux
508 iw_log_nh = var_set_wextra()
516 call mpistop(
"thermal conduction needs hd_energy=T")
524 if (iw_log_nh > 0)
then
554 call mpistop(
"radiative cooling needs hd_energy=T")
562 if (
rc_fl%rad_escape_prob)
then
573 te_fl_hd%get_pthermal=> eos%get_thermal_pressure
574 te_fl_hd%get_var_Rfactor => eos%get_Rfactor
579 phys_te_images => hd_te_images
591 if(
mype==0)
write(*,*)
'WARNING: set hd_well_balanced=F (requires hd_gravity=T)'
593 phys_wb_transform => hd_wb_transform
594 phys_wb_inverse => hd_wb_inverse
595 phys_wb_prolong => hd_wb_prolong
596 if (eos%ionE .and. eos%p2eint_method /=
'bisect' &
597 .and. eos%method /=
'entropy')
then
598 eos%p2eint_method =
'bisect'
599 if(
mype==0)
write(*,*)
'WB + ionE: forcing p2eint_method = bisect'
601 if (eos%method ==
'entropy' .and.
mype == 0)
then
602 write(*,*)
'WB + ionE + entropy: p2eint_method stays "table"'
603 write(*,*)
'eint_from_p_bisect uses legacy log_p table'
604 write(*,*)
'not built for entropy method'
606 if(
mype==0)
write(*,*)
'Well-balanced reconstruction enabled'
618 if (.not.
allocated(flux_type))
then
619 allocate(flux_type(
ndir, nw))
620 flux_type = flux_default
621 else if (any(shape(flux_type) /= [
ndir, nw]))
then
622 call mpistop(
"phys_check error: flux_type has wrong shape")
626 allocate(iw_vector(nvector))
627 iw_vector(1) =
mom(1) - 1
635 subroutine hd_modify_wlr(ixI^L,ixO^L,qt,wLC,wRC,wLp,wRp,s,idir)
638 integer,
intent(in) :: ixi^
l, ixo^
l, idir
639 double precision,
intent(in) :: qt
640 double precision,
intent(inout) :: wlc(ixi^s,1:nw), wrc(ixi^s,1:nw)
641 double precision,
intent(inout) :: wlp(ixi^s,1:nw), wrp(ixi^s,1:nw)
646 end subroutine hd_modify_wlr
649 subroutine hd_te_images
653 case(
'EIvtiCCmpi',
'EIvtuCCmpi')
655 case(
'ESvtiCCmpi',
'ESvtuCCmpi')
657 case(
'SIvtiCCmpi',
'SIvtuCCmpi')
659 case(
'WIvtiCCmpi',
'WIvtuCCmpi')
662 call mpistop(
"Error in synthesize emission: Unknown convert_type")
664 end subroutine hd_te_images
669 subroutine hd_sts_set_source_tc_hd(ixI^L,ixO^L,w,x,wres,fix_conserve_at_step,my_dt,igrid,nflux)
673 integer,
intent(in) :: ixi^
l, ixo^
l, igrid, nflux
674 double precision,
intent(in) :: x(ixi^s,1:
ndim)
675 double precision,
intent(inout) :: wres(ixi^s,1:nw), w(ixi^s,1:nw)
676 double precision,
intent(in) :: my_dt
677 logical,
intent(in) :: fix_conserve_at_step
679 end subroutine hd_sts_set_source_tc_hd
681 function hd_get_tc_dt_hd(w,ixI^L,ixO^L,dx^D,x)
result(dtnew)
687 integer,
intent(in) :: ixi^
l, ixo^
l
688 double precision,
intent(in) ::
dx^
d, x(ixi^s,1:
ndim)
689 double precision,
intent(in) :: w(ixi^s,1:nw)
690 double precision :: dtnew
693 end function hd_get_tc_dt_hd
695 subroutine hd_tc_handle_small_e(w, x, ixI^L, ixO^L, step)
700 integer,
intent(in) :: ixi^
l,ixo^
l
701 double precision,
intent(inout) :: w(ixi^s,1:nw)
702 double precision,
intent(in) :: x(ixi^s,1:
ndim)
703 integer,
intent(in) :: step
706 logical :: flag(ixi^s,1:nw)
707 character(len=140) :: error_msg
711 if(any(flag(ixo^s,
e_)))
then
719 w(ixo^s,
e_)=w(ixo^s,
e_)*(eos%gamma - 1.0d0)
721 w(ixo^s, iw_mom(idir)) = w(ixo^s, iw_mom(idir))/w(ixo^s,
rho_)
723 write(error_msg,
"(a,i3)")
"Thermal conduction step ", step
727 end subroutine hd_tc_handle_small_e
730 subroutine tc_params_read_hd(fl)
732 type(tc_fluid),
intent(inout) :: fl
734 logical :: tc_saturate=.false.
735 logical :: tc_patch_eint=.false.
736 double precision :: tc_k_para=0d0
737 double precision :: trac_t_floor=1.d4
739 namelist /tc_list/ tc_saturate, tc_k_para, trac_t_floor, tc_patch_eint
743 read(
unitpar, tc_list,
end=111)
746 fl%tc_saturate = tc_saturate
747 fl%tc_patch_eint = tc_patch_eint
748 fl%tc_k_para = tc_k_para
749 fl%trac_T_floor = trac_t_floor / unit_temperature
751 end subroutine tc_params_read_hd
765 subroutine rc_params_read(fl)
769 type(rc_fluid),
intent(inout) :: fl
772 integer :: ncool = 4000
775 character(len=std_len) :: coolcurve=
'JCcorona'
778 logical :: tfix=.false.
784 logical :: rc_split=.false.
787 double precision :: cfrac=0.1d0
790 logical :: rad_modify=.false.
792 logical :: rad_modify_sym=.false.
794 double precision :: rad_cut_hgt=0.0d0
796 double precision :: rad_cut_dey=0.15d0
798 double precision :: rad_taper_rho=
bigdouble
800 double precision :: rad_taper_dey=0.0d0
803 double precision :: rad_suppress_temp=0.0d0
805 logical :: rad_escape_prob=.false.
807 double precision :: rad_kappa_eff=0.0d0
809 double precision :: rad_kappa_tcutoff=0.0d0
811 double precision :: rad_kappa_alpha=4.0d0
813 character(len=10) :: rad_escape_type=
'slab'
815 double precision :: rad_escape_tau_cutoff=0.0d0
817 double precision :: rad_escape_height=0.0d0
819 character(len=8) :: rc_y_mod_quadrature=
'boole'
820 integer :: rc_y_mod_n_sub=16
822 logical :: rad_damp=.false.
823 double precision :: rad_damp_height=0.5d0
824 double precision :: rad_damp_scale=0.15d0
826 logical :: rad_newton=.false.
827 double precision :: rad_newton_trad=0.006d0
828 double precision :: rad_newton_rhosurf=1.d4
829 double precision :: rad_newton_pthick=25.d0
831 namelist /rc_list/ coolcurve, ncool, cfrac, tlow, tfix, rc_split, &
832 rad_modify, rad_modify_sym, rad_suppress_temp, &
833 rad_cut_hgt, rad_cut_dey, rad_taper_rho, rad_taper_dey, &
834 rad_escape_prob, rad_kappa_eff, rad_kappa_tcutoff, rad_kappa_alpha, &
835 rad_escape_type, rad_escape_tau_cutoff, rad_escape_height, &
836 rc_y_mod_quadrature, rc_y_mod_n_sub, &
837 rad_damp, rad_damp_height, rad_damp_scale, &
838 rad_newton, rad_newton_trad, rad_newton_rhosurf, rad_newton_pthick
842 read(
unitpar, rc_list,
end=111)
847 fl%coolcurve=coolcurve
852 fl%rad_modify=rad_modify
853 fl%rad_modify_sym=rad_modify_sym
854 fl%rad_suppress_temp=rad_suppress_temp
855 fl%rad_cut_hgt=rad_cut_hgt
856 fl%rad_cut_dey=rad_cut_dey
857 fl%rad_taper_rho=rad_taper_rho
858 fl%rad_taper_dey=rad_taper_dey
859 fl%rad_escape_prob=rad_escape_prob
860 fl%rad_kappa_eff=rad_kappa_eff
861 fl%rad_kappa_Tcutoff=rad_kappa_tcutoff/unit_temperature
862 fl%rad_kappa_alpha=rad_kappa_alpha
863 fl%rad_escape_type=rad_escape_type
864 fl%rad_escape_tau_cutoff=rad_escape_tau_cutoff
865 fl%rad_escape_height=rad_escape_height/unit_length
866 fl%Y_mod_quadrature=rc_y_mod_quadrature
867 fl%Y_mod_N_sub=rc_y_mod_n_sub
868 fl%rad_damp = rad_damp
869 fl%rad_damp_height = rad_damp_height
870 fl%rad_damp_scale = rad_damp_scale
871 fl%rad_newton = rad_newton
872 fl%rad_newton_trad = rad_newton_trad
873 fl%rad_newton_rhosurf = rad_newton_rhosurf
874 fl%rad_newton_pthick = rad_newton_pthick
875 end subroutine rc_params_read
883 use mod_particles,
only: npayload,nusrpayload,ngridvars,num_particles,physics_type_particles
886 double precision :: a,b,xfrac,yfrac
894 if (eos%gamma <= 0.0d0)
call mpistop (
"Error: eos%gamma <= 0")
895 if (
hd_adiab < 0.0d0)
call mpistop (
"Error: hd_adiab < 0")
898 if (eos%gamma <= 0.0d0 .or. eos%gamma == 1.0d0) &
899 call mpistop (
"Error: eos%gamma <= 0 or eos%gamma == 1.0")
911 call mpistop(
'select IMEX scheme for implicit dust update')
923 call mpistop(
"hd_hyperbolic_thermal_conduction is implemented for ndim=1 only;" // &
924 " for ndim>1 use mod_ffhd or parabolic mod_thermal_conduction.")
927 call mpistop(
"hd_hyperbolic_thermal_conduction and hd_thermal_conduction are mutually exclusive;" // &
928 " choose one TC implementation.")
933 call mpistop(
'select IMEX scheme for FLD radiation use')
936 call phys_set_mg_bounds()
938 if(.not.
fld_no_mg)
call mpistop(
'multigrid must have BCs for IMEX and FLD radiation use')
941 write(*,*)
'==FLD SETUP======================'
942 write(*,*)
'Using FLD with settings:'
946 write(*,*)
'Using FLD with settings: fld_bound_diff=',
fld_bound_diff
949 write(*,*)
'Using FLD with settings: fld_kappa0=',
fld_kappa0
950 write(*,*)
'Using FLD with settings: fld_opal_table=',
fld_opal_table
952 write(*,*)
'Using FLD with settings: fld_bisect_tol=',
fld_bisect_tol
953 write(*,*)
'Using FLD with settings: fld_diff_tol=',
fld_diff_tol
956 write(*,*)
' FLD has fld_no_mg=',
fld_no_mg
958 print *,
'WARNING: cheating with FLD diffusion ***********************'
959 print *,
'WARNING: No MG-diffusion for radiative energy at all!!!!!!!'
960 print *,
'WARNING: cheating with FLD diffusion ***********************'
963 print *,
'NORMALIZED arad_norm=',
arad_norm
964 print *,
'NORMALIZED c_norm=',
c_norm
966 print *,
'WARNING: cheating with c_norm ***********************'
967 print *,
'WARNING: c_norm reset to=',
fld_cnorm
969 print *,
'WARNING: cheating with c_norm ***********************'
977 print *,
'physical fld_kappa (in cgs or SI) =',
fld_kappa0
980 write(*,*)
'===FLD SETUP====================='
984 write(*,*)
'====HD run with settings===================='
985 write(*,*)
'Using mod_hd_phys with settings:'
987 write(*,*)
'Dimensionality :',
ndim
988 write(*,*)
'vector components:',
ndir
990 write(*,*)
'number of variables nw=',nw
991 write(*,*)
' start index iwstart=',iwstart
992 write(*,*)
'number of vector variables=',nvector
993 write(*,*)
'number of stagger variables nws=',nws
994 write(*,*)
'number of variables with BCs=',nwgc
995 write(*,*)
'number of vars with fluxes=',nwflux
996 write(*,*)
'number of vars with flux + BC=',nwfluxbc
997 write(*,*)
'number of auxiliary variables=',nwaux
998 write(*,*)
'number of extra vars without flux=',nwextra
999 write(*,*)
'number of extra vars for wextra=',nw_extra
1000 write(*,*)
'number of auxiliary I/O variables=',
nwauxio
1015 write(*,*)
'*****Using particles: npayload,ngridvars :', npayload,ngridvars
1016 write(*,*)
'*****Using particles: nusrpayload :', nusrpayload
1017 write(*,*)
'*****Using particles: num_particles :', num_particles
1018 write(*,*)
'*****Using particles: physics_type_particles=',physics_type_particles
1021 write(*,*)
'number due to phys_wider_stencil=',phys_wider_stencil
1022 write(*,*)
'==========================================='
1023 print *,
'========EOS and UNITS==========='
1025 print *,
'gamma=',eos%gamma
1026 print *,
'He_abundance =',eos%He_abundance
1028 print *,
'========EOS and UNITS==========='
1044 print *,
' compare this to ',mp_si*(1.d0+4.d0*eos%He_abundance)
1046 print *,
' compare this to ',mp_cgs*(1.d0+4.d0*eos%He_abundance)
1050 print *,
' compare this to ',kb_si*(2.d0+3.d0*eos%He_abundance)
1054 print *,
' compare this to ',kb_cgs*(2.d0+3.d0*eos%He_abundance)
1058 if(eos%eos_type /=
'LTE')
then
1059 print *,
'mean molecular weight mu is =',a/b,
' = ', (1.d0+4.d0*eos%He_abundance)/(2.d0+3.d0*eos%He_abundance)
1061 yfrac=4.d0*eos%He_abundance/(1.d0+4.d0*eos%He_abundance)
1062 print *,
'mass fraction hydrogen X is =',1/a,
' and this equals ', 1.d0/(1.d0+4.d0*eos%He_abundance)
1063 print *,
'mass fraction helium Y is =',yfrac
1064 print *,
' check that 1/mu', b/a,
' is equal to 2X+3Y/4=',2.d0*xfrac+3.d0*yfrac/4.d0
1065 print *,
' ratio n_e/n_p=',1.d0+2.0d0*eos%He_abundance
1067 print *,
'========UNITS==========='
1072 subroutine hd_physical_units
1074 double precision :: mp,kb,c_lightspeed,xfrac,sigma_telectron
1075 double precision :: a,b
1082 sigma_telectron=sigma_te_si
1087 c_lightspeed=const_c
1088 sigma_telectron=sigma_te_cgs
1093 if (eos%eos_type ==
'LTE')
then
1097 eos%nH2rhoFactor = 1d0+4d0*eos%He_abundance
1098 rr=(2d0+3d0*eos%He_abundance) / (1d0+4d0*eos%He_abundance)
1099 xfrac=1.d0/(1.d0+4.d0*eos%He_abundance)
1103 a=1d0+4d0*eos%He_abundance
1104 if(eos%eos_type==
'PI')
then
1107 b=2d0+3d0*eos%He_abundance
1193 end subroutine hd_physical_units
1200 logical,
intent(in) :: primitive
1201 integer,
intent(in) :: ixi^
l, ixo^
l
1202 double precision,
intent(in) :: w(ixi^s, nw)
1203 logical,
intent(inout) :: flag(ixi^s,1:nw)
1205 double precision :: tmp(ixi^s)
1206 double precision :: x(ixi^s, 1:
ndim)
1217 tmp(ixo^s)=(eos%gamma-1.0d0)*(w(ixo^s,
e_)-&
1218 half*(^
c&w(ixo^s,
m^
c_)**2+)/w(ixo^s,
rho_))
1232 subroutine hd_bound_fip(primitive, ixI^L, ixO^L, w)
1234 logical,
intent(in) :: primitive
1235 integer,
intent(in) :: ixi^
l, ixo^
l
1236 double precision,
intent(inout) :: w(ixi^s,1:nw)
1238 double precision :: rho_safe(ixi^s), fip_prim(ixi^s)
1246 fip_prim(ixo^s) = w(ixo^s,
fip_) / rho_safe(ixo^s)
1247 fip_prim(ixo^s) = min(
maxfip, max(
minfip, fip_prim(ixo^s)))
1248 w(ixo^s,
fip_) = rho_safe(ixo^s) * fip_prim(ixo^s)
1250 end subroutine hd_bound_fip
1315 integer,
intent(in) :: ixi^
l, ixo^
l
1316 double precision,
intent(inout) :: w(ixi^s, nw)
1317 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1320 w(ixo^s,
e_)=w(ixo^s,
e_)+half*(^
c&w(ixo^s,
m^
c_)**2+)/w(ixo^s,
rho_)
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_)-half*(^
c&w(ixo^s,
m^
c_)**2+)/w(ixo^s,
rho_)
1339 subroutine hd_e_to_ei_and_cache_log_nh(ixI^L,ixO^L,w,x)
1341 integer,
intent(in) :: ixi^
l, ixo^
l
1342 double precision,
intent(inout) :: w(ixi^s, nw)
1343 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1346 block%wextra(ixo^s, iw_log_nh) = dlog10(w(ixo^s,
rho_) / eos%nH2rhoFactor)
1347 end subroutine hd_e_to_ei_and_cache_log_nh
1350 function hd_get_ei(w, ixI^L, ixO^L)
result(ei)
1352 integer,
intent(in) :: ixi^
l, ixo^
l
1353 double precision,
intent(in) :: w(ixi^s, nw)
1354 double precision :: ei(ixo^s)
1357 ei(ixo^s) = w(ixo^s,
e_) - half*(^
c&w(ixo^s,
m^
c_)**2+)/w(ixo^s,
rho_)
1358 end function hd_get_ei
1361 subroutine hd_get_v_idim(w, x, ixI^L, ixO^L, idim, v)
1363 integer,
intent(in) :: ixi^
l, ixo^
l, idim
1364 double precision,
intent(in) :: w(ixi^s, nw), x(ixi^s, 1:
ndim)
1365 double precision,
intent(out) :: v(ixi^s)
1367 v(ixo^s) = w(ixo^s,
mom(idim)) / w(ixo^s,
rho_)
1368 end subroutine hd_get_v_idim
1371 subroutine hd_get_v(w,x,ixI^L,ixO^L,v)
1374 integer,
intent(in) :: ixi^
l, ixo^
l
1375 double precision,
intent(in) :: w(ixi^s,nw), x(ixi^s,1:^nd)
1376 double precision,
intent(out) :: v(ixi^s,1:
ndir)
1381 v(ixo^s,idir) = w(ixo^s,
mom(idir)) / w(ixo^s,
rho_)
1384 end subroutine hd_get_v
1387 subroutine hd_get_cmax(w, x, ixI^L, ixO^L, idim, cmax)
1392 integer,
intent(in) :: ixi^
l, ixo^
l, idim
1394 double precision,
intent(in) :: w(ixi^s, nw), x(ixi^s, 1:
ndim)
1395 double precision,
intent(inout) :: cmax(ixi^s)
1396 double precision :: csound2(ixi^s)
1399 call eos%get_csound2(w, x, ixi^
l, ixo^
l, csound2)
1400 cmax(ixo^s)=dabs(w(ixo^s,
mom(idim)))+dsqrt(csound2(ixo^s))
1407 cmax(ixo^s)=dabs(w(ixo^s,
mom(idim)))+dsqrt(eos%gamma*cmax(ixo^s)/w(ixo^s,
rho_))
1413 end subroutine hd_get_cmax
1416 subroutine hd_get_tcutoff(ixI^L,ixO^L,w,x,tco_local,Tmax_local)
1422 integer,
intent(in) :: ixi^
l,ixo^
l
1423 double precision,
intent(in) :: x(ixi^s,1:
ndim)
1425 double precision,
intent(inout) :: w(ixi^s,1:nw)
1426 double precision,
intent(out) :: tco_local, tmax_local
1428 double precision,
parameter :: trac_delta=0.25d0
1429 double precision :: tmp1(ixi^s),te(ixi^s),lts(ixi^s), r(ixi^s)
1430 double precision :: ltrc,ltrp
1431 integer :: jxo^
l,hxo^
l
1432 integer :: jxp^
l,hxp^
l,ixp^
l
1433 logical :: lrlt(ixi^s)
1435 double precision :: dtdx, l_t, a_coeff, l1, cooling, net_cool
1436 double precision :: kappa_par, disc, kappa_trac, kappa_eff, tcoff_eff
1437 double precision :: dx_over_delta, v_abs, v_n, gnorm, dl_eff
1438 double precision :: q_heat(ixi^s), ne(ixi^s), nh_arr(ixi^s)
1439 double precision :: gradtd(ixi^s,1:
ndim), nhat(1:
ndim)
1440 integer :: ix^
d, idims
1442 call eos%get_Rfactor(w,x,ixi^
l,ixi^
l,r)
1443 te(ixi^s)=w(ixi^s,
p_)/(r(ixi^s)*w(ixi^s,
rho_))
1445 if (eos%eos_type ==
'LTE')
then
1446 te(ixi^s) = w(ixi^s,
te_)
1450 tmax_local=maxval(te(ixo^s))
1458 lts(ixo^s)=0.5d0*dabs(te(jxo^s)-te(hxo^s))/te(ixo^s)
1460 where(lts(ixo^s) > trac_delta)
1463 if(any(lrlt(ixo^s)))
then
1464 tco_local=maxval(te(ixo^s), mask=lrlt(ixo^s))
1475 lts(ixp^s)=0.5d0*abs(te(jxp^s)-te(hxp^s))/te(ixp^s)
1476 lts(ixp^s)=max(one, (exp(lts(ixp^s))/ltrc)**ltrp)
1478 lts(ixo^s)=0.25d0*(lts(jxo^s)+two*lts(ixo^s)+lts(hxo^s))
1479 block%wextra(ixo^s,
tcoff_)=te(ixo^s)*lts(ixo^s)**0.4d0
1484 block%wextra(ixomin1-1,
tcoff_)=te(ixomin1-1)*lts(ixomin1-1)**0.4d0
1485 block%wextra(ixomax1+1,
tcoff_)=te(ixomax1+1)*lts(ixomax1+1)**0.4d0
1497 call eos%get_ne_nH(ixi^
l, ixo^
l, w, x, ne, nh_arr)
1503 do ix1=ixomin1,ixomax1
1505 dtdx = abs(te(ix1+1) - te(ix1-1)) / (2.d0 *
dxlevel(1))
1506 if(dtdx < smalldouble)
then
1511 l_t = te(ix1) / dtdx
1515 v_abs = abs(w(ix1,m1_))
1516 a_coeff = 2.5d0 * w(ix1,
p_) * v_abs / te(ix1)
1520 if(te(ix1) >
rc_fl%tcoolmin .and. te(ix1) <
rc_fl%tcoolmax)
then
1521 call findl(te(ix1), l1,
rc_fl); cooling = ne(ix1) * nh_arr(ix1) * l1
1522 else if(te(ix1) >=
rc_fl%tcoolmax)
then
1529 net_cool = abs(cooling - q_heat(ix1))
1532 kappa_par =
tc_fl%tc_k_para * te(ix1)**2.5d0
1535 disc = a_coeff**2 + 4.d0 *
tc_fl%tc_k_para * te(ix1)**1.5d0 * net_cool
1537 if(l_t <= 2.d0 * dx_over_delta)
then
1539 kappa_trac = (a_coeff + dsqrt(disc)) / (2.d0 / dx_over_delta)
1542 kappa_trac = dsqrt(4.d0 *
tc_fl%tc_k_para * te(ix1)**1.5d0 * net_cool) &
1543 / (2.d0 / dx_over_delta)
1547 kappa_eff = max(kappa_trac, kappa_par)
1550 tcoff_eff = (kappa_eff /
tc_fl%tc_k_para)**0.4d0
1553 block%wextra(ix1,
tcoff_) = max(te(ix1), tcoff_eff)
1567 call eos%get_ne_nH(ixi^
l, ixo^
l, w, x, ne, nh_arr)
1571 call gradient(te,ixi^
l,ixo^
l,idims,gradtd(ixi^s,idims))
1573 {
do ix^db=ixomin^db,ixomax^db\}
1574 gnorm = dsqrt(^
d&gradtd({ix^
d},^
d)**2+ )
1575 if(gnorm < smalldouble)
then
1578 ^
d&nhat(^
d)=gradtd({ix^
d},^
d)/gnorm\
1580 dl_eff = 1.d0/dsqrt(^
d&(nhat(^
d)/
block%ds({ix^
d},^
d))**2+ )
1581 l_t = te(ix^
d)/gnorm
1583 v_n = ^
d&w({ix^
d},
mom(^
d))*nhat(^
d)+
1584 a_coeff = 2.5d0*w(ix^
d,
p_)*dabs(v_n)/te(ix^
d)
1588 if(te(ix^
d) >
rc_fl%tcoolmin .and. te(ix^
d) <
rc_fl%tcoolmax)
then
1589 call findl(te(ix^
d),l1,
rc_fl); cooling = l1*ne(ix^
d)*nh_arr(ix^
d)
1590 else if(te(ix^
d) >=
rc_fl%tcoolmax)
then
1595 net_cool = dabs(cooling-q_heat(ix^
d))
1596 kappa_par =
tc_fl%tc_k_para*te(ix^
d)**2.5d0
1597 disc = a_coeff**2 + 4.d0*
tc_fl%tc_k_para*te(ix^
d)**1.5d0*net_cool
1599 if(l_t <= 2.d0*dx_over_delta)
then
1600 kappa_trac = (a_coeff+dsqrt(disc))/(2.d0/dx_over_delta)
1602 kappa_trac = dsqrt(4.d0*
tc_fl%tc_k_para*te(ix^
d)**1.5d0*net_cool)/(2.d0/dx_over_delta)
1604 kappa_eff = max(kappa_trac,kappa_par)
1605 tcoff_eff = (kappa_eff/
tc_fl%tc_k_para)**0.4d0
1611 call mpistop(
"hd_trac_type not allowed")
1613 end subroutine hd_get_tcutoff
1616 subroutine hd_get_cbounds(wLC, wRC, wLp, wRp, x, ixI^L, ixO^L, idim,Hspeed,cmax, cmin)
1622 integer,
intent(in) :: ixi^
l, ixo^
l, idim
1624 double precision,
intent(in) :: wlc(ixi^s,
nw), wrc(ixi^s,
nw)
1626 double precision,
intent(in) :: wlp(ixi^s,
nw), wrp(ixi^s,
nw)
1627 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1629 double precision,
intent(inout),
optional :: cmin(ixi^s,1:
number_species)
1632 double precision :: wmean(ixi^s,
nw)
1633 double precision,
dimension(ixI^S) :: umean, dmean, csoundl, csoundr, tmp1,tmp2,tmp3
1641 tmp1(ixo^s)=dsqrt(wlp(ixo^s,
rho_))
1642 tmp2(ixo^s)=dsqrt(wrp(ixo^s,
rho_))
1643 tmp3(ixo^s)=1.d0/(tmp1(ixo^s)+tmp2(ixo^s))
1644 umean(ixo^s)=(wlp(ixo^s,
mom(idim))*tmp1(ixo^s)+wrp(ixo^s,
mom(idim))*tmp2(ixo^s))*tmp3(ixo^s)
1647 call eos%get_csound2(wlp, x, ixi^
l, ixo^
l, csoundl)
1648 call eos%get_csound2(wrp, x, ixi^
l, ixo^
l, csoundr)
1650 csoundl(ixo^s)=csoundl(ixo^s)+(4.0d0/9.0d0)*wlp(ixo^s,
r_e)/wlp(ixo^s,
rho_)
1651 csoundr(ixo^s)=csoundr(ixo^s)+(4.0d0/9.0d0)*wrp(ixo^s,
r_e)/wrp(ixo^s,
rho_)
1659 dmean(ixo^s) = (tmp1(ixo^s)*csoundl(ixo^s)+tmp2(ixo^s)*csoundr(ixo^s)) * &
1660 tmp3(ixo^s) + 0.5d0*tmp1(ixo^s)*tmp2(ixo^s)*tmp3(ixo^s)**2 * &
1661 (wrp(ixo^s,
mom(idim))-wlp(ixo^s,
mom(idim)))**2
1663 dmean(ixo^s)=dsqrt(dmean(ixo^s))
1664 if(
present(cmin))
then
1665 cmin(ixo^s,1)=umean(ixo^s)-dmean(ixo^s)
1666 cmax(ixo^s,1)=umean(ixo^s)+dmean(ixo^s)
1668 {
do ix^db=ixomin^db,ixomax^db\}
1669 cmin(ix^
d,1)=sign(one,cmin(ix^
d,1))*max(abs(cmin(ix^
d,1)),hspeed(ix^
d,1))
1670 cmax(ix^
d,1)=sign(one,cmax(ix^
d,1))*max(abs(cmax(ix^
d,1)),hspeed(ix^
d,1))
1674 cmax(ixo^s,1)=dabs(umean(ixo^s))+dmean(ixo^s)
1678 wmean(ixo^s,1:nwflux)=0.5d0*(wlc(ixo^s,1:nwflux)+wrc(ixo^s,1:nwflux))
1679 call dust_get_cmax(wmean, x, ixi^l, ixo^l, idim, cmax, cmin)
1690 wmean(ixo^s,1:nwflux)=0.5d0*(wlc(ixo^s,1:nwflux)+wrc(ixo^s,1:nwflux))
1691 tmp1(ixo^s)=wmean(ixo^s,
mom(idim))/wmean(ixo^s,
rho_)
1693 if(
hd_radiation_fld.and.fld_bound_diff)csoundr(ixo^s)=csoundr(ixo^s)+(4.0d0/9.0d0)*wmean(ixo^s,
r_e)/wmean(ixo^s,
rho_)
1695 csoundr(ixo^s) = dsqrt(csoundr(ixo^s))
1697 if(
present(cmin))
then
1698 cmax(ixo^s,1)=max(tmp1(ixo^s)+csoundr(ixo^s),zero)
1699 cmin(ixo^s,1)=min(tmp1(ixo^s)-csoundr(ixo^s),zero)
1700 if(h_correction)
then
1701 {
do ix^db=ixomin^db,ixomax^db\}
1702 cmin(ix^d,1)=sign(one,cmin(ix^d,1))*max(abs(cmin(ix^d,1)),hspeed(ix^d,1))
1703 cmax(ix^d,1)=sign(one,cmax(ix^d,1))*max(abs(cmax(ix^d,1)),hspeed(ix^d,1))
1707 cmax(ixo^s,1)=dabs(tmp1(ixo^s))+csoundr(ixo^s)
1711 call dust_get_cmax(wmean, x, ixi^l, ixo^l, idim, cmax, cmin)
1716 call eos%get_csound2(wlp, x, ixi^l, ixo^l, csoundl)
1717 call eos%get_csound2(wrp, x, ixi^l, ixo^l, csoundr)
1719 csoundl(ixo^s)=csoundl(ixo^s)+(4.0d0/9.0d0)*wlp(ixo^s,
r_e)/wlp(ixo^s,
rho_)
1720 csoundr(ixo^s)=csoundr(ixo^s)+(4.0d0/9.0d0)*wrp(ixo^s,
r_e)/wrp(ixo^s,
rho_)
1727 csoundl(ixo^s)=max(dsqrt(csoundl(ixo^s)),dsqrt(csoundr(ixo^s)))
1728 if(
present(cmin))
then
1729 cmin(ixo^s,1)=min(wlp(ixo^s,
mom(idim)),wrp(ixo^s,
mom(idim)))-csoundl(ixo^s)
1730 cmax(ixo^s,1)=max(wlp(ixo^s,
mom(idim)),wrp(ixo^s,
mom(idim)))+csoundl(ixo^s)
1731 if(h_correction)
then
1732 {
do ix^db=ixomin^db,ixomax^db\}
1733 cmin(ix^d,1)=sign(one,cmin(ix^d,1))*max(abs(cmin(ix^d,1)),hspeed(ix^d,1))
1734 cmax(ix^d,1)=sign(one,cmax(ix^d,1))*max(abs(cmax(ix^d,1)),hspeed(ix^d,1))
1738 cmax(ixo^s,1)=max(wlp(ixo^s,
mom(idim)),wrp(ixo^s,
mom(idim)))+csoundl(ixo^s)
1741 wmean(ixo^s,1:nwflux)=0.5d0*(wlc(ixo^s,1:nwflux)+wrc(ixo^s,1:nwflux))
1742 call dust_get_cmax(wmean, x, ixi^l, ixo^l, idim, cmax, cmin)
1751 call eos%get_csound2(wlp, x, ixi^l, ixo^l, csoundl)
1752 call eos%get_csound2(wrp, x, ixi^l, ixo^l, csoundr)
1754 csoundl(ixo^s)=csoundl(ixo^s)+(4.0d0/9.0d0)*wlp(ixo^s,
r_e)/wlp(ixo^s,
rho_)
1755 csoundr(ixo^s)=csoundr(ixo^s)+(4.0d0/9.0d0)*wrp(ixo^s,
r_e)/wrp(ixo^s,
rho_)
1761 csoundl(ixo^s) = dsqrt(csoundl(ixo^s))
1762 csoundr(ixo^s) = dsqrt(csoundr(ixo^s))
1763 if(
present(cmin))
then
1764 {
do ix^db=ixomin^db,ixomax^db\}
1767 tmp1(ix^d) = 0.25d0*(wlp(ix^d,
rho_)+wrp(ix^d,
rho_)) &
1768 *(csoundl(ix^d)+csoundr(ix^d))
1770 tmp2(ix^d) = max(zero, 0.5d0*(wlp(ix^d,
e_)+wrp(ix^d,
e_)) &
1771 + 0.5d0*(wlp(ix^d,
mom(idim))-wrp(ix^d,
mom(idim))) &
1774 if(tmp2(ix^d) > wlp(ix^d,
e_) .and. wlp(ix^d,
e_) > zero)
then
1776 tmp3(ix^d) = csoundl(ix^d)**2*wlp(ix^d,
rho_)/wlp(ix^d,
e_)
1777 dmean(ix^d) = dsqrt(1.0d0 + (tmp3(ix^d)+1.0d0) &
1778 /(2.0d0*tmp3(ix^d)) &
1779 *(tmp2(ix^d)/wlp(ix^d,
e_) - 1.0d0))
1784 cmin(ix^d,1) = wlp(ix^d,
mom(idim)) - csoundl(ix^d)*dmean(ix^d)
1786 if(tmp2(ix^d) > wrp(ix^d,
e_) .and. wrp(ix^d,
e_) > zero)
then
1788 tmp3(ix^d) = csoundr(ix^d)**2*wrp(ix^d,
rho_)/wrp(ix^d,
e_)
1789 dmean(ix^d) = dsqrt(1.0d0 + (tmp3(ix^d)+1.0d0) &
1790 /(2.0d0*tmp3(ix^d)) &
1791 *(tmp2(ix^d)/wrp(ix^d,
e_) - 1.0d0))
1796 cmax(ix^d,1) = wrp(ix^d,
mom(idim)) + csoundr(ix^d)*dmean(ix^d)
1798 if(h_correction)
then
1799 {
do ix^db=ixomin^db,ixomax^db\}
1800 cmin(ix^d,1)=sign(one,cmin(ix^d,1))*max(abs(cmin(ix^d,1)),hspeed(ix^d,1))
1801 cmax(ix^d,1)=sign(one,cmax(ix^d,1))*max(abs(cmax(ix^d,1)),hspeed(ix^d,1))
1805 {
do ix^db=ixomin^db,ixomax^db\}
1806 tmp1(ix^d) = 0.25d0*(wlp(ix^d,
rho_)+wrp(ix^d,
rho_)) &
1807 *(csoundl(ix^d)+csoundr(ix^d))
1808 tmp2(ix^d) = max(zero, 0.5d0*(wlp(ix^d,
e_)+wrp(ix^d,
e_)) &
1809 + 0.5d0*(wlp(ix^d,
mom(idim))-wrp(ix^d,
mom(idim))) &
1811 if(tmp2(ix^d) > wlp(ix^d,
e_) .and. wlp(ix^d,
e_) > zero)
then
1812 tmp3(ix^d) = csoundl(ix^d)**2*wlp(ix^d,
rho_)/wlp(ix^d,
e_)
1813 dmean(ix^d) = dsqrt(1.0d0 + (tmp3(ix^d)+1.0d0) &
1814 /(2.0d0*tmp3(ix^d)) &
1815 *(tmp2(ix^d)/wlp(ix^d,
e_) - 1.0d0))
1819 umean(ix^d) = dabs(wlp(ix^d,
mom(idim)) &
1820 - csoundl(ix^d)*dmean(ix^d))
1821 if(tmp2(ix^d) > wrp(ix^d,
e_) .and. wrp(ix^d,
e_) > zero)
then
1822 tmp3(ix^d) = csoundr(ix^d)**2*wrp(ix^d,
rho_)/wrp(ix^d,
e_)
1823 dmean(ix^d) = dsqrt(1.0d0 + (tmp3(ix^d)+1.0d0) &
1824 /(2.0d0*tmp3(ix^d)) &
1825 *(tmp2(ix^d)/wrp(ix^d,
e_) - 1.0d0))
1829 cmax(ix^d,1) = max(umean(ix^d), &
1830 wrp(ix^d,
mom(idim))+csoundr(ix^d)*dmean(ix^d))
1834 wmean(ixo^s,1:nwflux)=0.5d0*(wlc(ixo^s,1:nwflux)+wrc(ixo^s,1:nwflux))
1835 call dust_get_cmax(wmean, x, ixi^l, ixo^l, idim, cmax, cmin)
1839 end subroutine hd_get_cbounds
1850 integer,
intent(in) :: ixi^
l, ixo^
l
1851 double precision,
intent(in) :: w(ixi^s,nw)
1852 double precision,
intent(in) :: x(ixi^s,1:
ndim)
1853 double precision,
intent(out) :: csound2(ixi^s)
1854 double precision :: pthermal(ixi^s)
1855 double precision :: nh_val, g1
1856 double precision :: local_t0
1860 call eos%get_thermal_pressure(w, x, ixi^
l, ixo^
l, pthermal)
1863 local_t0 = mpi_wtime()
1864 {
do ix^db=ixomin^db,ixomax^db\}
1865 nh_val = w(ix^
d,
rho_) / eos%nH2rhoFactor
1867 csound2(ix^
d) = g1 * pthermal(ix^
d) / w(ix^
d,
rho_)
1869 timeeos_csound=timeeos_csound+(mpi_wtime()-local_t0)
1871 csound2(ixo^s) = eos%gamma * pthermal(ixo^s) / w(ixo^s,
rho_)
1882 integer,
intent(in) :: ixi^
l, ixo^
l
1883 double precision,
intent(in) :: w(ixi^s, nw), x(ixi^s,1:
ndim)
1884 double precision,
intent(out):: csound(ixi^s)
1886 double precision :: wprim(ixi^s, nw)
1888 wprim(ixi^s,1:nw)=w(ixi^s,1:nw)
1889 call eos%to_primitive(ixi^
l,ixo^
l,wprim,x)
1900 integer,
intent(in) :: ixi^
l, ixo^
l
1901 double precision,
intent(in) :: w(ixi^s, nw), x(ixi^s,1:
ndim)
1902 double precision,
intent(out):: csound(ixi^s)
1905 double precision :: inv_rho
1906 double precision :: prad_tensor(ixi^s, 1:
ndim, 1:
ndim)
1907 double precision :: prad_max(ixi^s)
1915 prad_tensor(ixo^s,idim,idim)=w(ixo^s,
r_e)/3.0d0
1919 {
do ix^db=ixomin^db,ixomax^db \}
1920 inv_rho=1.d0/w(ix^
d,
rho_)
1921 prad_max(ix^
d) = (4.0d0/3.0d0)*maxval(prad_tensor(ix^
d,:,:))
1922 csound(ix^
d)=(eos%gamma*w(ix^
d,
p_)+prad_max(ix^
d))*inv_rho
1925 if(minval(csound(ixo^s))<smalldouble)
then
1926 print *,
'issue with squared speed and rad pressure'
1927 print *,minval(csound(ixo^s))
1928 print *,minval(prad_max(ixo^s))
1929 call mpistop(
"negative squared speed in get_csrad2 for dt")
1940 integer,
intent(in) :: ixi^
l, ixo^
l
1941 double precision,
intent(in) :: w(ixi^s, 1:nw)
1942 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1943 double precision,
intent(out):: prad(ixi^s, 1:
ndim, 1:
ndim)
1953 integer,
intent(in) :: ixi^
l, ixo^
l
1954 double precision,
intent(in) :: w(ixi^s, 1:nw)
1955 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1956 double precision,
intent(out):: pth_plus_prad(ixi^s)
1958 double precision :: wprim(ixi^s, 1:nw)
1959 double precision :: prad_tensor(ixi^s, 1:
ndim, 1:
ndim)
1960 double precision :: prad_max(ixi^s)
1963 wprim(ixi^s,1:nw)=w(ixi^s,1:nw)
1964 call eos%to_primitive(ixi^
l,ixo^
l,wprim,x)
1966 {
do ix^
d = ixomin^
d,ixomax^
d\}
1967 prad_max(ix^
d) = maxval(prad_tensor(ix^
d,:,:))
1969 pth_plus_prad(ixo^s) = wprim(ixo^s,
p_) + prad_max(ixo^s)
1977 integer,
intent(in) :: ixi^
l, ixo^
l
1978 double precision,
intent(in) :: w(ixi^s, 1:nw)
1979 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1980 double precision,
intent(out):: trad(ixi^s)
1989 integer,
intent(in) :: ixi^
l, ixo^
l
1990 double precision,
intent(in) :: w(ixi^s, 1:nw)
1991 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1992 double precision,
intent(out):: res(ixi^s)
1994 double precision :: r(ixi^s)
1996 call eos%get_Rfactor(w,x,ixi^
l,ixo^
l,r)
1997 call eos%get_thermal_pressure(w, x, ixi^
l, ixo^
l, res)
1998 res(ixo^s)=res(ixo^s)/(r(ixo^s)*w(ixo^s,
rho_))
2002 subroutine hd_get_temperature_from_eint(w, x, ixI^L, ixO^L, res)
2004 integer,
intent(in) :: ixi^
l, ixo^
l
2005 double precision,
intent(in) :: w(ixi^s, 1:nw)
2006 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
2007 double precision,
intent(out):: res(ixi^s)
2009 double precision :: r(ixi^s)
2011 call eos%get_Rfactor(w,x,ixi^
l,ixo^
l,r)
2012 res(ixo^s) = (eos%gamma - 1.0d0) * w(ixo^s,
e_)/(w(ixo^s,
rho_)*r(ixo^s))
2013 end subroutine hd_get_temperature_from_eint
2016 subroutine hd_get_flux(wC, w, x, ixI^L, ixO^L, idim, f)
2020 integer,
intent(in) :: ixi^
l, ixo^
l, idim
2022 double precision,
intent(in) :: wc(ixi^s, 1:nw)
2024 double precision,
intent(in) :: w(ixi^s, 1:nw)
2025 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
2026 double precision,
intent(out) :: f(ixi^s, nwflux)
2028 double precision :: pth(ixi^s)
2032 {
do ix^db=ixomin^db,ixomax^db\}
2048 {
do ix^db=ixomin^db,ixomax^db\}
2053 call eos%get_thermal_pressure(wc, x, ixi^l, ixo^l, pth)
2054 {
do ix^db=ixomin^db,ixomax^db\}
2057 ^
c&f(ix^d,
m^
c_)=w(ix^d,
mom(idim))*wc(ix^d,
m^
c_)\
2058 f(ix^d,
mom(idim))=f(ix^d,
mom(idim))+pth(ix^d)
2063 {
do ix^db=ixomin^db,ixomax^db\}
2065 f(ix^d,
r_e)=w(ix^d,
mom(idim))*wc(ix^d,
r_e)
2074 f(ixo^s,
fip_) = w(ixo^s,
mom(idim)) * wc(ixo^s,
fip_)
2079 call dust_get_flux_prim(w, x, ixi^l, ixo^l, idim, f)
2082 end subroutine hd_get_flux
2089 subroutine hd_add_source_geom(qdt, dtfactor, ixI^L, ixO^L, wCT, wprim, w, x)
2095 integer,
intent(in) :: ixi^
l, ixo^
l
2096 double precision,
intent(in) :: qdt, dtfactor, x(ixi^s, 1:
ndim)
2097 double precision,
intent(inout) :: wct(ixi^s, 1:nw), wprim(ixi^s,1:nw),w(ixi^s, 1:nw)
2098 double precision :: pth(ixi^s),
source(ixi^s), minrho
2099 integer :: iw,idir, h1x^
l{^nooned, h2x^
l}
2100 integer :: mr_,mphi_
2101 integer :: irho, ifluid, n_fluids
2102 double precision :: exp_factor(ixi^s), del_exp_factor(ixi^s), exp_factor_primitive(ixi^s)
2124 source(ixo^s) =
source(ixo^s)*del_exp_factor(ixo^s)/exp_factor(ixo^s)
2128 do ifluid = 0, n_fluids-1
2130 if (ifluid == 0)
then
2154 where (wct(ixo^s, irho) > minrho)
2155 source(ixo^s) =
source(ixo^s) + wct(ixo^s,mphi_)*wprim(ixo^s,mphi_)
2156 w(ixo^s, mr_) = w(ixo^s, mr_) + qdt*
source(ixo^s)/x(ixo^s,
r_)
2159 where (wct(ixo^s, irho) > minrho)
2160 source(ixo^s) = -wct(ixo^s, mphi_) * wprim(ixo^s, mr_)
2161 w(ixo^s, mphi_) = w(ixo^s, mphi_) + qdt *
source(ixo^s) / x(ixo^s,
r_)
2165 w(ixo^s, mr_) = w(ixo^s, mr_) + qdt *
source(ixo^s) / x(ixo^s,
r_)
2170 call mpistop(
"Dust geom source terms not implemented yet with spherical geometries")
2174 h1x^
l=ixo^
l-
kr(1,^
d); {^nooned h2x^
l=ixo^
l-
kr(2,^
d);}
2176 pth(ixo^s)=wprim(ixo^s,
p_)
2185 source(ixo^s) = pth(ixo^s) * x(ixo^s, 1) &
2186 *(
block%surfaceC(ixo^s, 1) -
block%surfaceC(h1x^s, 1)) &
2187 /
block%dvolume(ixo^s)
2191 w(ixo^s, mr_) = w(ixo^s, mr_) + qdt *
source(ixo^s) / x(ixo^s, 1)
2195 source(ixo^s) = pth(ixo^s) * x(ixo^s, 1) &
2196 * (
block%surfaceC(ixo^s, 2) -
block%surfaceC(h2x^s, 2)) &
2197 /
block%dvolume(ixo^s)
2199 source(ixo^s) =
source(ixo^s) + (wprim(ixo^s,
mom(3))**2 * wprim(ixo^s,
rho_)) / tan(x(ixo^s, 2))
2201 source(ixo^s) =
source(ixo^s) - (wprim(ixo^s,
mom(2)) * wprim(ixo^s, mr_)) * wprim(ixo^s,
rho_)
2202 w(ixo^s,
mom(2)) = w(ixo^s,
mom(2)) + qdt *
source(ixo^s) / x(ixo^s, 1)
2206 source(ixo^s) = -(wprim(ixo^s,
mom(3)) * wprim(ixo^s, mr_)) * wprim(ixo^s,
rho_)&
2207 - (wprim(ixo^s,
mom(2)) * wprim(ixo^s,
mom(3))) * wprim(ixo^s,
rho_) / tan(x(ixo^s, 2))
2208 w(ixo^s,
mom(3)) = w(ixo^s,
mom(3)) + qdt *
source(ixo^s) / x(ixo^s, 1)
2215 call mpistop(
"Rotating frame not implemented yet with dust")
2221 end subroutine hd_add_source_geom
2224 subroutine hd_add_source(qdt,dtfactor, ixI^L,ixO^L,wCT,wCTprim,w,x,qsourcesplit,active)
2233 integer,
intent(in) :: ixi^
l, ixo^
l
2234 double precision,
intent(in) :: qdt, dtfactor
2235 double precision,
intent(in) :: wct(ixi^s, 1:nw),wctprim(ixi^s,1:nw), x(ixi^s, 1:
ndim)
2236 double precision,
intent(inout) :: w(ixi^s, 1:nw)
2237 logical,
intent(in) :: qsourcesplit
2238 logical,
intent(inout) :: active
2240 double precision :: gravity_field(ixi^s, 1:
ndim)
2241 integer :: idust, idim, ix^
d
2257 qsourcesplit,active,
rc_fl)
2276 + qdt * gravity_field(ixo^s, idim) * wct(ixo^s,
dust_rho(idust))
2288 call hd_add_radiation_source(qdt,ixi^
l,ixo^
l,wct,wctprim,w,x,qsourcesplit,active)
2291 if(eos%eos_type ==
'PI')
then
2292 if(.not.qsourcesplit)
then
2294 call eos%update_eos(ixi^
l,ixo^
l,w,x)
2301 call add_hypertc_source(qdt,ixi^
l,ixo^
l,wct,w,x,wctprim)
2304 end subroutine hd_add_source
2326 subroutine add_hypertc_source(qdt,ixI^L,ixO^L,wCT,w,x,wCTprim)
2329 integer,
intent(in) :: ixi^
l,ixo^
l
2330 double precision,
intent(in) :: qdt
2331 double precision,
dimension(ixI^S,1:ndim),
intent(in) :: x
2332 double precision,
dimension(ixI^S,1:nw),
intent(in) :: wct,wctprim
2333 double precision,
dimension(ixI^S,1:nw),
intent(inout) :: w
2335 double precision :: te(ixi^s), rfactor(ixi^s)
2336 double precision :: qf_half(ixglo1:ixghi1)
2337 double precision :: qf_full(ixglo1:ixghi1)
2338 double precision :: t_l, t_r, t_cool_l, t_cool_r, t_kap_l, t_kap_r
2339 double precision :: kappa_l, kappa_r, kappa_f
2340 double precision :: sigma_t7_f, dt_face, dx_f
2341 double precision :: rho_f, p_l, p_r, p_f, cs_f, q_sat, q_sp, q_sp_star
2342 double precision :: f_sat, eint_loc_l, eint_loc_r, eint_loc_f
2343 double precision :: qn_face, tau_f, ratio, decay, ave_factor
2344 double precision :: q_face_max
2345 double precision,
parameter :: ratio_cap = 50.0d0
2346 integer :: ix1, nface_lo, nface_hi
2350 te(ixi^s) = wct(ixi^s,
te_)
2352 call eos%get_Rfactor(wctprim, x, ixi^
l, ixi^
l, rfactor)
2353 te(ixi^s) = wctprim(ixi^s,
p_) / (rfactor(ixi^s) * wctprim(ixi^s,
rho_))
2357 nface_lo = ixomin1 - 1
2362 do ix1 = nface_lo, nface_hi
2373 t_kap_l = max(t_l, t_cool_l)
2374 t_kap_r = max(t_r, t_cool_r)
2380 if (kappa_l + kappa_r > smalldouble)
then
2381 kappa_f = 2.0d0 * kappa_l * kappa_r / (kappa_l + kappa_r)
2386 dx_f = 0.5d0 * (
block%ds(ix1, 1) +
block%ds(ix1 + 1, 1))
2388 q_sp = -kappa_f * dt_face / dx_f
2391 rho_f = 0.5d0 * (wctprim(ix1,
rho_) + wctprim(ix1 + 1,
rho_))
2392 p_l = wctprim(ix1,
p_)
2393 p_r = wctprim(ix1 + 1,
p_)
2394 p_f = 0.5d0 * (p_l + p_r)
2395 cs_f = dsqrt(max(smalldouble, eos%gamma * p_f / max(rho_f, smalldouble)))
2399 q_sat = 1.5d0 * rho_f * (p_f / max(rho_f, smalldouble))**1.5d0
2400 if (q_sat > smalldouble)
then
2401 f_sat = 1.0d0 / (1.0d0 + dabs(q_sp) / q_sat)
2405 q_sp_star = f_sat * q_sp
2411 eint_loc_l = wct(ix1,
e_) &
2412 - 0.5d0 * wct(ix1, m1_)**2 / max(wct(ix1,
rho_), smalldouble)
2413 eint_loc_r = wct(ix1 + 1,
e_) &
2414 - 0.5d0 * wct(ix1 + 1, m1_)**2 / max(wct(ix1 + 1,
rho_), smalldouble)
2415 eint_loc_l = max(eint_loc_l, smalldouble)
2416 eint_loc_r = max(eint_loc_r, smalldouble)
2417 eint_loc_f = 0.5d0 * (eint_loc_l + eint_loc_r)
2422 sigma_t7_f = kappa_f * 0.5d0 * (t_l + t_r)
2423 tau_f = max(4.0d0 *
dt, &
2427 ratio = min(qdt / tau_f, ratio_cap)
2428 decay = dexp(-ratio)
2429 if (ratio > 1.0
d-6)
then
2430 ave_factor = (1.0d0 - decay) / ratio
2432 ave_factor = 1.0d0 - 0.5d0 * ratio + ratio * ratio / 6.0d0
2435 qn_face = 0.5d0 * (wct(ix1,
q_) + wct(ix1 + 1,
q_))
2437 qf_full(ix1) = q_sp_star + (qn_face - q_sp_star) * decay
2438 qf_half(ix1) = q_sp_star + (qn_face - q_sp_star) * ave_factor
2442 block%ds(ix1, 1) / max(qdt, smalldouble)
2443 qf_half(ix1) = sign(min(dabs(qf_half(ix1)), q_face_max), qf_half(ix1))
2447 do ix1 = ixomin1, ixomax1
2448 w(ix1,
e_) = w(ix1,
e_) &
2449 - qdt * (qf_half(ix1) - qf_half(ix1 - 1)) /
block%ds(ix1, 1)
2450 w(ix1,
q_) = 0.5d0 * (qf_full(ix1 - 1) + qf_full(ix1))
2454 end subroutine add_hypertc_source
2456 subroutine hd_add_radiation_source(qdt,ixI^L,ixO^L,wCT,wCTprim,w,x,qsourcesplit,active)
2462 integer,
intent(in) :: ixi^
l, ixo^
l
2463 double precision,
intent(in) :: qdt, x(ixi^s,1:
ndim)
2464 double precision,
intent(in) :: wct(ixi^s,1:nw),wctprim(ixi^s,1:nw)
2465 double precision,
intent(inout) :: w(ixi^s,1:nw)
2466 logical,
intent(in) :: qsourcesplit
2467 logical,
intent(inout) :: active
2473 end subroutine hd_add_radiation_source
2475 subroutine hd_get_dt(wprim, ixI^L, ixO^L, dtnew, dx^D, x)
2483 integer,
intent(in) :: ixi^
l, ixo^
l
2484 double precision,
intent(in) ::
dx^
d, x(ixi^s, 1:^nd)
2485 double precision,
intent(in) :: wprim(ixi^s, 1:nw)
2486 double precision,
intent(inout) :: dtnew
2510 end subroutine hd_get_dt
2515 subroutine hd_fld_implicit_update(dtfactor,qdt,qtC,psa,psb)
2520 double precision,
intent(in) :: qdt
2521 double precision,
intent(in) :: qtc
2522 double precision,
intent(in) :: dtfactor
2525 end subroutine hd_fld_implicit_update
2527 subroutine hd_fld_evaluate_implicit(qtC,psa)
2531 double precision,
intent(in) :: qtc
2534 end subroutine hd_fld_evaluate_implicit
2538 integer,
intent(in) :: ixi^
l, ixo^
l
2539 double precision,
intent(in) :: w(ixi^s, nw)
2540 double precision :: ke(ixo^s)
2541 double precision,
intent(in),
optional :: inv_rho(ixo^s)
2543 if (
present(inv_rho))
then
2544 ke = 0.5d0 * sum(w(ixo^s,
mom(:))**2, dim=
ndim+1) * inv_rho
2546 ke = 0.5d0 * sum(w(ixo^s,
mom(:))**2, dim=
ndim+1) / w(ixo^s,
rho_)
2550 function hd_inv_rho(w, ixI^L, ixO^L)
result(inv_rho)
2552 integer,
intent(in) :: ixi^
l, ixo^
l
2553 double precision,
intent(in) :: w(ixi^s, nw)
2554 double precision :: inv_rho(ixo^s)
2557 inv_rho = 1.0d0 / w(ixo^s,
rho_)
2558 end function hd_inv_rho
2567 logical,
intent(in) :: primitive
2568 integer,
intent(in) :: ixi^
l,ixo^
l
2569 double precision,
intent(inout) :: w(ixi^s,1:nw)
2570 double precision,
intent(in) :: x(ixi^s,1:
ndim)
2571 character(len=*),
intent(in) :: subname
2574 logical :: flag(ixi^s,1:nw)
2584 where(flag(ixo^s,
rho_)) w(ixo^s,
mom(idir)) = 0.0d0
2606 where(flag(ixo^s,
e_))
2632 call eos%get_thermal_pressure(w, x, ixi^
l, ixo^
l, w(ixo^s,
p_))
2635 w(ixo^s,
mom(idir)) = w(ixo^s,
mom(idir))/w(ixo^s,
rho_)
2637 call eos%p_to_e(ixi^
l, ixo^
l, w, x)
2639 w(ixo^s,
mom(idir)) = w(ixo^s,
mom(idir))*w(ixo^s,
rho_)
2658 if(.not.primitive)
then
2662 call eos%get_thermal_pressure(w, x, ixi^
l, ixo^
l, w(ixo^s,
p_))
2667 w(ixo^s,
mom(idir)) = w(ixo^s,
mom(idir))/w(ixo^s,
rho_)
2674 if (
hd_fip)
call hd_bound_fip(primitive, ixi^
l, ixo^
l, w)
2697 subroutine hd_wb_prolong(ixI^L, ixO^L, w, x)
2701 integer,
intent(in) :: ixi^
l, ixo^
l
2702 double precision,
intent(inout) :: w(ixi^s, 1:nw)
2703 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
2705 double precision :: gravity_field(ixi^s, 1:
ndim)
2706 double precision :: wb_t(ixi^s), p_eq(ixi^s)
2707 double precision :: dx_idims
2708 double precision :: alpha(ixi^s), beta(ixi^s)
2710 integer :: ix1, ix_mid
2714 wb_t(ixo^s) = w(ixo^s,
p_) / w(ixo^s,
rho_)
2723 alpha(ixomin1:ixomax1) = 0.5d0 * dx_idims &
2724 * gravity_field(ixomin1:ixomax1, 1) / wb_t(ixomin1:ixomax1)
2727 ix_mid = (ixomin1 + ixomax1) / 2
2728 p_eq(ix_mid) = w(ix_mid,
p_)
2731 beta(ix_mid:ixomax1-1) = (1.0d0 + alpha(ix_mid:ixomax1-1)) &
2732 / (1.0d0 - alpha(ix_mid+1:ixomax1))
2733 do ix1 = ix_mid + 1, ixomax1
2734 p_eq(ix1) = p_eq(ix1 - 1) * beta(ix1 - 1)
2738 beta(ixomin1:ix_mid-1) = (1.0d0 - alpha(ixomin1+1:ix_mid)) &
2739 / (1.0d0 + alpha(ixomin1:ix_mid-1))
2740 do ix1 = ix_mid - 1, ixomin1, -1
2741 p_eq(ix1) = p_eq(ix1 + 1) * beta(ix1)
2745 w(ixomin1:ixomax1,
p_) = p_eq(ixomin1:ixomax1)
2746 w(ixomin1:ixomax1,
rho_) = p_eq(ixomin1:ixomax1) / wb_t(ixomin1:ixomax1)
2749 end subroutine hd_wb_prolong
2761 subroutine hd_wb_transform(ixI^L, ixO^L, idims, w, x, wb_phi, &
2766 integer,
intent(in) :: ixi^
l, ixo^
l, idims
2767 double precision,
intent(inout) :: w(ixi^s, 1:nw)
2768 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
2769 double precision,
intent(out) :: wb_phi(ixi^s)
2770 double precision,
intent(out) :: wb_phi_face(ixi^s)
2771 double precision,
intent(out) :: wb_t(ixi^s)
2773 double precision :: gravity_field(ixi^s, 1:
ndim)
2774 double precision :: dx_idims
2775 double precision :: alpha(ixi^s), beta(ixi^s)
2781 wb_t(ixi^s) = w(ixi^s,
p_) / w(ixi^s,
rho_)
2795 alpha(iximin1:iximax1) = 0.5d0 * dx_idims &
2796 * gravity_field(iximin1:iximax1, idims) / wb_t(iximin1:iximax1)
2799 beta(iximin1:iximax1-1) = (1.0d0 + alpha(iximin1:iximax1-1)) &
2800 / (1.0d0 - alpha(iximin1+1:iximax1))
2803 wb_phi(iximin1) = w(iximin1,
p_)
2804 do ix1 = iximin1 + 1, iximax1
2805 wb_phi(ix1) = wb_phi(ix1 - 1) * beta(ix1 - 1)
2810 wb_phi_face(ixi^s) = wb_phi(ixi^s) * (1.0d0 + 0.5d0 * dx_idims * &
2811 gravity_field(ixi^s, idims) / wb_t(ixi^s))
2814 w(ixi^s,
rho_) = wb_t(ixi^s)
2815 w(ixi^s,
p_) = w(ixi^s,
p_) / wb_phi(ixi^s)
2817 end subroutine hd_wb_transform
2839 subroutine hd_wb_inverse(ixI^L, ixL^L, ixR^L, idims, wLp, wRp, w, &
2840 wb_phi, wb_phi_face, wb_T)
2843 integer,
intent(in) :: ixi^
l, ixl^
l, ixr^
l, idims
2844 double precision,
intent(inout) :: wlp(ixi^s, 1:nw), wrp(ixi^s, 1:nw)
2845 double precision,
intent(inout) :: w(ixi^s, 1:nw)
2846 double precision,
intent(in) :: wb_phi(ixi^s), wb_phi_face(ixi^s)
2847 double precision,
intent(in) :: wb_t(ixi^s)
2849 double precision :: t_shared(ixi^s)
2850 double precision :: t_face_l(ixi^s), t_face_r(ixi^s)
2851 double precision :: sigma(ixi^s), t_for_rhol(ixi^s), t_for_rhor(ixi^s)
2855 t_shared(iximin1:iximax1-1) = 0.5d0 * (wb_t(iximin1:iximax1-1) &
2856 + wb_t(iximin1+1:iximax1))
2857 t_shared(iximax1) = wb_t(iximax1)
2862 t_face_l(ixl^s) = wlp(ixl^s,
rho_)
2863 t_face_r(ixr^s) = wrp(ixr^s,
rho_)
2867 sigma(ixl^s) = dabs(t_face_l(ixl^s) - t_face_r(ixr^s)) &
2868 / (0.5d0 * (t_face_l(ixl^s) + t_face_r(ixr^s)) + smalldouble)
2869 sigma(ixl^s) = min(sigma(ixl^s), 1.0d0)
2872 t_for_rhol(ixl^s) = (1.d0 - sigma(ixl^s)) * t_shared(ixl^s) &
2873 + sigma(ixl^s) * t_face_l(ixl^s)
2874 t_for_rhor(ixr^s) = (1.d0 - sigma(ixl^s)) * t_shared(ixr^s) &
2875 + sigma(ixl^s) * t_face_r(ixr^s)
2878 wlp(ixl^s,
p_) = wlp(ixl^s,
p_) * wb_phi_face(ixl^s)
2879 wrp(ixr^s,
p_) = wrp(ixr^s,
p_) * wb_phi_face(ixr^s)
2882 wlp(ixl^s,
rho_) = wlp(ixl^s,
p_) / t_for_rhol(ixl^s)
2883 wrp(ixr^s,
rho_) = wrp(ixr^s,
p_) / t_for_rhor(ixr^s)
2886 w(ixi^s,
p_) = w(ixi^s,
p_) * wb_phi(ixi^s)
2887 w(ixi^s,
rho_) = w(ixi^s,
p_) / wb_t(ixi^s)
2889 end subroutine hd_wb_inverse
Calculate w(iw)=w(iw)+qdt*SOURCE[wCT,qtC,x] within ixO for all indices iw=iwmin......
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_init(phys_gamma)
Initialize the module.
subroutine cak_get_dt(wprim, ixil, ixol, dtnew, dxd, x)
Check time step for total radiation contribution.
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.
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)
integer, dimension(:, :), allocatable, public, protected dust_mom
Indices of the dust momentum densities.
integer, public, protected dust_n_species
The number of dust species.
subroutine, public dust_get_flux_prim(w, x, ixil, ixol, idim, f)
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_w(ixil, ixol, w, x, flag)
subroutine, public dust_check_params()
subroutine, public dust_get_cmax_prim(w, x, ixil, ixol, idim, cmax, cmin)
subroutine, public dust_get_dt(wprim, ixil, ixol, dtnew, dxd, x)
Get dt related to dust and gas stopping time (Laibe 2011)
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)
LTE (Saha-table) EoS kernels and finalise for the eos% family.
double precision function, public gamma1_from_nh_p(log_nh, log_p_nh)
Gamma_1 from pressure-indexed table: (log10 nH, log10 p/nH) -> Gamma_1. For 'entropy' the conversion ...
PI (partial-ionisation) ionisation-degree backend for the eos% family.
Equation of state for AMRVAC, handled through a single eos_container object.
Module for escape probability radiative cooling modification.
subroutine, public escape_prob_init(iw_colmass, escape_sym, escape_height)
Register escape probability parameters. Called during hd_phys_init (before mesh parameters are availa...
Module for flux conservation near refinement boundaries.
Module for flux limited diffusion (FLD)-approximation in Radiation-(Magneto)hydrodynamics simulations...
double precision, public fld_bisect_tol
Tolerance for bisection method for Energy sourceterms This is a percentage of the minimum of gas- and...
subroutine, public fld_radforce_get_dt(w, ixil, ixol, dtnew, dxd, x, fl)
get dt limit for radiation force and FLD explicit source additions NOTE: w is primitive on entry
double precision, public fld_diff_tol
Tolerance for radiative Energy diffusion.
character(len=40) fld_fluxlimiter
flux limiter choice
character(len=40) fld_opal_table
double precision, public fld_cnorm
double precision, public fld_kappa0
Opacity value when using constant opacity.
subroutine, public add_fld_rad_force(qdt, ixil, ixol, wct, wctprim, w, x, qsourcesplit, active, fl)
w[iw]=w[iw]+qdt*S[wCT,qtC,x] where S is the source based on wCT within ixO This subroutine handles th...
character(len=40) fld_opacity_law
switches for opacity
character(len=40) fld_interaction_method
Which method to find the root for the energy interaction polynomial.
subroutine, public fld_get_radpress(w, x, ixil, ixol, rad_pressure, fl)
Returns Radiation Pressure as tensor NOTE: w is primitive on entry.
logical fld_radforce_split
source split for energy interact and radforce:
logical fld_bound_diff
switches for using changed cmax-cmin bounds
subroutine, public fld_implicit_update(dtfactor, qdt, qtc, psa, psb, fl)
Calling all subroutines to perform the multigrid method Communicates rad_e and diff_coeff to multigri...
subroutine, public fld_evaluate_implicit(qtc, psa, fl)
inplace update of psa==>F_im(psa)
subroutine, public fld_init()
Initialising FLD-module Read opacities Initialise Multigrid and adimensionalise kappa.
integer nth_for_diff_mg
diffusion coefficient stencil control
Module with geometry-related routines (e.g., divergence, curl)
integer, parameter spherical
integer, parameter cylindrical
integer, parameter cartesian_expansion
subroutine gradient(q, ixil, ixol, idir, gradq, nth_in)
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.
double precision const_kappae
double precision arad_norm
Normalised radiation constant.
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
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.
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 phys_escape_prob
Use escape probability for radiative cooling modification.
double precision const_rad_a
Physical factors useful for radiation fld.
double precision cmax_global
global fastest wave speed needed in fd scheme and glm method
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 dt
global time step
integer ndir
Number of spatial dimensions (components) for vector variables.
double precision courantpar
The Courant (CFL) number used for the simulation.
double precision, dimension(:), allocatable, parameter d
logical slab
Cartesian geometry or not.
double precision const_sigmasb
integer nwauxio
Number of auxiliary variables that are only included in output.
double precision unit_velocity
Physical scaling factor for velocity.
double precision small_r_e
double precision c_norm
Normalised speed of light.
double precision unit_temperature
Physical scaling factor for temperature.
double precision unit_radflux
Physical scaling factor for radiation flux.
double precision, dimension(10) phys_trac_zone_splits
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.
double precision, dimension(:), allocatable w_refine_weight
Weights of variables used to calculate error for mesh refinement.
logical phys_trac
Use TRAC for MHD or 1D HD.
logical need_global_cmax
need global maximal wave speed
double precision, dimension(^nd) dxlevel
store unstretched cell size of current level
logical use_multigrid
Use multigrid (only available in 2D and 3D)
double precision small_density
integer max_blocks
The maximum number of grid blocks in a processor.
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 unit_erad
Physical scaling factor for radiation energy density.
Module for including gravity in (magneto)hydrodynamics simulations.
logical grav_split
source split or not
subroutine gravity_get_dt(wprim, 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_get_pthermal_plus_pradiation(w, x, ixil, ixol, pth_plus_prad)
calculates the sum of the gas pressure and max Prad tensor element NOTE: only for diagnostic purposes...
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
subroutine, public hd_get_temperature_from_etot(w, x, ixil, ixol, res)
Calculate temperature=p/rho when in e_ the total energy is stored.
logical, public, protected hd_fld_pradtensor
integer, public, protected hd_trac_type
logical, public, protected hd_particles
Whether particles module is added.
logical, public, protected hd_fip
Whether FIP passive scalar is enabled.
double precision, public hypertc_kappa
Thermal-conductivity prefactor in hyperbolic TC, set in hd_physical_units. Spitzer form: κ(T) = hyper...
logical, public, protected hd_radiation_fld
Whether radiation-gas interaction is handled using flux limited diffusion.
double precision, public, protected hd_htc_beta
Face-recipe heat-wave speed scaling: c_HTC,f = hd_htc_beta * c_max,f. Higher value -> closer to diffu...
double precision, public, protected hd_trac_delta
Johnston 2021 resolution parameter delta (default 0.5)
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)
integer, public, protected c
Indices of the momentum density for the form of better vectorization.
subroutine, public hd_get_csound2(w, x, ixil, ixol, csound2)
Calculate the square of the thermal sound speed csound2 within ixO^L. For conserved w: extracts pther...
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+)
double precision, public, protected hd_htc_gradt_floor
Gradient deadband: zero out the Spitzer face flux when abs(T_R - T_L) / max(T_L, T_R) < hd_htc_gradT_...
integer, public, protected te_
Indices of temperature.
integer, dimension(:), allocatable, public, protected mom
Indices of the momentum density.
subroutine, public hd_get_pradiation_from_prim(w, x, ixil, ixol, prad)
Calculate radiation pressure within ixO^L NOTE: w is primitive on entry here! NOTE: used in FLD modul...
double precision, public, protected hd_htc_hyp_diff
Hyperdiffusion coefficient applied to the cell-refreshed q at the end of each face-recipe substep....
logical, public, protected hd_hyperbolic_thermal_conduction
Whether hyperbolic thermal conduction (Cattaneo relaxation) is used. 1D only : the q-variable is trea...
double precision, public, protected h_ion_fr
Helium abundance over Hydrogen He_abundance is set in &eos_list and accessed via eosHe_abundance Ioni...
double precision function, dimension(ixo^s), public hd_kin_en(w, ixil, ixol, inv_rho)
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.
subroutine, public hd_get_csrad2(w, x, ixil, ixol, csound)
Calculate modified squared sound speed for FLD NOTE: only for diagnostic purposes,...
logical, public, protected hd_thermal_conduction
Whether thermal conduction is added.
integer, public, protected q_
Index of the hyperbolic-TC heat-flux variable (-1 if not present)
double precision, public hd_htc_validity_max_runtime
Running max of l_r,f / dx_f across all face-recipe calls since simulation start. Inspect post-hoc via...
double precision, public hd_adiab
gamma is set in &eos_list and accessed via eosgamma
subroutine, public hd_get_trad(w, x, ixil, ixol, trad)
Calculates radiation temperature.
subroutine, public hd_get_csrad2_prim(w, x, ixil, ixol, csound)
Calculate modified squared sound speed for FLD NOTE: w is primitive on entry here!...
integer, public, protected rho_
Whether plasma is partially ionized.
subroutine, public hd_handle_small_values(primitive, w, x, ixil, ixol, subname)
double precision, public, protected hd_htc_sat_alpha
Cowie-McKee saturation coefficient: q_sat = hd_htc_sat_alpha * rho * c_s^3. Standard convention is al...
double precision, public, protected hd_htc_pos_eta
Per-face energy-positivity safety fraction: |q_f^{n+1/2} dt A_f| <= hd_htc_pos_eta * min(e_int_L V_L,...
double precision, public, protected he_ion_fr
Ionization fraction of He He_ion_fr = (He2+ + He+)/(He2+ + He+ + He)
logical, public, protected hd_gravity
Whether gravity is added.
type(fld_fluid), allocatable, public fld_fl
Radiation fluid object (gas-EoS callbacks for FLD), wired in hd_link_eos.
double precision, public, protected hd_htc_kappa_override
Optional parfile override for hypertc_kappa (e.g. to match a constant-κ parabolic TC run for benchmar...
integer, public, protected hd_trac_nzones
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.
logical, public, protected hd_trac
Whether TRAC method is used.
integer, public, protected fip_
Index of the FIP passive scalar rho*fip in conserved form, fip in primitive form.
double precision, public, protected hd_htc_validity_warn
Validity-monitor threshold for l_r,f / Delta_x_f. Warn if any face exceeds this in a given block (pri...
integer, public, protected hd_n_tracer
Number of tracer species.
type(te_fluid), allocatable, public te_fl_hd
double precision, dimension(10), public, protected hd_trac_zone_splits
logical, public, protected hd_rotating_frame
Whether rotating frame is activated.
logical, public, protected hd_htc_sat
Whether saturation is considered for hyperbolic TC.
logical, public, protected hd_well_balanced
Whether well-balanced reconstruction is used (Kaeppeli & Mishra style)
integer, public, protected iw_colmass
Index into wextra for escape probability column mass.
integer, public, protected p_
Index of the gas pressure (-1 if not present) should equal e_.
integer, public, protected ne_
Index of the electron number density for LTE module.
subroutine, public hd_e_to_ei(ixil, ixol, w, x)
Transform total energy to internal energy.
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 findl(tpoint, lpoint, fl)
subroutine radiative_cooling_init(fl, read_params)
subroutine radiative_cooling_add_source(qdt, ixil, ixol, wct, wctprim, w, x, qsourcesplit, active, fl)
subroutine calc_l_extended(tpoint, lpoint, 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)
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(sub_get_heating), pointer usr_get_heating
procedure(set_surface), pointer usr_set_surface
procedure(phys_gravity), pointer usr_gravity
procedure(hd_pthermal), pointer usr_set_pthermal
procedure(set_wlr), pointer usr_set_wlr
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, public viscosity_get_dt(wprim, ixil, ixol, dtnew, dxd, x)
procedure(sub_add_source), pointer, public viscosity_add_source
subroutine, public viscosity_init(phys_wider_stencil)
Initialize the module.
Radiation fluid object: gas-EoS callbacks the FLD module needs, wired by the physics module at link t...