-
Notifications
You must be signed in to change notification settings - Fork 128
Non relativistic Radiation Transport
Two separate radiation transport modules (enabled with -nr_radiation
or -implicit_radiation
) are supported, which solve the time dependent evolution equation for specific intensities alone discrete angles. The equations and numerical algorithms are described in Jiang (2021, ApJS, 253, 49), Jiang (ApJS, 2022, 263, 4) as well as an earlier paper Jiang et al. (2014, ApJS, 213, 7).
We describe the radiation field using specific intensity
The modules solve the following radiation transport equation
The source terms are always solved implicitly. When -radiation
is enabled, we also solve the transport term -implicit_radiation
is enabled, we solve the whole equation implicitly so that the time step is not limited by the speed of light. This typically requires iterations to converge.
The two modules solve the radiation transport equation using a dimensionless system. The user needs to choose a temperature unit
- The two modules only works for Newtonian flows.
- Can work with shearing box, but no orbital advection
- Can work with SMR/AMR and all coordinate systems in 1D/2D/3D
- The source terms assume gamma law equation of state for gas
- use
-nr_radiation
to turn on the explicit radiation transport module - use
-implicit_radiation
to turn on the implicit radiation transport module - They cannot be turned on simultaneously
All the parameters for the radiation module are set in the <radiation>
block.
Here is an example for the explicit radiation module with two frequency groups and pre-calculated
<radiation>
nmu = 4 # default angular system with 80 angles per cell in 3D
prat = 10 # $a_rT_0^4/P_0$
crat = 1000 # $c/v_0$
n_frequency = 2 # two frequency groups
frequency_min = -10 # boundary of the two groups at $\nu=10 k_BT_0/h$
Another example with units specified in the input file
<radiation>
angle_flag = 1 # using the angular system that rotates with local coordinate
nzeta = 5 # number of angles from 0 to pi/2 along polar direction
npsi = 6 # number of angles from 0 to pi along toroidal direction
unit = 1 # adopt the units in the input file
T_unit = 5.e4 # T_0=5.e4 K
density_unit = 1.e-10 # \rho_0=1.e-10 g/cm^3
length_unit = 7.078e16 # L_0=7.078e16 cm
molecular_weight = 0.62 # mean molecular weight
Another example to use the implicit radiation transport module
<radiation>
angle_flag = 1 # using the angular system that rotates with local coordinate
nzeta = 5 # number of angles from 0 to pi/2 along polar direction
npsi = 6 # number of angles from 0 to pi along toroidal direction
unit = 1 # adopt the units in the input file
T_unit = 5.e4 # T_0=5.e4 K
density_unit = 1.e-10 # \rho_0=1.e-10 g/cm^3
length_unit = 7.078e16 # L_0=7.078e16 cm
molecular_weight = 0.62 # mean molecular weight
nlimit = 50 # maximum number of iterations to try
error_limit = 1.e-6 # tolerance level of iteration
Check out the regression tests in nr_radiation
and implicit_radiation
for more examples.
Boundary condition for specific intensities share the same boundary condition flag as hydro variables. For example, periodic, outflow, reflecting can be used. In order to use different boundary conditions for radiation and hydro variables, user defined boundary condition will be used. For radiation, it will be the function EnrollUserRadBoundaryFunction
.
All the absorption and scattering opacities can be calculated based on local gas quantities. This is done with a user defined opacity function, which can be enrolled using the function EnrollOpacityFunction
provided by the radiation class. Opacities in the ghost cells also need to be calculated in this function.
Here is one example. First, define a function
void StarOpacity(MeshBlock *pmb, AthenaArray<Real> &prim);
Then, Inside the function void MeshBlock::InitUserMeshBlockData(ParameterInput *pin)
, enroll the opacity function as
pnrrad->EnrollOpacityFunction(StarOpacity);
Inside the Opacity function StarOpacity(MeshBlock *pmb, AthenaArray<Real> &prim)
, the user needs to set the four opacity arrays pmb->pnrrad->sigma_s(k,j,i,fre)
, pmb->pnrrad->sigma_a(k,j,i,fre)
,pmb->pnrrad->sigma_p(k,j,i,fre)
and pmb->pnrrad->sigma_pe(k,j,i,fre)
,which are functions of spatial location k
,j
,i
and frequency fre
. These opacity arrays should have unit of 1/length. The array sigma_s+sigma_a
should be the Rosseland mean opacity while sigma_s
is the scattering component. sigma_p
and sigma_pe
are typically set to the Planck mean opacity.
Getting Started
User Guide
- Configuring
- Compiling
- The Input File
- Problem Generators
- Boundary Conditions
- Coordinate Systems and Meshes
- Running the Code
- Outputs
- Using MPI and OpenMP
- Static Mesh Refinement
- Adaptive Mesh Refinement
- Load Balancing
- Special Relativity
- General Relativity
- Passive Scalars
- Shearing Box
- Diffusion Processes
- General Equation of State
- FFT
- Multigrid
- High-Order Methods
- Super-Time-Stepping
- Orbital Advection
- Rotating System
- Reading Data from External Files
- Non-relativistic Radiation Transport
- Cosmic Ray Transport
- Units and Constants
Programmer Guide