Skip to content

Commit a480e96

Browse files
authored
basic index working (#114)
close #108
1 parent 0db2281 commit a480e96

File tree

5 files changed

+77
-22
lines changed

5 files changed

+77
-22
lines changed

flopy4/mf6/gwf/dis.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@
44
from xattree import array, dim, field, xattree
55

66
from flopy4.mf6.converters import convert_array
7+
from flopy4.mf6.indexes import grid_index
78
from flopy4.mf6.package import Package
89

910

10-
@xattree
11+
@xattree(index=grid_index, index_scope="gwf")
1112
class Dis(Package):
1213
length_units: str = field(
1314
default=None,
@@ -21,20 +22,23 @@ class Dis(Package):
2122
default=False, metadata={"block": "options"}
2223
)
2324
nlay: int = dim(
25+
coord=False,
2426
scope="gwf",
2527
default=1,
2628
metadata={
2729
"block": "dimensions",
2830
},
2931
)
3032
ncol: int = dim(
33+
coord=False,
3134
scope="gwf",
3235
default=2,
3336
metadata={
3437
"block": "dimensions",
3538
},
3639
)
3740
nrow: int = dim(
41+
coord=False,
3842
scope="gwf",
3943
default=2,
4044
metadata={

flopy4/mf6/indexes.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import pandas as pd
2+
import xarray as xr
3+
from xarray.core.indexes import Index, PandasIndex
4+
from xarray.core.indexing import merge_sel_results
5+
6+
7+
def alias(dataset: xr.Dataset, old_name: str, new_name: str) -> PandasIndex:
8+
"""Alias a dimension coordinate to a coordinate with a different name."""
9+
try:
10+
size = dataset.sizes[old_name]
11+
except KeyError:
12+
try:
13+
size = dataset.dims[old_name]
14+
except KeyError:
15+
size = dataset.attrs[old_name]
16+
return PandasIndex(pd.RangeIndex(size, name=new_name), dim=old_name)
17+
18+
19+
class GridIndex(Index):
20+
def __init__(self, indices):
21+
self._indices = indices
22+
23+
@classmethod
24+
def from_variables(cls, variables):
25+
return {
26+
k: PandasIndex.from_variables({k: v}) for k, v in variables.items()
27+
}
28+
29+
def create_variables(self, variables=None):
30+
idx_vars = {}
31+
for index in self._indices.values():
32+
idx_vars.update(index.create_variables(variables))
33+
return idx_vars
34+
35+
def sel(self, labels):
36+
results = []
37+
for k, index in self._indices.items():
38+
if k in labels:
39+
results.append(index.sel({k: labels[k]}))
40+
return merge_sel_results(results)
41+
42+
43+
def grid_index(dataset: xr.Dataset) -> GridIndex:
44+
return GridIndex(
45+
{
46+
# k collides with npf.k so use "lay"
47+
"lay": alias(dataset, "nlay", "lay"),
48+
"col": alias(dataset, "ncol", "col"),
49+
"row": alias(dataset, "nrow", "row"),
50+
}
51+
)

0 commit comments

Comments
 (0)