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
endand a function to construct it
function MaxDensity(sim_time, a, Δt, grids, constants, external_states)
ρx_min = minimum(grids.ρx)
MinDensity(ρx_max)
endMaxDensity (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 — ModuleSummaryThe Summary module contains utilities for computing and outputting summary statistics at each time step.
UltraDark.Summary.AngularMomentum — Typestruct AngularMomentumTotal 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::Float64Ly::Float64Lz::Float64
UltraDark.Summary.EnergyGravity — Typestruct EnergyGravityGravitational potential energy
Fields
E_grav::Float64
UltraDark.Summary.EnergyKineticQuantum — Typestruct EnergyKineticQuantumGravitational potential energy
Fields
E_kq::Float64
UltraDark.Summary.MaxDensity — Typestruct MaxDensityFields
ρx_max::Float64: max of density
UltraDark.Summary.MaxDensityIndex — Typestruct MaxDensityIndexThis 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 MeanDensitySummary 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 RmsDensityContrastFields
δx_rms::Float64: RMS of density contrastn::Int64: number of grid points summarized
UltraDark.Summary.ScaleFactor — Typestruct ScaleFactorFields
a::Float64: scale factor
UltraDark.Summary.SimulationTime — Typestruct SimulationTimeFields
t::Float64: time
UltraDark.Summary.TimeStep — Typestruct TimeStepFields
Δt::Float64: time step
UltraDark.Summary.TotalMass — Typestruct TotalMassTotal 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 WallTimeThe 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
trueFields
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.