NAME
Diffuse_therm
SYNOPSIS
call Diffuse_therm(integer(IN) :: sweepDir,
integer(IN) :: igeom,
integer(IN) :: blockID,
integer(IN) :: numCells,
integer(IN) :: blkLimits(2,MDIM),
integer(IN) :: blkLimitsGC(2,MDIM),
real(IN) :: leftCoords(MAXCELLS or numCells),
real(IN) :: rightCoords(MAXCELLS or numCells),
real(INOUT) :: temp_flx(NFLUXES,:,:,:),
real(IN) :: areaLeft(:,:,:))
DESCRIPTION
Diffuse_therm alters the energy flux to account for heat losses through
thermal diffusion. This is an explicit method, so a timestep limiter
will be required. Stability is guaranteed for
dx**2
dt < .5* -------
D
where D is the diffusion coefficient, related to the isochoric conductivity (sigma)
and specific heat at constant volume (c_v) by
D = sigma/(rho*c_v)
Fluxes in PPM are stored at the zone boundaries, the temperature, etc. are
at the zone centers. So the flux {F = -sigma * grad(T)} is
sigma_i + sigma_{i-1} T_i - T_{i-1}
F_i = - ----------------------- * ---------------
2 dx
and then the contribution to the energy equation (evolution of rho*E),
where E is the energy/gram is - div(F) or
F_{i+1} - F_i
dE_i = - ---------------
dx
together, these give
sigma_{i+1} + sigma_i T_{i+1} - T_i
dE_i = ----------------------- * --------------- -
2 dx**2
sigma_i + sigma_{i-1} T_i - T_{i-1}
----------------------- * --------------- -
2 dx**2
which reduces to the standard expression for diffusion if sigma is constant.
NOTES
This routine is used by the PPM implementation of the Hydro unit.
Other implementations of Hydro, in particular MHD and RHD, may have their
own mechanisms for handling diffusive effects that bypass Diffuse_therm
(and the Diffuse code unit in general), or they may lack support for
diffusive effects.
This routine computes the heat fluxes and adds them to the energy flux
returned from hydro_1d. It is to be called after calling hydro_1d on a
block. The updated energy fluxes are then used in hy_updateSoln to
produce the updated energy.
Boundary conditions on the temperature are handled through the GridBoundaryConditions
subunit, not in this routine. Ex: setting a reflecting boundary will reflect the
temperature into the guard cells, which are used in computing the flux
at the block boundaries.
ARGUMENTS
sweepDir - the current sweep direction igeom - the geometry flag for the current sweep direction blockID - the block number to operate on numCells - the number of Cells along the sweep direction leftCoords - Coordinates of the left edge of the zones rightCoords - Coordinates of the right edge of the zones temp_flx - Temporary storage for fluxes in sweep direction areaLeft - Cell face areas at the left (smaller) cell side blkLimits - endpoints of block indices without including gcells blkLimitsGC - endpoints of block indices including gcells
HISTORY
Apparently this subroutine used to be called therm_explicit.