Skip to content

Commit 2dccc15

Browse files
update era5 soil
1 parent 2602590 commit 2dccc15

File tree

3 files changed

+88
-28
lines changed

3 files changed

+88
-28
lines changed

pyremo/preproc/era5.py

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ def get_file_from_template(
109109
code,
110110
level_type,
111111
template=None,
112+
**kwargs,
112113
):
113114
"""Derive filename from filename template
114115
@@ -181,18 +182,22 @@ class ERA5:
181182
dynamic = ["ta", "hus", "ps", "tos", "sic", "clw", "snd"]
182183
wind = ["svo", "sd"]
183184
fx = ["orog", "sftlf"]
184-
soil = [
185+
soil_vars = [
185186
"tsl1",
186187
"tsl2",
187188
"tsl3",
188189
"tsl4",
189-
"tsn",
190-
"src",
191-
"skt",
192190
"swvl1",
193191
"swvl2",
194192
"swvl3",
195193
"swvl4",
194+
"tsn",
195+
"src",
196+
"skt",
197+
"tos",
198+
"sic",
199+
"skt",
200+
"snd",
196201
]
197202

198203
chunks = {}
@@ -213,32 +218,28 @@ def __init__(
213218
if params is None:
214219
params = era5_params
215220
self.params = params
221+
if gridfile is None:
222+
gridfile = era5_grid_file
216223
self.gridfile = gridfile
217224
if template is None:
218225
template = dkrz_template
219226
self.template = template
220227
self.cdo = Cdo(tempdir=scratch)
221228

222-
def _get_files(self, date):
229+
def _get_files(self, date, variables=None):
230+
if variables is None:
231+
variables = self.dynamic + self.fx + self.wind
223232
if self.cat:
224233
return get_files_from_intake(
225234
self.cat,
226-
{
227-
k: v
228-
for k, v in self.params.items()
229-
if k in self.dynamic + self.fx + self.wind
230-
},
235+
{k: v for k, v in self.params.items() if k in variables},
231236
date,
232237
)
233238
else:
234239
return get_files_from_template(
235240
date=date,
236241
template=self.template,
237-
params={
238-
k: v
239-
for k, v in self.params.items()
240-
if k in self.dynamic + self.fx + self.wind
241-
},
242+
params={k: v for k, v in self.params.items() if k in variables},
242243
)
243244

244245
def _seldate(self, filename, date):
@@ -259,7 +260,7 @@ def _to_regulars(self, filenames, gridtypes):
259260
return {
260261
v: self._to_regular(f, gridtype=gridtypes[v], setname=v)
261262
for v, f in filenames.items()
262-
if v in self.dynamic + self.fx
263+
if v in self.dynamic + self.fx + self.soil_vars
263264
}
264265

265266
def _get_gridtypes(self, filenames):
@@ -384,6 +385,26 @@ def gfile(self, date, path=None, expid=None, filename=None):
384385

385386
return filename
386387

388+
def get_soil(self, date, path=None, expid=None, filename=None):
389+
files = self._get_files(date, self.soil_vars + self.fx)
390+
gridtypes = self._get_gridtypes(files)
391+
seldates = self._seldates(files, date)
392+
regulars = self._to_regulars(seldates, gridtypes)
393+
merge = (
394+
f"-setgrid,{self.gridfile} -merge [ "
395+
+ " ".join(list(regulars.values()))
396+
+ " ]"
397+
)
398+
call = f"cdo {self.options} invertlev -invertlat {merge} {filename}"
399+
print(f"execute: {call}")
400+
subprocess.run(
401+
call.split(),
402+
check=True,
403+
shell=False,
404+
)
405+
406+
return filename
407+
387408

388409
def era5_from_gcloud(time=None, chunks="auto", hfreq=6):
389410
"""

pyremo/preproc/physics.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -231,18 +231,28 @@ def calculate_zdts(fibem, fibge):
231231
return (fibem - fibge) * zdtfak
232232

233233

234-
def initialize_soil_temperatures(
235-
tdge, tswge, tslge, td3ge, td4ge, td5ge, fibem, fibge, iland
234+
def adapt_soil_temperatures(
235+
tdge, tswge, tslge, td3ge, td4ge, td5ge, fibem, fibge, blaem
236236
):
237+
# return tdge, tswge, tslge, td3ge, td4ge, td5ge, fibem, fibge, blaem
238+
iland = (blaem * 10000).astype(int)
237239
zdts = calculate_zdts(fibem, fibge)
238240
tslem = xr.where(iland == 0, tswge, tslge - zdts)
241+
tslem.name = "TSL"
239242
tswem = tswge.copy()
243+
tswem.name = "TSW"
240244
tsnem = xr.where(iland == 0, tswge, tslem)
245+
tsnem.name = "TSN"
241246
td3em = xr.where(iland == 0, tswge, tslge - ((tslge - td3ge) * zds3) - zdts)
247+
td3em.name = "TD3"
242248
td4em = xr.where(iland == 0, tswge, td4ge - ((td4ge - td5ge) * zds4) - zdts)
249+
td4em.name = "TD4"
243250
td5em = xr.where(iland == 0, tswge, td5ge - ((td5ge - tdge) * zds5) - zdts)
251+
td5em.name = "TD5"
244252
tdem = td5em.copy()
253+
tdem.name = "TD"
245254
tdclem = td5em.copy()
255+
tdclem.name = "TDCL"
246256
return tslem, tswem, tsnem, td3em, td4em, td5em, tdem, tdclem
247257

248258

@@ -310,10 +320,8 @@ def bodfld(
310320
) # Assuming FAKINF is 1.0 for simplicity
311321

312322
# Initialize temperatures
313-
tslem, tswem, tsnem, td3em, td4em, td5em, tdem, tdclem = (
314-
initialize_soil_temperatures(
315-
tswge, tslge, td3ge, td4ge, td5ge, fibem, fibge, iland
316-
)
323+
tslem, tswem, tsnem, td3em, td4em, td5em, tdem, tdclem = adapt_soil_temperatures(
324+
tswge, tslge, td3ge, td4ge, td5ge, fibem, fibge, iland
317325
)
318326

319327
# Calculate sea ice and tsi

pyremo/preproc/remap.py

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@
3030

3131
# from pyremo.core.remo_ds import update_meta_info
3232

33+
# required variables for initial conditions:
34+
35+
# ['T', 'U', 'V', 'PS', 'RF', 'QW', 'QD', 'QDBL', 'PSEH', 'TSW', 'TSI', 'SEAICE', 'DTPB',
36+
# 'TSL', 'TSN', 'TD3', 'TD4', 'TD5', 'TD', 'TDCL', 'WS', 'WL', 'SN',
37+
# 'FIB', 'BLA', 'AZ0', 'ALB', 'VGRAT', 'VAROR', 'VLT',
38+
# 'FOREST', 'FAO', 'WSMX', 'BETA', 'WMINLOK', 'WMAXLOK', 'TSLEH', 'GLAC']
3339

3440
xr.set_options(keep_attrs=True)
3541

@@ -668,7 +674,7 @@ def update_soil_temperatures(ds):
668674
return ds
669675

670676

671-
def create_initial_soil(ds, domain_info, surflib):
677+
def remap_era5_soil(ds, domain_info, surflib):
672678
"""Create initial soil dataset from atmospheric dataset."""
673679
# rename vertical coordinate of input to avoid conflict with output lev
674680
ds = ds.copy()
@@ -688,13 +694,16 @@ def create_initial_soil(ds, domain_info, surflib):
688694
# broadcast 1d global coordinates
689695
lamgm, phigm = broadcast_coords(ds)
690696

697+
print("getting matrix")
691698
# compute remap matrix
692699
indii, indjj = intersect(lamgm, phigm, lamem, phiem) # .compute()
693700

701+
print("remapping")
694702
# horizontal interpolation
695703
wsge = interpolate_horizontal(
696704
wsgm, lamem, phiem, lamgm, phigm, "WS", indii=indii, indjj=indjj
697705
)
706+
698707
td3ge = interpolate_horizontal(
699708
ds.tsl1, lamem, phiem, lamgm, phigm, "TD3", indii=indii, indjj=indjj
700709
)
@@ -707,24 +716,46 @@ def create_initial_soil(ds, domain_info, surflib):
707716
tdge = interpolate_horizontal(
708717
ds.tsl4, lamem, phiem, lamgm, phigm, "TD", indii=indii, indjj=indjj
709718
)
710-
snge = interpolate_horizontal(
719+
snem = interpolate_horizontal(
711720
ds.snd, lamem, phiem, lamgm, phigm, "SN", indii=indii, indjj=indjj
712721
)
713-
wlge = interpolate_horizontal(
722+
wlem = interpolate_horizontal(
714723
ds.src, lamem, phiem, lamgm, phigm, "WL", indii=indii, indjj=indjj
715724
)
725+
fibge = interpolate_horizontal(
726+
ds.orog, lamem, phiem, lamgm, phigm, "FIB", indii=indii, indjj=indjj
727+
)
728+
tslge = interpolate_horizontal(
729+
ds.skt, lamem, phiem, lamgm, phigm, "TSL", indii=indii, indjj=indjj
730+
)
731+
716732
tswge = remap_sst(
717733
ds.tos,
718734
lamem,
719735
phiem,
720736
lamgm,
721737
phigm,
722-
blagm=xr.where(ds.tos.isel(time=0).isnull(), 1.0, 0.0),
738+
blagm=xr.where(
739+
ds.tos.isel(time=0).isnull() if "time" in ds else ds.tos.isnull(), 1.0, 0.0
740+
),
723741
blaem=blaem,
724742
)
725-
soil = xr.merge([wsge, td3ge, td4ge, td5ge, tdge, snge, wlge, tswge])
743+
744+
wsmxem = surflib.WSMX.squeeze(drop=True)
745+
wsem = np.minimum(wsmxem, wsge * wsmxem)
746+
747+
# Initialize temperatures
748+
tslem, tswem, tsnem, td3em, td4em, td5em, tdem, tdclem = (
749+
physics.adapt_soil_temperatures(
750+
tdge, tswge, tslge, td3ge, td4ge, td5ge, fibem, fibge, blaem
751+
)
752+
)
753+
754+
soil = xr.merge(
755+
[tslem, tswem, tsnem, td3em, td4em, td5em, tdem, tdclem, wlem, snem, wsem]
756+
)
726757
soil.attrs["history"] = "preprocessing with pyremo = {}".format(pr.__version__)
727-
soil.attrs["domain_id"] = domain_info.get("domain_id", "no name")
758+
soil.attrs["domain_id"] = domain_info.get("domain_id", "UNKNOWNs")
728759

729760
soil = update_attrs(soil)
730761

0 commit comments

Comments
 (0)