1818from flopy4 .mf6 .config import SPARSE_THRESHOLD
1919from flopy4 .mf6 .constants import FILL_DNODATA
2020from flopy4 .mf6 .context import Context
21- from flopy4 .mf6 .spec import fields_dict
21+ from flopy4 .mf6 .spec import FileInOut
2222
2323
24- def _attach_field_metadata (
25- dataset : xr .Dataset , component_type : type , field_names : list [str ]
26- ) -> None :
27- # TODO: attach metadata to array attrs instead of dataset attrs
28- field_metadata = {}
29- component_fields = fields_dict (component_type )
30- for field_name in field_names :
31- if field_name in component_fields :
32- field_metadata [field_name ] = component_fields [field_name ].metadata
33- dataset .attrs ["field_metadata" ] = field_metadata
34-
35-
36- def _path_to_tuple (field_name : str , path_value : Path ) -> tuple :
37- if field_name .endswith ("_file" ):
38- base_name = field_name .replace ("_file" , "" ).upper ()
39- return (base_name , "FILEOUT" , str (path_value ))
40- return (field_name .upper (), "FILEOUT" , str (path_value ))
24+ def path_to_tuple (name : str , value : Path , inout : FileInOut ) -> tuple [str , ...]:
25+ t = [name .upper ()]
26+ if name .endswith ("_file" ):
27+ t [0 ] = name .replace ("_file" , "" ).upper ()
28+ if inout :
29+ t .append (inout .upper ())
30+ t .append (str (value ))
31+ return tuple (t )
4132
4233
4334def get_binding_blocks (value : Component ) -> dict [str , dict [str , list [tuple [str , ...]]]]:
@@ -100,9 +91,11 @@ def unstructure_component(value: Component) -> dict[str, Any]:
10091 # (and split the period data into separate kper-indexed blocks)
10192 # - other values to their original form
10293 if isinstance (field_value , Path ):
103- rec = _path_to_tuple (field_name , field_value )
94+ field_spec = xatspec .attrs [field_name ]
95+ field_meta = getattr (field_spec , "metadata" , {})
96+ t = path_to_tuple (field_name , field_value , inout = field_meta .get ("inout" , "fileout" ))
10497 # name may have changed e.g dropping '_file' suffix
105- blocks [block_name ][rec [0 ]] = rec
98+ blocks [block_name ][t [0 ]] = t
10699 elif isinstance (field_value , datetime ):
107100 blocks [block_name ][field_name ] = field_value .isoformat ()
108101 elif (
@@ -165,7 +158,6 @@ def unstructure_component(value: Component) -> dict[str, Any]:
165158
166159 if block_name in period_data and isinstance (period_data [block_name ], dict ):
167160 dataset = xr .Dataset (period_data [block_name ])
168- _attach_field_metadata (dataset , type (value ), list (period_data [block_name ].keys ())) # type: ignore
169161 blocks [block_name ] = {block_name : dataset }
170162 del period_data [block_name ]
171163
@@ -177,7 +169,6 @@ def unstructure_component(value: Component) -> dict[str, Any]:
177169
178170 for kper , block in period_blocks .items ():
179171 dataset = xr .Dataset (block )
180- _attach_field_metadata (dataset , type (value ), list (block .keys ()))
181172 blocks [f"{ block_name } { kper + 1 } " ] = {block_name : dataset }
182173
183174 # make sure options block always comes first
0 commit comments