11from pathlib import Path
22from typing import Optional
33
4- import attrs
54import numpy as np
6- from attrs import define
5+ from attrs import Converter , define
76from numpy .typing import NDArray
8- from xattree import _get_xatspec , array , field , xattree
7+ from xattree import array , field , xattree
98
10- from flopy4 .mf6 import Package
9+ from flopy4 .mf6 .converters import convert_array
10+ from flopy4 .mf6 .package import Package
1111
12- dnodata = 1e30
1312
14-
15- def _get_nn (ncol , nrow , k , i , j ):
16- return k * nrow * ncol + i * ncol + j
17-
18-
19- def _convert_array (value , self_ , field ):
20- if not isinstance (value , dict ):
21- return value
22-
23- inherited_dims = self_ .__dict__ .get ("dims" , {})
24- spec = _get_xatspec (type (self_ ))
25- field = spec .arrays ["head" ]
26- shape = field .dims
27- if not shape :
28- raise ValueError ()
29- dims = [inherited_dims .get (d , d ) for d in shape ]
30- # TODO pull out dtype from annotation
31- a = np .full (dims , fill_value = dnodata , dtype = np .float64 )
32- for kper , period in value .items ():
33- if kper == "*" :
34- kper = 0
35- for cellid , v in period .items ():
36- nn = _get_nn (inherited_dims ["col" ], inherited_dims ["row" ], * cellid )
37- a [kper , nn ] = v
38- return a
39-
40-
41- @xattree (multi = "list" )
13+ @xattree
4214class Chd (Package ):
4315 @define (slots = False )
4416 class Steps :
@@ -75,9 +47,7 @@ class Steps:
7547 ),
7648 default = None ,
7749 metadata = {"block" : "period" },
78- converter = attrs .Converter (
79- _convert_array , takes_self = True , takes_field = True
80- ),
50+ converter = Converter (convert_array , takes_self = True , takes_field = True ),
8151 )
8252 aux : Optional [NDArray [np .floating ]] = array (
8353 dims = (
@@ -86,6 +56,7 @@ class Steps:
8656 ),
8757 default = None ,
8858 metadata = {"block" : "period" },
59+ converter = Converter (convert_array , takes_self = True , takes_field = True ),
8960 )
9061 boundname : Optional [NDArray [np .str_ ]] = array (
9162 dims = (
@@ -94,7 +65,12 @@ class Steps:
9465 ),
9566 default = None ,
9667 metadata = {"block" : "period" },
68+ converter = Converter (convert_array , takes_self = True , takes_field = True ),
9769 )
9870 steps : Optional [NDArray [np .object_ ]] = array (
99- Steps , dims = ("per" , "node" ), default = None , metadata = {"block" : "period" }
71+ Steps ,
72+ dims = ("per" , "node" ),
73+ default = None ,
74+ metadata = {"block" : "period" },
75+ converter = Converter (convert_array , takes_self = True , takes_field = True ),
10076 )
0 commit comments