Output Files and Format
Controlling Outputs
A SLUG simulation produces output files whose names, locations, and types are
controlled by the model_name, out_dir, and output_mode keywords in
the Output Control Keywords section of The SLUG Input Deck.
The outputs are written in either HDF5 or ASCII format, depending on whether
output_mode is set to "h5" (or "h5divided") or ascii.
ASCII format is intended for small, quick
simulations with small outputs, and is not recommended for large, production-scale
runs. HDF5 format is recommended for all but the smallest runs, and is the only
format that the Python interface can read, as detailed below. The "h5divided"
option produces outputs that are identical to "h5" except that the outputs
from different threads are left in separate HDF5 files rather than consolidated
into a single one, which is preferable for very large runs where a monolithic
HDF5 file would be unwieldy; the slugpy interface can read both formats
transparently.
Outputs are placed in the directory specified by out_dir in the parameter
file, which defaults to the current working directory if not specified.
The output file name is constructed from the model_name keyword in the parameter
file. For h5 output, the output file is named <model_name>.h5, while for
h5divided output the output files are placed in a directory named <model_name>,
with each thread’s output stored in a separate file in that directory called
thread_<NNNN>.h5 where <NNNN> is the thread number. For ASCII output,
there will be multiple file outputs, whose names follow the pattern
<model_name>_<output_type>.txt. Which output types are produced is controlled
by the Output Control Keywords section of The SLUG Input Deck.
If SLUG was built and run under MPI (see Running SLUG With MPI), each
process’s (“rank’s”) own output is likewise kept separate – even for a
single-rank run, since this naming is a property of the build, not of how
many ranks a given run actually used – named rank_<NNNN>.h5 where
<NNNN> is the rank number – or, if OpenMP
threading is also in use within each rank, rank_<NNNN>_thread_<NNNN>.h5,
combining both numbers. This naming only appears with h5divided output,
or transiently with checkpointed h5 output before a checkpoint is
consolidated; once an h5 run finishes, every rank’s and thread’s output is
merged into the single <model_name>.h5 (or <model_name>_chk<NNNNN>.h5)
file described above, and the per-rank/thread files are removed.
A full description of the format of the outputs is provided below.
Reading Outputs
Outputs in ASCII mode are simple text files that can be read with any text editor,
and should be self-explanatory (though full details are provided below). To read
outputs in HDF5 format, you can use any HDF5 reader, but the recommended approach
is to use slugpy. A simulation output in HDF5 format can be read into Python
simply by doing:
import slugpy sim_result = slugpy.read("path/model_name")
The reader will automatically detect whether the output format is h5 or h5divided
and read the outputs appropriately. The result returned by slugpy.read is a
slugpy.slug_reader object, which is a lazy-reader that can be used safely even for
very large outputs that will not fit in memory at once. See slugpy for
details on how to use the slug_reader object to inspect the outputs of a simulation.
Full Documentation of the SLUG Output Format
Below is a full listing of every dataset and attribute that SLUG’s HDF5 and ASCII
output can contain. Which of these actually appear in a given run’s own output
depends on the parameter file used to produce it – e.g. cluster_phot (or
<model_name>_cluster_phot.txt) only exists if photometry was requested, and a
cluster-type simulation never produces any of the galaxy* outputs at all,
since it has no Galaxy object – see The SLUG Input Deck for the keywords
that control this.
HDF5 Format
Every dataset described below also has its own units attribute (a string,
e.g. "Msun", or an empty string for a dimensionless quantity); rather than
list this attribute separately under every single dataset, its value is simply
given alongside each dataset below.
Top-level Attributes
These attributes are set directly on the output file itself, rather than on any group within it.
slug-hash: The git commit hash of the SLUG build that produced this file.date: The local date (YYYY-MM-DD) on which this file was created.time: The local time (HH:MM:SS) at which this file was created.rng_state: The serialized state of the random number generator at the moment this file was opened.trials_completed: The number of trials actually completed and written to this file (or, for one checkpoint of a checkpointed run, to that checkpoint) by the time it was closed. Under MPI, this is a run-wide total (the sum across every rank), kept identical in every rank’s own file, not just this one rank’s own share – see Running SLUG With MPI.restart_uid: An internal identifier used to keep cluster/star ID numbering consistent across a run resumed with--restart; not generally meaningful on its own. Under MPI, each rank’s own output file has its ownrestart_uid(unliketrials_completed/max_trial, which are the same run-wide total in every rank’s file), since each rank’s ID numbering runs in its own, non-overlapping range – see Running SLUG With MPI.max_trial: The largest trial number actually written to this file. Used internally when resuming a run from a checkpoint, so that trial numbering in the resumed session never collides with a trial number a previous session already used. Under MPI, this is likewise a run-wide value (the largest trial number any rank wrote), kept identical in every rank’s own file – see Running SLUG With MPI.
The input_deck Group
Holds a single dataset recording the parameter file that produced this simulation.
toml(string scalar): The full text of the TOML input deck used for this run, re-serialized – lets the exact parameters behind a given output file be recovered from the file itself. Empty if theSimControlsdriving this run was built directly from Python with no backing input deck at all.
The clusters Group
Holds one row per individually-tracked (stochastic) star cluster ever formed
across every trial, whether or not that cluster survived to be observed at any
output time. For a cluster-type simulation this is exactly one row per trial
(each trial forms exactly one cluster); for a galaxy-type simulation, the
number of rows varies from trial to trial, depending on the star formation
history and the cluster mass function. Every dataset below has shape
(n_clusters,), where n_clusters is this total row count.
trial(unitless integer): The trial number this cluster belongs to.uid(unitless integer): This cluster’s unique identifier.target_mass(Msun): The cluster mass drawn from the cluster mass function.birth_mass(Msun): The cluster’s actual initial stellar mass, as realized by stochastically sampling individual stars from the IMF – generally close to, but not exactly equal to,target_mass, since a discrete set of stellar masses cannot sum to an arbitrary target exactly.form_time(yr): The time at which this cluster formed. Always 0 for a cluster-type simulation, which forms its single population instantaneously.feh(unitless): This cluster’s [Fe/H] metallicity.rng(string): The serialized state of the random number generator at the moment this cluster was drawn, so that its own stochastic realization can be reproduced independently of the rest of the run.A_V(mag; only present ifextinct.modelwas set): The V-band extinction applied to this cluster’s starlight.A_V_neb(mag; only present ifextinct.modelwas set): The V-band extinction applied to this cluster’s nebular emission:A_Vtimes a factor drawn fromextinct.neb_factor(see Extinction Keywords), or equal toA_Vif that keyword was not given.
The cluster_spectra Group
Holds the spectra of individually-tracked clusters. There is one row (in every
extensible dataset below) per (cluster, output time) pair at which a spectrum
was actually written; call this common row count n_rows.
Fixed wavelength/line grids, shared by every row:
wl(Angstrom, shape(n_wl,)): The rest-frame wavelength grid that every row’sspec/spec_nebvalue is tabulated on.wl_extinct(Angstrom, shape(n_wl_extinct,); only ifextinct.modelwas set): The wavelength grid forspec_extinct/spec_neb_extinct– may cover a narrower range thanwl, since an extinction curve need not extend across the full spectral grid.line_wl(Angstrom, shape(n_lines,); only if a nebular emission grid was requested): The rest-frame wavelength of each nebular emission line tabulated inneb_lines/neb_lines_extinct.line_label(string, shape(n_lines,); only if a nebular emission grid was requested): A human-readable label (species/transition) identifying each entry ofline_wl, in the same order.
Per-row datasets:
trial(unitless integer, shape(n_rows,)): The trial number this row belongs to.time(yr, shape(n_rows,)): The output time this spectrum was computed at.uid(unitless integer, shape(n_rows,)): The unique identifier of the cluster this spectrum belongs to.spec(erg/(s Angstrom), shape(n_rows, n_wl)): The cluster’s un-extincted spectrum.spec_extinct(erg/(s Angstrom), shape(n_rows, n_wl_extinct); only ifextinct.modelwas set): The same spectrum after applying dust extinction.spec_neb(erg/(s Angstrom), shape(n_rows, n_wl); only if a nebular emission grid was requested): The un-extincted spectrum including the nebular continuum.spec_neb_extinct(erg/(s Angstrom), shape(n_rows, n_wl_extinct); only if both a nebular emission grid andextinct.modelwere requested): The nebular-inclusive spectrum after applying dust extinction.neb_lines(erg/s, shape(n_rows, n_lines); only if a nebular emission grid was requested): The luminosity of each nebular emission line listed inline_wl/line_label, without extinction applied.neb_lines_extinct(erg/s, shape(n_rows, n_lines); only if both a nebular emission grid andextinct.modelwere requested): The same line luminosities after applying dust extinction.
The cluster_phot Group
Holds the photometry of individually-tracked clusters, present only if
photometry (phot.filters) or the bolometric luminosity was requested.
There is one row per (cluster, output time) pair at which photometry was
actually written; call this row count n_rows.
filters(attribute, array of strings): The ordered list of filter names corresponding to the columns ofphot(and, where present,phot_extinct/phot_neb/phot_neb_extinct, excluding their own final entry – see below). Includes"Lbol"as its own final entry if the bolometric luminosity was requested.trial(unitless integer, shape(n_rows,)): The trial number.time(yr, shape(n_rows,)): The output time this photometry was computed at.uid(unitless integer, shape(n_rows,)): The unique identifier of the cluster this photometry belongs to.phot(shape(n_rows, n_filters); units given per-column by this dataset’s ownunitsattribute, an array of strings matchingfilters, since different filters can report in different units): The un-extincted photometry in every requested filter, including a final"Lbol"column if the bolometric luminosity was requested.phot_extinct(shape(n_rows, n_real_filters); only ifextinct.modelwas set and at least one real filter was requested): The same photometry after applying dust extinction. Never includes an"Lbol"column: the bolometric luminosity is computed directly from the stellar tracks, not from the (extincted or nebular-inclusive) spectrum, so it has no extincted counterpart –n_real_filtersexcludes it even whenphotitself includes it.phot_neb(shape(n_rows, n_real_filters); only if a nebular emission grid was requested and at least one real filter was requested): The un-extincted photometry including the nebular continuum’s contribution.phot_neb_extinct(shape(n_rows, n_real_filters); only if a nebular emission grid,extinct.model, and at least one real filter were all requested): The nebular-inclusive photometry after applying dust extinction.
Extinction curves cover only a limited range of wavelengths (for example, the
Calzetti curves do not extend below 912 Angstrom), and the extincted spectrum is
undefined outside that range. A value in phot_extinct or
phot_neb_extinct is therefore NaN for any filter whose passband extends,
even partly, past the edge of the extinction curve’s wavelength coverage, since
the extincted photometry cannot be computed for that filter. For example, the
ionizing-photon filter Q(HI) is NaN in phot_extinct when using a
Calzetti curve, provided the stellar spectral library extends below 912
Angstrom, as libraries that include ionizing radiation do. If the passband also
extends beyond the stellar spectral library’s wavelength range, only the part
within the library’s range counts. A filter lying entirely outside the
library’s range is never NaN, whether or not extinction is enabled: instead, a
photon-count filter (e.g. Q(HI)) reports zero photons/s, and an energy-flux
filter reports zero flux, which appears as an infinite magnitude if the
photometric system is a magnitude system (AB, ST, or Vega).
The cluster_yields Group
Holds the nucleosynthetic yields of individually-tracked clusters, present only if
at least one yield channel was requested (yields.channel1) and
output.write_cluster_yields was not set to false – see Yields for
how yields are computed. There is one row per (cluster, output time) pair; call
this row count n_rows. Each row gives the total mass of each isotope produced
by every star in the cluster that has died by that output time. Thus, if
yields.no_decay is true, the yields of a given cluster never decrease from one
output time to the next; otherwise the mass of an unstable isotope can also decrease
as it decays. The
isotopes, channels, models, and decomposed attributes describe
how to interpret the columns of yields.
isotopes(attribute, array of strings): The isotopes for which yields are tabulated, each labeled by its element symbol followed by its mass number (e.g."Fe56"), sorted by increasing atomic number and then increasing mass number. This is the set of isotopes selected byyields.isotopes, including the isotopes SLUG adds to it because they are linked to a listed isotope by radioactive decay (see Yields Control Keywords) or, ifyields.isotopeswas not given, every isotope tabulated by any requested yield model, plus their radioactive decay products.channels(attribute, array of strings): The type of each requested yield channel (see Yields), in the order they were given in the input deck, i.e.channels[i]is thechannelkeyword ofyields.channel<i+1>.models(attribute, array of strings): The yield model used for each requested yield channel, in the same order aschannels.decomposed(attribute, boolean, stored as the integer 0 or 1): The value ofyields.channel_decomposed, which determines the layout ofyields.trial(unitless integer, shape(n_rows,)): The trial number.time(yr, shape(n_rows,)): The output time these yields were computed at.uid(unitless integer, shape(n_rows,)): The unique identifier of the cluster these yields belong to.yields(Msun, shape(n_rows, n_cols)): The yield of each isotope. Ifdecomposedis true,n_colsis the number of channels times the number of isotopes, and the columns are ordered channel-major: the firstlen(isotopes)columns are the yields of every isotope from the first channel, the nextlen(isotopes)columns are the yields of every isotope from the second channel, and so on. That is, columni * len(isotopes) + jholds the yield ofisotopes[j]fromchannels[i], usingmodels[i]. Ifdecomposedis false,n_colsis just the number of isotopes, and columnjholds the yield ofisotopes[j]summed over all channels. Whether these are the amounts of each isotope present attimeor the total amounts ever produced depends onyields.no_decay.
The cluster_feedback Group
Holds the feedback (supernovae and stellar winds) of individually-tracked clusters,
present only if output.write_cluster_feedback was not set to false – see
Feedback for how feedback is computed. There is one row per (cluster,
output time) pair; call this row count n_rows. Every dataset below has shape
(n_rows,).
trial(unitless integer): The trial number.time(yr): The output time this feedback was computed at.uid(unitless integer): The unique identifier of the cluster this feedback belongs to.n_sn(unitless): The cumulative number of core-collapse supernovae that have occurred in the cluster bytime. This includes a contribution from the non-stochastic part of the stellar population, and thus need not be an integer (see Feedback).mdot_wind(Msun/yr): The instantaneous mass flux of stellar winds from every star in the cluster that is alive attime.pdot_wind(Msun km/(s yr)): The instantaneous momentum flux of those winds.edot_wind(Lsun): The instantaneous kinetic energy flux of those winds.
The galaxy Group
Present only for a galaxy-type simulation. Holds one row per (trial, output
time) pair actually written; call this row count n_rows (ordinarily
n_trial times the number of output times per trial, though a stochastic
output-time distribution can make different trials write different numbers of
rows – see The SLUG Input Deck). Every dataset below has shape
(n_rows,).
trial(unitless integer): The trial number.time(yr): The output time this row was recorded at.target_mass(Msun): The total stellar mass the galaxy’s own star formation history says should have formed by this time.actual_mass(Msun): The total stellar mass actually realized (summed over every individually-tracked cluster and the continuous stellar population, if any) by this time.
The galaxy_spectra Group
Present only for a galaxy-type simulation with a spectral synthesizer
requested. Identical in structure and meaning to the cluster_spectra group
above – including its wl/wl_extinct/line_wl/line_label,
spec/spec_extinct/spec_neb/spec_neb_extinct, and
neb_lines/neb_lines_extinct datasets, all with the same meaning – but
with no uid dataset, since a galaxy has no individual identity the way a
cluster does: each row is one (trial, output time) pair (the whole galaxy’s
own integrated spectrum), not one (cluster, output time) pair.
The galaxy_phot Group
Present only for a galaxy-type simulation with photometry or the bolometric
luminosity requested. Identical in structure and meaning to the
cluster_phot group above – including its filters attribute and
phot/phot_extinct/phot_neb/phot_neb_extinct datasets – but
with no uid dataset: each row is one (trial, output time) pair (the whole
galaxy’s own integrated photometry), not one (cluster, output time) pair.
The galaxy_yields Group
Present only for a galaxy-type simulation with at least one yield channel
requested and output.write_galaxy_yields not set to false. Identical in structure
and meaning to the cluster_yields group above – including its isotopes,
channels, models, and decomposed attributes and its yields dataset –
but with no uid dataset: each row is one (trial, output time) pair (the
yields of the whole galaxy), not one (cluster, output time) pair. The yields in
each row are summed over every star that has died in the galaxy by that time,
whether it formed in an individually-tracked cluster (including clusters that have
since disrupted), as a field star, or as part of the continuous (non-stochastic)
stellar population.
Note that in a galaxy-type simulation, the rows of cluster_yields are
written only for clusters that have not yet disrupted at the output time in question,
even though the yields of disrupted clusters are still included in the
galaxy_yields totals.
The galaxy_feedback Group
Present only for a galaxy-type simulation with output.write_galaxy_feedback not
set to false. Identical in structure and meaning to the cluster_feedback group
above – including its n_sn, mdot_wind, pdot_wind, and edot_wind
datasets – but with no uid dataset: each row is one (trial, output time) pair
(the feedback of the whole galaxy), not one (cluster, output time) pair. The
supernova count in each row is summed over every star that has exploded in the
galaxy by that time, and the wind fluxes over every star alive at that time,
whether it formed in an individually-tracked cluster (including clusters that have
since disrupted), as a field star, or as part of the continuous (non-stochastic)
stellar population.
As for yields, in a galaxy-type simulation the rows of cluster_feedback are
written only for clusters that have not yet disrupted at the output time in
question, even though the feedback of disrupted clusters is still included in the
galaxy_feedback totals.
The cluster_cloudy Group
Not produced by SLUG itself. Instead, this group is created (and appended to)
by slugpy’s own run_cloudy method, run with spec_type="cluster",
which post-processes one or more of this file’s cluster_spectra rows
through Cloudy to compute a
photoionized nebula’s emergent continuum and emission lines – see
Cloudy Nebular Processing for details of that process. Present only once
run_cloudy has actually been called on this file at least once. There is
one row per (cluster, output time) pair with a stored Cloudy run; call this
row count n_rows.
uid(unitless integer, shape(n_rows,)): The unique identifier of the cluster this row’s Cloudy run was computed from.time(yr, shape(n_rows,)): The output time of the spectrum this row’s Cloudy run was computed from.nII(cm-3, shape(n_rows,)): The number density of H nuclei assumed for this row’s HII region.r0(cm, shape(n_rows,)): The inner (wind-cleared cavity) radius assumed for this row’s HII region.r1(cm, shape(n_rows,)): The outer radius assumed for this row’s HII region.U(unitless, shape(n_rows,)): The volume-averaged ionization parameter of this row’s HII region.U0(unitless, shape(n_rows,)): The ionization parameter at the inner radiusr0of this row’s HII region.Omega(unitless, shape(n_rows,)): The dimensionless wind parameter of this row’s HII region.wl(Angstrom, shape(n_wl_cloudy,); only present once at least one row has continuum output): The wavelength grid shared byspec_inc/spec_trans/spec_emit/spec_trans_emitbelow. Cloudy’s own output grid always shares the same maximum wavelength and spacing across runs, but the minimum wavelength can vary; this grid is the longest one seen among rows with continuum output, and rows whose own grid was shorter are zero-padded at the low-wavelength end.spec_inc,spec_trans,spec_emit,spec_trans_emit(erg/(s Angstrom), shape(n_rows, n_wl_cloudy)): This row’s Cloudy-computed incident, transmitted, emitted, and transmitted-plus-emitted continuum, respectively. A row with no continuum output of its own (including any row written before the first row with continuum output was ever stored) is all zero.line_wl(Angstrom, shape(n_lines_cloudy,); only present once at least one row has line output): The rest-frame wavelength of every distinct emission line reported by any stored row’s Cloudy run – since different runs need not report the same set of lines, this is the union of every one seen so far, sorted by wavelength.line_label(string, shape(n_lines_cloudy,)): A short label identifying the species/transition of each entry ofline_wl, in the same order.line_lum(erg/s, shape(n_rows, n_lines_cloudy)): This row’s own Cloudy-reported luminosity for each line inline_wl/line_label, without extinction applied; zero for any line that row’s own run did not report, including an all-zero row for a row with no line output at all.
Since it is written by slugpy rather than by SLUG itself, cluster_cloudy
has no ASCII counterpart: Cloudy post-processing results are only ever stored
in an HDF5 output file.
The galaxy_cloudy Group
Identical in structure and meaning to the cluster_cloudy group above –
including its physical-condition, continuum, and line datasets – except
written by run_cloudy(spec_type="galaxy") from this file’s own
galaxy_spectra rows, and with a trial dataset (the trial number of
the row’s own galaxy spectrum) in place of uid, since a galaxy has no
individual identity the way a cluster does.
ASCII Format
Every ASCII output file begins with two header rows (column names, then column
units) and a row of dashes, followed by one data row per line, with columns
laid out as fixed-width fields. Where a group above splits one physical
quantity across several HDF5 datasets of different shapes (e.g. a 2D spec
array alongside 1D trial/time/uid arrays), the corresponding ASCII
file instead lays out one row per (cluster or trial, output time, wavelength or
line) combination, repeating the trial/time/uid columns on every
such row – there is no way to represent a ragged, multi-dimensional structure
in a flat text table. Because of this, spectra and nebular-line files are
generally far longer, row for row, than their HDF5 counterparts’ own row
counts would suggest.
The <model_name>_summary.txt File
Always written, exactly once, regardless of what other output was requested.
Holds the same top-level information the HDF5 format stores as file
attributes, as plain key value lines, followed by the input deck’s own
text in full:
slug-hash: The git commit hash of the SLUG build that produced this run.date: The local date (YYYY-MM-DD) this run started.time: The local time (HH:MM:SS) this run started.rng_state: The serialized state of the random number generator at the start of the run.input_deck: A label line, followed by the full text of the TOML input deck used for this run. Unlike HDF5’strials_completed/restart_uid/max_trialattributes, ASCII output has no corresponding fields, since checkpointing (and, with it,--restart) is only supported with HDF5 output.
The <model_name>_clusters.txt File
One row per individually-tracked cluster – see the clusters HDF5 group
above for exactly which clusters that means and what each column means.
Columns, in order: trial, uid, target_mass (Msun), birth_mass
(Msun), form_time (yr), feh, a_v and a_v_neb (mag; only if
extinct.model was set; the HDF5 group’s A_V and A_V_neb), rng.
The <model_name>_cluster_spectra.txt File
One row per (cluster, output time, wavelength) combination – i.e. every
wavelength point of every spectrum gets its own row. Columns, in order:
trial, time (yr), uid, wl (Angstrom), spec
(erg/(s Angstrom)), spec_ex (erg/(s Angstrom); only if extinct.model
was set), spec_neb (erg/(s Angstrom); only if a nebular emission grid was
requested), spec_neb_ex (erg/(s Angstrom); only if both were requested).
See the cluster_spectra HDF5 group above for what each column means –
spec_ex/spec_neb/spec_neb_ex here correspond to that group’s own
spec_extinct/spec_neb/spec_neb_extinct datasets.
The <model_name>_cluster_neb_lines.txt File
Only written if a nebular emission grid was requested. One row per (cluster,
output time, emission line) combination. Columns, in order: trial,
time (yr), uid, line_label (identifying which emission line this
row is), wl (Angstrom, that line’s rest-frame wavelength), line_lum
(erg/s, that line’s luminosity without extinction), line_lum_ex (erg/s;
only if extinct.model was set, that line’s luminosity with extinction
applied). Corresponds to the cluster_spectra HDF5 group’s own
line_wl/line_label/neb_lines/neb_lines_extinct datasets.
The <model_name>_cluster_phot.txt File
Only written if photometry or the bolometric luminosity was requested. One row
per (cluster, output time) pair. Columns, in order: trial, time (yr),
uid, then one column per requested filter (named after the filter itself,
e.g. HST.WFC3_UVIS1.F555W, or Lbol if the bolometric luminosity was
requested), giving the un-extincted photometry. If extinct.model was set,
one further <filter>_ex column follows per real filter (excluding
Lbol, which has no extincted counterpart); if a nebular emission grid was
requested, one further <filter>_neb column follows per real filter; if
both were requested, one further <filter>_neb_ex column follows per real
filter. See the cluster_phot HDF5 group above for what each of these
means – <filter>_ex/<filter>_neb/<filter>_neb_ex here correspond
to that group’s own phot_extinct/phot_neb/phot_neb_extinct
datasets.
The <model_name>_cluster_yields.txt File
Only written if at least one yield channel was requested and
output.write_cluster_yields was not set to false. One row per (cluster, output
time) pair. Columns, in order: trial, time (yr), uid, then one column
per isotope (if yields.channel_decomposed is false) or one column per (channel,
isotope) pair (if it is true, the default), each in units of Msun. An isotope
column is named after the isotope’s label, e.g. Fe56. A (channel, isotope) column
is named <channel><N>_<isotope>, where <channel> is the channel type
(ccsn or massive_star_winds), <N> is the channel’s own number in the input deck (so
channel2 gives <N> = 2, even if it is the only channel of its type), and
<isotope> is the isotope label, e.g. ccsn1_Fe56 or massive_star_winds2_H1.
Columns are ordered channel-major, with the isotopes in each channel sorted by
increasing atomic number and then mass number, matching the ordering of the
yields dataset described in the cluster_yields HDF5 group above. Unlike
the HDF5 output, the ASCII file has no separate record of which model was used for
each channel; this is recorded in the input deck copy in the summary file.
The <model_name>_cluster_feedback.txt File
Only written if output.write_cluster_feedback was not set to false. One row per
(cluster, output time) pair. Columns, in order: trial, time (yr), uid,
n_sn, mdot_wind (Msun/yr), pdot_wind (Msun km/s/yr), edot_wind
(Lsun). See the cluster_feedback HDF5 group above for what each column means.
In the row of units in the header, the units of pdot_wind are written as
Msun_km/s/yr, without spaces, so that the units row splits into exactly one
token per column.
The <model_name>_galaxy.txt File
Only written for a galaxy-type simulation. One row per (trial, output time)
pair. Columns, in order: trial, time (yr), target_mass (Msun),
actual_mass (Msun) – see the galaxy HDF5 group above for what each
means.
The <model_name>_galaxy_spectra.txt File
Only written for a galaxy-type simulation with a spectral synthesizer
requested. Identical to <model_name>_cluster_spectra.txt above – same
columns and meanings – except with no uid column, and one row per
(trial, output time, wavelength) combination rather than (cluster, output
time, wavelength), since each row describes the whole galaxy’s own integrated
spectrum.
The <model_name>_galaxy_neb_lines.txt File
Only written for a galaxy-type simulation with a nebular emission grid
requested. Identical to <model_name>_cluster_neb_lines.txt above, except
with no uid column, and one row per (trial, output time, emission line)
combination rather than (cluster, output time, emission line).
The <model_name>_galaxy_phot.txt File
Only written for a galaxy-type simulation with photometry or the bolometric
luminosity requested. Identical to <model_name>_cluster_phot.txt above,
except with no uid column, and one row per (trial, output time) pair
describing the whole galaxy’s own integrated photometry rather than one
individual cluster’s.
The <model_name>_galaxy_yields.txt File
Only written for a galaxy-type simulation with at least one yield channel
requested and output.write_galaxy_yields not set to false. Identical to
<model_name>_cluster_yields.txt above – same columns and meanings – except with no
uid column, and one row per (trial, output time) pair describing the yields of
the whole galaxy rather than one individual cluster’s.
The <model_name>_galaxy_feedback.txt File
Only written for a galaxy-type simulation with output.write_galaxy_feedback not
set to false. Identical to <model_name>_cluster_feedback.txt above – same
columns and meanings – except with no uid column, and one row per (trial,
output time) pair describing the feedback of the whole galaxy rather than of one
individual cluster.