Skip to content

Commit 25a508d

Browse files
committed
Running with single year batch, downsampling outputvars
1 parent 04365bd commit 25a508d

File tree

8 files changed

+568
-1
lines changed

8 files changed

+568
-1
lines changed

experiments/calibration/Project.toml

+3-1
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,7 @@ Thermodynamics = "b60c26fb-14c3-4610-9d3e-2d17fe7ff00c"
3030
YAML = "ddb6d928-2868-570f-bddf-ab3f9cf99eb6"
3131

3232
[compat]
33-
ClimaCalibrate = "0.0.10"
33+
ClimaCalibrate = "0.0.11"
3434
ClimaTimeSteppers = "0.8.2"
35+
ClimaCore = "0.14.26"
36+
EnsembleKalmanProcesses = "2.0"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# Generate and save experiment observations to disk
2+
using ClimaAnalysis, JLD2
3+
include("experiments/calibration/coarse_amip/observation_utils.jl")
4+
5+
const obs_dir = "/home/ext_nefrathe_caltech_edu/calibration_obs"
6+
const diagnostic_dir = "experiments/calibration/output/iteration_000/member_001/model_config/output_0000/clima_atmos/"
7+
8+
diagnostic_var2d = OutputVar(joinpath(diagnostic_dir, "rsdt_1M_average.nc"));
9+
pressure = OutputVar(joinpath(diagnostic_dir, "pfull_1M_average.nc"));
10+
diagnostic_var3d = OutputVar(joinpath(diagnostic_dir, "ta_1M_average.nc"));
11+
diagnostic_var3d = ClimaAnalysis.Atmos.to_pressure_coordinates(diagnostic_var3d, pressure)
12+
13+
nt = get_all_output_vars(obs_dir, diagnostic_var2d, diagnostic_var3d)
14+
nyears = 18
15+
observation_vec = create_observation_vector(nt, nyears)
16+
JLD2.save_object("experiments/calibration/coarse_amip/observations.jld2", observation_vec)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
FLOAT_TYPE: "Float32"
2+
albedo_model: "CouplerAlbedo"
3+
atmos_config_file: "config/longrun_configs/amip_target_edonly.yml"
4+
checkpoint_dt: "99999days"
5+
coupler_toml: ["toml/amip.toml"]
6+
print_config_dict: true
7+
coupler_output_dir: "experiments/calibration/output"
8+
dt: "800secs"
9+
dt_cpl: "800secs"
10+
dt_save_state_to_disk: "99999days"
11+
dt_save_to_sol: "99999days"
12+
dz_bottom: 100.0
13+
energy_check: false
14+
h_elem: 3
15+
land_albedo_type: "map_temporal"
16+
mode_name: "amip"
17+
mono_surface: false
18+
netcdf_output_at_levels: true
19+
output_default_diagnostics: false
20+
use_coupler_diagnostics: false
21+
radiation_reset_rng_seed: true
22+
rayleigh_sponge: true
23+
start_date: "20000901"
24+
surface_setup: "PrescribedSurface"
25+
t_end: "457days"
26+
topography: "Earth"
27+
topo_smoothing: true
28+
turb_flux_partition: "CombinedStateFluxesMOST"
29+
viscous_sponge: true
30+
z_elem: 39
31+
z_max: 60000.0
32+
extra_atmos_diagnostics:
33+
- reduction_time: average
34+
short_name: rsut
35+
period: 1months
36+
writer: nc
37+
- reduction_time: average
38+
short_name: rlut
39+
period: 1months
40+
writer: nc
41+
- reduction_time: average
42+
short_name: rsdt
43+
period: 1months
44+
writer: nc
45+
- reduction_time: average
46+
short_name: rsutcs
47+
period: 1months
48+
writer: nc
49+
- reduction_time: average
50+
short_name: rlutcs
51+
period: 1months
52+
writer: nc
53+
- reduction_time: average
54+
short_name: pr
55+
period: 1months
56+
writer: nc
57+
- reduction_time: average
58+
short_name: ts
59+
period: 1months
60+
writer: nc
61+
- reduction_time: average
62+
short_name: ta
63+
period: 1months
64+
writer: nc
65+
- reduction_time: average
66+
short_name: hur
67+
period: 1months
68+
writer: nc
69+
- reduction_time: average
70+
short_name: hus
71+
period: 1months
72+
writer: nc
73+
- reduction_time: average
74+
short_name: clw
75+
period: 1months
76+
writer: nc
77+
- reduction_time: average
78+
short_name: cli
79+
period: 1months
80+
writer: nc
81+
- reduction_time: average
82+
short_name: pfull
83+
period: 1months
84+
writer: nc
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import ClimaCoupler
2+
import ClimaCalibrate
3+
import CUDA
4+
import EnsembleKalmanProcesses as EKP
5+
ENV["CLIMACOMMS_DEVICE"] = "CUDA"
6+
ENV["CLIMACOMMS_CONTEXT"] = "SINGLETON"
7+
import JLD2
8+
include(joinpath(pkgdir(ClimaCoupler), "experiments", "ClimaEarth", "setup_run.jl"))
9+
10+
function ClimaCalibrate.forward_model(iter, member)
11+
12+
config_file = joinpath(pkgdir(ClimaCoupler), "experiments", "calibration", "coarse_amip", "model_config.yml")
13+
config_dict = get_coupler_config_dict(config_file)
14+
15+
output_dir_root = config_dict["coupler_output_dir"]
16+
eki = JLD2.load_object(ClimaCalibrate.ekp_path(output_dir_root, iter))
17+
minibatch = EKP.get_current_minibatch(eki)
18+
config_dict["start_date"] = minibatch_to_start_date(minibatch)
19+
20+
# Set member parameter file
21+
sampled_parameter_file = ClimaCalibrate.parameter_path(output_dir_root, iter, member)
22+
config_dict["calibration_toml"] = sampled_parameter_file
23+
# Set member output directory
24+
member_output_dir = ClimaCalibrate.path_to_ensemble_member(output_dir_root, iter, member)
25+
config_dict["coupler_output_dir"] = member_output_dir
26+
27+
return setup_and_run(config_dict)
28+
end
29+
30+
31+
function minibatch_to_start_date(batch)
32+
start_year = minimum(batch) + 1999
33+
@assert start_year >= 2000
34+
return "$(start_year)0901"
35+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
using ClimaAnalysis, Dates
2+
import ClimaCalibrate
3+
import ClimaCoupler
4+
import JLD2
5+
import EnsembleKalmanProcesses as EKP
6+
obs = JLD2.load_object("experiments/calibration/coarse_amip/observations.jld2")
7+
const single_member_dims = length(EKP.get_obs(first(obs)))
8+
include(joinpath(pkgdir(ClimaCoupler), "experiments/calibration/coarse_amip/observation_utils.jl"))
9+
10+
function ClimaCalibrate.observation_map(iteration)
11+
G_ensemble = Array{Float64}(undef, single_member_dims, ensemble_size)
12+
for m in 1:ensemble_size
13+
@show m
14+
member_path = ClimaCalibrate.path_to_ensemble_member(output_dir, iteration, m)
15+
simdir_path = joinpath(member_path, "model_config/output_active")
16+
if isdir(simdir_path)
17+
simdir = SimDir(simdir_path)
18+
G_ensemble[:, m] .= process_member_data(simdir)
19+
else
20+
@info "No data found for member $m."
21+
G_ensemble[:, m] .= NaN
22+
end
23+
end
24+
return G_ensemble
25+
end
26+
27+
function process_outputvar(simdir, name)
28+
days = 86_400
29+
30+
monthly_avgs = get_monthly_averages(simdir, name)
31+
# Preprocess to match observations
32+
if has_altitude(monthly_avgs)
33+
pressure = get_monthly_averages(simdir, "pfull")
34+
monthly_avgs = ClimaAnalysis.Atmos.to_pressure_coordinates(monthly_avgs, pressure)
35+
monthly_avgs = limit_pressure_dim_to_era5_range(monthly_avgs)
36+
end
37+
monthly_avgs = ClimaAnalysis.replace(monthly_avgs, missing => 0.0, NaN => 0.0)
38+
monthly_avgs = ClimaAnalysis.shift_to_start_of_previous_month(monthly_avgs)
39+
40+
# Cut off first 3 months
41+
single_year = window(monthly_avgs, "time"; left = 92days)
42+
seasons = split_by_season_across_time(single_year)
43+
# Ensure we are splitting evenly across seasons
44+
@assert all(map(x -> length(times(x)) == 3, seasons))
45+
seasonal_avgs = average_time.(seasons)
46+
47+
downsampled_seasonal_avg_arrays = downsample.(seasonal_avgs, 3)
48+
return vcat(vec.(downsampled_seasonal_avg_arrays)...)
49+
# return vectorize_nyears_of_seasonal_outputvars(seasonal_avgs, 1)
50+
end
51+
52+
function process_member_data(simdir::SimDir)
53+
isempty(simdir) && return fill!(zeros(single_member_length), NaN)
54+
55+
pressure = get_monthly_averages(simdir, "pfull")
56+
57+
rsdt_full = get_monthly_averages(simdir, "rsdt")
58+
rsut_full = get_monthly_averages(simdir, "rsut")
59+
rlut_full = get_monthly_averages(simdir, "rlut")
60+
year_net_radiation = (rlut_full + rsut_full - rsdt_full) |> average_lat |> average_lon |> average_time
61+
62+
rsut = process_outputvar(simdir, "rsut")
63+
rlut = process_outputvar(simdir, "rlut")
64+
rsutcs = process_outputvar(simdir, "rsutcs")
65+
rlutcs = process_outputvar(simdir, "rlutcs")
66+
cre = rsut + rlut - rsutcs - rlutcs
67+
68+
pr = process_outputvar(simdir, "pr")
69+
# shf = process_outputvar(simdir, "shf")
70+
ts = process_outputvar(simdir, "ts")
71+
72+
ta = process_outputvar(simdir, "ta")
73+
hur = process_outputvar(simdir, "hur")
74+
hus = process_outputvar(simdir, "hus")
75+
# clw = get_seasonal_averages(simdir, "clw")
76+
# cli = get_seasonal_averages(simdir, "cli")
77+
78+
return vcat(year_net_radiation.data, rsut, rlut, cre, pr, ts)#, ta, hur, hus)
79+
end

0 commit comments

Comments
 (0)