Input parameters¶
Entity reads almost all the information (except for the problem generator) about the simulation at runtime from an input file provided in a .toml format. The most up-to-date full version of the input file with all the possible input parameters with their descriptions and default values can be found in the root directory of the main repository in the input.default.toml.
Toml schema
The template input file is automatically generated from the entity.schema.json schema file, which can also be used with tools like tombi or taplo to verify the validity of your input toml file.
Accessing the parameters in the code
All the parameters listed below can be accessed at runtime from the code through the SimulationParams container object stored in the Simulation class and typically passed to the relevant functions. For example, to access the fiducial cyclotron frequency, you can do: params.template get<real_t>("scales.omegaB0"). Note that you need to explicitly specify the type of the variable to return.
required |
These parameters are required to be specified for any simulation (i.e., no default) |
inferred |
These parameters are not directly specified by the user, but are inferred from other input parameters or command-line flags |
| parameter | type | description | default |
|---|---|---|---|
simulation |
Global simulation parameters | ||
name |
string |
Name of the simulationThe name is used for the output files. |
|
engine |
string"SRPIC", "GRPIC" |
Simulation engine to use | |
runtime |
float> 0 |
Max runtime in physical (code) units | |
simulation.domain |
Parameters specific to domain decomposition | ||
number |
int |
Number of domains | 1 [no MPI]; MPI_SIZE [MPI] |
decomposition |
array<int>size 1 :->: 3 |
Decomposition of the domain (for MPI) in each of the directions* -1 means the code will determine the decomposition in the specific direction automatically. * Automatic detection is either done by inference from # of MPI tasks, or by balancing the grid size on each domain. |
$[-1, -1, -1]$ |
simulation.domain.load_balance |
Diffusion-style dynamic load balancing. Domain boundaries between MPI neighbors are nudged to equalize the active-particle count per rank. All inter-rank traffic uses only the existing nearest-neighbor field/particle communication paths. | ||
enable |
bool |
Enable dynamic load balancing | false |
interval |
int |
Run the rebalancer every interval timesteps (0 disables) |
$0$ |
dimensions |
array<int>1, 2, 3 |
Dimensions along which load is redistributed (1 = x1, 2 = x2, 3 = x3) | $[1]$ |
tolerance |
float |
Skip rebalancing along a dim when (max - min) / mean of the per-slice particle count is below this fraction | $0.1$ |
max_shift |
int |
Maximum cell-shift per interior boundary per event; clamped at compile time to N_GHOSTS so the migrating field strip is already cached in the rank's ghost zone. | N_GHOSTS |
grid |
Parameters specific to grid geometry | ||
resolution |
array<uint>size 1 :->: 3 |
Spatial resolution of the gridDimensionality is inferred from the size of this array. |
|
extent |
array<tuple<float>>size 1 :->: 3 |
Physical extent of the grid* For spherical geometry, only specify [[rmin, rmax]], other values are set automatically. * For cartesian geometry, cell aspect ratio has to be 1: dx=dy=dz. |
|
dim |
short1, 2, 3 |
Dimensionality of the grid | |
grid.metric |
Metric-related parameters | ||
metric |
string"Minkowski", "Spherical", "QSpherical", "Kerr_Schild", "QKerr_Schild", "Kerr_Schild_0" |
Metric on the grid | |
qsph_r0 |
float-∞ -> rmin |
r0 paramter for the QSpherical metric x1 = log(r-r0)Negative values produce almost uniform grid in r. |
$0.0$ |
qsph_h |
float-1 :->: 1 |
h paramter for the QSpherical metric th = x2 + 2*h x2 (pi-2*x2)*(pi-x2)/pi^2 |
$0.0$ |
ks_a |
float0 :-> 1 |
Spin parameter for the Kerr Schild metric | $0.0$ |
coord |
string"cartesian", "spherical", "qspherical" |
Coordinate system on the grid | |
ks_rh |
float |
Size of the horizon for GR Kerr Schild | |
params |
map<string, float> |
A map of all metric-specific parameters together (for easy access) | |
grid.boundaries |
Boundary-condition related parameters | ||
fields |
array<tuple<string>>"PERIODIC", "MATCH", "FIXED", "ATMOSPHERE", "CUSTOM", "HORIZON", "CONDUCTOR" |
Boundary conditions for fields* When periodic in any of the directions, you should only set one value: [..., ["PERIODIC"], ...]. * In spherical, bondaries in theta/phi are set automatically (only specify bc @ [rmin, rmax]): [["ATMOSPHERE", "MATCH"]]. * In GR, the horizon boundary is set automatically (only specify bc @ rmax): [["MATCH"]]. |
|
particles |
array<tuple<string>>"PERIODIC", "ABSORB", "ATMOSPHERE", "CUSTOM", "REFLECT", "HORIZON" |
Boundary conditions for particles* When periodic in any of the directions, you should only set one value [..., ["PERIODIC"], ...]. * In spherical, bondaries in theta/phi are set automatically (only specify bc @ [rmin, rmax]) [["ATMOSPHERE", "ABSORB"]]. * In GR, the horizon boundary is set automatically (only specify bc @ rmax): [["ABSORB"]]. |
|
grid.boundaries.match |
Parameters specific to MATCH boundary conditions | ||
ds |
floator array<tuple<float>> |
Size of the matching layer in each direction for fields in physical (code) unitsIn spherical, this is the size of the layer in rfrom the outer wall. |
1% of the domain size (in shortest dimension) |
grid.boundaries.absorb |
Parameters specific to ABSORB boundary conditions | ||
ds |
float |
Size of the absorption layer for particles in physical (code) units* In spherical, this is the size of the layer in rfrom the outer wall. * In cartesian, this is the same for all dimensions where applicable. |
1% of the domain size (in shortest dimension) |
grid.boundaries.atmosphere |
Parameters specific to ATMOSPHERE boundary conditions | ||
temperature |
float |
Temperature of the atmosphere in units of m0 c^2[required] if ATMOSPHEREis one of the boundaries. |
|
density |
float |
Peak number density of the atmosphere at base in units of n0 |
|
height |
float |
Pressure scale-height in physical units | |
species |
array<int>size 2 |
Species indices of particles that populate the atmosphere | |
ds |
float |
Distance from the edge to which the gravity is imposed in physical units0.0 means no limit. |
$0.0$ |
g |
float |
Acceleration due to imposed gravity | |
scales |
Fiducial scales that fix the code unit system | ||
larmor0 |
float> 0.0 |
Fiducial larmor radius | |
skindepth0 |
float> 0.0 |
Fiducial plasma skin depth | |
dx0 |
float |
fiducial minimum size of the cell | |
V0 |
float |
fiducial elementary volume | |
n0 |
float |
Fiducial number density | |
q0 |
float |
Fiducial elementary charge | |
sigma0 |
float |
Fiducial magnetization parameter | |
B0 |
float |
Fiducial magnetic field | |
omegaB0 |
float |
Fiducial cyclotron frequency | |
radiation |
Radiative drag and photon emission parameters | ||
radiation.drag |
Radiation reaction (drag) parameters | ||
radiation.drag.synchrotron |
Synchrotron drag parameters | ||
gamma_rad |
float> 0.0 |
Radiation reaction limit gamma-factor for synchrotron[required] if one of the species has radiative_drag = "synchrotron". |
$1.0$ |
radiation.drag.compton |
Compton drag parameters | ||
gamma_rad |
float> 0.0 |
Radiation reaction limit gamma-factor for Compton drag[required] if one of the species has radiative_drag = "compton". |
$1.0$ |
radiation.emission |
Photon emission parameters | ||
radiation.emission.synchrotron |
Synchrotron emission parameters | ||
gamma_qed |
float> 1.0 |
Gamma-factor of a particle emitting synchrotron photons at energy m0 c^2 in fiducial magnetic field B0 |
$10.0$ |
photon_energy_min |
float> 0.0 |
Minimum photon energy for synchrotron emission (units of m0 c^2) |
$10^{-3}$ |
photon_weight |
float> 0.0 |
Weights for the emitted synchrotron photons | $1.0$ |
photon_species |
ushort> 0 |
Index of species for the emitted photon | |
nominal_probability |
float |
Nominal probability of the emission for a particle with gamma * beta = 1, charge-to-mass = q0 / m0 |
|
nominal_photon_energy |
float |
Nominal energy of the emitted photon for a particle with gamma * beta = 1, mass = m0 |
|
radiation.emission.compton |
Inverse Compton emission parameters | ||
gamma_qed |
float> 1.0 |
Gamma-factor of a particle emitting inverse Compton photons at energy m0 c^2 in fiducial magnetic field B0 |
$10.0$ |
photon_energy_min |
float> 0.0 |
Minimum photon energy for inverse Compton emission (units of m0 c^2) |
$10^{-3}$ |
photon_weight |
float> 0.0 |
Weights for the emitted inverse Compton photons | $1.0$ |
photon_species |
ushort> 0 |
Index of species for the emitted photon | |
nominal_probability |
float |
Nominal probability of the emission for a particle with gamma * beta = 1, charge-to-mass = q0 / m0 |
|
nominal_photon_energy |
float |
Nominal energy of the emitted photon for a particle with gamma * beta = 1, mass = m0 |
|
algorithms |
Algorithm and solver tuning | ||
current_filters |
ushort>= 0 |
Number of current smoothing passes | $0$ |
algorithms.timestep |
Timestep parameters | ||
CFL |
float0.0 -> 1.0 |
Courant-Friedrichs-Lewy numberCFL number determines the timestep duration. |
$0.95$ |
correction |
float |
Correction factor for the speed of light used in field solver | $1.0$ |
dt |
float |
timestep duration | |
algorithms.deposit |
Current deposition parameters | ||
enable |
bool |
Enable the current deposition | true |
team_policy_team_size |
uint>= 0 |
Tiled-deposit work-group (team) size | $0$ |
tiled_deposit_team_size |
uint>= 0 |
Tiled-deposit work-group (team) size0 keeps Kokkos::AUTO (backend occupancy heuristic); a positive value overrides it, clamped to the backend/scratch maximum at launch. Only used in tiled_deposit=ONbuilds. Pick a multiple of the device subgroup width for best occupancy (see ideal_tile_size.py). |
$0$ |
order |
ushort0 -> 10 |
order of the particle shape function | |
algorithms.gr |
GR pusher parameters | ||
pusher_eps |
float> 0.0 |
Stepsize for numerical differentiation in GR pusher | $10^{-6}$ |
pusher_niter |
ushort> 0 |
Number of iterations for the Newton-Raphson method in GR pusher | $10$ |
algorithms.gca |
Guiding-center approximation parameters | ||
e_ovr_b_max |
float0.0 -> 1.0 |
Maximum value for E/B allowed for GCA particles | $0.9$ |
larmor_max |
float |
Maximum Larmor radius allowed for GCA particles (in physical units)When larmor_max== 0, the limit is disabled. |
$0.0$ |
algorithms.fieldsolver |
Stencil coefficients for the field solver [notation as in Blinne+ (2018)]Standard Yee solver: delta_i = beta_ij = 0.0. |
||
enable |
bool |
Enable the fieldsolver | true |
delta_x |
float |
delta_x coefficient (for F_{i +/- 3/2, j, k}) |
$0.0$ |
delta_y |
float |
delta_y coefficient (for F_{i, j +/- 3/2, k})Used only for 2D and 3D. |
$0.0$ |
delta_z |
float |
delta_z coefficient (for F_{i, j, k +/- 3/2})Used only for 3D. |
$0.0$ |
beta_xy |
float |
beta_xy coefficient (for F_{i +/- 1/2, j +/- 1, k})Used only for 2D and 3D. |
$0.0$ |
beta_yx |
float |
beta_yx coefficient (for F_{i +/- 1, j +/- 1/2, k})Used only for 2D and 3D. |
$0.0$ |
beta_xz |
float |
beta_xz coefficient (for F_{i +/- 1/2, j, k +/- 1})Used only for 3D. |
$0.0$ |
beta_zx |
float |
beta_zx coefficient (for F_{i +/- 1, j, k +/- 1/2})Used only for 3D. |
$0.0$ |
beta_yz |
float |
beta_yz coefficient (for F_{i, j +/- 1/2, k +/- 1})Used only for 3D. |
$0.0$ |
beta_zy |
float |
beta_zy coefficient (for F_{i, j +/- 1, k +/- 1/2})Used only for 3D. |
$0.0$ |
particles |
Particle and species parameters | ||
ppc0 |
float> 0.0 |
Fiducial number of particles per cell | |
use_weights |
bool |
Toggle for using particle weights | false |
clear_interval |
uint |
Timesteps between particle re-sorting by tags (removing dead particles)Set to 0 to disable re-sorting. |
$100$ |
spatial_sorting_interval |
uint |
Timesteps between spatial sorting of particles (for better cache performance)Set to 0 to disable spatial sorting. |
$0$ |
nspec |
uint |
Number of particle species | |
particles.species |
Particle species definitions | ||
label |
string |
Label of the species <INDEX>is the index of the species in the list starting from 1. |
"s<INDEX>" |
mass |
float>= 0.0 |
Mass of the species (in units of fiducial mass) | |
charge |
float |
Charge of the species (in units of fiducial charge) | |
maxnpart |
uint> 0 |
Maximum number of particles per taskRead as a float, so exponential notation is fine (e.g. 1e8). |
|
pusher |
string"Boris", "Vay", "Boris,GCA", "Vay,GCA", "Photon", "None" |
Pusher algorithm for the species | "Boris" [massive]; "Photon" [massless] |
n_payloads_real |
ushort |
Number of additional real-valued variables (payloads) for each particle of the given species | $0$ |
n_payloads_int |
ushort |
Number of additional integer-valued variables (payloads) for each particle of the given speciesIf tracking is enabled, one or two extra integer payloads are reserved (depending on whether MPI is enabled). |
$0$ |
tracking |
bool |
Enable tracking of particles using indices for the given species | false |
radiative_drag |
string"None", "Synchrotron", "Compton" |
Radiation reaction to use for the species* Can also be coma-separated combination, e.g., "Synchrotron,Compton". * Relevant radiation.drag parameters should also be provided. |
"None" |
emission |
string"None", "Synchrotron", "Compton", "Custom" |
Particle emission policy for the species* Only one emission mechanism allowed. * Appropriate radiation drag flag will be applied automatically (unless explicitly set to "None"). |
"None" |
spatial_sorting_interval |
uint |
Timesteps between spatial sorting of particles for given species* Set to 0 to disable spatial sorting. * Overrides particles.spatial_sorting_intervalfor the given species. |
$0$ |
clear_interval |
uint |
Timesteps between particle re-sorting by tags (removing dead particles)* Set to 0 to disable re-sorting. * Overrides particles.clear_intervalfor the given species. |
$100$ |
setup |
Parameters for specific problem generators and setupsFree-form: keys are defined by the problem generator, so nothing here is validated. |
||
output |
Output parameters | ||
format |
string"disabled", "hdf5", "BPFile" |
Output format | "bpfile" |
interval |
uint> 0 |
Number of timesteps between all outputsValue is overriden by output intervals for specific outputs. |
$100$ |
interval_time |
float |
Physical (code) time interval between all outputs* When interval_time< 0, the output is controlled by interval, otherwise by interval_time. * Value is overriden by output intervals for specific outputs. |
$-1.0$ |
output.fields |
Field output parameters | ||
enable |
bool |
Toggle for the field output | true |
quantities |
array<string>"E", "B", "J", "divE", "Rho", "Charge", "N", "Nppc", "T0i", "Tij", "Vi", "D", "H", "divD", "A" |
Field quantities to output* For T, you can use unspecified indices: Tij, T0i, or specific ones: Ttt, T00, T02, T23. * For T, in cartesian can also use "x" "y" "z" instead of "1" "2" "3". * By default, we accumulate moments from all massive species, one can specify only specific species: Ttt_1_2, Rho_1, Rho_3_4. |
[] |
custom |
array<string> |
Custom (user-defined) field quantities | [] |
interval |
uint |
Number of timesteps between field outputs* When != 0, overrides output.interval. * When == 0, output.intervalis used. |
$0$ |
interval_time |
float |
Physical (code) time interval between field outputs* When < 0, the output is controlled by interval. * When specified, overrides output.interval_time. |
$-1.0$ |
downsampling |
uintor array<uint>>= 1 |
Downsample factor for the output of fields* The output is downsampled by the given factors in each direction. * If a scalar is given, it is applied to all directions. |
$[1, 1, 1]$ |
output.fields.smoothing |
Smoothing of the output moments | ||
order |
ushort |
Smoothing order for the output of moments ("Rho", "Charge", "T", ...) | $0$ |
method |
string"const", "spline" |
Smoothing algorithm* When using "spline", ordercorresponds to the order of the polynomial used. * When using "const", the smoothing window is ceil(order / 2)in both directions. |
"spline" |
output.particles |
Particle output parameters | ||
enable |
bool |
Toggle for the particles output | true |
species |
array<int> |
Particle species indices to outputIf empty, all species are output. |
[] |
stride |
uint>= 1 |
Stride for the output of particles | $100$ |
interval |
uint |
Number of timesteps between particle outputs* When != 0, overrides output.interval. * When == 0, output.intervalis used. |
$0$ |
interval_time |
float |
Physical (code) time interval between particle outputs* When < 0, the output is controlled by interval. * When specified, overrides output.interval_time. |
$-1.0$ |
output.spectra |
Spectra output parameters | ||
enable |
bool |
Toggle for the spectra output | true |
e_min |
float |
Minimum energy for the spectra output | $10^{-3}$ |
e_max |
float |
Maximum energy for the spectra output | $10^{3}$ |
log_bins |
bool |
Whether to use logarithmic bins for energy | true |
n_bins |
uint> 0 |
Number of energy bins for the spectra output | $200$ |
num_energy_bins |
uint> 0 |
Number of energy bins for the spectra output | $200$ |
num_spatial_bins |
array<uint>size 1 :->: 3 |
Number of spatial bins for the spectra output | $[1, 1, 1]$ |
interval |
uint |
Number of timesteps between spectra outputs* When != 0, overrides output.interval. * When == 0, output.intervalis used. |
$0$ |
interval_time |
float |
Physical (code) time interval between spectra outputs* When < 0, the output is controlled by interval. * When specified, overrides output.interval_time. |
$-1.0$ |
output.debug |
Debug output parameters | ||
as_is |
bool |
Output fields "as is" without conversions | false |
ghosts |
bool |
Output fields with values in ghost cells | false |
output.stats |
Integrated statistics output parameters | ||
enable |
bool |
Toggle for the stats output | true |
interval |
uint> 0 |
Number of timesteps between stat outputsOverriden if output.stats.interval_time != -1. |
$100$ |
interval_time |
float |
Physical (code) time interval between stat outputsWhen < 0, the output is controlled by interval. |
$-1.0$ |
quantities |
array<string>"B^2", "E^2", "ExB", "N", "Npart", "Charge", "Rho", "T00", "T0i", "Tij" |
Field quantities to output* For particle moments, ... * ... same notation is used as for output.fields.quantities. |
["B^2", "E^2", "ExB", "Rho", "T00"] |
custom |
array<string> |
Custom (user-defined) stats | [] |
checkpoint |
Checkpointing parameters | ||
interval |
uint> 0 |
Number of timesteps between checkpoints | $1000$ |
interval_time |
float> 0 |
Physical (code) time interval between checkpointsWhen < 0, the output is controlled by interval. |
$-1.0$ |
keep |
int |
Number of checkpoints to keep* 0 = disable checkpointing. * -1 = keep all checkpoints. |
$2$ |
walltime |
string |
Write a checkpoint once after a fixed walltime* The format is "HH:MM:SS". * Empty string or "00:00:00" disables this functionality. * Writing checkpoint at walltime does not stop the simulation. |
"00:00:00" |
write_path |
string |
Parent directory to write checkpoints toThe directory is created if it does not exist. |
<simname>.ckpt |
read_path |
string |
Parent directory to use when resuming from a checkpoint | inherit write_path |
is_resuming |
bool |
Whether the simulation is resuming from a checkpoint | |
start_step |
uint |
Timestep of the checkpoint used to resume | |
start_time |
float |
Time of the checkpoint used to resume | |
adios2 |
ADIOS2 BP5 tuning, applied to both [output] and [checkpoint] writers | ||
aggregators_per_node |
uint |
Number of ADIOS2 aggregators per node* Set to either MPI ranks/node or NICs/node for best performance. * If set to 0, will use ADIOS2 default (one aggregator per node). |
$0$ |
max_shm_size |
uint |
Maximum shared-memory segment size per node, in bytes (BP5 MaxShmSize)Lower this on memory-constrained nodes; matches ADIOS2's default. |
$4294967296$ |
buffer_chunk_size |
uint |
Internal serialization buffer chunk size, in bytes (BP5 BufferChunkSize)Scales with per-rank output volume; matches ADIOS2's default. |
$16777216$ |
render |
In-situ renderer. Renders scalar fields on the GPU and writes PNG images directly to each cadence -- no field data is written to storage, and the result is seamless across MPI domain boundaries.* two modes, selected automatically by the simulation dimension:.* - 3D Cartesian (Minkowski): volume ray-march (uses samples, step_size, early_term_alpha, and the [camera] table). * - 2D (Minkowski, Spherical/QSpherical, and all GR Kerr-Schild): flat slice rasterizer. Cartesian shows the (x, y) plane; spherical shows the meridional (r, theta) half-plane mapped to Cartesian (X = r sin th, Z = r cos th), optionally mirrored (see mirror). The samples/step_size/early_term_alpha/[camera] keys are ignored in 2D (one opaque sample per pixel). * 1D (and 3D non-Cartesian, which does not exist) is a no-op. * One PNG stream per scene (e.g. a density/|B|/|J| triptych). |
||
enable |
bool |
Toggle for the on-the-fly renderer | false |
interval |
uint |
Number of timesteps between renders* When != 0, overrides output.interval. * When == 0, interval_time(or output.interval) is used. |
$0$ |
interval_time |
float |
Physical (code) time interval between rendersWhen < 0, the output is controlled by interval. |
$-1.0$ |
width |
int> 0 |
Image width in pixels (the rendered region; the PNG is wider if a colorbar margin is added, see colorbar_outside) |
$1024$ |
height |
int> 0 |
Image height in pixels | $1024$ |
resolution |
int> 0 |
Convenience: force a square frame (sets width == height == resolution), the natural shape for a dome master. Overrides width/height when > 0. |
0 (use width/height) |
n_lut |
int> 1 |
Number of entries in the color/opacity lookup table | $256$ |
background |
array<float>size 3 |
Opaque background RGB (each channel 0..1) shown through transparent/low-opacity pixels; also fills the colorbar margin | $[0.0, 0.0, 0.0]$ |
colorbar |
bool |
Draw a colorbar (gradient + value ticks + label) on each PNG | true |
colorbar_outside |
bool |
Draw the colorbar in an added right margin (the PNG becomes wider by a fixed strip) instead of overlaying it on the rendered volume | true |
mirror |
bool |
2D spherical slice only: mirror the meridional half-plane across the symmetry axis to render a full disk from one axisymmetric half. No effect on Cartesian or 3D rendering. | true |
time_label |
bool |
Draw the current simulation time as a label ("T = |
false |
axes |
bool |
Draw a spine (frame) + axis ticks + labels around the rendered region. The PNG gains left/bottom margins (background-filled) for the tick labels and axis names, so they never overlap the data.* 2D Cartesian = a rectangular frame with linear spatial ticks;. * 2D spherical = polar axes (an "R" radial axis on the symmetry axis with R=0 centered, and a "Theta" axis along the curved outline / spine);. * 3D = the global box projected to a wireframe with ticks on the three silhouette edges (x bottom, y & z on the left). |
false |
axis_labels |
array<string>size <= 3 |
Axis names. 3D uses all three; the 2D slice uses the first two. When unset, the 2D slice defaults to "x","y" (Cartesian) or "X","Z" (spherical). | ["x", "y", "z"] |
axis_ticks |
int>= 2 |
Target number of ticks per axis (actual count is rounded to nice values) | $5$ |
spine_width |
float> 0.0 |
3D only: target width (pixels) of the box wireframe "spine". The spine is drawn inside the ray-march (opaque, depth-occluded by the volume); its width is floored by the ray step, so for a crisper thin line raise samples as well. |
$2.0$ |
render.extent |
Limit the render region to axis-aligned box in physical/world coordinates. Left unset it spans the full domain. Clamped to the box.3D -> the volume is depth-clipped to this box, the wireframe/axes frame it, and the default camera zooms to it; 2D -> the slice window is framed to it. |
||
x1 |
array<float>size 2 |
Axis-aligned render region [lo, hi] along x1, in physical/world coords. Left unset it spans the full domain. Clamped to the box.For a spherical 2D slice, x1 crops the radius r. |
[] (full extent) |
x2 |
array<float>size 2 |
Render region [lo, hi] along x2.For a spherical 2D slice, x2 crops the polar angle theta. |
[] (full extent) |
x3 |
array<float>size 2 |
Render region [lo, hi] along x3. | [] (full extent) |
render.volume |
Volume rendering parameters (3D Cartesian only) | ||
samples |
int> 0 |
Number of ray-march steps across the global box diagonalThe world-space step is box_diagonal / samplesunless step_sizeis set. Higher = better quality, slower. |
$400$ |
step_size |
float>= 0.0 |
Fixed world-space step between ray samples0 derives the step from samples. The step is identical on all ranks, which is what makes the multi-domain composite seamless. |
$0.0$ |
early_term_alpha |
float0.0 -> 1.0 |
Stop marching a ray once its accumulated opacity reaches this valuePure speed optimization; set to 1.0 to disable early termination. |
$0.99$ |
render.moving_view |
Translate the render region (and, in 3D, the camera), to keep a propagating feature (e.g. a shock) in frame. Pair with x{1,2,3} extent to crop the moving window. | ||
velocity |
array<float>size 2 or 3 |
Velocity of the moving camera in world units. | [] (static view) |
start_time |
float |
Sim time at which the view starts moving (static before it, e.g. to let an initial ramp-up finish) | $0.0$ |
render.camera |
Camera (3D volume mode only; ignored by the 2D slice rasterizer). Defaults frame the whole global box from outside, looking down the (1,1,1) diagonal -- the production setup for which the structured composite is provably seamless. | ||
mode |
string"orthographic", "perspective", "dome" |
Projection mode. Overrides orthographic below when set."dome" is a fulldome azimuthal-equidistant fisheye rendered from an INTERIOR eye (the domain center by default), i.e. a 3D planetarium dome master. It uses a depth-resolved (A-buffer) composite that is seamless across a full 3D domain decomposition (unlike ortho/perspective, which need the eye outside the box). Set a square frame (resolution, or width == height). forwardis the dome ZENITH (screen-up defaults to +y for a +z zenith). |
(unset -> use orthographic) |
position |
array<float>size 3 |
Camera (eye) position in world (physical) coordinates | box center pushed back ~1.7 box-diagonals along (1, 1, 1);
for mode = "dome", the domain center (interior eye) |
look_at |
array<float>size 3 |
Point the camera looks at, in world coordinates (the dome ZENITH target) | box center; for mode = "dome", the zenith defaults to +z |
up |
array<float>size 3 |
Camera up vector (dome: the disk's screen-up) | $[0.0, 0.0, 1.0]; for mode = "dome", [0.0, 1.0, 0.0]$ |
fov |
float> 0.0 |
Vertical field of view in degrees (perspective only) | $35.0$ |
dome_fov |
float> 0.0, <= 360.0 |
Full dome field of view in degrees (dome mode only): the image rim is at dome_fov/2 from the zenith (180 = a full hemisphere down to the horizon). | $180.0$ |
dome_radius |
float>= 0.0 |
Dome far-clip radius in world units (dome mode only): each ray stops this far from the eye, so the sampled region is a half-ball (hemisphere) of this radius rather than the whole box -> uniform path length and no box corner/edge projection artifacts. samples then counts steps across this radius.0 disables the clip (rays march to the box boundary). |
the largest sphere centered in the box (half the shortest side), so it touches the face centers and never a corner |
ortho_height |
float> 0.0 |
Vertical extent of the view in world units (orthographic only) | the global box diagonal (the whole box fits from any angle) |
render.dome |
Fulldome fisheye ("planetarium dome master"). 2D only; a circular image is centered in the frame's inscribed circle with the corners left as the background (the dome master's black border). Set width == height (e.g. 4096) for a square master. When enabled, the axes and the outside colorbar strip are suppressed so the PNG stays exactly width x height. Seamless across MPI domains (the pixel->world map is a shared, deterministic function and the tiles stay disjoint). Ignored (with a warning) for 3D.* CARTESIAN -- the flat plane is warped radially into the disk; use fov/radius/center/projection below. * SPHERICAL / GR Kerr-Schild -- the meridional slice is ALREADY a disk, so dome mode only mirrors it to a full disk (see mirrorabove; keep it true) and fits it to the inscribed circle. The fov/radius/center/projection keys are ignored (the native (X, Z) meridional map is used, with image radius proportional to the physical radius r, r=0 at the disk center). |
||
enable |
bool |
Build the fisheye dome master instead of the plain slice | false |
fov |
float> 0.0, <= 180.0 |
(Cartesian only) Full dome field of view in degrees (image radius maps linearly to the dome zenith angle: the rim is at fov/2) | 180.0 # a full hemisphere |
radius |
float> 0.0 |
(Cartesian only) World radius of the circular cutout mapped onto the dome | half the shorter domain side (the largest centered disk that fits inside the box) |
center |
array<float>size 2 |
(Cartesian only) World-space center of the cutout | the domain center |
projection |
string"equidistant" (r proportional to angle; the fulldome image standard -- a straight radial scaling of the cutout), "gnomonic" (r ~ tan(angle); the slice as a flat "ceiling" tangent to the dome -- straight sim lines stay straight), "stereographic" (r ~ tan(angle/2); conformal, preserves shapes), "orthographic" (r ~ sin(angle); the slice as seen face-on) |
(Cartesian only) How the dome zenith angle maps to a world radius on the flat slice | "equidistant" |
render.fieldlines |
Magnetic field lines, drawn from a coarse, MPI-replicated copy of the field so the geometry is global and seamless across domains (the coarsening is what makes this cheap -- no parallel particle advection / flux scan).
- 3D (Cartesian): traced as solid tubes, colored by |field|, composited inside the volume ray-march so the volume correctly occludes them.
- 2D (Cartesian): iso-contours of the flux function psi (Bx = d psi/dy, By = -d psi/dx), i.e. the in-plane field lines, colored by |B|.
- 2D (spherical / Kerr-Schild): traced meridional streamlines of the poloidal (Br, Btheta) field (nt2py style).
Built once per frame and shared by every scene that opts in (per-scene fieldlines = true) and by any standalone field = "fieldlines" scene. |
||
enable |
bool |
Build the field-line geometry this runimplied true if any scene sets fieldlines = trueor uses field = "fieldlines". |
false |
field |
string"B", "E", "J" |
Vector field to trace | "B" |
bin |
int1..16 |
Field coarsening factor (simulation cells per coarse cell, per axis)larger = smoother "morphology" lines + cheaper replication (the coarse field is ~ N_cells / bin^D floats/rank; D = sim dimension). |
$4$ |
seed_px |
float> 0 |
(3D tubes) Seed-lattice spacing in screen pixels (sets line density)capped by seed_max; if seed_px asks for more seeds than that, the spacing grows to fit and seed_px no longer governs. |
$8$ |
seed_max |
int> 0 |
(3D tubes) Hard cap on the seed count (lattice is n^3, 2 lines per seed)lower this for fewer / more widely spaced lines. |
$4096$ |
levels |
int> 0 |
(2D contours) Number of evenly-spaced flux-function contour levelsevenly-spaced psi levels => line density tracks |B| automatically. |
$16$ |
tube_px |
float> 0 |
Tube radius (3D) / contour line width (2D), in screen pixels | $2$ |
colormap |
string"viridis", "inferno", "plasma", "cool2warm", "gray", "RdBu_r", and the CMasher maps (BSD-3, https://cmasher.readthedocs.io): "dusk", "cosmic", "freeze", "apple", "gothic", "sunburst", "voltage", "ocean", "fusion", "prinsenvlag" (an optional "cmr." prefix is ok) |
Colormap for the field lines (mapped by |B| along each line) | "inferno" |
color |
array<float>size 3 |
Monochrome override: draw the lines in a single [r,g,b] color (each 0..1) instead of the |B| colormap -- reads well as an overlay on another volume | [] (empty => color by |B|) |
log |
bool |
Map the tube color range logarithmicallyrequires min > 0. |
false |
min |
float |
Tube color range: lower bound on |field|when min >= max, the range is auto-set from |field| along the lines. |
$0.0$ |
max |
float |
Tube color range: upper bound on |field|when min >= max, the range is auto-set from |field| along the lines. |
$0.0$ |
step_frac |
float> 0 |
(3D tubes) RK4 integration step as a fraction of one coarse cell | $0.5$ |
max_steps |
int> 0 |
(3D tubes) Per-direction integration-step cap | $4000$ |
max_length |
float> 0 |
(3D tubes) Maximum line length, in global box diagonals (per direction) | $3.0$ |
render.scene |
One scene per scalar field -> one PNG stream. Repeat the table for each. | ||
field |
string(fields): "{E,B,J}mag"; "{E,B,J}{1,2,3}" or "{E,B,J}{x,y,z}", (moments): "N", "Nppc", "Rho", "Charge"; "T{i}{j}"; "V{i}"; "Vmag" |
Scalar field to render (a volume render needs a scalar, so vectors are given as a magnitude or a single component)* "{E,B,J}mag" = vector magnitude |.|; "B1"/"Bx", "J3"/"Jz", ... = a single (signed) physical component. * a bare vector ("E"/"B"/"J") is not renderable -- choose a component or the magnitude. * "N"/"Nppc" = number / per-cell count, "Rho" = mass density, "Charge" = charge density. * "T{i}{j}" = one stress-energy component, i,j in {t,x,y,z} or {0,1,2,3} (e.g. "Txx", "Ttt", "T0x"); "V{i}" = one bulk-velocity component, i in {x,y,z} or {1,2,3} (e.g. "Vx", "V1"); "Vmag" = bulk-velocity magnitude sqrt(V1^2+V2^2+V3^2). * moments follow the engine: SRPIC = tetrad-basis bulk 3-velocity and stress-energy; GRPIC = Eckart-frame 4-velocity (so "Vt"/"V0" = u^0 = Gamma/alpha is also valid) and contravariant T. * per-species selection with a "_<id>" suffix on moments, e.g. "N_1", "Rho_2", "Txy_1_2", "V1_3"; default = all massive species. * components are signed; pair a symmetric min/max with a diverging colormap ("cool2warm") to center zero. * "fieldlines" renders the magnetic field-line tubes on their own (no scalar volume sampled); see [render.fieldlines] below. |
|
prefix |
string |
PNG filename prefix; files are |
"<field>_" |
label |
string |
Colorbar title | field |
min |
float |
Lower bound of the value range mapped onto the colormap/opacity | $0.0$ |
max |
float |
Upper bound of the value range | $1.0$ |
log |
bool |
Map the value range logarithmicallyRequires min > 0 and max > 0. |
false |
colormap |
string"viridis", "inferno", "plasma", "cool2warm", "gray", "RdBu_r", and the CMasher maps (BSD-3, https://cmasher.readthedocs.io): "dusk", "cosmic", "freeze", "apple", "gothic", "sunburst", "voltage", "ocean", "fusion", "prinsenvlag" (an optional "cmr." prefix is ok) |
Colormap name | "viridis" |
alpha |
array<tuple<float>> |
Opacity transfer function: [position, opacity] control points, both in [0, 1], piecewise-linear in the normalized valueKeep the low end near 0 so empty regions stay transparent. |
linear ramp (opacity = normalized value) |
colorbar_ticks |
array<float> |
Explicit value(s) to label on the colorbarValues outside [min, max] are skipped. |
5 evenly-spaced ticks between min and max |
fieldlines |
bool |
Overlay the magnetic field-line tubes inside this scene's volumerequires the [render.fieldlines] enabled (3D only). A scene with field = "fieldlines" instead renders them alone. |
false |
diagnostics |
Diagnostic logging parameters | ||
interval |
int> 0 |
Number of timesteps between diagnostic logs | $1$ |
blocking_timers |
bool |
Blocking timers between successive algorithms | false |
colored_stdout |
bool |
Enable colored stdout | true |
log_level |
string"VERBOSE", "WARNING", "ERROR" |
Specify the log level"VERBOSE" prints all messages, "WARNING" prints only warnings and errors, "ERROR" prints only errors. |
"VERBOSE" |