Summary statistics
It is often useful to collect summary statistics as a simulation runs and avoid storing complete simulation boxes. The UltraDark.Summary
module makes this easy.
Example
Say you want to extract the minimum density at each time step. Define a struct to contain this data:
struct MinDensity
ρx_min::Float64
end
and a function to construct it
function MaxDensity(sim_time, a, Δt, grids, constants, external_states)
ρx_min = minimum(grids.ρx)
MinDensity(ρx_max)
end
MaxDensity (generic function with 1 method)
Passing this object into a simulation will add a column to $output_path/summary.csv
containing the single value contained by MinDensity
.
More complex statistics are also possible.
Docstrings
UltraDark.Summary
— ModuleSummary
The Summary
module contains utilities for computing and outputting summary statistics at each time step.
UltraDark.Summary.AngularMomentum
— Typestruct AngularMomentum
Total angular momentum in each of 3 directions
Examples
A stationary field has no angular momentum
```jldoctest julia> using UltraDark
julia> g = Grids(1.0, 16);
julia> g.ψx .= 1;
julia> Summary.AngularMomentum(0., 1., 1e-1, g, nothing) UltraDark.Summary.AngularMomentum(0.0, 0.0, 0.0)
Fields
Lx::Float64
Ly::Float64
Lz::Float64
UltraDark.Summary.EnergyGravity
— Typestruct EnergyGravity
Gravitational potential energy
Fields
E_grav::Float64
UltraDark.Summary.EnergyKineticQuantum
— Typestruct EnergyKineticQuantum
Gravitational potential energy
Fields
E_kq::Float64
UltraDark.Summary.MaxDensity
— Typestruct MaxDensity
Fields
ρx_max::Float64
: max of density
UltraDark.Summary.MaxDensityIndex
— Typestruct MaxDensityIndex
This struct contains 4 useful pieces of information: the maxiumum value and three indices. Each is output to a summary.
Fields
ρx_max::Float64
: max of densitymax_index_x::Int32
: x index of max densitymax_index_y::Int32
: y index of max densitymax_index_z::Int32
: z index of max density
UltraDark.Summary.MeanDensity
— Typestruct MeanDensity
Summary statistic containing the mean density and the number of cells over which it was calculated.
Examples
julia> using UltraDark
julia> g = Grids(1.0, 16);
julia> Summary.MeanDensity(g)
UltraDark.Summary.MeanDensity(0.0, 4096)
Fields
ρx_mean::Float64
: mean of densityn::Int64
: number of grid points summarized
UltraDark.Summary.RmsDensityContrast
— Typestruct RmsDensityContrast
Fields
δx_rms::Float64
: RMS of density contrastn::Int64
: number of grid points summarized
UltraDark.Summary.ScaleFactor
— Typestruct ScaleFactor
Fields
a::Float64
: scale factor
UltraDark.Summary.SimulationTime
— Typestruct SimulationTime
Fields
t::Float64
: time
UltraDark.Summary.TimeStep
— Typestruct TimeStep
Fields
Δt::Float64
: time step
UltraDark.Summary.TotalMass
— Typestruct TotalMass
Total mass on a grid
Examples
julia> using UltraDark
julia> g = Grids(1.0, 16);
julia> Summary.TotalMass(0.0, 1.0, 1e-1, g, nothing, ())
UltraDark.Summary.TotalMass(0.0)
Fields
mass::Float64
UltraDark.Summary.WallTime
— Typestruct WallTime
The current time in the real world.
Examples
WallTime
created after another contains a later time.
julia> using UltraDark
julia> t1 = Summary.WallTime();
julia> t2 = Summary.WallTime(0.0, 1.0, 1e-1, Grids(1.0, 16), nothing, ());
julia> t1.date <= t2.date
true
Fields
date::Dates.DateTime
: wall time
UltraDark.Summary.column_title
— Methodcolumn_title(summary_struct)
Get column title
Assumes that the desired column title is the name of the first field. This can be refined for other structs by defining a specialization for the given datatype.
Note that the input argument is of type Val{T}
, so that one can dispatch on T
.
UltraDark.Summary.column_titles
— Methodcolumn_titles(summaries)
Generate column titles from an iterable of summaries
UltraDark.Summary.generate_summary_row
— Methodgenerate_summary_row(summaries)
UltraDark.Summary.get_relevant_data
— Methodget_relevant_data(summary_struct)
Format column entry as string
By default, assumes that the desired data is in the first field of the struct. This can be refined for other structs by defining a specialization for the given datatype and returning a comma separated string.
UltraDark.Summary.map_summary_statistics
— Methodmap_summary_statistics(
summary_statistics,
sim_time,
a,
Δt,
grids,
constants,
external_states
) -> Any
Calculate each summary statistic in summary_statistics
If the grids is a PencilGrids
, this uses MPI.Reduce
to compute partial summaries in each task and combine them.
UltraDark.Summary.output_summary_header
— Methodoutput_summary_header(output_config) -> Int64
Write a header for a summary file
The header contains labels for each column of the summary CSV file. This function overwrites the current contents of the file.
UltraDark.Summary.output_summary_row
— Methodoutput_summary_row(
grids,
output_config,
t,
a,
Δt,
constants,
external_states
) -> Int64
Write a new row to the summary file
UltraDark.Summary.pool_summarystat
— Methodpool_summarystat(S1::MaxDensity, S2::MaxDensity)
MPI reduction operator for max density
UltraDark.Summary.pool_summarystat
— Methodpool_summarystat(S1::MaxDensity, S2::MaxDensity)
MPI reduction operator for max density index
UltraDark.Summary.pool_summarystat
— Methodpool_summarystat(S1::MeanDensity, S2::MeanDensity)
MPI reduction operator for mean density
UltraDark.Summary.pool_summarystat
— Methodpool_summarystat(S1::RmsDensityContrast, S2::RmsDensityContrast)
MPI reduction operator for summary statistics.
UltraDark.Summary.pool_summarystat
— Methodpool_summarystat(S1::ScaleFactor, S2::ScaleFactor)
MPI reduction operator for scale factor
Check that scale factors are equal and return
UltraDark.Summary.pool_summarystat
— Methodpool_summarystat(S1::SimulationTime, S2::SimulationTime)
MPI reduction operator for simulation time
Check that times are equal and return
UltraDark.Summary.pool_summarystat
— Methodpool_summarystat(S1::TimeStep, S2::TimeStep)
MPI reduction operator for scale factor
Check that scale factors are equal and return
UltraDark.Summary.pool_summarystat
— Methodpool_summarystat(S1::WallTime, S2::WallTime)
MPI reduction operator for wall time
Return the time of the first argument.