class Archive { // netcdf single-file version. Replaces the text-file Archive used up through NPZmachine 2.6. // now saves all vars, fluxes, and params: no need to specify which to save. float dt = 1; // one save per time unit by default State[] states = new State[0]; State lastSave = null; String basename; Environment env; boolean announceSaves = false; boolean clearOnRewind = true; String[] infoNames = new String[0]; Object[] infoValues = new Object[0]; Archive(String basename, float dt, Environment env) { this.basename = basename; this.dt = dt; this.env = env; } void save(State S) { // push a snapshot of the system into the archive lastSave = S; states = (State[])append(states,S); if (announceSaves) println("t = " + lastSave.getVar("t",0)); } void offer(State S) { // let the archive decide if it wants this snapshot boolean saveIt = (lastSave == null); if (!saveIt) saveIt = (S.getVar("t",0) >= lastSave.getVar("t",0) + dt); if (saveIt) save(S); } void rewind(State S) { if (clearOnRewind) { states = new State[0]; lastSave = null; if (announceSaves) println("archive cleared"); } save(S); } void addNameValuePair(String name, float value) { infoNames = append(infoNames, name); infoValues = (Object[])append(infoValues, new Float(value)); } void addNameValuePair(String name, float[] value) { infoNames = append(infoNames, name); infoValues = (Object[])append(infoValues, value); } void addNameValuePair(String name, float[][] value) { infoNames = append(infoNames, name); infoValues = (Object[])append(infoValues, value); } void toFile() { NetcdfFileWriteable nc = null; try { nc = NetcdfFileWriteable.createNew(baseOutputPath + basename + ".nc", false); if (announceSaves) println("creatng " + nc.getLocation()); ucar.nc2.Dimension timeDim = nc.addDimension("time", states.length); ucar.nc2.Dimension cellsDim = nc.addDimension("cells", env.Ncells); ucar.nc2.Dimension oneDim = nc.addDimension("one", 1); ucar.ma2.DataType FLOAT = ucar.ma2.DataType.FLOAT; // define scalar netcdf variables for name-value pairs for (int i=0; i