35 logical,
public,
protected ::
hd_dust = .false.
67 integer,
public,
protected ::
rho_
70 integer,
allocatable,
public,
protected ::
mom(:)
73 integer,
public,
protected :: ^
c&m^C_
76 integer,
allocatable,
public,
protected ::
tracer(:)
79 integer,
public,
protected ::
e_
82 integer,
public,
protected ::
p_
85 integer,
public,
protected ::
ne_
88 integer,
public,
protected ::
r_e
91 integer,
public,
protected ::
te_
94 integer,
public,
protected ::
fip_ = -1
97 logical,
public,
protected ::
hd_fip = .false.
103 integer,
public,
protected ::
q_
179 logical,
public,
protected ::
hd_trac = .false.
195 double precision,
public,
protected ::
h_ion_fr=1d0
205 double precision,
public,
protected ::
rr=1d0
236 subroutine hd_read_params(files)
238 character(len=*),
intent(in) :: files(:)
254 do n = 1,
size(files)
255 open(
unitpar, file=trim(files(n)), status=
"old")
256 read(
unitpar, hd_list,
end=111)
260 end subroutine hd_read_params
263 subroutine hd_write_info(fh)
265 integer,
intent(in) :: fh
266 integer,
parameter :: n_par = 1
267 double precision :: values(n_par)
268 character(len=name_len) :: names(n_par)
269 integer,
dimension(MPI_STATUS_SIZE) :: st
272 call mpi_file_write(fh, n_par, 1, mpi_integer, st, er)
275 values(1) = eos%gamma
276 call mpi_file_write(fh, values, n_par, mpi_double_precision, st, er)
277 call mpi_file_write(fh, names, n_par * name_len, mpi_character, st, er)
278 end subroutine hd_write_info
304 phys_internal_e = .false.
305 phys_gamma = eos%gamma
312 if(
mype==0)
write(*,*)
'WARNING: set hd_trac_type=1'
316 call mpistop(
"hd_trac_type=7 requires usr_get_heating to be set in mod_usr.t")
327 call mpistop(
"hd_trac_type=7 requires usr_get_heating to be set in mod_usr.t")
332 if(
mype==0)
write(*,*)
'WARNING: hd_trac disabled for ndim>=2 (only trac_type=7 supported)'
341 if(
mype==0)
write(*,*)
'WARNING: set hd_thermal_conduction=F when hd_energy=F'
345 if(
mype==0)
write(*,*)
'WARNING: set hd_hyperbolic_thermal_conduction=F when hd_energy=F'
349 if(
mype==0)
write(*,*)
'WARNING: set hd_radiative_cooling=F when hd_energy=F'
354 allocate(start_indices(number_species),stop_indices(number_species))
362 mom(:) = var_set_momentum(
ndir)
367 e_ = var_set_energy()
390 if (eos%eos_type ==
'LTE')
then
393 else if (eos%eos_type ==
'PI')
then
404 if(.not.
hd_energy)
call mpistop(
"radiative transfer needs hd_energy=T")
405 call rt_sc_activate()
411 write(*,*)
'Warning: CAK force addition together with FLD radiation'
416 write(*,*)
'Warning: Optically thin cooling together with FLD radiation'
420 call mpistop(
'implicit dust addition not compatible with FLD radiation')
423 call mpistop(
'using FLD implies the use of an energy equation, set hd_energy=T')
426 r_e = var_set_radiation_energy()
431 call fld_init(eos%eos_type, eos%ionE, eos%pi_table)
435 phys_implicit_update => hd_fld_implicit_update
436 phys_evaluate_implicit => hd_fld_evaluate_implicit
443 phys_get_dt => hd_get_dt
444 phys_get_cmax => hd_get_cmax
445 phys_get_tcutoff => hd_get_tcutoff
446 phys_get_cbounds => hd_get_cbounds
447 phys_get_flux => hd_get_flux
448 phys_add_source_geom => hd_add_source_geom
449 phys_add_source => hd_add_source
450 phys_modify_wlr => hd_modify_wlr
454 phys_get_v => hd_get_v
456 phys_write_info => hd_write_info
460 phys_get_ei => hd_get_ei
463 call hd_physical_units()
484 fip_ = var_set_fluxvar(
'rho_fip',
'fip', need_bc=.false.)
493 tracer(itr) = var_set_fluxvar(
"trc",
"trp", itr, need_bc=.false.)
505 if (iw_ne > 0) nwgc = max(nwgc, iw_ne)
506 if (iw_te > 0) nwgc = max(nwgc, iw_te)
509 stop_indices(1)=nwflux
520 iw_log_nh = var_set_wextra()
528 call mpistop(
"thermal conduction needs hd_energy=T")
536 if (iw_log_nh > 0)
then
566 call mpistop(
"radiative cooling needs hd_energy=T")
574 if (
rc_fl%rad_escape_prob)
then
584 phys_te_images => hd_te_images
596 if(
mype==0)
write(*,*)
'WARNING: set hd_well_balanced=F (requires hd_gravity=T)'
598 phys_wb_transform => hd_wb_transform
599 phys_wb_inverse => hd_wb_inverse
600 phys_wb_prolong => hd_wb_prolong
603 if (eos%ionE .and. eos%p2eint_method /=
'bisect')
then
604 eos%p2eint_method =
'bisect'
605 if(
mype==0)
write(*,*)
'WB + ionE: forcing p2eint_method = bisect'
607 if(
mype==0)
write(*,*)
'Well-balanced reconstruction enabled'
619 if (.not.
allocated(flux_type))
then
620 allocate(flux_type(
ndir, nw))
621 flux_type = flux_default
622 else if (any(shape(flux_type) /= [
ndir, nw]))
then
623 call mpistop(
"phys_check error: flux_type has wrong shape")
627 allocate(iw_vector(nvector))
628 iw_vector(1) =
mom(1) - 1
636 subroutine hd_modify_wlr(ixI^L,ixO^L,qt,wLC,wRC,wLp,wRp,s,idir)
639 integer,
intent(in) :: ixi^
l, ixo^
l, idir
640 double precision,
intent(in) :: qt
641 double precision,
intent(inout) :: wlc(ixi^s,1:nw), wrc(ixi^s,1:nw)
642 double precision,
intent(inout) :: wlp(ixi^s,1:nw), wrp(ixi^s,1:nw)
647 end subroutine hd_modify_wlr
650 subroutine hd_te_images
654 case(
'EIvtiCCmpi',
'EIvtuCCmpi')
656 case(
'ESvtiCCmpi',
'ESvtuCCmpi')
658 case(
'SIvtiCCmpi',
'SIvtuCCmpi')
660 case(
'WIvtiCCmpi',
'WIvtuCCmpi')
663 call mpistop(
"Error in synthesize emission: Unknown convert_type")
665 end subroutine hd_te_images
670 subroutine hd_sts_set_source_tc_hd(ixI^L,ixO^L,w,x,wres,fix_conserve_at_step,my_dt,igrid,nflux)
674 integer,
intent(in) :: ixi^
l, ixo^
l, igrid, nflux
675 double precision,
intent(in) :: x(ixi^s,1:
ndim)
676 double precision,
intent(inout) :: wres(ixi^s,1:nw), w(ixi^s,1:nw)
677 double precision,
intent(in) :: my_dt
678 logical,
intent(in) :: fix_conserve_at_step
680 end subroutine hd_sts_set_source_tc_hd
682 function hd_get_tc_dt_hd(w,ixI^L,ixO^L,dx^D,x)
result(dtnew)
688 integer,
intent(in) :: ixi^
l, ixo^
l
689 double precision,
intent(in) ::
dx^
d, x(ixi^s,1:
ndim)
690 double precision,
intent(in) :: w(ixi^s,1:nw)
691 double precision :: dtnew
694 end function hd_get_tc_dt_hd
696 subroutine hd_tc_handle_small_e(w, x, ixI^L, ixO^L, step)
701 integer,
intent(in) :: ixi^
l,ixo^
l
702 double precision,
intent(inout) :: w(ixi^s,1:nw)
703 double precision,
intent(in) :: x(ixi^s,1:
ndim)
704 integer,
intent(in) :: step
707 logical :: flag(ixi^s,1:nw)
708 character(len=140) :: error_msg
712 if(any(flag(ixo^s,
e_)))
then
720 w(ixo^s,
e_)=w(ixo^s,
e_)*(eos%gamma - 1.0d0)
722 w(ixo^s, iw_mom(idir)) = w(ixo^s, iw_mom(idir))/w(ixo^s,
rho_)
724 write(error_msg,
"(a,i3)")
"Thermal conduction step ", step
728 end subroutine hd_tc_handle_small_e
731 subroutine tc_params_read_hd(fl)
733 type(tc_fluid),
intent(inout) :: fl
735 logical :: tc_saturate=.false.
736 logical :: tc_patch_eint=.false.
737 logical :: tc_frozen_ion=.true.
738 double precision :: tc_k_para=0d0
739 double precision :: trac_t_floor=0.d0
741 namelist /tc_list/ tc_saturate, tc_k_para, trac_t_floor, tc_patch_eint, tc_frozen_ion
745 read(
unitpar, tc_list,
end=111)
748 fl%tc_saturate = tc_saturate
749 fl%tc_patch_eint = tc_patch_eint
750 fl%frozen_ion = tc_frozen_ion .and. .not. tc_patch_eint
751 fl%tc_k_para = tc_k_para
752 fl%trac_T_floor = trac_t_floor / unit_temperature
754 end subroutine tc_params_read_hd
768 subroutine rc_params_read(fl)
772 type(rc_fluid),
intent(inout) :: fl
775 integer :: ncool = 4000
778 character(len=std_len) :: coolcurve=
'JCcorona'
781 logical :: tfix=.false.
787 logical :: rc_split=.false.
790 double precision :: cfrac=0.1d0
793 logical :: rad_modify=.false.
795 logical :: rad_modify_sym=.false.
797 double precision :: rad_cut_hgt=0.0d0
799 double precision :: rad_cut_dey=0.15d0
801 double precision :: rad_taper_rho=
bigdouble
803 double precision :: rad_taper_dey=0.0d0
806 double precision :: rad_suppress_temp=0.0d0
808 logical :: rad_escape_prob=.false.
810 double precision :: rad_kappa_eff=0.0d0
812 double precision :: rad_kappa_tcutoff=0.0d0
814 double precision :: rad_kappa_alpha=4.0d0
816 character(len=10) :: rad_escape_type=
'slab'
818 double precision :: rad_escape_tau_cutoff=0.0d0
820 double precision :: rad_escape_height=0.0d0
822 character(len=8) :: rc_y_mod_quadrature=
'boole'
823 integer :: rc_y_mod_n_sub=16
825 logical :: rad_damp=.false.
826 double precision :: rad_damp_height=0.5d0
827 double precision :: rad_damp_scale=0.15d0
829 logical :: rad_newton=.false.
830 double precision :: rad_newton_trad=0.006d0
831 double precision :: rad_newton_rhosurf=1.d4
832 double precision :: rad_newton_pthick=25.d0
834 namelist /rc_list/ coolcurve, ncool, cfrac, tlow, tfix, rc_split, &
835 rad_modify, rad_modify_sym, rad_suppress_temp, &
836 rad_cut_hgt, rad_cut_dey, rad_taper_rho, rad_taper_dey, &
837 rad_escape_prob, rad_kappa_eff, rad_kappa_tcutoff, rad_kappa_alpha, &
838 rad_escape_type, rad_escape_tau_cutoff, rad_escape_height, &
839 rc_y_mod_quadrature, rc_y_mod_n_sub, &
840 rad_damp, rad_damp_height, rad_damp_scale, &
841 rad_newton, rad_newton_trad, rad_newton_rhosurf, rad_newton_pthick
845 read(
unitpar, rc_list,
end=111)
850 fl%coolcurve=coolcurve
855 fl%rad_modify=rad_modify
856 fl%rad_modify_sym=rad_modify_sym
857 fl%rad_suppress_temp=rad_suppress_temp
858 fl%rad_cut_hgt=rad_cut_hgt
859 fl%rad_cut_dey=rad_cut_dey
860 fl%rad_taper_rho=rad_taper_rho
861 fl%rad_taper_dey=rad_taper_dey
862 fl%rad_escape_prob=rad_escape_prob
863 fl%rad_kappa_eff=rad_kappa_eff
864 fl%rad_kappa_Tcutoff=rad_kappa_tcutoff/unit_temperature
865 fl%rad_kappa_alpha=rad_kappa_alpha
866 fl%rad_escape_type=rad_escape_type
867 fl%rad_escape_tau_cutoff=rad_escape_tau_cutoff
868 fl%rad_escape_height=rad_escape_height/unit_length
869 fl%Y_mod_quadrature=rc_y_mod_quadrature
870 fl%Y_mod_N_sub=rc_y_mod_n_sub
871 fl%rad_damp = rad_damp
872 fl%rad_damp_height = rad_damp_height
873 fl%rad_damp_scale = rad_damp_scale
874 fl%rad_newton = rad_newton
875 fl%rad_newton_trad = rad_newton_trad
876 fl%rad_newton_rhosurf = rad_newton_rhosurf
877 fl%rad_newton_pthick = rad_newton_pthick
878 end subroutine rc_params_read
886 use mod_particles,
only: npayload,nusrpayload,ngridvars,num_particles,physics_type_particles
889 double precision :: a,b,xfrac,yfrac
899 if (eos%gamma <= 0.0d0)
call mpistop (
"Error: eos%gamma <= 0")
900 if (
hd_adiab < 0.0d0)
call mpistop (
"Error: hd_adiab < 0")
903 if (eos%gamma <= 0.0d0 .or. eos%gamma == 1.0d0) &
904 call mpistop (
"Error: eos%gamma <= 0 or eos%gamma == 1.0")
916 call mpistop(
'select IMEX scheme for implicit dust update')
928 call mpistop(
"hd_hyperbolic_thermal_conduction is implemented for ndim=1 only;" // &
929 " for ndim>1 use mod_ffhd or parabolic mod_thermal_conduction.")
932 call mpistop(
"hd_hyperbolic_thermal_conduction and hd_thermal_conduction are mutually exclusive;" // &
933 " choose one TC implementation.")
938 call mpistop(
'select IMEX scheme for FLD radiation use')
941 call phys_set_mg_bounds()
943 if(.not.
fld_no_mg)
call mpistop(
'multigrid must have BCs for IMEX and FLD radiation use')
946 write(*,*)
'==FLD SETUP======================'
947 write(*,*)
'Using FLD with settings:'
951 write(*,*)
'Using FLD with settings: fld_bound_diff=',
fld_bound_diff
954 write(*,*)
'Using FLD with settings: fld_kappa0=',
fld_kappa0
955 write(*,*)
'Using FLD with settings: fld_opal_table=',
fld_opal_table
957 write(*,*)
'Using FLD with settings: fld_bisect_tol=',
fld_bisect_tol
958 write(*,*)
'Using FLD with settings: fld_diff_tol=',
fld_diff_tol
961 write(*,*)
' FLD has fld_no_mg=',
fld_no_mg
963 print *,
'WARNING: cheating with FLD diffusion ***********************'
964 print *,
'WARNING: No MG-diffusion for radiative energy at all!!!!!!!'
965 print *,
'WARNING: cheating with FLD diffusion ***********************'
968 print *,
'NORMALIZED arad_norm=',
arad_norm
969 print *,
'NORMALIZED c_norm=',
c_norm
971 print *,
'WARNING: cheating with c_norm ***********************'
972 print *,
'WARNING: c_norm reset to=',
fld_cnorm
974 print *,
'WARNING: cheating with c_norm ***********************'
982 print *,
'physical fld_kappa (in cgs or SI) =',
fld_kappa0
985 write(*,*)
'===FLD SETUP====================='
989 write(*,*)
'====HD run with settings===================='
990 write(*,*)
'Using mod_hd_phys with settings:'
992 write(*,*)
'Dimensionality :',
ndim
993 write(*,*)
'vector components:',
ndir
995 write(*,*)
'number of variables nw=',nw
996 write(*,*)
' start index iwstart=',iwstart
997 write(*,*)
'number of vector variables=',nvector
998 write(*,*)
'number of stagger variables nws=',nws
999 write(*,*)
'number of variables with BCs=',nwgc
1000 write(*,*)
'number of vars with fluxes=',nwflux
1001 write(*,*)
'number of vars with flux + BC=',nwfluxbc
1002 write(*,*)
'number of auxiliary variables=',nwaux
1003 write(*,*)
'number of extra vars without flux=',nwextra
1004 write(*,*)
'number of extra vars for wextra=',nw_extra
1005 write(*,*)
'number of auxiliary I/O variables=',
nwauxio
1020 write(*,*)
'*****Using particles: npayload,ngridvars :', npayload,ngridvars
1021 write(*,*)
'*****Using particles: nusrpayload :', nusrpayload
1022 write(*,*)
'*****Using particles: num_particles :', num_particles
1023 write(*,*)
'*****Using particles: physics_type_particles=',physics_type_particles
1026 write(*,*)
'number due to phys_wider_stencil=',phys_wider_stencil
1027 write(*,*)
'==========================================='
1028 print *,
'========EOS and UNITS==========='
1030 print *,
'gamma=',eos%gamma
1031 print *,
'He_abundance =',eos%He_abundance
1033 print *,
'========EOS and UNITS==========='
1049 print *,
' compare this to ',mp_si*(1.d0+4.d0*eos%He_abundance)
1051 print *,
' compare this to ',mp_cgs*(1.d0+4.d0*eos%He_abundance)
1055 print *,
' compare this to ',kb_si*(2.d0+3.d0*eos%He_abundance)
1059 print *,
' compare this to ',kb_cgs*(2.d0+3.d0*eos%He_abundance)
1063 if(eos%eos_type /=
'LTE')
then
1064 print *,
'mean molecular weight mu is =',a/b,
' = ', (1.d0+4.d0*eos%He_abundance)/(2.d0+3.d0*eos%He_abundance)
1066 yfrac=4.d0*eos%He_abundance/(1.d0+4.d0*eos%He_abundance)
1067 print *,
'mass fraction hydrogen X is =',1/a,
' and this equals ', 1.d0/(1.d0+4.d0*eos%He_abundance)
1068 print *,
'mass fraction helium Y is =',yfrac
1069 print *,
' check that 1/mu', b/a,
' is equal to 2X+3Y/4=',2.d0*xfrac+3.d0*yfrac/4.d0
1070 print *,
' ratio n_e/n_p=',1.d0+2.0d0*eos%He_abundance
1072 print *,
'========UNITS==========='
1077 subroutine hd_physical_units
1079 double precision :: mp,kb,c_lightspeed,xfrac,sigma_telectron
1080 double precision :: a,b
1087 sigma_telectron=sigma_te_si
1092 c_lightspeed=const_c
1093 sigma_telectron=sigma_te_cgs
1098 if (eos%eos_type ==
'LTE')
then
1102 eos%nH2rhoFactor = 1d0+4d0*eos%He_abundance
1103 rr=(2d0+3d0*eos%He_abundance) / (1d0+4d0*eos%He_abundance)
1104 xfrac=1.d0/(1.d0+4.d0*eos%He_abundance)
1108 a=1d0+4d0*eos%He_abundance
1109 if(eos%eos_type==
'PI')
then
1112 b=2d0+3d0*eos%He_abundance
1198 end subroutine hd_physical_units
1205 logical,
intent(in) :: primitive
1206 integer,
intent(in) :: ixi^
l, ixo^
l
1207 double precision,
intent(in) :: w(ixi^s, nw)
1208 logical,
intent(inout) :: flag(ixi^s,1:nw)
1210 double precision :: tmp(ixi^s)
1211 double precision :: x(ixi^s, 1:
ndim)
1222 tmp(ixo^s)=(eos%gamma-1.0d0)*(w(ixo^s,
e_)-&
1223 half*(^
c&w(ixo^s,
m^
c_)**2+)/w(ixo^s,
rho_))
1237 subroutine hd_bound_fip(primitive, ixI^L, ixO^L, w)
1239 logical,
intent(in) :: primitive
1240 integer,
intent(in) :: ixi^
l, ixo^
l
1241 double precision,
intent(inout) :: w(ixi^s,1:nw)
1243 double precision :: rho_safe(ixi^s), fip_prim(ixi^s)
1251 fip_prim(ixo^s) = w(ixo^s,
fip_) / rho_safe(ixo^s)
1252 fip_prim(ixo^s) = min(
maxfip, max(
minfip, fip_prim(ixo^s)))
1253 w(ixo^s,
fip_) = rho_safe(ixo^s) * fip_prim(ixo^s)
1255 end subroutine hd_bound_fip
1320 integer,
intent(in) :: ixi^
l, ixo^
l
1321 double precision,
intent(inout) :: w(ixi^s, nw)
1322 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1325 w(ixo^s,
e_)=w(ixo^s,
e_)+half*(^
c&w(ixo^s,
m^
c_)**2+)/w(ixo^s,
rho_)
1332 integer,
intent(in) :: ixi^
l, ixo^
l
1333 double precision,
intent(inout) :: w(ixi^s, nw)
1334 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1337 w(ixo^s,
e_)=w(ixo^s,
e_)-half*(^
c&w(ixo^s,
m^
c_)**2+)/w(ixo^s,
rho_)
1344 subroutine hd_e_to_ei_and_cache_log_nh(ixI^L,ixO^L,w,x)
1346 integer,
intent(in) :: ixi^
l, ixo^
l
1347 double precision,
intent(inout) :: w(ixi^s, nw)
1348 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1351 block%wextra(ixo^s, iw_log_nh) = dlog10(w(ixo^s,
rho_) / eos%nH2rhoFactor)
1352 end subroutine hd_e_to_ei_and_cache_log_nh
1355 function hd_get_ei(w, ixI^L, ixO^L)
result(ei)
1357 integer,
intent(in) :: ixi^
l, ixo^
l
1358 double precision,
intent(in) :: w(ixi^s, nw)
1359 double precision :: ei(ixo^s)
1362 ei(ixo^s) = w(ixo^s,
e_) - half*(^
c&w(ixo^s,
m^
c_)**2+)/w(ixo^s,
rho_)
1363 end function hd_get_ei
1366 subroutine hd_get_v_idim(w, x, ixI^L, ixO^L, idim, v)
1368 integer,
intent(in) :: ixi^
l, ixo^
l, idim
1369 double precision,
intent(in) :: w(ixi^s, nw), x(ixi^s, 1:
ndim)
1370 double precision,
intent(out) :: v(ixi^s)
1372 v(ixo^s) = w(ixo^s,
mom(idim)) / w(ixo^s,
rho_)
1373 end subroutine hd_get_v_idim
1376 subroutine hd_get_v(w,x,ixI^L,ixO^L,v)
1379 integer,
intent(in) :: ixi^
l, ixo^
l
1380 double precision,
intent(in) :: w(ixi^s,nw), x(ixi^s,1:^nd)
1381 double precision,
intent(out) :: v(ixi^s,1:
ndir)
1386 v(ixo^s,idir) = w(ixo^s,
mom(idir)) / w(ixo^s,
rho_)
1389 end subroutine hd_get_v
1392 subroutine hd_get_cmax(w, x, ixI^L, ixO^L, idim, cmax)
1397 integer,
intent(in) :: ixi^
l, ixo^
l, idim
1399 double precision,
intent(in) :: w(ixi^s, nw), x(ixi^s, 1:
ndim)
1400 double precision,
intent(inout) :: cmax(ixi^s)
1401 double precision :: csound2(ixi^s)
1404 call eos%get_csound2(w, x, ixi^
l, ixo^
l, csound2)
1405 cmax(ixo^s)=dabs(w(ixo^s,
mom(idim)))+dsqrt(csound2(ixo^s))
1412 cmax(ixo^s)=dabs(w(ixo^s,
mom(idim)))+dsqrt(eos%gamma*cmax(ixo^s)/w(ixo^s,
rho_))
1418 end subroutine hd_get_cmax
1421 subroutine hd_get_tcutoff(ixI^L,ixO^L,w,x,tco_local,Tmax_local)
1427 integer,
intent(in) :: ixi^
l,ixo^
l
1428 double precision,
intent(in) :: x(ixi^s,1:
ndim)
1430 double precision,
intent(inout) :: w(ixi^s,1:nw)
1431 double precision,
intent(out) :: tco_local, tmax_local
1433 double precision,
parameter :: trac_delta=0.25d0
1434 double precision :: tmp1(ixi^s),te(ixi^s),lts(ixi^s), r(ixi^s)
1435 double precision :: ltrc,ltrp
1436 integer :: jxo^
l,hxo^
l
1437 integer :: jxp^
l,hxp^
l,ixp^
l
1438 logical :: lrlt(ixi^s)
1440 double precision :: dtdx, l_t, a_coeff, l1, cooling, net_cool
1441 double precision :: kappa_par, disc, kappa_trac, kappa_eff, tcoff_eff
1442 double precision :: dx_over_delta, v_abs, v_n, gnorm, dl_eff
1443 double precision :: q_heat(ixi^s), ne(ixi^s), nh_arr(ixi^s)
1444 double precision :: gradtd(ixi^s,1:
ndim), nhat(1:
ndim)
1445 integer :: ix^
d, idims
1447 call eos%get_Rfactor(w,x,ixi^
l,ixi^
l,r)
1448 te(ixi^s)=w(ixi^s,
p_)/(r(ixi^s)*w(ixi^s,
rho_))
1450 if (eos%eos_type ==
'LTE')
then
1451 te(ixi^s) = w(ixi^s,
te_)
1455 tmax_local=maxval(te(ixo^s))
1465 lts(ixo^s)=0.5d0*dabs(te(jxo^s)-te(hxo^s))/te(ixo^s)
1467 where(lts(ixo^s) > trac_delta)
1470 if(any(lrlt(ixo^s)))
then
1471 tco_local=maxval(te(ixo^s), mask=lrlt(ixo^s))
1482 lts(ixp^s)=0.5d0*abs(te(jxp^s)-te(hxp^s))/te(ixp^s)
1483 lts(ixp^s)=max(one, (exp(lts(ixp^s))/ltrc)**ltrp)
1485 lts(ixo^s)=0.25d0*(lts(jxo^s)+two*lts(ixo^s)+lts(hxo^s))
1486 block%wextra(ixo^s,
tcoff_)=te(ixo^s)*lts(ixo^s)**0.4d0
1491 block%wextra(ixomin1-1,
tcoff_)=te(ixomin1-1)*lts(ixomin1-1)**0.4d0
1492 block%wextra(ixomax1+1,
tcoff_)=te(ixomax1+1)*lts(ixomax1+1)**0.4d0
1507 call eos%get_ne_nH(ixi^
l, ixp^
l, w, x, ne, nh_arr)
1513 do ix1=ixpmin1,ixpmax1
1515 dtdx = abs(te(ix1+1) - te(ix1-1)) / (2.d0 *
dxlevel(1))
1517 if(dtdx < smalldouble .or. te(ix1) <
tc_fl%trac_T_floor)
then
1521 l_t = te(ix1) / dtdx
1525 v_abs = abs(w(ix1,m1_))
1526 a_coeff = 2.5d0 * w(ix1,
p_) * v_abs / te(ix1)
1530 if(te(ix1) >
rc_fl%tcoolmin .and. te(ix1) <
rc_fl%tcoolmax)
then
1531 call findl(te(ix1), l1,
rc_fl); cooling = ne(ix1) * nh_arr(ix1) * l1
1532 else if(te(ix1) >=
rc_fl%tcoolmax)
then
1539 net_cool = abs(cooling - q_heat(ix1))
1542 kappa_par =
tc_fl%tc_k_para * te(ix1)**2.5d0
1545 disc = a_coeff**2 + 4.d0 *
tc_fl%tc_k_para * te(ix1)**1.5d0 * net_cool
1547 if(l_t <= 2.d0 * dx_over_delta)
then
1549 kappa_trac = (a_coeff + dsqrt(disc)) / (2.d0 / dx_over_delta)
1552 kappa_trac = dsqrt(4.d0 *
tc_fl%tc_k_para * te(ix1)**1.5d0 * net_cool) &
1553 / (2.d0 / dx_over_delta)
1557 kappa_eff = max(kappa_trac, kappa_par)
1560 tcoff_eff = (kappa_eff /
tc_fl%tc_k_para)**0.4d0
1563 block%wextra(ix1,
tcoff_) = max(te(ix1), tcoff_eff)
1571 call eos%get_ne_nH(ixi^
l, ixo^
l, w, x, ne, nh_arr)
1575 call gradient(te,ixi^
l,ixo^
l,idims,gradtd(ixi^s,idims))
1577 {
do ix^db=ixomin^db,ixomax^db\}
1578 gnorm = dsqrt(^
d&gradtd({ix^
d},^
d)**2+ )
1579 if(gnorm < smalldouble .or. te(ix^
d) <
tc_fl%trac_T_floor)
then
1583 ^
d&nhat(^
d)=gradtd({ix^
d},^
d)/gnorm\
1585 dl_eff = 1.d0/dsqrt(^
d&(nhat(^
d)/
block%ds({ix^
d},^
d))**2+ )
1586 l_t = te(ix^
d)/gnorm
1588 v_n = ^
d&w({ix^
d},
mom(^
d))*nhat(^
d)+
1589 a_coeff = 2.5d0*w(ix^
d,
p_)*dabs(v_n)/te(ix^
d)
1593 if(te(ix^
d) >
rc_fl%tcoolmin .and. te(ix^
d) <
rc_fl%tcoolmax)
then
1594 call findl(te(ix^
d),l1,
rc_fl); cooling = l1*ne(ix^
d)*nh_arr(ix^
d)
1595 else if(te(ix^
d) >=
rc_fl%tcoolmax)
then
1600 net_cool = dabs(cooling-q_heat(ix^
d))
1601 kappa_par =
tc_fl%tc_k_para*te(ix^
d)**2.5d0
1602 disc = a_coeff**2 + 4.d0*
tc_fl%tc_k_para*te(ix^
d)**1.5d0*net_cool
1604 if(l_t <= 2.d0*dx_over_delta)
then
1605 kappa_trac = (a_coeff+dsqrt(disc))/(2.d0/dx_over_delta)
1607 kappa_trac = dsqrt(4.d0*
tc_fl%tc_k_para*te(ix^
d)**1.5d0*net_cool)/(2.d0/dx_over_delta)
1609 kappa_eff = max(kappa_trac,kappa_par)
1610 tcoff_eff = (kappa_eff/
tc_fl%tc_k_para)**0.4d0
1616 call mpistop(
"hd_trac_type not allowed")
1618 end subroutine hd_get_tcutoff
1621 subroutine hd_get_cbounds(wLC, wRC, wLp, wRp, x, ixI^L, ixO^L, idim,Hspeed,cmax, cmin)
1627 integer,
intent(in) :: ixi^
l, ixo^
l, idim
1629 double precision,
intent(in) :: wlc(ixi^s,
nw), wrc(ixi^s,
nw)
1631 double precision,
intent(in) :: wlp(ixi^s,
nw), wrp(ixi^s,
nw)
1632 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1634 double precision,
intent(inout),
optional :: cmin(ixi^s,1:
number_species)
1637 double precision :: wmean(ixi^s,
nw)
1638 double precision,
dimension(ixI^S) :: umean, dmean, csoundl, csoundr, tmp1,tmp2,tmp3
1646 tmp1(ixo^s)=dsqrt(wlp(ixo^s,
rho_))
1647 tmp2(ixo^s)=dsqrt(wrp(ixo^s,
rho_))
1648 tmp3(ixo^s)=1.d0/(tmp1(ixo^s)+tmp2(ixo^s))
1649 umean(ixo^s)=(wlp(ixo^s,
mom(idim))*tmp1(ixo^s)+wrp(ixo^s,
mom(idim))*tmp2(ixo^s))*tmp3(ixo^s)
1652 call eos%get_csound2(wlp, x, ixi^
l, ixo^
l, csoundl)
1653 call eos%get_csound2(wrp, x, ixi^
l, ixo^
l, csoundr)
1655 csoundl(ixo^s)=csoundl(ixo^s)+(4.0d0/9.0d0)*wlp(ixo^s,
r_e)/wlp(ixo^s,
rho_)
1656 csoundr(ixo^s)=csoundr(ixo^s)+(4.0d0/9.0d0)*wrp(ixo^s,
r_e)/wrp(ixo^s,
rho_)
1664 dmean(ixo^s) = (tmp1(ixo^s)*csoundl(ixo^s)+tmp2(ixo^s)*csoundr(ixo^s)) * &
1665 tmp3(ixo^s) + 0.5d0*tmp1(ixo^s)*tmp2(ixo^s)*tmp3(ixo^s)**2 * &
1666 (wrp(ixo^s,
mom(idim))-wlp(ixo^s,
mom(idim)))**2
1668 dmean(ixo^s)=dsqrt(dmean(ixo^s))
1669 if(
present(cmin))
then
1670 cmin(ixo^s,1)=umean(ixo^s)-dmean(ixo^s)
1671 cmax(ixo^s,1)=umean(ixo^s)+dmean(ixo^s)
1673 {
do ix^db=ixomin^db,ixomax^db\}
1674 cmin(ix^
d,1)=sign(one,cmin(ix^
d,1))*max(abs(cmin(ix^
d,1)),hspeed(ix^
d,1))
1675 cmax(ix^
d,1)=sign(one,cmax(ix^
d,1))*max(abs(cmax(ix^
d,1)),hspeed(ix^
d,1))
1679 cmax(ixo^s,1)=dabs(umean(ixo^s))+dmean(ixo^s)
1683 wmean(ixo^s,1:nwflux)=0.5d0*(wlc(ixo^s,1:nwflux)+wrc(ixo^s,1:nwflux))
1684 call dust_get_cmax(wmean, x, ixi^l, ixo^l, idim, cmax, cmin)
1695 wmean(ixo^s,1:nwflux)=0.5d0*(wlc(ixo^s,1:nwflux)+wrc(ixo^s,1:nwflux))
1696 tmp1(ixo^s)=wmean(ixo^s,
mom(idim))/wmean(ixo^s,
rho_)
1698 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_)
1700 csoundr(ixo^s) = dsqrt(csoundr(ixo^s))
1702 if(
present(cmin))
then
1703 cmax(ixo^s,1)=max(tmp1(ixo^s)+csoundr(ixo^s),zero)
1704 cmin(ixo^s,1)=min(tmp1(ixo^s)-csoundr(ixo^s),zero)
1705 if(h_correction)
then
1706 {
do ix^db=ixomin^db,ixomax^db\}
1707 cmin(ix^d,1)=sign(one,cmin(ix^d,1))*max(abs(cmin(ix^d,1)),hspeed(ix^d,1))
1708 cmax(ix^d,1)=sign(one,cmax(ix^d,1))*max(abs(cmax(ix^d,1)),hspeed(ix^d,1))
1712 cmax(ixo^s,1)=dabs(tmp1(ixo^s))+csoundr(ixo^s)
1716 call dust_get_cmax(wmean, x, ixi^l, ixo^l, idim, cmax, cmin)
1721 call eos%get_csound2(wlp, x, ixi^l, ixo^l, csoundl)
1722 call eos%get_csound2(wrp, x, ixi^l, ixo^l, csoundr)
1724 csoundl(ixo^s)=csoundl(ixo^s)+(4.0d0/9.0d0)*wlp(ixo^s,
r_e)/wlp(ixo^s,
rho_)
1725 csoundr(ixo^s)=csoundr(ixo^s)+(4.0d0/9.0d0)*wrp(ixo^s,
r_e)/wrp(ixo^s,
rho_)
1732 csoundl(ixo^s)=max(dsqrt(csoundl(ixo^s)),dsqrt(csoundr(ixo^s)))
1733 if(
present(cmin))
then
1734 cmin(ixo^s,1)=min(wlp(ixo^s,
mom(idim)),wrp(ixo^s,
mom(idim)))-csoundl(ixo^s)
1735 cmax(ixo^s,1)=max(wlp(ixo^s,
mom(idim)),wrp(ixo^s,
mom(idim)))+csoundl(ixo^s)
1736 if(h_correction)
then
1737 {
do ix^db=ixomin^db,ixomax^db\}
1738 cmin(ix^d,1)=sign(one,cmin(ix^d,1))*max(abs(cmin(ix^d,1)),hspeed(ix^d,1))
1739 cmax(ix^d,1)=sign(one,cmax(ix^d,1))*max(abs(cmax(ix^d,1)),hspeed(ix^d,1))
1743 cmax(ixo^s,1)=max(wlp(ixo^s,
mom(idim)),wrp(ixo^s,
mom(idim)))+csoundl(ixo^s)
1746 wmean(ixo^s,1:nwflux)=0.5d0*(wlc(ixo^s,1:nwflux)+wrc(ixo^s,1:nwflux))
1747 call dust_get_cmax(wmean, x, ixi^l, ixo^l, idim, cmax, cmin)
1756 call eos%get_csound2(wlp, x, ixi^l, ixo^l, csoundl)
1757 call eos%get_csound2(wrp, x, ixi^l, ixo^l, csoundr)
1759 csoundl(ixo^s)=csoundl(ixo^s)+(4.0d0/9.0d0)*wlp(ixo^s,
r_e)/wlp(ixo^s,
rho_)
1760 csoundr(ixo^s)=csoundr(ixo^s)+(4.0d0/9.0d0)*wrp(ixo^s,
r_e)/wrp(ixo^s,
rho_)
1766 csoundl(ixo^s) = dsqrt(csoundl(ixo^s))
1767 csoundr(ixo^s) = dsqrt(csoundr(ixo^s))
1768 if(
present(cmin))
then
1769 {
do ix^db=ixomin^db,ixomax^db\}
1772 tmp1(ix^d) = 0.25d0*(wlp(ix^d,
rho_)+wrp(ix^d,
rho_)) &
1773 *(csoundl(ix^d)+csoundr(ix^d))
1775 tmp2(ix^d) = max(zero, 0.5d0*(wlp(ix^d,
e_)+wrp(ix^d,
e_)) &
1776 + 0.5d0*(wlp(ix^d,
mom(idim))-wrp(ix^d,
mom(idim))) &
1779 if(tmp2(ix^d) > wlp(ix^d,
e_) .and. wlp(ix^d,
e_) > zero)
then
1781 tmp3(ix^d) = csoundl(ix^d)**2*wlp(ix^d,
rho_)/wlp(ix^d,
e_)
1782 dmean(ix^d) = dsqrt(1.0d0 + (tmp3(ix^d)+1.0d0) &
1783 /(2.0d0*tmp3(ix^d)) &
1784 *(tmp2(ix^d)/wlp(ix^d,
e_) - 1.0d0))
1789 cmin(ix^d,1) = wlp(ix^d,
mom(idim)) - csoundl(ix^d)*dmean(ix^d)
1791 if(tmp2(ix^d) > wrp(ix^d,
e_) .and. wrp(ix^d,
e_) > zero)
then
1793 tmp3(ix^d) = csoundr(ix^d)**2*wrp(ix^d,
rho_)/wrp(ix^d,
e_)
1794 dmean(ix^d) = dsqrt(1.0d0 + (tmp3(ix^d)+1.0d0) &
1795 /(2.0d0*tmp3(ix^d)) &
1796 *(tmp2(ix^d)/wrp(ix^d,
e_) - 1.0d0))
1801 cmax(ix^d,1) = wrp(ix^d,
mom(idim)) + csoundr(ix^d)*dmean(ix^d)
1803 if(h_correction)
then
1804 {
do ix^db=ixomin^db,ixomax^db\}
1805 cmin(ix^d,1)=sign(one,cmin(ix^d,1))*max(abs(cmin(ix^d,1)),hspeed(ix^d,1))
1806 cmax(ix^d,1)=sign(one,cmax(ix^d,1))*max(abs(cmax(ix^d,1)),hspeed(ix^d,1))
1810 {
do ix^db=ixomin^db,ixomax^db\}
1811 tmp1(ix^d) = 0.25d0*(wlp(ix^d,
rho_)+wrp(ix^d,
rho_)) &
1812 *(csoundl(ix^d)+csoundr(ix^d))
1813 tmp2(ix^d) = max(zero, 0.5d0*(wlp(ix^d,
e_)+wrp(ix^d,
e_)) &
1814 + 0.5d0*(wlp(ix^d,
mom(idim))-wrp(ix^d,
mom(idim))) &
1816 if(tmp2(ix^d) > wlp(ix^d,
e_) .and. wlp(ix^d,
e_) > zero)
then
1817 tmp3(ix^d) = csoundl(ix^d)**2*wlp(ix^d,
rho_)/wlp(ix^d,
e_)
1818 dmean(ix^d) = dsqrt(1.0d0 + (tmp3(ix^d)+1.0d0) &
1819 /(2.0d0*tmp3(ix^d)) &
1820 *(tmp2(ix^d)/wlp(ix^d,
e_) - 1.0d0))
1824 umean(ix^d) = dabs(wlp(ix^d,
mom(idim)) &
1825 - csoundl(ix^d)*dmean(ix^d))
1826 if(tmp2(ix^d) > wrp(ix^d,
e_) .and. wrp(ix^d,
e_) > zero)
then
1827 tmp3(ix^d) = csoundr(ix^d)**2*wrp(ix^d,
rho_)/wrp(ix^d,
e_)
1828 dmean(ix^d) = dsqrt(1.0d0 + (tmp3(ix^d)+1.0d0) &
1829 /(2.0d0*tmp3(ix^d)) &
1830 *(tmp2(ix^d)/wrp(ix^d,
e_) - 1.0d0))
1834 cmax(ix^d,1) = max(umean(ix^d), &
1835 wrp(ix^d,
mom(idim))+csoundr(ix^d)*dmean(ix^d))
1839 wmean(ixo^s,1:nwflux)=0.5d0*(wlc(ixo^s,1:nwflux)+wrc(ixo^s,1:nwflux))
1840 call dust_get_cmax(wmean, x, ixi^l, ixo^l, idim, cmax, cmin)
1844 end subroutine hd_get_cbounds
1856 integer,
intent(in) :: ixi^
l, ixo^
l
1857 double precision,
intent(in) :: w(ixi^s,nw)
1858 double precision,
intent(in) :: x(ixi^s,1:
ndim)
1859 double precision,
intent(out) :: csound2(ixi^s)
1860 double precision :: pthermal(ixi^s)
1861 double precision :: inv_rho, nh_val, pres, g1
1868 tab_g1 =
eos%ionE .and.
eos%gamma1_method /=
'constant'
1869 {
do ix^db=ixomin^db,ixomax^db\}
1870 inv_rho = 1.0d0/w(ix^
d,
rho_)
1871 nh_val = w(ix^
d,
rho_)/
eos%nH2rhoFactor
1873 nh_val, dlog10(nh_val), inv_rho)
1876 csound2(ix^
d) = g1*pres*inv_rho
1879 call eos%get_thermal_pressure(w, x, ixi^l, ixo^l, pthermal)
1880 csound2(ixo^s) = eos%gamma * pthermal(ixo^s) / w(ixo^s,
rho_)
1882 call eos_timer_stop(timeeos_csound)
1892 integer,
intent(in) :: ixi^
l, ixo^
l
1893 double precision,
intent(in) :: w(ixi^s, nw), x(ixi^s,1:
ndim)
1894 double precision,
intent(out):: csound(ixi^s)
1896 double precision :: wprim(ixi^s, nw)
1898 wprim(ixi^s,1:nw)=w(ixi^s,1:nw)
1899 call eos%to_primitive(ixi^
l,ixo^
l,wprim,x)
1910 integer,
intent(in) :: ixi^
l, ixo^
l
1911 double precision,
intent(in) :: w(ixi^s, nw), x(ixi^s,1:
ndim)
1912 double precision,
intent(out):: csound(ixi^s)
1915 double precision :: inv_rho
1916 double precision :: prad_tensor(ixi^s, 1:
ndim, 1:
ndim)
1917 double precision :: prad_max(ixi^s)
1925 prad_tensor(ixo^s,idim,idim)=w(ixo^s,
r_e)/3.0d0
1929 {
do ix^db=ixomin^db,ixomax^db \}
1930 inv_rho=1.d0/w(ix^
d,
rho_)
1931 prad_max(ix^
d) = (4.0d0/3.0d0)*maxval(prad_tensor(ix^
d,:,:))
1932 csound(ix^
d)=(eos%gamma*w(ix^
d,
p_)+prad_max(ix^
d))*inv_rho
1935 if(minval(csound(ixo^s))<smalldouble)
then
1936 print *,
'issue with squared speed and rad pressure'
1937 print *,minval(csound(ixo^s))
1938 print *,minval(prad_max(ixo^s))
1939 call mpistop(
"negative squared speed in get_csrad2 for dt")
1950 integer,
intent(in) :: ixi^
l, ixo^
l
1951 double precision,
intent(in) :: w(ixi^s, 1:nw)
1952 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1953 double precision,
intent(out):: prad(ixi^s, 1:
ndim, 1:
ndim)
1963 integer,
intent(in) :: ixi^
l, ixo^
l
1964 double precision,
intent(in) :: w(ixi^s, 1:nw)
1965 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1966 double precision,
intent(out):: pth_plus_prad(ixi^s)
1968 double precision :: wprim(ixi^s, 1:nw)
1969 double precision :: prad_tensor(ixi^s, 1:
ndim, 1:
ndim)
1970 double precision :: prad_max(ixi^s)
1973 wprim(ixi^s,1:nw)=w(ixi^s,1:nw)
1974 call eos%to_primitive(ixi^
l,ixo^
l,wprim,x)
1976 {
do ix^
d = ixomin^
d,ixomax^
d\}
1977 prad_max(ix^
d) = maxval(prad_tensor(ix^
d,:,:))
1979 pth_plus_prad(ixo^s) = wprim(ixo^s,
p_) + prad_max(ixo^s)
1987 integer,
intent(in) :: ixi^
l, ixo^
l
1988 double precision,
intent(in) :: w(ixi^s, 1:nw)
1989 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
1990 double precision,
intent(out):: trad(ixi^s)
1999 integer,
intent(in) :: ixi^
l, ixo^
l
2000 double precision,
intent(in) :: w(ixi^s, 1:nw)
2001 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
2002 double precision,
intent(out):: res(ixi^s)
2004 double precision :: r(ixi^s)
2006 call eos%get_Rfactor(w,x,ixi^
l,ixo^
l,r)
2007 call eos%get_thermal_pressure(w, x, ixi^
l, ixo^
l, res)
2008 res(ixo^s)=res(ixo^s)/(r(ixo^s)*w(ixo^s,
rho_))
2012 subroutine hd_get_temperature_from_eint(w, x, ixI^L, ixO^L, res)
2014 integer,
intent(in) :: ixi^
l, ixo^
l
2015 double precision,
intent(in) :: w(ixi^s, 1:nw)
2016 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
2017 double precision,
intent(out):: res(ixi^s)
2019 double precision :: r(ixi^s)
2021 call eos%get_Rfactor(w,x,ixi^
l,ixo^
l,r)
2022 res(ixo^s) = (eos%gamma - 1.0d0) * w(ixo^s,
e_)/(w(ixo^s,
rho_)*r(ixo^s))
2023 end subroutine hd_get_temperature_from_eint
2026 subroutine hd_get_flux(wC, w, x, ixI^L, ixO^L, idim, f)
2030 integer,
intent(in) :: ixi^
l, ixo^
l, idim
2032 double precision,
intent(in) :: wc(ixi^s, 1:nw)
2034 double precision,
intent(in) :: w(ixi^s, 1:nw)
2035 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
2036 double precision,
intent(out) :: f(ixi^s, nwflux)
2038 double precision :: pth(ixi^s)
2042 {
do ix^db=ixomin^db,ixomax^db\}
2058 {
do ix^db=ixomin^db,ixomax^db\}
2063 call eos%get_thermal_pressure(wc, x, ixi^l, ixo^l, pth)
2064 {
do ix^db=ixomin^db,ixomax^db\}
2067 ^
c&f(ix^d,
m^
c_)=w(ix^d,
mom(idim))*wc(ix^d,
m^
c_)\
2068 f(ix^d,
mom(idim))=f(ix^d,
mom(idim))+pth(ix^d)
2073 {
do ix^db=ixomin^db,ixomax^db\}
2075 f(ix^d,
r_e)=w(ix^d,
mom(idim))*wc(ix^d,
r_e)
2084 f(ixo^s,
fip_) = w(ixo^s,
mom(idim)) * wc(ixo^s,
fip_)
2089 call dust_get_flux_prim(w, x, ixi^l, ixo^l, idim, f)
2092 end subroutine hd_get_flux
2099 subroutine hd_add_source_geom(qdt, dtfactor, ixI^L, ixO^L, wCT, wprim, w, x)
2105 integer,
intent(in) :: ixi^
l, ixo^
l
2106 double precision,
intent(in) :: qdt, dtfactor, x(ixi^s, 1:
ndim)
2107 double precision,
intent(inout) :: wct(ixi^s, 1:nw), wprim(ixi^s,1:nw),w(ixi^s, 1:nw)
2108 double precision :: pth(ixi^s),
source(ixi^s), minrho
2109 integer :: iw,idir, h1x^
l{^nooned, h2x^
l}
2110 integer :: mr_,mphi_
2111 integer :: irho, ifluid, n_fluids
2112 double precision :: exp_factor(ixi^s), del_exp_factor(ixi^s), exp_factor_primitive(ixi^s)
2134 source(ixo^s) =
source(ixo^s)*del_exp_factor(ixo^s)/exp_factor(ixo^s)
2138 do ifluid = 0, n_fluids-1
2140 if (ifluid == 0)
then
2164 where (wct(ixo^s, irho) > minrho)
2165 source(ixo^s) =
source(ixo^s) + wct(ixo^s,mphi_)*wprim(ixo^s,mphi_)
2166 w(ixo^s, mr_) = w(ixo^s, mr_) + qdt*
source(ixo^s)/x(ixo^s,
r_)
2169 where (wct(ixo^s, irho) > minrho)
2170 source(ixo^s) = -wct(ixo^s, mphi_) * wprim(ixo^s, mr_)
2171 w(ixo^s, mphi_) = w(ixo^s, mphi_) + qdt *
source(ixo^s) / x(ixo^s,
r_)
2175 w(ixo^s, mr_) = w(ixo^s, mr_) + qdt *
source(ixo^s) / x(ixo^s,
r_)
2180 call mpistop(
"Dust geom source terms not implemented yet with spherical geometries")
2184 h1x^
l=ixo^
l-
kr(1,^
d); {^nooned h2x^
l=ixo^
l-
kr(2,^
d);}
2186 pth(ixo^s)=wprim(ixo^s,
p_)
2195 source(ixo^s) = pth(ixo^s) * x(ixo^s, 1) &
2196 *(
block%surfaceC(ixo^s, 1) -
block%surfaceC(h1x^s, 1)) &
2197 /
block%dvolume(ixo^s)
2201 w(ixo^s, mr_) = w(ixo^s, mr_) + qdt *
source(ixo^s) / x(ixo^s, 1)
2205 source(ixo^s) = pth(ixo^s) * x(ixo^s, 1) &
2206 * (
block%surfaceC(ixo^s, 2) -
block%surfaceC(h2x^s, 2)) &
2207 /
block%dvolume(ixo^s)
2209 source(ixo^s) =
source(ixo^s) + (wprim(ixo^s,
mom(3))**2 * wprim(ixo^s,
rho_)) / tan(x(ixo^s, 2))
2211 source(ixo^s) =
source(ixo^s) - (wprim(ixo^s,
mom(2)) * wprim(ixo^s, mr_)) * wprim(ixo^s,
rho_)
2212 w(ixo^s,
mom(2)) = w(ixo^s,
mom(2)) + qdt *
source(ixo^s) / x(ixo^s, 1)
2216 source(ixo^s) = -(wprim(ixo^s,
mom(3)) * wprim(ixo^s, mr_)) * wprim(ixo^s,
rho_)&
2217 - (wprim(ixo^s,
mom(2)) * wprim(ixo^s,
mom(3))) * wprim(ixo^s,
rho_) / tan(x(ixo^s, 2))
2218 w(ixo^s,
mom(3)) = w(ixo^s,
mom(3)) + qdt *
source(ixo^s) / x(ixo^s, 1)
2225 call mpistop(
"Rotating frame not implemented yet with dust")
2231 end subroutine hd_add_source_geom
2234 subroutine hd_add_source(qdt,dtfactor, ixI^L,ixO^L,wCT,wCTprim,w,x,qsourcesplit,active)
2243 integer,
intent(in) :: ixi^
l, ixo^
l
2244 double precision,
intent(in) :: qdt, dtfactor
2245 double precision,
intent(in) :: wct(ixi^s, 1:nw),wctprim(ixi^s,1:nw), x(ixi^s, 1:
ndim)
2246 double precision,
intent(inout) :: w(ixi^s, 1:nw)
2247 logical,
intent(in) :: qsourcesplit
2248 logical,
intent(inout) :: active
2250 double precision :: gravity_field(ixi^s, 1:
ndim)
2251 integer :: idust, idim, ix^
d
2267 qsourcesplit,active,
rc_fl)
2292 + qdt * gravity_field(ixo^s, idim) * wct(ixo^s,
dust_rho(idust))
2304 call hd_add_radiation_source(qdt,ixi^
l,ixo^
l,wct,wctprim,w,x,qsourcesplit,active)
2307 if(eos%eos_type ==
'PI')
then
2308 if(.not.qsourcesplit)
then
2310 call eos%update_eos(ixi^
l,ixo^
l,w,x)
2317 call add_hypertc_source(qdt,ixi^
l,ixo^
l,wct,w,x,wctprim)
2320 end subroutine hd_add_source
2342 subroutine add_hypertc_source(qdt,ixI^L,ixO^L,wCT,w,x,wCTprim)
2345 integer,
intent(in) :: ixi^
l,ixo^
l
2346 double precision,
intent(in) :: qdt
2347 double precision,
dimension(ixI^S,1:ndim),
intent(in) :: x
2348 double precision,
dimension(ixI^S,1:nw),
intent(in) :: wct,wctprim
2349 double precision,
dimension(ixI^S,1:nw),
intent(inout) :: w
2351 double precision :: te(ixi^s), rfactor(ixi^s)
2352 double precision :: qf_half(ixglo1:ixghi1)
2353 double precision :: qf_full(ixglo1:ixghi1)
2354 double precision :: t_l, t_r, t_cool_l, t_cool_r, t_kap_l, t_kap_r
2355 double precision :: kappa_l, kappa_r, kappa_f
2356 double precision :: sigma_t7_f, dt_face, dx_f
2357 double precision :: rho_f, p_l, p_r, p_f, cs_f, q_sat, q_sp, q_sp_star
2358 double precision :: f_sat, eint_loc_l, eint_loc_r, eint_loc_f
2359 double precision :: qn_face, tau_f, ratio, decay, ave_factor
2360 double precision :: q_face_max
2361 double precision,
parameter :: ratio_cap = 50.0d0
2362 integer :: ix1, nface_lo, nface_hi
2366 te(ixi^s) = wct(ixi^s,
te_)
2368 call eos%get_Rfactor(wctprim, x, ixi^
l, ixi^
l, rfactor)
2369 te(ixi^s) = wctprim(ixi^s,
p_) / (rfactor(ixi^s) * wctprim(ixi^s,
rho_))
2373 nface_lo = ixomin1 - 1
2378 do ix1 = nface_lo, nface_hi
2389 t_kap_l = max(t_l, t_cool_l)
2390 t_kap_r = max(t_r, t_cool_r)
2396 if (kappa_l + kappa_r > smalldouble)
then
2397 kappa_f = 2.0d0 * kappa_l * kappa_r / (kappa_l + kappa_r)
2402 dx_f = 0.5d0 * (
block%ds(ix1, 1) +
block%ds(ix1 + 1, 1))
2404 q_sp = -kappa_f * dt_face / dx_f
2407 rho_f = 0.5d0 * (wctprim(ix1,
rho_) + wctprim(ix1 + 1,
rho_))
2408 p_l = wctprim(ix1,
p_)
2409 p_r = wctprim(ix1 + 1,
p_)
2410 p_f = 0.5d0 * (p_l + p_r)
2411 cs_f = dsqrt(max(smalldouble, eos%gamma * p_f / max(rho_f, smalldouble)))
2415 q_sat = 1.5d0 * rho_f * (p_f / max(rho_f, smalldouble))**1.5d0
2416 if (q_sat > smalldouble)
then
2417 f_sat = 1.0d0 / (1.0d0 + dabs(q_sp) / q_sat)
2421 q_sp_star = f_sat * q_sp
2427 eint_loc_l = wct(ix1,
e_) &
2428 - 0.5d0 * wct(ix1, m1_)**2 / max(wct(ix1,
rho_), smalldouble)
2429 eint_loc_r = wct(ix1 + 1,
e_) &
2430 - 0.5d0 * wct(ix1 + 1, m1_)**2 / max(wct(ix1 + 1,
rho_), smalldouble)
2431 eint_loc_l = max(eint_loc_l, smalldouble)
2432 eint_loc_r = max(eint_loc_r, smalldouble)
2433 eint_loc_f = 0.5d0 * (eint_loc_l + eint_loc_r)
2438 sigma_t7_f = kappa_f * 0.5d0 * (t_l + t_r)
2439 tau_f = max(4.0d0 *
dt, &
2443 ratio = min(qdt / tau_f, ratio_cap)
2444 decay = dexp(-ratio)
2445 if (ratio > 1.0
d-6)
then
2446 ave_factor = (1.0d0 - decay) / ratio
2448 ave_factor = 1.0d0 - 0.5d0 * ratio + ratio * ratio / 6.0d0
2451 qn_face = 0.5d0 * (wct(ix1,
q_) + wct(ix1 + 1,
q_))
2453 qf_full(ix1) = q_sp_star + (qn_face - q_sp_star) * decay
2454 qf_half(ix1) = q_sp_star + (qn_face - q_sp_star) * ave_factor
2458 block%ds(ix1, 1) / max(qdt, smalldouble)
2459 qf_half(ix1) = sign(min(dabs(qf_half(ix1)), q_face_max), qf_half(ix1))
2463 do ix1 = ixomin1, ixomax1
2464 w(ix1,
e_) = w(ix1,
e_) &
2465 - qdt * (qf_half(ix1) - qf_half(ix1 - 1)) /
block%ds(ix1, 1)
2466 w(ix1,
q_) = 0.5d0 * (qf_full(ix1 - 1) + qf_full(ix1))
2470 end subroutine add_hypertc_source
2472 subroutine hd_add_radiation_source(qdt,ixI^L,ixO^L,wCT,wCTprim,w,x,qsourcesplit,active)
2478 integer,
intent(in) :: ixi^
l, ixo^
l
2479 double precision,
intent(in) :: qdt, x(ixi^s,1:
ndim)
2480 double precision,
intent(in) :: wct(ixi^s,1:nw),wctprim(ixi^s,1:nw)
2481 double precision,
intent(inout) :: w(ixi^s,1:nw)
2482 logical,
intent(in) :: qsourcesplit
2483 logical,
intent(inout) :: active
2489 end subroutine hd_add_radiation_source
2491 subroutine hd_get_dt(wprim, ixI^L, ixO^L, dtnew, dx^D, x)
2499 integer,
intent(in) :: ixi^
l, ixo^
l
2500 double precision,
intent(in) ::
dx^
d, x(ixi^s, 1:^nd)
2501 double precision,
intent(in) :: wprim(ixi^s, 1:nw)
2502 double precision,
intent(inout) :: dtnew
2526 end subroutine hd_get_dt
2531 subroutine hd_fld_implicit_update(dtfactor,qdt,qtC,psa,psb)
2536 double precision,
intent(in) :: qdt
2537 double precision,
intent(in) :: qtc
2538 double precision,
intent(in) :: dtfactor
2541 end subroutine hd_fld_implicit_update
2543 subroutine hd_fld_evaluate_implicit(qtC,psa)
2547 double precision,
intent(in) :: qtc
2550 end subroutine hd_fld_evaluate_implicit
2554 integer,
intent(in) :: ixi^
l, ixo^
l
2555 double precision,
intent(in) :: w(ixi^s, nw)
2556 double precision :: ke(ixo^s)
2557 double precision,
intent(in),
optional :: inv_rho(ixo^s)
2559 if (
present(inv_rho))
then
2560 ke = 0.5d0 * sum(w(ixo^s,
mom(:))**2, dim=
ndim+1) * inv_rho
2562 ke = 0.5d0 * sum(w(ixo^s,
mom(:))**2, dim=
ndim+1) / w(ixo^s,
rho_)
2566 function hd_inv_rho(w, ixI^L, ixO^L)
result(inv_rho)
2568 integer,
intent(in) :: ixi^
l, ixo^
l
2569 double precision,
intent(in) :: w(ixi^s, nw)
2570 double precision :: inv_rho(ixo^s)
2573 inv_rho = 1.0d0 / w(ixo^s,
rho_)
2574 end function hd_inv_rho
2583 logical,
intent(in) :: primitive
2584 integer,
intent(in) :: ixi^
l,ixo^
l
2585 double precision,
intent(inout) :: w(ixi^s,1:nw)
2586 double precision,
intent(in) :: x(ixi^s,1:
ndim)
2587 character(len=*),
intent(in) :: subname
2590 logical :: flag(ixi^s,1:nw)
2600 where(flag(ixo^s,
rho_)) w(ixo^s,
mom(idir)) = 0.0d0
2622 where(flag(ixo^s,
e_))
2648 call eos%get_thermal_pressure(w, x, ixi^
l, ixo^
l, w(ixo^s,
p_))
2651 w(ixo^s,
mom(idir)) = w(ixo^s,
mom(idir))/w(ixo^s,
rho_)
2653 call eos%p_to_e(ixi^
l, ixo^
l, w, x)
2655 w(ixo^s,
mom(idir)) = w(ixo^s,
mom(idir))*w(ixo^s,
rho_)
2674 if(.not.primitive)
then
2678 call eos%get_thermal_pressure(w, x, ixi^
l, ixo^
l, w(ixo^s,
p_))
2683 w(ixo^s,
mom(idir)) = w(ixo^s,
mom(idir))/w(ixo^s,
rho_)
2690 if (
hd_fip)
call hd_bound_fip(primitive, ixi^
l, ixo^
l, w)
2713 subroutine hd_wb_prolong(ixI^L, ixO^L, w, x)
2717 integer,
intent(in) :: ixi^
l, ixo^
l
2718 double precision,
intent(inout) :: w(ixi^s, 1:nw)
2719 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
2721 double precision :: gravity_field(ixi^s, 1:
ndim)
2722 double precision :: wb_t(ixi^s), p_eq(ixi^s)
2723 double precision :: dx_idims
2724 double precision :: alpha(ixi^s), beta(ixi^s)
2726 integer :: ix1, ix_mid
2730 wb_t(ixo^s) = w(ixo^s,
p_) / w(ixo^s,
rho_)
2739 alpha(ixomin1:ixomax1) = 0.5d0 * dx_idims &
2740 * gravity_field(ixomin1:ixomax1, 1) / wb_t(ixomin1:ixomax1)
2743 ix_mid = (ixomin1 + ixomax1) / 2
2744 p_eq(ix_mid) = w(ix_mid,
p_)
2747 beta(ix_mid:ixomax1-1) = (1.0d0 + alpha(ix_mid:ixomax1-1)) &
2748 / (1.0d0 - alpha(ix_mid+1:ixomax1))
2749 do ix1 = ix_mid + 1, ixomax1
2750 p_eq(ix1) = p_eq(ix1 - 1) * beta(ix1 - 1)
2754 beta(ixomin1:ix_mid-1) = (1.0d0 - alpha(ixomin1+1:ix_mid)) &
2755 / (1.0d0 + alpha(ixomin1:ix_mid-1))
2756 do ix1 = ix_mid - 1, ixomin1, -1
2757 p_eq(ix1) = p_eq(ix1 + 1) * beta(ix1)
2761 w(ixomin1:ixomax1,
p_) = p_eq(ixomin1:ixomax1)
2762 w(ixomin1:ixomax1,
rho_) = p_eq(ixomin1:ixomax1) / wb_t(ixomin1:ixomax1)
2765 end subroutine hd_wb_prolong
2777 subroutine hd_wb_transform(ixI^L, ixO^L, idims, w, x, wb_phi, &
2782 integer,
intent(in) :: ixi^
l, ixo^
l, idims
2783 double precision,
intent(inout) :: w(ixi^s, 1:nw)
2784 double precision,
intent(in) :: x(ixi^s, 1:
ndim)
2785 double precision,
intent(out) :: wb_phi(ixi^s)
2786 double precision,
intent(out) :: wb_phi_face(ixi^s)
2787 double precision,
intent(out) :: wb_t(ixi^s)
2789 double precision :: gravity_field(ixi^s, 1:
ndim)
2790 double precision :: dx_idims
2791 double precision :: alpha(ixi^s), beta(ixi^s)
2797 wb_t(ixi^s) = w(ixi^s,
p_) / w(ixi^s,
rho_)
2811 alpha(iximin1:iximax1) = 0.5d0 * dx_idims &
2812 * gravity_field(iximin1:iximax1, idims) / wb_t(iximin1:iximax1)
2815 beta(iximin1:iximax1-1) = (1.0d0 + alpha(iximin1:iximax1-1)) &
2816 / (1.0d0 - alpha(iximin1+1:iximax1))
2819 wb_phi(iximin1) = w(iximin1,
p_)
2820 do ix1 = iximin1 + 1, iximax1
2821 wb_phi(ix1) = wb_phi(ix1 - 1) * beta(ix1 - 1)
2826 wb_phi_face(ixi^s) = wb_phi(ixi^s) * (1.0d0 + 0.5d0 * dx_idims * &
2827 gravity_field(ixi^s, idims) / wb_t(ixi^s))
2830 w(ixi^s,
rho_) = wb_t(ixi^s)
2831 w(ixi^s,
p_) = w(ixi^s,
p_) / wb_phi(ixi^s)
2833 end subroutine hd_wb_transform
2855 subroutine hd_wb_inverse(ixI^L, ixL^L, ixR^L, idims, wLp, wRp, w, &
2856 wb_phi, wb_phi_face, wb_T)
2859 integer,
intent(in) :: ixi^
l, ixl^
l, ixr^
l, idims
2860 double precision,
intent(inout) :: wlp(ixi^s, 1:nw), wrp(ixi^s, 1:nw)
2861 double precision,
intent(inout) :: w(ixi^s, 1:nw)
2862 double precision,
intent(in) :: wb_phi(ixi^s), wb_phi_face(ixi^s)
2863 double precision,
intent(in) :: wb_t(ixi^s)
2865 double precision :: t_shared(ixi^s)
2866 double precision :: t_face_l(ixi^s), t_face_r(ixi^s)
2867 double precision :: sigma(ixi^s), t_for_rhol(ixi^s), t_for_rhor(ixi^s)
2871 t_shared(iximin1:iximax1-1) = 0.5d0 * (wb_t(iximin1:iximax1-1) &
2872 + wb_t(iximin1+1:iximax1))
2873 t_shared(iximax1) = wb_t(iximax1)
2878 t_face_l(ixl^s) = wlp(ixl^s,
rho_)
2879 t_face_r(ixr^s) = wrp(ixr^s,
rho_)
2883 sigma(ixl^s) = dabs(t_face_l(ixl^s) - t_face_r(ixr^s)) &
2884 / (0.5d0 * (t_face_l(ixl^s) + t_face_r(ixr^s)) + smalldouble)
2885 sigma(ixl^s) = min(sigma(ixl^s), 1.0d0)
2888 t_for_rhol(ixl^s) = (1.d0 - sigma(ixl^s)) * t_shared(ixl^s) &
2889 + sigma(ixl^s) * t_face_l(ixl^s)
2890 t_for_rhor(ixr^s) = (1.d0 - sigma(ixl^s)) * t_shared(ixr^s) &
2891 + sigma(ixl^s) * t_face_r(ixr^s)
2894 wlp(ixl^s,
p_) = wlp(ixl^s,
p_) * wb_phi_face(ixl^s)
2895 wrp(ixr^s,
p_) = wrp(ixr^s,
p_) * wb_phi_face(ixr^s)
2898 wlp(ixl^s,
rho_) = wlp(ixl^s,
p_) / t_for_rhol(ixl^s)
2899 wrp(ixr^s,
rho_) = wrp(ixr^s,
p_) / t_for_rhor(ixr^s)
2902 w(ixi^s,
p_) = w(ixi^s,
p_) * wb_phi(ixi^s)
2903 w(ixi^s,
rho_) = w(ixi^s,
p_) / wb_t(ixi^s)
2905 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, public 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 cak_get_dt(wprim, ixil, ixol, dtnew, dxd, x)
Check time step for total radiation contribution.
subroutine, public cak_init(phys_gamma)
Initialize the module.
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).
EoS state container – the single thermodynamic authority for AMRVAC.
type(eos_container), allocatable, public eos
The single EoS state object, allocated in eos_init and shared (read-mostly) across all EoS sub-module...
integer, parameter, public eos_type_lte
LTE (Saha-table) EoS kernels and finalise for the eos% family.
double precision function, public lte_gamma1_from_p(pres, rho_val)
Gamma_1 of one cell from (p, rho): the ideal value where fully ionised, else the pressure- indexed ta...
double precision function, public lte_p_from_eint(eint_val, nh_val, log_nh_val, inv_rho)
LTE pressure from internal energy in one cell: ideal without ionE, else the table floor,...
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(gas_eos_type, gas_ion_energy, gas_pi_table)
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_trac_tfix
fixed cutoff temperature in K for hd_trac_type=0 (Lionello et al. 2009, Mikic et al....
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,...
logical, public, protected hd_radiative_transfer
Whether the short-characteristics radiative transfer is used, with its settings in &rt_list.
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.
Public face of the short-characteristics (SC) radiative transfer and its coupling to the (M)HD.
subroutine, public rt_sc_add_source(qdt, ixil, ixol, wct, w, x, thin_share, e_internal)
Unsplit heating source of one block and stage, e += qdt Q, with Q read from i_qrad,...
subroutine, public rt_sc_activate()
Switch the RT on. The physics module calls this from its initialisation when hd_radiative_transfer or...
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)
subroutine eos_timer_start()
Open an EoS timing window; inside an OpenMP parallel region the EoS is not timed.
subroutine eos_timer_stop(acc)
Close an EoS timing window, adding its time to acc when it is the outermost.
double precision timeeos_csound
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...