Radiative Heating and Cooling¶
Nyx provides the capability to compute local heating and cooling effects due to radiation.
The motivation and algorithm for the heating and cooling components is documented in :raw-latex:`\cite{lukic15}`, and the relevant code is located in the Source/HeatCool subdirectory.
The code is activated through the USE_HEATCOOL=TRUE option in the GNUmakefile.
Mathematically, the heating and cooling can be described by a single ODE in each cell, to be integrated per time step \(\Delta t\).
This ODE exhibits a sensitive relationship to quantities such as temperature and free electron density, and consequently it often requires sophisticated integration techniques to compute correctly.
Nyx provides a few different parallelization strategies techniques for solving this ODE.
For legacy reasons, the integration scheme is selected via the nyx.heat_cool_type input parameter.
One method is to use USE_HEATCOOL=FALSE with no ODE solve (selected with nyx.heat_cool_type=0).
The other method is to use USE_HEATCOOL=TRUE with a vectorized CVODE solve (selected with nyx.heat_cool_type=11).
Users should note that, when compiling with GNUmake , CVODE must be compiled as a separate library; instructions for compiling CVODE are provided in Getting Started.
To link the external CVODE solver into Nyx, one must set USE_HEATCOOL=TRUE as well as USE_SUNDIALS=TRUE in the GNUmakefile.
This vectorized option uses CVODE while treating groups of ODEs in different cells as a single system of coupled ODEs.
The purpose of this approach is to enable the evaluation of multiple RHSs simultaneously, for improved parallel performance.
This approach can lead to a significant performance gain in the ODE integration (which is the among the most expensive computational kernels in Nyx).
The group of cells integrated together is controlled by the tilesize used in the CVODE integration loop. If tiling is not used, the entire box of cells is integrated together.
CVODE integrates this resulting system of ODEs with using adaptive time-step control which selects
timesteps for the whole system. We set the absolute tolerance required for the ODE integration in CVODE to 1e-4, scaled by the initial value of each cells independent variable in the ODE and
the relative tolerance required for the ODE integration in CVODE to 1e-4.
These tolerances, in particular the relative tolerance, have different effects depending on whether one is integrating a single ODE at a time, or a system of ODEs simultaneously.
One should be mindful of the numerical differences which arise from these, which can be observed with the fcompare tool in AMReX.
Input flags with affect the CVODE integration include:
nyx.use_sundials_constraintwhich when non-zero requires that the internal energy (while the problem is evolved) is positivenyx.use_sundials_fusedwhich when non-zero uses Sundials’s GPU fused operations (which are mathematically equivalent, but reduces GPU kernel launch time overhead)nyx.sundials_alloc_typewhich has up to 5 different vector memory allocation strategies and only affects executables built for GPUsnyx.use_typical_stepswhich when non-zero sets CVODE’s adaptive step-size selection (which substeps the total CVODE integration time) to bedt / old_max_steps. This maximum was over the entire problem domain. (In the strang case, the old maximum is taken from the same phase in the previous time-step)nyx.sundials_use_tilingwhich controls whether the MFIter loop that iterates over the CVODE integration uses tilingnyx.sundials_tile_sizewhich controls the tile size of the MFIter loop that iterates over the CVODE integrationnyx.hydro_tile_sizewhich controls the tile size of the MFIter loop that iterates over the hydro advance that makes hydro_src for SDC integrationnyx.sundials_reltolwhich controls the relative tolerance given for the CVODE integrationnyx.sundials_abstolwhich controls the absolute tolerance factor which multiplies the local internal energy to set the absolute tolerance vector for the CVODE integration
A HeatCoolTests directory allows for the testing of the CVODE integration alone, given data from a full step of the LyA executable.
At present, it assumes the same tilesizes, boxarray, and distribution mapping between both runs. Note, if you supply your own filename paths
you must ensure the directory structure exists. Some additional CVODE statistics will be displayed if nyx.v>1
Input flags to control these tests include:
hctest_example_writewhich when non-zero writes all relevant data for 1 step, including an inputs file (should be used withLyAor similar)hctest_example_write_procwhich when set will only write data for boxes owned by that processor number (which doesn’t currently have a read mode that will take this smaller data set)hctest_example_indexwhich represents the part of the filename that should typically denote step number, if unset defaults to nStep()hctest_example_readwhich when non-zero reads all relevant data for 1 step (should be used withHeatCoolTests)hctest_filename_inputswhich sets the name of the inputs file to write, if unset, hctest/inputs.${hctest_example_index}hctest_filename_badmapwhich sets the name of the BoxArray and DistributionMapping file to write, if unset, hctest/BADMAP.${hctest_example_index}hctest_filename_chunkwhich sets the name of the Chunk data file prefix to use, if unset, hctest/Chunk.${hctest_example_index} (the mfi.index() is used to index the boxes for the full filepath)