From 0188c72b42ebc1ee1e880cd2e6597a08f52ac883 Mon Sep 17 00:00:00 2001 From: Haakon Ludvig Langeland Ervik <45243236+haakon-e@users.noreply.github.com> Date: Thu, 4 Nov 2021 23:19:45 -0700 Subject: [PATCH] refactor: run short simulation for reference SCM --- src/Pipeline.jl | 2 +- src/TurbulenceConvectionUtils.jl | 95 +++++++++++++++----------------- src/helper_funcs.jl | 24 +++++--- test/ReferenceModels/runtests.jl | 2 +- test/ReferenceStats/runtests.jl | 3 +- 5 files changed, 66 insertions(+), 60 deletions(-) diff --git a/src/Pipeline.jl b/src/Pipeline.jl index 26c386683..8ab2c46d9 100644 --- a/src/Pipeline.jl +++ b/src/Pipeline.jl @@ -80,7 +80,7 @@ function init_calibration(config::Dict{Any, Any}; mode::String = "hpc", job_id:: ref_models = construct_reference_models(kwargs_ref_model) # Create input scm stats and namelist file if files don't already exist - run_SCM(ref_models, overwrite = overwrite_scm_file) + run_reference_SCM.(ref_models, overwrite = overwrite_scm_file) # Generate reference statistics ref_stats = ReferenceStatistics( diff --git a/src/TurbulenceConvectionUtils.jl b/src/TurbulenceConvectionUtils.jl index 986d46285..e6f6c389f 100644 --- a/src/TurbulenceConvectionUtils.jl +++ b/src/TurbulenceConvectionUtils.jl @@ -13,7 +13,7 @@ using TurbulenceConvection include(joinpath(@__DIR__, "helper_funcs.jl")) export ModelEvaluator -export run_SCM, run_SCM_handler +export run_SCM, run_SCM_handler, get_scm_namelist, run_reference_SCM export generate_scm_input, get_gcm_les_uuid export save_full_ensemble_data export precondition @@ -120,26 +120,57 @@ function run_SCM(ME::ModelEvaluator; error_check::Bool = false) where {FT <: Rea end """ - run_SCM( - RM::Vector{ReferenceModel}; - overwrite::Bool, - ) where FT<:Real + get_scm_namelist(m::ReferenceModel; overwrite::Bool = false)::Dict + +Fetch the namelist stored in `scm_dir(m)`. +Generate a new namelist if it doesn't exist or `overwrite=true`. +""" +function get_scm_namelist(m::ReferenceModel; overwrite::Bool = false)::Dict + namelist_path = namelist_directory(scm_dir(m), m) + namelist = if ~isfile(namelist_path) | overwrite + NameList.default_namelist(m.case_name, root = scm_dir(m)) + else + JSON.parsefile(namelist_path) + end + return namelist +end -Run the single-column model (SCM) for each reference model object +""" + run_reference_SCM(m::ReferenceModel; overwrite::Bool = false) + +Run the single-column model (SCM) for a reference model object using default parameters. Inputs: - - RM :: Vector of `ReferenceModel`s - - overwrite :: if true, overwrite existing simulation files + - m :: A `ReferenceModel` + - overwrite :: if true, overwrite existing simulation files Outputs: - Nothing """ -function run_SCM(RM::Vector{ReferenceModel}; overwrite::Bool = false) where {FT <: Real} - - for ref_model in RM - output_dir = scm_dir(ref_model) - if ~isdir(output_dir) | overwrite - run_SCM_handler(ref_model, dirname(output_dir)) +function run_reference_SCM(m::ReferenceModel; overwrite::Bool = false) + namelist = get_scm_namelist(m, overwrite = overwrite) + # prepare and run simulation + output_dir = scm_dir(m) + if ~isfile(get_stats_path(output_dir)) | overwrite + # Run only 1 timestep -- since we don't need output data, only simulation config + default_t_max = namelist["time_stepping"]["t_max"] + namelist["time_stepping"]["t_max"] = namelist["time_stepping"]["dt"] + namelist["meta"]["uuid"] = uuid(m) + namelist["output"]["output_root"] = dirname(output_dir) + # if `LES_driven_SCM` case, provide input LES stats file + if m.case_name == "LES_driven_SCM" + namelist["meta"]["lesfile"] = get_stats_path(y_dir(m)) + end + # run TurbulenceConvection.jl + try + main(namelist) + catch + @warn "Default TurbulenceConvection.jl simulation failed. Verify default setup." + end + # reset t_max to default and overwrite stored namelist file + namelist["time_stepping"]["t_max"] = default_t_max + open(namelist_directory(output_dir, m), "w") do io + JSON.print(io, namelist, 4) end end end @@ -240,42 +271,6 @@ function create_parameter_vectors(u_names::Vector{String}, u::Vector{FT}) where return (u_names_out, u_out) end -""" - run_SCM_handler( - m::ReferenceModel, - output_dir::String; - ) where {FT<:AbstractFloat} - -Run a case with default SCM parameters and return data -directory pointing to where data is stored for simulation run. - -Inputs: - - m :: Reference model - - output_dir :: Directory to store simulation results in -Outputs: - - output_dirs :: directory containing output data from the SCM run. -""" -function run_SCM_handler(m::ReferenceModel, output_dir::String) where {FT <: AbstractFloat} - - namelist = NameList.default_namelist(m.case_name) - # calling NameList.default_namelist writes namelist to pwd - rm("namelist_" * namelist["meta"]["casename"] * ".in") - namelist["meta"]["uuid"] = uuid(m) - # set output dir to `output_dir` - namelist["output"]["output_root"] = output_dir - # if `LES_driven_SCM` case, provide input LES stats file - if m.case_name == "LES_driven_SCM" - namelist["meta"]["lesfile"] = get_stats_path(y_dir(m)) - end - # run TurbulenceConvection.jl - try - main(namelist) - catch - @warn "Default TurbulenceConvection.jl simulation failed. Verify default setup." - end - return data_directory(output_dir, m.case_name, namelist["meta"]["uuid"]) -end - """ generate_scm_input(model_evaluator::ModelEvaluator, outdir_path::String = pwd()) diff --git a/src/helper_funcs.jl b/src/helper_funcs.jl index c2e620d49..021eb8ec4 100644 --- a/src/helper_funcs.jl +++ b/src/helper_funcs.jl @@ -215,15 +215,25 @@ function get_stats_path(dir) return stat_files[1] catch e if isa(e, AssertionError) - @warn "No unique stats netCDF file found at $dir. Extending search to other files." - stat_files = readdir(stats, join = true) # WindowsOS/julia 1.6.0 relpath bug - if length(stat_files) == 1 - return stat_files[1] - else - @error "No unique stats file found at $dir." + @warn "No unique stats netCDF file found in $stats. Extending search to other files." + try + stat_files = readdir(stats, join = true) # WindowsOS/julia 1.6.0 relpath bug + if length(stat_files) == 1 + return stat_files[1] + else + @error "No unique stats file found at $dir." + end + catch f + if isa(f, Base.IOError) + @warn "Extended search errored with: $f" + return "" + else + throw(f) + end end else - @error "An error occurred retrieving the stats path at $dir." + @warn "An error occurred retrieving the stats path at $dir. Throwing..." + throw(e) end end end diff --git a/test/ReferenceModels/runtests.jl b/test/ReferenceModels/runtests.jl index 6488b5bcd..694a70156 100644 --- a/test/ReferenceModels/runtests.jl +++ b/test/ReferenceModels/runtests.jl @@ -38,7 +38,7 @@ end :Σ_t_end => [4.5 * 3600, 4.5 * 3600], ) ref_models = construct_reference_models(kwargs_ref_model) - run_SCM(ref_models, overwrite = false) + run_reference_SCM.(ref_models, overwrite = false) Δt = 5.0 * 3600 ref_model = time_shift_reference_model(ref_models[1], Δt) diff --git a/test/ReferenceStats/runtests.jl b/test/ReferenceStats/runtests.jl index fd7299a2d..fb1712fe6 100644 --- a/test/ReferenceStats/runtests.jl +++ b/test/ReferenceStats/runtests.jl @@ -18,7 +18,8 @@ using CalibrateEDMF.TurbulenceConvectionUtils :t_end => repeat([6.0 * 3600], 2), ) ref_models = construct_reference_models(kwargs_ref_model) - run_SCM(ref_models, overwrite = false) + namelists = get_scm_namelist.(ref_models, overwrite = false) + run_SCM(ref_models, namelists, overwrite = false) # Test only tikhonov vs PCA and tikhonov pca_list = [false, true]