Recording simulation data

CMDimData.jl (using HDF5.jl)

GitHub - ma-laforge/CMDimData.jl: Parametric analysis/visualization +continuous-f(x) interpolation

If you want a solution that already deals with input parameter sweeps for:

  • running your math simultaneously on all swept values
  • storing the results to a single HDF5 file
  • plotting the entire dataset (or a subset of it) as if it was a single x,y vector

You might want to give CMDimData.jl a try.

I created an example below assuming those 1000 runs were monte-carlo iterations (though I only did 100):

using MDDatasets #Multi-dimensional functionnality
using CMDimData #Environment to save/plot data from MDDatasets
using CMDimData.EasyPlot #Generic plotting facilities

#Use InspectDR as plotting backend:
CMDimData.@includepkg EasyPlotInspect; pdisp = EasyPlotInspect.PlotDisplay()

#Use EasyData (and load HDF5 library):
CMDimData.@includepkg EasyData #Save multi-dimensional dataset to hdf5 file


#==Input data
====================================================#
npts = 200
samples_per_cycle = 50
xrng = 1:npts #Julia range
x = DataF1(1:npts) #x-values as function of 1 argument (vec of {x,y} pairs)


#==Simulation itself
====================================================#
function run_simulation(x, param1, param2)
	noise_floor = DataF1(x.x, randn(length(x))*.5)
	y = param1*cos(x*(2*pi/samples_per_cycle))+param2
	return y+noise_floor
end


#==Run simulation for all parameters (incl. monte-carlo iterations)
====================================================#
#Create/populate multi-dimensional "signal" object:
signal = fill(DataRS, PSweep("MC", collect(1:100))) do i_mc
	fill(DataRS, PSweep("param1", [0.5, 1, 1.5])) do param1
	#Inner-most sweep: need to specify element type (DataF1):
	#(Other (scalar) element types: DataInt/DataFloat/DataComplex)
	fill(DataRS{DataF1}, PSweep("param2", [1, 4, 16])) do param2
		sig = run_simulation(x, param1, param2)
		return sig
end; end; end


#==Generate plot
====================================================#
_title = "Monte-Carlo simulation"
axrange = cons(:a, xyaxes=set(ymin=-5, ymax=20))
line_attr = cons(:a, line = set(style=:solid, width=2))
plot = cons(:plot, axrange, nstrips=1, title=_title,
	ystrip1 = set(axislabel="Amplitude", striplabel=""),
	xaxis = set(label="Time (s)"),
)
push!(plot,
	cons(:wfrm, signal, line_attr, label="result", strip=1),
)


#==Display results in pcoll
====================================================#
#Need a plot collection (multi-plot window), to use plots:
pcoll = push!(cons(:plotcoll, title=""), plot)
gplot = display(pdisp, pcoll)


#==Save data to HDF5 (could also have saved plot)
====================================================#
EasyData.openwriter("output.hdf5") do w
	write(w, signal, "simresult")
end

EasyData.openreader("output.hdf5") do r
	signal_from_file = EasyData.readdata(r, "simresult")
end

println("Do something to keep last value from being dumped to REPL")