Skip to content

Commit 54f054b

Browse files
authored
ENH: nested grid preserves zonation (#438)
1 parent ce68ef1 commit 54f054b

2 files changed

Lines changed: 58 additions & 0 deletions

File tree

src/fmu/tools/nestedhybridgrid/nestedhybrid.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,28 @@ def _generate_layer_mappings(
310310
return (lmap1, lmap2)
311311

312312

313+
def _set_zonation(subgrid: dict, lmap: np.ndarray, nlay: int) -> dict:
314+
"""Create an updated subgrid dictionary for the merged grid.
315+
Args:
316+
subgrid: subgrid dictionary from input grid
317+
lmap: layer mapping for grid1 - unrefined input grid
318+
nlay: total number of layers in merged grid
319+
"""
320+
321+
updated_subgrid = {}
322+
323+
# sorted list of zones to add
324+
zl = sorted(subgrid, key=lambda x: subgrid[x][0])
325+
326+
for zi in range(len(zl)):
327+
zn = zl[zi]
328+
zmin = lmap[subgrid[zn][0] - 1] + 1
329+
zmax = nlay + 1 if zi == len(zl) - 1 else lmap[subgrid[zl[zi + 1]][0] - 1] + 1
330+
updated_subgrid[zn] = range(zmin, zmax)
331+
332+
return updated_subgrid
333+
334+
313335
# ---------------------------------------------------------------------------
314336
# Public API
315337
# ---------------------------------------------------------------------------
@@ -377,6 +399,9 @@ def create_nested_hybrid_grid(
377399
grid = grid.copy()
378400
region = region.copy()
379401

402+
# Save input zonation
403+
subgrid = grid.subgrids
404+
380405
# Attach the region property to the grid.
381406
grid.append_prop(region)
382407

@@ -422,6 +447,8 @@ def create_nested_hybrid_grid(
422447
# 7. Merge the two grids.
423448
merged = xtgeo.grid_merge(grid, refined, lmap1, lmap2)
424449
_logger.info("Merged grid dimensions: %s", merged.dimensions)
450+
if subgrid is not None:
451+
merged.subgrids = _set_zonation(subgrid=subgrid, lmap=lmap1, nlay=merged.nlay)
425452

426453
return merged, nnc_table
427454

tests/nestedhybridgrid/test_nestedhybrid.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,37 @@ def test_lmap_generation_ref10(self):
198198
assert np.array_equal(lmap1, np.array([0, 1, 11]))
199199
assert np.array_equal(lmap2, np.arange(20) + 1)
200200

201+
def test_zonation(self):
202+
"""Input grid with zonation returns a valid zonation"""
203+
grid, region, rid = _make_box_grid_with_region(dimension=(6, 6, 2))
204+
grid.subgrids = {"ZONE1": [1], "ZONE2": [2]}
205+
merged, nnc_table = create_nested_hybrid_grid(
206+
grid, region, rid, refinement=(2, 2, 2)
207+
)
208+
subgrids_nlay = merged.get_subgrids()
209+
assert subgrids_nlay["ZONE1"] == 2
210+
assert subgrids_nlay["ZONE2"] == 2
211+
212+
assert merged.subgrids["ZONE1"] == range(1, 3)
213+
assert merged.subgrids["ZONE2"] == range(3, 5)
214+
215+
def test_zonation_with_layer_offset(self):
216+
"""Input grid with zonation returns a valid zonation with offset"""
217+
grid, region, rid = _make_box_grid_with_region(dimension=(6, 6, 3))
218+
grid.subgrids = {"ZONE1": [1], "ZONE2": [2, 3]}
219+
220+
region.values[:, :, 0] = 1 # set value in first layer to not be rid
221+
222+
merged, nnc_table = create_nested_hybrid_grid(
223+
grid, region, rid, refinement=(2, 2, 2)
224+
)
225+
subgrids_nlay = merged.get_subgrids()
226+
assert subgrids_nlay["ZONE1"] == 1
227+
assert subgrids_nlay["ZONE2"] == 4
228+
229+
assert merged.subgrids["ZONE1"] == range(1, 2)
230+
assert merged.subgrids["ZONE2"] == range(2, 6)
231+
201232

202233
# ---------------------------------------------------------------------------
203234
# Tests for get_transmissibilities with nested hybrid NNCs

0 commit comments

Comments
 (0)