Skip to content

Commit 92568a5

Browse files
committed
Close output writers at the end of the simulation
1 parent f82212e commit 92568a5

File tree

8 files changed

+38
-1
lines changed

8 files changed

+38
-1
lines changed

experiments/integrated/fluxnet/ozark_pft.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,8 @@ prob = SciMLBase.ODEProblem(
324324

325325
sol = SciMLBase.solve(prob, ode_algo; dt = dt, callback = cb);
326326

327+
ClimaLand.Diagnostics.close_output_writers(diags)
328+
327329
# Extract model output from the saved diagnostics
328330
short_names_1D = [
329331
"sif", # SIF

experiments/integrated/fluxnet/run_fluxnet.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,8 @@ prob = SciMLBase.ODEProblem(
293293

294294
sol = SciMLBase.solve(prob, ode_algo; dt = dt, callback = cb);
295295

296+
ClimaLand.Diagnostics.close_output_writers(diags)
297+
296298
# Extract model output from the saved diagnostics
297299
short_names_1D = [
298300
"sif", # SIF

experiments/integrated/global/global_soil_canopy.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,8 @@ sol = ClimaComms.@time ClimaComms.device() SciMLBase.solve(
244244
callback = SciMLBase.CallbackSet(driver_cb, diag_cb),
245245
)
246246

247+
ClimaLand.Diagnostics.close_output_writers(diags)
248+
247249
# ClimaAnalysis
248250
if ClimaComms.iamroot(context)
249251
simdir = ClimaAnalysis.SimDir(outdir)

experiments/standalone/Bucket/bucket_era5.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,8 @@ sol = ClimaComms.@time ClimaComms.device() SciMLBase.solve(
213213
callback = cb,
214214
);
215215

216+
ClimaLand.Diagnostics.close_output_writers(diags)
217+
216218
simdir = ClimaAnalysis.SimDir(output_dir)
217219
short_names = ["rn", "tsfc", "qsfc", "lhf", "shf", "wsoil", "wsfc", "ssfc"]
218220
for short_name in short_names

experiments/standalone/Bucket/global_bucket_function.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,8 @@ sol = ClimaComms.@time ClimaComms.device() SciMLBase.solve(
193193
callback = SciMLBase.CallbackSet(driver_cb, diag_cb),
194194
)
195195

196+
ClimaLand.Diagnostics.close_output_writers(diags)
197+
196198
#### ClimaAnalysis ####
197199

198200
# all

src/diagnostics/Diagnostics.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ import ClimaDiagnostics.Writers: HDF5Writer, NetCDFWriter, DictWriter
3232
import ClimaCore.Fields: zeros, field_values
3333
import ClimaCore.Operators: column_integral_definite!
3434

35+
export close_output_writers
36+
3537
include("diagnostic.jl")
3638

3739
end

src/diagnostics/diagnostic.jl

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,22 @@ function diagnostic_as_vectors(writer::DictWriter, diagnostic; layer = 1)
150150
return times, vector_layer_n
151151
end
152152

153+
"""
154+
close_output_writers(diagnostics)
155+
156+
Close the output writers in the `diagnostics`, an iterable of
157+
`ClimaDiagnostics.ScheduledDiagnostic` or `nothing`.
158+
159+
This function should be called at the end of every simulation.
160+
"""
161+
function close_output_writers(diagnostics)
162+
isnothing(diagnostics) && return nothing
163+
for diagnostic in diagnostics
164+
close(diagnostic.output_writer)
165+
end
166+
return nothing
167+
end
168+
153169
# Do you want to define more diagnostics? Add them here
154170
include("land_compute_methods.jl")
155171

src/simulations/Simulations.jl

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ using ClimaLand
1010
export step!, solve!, LandSimulation
1111
include("initial_conditions.jl")
1212

13+
import ..Diagnostics: close_output_writers
14+
1315
"""
1416
LandSimulation{
1517
M <: ClimaLand.AbstractModel,
@@ -194,7 +196,14 @@ Advances the land simulation `landsim` forward from the initial to final time,
194196
updating `landsim` in place.
195197
"""
196198
function solve!(landsim::LandSimulation)
197-
SciMLBase.solve!(landsim._integrator)
199+
try
200+
SciMLBase.solve!(landsim._integrator)
201+
catch ret_code
202+
@error "ClimaLand simulation crashed. Stacktrace for failed simulation" exception =
203+
(ret_code, catch_backtrace())
204+
finally
205+
close_output_writers(landsim.diagnostics)
206+
end
198207
end
199208

200209

0 commit comments

Comments
 (0)