Skip to content

Commit ea3efa6

Browse files
committed
Basic pipeline working
1 parent f972254 commit ea3efa6

File tree

6 files changed

+19
-30
lines changed

6 files changed

+19
-30
lines changed

experiments/ClimaEarth/components/atmosphere/climaatmos.jl

+1-4
Original file line numberDiff line numberDiff line change
@@ -427,12 +427,9 @@ function get_atmos_config_dict(coupler_dict::Dict, job_id::String, atmos_output_
427427
atmos_toml = joinpath.(pkgdir(CA), atmos_config["toml"])
428428
coupler_toml = joinpath.(pkgdir(ClimaCoupler), coupler_dict["coupler_toml"])
429429
toml = isempty(coupler_toml) ? atmos_toml : coupler_toml
430-
if haskey(atmos_config, "calibration_toml")
431-
push!(toml, atmos_config["calibration_toml"])
432-
end
433430
if !isempty(toml)
434431
@info "Overwriting Atmos parameters from input TOML file(s): $toml"
435-
atmos_config = merge(atmos_config, Dict("toml" => toml))
432+
atmos_config["toml"] = toml
436433
end
437434

438435
# Specify atmos output directory to be inside the coupler output directory

experiments/calibration/cld_eff_rad/generate_observations.jl

+4-11
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import EnsembleKalmanProcesses as EKP
55

66
const start_date = DateTime(2000, 3, 1)
77
const slice_time = 0.0
8-
const diagnostic_var = OutputVar(joinpath(pkgdir(ClimaCoupler), "experiments/calibration/cld_eff_rad/rsut_1M_average_8_helem.nc"))
8+
const diagnostic_var =
9+
OutputVar(joinpath(pkgdir(ClimaCoupler), "experiments/calibration/cld_eff_rad/rsut_1M_average_8_helem.nc"))
910

1011
include(joinpath(pkgdir(ClimaCoupler), "experiments/ClimaEarth/leaderboard/data_sources.jl"))
1112
resample(ov) = resampled_as(ov, diagnostic_var, dim_names = ["longitude", "latitude"])
@@ -27,17 +28,9 @@ cre = rsutcs - rsut
2728

2829
# Create an EKP.Observation
2930
rsut_slice = slice(rsut; time = slice_time)
30-
rsut_obs = EKP.Observation(
31-
vec(rsut_slice.data),
32-
Diagonal(vec(auto_covariance(rsut))),
33-
"rsut"
34-
)
31+
rsut_obs = EKP.Observation(vec(rsut_slice.data), Diagonal(vec(auto_covariance(rsut))), "rsut")
3532
cre_slice = slice(cre; time = slice_time)
36-
cre_obs = EKP.Observation(
37-
vec(cre_slice.data),
38-
Diagonal(vec(auto_covariance(cre))),
39-
"cre"
40-
)
33+
cre_obs = EKP.Observation(vec(cre_slice.data), Diagonal(vec(auto_covariance(cre))), "cre")
4134

4235
observations = EKP.combine_observations([rsut_obs, cre_obs])
4336
JLD2.save_object("experiments/calibration/cld_eff_rad/observations.jld2", observations)

experiments/calibration/cld_eff_rad/model_config.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
FLOAT_TYPE: "Float32"
2-
# use_itime: true
2+
use_itime: false
33
albedo_model: "CouplerAlbedo"
44
atmos_config_file: "config/longrun_configs/amip_target_edonly.yml"
55
checkpoint_dt: "99999days"

experiments/calibration/cld_eff_rad/model_interface.jl

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ ENV["CLIMACOMMS_CONTEXT"] = "SINGLETON"
77
include(joinpath(pkgdir(ClimaCoupler), "experiments", "ClimaEarth", "setup_run.jl"))
88

99
function ClimaCalibrate.forward_model(iter, member)
10-
10+
redirect_stderr(stdout) # This should live in ClimaCalibrate.set_worker_logger
1111
config_file = joinpath(pkgdir(ClimaCoupler), "experiments", "calibration", "cld_eff_rad", "model_config.yml")
1212
config_dict = get_coupler_config_dict(config_file)
1313

1414
output_dir_root = config_dict["coupler_output_dir"]
1515

1616
# Set member parameter file
1717
sampled_parameter_file = ClimaCalibrate.parameter_path(output_dir_root, iter, member)
18-
config_dict["calibration_toml"] = sampled_parameter_file
18+
config_dict["coupler_toml"] = [sampled_parameter_file]
1919
# Set member output directory
2020
member_output_dir = ClimaCalibrate.path_to_ensemble_member(output_dir_root, iter, member)
2121
config_dict["coupler_output_dir"] = member_output_dir

experiments/calibration/cld_eff_rad/observation_map.jl

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import EnsembleKalmanProcesses as EKP
66

77
function ClimaCalibrate.observation_map(iteration)
88
observation_vec = JLD2.load_object(observation_path)
9-
single_member_dims = length(EKP.get_obs(first(observation_vec))) * batch_size
9+
single_member_dims = length(EKP.get_obs(observations))
1010
G_ensemble = Array{Float64}(undef, single_member_dims, ensemble_size)
1111
for m in 1:ensemble_size
1212
member_path = ClimaCalibrate.path_to_ensemble_member(output_dir, iteration, m)
@@ -39,11 +39,11 @@ days = 86_400
3939
spinup_time = 93days
4040
function preprocess_monthly_averages(simdir, name)
4141
monthly_avgs = get_monthly_averages(simdir, name)
42-
# TODO: Replace NaNs with global mean
43-
monthly_avgs = ClimaAnalysis.replace(monthly_avgs, NaN => 0.0)
4442
monthly_avgs = ClimaAnalysis.shift_to_start_of_previous_month(monthly_avgs)
4543
# Remove spinup time
4644
monthly_avgs = window(monthly_avgs, "time"; left = spinup_time)
45+
global_mean = monthly_avgs |> average_lat |> average_lon |> average_time # average_time(average_lon(average_lat(monthly_avgs)))
46+
monthly_avgs = ClimaAnalysis.replace(monthly_avgs, NaN => first(global_mean.data))
4747
return monthly_avgs
4848
end
4949

experiments/calibration/cld_eff_rad/run_calibration.jl

+8-9
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ rng = Random.MersenneTwister(rng_seed)
1313

1414
include(joinpath(pkgdir(ClimaCoupler), "experiments/calibration/cld_eff_rad/observation_map.jl"))
1515

16+
ensemble_size = 10
1617
addprocs(CAL.SlurmManager())
18+
# addprocs(CAL.SlurmManager(ensemble_size); cpus_per_task = 4, gpus_per_task = 1, partition = "a3", time = "08:00:00")
1719

1820
# Make variables and the forward model available on the worker sessions
1921
@everywhere begin
@@ -24,20 +26,17 @@ end
2426

2527
# Experiment Configuration
2628
output_dir = "experiments/calibration/output"
27-
ensemble_size = 10
2829
n_iterations = 10
29-
priors = [
30-
constrained_gaussian("prescribed_cloud_droplet_number_concentration", 1.5e8, 9e7, 1e7, 1e9),
31-
]
30+
priors = [constrained_gaussian("prescribed_cloud_droplet_number_concentration", 1e8, 7e7, 1e7, 1e9)]
3231
prior = combine_distributions(priors)
33-
obs_path = joinpath(experiment_dir, "observations.jld2")
34-
observations = JLD2.load_object(obs_path)
32+
observation_path = joinpath(experiment_dir, "observations.jld2")
33+
observations = JLD2.load_object(observation_path)
3534

3635
eki = EKP.EnsembleKalmanProcess(
3736
EKP.construct_initial_ensemble(rng, prior, ensemble_size),
3837
observations,
3938
EKP.TransformInversion(),
40-
verbose=true
41-
)
42-
39+
verbose = true,
40+
);
41+
# using ClimaAtmos#main
4342
eki = CAL.calibrate(CAL.WorkerBackend, eki, ensemble_size, n_iterations, prior, output_dir)

0 commit comments

Comments
 (0)