32 logical,
public,
protected ::
hd_dust = .false.
63 integer,
public,
protected ::
rho_
66 integer,
allocatable,
public,
protected ::
mom(:)
69 integer,
public,
protected :: ^
c&m^C_
72 integer,
allocatable,
public,
protected ::
tracer(:)
75 integer,
public,
protected ::
e_
78 integer,
public,
protected ::
p_
81 integer,
public,
protected ::
ne_
84 integer,
public,
protected ::
r_e
87 integer,
public,
protected ::
te_
90 integer,
public,
protected ::
fip_ = -1
93 logical,
public,
protected ::
hd_fip = .false.
99 integer,
public,
protected ::
q_
175 logical,
public,
protected ::
hd_trac = .false.
201 double precision,
public,
protected ::
h_ion_fr=1d0
211 double precision,
public,
protected ::
rr=1d0
242 subroutine hd_read_params(files)
244 character(len=*),
intent(in) :: files(:)
260 do n = 1,
size(files)
261 open(
unitpar, file=trim(files(n)), status=
"old")
262 read(
unitpar, hd_list,
end=111)
266 end subroutine hd_read_params
269 subroutine hd_write_info(fh)
271 integer,
intent(in) :: fh
272 integer,
parameter :: n_par = 1
273 double precision :: values(n_par)
274 character(len=name_len) :: names(n_par)
275 integer,
dimension(MPI_STATUS_SIZE) :: st
278 call mpi_file_write(fh, n_par, 1, mpi_integer, st, er)
281 values(1) = eos%gamma
282 call mpi_file_write(fh, values, n_par, mpi_double_precision, st, er)
283 call mpi_file_write(fh, names, n_par * name_len, mpi_character, st, er)
284 end subroutine hd_write_info
310 phys_internal_e = .false.
311 phys_gamma = eos%gamma
318 if(
mype==0)
write(*,*)
'WARNING: set hd_trac_type=1'
322 call mpistop(
"hd_trac_type=7 requires usr_get_heating to be set in mod_usr.t")
330 if(
mype==0)
write(*,*)
'WARNING: set hd_trac=F when ndim>=2'
338 if(
mype==0)
write(*,*)
'WARNING: set hd_thermal_conduction=F when hd_energy=F'
342 if(
mype==0)
write(*,*)
'WARNING: set hd_hyperbolic_thermal_conduction=F when hd_energy=F'
346 if(
mype==0)
write(*,*)
'WARNING: set hd_radiative_cooling=F when hd_energy=F'
351 allocate(start_indices(number_species),stop_indices(number_species))
359 mom(:) = var_set_momentum(
ndir)
364 e_ = var_set_energy()
387 if (eos%eos_type ==
'LTE')
then
390 else if (eos%eos_type ==
'PI')
then
401 write(*,*)
'Warning: CAK force addition together with FLD radiation'
406 write(*,*)
'Warning: Optically thin cooling together with FLD radiation'
410 call mpistop(
'implicit dust addition not compatible with FLD radiation')
413 call mpistop(
'using FLD implies the use of an energy equation, set hd_energy=T')
416 r_e = var_set_radiation_energy()
425 phys_implicit_update => hd_fld_implicit_update
426 phys_evaluate_implicit => hd_fld_evaluate_implicit
433 phys_get_dt => hd_get_dt
434 phys_get_cmax => hd_get_cmax
435 phys_get_tcutoff => hd_get_tcutoff
436 phys_get_cbounds => hd_get_cbounds
437 phys_get_flux => hd_get_flux
438 phys_add_source_geom => hd_add_source_geom
439 phys_add_source => hd_add_source
443 phys_get_v => hd_get_v
445 phys_write_info => hd_write_info
449 phys_get_ei => hd_get_ei
452 call hd_physical_units()
473 fip_ = var_set_fluxvar(
'rho_fip',
'fip', need_bc=.false.)
482 tracer(itr) = var_set_fluxvar(
"trc",
"trp", itr, need_bc=.false.)
489 stop_indices(1)=nwflux
500 iw_log_nh = var_set_wextra()
508 call mpistop(
"thermal conduction needs hd_energy=T")
516 if (iw_log_nh > 0)
then
546 call mpistop(
"radiative cooling needs hd_energy=T")
554 if (
rc_fl%rad_escape_prob)
then
565 te_fl_hd%get_pthermal=> eos%get_thermal_pressure
566 te_fl_hd%get_var_Rfactor => eos%get_Rfactor
571 phys_te_images => hd_te_images
583 if(
mype==0)
write(*,*)
'WARNING: set hd_well_balanced=F (requires hd_gravity=T)'
585 phys_wb_transform => hd_wb_transform
586 phys_wb_inverse => hd_wb_inverse
587 phys_wb_prolong => hd_wb_prolong
588 if (eos%ionE .and. eos%p2eint_method /=
'bisect' &
589 .and. eos%method /=
'entropy')
then
590 eos%p2eint_method =
'bisect'
591 if(
mype==0)
write(*,*)
'WB + ionE: forcing p2eint_method = bisect'
593 if (eos%method ==
'entropy' .and.
mype == 0)
then
594 write(*,*)
'WB + ionE + entropy: p2eint_method stays "table"'
595 write(*,*)
'eint_from_p_bisect uses legacy log_p table'
596 write(*,*)
'not built for entropy method'
598 if(
mype==0)
write(*,*)
'Well-balanced reconstruction enabled'
610 if (.not.
allocated(flux_type))
then
611 allocate(flux_type(
ndir, nw))
612 flux_type = flux_default
613 else if (any(shape(flux_type) /= [
ndir, nw]))
then
614 call mpistop(
"phys_check error: flux_type has wrong shape")
618 allocate(iw_vector(nvector))
619 iw_vector(1) =
mom(1) - 1
626 subroutine hd_te_images
630 case(
'EIvtiCCmpi',
'EIvtuCCmpi')
632 case(
'ESvtiCCmpi',
'ESvtuCCmpi')
634 case(
'SIvtiCCmpi',
'SIvtuCCmpi')
636 case(
'WIvtiCCmpi',
'WIvtuCCmpi')
639 call mpistop(
"Error in synthesize emission: Unknown convert_type")
641 end subroutine hd_te_images
646 subroutine hd_sts_set_source_tc_hd(ixI^L,ixO^L,w,x,wres,fix_conserve_at_step,my_dt,igrid,nflux)
650 integer,
intent(in) :: ixi^
l, ixo^
l, igrid, nflux
651 double precision,
intent(in) :: x(ixi^s,1:
ndim)
652 double precision,
intent(inout) :: wres(ixi^s,1:nw), w(ixi^s,1:nw)
653 double precision,
intent(in) :: my_dt
654 logical,
intent(in) :: fix_conserve_at_step
656 end subroutine hd_sts_set_source_tc_hd
658 function hd_get_tc_dt_hd(w,ixI^L,ixO^L,dx^D,x)
result(dtnew)
664 integer,
intent(in) :: ixi^
l, ixo^
l
665 double precision,
intent(in) ::
dx^
d, x(ixi^s,1:
ndim)
666 double precision,
intent(in) :: w(ixi^s,1:nw)
667 double precision :: dtnew
670 end function hd_get_tc_dt_hd
672 subroutine hd_tc_handle_small_e(w, x, ixI^L, ixO^L, step)
677 integer,
intent(in) :: ixi^
l,ixo^
l
678 double precision,
intent(inout) :: w(ixi^s,1:nw)
679 double precision,
intent(in) :: x(ixi^s,1:
ndim)
680 integer,
intent(in) :: step
683 logical :: flag(ixi^s,1:nw)
684 character(len=140) :: error_msg
688 if(any(flag(ixo^s,
e_)))
then
696 w(ixo^s,
e_)=w(ixo^s,
e_)*(eos%gamma - 1.0d0)
698 w(ixo^s, iw_mom(idir)) = w(ixo^s, iw_mom(idir))/w(ixo^s,
rho_)
700 write(error_msg,
"(a,i3)")
"Thermal conduction step ", step
704 end subroutine hd_tc_handle_small_e
707 subroutine tc_params_read_hd(fl)
709 type(tc_fluid),
intent(inout) :: fl
711 logical :: tc_saturate=.false.
712 logical :: tc_patch_eint=.false.
713 double precision :: tc_k_para=0d0
714 double precision :: trac_t_floor=1.d4
716 namelist /tc_list/ tc_saturate, tc_k_para, trac_t_floor, tc_patch_eint
720 read(
unitpar, tc_list,
end=111)
723 fl%tc_saturate = tc_saturate
724 fl%tc_patch_eint = tc_patch_eint
725 fl%tc_k_para = tc_k_para
726 fl%trac_T_floor = trac_t_floor / unit_temperature
728 end subroutine tc_params_read_hd
742 subroutine rc_params_read(fl)
746 type(rc_fluid),
intent(inout) :: fl
749 integer :: ncool = 4000
752 character(len=std_len) :: coolcurve=
'JCcorona'
755 logical :: tfix=.false.
761 logical :: rc_split=.false.
764 double precision :: cfrac=0.1d0
767 logical :: rad_modify=.false.
769 logical :: rad_modify_sym=.false.
771 double precision :: rad_cut_hgt=0.0d0
773 double precision :: rad_cut_dey=0.15d0
775 double precision :: rad_taper_rho=
bigdouble
777 double precision :: rad_taper_dey=0.0d0
780 double precision :: rad_suppress_temp=0.0d0
782 logical :: rad_escape_prob=.false.
784 double precision :: rad_kappa_eff=0.0d0
786 double precision :: rad_kappa_tcutoff=0.0d0
788 double precision :: rad_kappa_alpha=4.0d0
790 character(len=10) :: rad_escape_type=
'slab'
792 double precision :: rad_escape_tau_cutoff=0.0d0
794 double precision :: rad_escape_height=0.0d0
796 character(len=8) :: rc_y_mod_quadrature=
'boole'
797 integer :: rc_y_mod_n_sub=16
799 logical :: rad_damp=.false.
800 double precision :: rad_damp_height=0.5d0
801 double precision :: rad_damp_scale=0.15d0
803 logical :: rad_newton=.false.
804 double precision :: rad_newton_trad=0.006d0
805 double precision :: rad_newton_rhosurf=1.d4
806 double precision :: rad_newton_pthick=25.d0
808 namelist /rc_list/ coolcurve, ncool, cfrac, tlow, tfix, rc_split, &
809 rad_modify, rad_modify_sym, rad_suppress_temp, &
810 rad_cut_hgt, rad_cut_dey, rad_taper_rho, rad_taper_dey, &
811 rad_escape_prob, rad_kappa_eff, rad_kappa_tcutoff, rad_kappa_alpha, &
812 rad_escape_type, rad_escape_tau_cutoff, rad_escape_height, &
813 rc_y_mod_quadrature, rc_y_mod_n_sub, &
814 rad_damp, rad_damp_height, rad_damp_scale, &
815 rad_newton, rad_newton_trad, rad_newton_rhosurf, rad_newton_pthick
819 read(
unitpar, rc_list,
end=111)
824 fl%coolcurve=coolcurve
829 fl%rad_modify=rad_modify
830 fl%rad_modify_sym=rad_modify_sym
831 fl%rad_suppress_temp=rad_suppress_temp
832 fl%rad_cut_hgt=rad_cut_hgt
833 fl%rad_cut_dey=rad_cut_dey
834 fl%rad_taper_rho=rad_taper_rho
835 fl%rad_taper_dey=rad_taper_dey
836 fl%rad_escape_prob=rad_escape_prob
837 fl%rad_kappa_eff=rad_kappa_eff
838 fl%rad_kappa_Tcutoff=rad_kappa_tcutoff/unit_temperature
839 fl%rad_kappa_alpha=rad_kappa_alpha
840 fl%rad_escape_type=rad_escape_type
841 fl%rad_escape_tau_cutoff=rad_escape_tau_cutoff
842 fl%rad_escape_height=rad_escape_height/unit_length
843 fl%Y_mod_quadrature=rc_y_mod_quadrature
844 fl%Y_mod_N_sub=rc_y_mod_n_sub
845 fl%rad_damp = rad_damp
846 fl%rad_damp_height = rad_damp_height
847 fl%rad_damp_scale = rad_damp_scale
848 fl%rad_newton = rad_newton
849 fl%rad_newton_trad = rad_newton_trad
850 fl%rad_newton_rhosurf = rad_newton_rhosurf
851 fl%rad_newton_pthick = rad_newton_pthick
852 end subroutine rc_params_read
860 use mod_particles,
only: npayload,nusrpayload,ngridvars,num_particles,physics_type_particles
863 double precision :: a,b,xfrac,yfrac
871 if (eos%gamma <= 0.0d0)
call mpistop (
"Error: eos%gamma <= 0")
872 if (
hd_adiab < 0.0d0)
call mpistop (
"Error: hd_adiab < 0")
875 if (eos%gamma <= 0.0d0 .or. eos%gamma == 1.0d0) &
876 call mpistop (
"Error: eos%gamma <= 0 or eos%gamma == 1.0")
888 call mpistop(
'select IMEX scheme for implicit dust update')
900 call mpistop(
"hd_hyperbolic_thermal_conduction is implemented for ndim=1 only;" // &
901 " for ndim>1 use mod_ffhd or parabolic mod_thermal_conduction.")
904 call mpistop(
"hd_hyperbolic_thermal_conduction and hd_thermal_conduction are mutually exclusive;" // &
905 " choose one TC implementation.")
910 call mpistop(
'select IMEX scheme for FLD radiation use')
913 call phys_set_mg_bounds()
915 if(.not.
fld_no_mg)
call mpistop(
'multigrid must have BCs for IMEX and FLD radiation use')
918 write(*,*)
'==FLD SETUP======================'
919 write(*,*)
'Using FLD with settings:'
924 write(*,*)
'Using FLD with settings: fld_kappa0=',
fld_kappa0
925 write(*,*)
'Using FLD with settings: fld_opal_table=',
fld_opal_table
927 write(*,*)
'Using FLD with settings: fld_bisect_tol=',
fld_bisect_tol
928 write(*,*)
'Using FLD with settings: fld_diff_tol=',
fld_diff_tol
932 print *,
'NORMALIZED arad_norm=',
arad_norm
933 print *,
'NORMALIZED c_norm=',
c_norm
940 print *,
'physical fld_kappa (in cgs or SI) =',
fld_kappa0
943 write(*,*)
'===FLD SETUP====================='
947 write(*,*)
'====HD run with settings===================='
948 write(*,*)
'Using mod_hd_phys with settings:'
950 write(*,*)
'Dimensionality :',
ndim
951 write(*,*)
'vector components:',
ndir
953 write(*,*)
'number of variables nw=',nw
954 write(*,*)
' start index iwstart=',iwstart
955 write(*,*)
'number of vector variables=',nvector
956 write(*,*)
'number of stagger variables nws=',nws
957 write(*,*)
'number of variables with BCs=',nwgc
958 write(*,*)
'number of vars with fluxes=',nwflux
959 write(*,*)
'number of vars with flux + BC=',nwfluxbc
960 write(*,*)
'number of auxiliary variables=',nwaux
961 write(*,*)
'number of extra vars without flux=',nwextra
962 write(*,*)
'number of extra vars for wextra=',nw_extra
963 write(*,*)
'number of auxiliary I/O variables=',
nwauxio
978 write(*,*)
'*****Using particles: npayload,ngridvars :', npayload,ngridvars
979 write(*,*)
'*****Using particles: nusrpayload :', nusrpayload
980 write(*,*)
'*****Using particles: num_particles :', num_particles
981 write(*,*)
'*****Using particles: physics_type_particles=',physics_type_particles
984 write(*,*)
'number due to phys_wider_stencil=',phys_wider_stencil
985 write(*,*)
'==========================================='
986 print *,
'========EOS and UNITS==========='
988 print *,
'gamma=',eos%gamma
989 print *,
'He_abundance =',eos%He_abundance
991 print *,
'========EOS and UNITS==========='
1007 print *,
' compare this to ',mp_si*(1.d0+4.d0*eos%He_abundance)
1009 print *,
' compare this to ',mp_cgs*(1.d0+4.d0*eos%He_abundance)
1013 print *,
' compare this to ',kb_si*(2.d0+3.d0*eos%He_abundance)
1017 print *,
' compare this to ',kb_cgs*(2.d0+3.d0*eos%He_abundance)
1021 if(eos%eos_type /=
'LTE')
then
1022 print *,
'mean molecular weight mu is =',a/b,
' = ', (1.d0+4.d0*eos%He_abundance)/(2.d0+3.d0*eos%He_abundance)
1024 yfrac=4.d0*eos%He_abundance/(1.d0+4.d0*eos%He_abundance)
1025 print *,
'mass fraction hydrogen X is =',1/a,
' and this equals ', 1.d0/(1.d0+4.d0*eos%He_abundance)
1026 print *,
'mass fraction helium Y is =',yfrac
1027 print *,
' check that 1/mu', b/a,
' is equal to 2X+3Y/4=',2.d0*xfrac+3.d0*yfrac/4.d0
1028 print *,
' ratio n_e/n_p=',1.d0+2.0d0*eos%He_abundance
1030 print *,
'========UNITS==========='
1035 subroutine hd_physical_units
1037 double precision :: mp,kb,c_lightspeed,xfrac,sigma_telectron
1038 double precision :: a,b
1045 sigma_telectron=sigma_te_si
1050 c_lightspeed=const_c
1051 sigma_telectron=sigma_te_cgs
1056 if (eos%eos_type ==
'LTE')
then
1060 eos%nH2rhoFactor = 1d0+4d0*eos%He_abundance
1061 rr=(2d0+3d0*eos%He_abundance) / (1d0+4d0*eos%He_abundance)
1062 xfrac=1.d0/(1.d0+4.d0*eos%He_abundance)
1066 a=1d0+4d0*eos%He_abundance
1067 if(eos%eos_type==
'PI')
then
1070 b=2d0+3d0*eos%He_abundance
1156 end subroutine hd_physical_units
1163 logical,
intent(in) :: primitive
1164 integer,
intent(in) :: ixi^
l, ixo^
l
1165 double precision,
intent(in) :: w(ixi^s, nw)
1166 logical,
intent(inout) :: flag(ixi^s,1:nw)
1168 double precision :: tmp(ixi^s)
1169 double precision :: x(ixi^s, 1:
ndim)
1180 tmp(ixo^s)=(eos%gamma-1.0d0)*(w(ixo^s,
e_)-&
1181 half*(^
c&w(ixo^s,
m^
c_)**2+)/w(ixo^s,
rho_))
1195 subroutine hd_bound_fip(primitive, ixI^L, ixO^L, w)
1197 logical,
intent(in) :: primitive
1198 integer,
intent(in) :: ixi^
l, ixo^
l
1199 double precision,
intent(inout) :: w(ixi^s,1:nw)
1201 double precision :: rho_safe(ixi^s), fip_prim(ixi^s)
1209 fip_prim(ixo^s) = w(ixo^s,
fip_) / rho_safe(ixo^s)
1210 fip_prim(ixo^s) = min(
maxfip, max(
minfip, fip_prim(ixo^s)))
1211 w(ixo^s,
fip_) = rho_safe(ixo^s) * fip_prim(ixo^s)
1213 end subroutine hd_bound_fip
1278 integer,
intent(in) :: ixi^
l, ixo^
l
1279 double precision,
intent(inout) :: w(ixi^s, nw)
1280 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1283 w(ixo^s,
e_)=w(ixo^s,
e_)+half*(^
c&w(ixo^s,
m^
c_)**2+)/w(ixo^s,
rho_)
1290 integer,
intent(in) :: ixi^
l, ixo^
l
1291 double precision,
intent(inout) :: w(ixi^s, nw)
1292 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1295 w(ixo^s,
e_)=w(ixo^s,
e_)-half*(^
c&w(ixo^s,
m^
c_)**2+)/w(ixo^s,
rho_)
1302 subroutine hd_e_to_ei_and_cache_log_nh(ixI^L,ixO^L,w,x)
1304 integer,
intent(in) :: ixi^
l, ixo^
l
1305 double precision,
intent(inout) :: w(ixi^s, nw)
1306 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1309 block%wextra(ixo^s, iw_log_nh) = dlog10(w(ixo^s,
rho_) / eos%nH2rhoFactor)
1310 end subroutine hd_e_to_ei_and_cache_log_nh
1313 function hd_get_ei(w, ixI^L, ixO^L)
result(ei)
1315 integer,
intent(in) :: ixi^
l, ixo^
l
1316 double precision,
intent(in) :: w(ixi^s, nw)
1317 double precision :: ei(ixo^s)
1320 ei(ixo^s) = w(ixo^s,
e_) - half*(^
c&w(ixo^s,
m^
c_)**2+)/w(ixo^s,
rho_)
1321 end function hd_get_ei
1324 subroutine hd_get_v_idim(w, x, ixI^L, ixO^L, idim, v)
1326 integer,
intent(in) :: ixi^
l, ixo^
l, idim
1327 double precision,
intent(in) :: w(ixi^s, nw), x(ixi^s, 1:
ndim)
1328 double precision,
intent(out) :: v(ixi^s)
1330 v(ixo^s) = w(ixo^s,
mom(idim)) / w(ixo^s,
rho_)
1331 end subroutine hd_get_v_idim
1334 subroutine hd_get_v(w,x,ixI^L,ixO^L,v)
1337 integer,
intent(in) :: ixi^
l, ixo^
l
1338 double precision,
intent(in) :: w(ixi^s,nw), x(ixi^s,1:^nd)
1339 double precision,
intent(out) :: v(ixi^s,1:
ndir)
1344 v(ixo^s,idir) = w(ixo^s,
mom(idir)) / w(ixo^s,
rho_)
1347 end subroutine hd_get_v
1350 subroutine hd_get_cmax(w, x, ixI^L, ixO^L, idim, cmax)
1355 integer,
intent(in) :: ixi^
l, ixo^
l, idim
1357 double precision,
intent(in) :: w(ixi^s, nw), x(ixi^s, 1:
ndim)
1358 double precision,
intent(inout) :: cmax(ixi^s)
1359 double precision :: csound2(ixi^s)
1362 call eos%get_csound2(w, x, ixi^
l, ixo^
l, csound2)
1363 cmax(ixo^s)=dabs(w(ixo^s,
mom(idim)))+dsqrt(csound2(ixo^s))
1370 cmax(ixo^s)=dabs(w(ixo^s,
mom(idim)))+dsqrt(eos%gamma*cmax(ixo^s)/w(ixo^s,
rho_))
1376 end subroutine hd_get_cmax
1379 subroutine hd_get_tcutoff(ixI^L,ixO^L,w,x,tco_local,Tmax_local)
1384 integer,
intent(in) :: ixi^
l,ixo^
l
1385 double precision,
intent(in) :: x(ixi^s,1:
ndim)
1387 double precision,
intent(inout) :: w(ixi^s,1:nw)
1388 double precision,
intent(out) :: tco_local, tmax_local
1390 double precision,
parameter :: trac_delta=0.25d0
1391 double precision :: tmp1(ixi^s),te(ixi^s),lts(ixi^s), r(ixi^s)
1392 double precision :: ltrc,ltrp
1393 integer :: jxo^
l,hxo^
l
1394 integer :: jxp^
l,hxp^
l,ixp^
l
1395 logical :: lrlt(ixi^s)
1397 double precision :: dtdx, l_t, a_coeff, l1, cooling, net_cool
1398 double precision :: kappa_par, disc, kappa_trac, kappa_eff, tcoff_eff
1399 double precision :: dx_over_delta, v_abs, v_thresh
1400 double precision :: q_heat(ixi^s), ne(ixi^s), nh_arr(ixi^s)
1404 call eos%get_Rfactor(w,x,ixi^
l,ixi^
l,r)
1405 te(ixi^s)=w(ixi^s,
p_)/(r(ixi^s)*w(ixi^s,
rho_))
1407 if (eos%eos_type ==
'LTE')
then
1408 te(ixi^s) = w(ixi^s,
te_)
1412 tmax_local=maxval(te(ixo^s))
1419 lts(ixo^s)=0.5d0*dabs(te(jxo^s)-te(hxo^s))/te(ixo^s)
1421 where(lts(ixo^s) > trac_delta)
1424 if(any(lrlt(ixo^s)))
then
1425 tco_local=maxval(te(ixo^s), mask=lrlt(ixo^s))
1436 lts(ixp^s)=0.5d0*abs(te(jxp^s)-te(hxp^s))/te(ixp^s)
1437 lts(ixp^s)=max(one, (exp(lts(ixp^s))/ltrc)**ltrp)
1439 lts(ixo^s)=0.25d0*(lts(jxo^s)+two*lts(ixo^s)+lts(hxo^s))
1440 block%wextra(ixo^s,
tcoff_)=te(ixo^s)*lts(ixo^s)**0.4d0
1445 block%wextra(ixomin1-1,
tcoff_)=te(ixomin1-1)*lts(ixomin1-1)**0.4d0
1446 block%wextra(ixomax1+1,
tcoff_)=te(ixomax1+1)*lts(ixomax1+1)**0.4d0
1456 call eos%get_ne_nH(ixi^
l, ixo^
l, w, ne, nh_arr)
1462 do ix1=ixomin1,ixomax1
1464 dtdx = abs(te(ix1+1) - te(ix1-1)) / (2.d0 *
dxlevel(1))
1465 if(dtdx < smalldouble)
then
1470 l_t = te(ix1) / dtdx
1475 v_abs = abs(w(ix1,m1_))
1477 a_coeff = 2.5d0 * w(ix1,
p_) * max(v_abs - v_thresh, 0.d0) / te(ix1)
1481 cooling = ne(ix1) * nh_arr(ix1) * l1
1484 net_cool = abs(cooling - q_heat(ix1))
1487 kappa_par =
tc_fl%tc_k_para * te(ix1)**2.5d0
1490 disc = a_coeff**2 + 4.d0 *
tc_fl%tc_k_para * te(ix1)**1.5d0 * net_cool
1492 if(l_t <= 2.d0 * dx_over_delta)
then
1494 kappa_trac = (a_coeff + dsqrt(disc)) / (2.d0 / dx_over_delta)
1497 kappa_trac = dsqrt(4.d0 *
tc_fl%tc_k_para * te(ix1)**1.5d0 * net_cool) &
1498 / (2.d0 / dx_over_delta)
1502 kappa_eff = max(kappa_trac, kappa_par)
1505 tcoff_eff = (kappa_eff /
tc_fl%tc_k_para)**0.4d0
1508 block%wextra(ix1,
tcoff_) = max(te(ix1), tcoff_eff)
1517 call mpistop(
"hd_trac_type not allowed for 1D simulation")
1520 end subroutine hd_get_tcutoff
1523 subroutine hd_get_cbounds(wLC, wRC, wLp, wRp, x, ixI^L, ixO^L, idim,Hspeed,cmax, cmin)
1528 integer,
intent(in) :: ixi^
l, ixo^
l, idim
1530 double precision,
intent(in) :: wlc(ixi^s,
nw), wrc(ixi^s,
nw)
1532 double precision,
intent(in) :: wlp(ixi^s,
nw), wrp(ixi^s,
nw)
1533 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1535 double precision,
intent(inout),
optional :: cmin(ixi^s,1:
number_species)
1538 double precision :: wmean(ixi^s,
nw)
1539 double precision,
dimension(ixI^S) :: umean, dmean, csoundl, csoundr, tmp1,tmp2,tmp3
1547 tmp1(ixo^s)=dsqrt(wlp(ixo^s,
rho_))
1548 tmp2(ixo^s)=dsqrt(wrp(ixo^s,
rho_))
1549 tmp3(ixo^s)=1.d0/(tmp1(ixo^s)+tmp2(ixo^s))
1550 umean(ixo^s)=(wlp(ixo^s,
mom(idim))*tmp1(ixo^s)+wrp(ixo^s,
mom(idim))*tmp2(ixo^s))*tmp3(ixo^s)
1553 call eos%get_csound2(wlp, x, ixi^
l, ixo^
l, csoundl)
1554 call eos%get_csound2(wrp, x, ixi^
l, ixo^
l, csoundr)
1561 dmean(ixo^s) = (tmp1(ixo^s)*csoundl(ixo^s)+tmp2(ixo^s)*csoundr(ixo^s)) * &
1562 tmp3(ixo^s) + 0.5d0*tmp1(ixo^s)*tmp2(ixo^s)*tmp3(ixo^s)**2 * &
1563 (wrp(ixo^s,
mom(idim))-wlp(ixo^s,
mom(idim)))**2
1565 dmean(ixo^s)=dsqrt(dmean(ixo^s))
1566 if(
present(cmin))
then
1567 cmin(ixo^s,1)=umean(ixo^s)-dmean(ixo^s)
1568 cmax(ixo^s,1)=umean(ixo^s)+dmean(ixo^s)
1570 {
do ix^db=ixomin^db,ixomax^db\}
1571 cmin(ix^
d,1)=sign(one,cmin(ix^
d,1))*max(abs(cmin(ix^
d,1)),hspeed(ix^
d,1))
1572 cmax(ix^
d,1)=sign(one,cmax(ix^
d,1))*max(abs(cmax(ix^
d,1)),hspeed(ix^
d,1))
1576 cmax(ixo^s,1)=dabs(umean(ixo^s))+dmean(ixo^s)
1580 wmean(ixo^s,1:nwflux)=0.5d0*(wlc(ixo^s,1:nwflux)+wrc(ixo^s,1:nwflux))
1581 call dust_get_cmax(wmean, x, ixi^l, ixo^l, idim, cmax, cmin)
1592 wmean(ixo^s,1:nwflux)=0.5d0*(wlc(ixo^s,1:nwflux)+wrc(ixo^s,1:nwflux))
1593 tmp1(ixo^s)=wmean(ixo^s,
mom(idim))/wmean(ixo^s,
rho_)
1596 csoundr(ixo^s) = dsqrt(csoundr(ixo^s))
1598 if(
present(cmin))
then
1599 cmax(ixo^s,1)=max(tmp1(ixo^s)+csoundr(ixo^s),zero)
1600 cmin(ixo^s,1)=min(tmp1(ixo^s)-csoundr(ixo^s),zero)
1601 if(h_correction)
then
1602 {
do ix^db=ixomin^db,ixomax^db\}
1603 cmin(ix^d,1)=sign(one,cmin(ix^d,1))*max(abs(cmin(ix^d,1)),hspeed(ix^d,1))
1604 cmax(ix^d,1)=sign(one,cmax(ix^d,1))*max(abs(cmax(ix^d,1)),hspeed(ix^d,1))
1608 cmax(ixo^s,1)=dabs(tmp1(ixo^s))+csoundr(ixo^s)
1612 call dust_get_cmax(wmean, x, ixi^l, ixo^l, idim, cmax, cmin)
1617 call eos%get_csound2(wlp, x, ixi^l, ixo^l, csoundl)
1618 call eos%get_csound2(wrp, x, ixi^l, ixo^l, csoundr)
1624 csoundl(ixo^s)=max(dsqrt(csoundl(ixo^s)),dsqrt(csoundr(ixo^s)))
1625 if(
present(cmin))
then
1626 cmin(ixo^s,1)=min(wlp(ixo^s,
mom(idim)),wrp(ixo^s,
mom(idim)))-csoundl(ixo^s)
1627 cmax(ixo^s,1)=max(wlp(ixo^s,
mom(idim)),wrp(ixo^s,
mom(idim)))+csoundl(ixo^s)
1628 if(h_correction)
then
1629 {
do ix^db=ixomin^db,ixomax^db\}
1630 cmin(ix^d,1)=sign(one,cmin(ix^d,1))*max(abs(cmin(ix^d,1)),hspeed(ix^d,1))
1631 cmax(ix^d,1)=sign(one,cmax(ix^d,1))*max(abs(cmax(ix^d,1)),hspeed(ix^d,1))
1635 cmax(ixo^s,1)=max(wlp(ixo^s,
mom(idim)),wrp(ixo^s,
mom(idim)))+csoundl(ixo^s)
1638 wmean(ixo^s,1:nwflux)=0.5d0*(wlc(ixo^s,1:nwflux)+wrc(ixo^s,1:nwflux))
1639 call dust_get_cmax(wmean, x, ixi^l, ixo^l, idim, cmax, cmin)
1648 call eos%get_csound2(wlp, x, ixi^l, ixo^l, csoundl)
1649 call eos%get_csound2(wrp, x, ixi^l, ixo^l, csoundr)
1654 csoundl(ixo^s) = dsqrt(csoundl(ixo^s))
1655 csoundr(ixo^s) = dsqrt(csoundr(ixo^s))
1656 if(
present(cmin))
then
1657 {
do ix^db=ixomin^db,ixomax^db\}
1660 tmp1(ix^d) = 0.25d0*(wlp(ix^d,
rho_)+wrp(ix^d,
rho_)) &
1661 *(csoundl(ix^d)+csoundr(ix^d))
1663 tmp2(ix^d) = max(zero, 0.5d0*(wlp(ix^d,
e_)+wrp(ix^d,
e_)) &
1664 + 0.5d0*(wlp(ix^d,
mom(idim))-wrp(ix^d,
mom(idim))) &
1667 if(tmp2(ix^d) > wlp(ix^d,
e_) .and. wlp(ix^d,
e_) > zero)
then
1669 tmp3(ix^d) = csoundl(ix^d)**2*wlp(ix^d,
rho_)/wlp(ix^d,
e_)
1670 dmean(ix^d) = dsqrt(1.0d0 + (tmp3(ix^d)+1.0d0) &
1671 /(2.0d0*tmp3(ix^d)) &
1672 *(tmp2(ix^d)/wlp(ix^d,
e_) - 1.0d0))
1677 cmin(ix^d,1) = wlp(ix^d,
mom(idim)) - csoundl(ix^d)*dmean(ix^d)
1679 if(tmp2(ix^d) > wrp(ix^d,
e_) .and. wrp(ix^d,
e_) > zero)
then
1681 tmp3(ix^d) = csoundr(ix^d)**2*wrp(ix^d,
rho_)/wrp(ix^d,
e_)
1682 dmean(ix^d) = dsqrt(1.0d0 + (tmp3(ix^d)+1.0d0) &
1683 /(2.0d0*tmp3(ix^d)) &
1684 *(tmp2(ix^d)/wrp(ix^d,
e_) - 1.0d0))
1689 cmax(ix^d,1) = wrp(ix^d,
mom(idim)) + csoundr(ix^d)*dmean(ix^d)
1691 if(h_correction)
then
1692 {
do ix^db=ixomin^db,ixomax^db\}
1693 cmin(ix^d,1)=sign(one,cmin(ix^d,1))*max(abs(cmin(ix^d,1)),hspeed(ix^d,1))
1694 cmax(ix^d,1)=sign(one,cmax(ix^d,1))*max(abs(cmax(ix^d,1)),hspeed(ix^d,1))
1698 {
do ix^db=ixomin^db,ixomax^db\}
1699 tmp1(ix^d) = 0.25d0*(wlp(ix^d,
rho_)+wrp(ix^d,
rho_)) &
1700 *(csoundl(ix^d)+csoundr(ix^d))
1701 tmp2(ix^d) = max(zero, 0.5d0*(wlp(ix^d,
e_)+wrp(ix^d,
e_)) &
1702 + 0.5d0*(wlp(ix^d,
mom(idim))-wrp(ix^d,
mom(idim))) &
1704 if(tmp2(ix^d) > wlp(ix^d,
e_) .and. wlp(ix^d,
e_) > zero)
then
1705 tmp3(ix^d) = csoundl(ix^d)**2*wlp(ix^d,
rho_)/wlp(ix^d,
e_)
1706 dmean(ix^d) = dsqrt(1.0d0 + (tmp3(ix^d)+1.0d0) &
1707 /(2.0d0*tmp3(ix^d)) &
1708 *(tmp2(ix^d)/wlp(ix^d,
e_) - 1.0d0))
1712 umean(ix^d) = dabs(wlp(ix^d,
mom(idim)) &
1713 - csoundl(ix^d)*dmean(ix^d))
1714 if(tmp2(ix^d) > wrp(ix^d,
e_) .and. wrp(ix^d,
e_) > zero)
then
1715 tmp3(ix^d) = csoundr(ix^d)**2*wrp(ix^d,
rho_)/wrp(ix^d,
e_)
1716 dmean(ix^d) = dsqrt(1.0d0 + (tmp3(ix^d)+1.0d0) &
1717 /(2.0d0*tmp3(ix^d)) &
1718 *(tmp2(ix^d)/wrp(ix^d,
e_) - 1.0d0))
1722 cmax(ix^d,1) = max(umean(ix^d), &
1723 wrp(ix^d,
mom(idim))+csoundr(ix^d)*dmean(ix^d))
1727 wmean(ixo^s,1:nwflux)=0.5d0*(wlc(ixo^s,1:nwflux)+wrc(ixo^s,1:nwflux))
1728 call dust_get_cmax(wmean, x, ixi^l, ixo^l, idim, cmax, cmin)
1732 end subroutine hd_get_cbounds
1743 integer,
intent(in) :: ixi^
l, ixo^
l
1744 double precision,
intent(in) :: w(ixi^s,nw)
1745 double precision,
intent(in) :: x(ixi^s,1:
ndim)
1746 double precision,
intent(out) :: csound2(ixi^s)
1747 double precision :: pthermal(ixi^s)
1748 double precision :: nh_val, g1
1749 double precision :: local_t0
1753 call eos%get_thermal_pressure(w, x, ixi^
l, ixo^
l, pthermal)
1756 local_t0 = mpi_wtime()
1757 {
do ix^db=ixomin^db,ixomax^db\}
1758 nh_val = w(ix^
d,
rho_) / eos%nH2rhoFactor
1760 csound2(ix^
d) = g1 * pthermal(ix^
d) / w(ix^
d,
rho_)
1762 timeeos_csound=timeeos_csound+(mpi_wtime()-local_t0)
1764 csound2(ixo^s) = eos%gamma * pthermal(ixo^s) / w(ixo^s,
rho_)
1775 integer,
intent(in) :: ixi^
l, ixo^
l
1776 double precision,
intent(in) :: w(ixi^s, nw), x(ixi^s,1:
ndim)
1777 double precision,
intent(out):: csound(ixi^s)
1779 double precision :: wprim(ixi^s, nw)
1781 wprim(ixi^s,1:nw)=w(ixi^s,1:nw)
1782 call eos%to_primitive(ixi^
l,ixo^
l,wprim,x)
1793 integer,
intent(in) :: ixi^
l, ixo^
l
1794 double precision,
intent(in) :: w(ixi^s, nw), x(ixi^s,1:
ndim)
1795 double precision,
intent(out):: csound(ixi^s)
1798 double precision :: inv_rho
1799 double precision :: prad_tensor(ixi^s, 1:
ndim, 1:
ndim)
1800 double precision :: prad_max(ixi^s)
1804 {
do ix^db=ixomin^db,ixomax^db \}
1805 inv_rho=1.d0/w(ix^
d,
rho_)
1806 prad_max(ix^
d) = maxval(prad_tensor(ix^
d,:,:))
1807 csound(ix^
d)=(eos%gamma*w(ix^
d,
p_)+prad_max(ix^
d))*inv_rho
1810 if(minval(csound(ixo^s))<smalldouble)
then
1811 print *,
'issue with squared speed and rad pressure'
1812 print *,minval(csound(ixo^s))
1813 print *,minval(prad_max(ixo^s))
1814 call mpistop(
"negative squared speed in get_csrad2 for dt")
1825 integer,
intent(in) :: ixi^
l, ixo^
l
1826 double precision,
intent(in) :: w(ixi^s, 1:nw)
1827 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1828 double precision,
intent(out):: prad(ixi^s, 1:
ndim, 1:
ndim)
1838 integer,
intent(in) :: ixi^
l, ixo^
l
1839 double precision,
intent(in) :: w(ixi^s, 1:nw)
1840 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1841 double precision,
intent(out):: pth_plus_prad(ixi^s)
1843 double precision :: wprim(ixi^s, 1:nw)
1844 double precision :: prad_tensor(ixi^s, 1:
ndim, 1:
ndim)
1845 double precision :: prad_max(ixi^s)
1848 wprim(ixi^s,1:nw)=w(ixi^s,1:nw)
1849 call eos%to_primitive(ixi^
l,ixo^
l,wprim,x)
1851 {
do ix^
d = ixomin^
d,ixomax^
d\}
1852 prad_max(ix^
d) = maxval(prad_tensor(ix^
d,:,:))
1854 pth_plus_prad(ixo^s) = wprim(ixo^s,
p_) + prad_max(ixo^s)
1862 integer,
intent(in) :: ixi^
l, ixo^
l
1863 double precision,
intent(in) :: w(ixi^s, 1:nw)
1864 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1865 double precision,
intent(out):: trad(ixi^s)
1874 integer,
intent(in) :: ixi^
l, ixo^
l
1875 double precision,
intent(in) :: w(ixi^s, 1:nw)
1876 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1877 double precision,
intent(out):: res(ixi^s)
1879 double precision :: r(ixi^s)
1881 call eos%get_Rfactor(w,x,ixi^
l,ixo^
l,r)
1882 call eos%get_thermal_pressure(w, x, ixi^
l, ixo^
l, res)
1883 res(ixo^s)=res(ixo^s)/(r(ixo^s)*w(ixo^s,
rho_))
1887 subroutine hd_get_temperature_from_eint(w, x, ixI^L, ixO^L, res)
1889 integer,
intent(in) :: ixi^
l, ixo^
l
1890 double precision,
intent(in) :: w(ixi^s, 1:nw)
1891 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1892 double precision,
intent(out):: res(ixi^s)
1894 double precision :: r(ixi^s)
1896 call eos%get_Rfactor(w,x,ixi^
l,ixo^
l,r)
1897 res(ixo^s) = (eos%gamma - 1.0d0) * w(ixo^s,
e_)/(w(ixo^s,
rho_)*r(ixo^s))
1898 end subroutine hd_get_temperature_from_eint
1901 subroutine hd_get_flux(wC, w, x, ixI^L, ixO^L, idim, f)
1905 integer,
intent(in) :: ixi^
l, ixo^
l, idim
1907 double precision,
intent(in) :: wc(ixi^s, 1:nw)
1909 double precision,
intent(in) :: w(ixi^s, 1:nw)
1910 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1911 double precision,
intent(out) :: f(ixi^s, nwflux)
1913 double precision :: pth(ixi^s)
1917 {
do ix^db=ixomin^db,ixomax^db\}
1933 {
do ix^db=ixomin^db,ixomax^db\}
1938 call eos%get_thermal_pressure(wc, x, ixi^l, ixo^l, pth)
1939 {
do ix^db=ixomin^db,ixomax^db\}
1942 ^
c&f(ix^d,
m^
c_)=w(ix^d,
mom(idim))*wc(ix^d,
m^
c_)\
1943 f(ix^d,
mom(idim))=f(ix^d,
mom(idim))+pth(ix^d)
1948 {
do ix^db=ixomin^db,ixomax^db\}
1950 f(ix^d,
r_e)=w(ix^d,
mom(idim))*wc(ix^d,
r_e)
1959 f(ixo^s,
fip_) = w(ixo^s,
mom(idim)) * wc(ixo^s,
fip_)
1964 call dust_get_flux_prim(w, x, ixi^l, ixo^l, idim, f)
1967 end subroutine hd_get_flux
1974 subroutine hd_add_source_geom(qdt, dtfactor, ixI^L, ixO^L, wCT, wprim, w, x)
1980 integer,
intent(in) :: ixi^
l, ixo^
l
1981 double precision,
intent(in) :: qdt, dtfactor, x(ixi^s, 1:
ndim)
1982 double precision,
intent(inout) :: wct(ixi^s, 1:nw), wprim(ixi^s,1:nw),w(ixi^s, 1:nw)
1983 double precision :: pth(ixi^s),
source(ixi^s), minrho
1984 integer :: iw,idir, h1x^
l{^nooned, h2x^
l}
1985 integer :: mr_,mphi_
1986 integer :: irho, ifluid, n_fluids
1987 double precision :: exp_factor(ixi^s), del_exp_factor(ixi^s), exp_factor_primitive(ixi^s)
2009 source(ixo^s) =
source(ixo^s)*del_exp_factor(ixo^s)/exp_factor(ixo^s)
2013 do ifluid = 0, n_fluids-1
2015 if (ifluid == 0)
then
2039 where (wct(ixo^s, irho) > minrho)
2040 source(ixo^s) =
source(ixo^s) + wct(ixo^s,mphi_)*wprim(ixo^s,mphi_)
2041 w(ixo^s, mr_) = w(ixo^s, mr_) + qdt*
source(ixo^s)/x(ixo^s,
r_)
2044 where (wct(ixo^s, irho) > minrho)
2045 source(ixo^s) = -wct(ixo^s, mphi_) * wprim(ixo^s, mr_)
2046 w(ixo^s, mphi_) = w(ixo^s, mphi_) + qdt *
source(ixo^s) / x(ixo^s,
r_)
2050 w(ixo^s, mr_) = w(ixo^s, mr_) + qdt *
source(ixo^s) / x(ixo^s,
r_)
2055 call mpistop(
"Dust geom source terms not implemented yet with spherical geometries")
2059 h1x^
l=ixo^
l-
kr(1,^
d); {^nooned h2x^
l=ixo^
l-
kr(2,^
d);}
2061 pth(ixo^s)=wprim(ixo^s,
p_)
2070 source(ixo^s) = pth(ixo^s) * x(ixo^s, 1) &
2071 *(
block%surfaceC(ixo^s, 1) -
block%surfaceC(h1x^s, 1)) &
2072 /
block%dvolume(ixo^s)
2076 w(ixo^s, mr_) = w(ixo^s, mr_) + qdt *
source(ixo^s) / x(ixo^s, 1)
2080 source(ixo^s) = pth(ixo^s) * x(ixo^s, 1) &
2081 * (
block%surfaceC(ixo^s, 2) -
block%surfaceC(h2x^s, 2)) &
2082 /
block%dvolume(ixo^s)
2084 source(ixo^s) =
source(ixo^s) + (wprim(ixo^s,
mom(3))**2 * wprim(ixo^s,
rho_)) / tan(x(ixo^s, 2))
2086 source(ixo^s) =
source(ixo^s) - (wprim(ixo^s,
mom(2)) * wprim(ixo^s, mr_)) * wprim(ixo^s,
rho_)
2087 w(ixo^s,
mom(2)) = w(ixo^s,
mom(2)) + qdt *
source(ixo^s) / x(ixo^s, 1)
2091 source(ixo^s) = -(wprim(ixo^s,
mom(3)) * wprim(ixo^s, mr_)) * wprim(ixo^s,
rho_)&
2092 - (wprim(ixo^s,
mom(2)) * wprim(ixo^s,
mom(3))) * wprim(ixo^s,
rho_) / tan(x(ixo^s, 2))
2093 w(ixo^s,
mom(3)) = w(ixo^s,
mom(3)) + qdt *
source(ixo^s) / x(ixo^s, 1)
2100 call mpistop(
"Rotating frame not implemented yet with dust")
2106 end subroutine hd_add_source_geom
2109 subroutine hd_add_source(qdt,dtfactor, ixI^L,ixO^L,wCT,wCTprim,w,x,qsourcesplit,active)
2118 integer,
intent(in) :: ixi^
l, ixo^
l
2119 double precision,
intent(in) :: qdt, dtfactor
2120 double precision,
intent(in) :: wct(ixi^s, 1:nw),wctprim(ixi^s,1:nw), x(ixi^s, 1:
ndim)
2121 double precision,
intent(inout) :: w(ixi^s, 1:nw)
2122 logical,
intent(in) :: qsourcesplit
2123 logical,
intent(inout) :: active
2125 double precision :: gravity_field(ixi^s, 1:
ndim)
2126 integer :: idust, idim, ix^
d
2142 qsourcesplit,active,
rc_fl)
2161 + qdt * gravity_field(ixo^s, idim) * wct(ixo^s,
dust_rho(idust))
2173 call hd_add_radiation_source(qdt,ixi^
l,ixo^
l,wct,wctprim,w,x,qsourcesplit,active)
2176 if(eos%eos_type ==
'PI')
then
2177 if(.not.qsourcesplit)
then
2179 call eos%update_eos(ixi^
l,ixo^
l,w,x)
2186 call add_hypertc_source(qdt,ixi^
l,ixo^
l,wct,w,x,wctprim)
2189 end subroutine hd_add_source
2211 subroutine add_hypertc_source(qdt,ixI^L,ixO^L,wCT,w,x,wCTprim)
2214 integer,
intent(in) :: ixi^
l,ixo^
l
2215 double precision,
intent(in) :: qdt
2216 double precision,
dimension(ixI^S,1:ndim),
intent(in) :: x
2217 double precision,
dimension(ixI^S,1:nw),
intent(in) :: wct,wctprim
2218 double precision,
dimension(ixI^S,1:nw),
intent(inout) :: w
2220 double precision :: te(ixi^s), rfactor(ixi^s)
2221 double precision :: qf_half(ixglo1:ixghi1)
2222 double precision :: qf_full(ixglo1:ixghi1)
2223 double precision :: t_l, t_r, t_cool_l, t_cool_r, t_kap_l, t_kap_r
2224 double precision :: kappa_l, kappa_r, kappa_f
2225 double precision :: sigma_t7_f, dt_face, dx_f
2226 double precision :: rho_f, p_l, p_r, p_f, cs_f, q_sat, q_sp, q_sp_star
2227 double precision :: f_sat, eint_loc_l, eint_loc_r, eint_loc_f
2228 double precision :: qn_face, tau_f, ratio, decay, ave_factor
2229 double precision :: q_face_max
2230 double precision,
parameter :: ratio_cap = 50.0d0
2231 integer :: ix1, nface_lo, nface_hi
2235 te(ixi^s) = wct(ixi^s,
te_)
2237 call eos%get_Rfactor(wctprim, x, ixi^
l, ixi^
l, rfactor)
2238 te(ixi^s) = wctprim(ixi^s,
p_) / (rfactor(ixi^s) * wctprim(ixi^s,
rho_))
2242 nface_lo = ixomin1 - 1
2247 do ix1 = nface_lo, nface_hi
2258 t_kap_l = max(t_l, t_cool_l)
2259 t_kap_r = max(t_r, t_cool_r)
2265 if (kappa_l + kappa_r > smalldouble)
then
2266 kappa_f = 2.0d0 * kappa_l * kappa_r / (kappa_l + kappa_r)
2271 dx_f = 0.5d0 * (
block%ds(ix1, 1) +
block%ds(ix1 + 1, 1))
2273 q_sp = -kappa_f * dt_face / dx_f
2276 rho_f = 0.5d0 * (wctprim(ix1,
rho_) + wctprim(ix1 + 1,
rho_))
2277 p_l = wctprim(ix1,
p_)
2278 p_r = wctprim(ix1 + 1,
p_)
2279 p_f = 0.5d0 * (p_l + p_r)
2280 cs_f = dsqrt(max(smalldouble, eos%gamma * p_f / max(rho_f, smalldouble)))
2284 q_sat = 1.5d0 * rho_f * (p_f / max(rho_f, smalldouble))**1.5d0
2285 if (q_sat > smalldouble)
then
2286 f_sat = 1.0d0 / (1.0d0 + dabs(q_sp) / q_sat)
2290 q_sp_star = f_sat * q_sp
2296 eint_loc_l = wct(ix1,
e_) &
2297 - 0.5d0 * wct(ix1, m1_)**2 / max(wct(ix1,
rho_), smalldouble)
2298 eint_loc_r = wct(ix1 + 1,
e_) &
2299 - 0.5d0 * wct(ix1 + 1, m1_)**2 / max(wct(ix1 + 1,
rho_), smalldouble)
2300 eint_loc_l = max(eint_loc_l, smalldouble)
2301 eint_loc_r = max(eint_loc_r, smalldouble)
2302 eint_loc_f = 0.5d0 * (eint_loc_l + eint_loc_r)
2307 sigma_t7_f = kappa_f * 0.5d0 * (t_l + t_r)
2308 tau_f = max(4.0d0 *
dt, &
2312 ratio = min(qdt / tau_f, ratio_cap)
2313 decay = dexp(-ratio)
2314 if (ratio > 1.0
d-6)
then
2315 ave_factor = (1.0d0 - decay) / ratio
2317 ave_factor = 1.0d0 - 0.5d0 * ratio + ratio * ratio / 6.0d0
2320 qn_face = 0.5d0 * (wct(ix1,
q_) + wct(ix1 + 1,
q_))
2322 qf_full(ix1) = q_sp_star + (qn_face - q_sp_star) * decay
2323 qf_half(ix1) = q_sp_star + (qn_face - q_sp_star) * ave_factor
2327 block%ds(ix1, 1) / max(qdt, smalldouble)
2328 qf_half(ix1) = sign(min(dabs(qf_half(ix1)), q_face_max), qf_half(ix1))
2332 do ix1 = ixomin1, ixomax1
2333 w(ix1,
e_) = w(ix1,
e_) &
2334 - qdt * (qf_half(ix1) - qf_half(ix1 - 1)) /
block%ds(ix1, 1)
2335 w(ix1,
q_) = 0.5d0 * (qf_full(ix1 - 1) + qf_full(ix1))
2339 end subroutine add_hypertc_source
2341 subroutine hd_add_radiation_source(qdt,ixI^L,ixO^L,wCT,wCTprim,w,x,qsourcesplit,active)
2347 integer,
intent(in) :: ixi^
l, ixo^
l
2348 double precision,
intent(in) :: qdt, x(ixi^s,1:
ndim)
2349 double precision,
intent(in) :: wct(ixi^s,1:nw),wctprim(ixi^s,1:nw)
2350 double precision,
intent(inout) :: w(ixi^s,1:nw)
2351 logical,
intent(in) :: qsourcesplit
2352 logical,
intent(inout) :: active
2358 end subroutine hd_add_radiation_source
2360 subroutine hd_get_dt(wprim, ixI^L, ixO^L, dtnew, dx^D, x)
2368 integer,
intent(in) :: ixi^
l, ixo^
l
2369 double precision,
intent(in) ::
dx^
d, x(ixi^s, 1:^nd)
2370 double precision,
intent(in) :: wprim(ixi^s, 1:nw)
2371 double precision,
intent(inout) :: dtnew
2395 end subroutine hd_get_dt
2400 subroutine hd_fld_implicit_update(dtfactor,qdt,qtC,psa,psb)
2405 double precision,
intent(in) :: qdt
2406 double precision,
intent(in) :: qtc
2407 double precision,
intent(in) :: dtfactor
2410 end subroutine hd_fld_implicit_update
2412 subroutine hd_fld_evaluate_implicit(qtC,psa)
2416 double precision,
intent(in) :: qtc
2419 end subroutine hd_fld_evaluate_implicit
2423 integer,
intent(in) :: ixi^
l, ixo^
l
2424 double precision,
intent(in) :: w(ixi^s, nw)
2425 double precision :: ke(ixo^s)
2426 double precision,
intent(in),
optional :: inv_rho(ixo^s)
2428 if (
present(inv_rho))
then
2429 ke = 0.5d0 * sum(w(ixo^s,
mom(:))**2, dim=
ndim+1) * inv_rho
2431 ke = 0.5d0 * sum(w(ixo^s,
mom(:))**2, dim=
ndim+1) / w(ixo^s,
rho_)
2435 function hd_inv_rho(w, ixI^L, ixO^L)
result(inv_rho)
2437 integer,
intent(in) :: ixi^
l, ixo^
l
2438 double precision,
intent(in) :: w(ixi^s, nw)
2439 double precision :: inv_rho(ixo^s)
2442 inv_rho = 1.0d0 / w(ixo^s,
rho_)
2443 end function hd_inv_rho
2452 logical,
intent(in) :: primitive
2453 integer,
intent(in) :: ixi^
l,ixo^
l
2454 double precision,
intent(inout) :: w(ixi^s,1:nw)
2455 double precision,
intent(in) :: x(ixi^s,1:
ndim)
2456 character(len=*),
intent(in) :: subname
2459 logical :: flag(ixi^s,1:nw)
2469 where(flag(ixo^s,
rho_)) w(ixo^s,
mom(idir)) = 0.0d0
2491 where(flag(ixo^s,
e_))
2517 call eos%get_thermal_pressure(w, x, ixi^
l, ixo^
l, w(ixo^s,
p_))
2520 w(ixo^s,
mom(idir)) = w(ixo^s,
mom(idir))/w(ixo^s,
rho_)
2522 call eos%p_to_e(ixi^
l, ixo^
l, w, x)
2524 w(ixo^s,
mom(idir)) = w(ixo^s,
mom(idir))*w(ixo^s,
rho_)
2543 if(.not.primitive)
then
2547 call eos%get_thermal_pressure(w, x, ixi^
l, ixo^
l, w(ixo^s,
p_))
2552 w(ixo^s,
mom(idir)) = w(ixo^s,
mom(idir))/w(ixo^s,
rho_)
2559 if (
hd_fip)
call hd_bound_fip(primitive, ixi^
l, ixo^
l, w)
2582 subroutine hd_wb_prolong(ixI^L, ixO^L, w, x)
2586 integer,
intent(in) :: ixi^
l, ixo^
l
2587 double precision,
intent(inout) :: w(ixi^s, 1:nw)
2588 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
2590 double precision :: gravity_field(ixi^s, 1:
ndim)
2591 double precision :: wb_t(ixi^s), p_eq(ixi^s)
2592 double precision :: dx_idims
2593 double precision :: alpha(ixi^s), beta(ixi^s)
2595 integer :: ix1, ix_mid
2599 wb_t(ixo^s) = w(ixo^s,
p_) / w(ixo^s,
rho_)
2608 alpha(ixomin1:ixomax1) = 0.5d0 * dx_idims &
2609 * gravity_field(ixomin1:ixomax1, 1) / wb_t(ixomin1:ixomax1)
2612 ix_mid = (ixomin1 + ixomax1) / 2
2613 p_eq(ix_mid) = w(ix_mid,
p_)
2616 beta(ix_mid:ixomax1-1) = (1.0d0 + alpha(ix_mid:ixomax1-1)) &
2617 / (1.0d0 - alpha(ix_mid+1:ixomax1))
2618 do ix1 = ix_mid + 1, ixomax1
2619 p_eq(ix1) = p_eq(ix1 - 1) * beta(ix1 - 1)
2623 beta(ixomin1:ix_mid-1) = (1.0d0 - alpha(ixomin1+1:ix_mid)) &
2624 / (1.0d0 + alpha(ixomin1:ix_mid-1))
2625 do ix1 = ix_mid - 1, ixomin1, -1
2626 p_eq(ix1) = p_eq(ix1 + 1) * beta(ix1)
2630 w(ixomin1:ixomax1,
p_) = p_eq(ixomin1:ixomax1)
2631 w(ixomin1:ixomax1,
rho_) = p_eq(ixomin1:ixomax1) / wb_t(ixomin1:ixomax1)
2634 end subroutine hd_wb_prolong
2646 subroutine hd_wb_transform(ixI^L, ixO^L, idims, w, x, wb_phi, &
2651 integer,
intent(in) :: ixi^
l, ixo^
l, idims
2652 double precision,
intent(inout) :: w(ixi^s, 1:nw)
2653 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
2654 double precision,
intent(out) :: wb_phi(ixi^s)
2655 double precision,
intent(out) :: wb_phi_face(ixi^s)
2656 double precision,
intent(out) :: wb_t(ixi^s)
2658 double precision :: gravity_field(ixi^s, 1:
ndim)
2659 double precision :: dx_idims
2660 double precision :: alpha(ixi^s), beta(ixi^s)
2666 wb_t(ixi^s) = w(ixi^s,
p_) / w(ixi^s,
rho_)
2680 alpha(iximin1:iximax1) = 0.5d0 * dx_idims &
2681 * gravity_field(iximin1:iximax1, idims) / wb_t(iximin1:iximax1)
2684 beta(iximin1:iximax1-1) = (1.0d0 + alpha(iximin1:iximax1-1)) &
2685 / (1.0d0 - alpha(iximin1+1:iximax1))
2688 wb_phi(iximin1) = w(iximin1,
p_)
2689 do ix1 = iximin1 + 1, iximax1
2690 wb_phi(ix1) = wb_phi(ix1 - 1) * beta(ix1 - 1)
2695 wb_phi_face(ixi^s) = wb_phi(ixi^s) * (1.0d0 + 0.5d0 * dx_idims * &
2696 gravity_field(ixi^s, idims) / wb_t(ixi^s))
2699 w(ixi^s,
rho_) = wb_t(ixi^s)
2700 w(ixi^s,
p_) = w(ixi^s,
p_) / wb_phi(ixi^s)
2702 end subroutine hd_wb_transform
2724 subroutine hd_wb_inverse(ixI^L, ixL^L, ixR^L, idims, wLp, wRp, w, &
2725 wb_phi, wb_phi_face, wb_T)
2728 integer,
intent(in) :: ixi^
l, ixl^
l, ixr^
l, idims
2729 double precision,
intent(inout) :: wlp(ixi^s, 1:nw), wrp(ixi^s, 1:nw)
2730 double precision,
intent(inout) :: w(ixi^s, 1:nw)
2731 double precision,
intent(in) :: wb_phi(ixi^s), wb_phi_face(ixi^s)
2732 double precision,
intent(in) :: wb_t(ixi^s)
2734 double precision :: t_shared(ixi^s)
2735 double precision :: t_face_l(ixi^s), t_face_r(ixi^s)
2736 double precision :: sigma(ixi^s), t_for_rhol(ixi^s), t_for_rhor(ixi^s)
2740 t_shared(iximin1:iximax1-1) = 0.5d0 * (wb_t(iximin1:iximax1-1) &
2741 + wb_t(iximin1+1:iximax1))
2742 t_shared(iximax1) = wb_t(iximax1)
2747 t_face_l(ixl^s) = wlp(ixl^s,
rho_)
2748 t_face_r(ixr^s) = wrp(ixr^s,
rho_)
2752 sigma(ixl^s) = dabs(t_face_l(ixl^s) - t_face_r(ixr^s)) &
2753 / (0.5d0 * (t_face_l(ixl^s) + t_face_r(ixr^s)) + smalldouble)
2754 sigma(ixl^s) = min(sigma(ixl^s), 1.0d0)
2757 t_for_rhol(ixl^s) = (1.d0 - sigma(ixl^s)) * t_shared(ixl^s) &
2758 + sigma(ixl^s) * t_face_l(ixl^s)
2759 t_for_rhor(ixr^s) = (1.d0 - sigma(ixl^s)) * t_shared(ixr^s) &
2760 + sigma(ixl^s) * t_face_r(ixr^s)
2763 wlp(ixl^s,
p_) = wlp(ixl^s,
p_) * wb_phi_face(ixl^s)
2764 wrp(ixr^s,
p_) = wrp(ixr^s,
p_) * wb_phi_face(ixr^s)
2767 wlp(ixl^s,
rho_) = wlp(ixl^s,
p_) / t_for_rhol(ixl^s)
2768 wrp(ixr^s,
rho_) = wrp(ixr^s,
p_) / t_for_rhor(ixr^s)
2771 w(ixi^s,
p_) = w(ixi^s,
p_) * wb_phi(ixi^s)
2772 w(ixi^s,
rho_) = w(ixi^s,
p_) / wb_t(ixi^s)
2774 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_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:
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
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
logical, public hd_equi_pe0
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.
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.
integer, public equi_pe0_
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...
integer, public equi_rho0_
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)
logical, public hd_equi_rho0
Equilibrium splitting variables (stubs for mod_usr.t compatibility)
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_.
double precision, public, protected hd_trac_v_thresh
Johnston 2021 mass flux velocity threshold (fraction of local c_s). Below this Mach number,...
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)
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
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...