33
44import numpy as np
55from attrs import Converter , define
6- from modflow_devtools .dfn import Field
76from numpy .typing import NDArray
87from xattree import xattree
98
1211from flopy4 .mf6 .spec import array , field
1312from flopy4 .utils import to_path
1413
15- _OCSETTING = Field (
16- name = "ocsetting" ,
17- type = "keystring" ,
18- reader = "urword" ,
19- children = {
20- "all" : Field (
21- name = "all" ,
22- type = "keyword" ,
23- reader = "urword" ,
24- ),
25- "first" : Field (
26- name = "first" ,
27- type = "keyword" ,
28- reader = "urword" ,
29- ),
30- "last" : Field (
31- name = "last" ,
32- type = "keyword" ,
33- reader = "urword" ,
34- ),
35- "steps" : Field (
36- name = "steps" ,
37- type = "integer" ,
38- reader = "urword" ,
39- ),
40- "frequency" : Field (
41- name = "frequency" ,
42- type = "integer" ,
43- reader = "urword" ,
44- ),
45- },
46- )
47-
48- _RTYPE = Field (
49- name = "rtype" ,
50- type = "string" ,
51- reader = "urword" ,
52- )
53-
54-
55- def _oc_action_field (action : str ) -> Field :
56- return Field (
57- name = f"{ action } record" ,
58- type = "recarray" ,
59- dims = ("nper" ,),
60- block = "perioddata" ,
61- reader = "urword" ,
62- children = {
63- action : Field (
64- name = action ,
65- type = "keyword" ,
66- reader = "urword" ,
67- ),
68- "rtype" : _RTYPE ,
69- "ocsetting" : _OCSETTING ,
70- },
71- )
72-
7314
7415@xattree
7516class Oc (Package ):
7617 @define (slots = False )
77- class Format :
18+ class FormatRecord :
7819 columns : int = field (default = 10 )
7920 width : int = field (default = 11 )
8021 digits : int = field (default = 4 )
8122 format : Literal ["exponential" , "fixed" , "general" , "scientific" ] = field (default = "general" )
8223
8324 @define (slots = False )
84- class Steps :
85- all : bool = field ()
86- first : bool = field ()
87- last : bool = field ()
88- steps : list [int ] = field ()
89- frequency : int = field ()
25+ class OCSettingOption :
26+ first : bool = field (default = True )
27+ last : bool = field (default = False )
28+ all : bool = field (default = False )
29+ steps : Optional [ list [int ]] = field (default = None )
30+ frequency : Optional [ int ] = field (default = None )
9031
9132 @define (slots = False )
92- class Period :
33+ class OCSetting :
34+ ocsetting : Optional [list ["Oc.OCSettingOption" ]] = field (default = None )
35+
36+ @define (slots = False )
37+ class SaveRecord :
38+ rtype : str = field ()
39+ ocsetting : "Oc.OCSetting" = field ()
40+
41+ @define (slots = False )
42+ class PrintRecord :
9343 rtype : str = field ()
94- steps : "Oc.Steps " = field ()
44+ ocsetting : "Oc.OCSetting " = field ()
9545
9646 budget_file : Optional [Path ] = field (
9747 block = "options" ,
@@ -108,47 +58,20 @@ class Period:
10858 converter = to_path ,
10959 default = None ,
11060 )
111- format : Optional [Format ] = field (block = "options" , default = None , init = False )
112- save_head : Optional [NDArray [np .object_ ]] = array (
113- Steps ,
61+ headprintrecord : Optional [FormatRecord ] = field (block = "options" , default = None , init = False )
62+ saverecord : Optional [NDArray [np .object_ ]] = array (
63+ SaveRecord ,
11464 block = "period" ,
115- default = "all" ,
116- dims = ("nper" ,),
117- converter = Converter (structure_array , takes_self = True , takes_field = True ),
118- reader = "urword" ,
119- )
120- save_budget : Optional [NDArray [np .object_ ]] = array (
121- Steps ,
122- block = "period" ,
123- default = "all" ,
124- dims = ("nper" ,),
125- converter = Converter (structure_array , takes_self = True , takes_field = True ),
126- reader = "urword" ,
127- )
128- print_head : Optional [NDArray [np .object_ ]] = array (
129- Steps ,
130- block = "period" ,
131- default = "all" ,
65+ default = None ,
13266 dims = ("nper" ,),
13367 converter = Converter (structure_array , takes_self = True , takes_field = True ),
13468 reader = "urword" ,
13569 )
136- print_budget : Optional [NDArray [np .object_ ]] = array (
137- Steps ,
70+ printrecord : Optional [NDArray [np .object_ ]] = array (
71+ PrintRecord ,
13872 block = "period" ,
139- default = "all" ,
73+ default = None ,
14074 dims = ("nper" ,),
14175 converter = Converter (structure_array , takes_self = True , takes_field = True ),
14276 reader = "urword" ,
14377 )
144-
145- # original DFN
146- # @classmethod
147- # def get_dfn(cls) -> Dfn:
148- # """Generate the component's MODFLOW 6 definition."""
149- # dfn = super().get_dfn()
150- # for field_name in list(dfn["perioddata"].keys()):
151- # dfn["perioddata"].pop(field_name)
152- # dfn["perioddata"]["saverecord"] = _oc_action_field("save")
153- # dfn["perioddata"]["printrecord"] = _oc_action_field("print")
154- # return dfn
0 commit comments