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
109from flopy4 .mf6 import Package
11-
12- dnodata = 1e30
13-
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
10+ from flopy4 .mf6 .converters import convert_array
3911
4012
13+ # TODO get rid of multi, just infer from parent?
4114@xattree (multi = "list" )
4215class Chd (Package ):
4316 @define (slots = False )
@@ -75,9 +48,7 @@ class Steps:
7548 ),
7649 default = None ,
7750 metadata = {"block" : "period" },
78- converter = attrs .Converter (
79- _convert_array , takes_self = True , takes_field = True
80- ),
51+ converter = Converter (convert_array , takes_self = True , takes_field = True ),
8152 )
8253 aux : Optional [NDArray [np .floating ]] = array (
8354 dims = (
@@ -86,6 +57,7 @@ class Steps:
8657 ),
8758 default = None ,
8859 metadata = {"block" : "period" },
60+ converter = Converter (convert_array , takes_self = True , takes_field = True ),
8961 )
9062 boundname : Optional [NDArray [np .str_ ]] = array (
9163 dims = (
@@ -94,7 +66,12 @@ class Steps:
9466 ),
9567 default = None ,
9668 metadata = {"block" : "period" },
69+ converter = Converter (convert_array , takes_self = True , takes_field = True ),
9770 )
9871 steps : Optional [NDArray [np .object_ ]] = array (
99- Steps , dims = ("per" , "node" ), default = None , metadata = {"block" : "period" }
72+ Steps ,
73+ dims = ("per" , "node" ),
74+ default = None ,
75+ metadata = {"block" : "period" },
76+ converter = Converter (convert_array , takes_self = True , takes_field = True ),
10077 )
0 commit comments