55import Thermodynamics as TD
66import ClimaCore. Spaces as Spaces
77import ClimaCore. Fields as Fields
8+ import NCDatasets as NC
9+ import StatsBase
10+ import Dierckx
11+
12+ function interp_vertical_prof (x, xp, fp)
13+ spl = Dierckx. Spline1D (xp, fp; k = 1 )
14+ return spl (vec (x))
15+ end
16+
17+ mean_nc_data (data, group, var; imin = 100 ) =
18+ StatsBase. mean (data. group[group][var][:, :][:, imin: end ], dims = 2 )[:]
19+ init_nc_data (data, group, var) = data. group[group][var][:, :][:, 1 ]
820
921external_forcing_cache (Y, atmos:: AtmosModel ) =
1022 external_forcing_cache (Y, atmos. external_forcing)
1123
12- external_forcing_cache (Y, :: Nothing ) = (;)
13- function external_forcing_cache (Y, :: GCMForcing )
24+ external_forcing_cache (Y, external_forcing :: Nothing ) = (;)
25+ function external_forcing_cache (Y, external_forcing :: GCMForcing )
1426 FT = Spaces. undertype (axes (Y. c))
1527 ᶜdTdt_fluc = similar (Y. c, FT)
1628 ᶜdqtdt_fluc = similar (Y. c, FT)
@@ -25,21 +37,49 @@ function external_forcing_cache(Y, ::GCMForcing)
2537 ᶜτ_scalar = similar (Y. c, FT)
2638 ᶜls_subsidence = similar (Y. c, FT)
2739
28- # TODO : read profiles from LES files and add here
29- @. ᶜdTdt_fluc = 0
30- @. ᶜdqtdt_fluc = 0
31- @. ᶜdTdt_hadv = 0
32- @. ᶜdqtdt_hadv = 0
33- @. ᶜdTdt_rad = 0
34- @. ᶜT_nudge = 290
35- @. ᶜqt_nudge = FT (0.01 )
36- @. ᶜu_nudge = - 5
37- @. ᶜv_nudge = 0
38- @. ᶜls_subsidence = 0
39- # TODO : make it a function of z and add timescale to climaparams
40- hr = 3600
41- @. ᶜτ_wind = 6 hr
42- @. ᶜτ_scalar = 24 hr
40+ external_forcing_file = external_forcing. external_forcing_file
41+
42+ NC. Dataset (external_forcing_file, " r" ) do ds
43+ function setvar! (cc_field, varname, colidx, zc_gcm, zc_les)
44+ parent (cc_field[colidx]) .= interp_vertical_prof (
45+ zc_gcm,
46+ zc_les,
47+ mean_nc_data (ds, " profiles" , varname),
48+ )
49+ end
50+
51+ function setnudgevar! (cc_field, varname, colidx, zc_gcm, zc_les)
52+ parent (cc_field[colidx]) .= interp_vertical_prof (
53+ zc_gcm,
54+ zc_les,
55+ init_nc_data (ds, " profiles" , varname),
56+ )
57+ end
58+
59+ Fields. bycolumn (axes (Y. c)) do colidx
60+
61+ zc_les = Array (ds. group[" profiles" ][" z_half" ])
62+ zc_gcm = Fields. coordinate_field (Y. c). z[colidx]
63+
64+ setvar! (ᶜdTdt_fluc, " dtdt_fluc" , colidx, zc_gcm, zc_les)
65+ setvar! (ᶜdqtdt_fluc, " dqtdt_fluc" , colidx, zc_gcm, zc_les)
66+ setvar! (ᶜdTdt_hadv, " dtdt_hadv" , colidx, zc_gcm, zc_les)
67+ setvar! (ᶜdqtdt_hadv, " dqtdt_hadv" , colidx, zc_gcm, zc_les)
68+ setvar! (ᶜdTdt_rad, " dtdt_rad" , colidx, zc_gcm, zc_les)
69+ setvar! (ᶜls_subsidence, " ls_subsidence" , colidx, zc_gcm, zc_les)
70+
71+ setnudgevar! (ᶜT_nudge, " temperature_mean" , colidx, zc_gcm, zc_les)
72+ setnudgevar! (ᶜqt_nudge, " qt_mean" , colidx, zc_gcm, zc_les)
73+ setnudgevar! (ᶜu_nudge, " u_mean" , colidx, zc_gcm, zc_les)
74+ setnudgevar! (ᶜv_nudge, " v_mean" , colidx, zc_gcm, zc_les)
75+
76+ # TODO : make it a function of z for scalar (call function above)
77+ hr = 3600
78+ parent (ᶜτ_wind[colidx]) .= 6 hr
79+ parent (ᶜτ_scalar[colidx]) .= 24 hr
80+ end
81+ end
82+
4383 return (;
4484 ᶜdTdt_fluc,
4585 ᶜdqtdt_fluc,
0 commit comments