Skip to content

Commit a619238

Browse files
authored
Match grib coordinate names against list of vertical levels from eccodes (#552)
1 parent 0ca7912 commit a619238

File tree

1 file changed

+99
-6
lines changed

1 file changed

+99
-6
lines changed

kerchunk/_grib_idx.py

Lines changed: 99 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,104 @@ class DynamicZarrStoreError(ValueError):
100100

101101
ZARR_TREE_STORE = "zarr_tree_store.json.gz"
102102

103+
# derived from eccodes/grib2/typeOfLevelConcept.def
104+
ECCODES_VERTICAL_LEVELS = {
105+
"abstractMultipleLevels",
106+
"abstractSingleLevel",
107+
"adiabaticCondensation",
108+
"atmosphere",
109+
"cloudBase",
110+
"cloudTop",
111+
"convectiveCondensation",
112+
"cumulonimbusBase",
113+
"cumulonimbusTop",
114+
"depthBelowLand",
115+
"depthBelowLandLayer",
116+
"depthBelowSea",
117+
"depthBelowSeaLayer",
118+
"entireAtmosphere",
119+
"entireLake",
120+
"entireMeltPond",
121+
"entireOcean",
122+
"eta",
123+
"freeConvection",
124+
"generalVertical",
125+
"generalVerticalLayer",
126+
"heightAboveGround",
127+
"heightAboveGroundLayer",
128+
"heightAboveSea",
129+
"heightAboveSeaLayer",
130+
"highCloudLayer",
131+
"hybrid",
132+
"hybridHeight",
133+
"hybridLayer",
134+
"hybridPressure",
135+
"iceBottomOnWater",
136+
"iceLayerAboveWaterSurface",
137+
"iceLayerOnWater",
138+
"iceLayerUnderSnowOnWater",
139+
"iceTopOnWater",
140+
"iceTopUnderSnowOnWater",
141+
"indefiniteSoilDepth",
142+
"isobaricInPa",
143+
"isobaricInhPa",
144+
"isobaricLayer",
145+
"isothermZero",
146+
"isothermal",
147+
"lakeBottom",
148+
"lowCloudLayer",
149+
"lowestLevelOfCloudCoverExceedance",
150+
"maxWind",
151+
"meanSea",
152+
"mediumCloudLayer",
153+
"meltPondBottom",
154+
"meltPondTop",
155+
"mixedLayerDepthByDensity",
156+
"mixedLayerDepthByDiffusivity",
157+
"mixedLayerDepthByTemperature",
158+
"mixedLayerDepthGeneric",
159+
"mixedLayerParcel",
160+
"mixingLayer",
161+
"mostUnstableParcel",
162+
"neutralBuoyancy",
163+
"nominalTop",
164+
"oceanModel",
165+
"oceanModelLayer",
166+
"oceanSurface",
167+
"oceanSurfaceToBottom",
168+
"potentialVorticity",
169+
"pressureFromGround",
170+
"pressureFromGroundLayer",
171+
"road",
172+
"roadLayer",
173+
"roof",
174+
"roofLayer",
175+
"rootZone",
176+
"seaBottom",
177+
"seaIce",
178+
"seaIceLayer",
179+
"sigma",
180+
"sigmaLayer",
181+
"snow",
182+
"snowLayer",
183+
"snowLayerOverIceOnWater",
184+
"snowTopOverIceOnWater",
185+
"soil",
186+
"soilLayer",
187+
"stratosphere",
188+
"surface",
189+
"theta",
190+
"thetaLayer",
191+
"totalSoilLayer",
192+
"tropopause",
193+
"troposphere",
194+
"unknown",
195+
"urbanCanyon",
196+
"wall",
197+
"wallLayer",
198+
"waterSurfaceToIsothermalOceanLayer",
199+
}
200+
103201

104202
def repeat_steps(step_index: pd.TimedeltaIndex, to_length: int) -> np.array:
105203
return np.tile(step_index.to_numpy(), int(np.ceil(to_length / len(step_index))))[
@@ -612,12 +710,7 @@ def extract_dataset_chunk_index(
612710
for cname, cvar in dvar.coords.items():
613711
if grib:
614712
# Grib data has only one level coordinate
615-
cname = (
616-
cname
617-
if cname
618-
in ("valid_time", "time", "step", "latitude", "longitude")
619-
else "level"
620-
)
713+
cname = "level" if cname in ECCODES_VERTICAL_LEVELS else cname
621714

622715
if all([dim_name in dim_idx for dim_name in cvar.dims]):
623716
coord_index = tuple([dim_idx[dim_name] for dim_name in cvar.dims])

0 commit comments

Comments
 (0)