@@ -1313,7 +1313,6 @@ def write(
13131313 ext_file_action = ExtFileAction .copy_relative_paths ,
13141314 netcdf = None ,
13151315 ):
1316- from ..version import __version__
13171316 """
13181317 Writes out model's package files.
13191318
@@ -1359,7 +1358,10 @@ def write(
13591358 if write_netcdf :
13601359 # set data storage to write ascii for netcdf
13611360 pp ._set_netcdf_storage ()
1362-
1361+ if pp .package_type .startswith ("dis" ):
1362+ crs = pp .crs .get_data ()
1363+ if crs is not None and self .modelgrid .crs is None :
1364+ self .modelgrid .crs = crs [0 ][1 ]
13631365 if (
13641366 self .simulation_data .verbosity_level .value
13651367 >= VerbosityLevel .normal .value
@@ -1372,35 +1374,11 @@ def write(
13721374
13731375 # write netcdf file
13741376 if write_netcdf and netcdf .lower () != "nofile" :
1375- mesh = netcdf
1376- if mesh .upper () == "STRUCTURED" :
1377- mesh = None
1378-
1379- ds = self .modelgrid .dataset (
1380- modeltime = self .modeltime ,
1381- mesh = mesh ,
1382- )
1383-
1384- nc_info = self .netcdf_info (mesh = mesh )
1385- nc_info ["attrs" ]["title" ] = f"{ self .name .upper ()} input"
1386- nc_info ["attrs" ]["source" ] = f"flopy { __version__ } "
1387- # :history = "first created 2025/8/21 9:46:2.909" ;
1388- # :Conventions = "CF-1.11 UGRID-1.0" ;
1389- ds = self .update_dataset (ds , netcdf_info = nc_info , mesh = mesh )
1390-
1391- # write dataset to netcdf
1392- fname = self .name_file .nc_filerecord .get_data ()[0 ][0 ]
1393- ds .to_netcdf (
1394- os .path .join (self .model_ws , fname ),
1395- format = "NETCDF4" ,
1396- engine = "netcdf4"
1397- )
1398-
1377+ self ._write_netcdf (mesh = netcdf )
13991378 if nc_fname is not None :
14001379 self .name_file .nc_filerecord = None
14011380
14021381
1403-
14041382 def get_grid_type (self ):
14051383 """
14061384 Return the type of grid used by model 'model_name' in simulation
@@ -2316,12 +2294,142 @@ def update_dataset(self, dataset, netcdf_info=None, mesh=None, update_data=True)
23162294 else :
23172295 nc_info = netcdf_info
23182296
2297+ if (
2298+ self .simulation .simulation_data .verbosity_level .value
2299+ >= VerbosityLevel .normal .value
2300+ ):
2301+ print (f" updating model dataset..." )
2302+
23192303 for a in nc_info ["attrs" ]:
23202304 dataset .attrs [a ] = nc_info ["attrs" ][a ]
23212305
23222306 # add all packages and update data
23232307 for p in self .packagelist :
23242308 # add package var to dataset
2309+ if (
2310+ self .simulation .simulation_data .verbosity_level .value
2311+ >= VerbosityLevel .normal .value
2312+ ):
2313+ print (f" updating dataset for package { p ._get_pname ()} ..." )
23252314 dataset = p .update_dataset (dataset , mesh = mesh , update_data = update_data )
23262315
23272316 return dataset
2317+
2318+ def _write_netcdf (self , mesh = None ):
2319+ import datetime
2320+
2321+ from ..version import __version__
2322+ if mesh is not None and mesh .upper () == "STRUCTURED" :
2323+ mesh = None
2324+
2325+ encode = {}
2326+ for pp in self .packagelist :
2327+ if pp .package_type == "ncf" :
2328+ encode ["shuffle" ] = pp .shuffle .get_data ()
2329+ encode ["deflate" ] = pp .deflate .get_data ()
2330+ encode ["chunk_time" ] = pp .chunk_time .get_data ()
2331+ encode ["chunk_face" ] = pp .chunk_face .get_data ()
2332+ encode ["chunk_x" ] = pp .chunk_x .get_data ()
2333+ encode ["chunk_y" ] = pp .chunk_y .get_data ()
2334+ encode ["chunk_z" ] = pp .chunk_z .get_data ()
2335+ wkt = pp .wkt .get_data ()
2336+ if wkt is not None :
2337+ wkt = wkt [0 ][1 ]
2338+ encode ["wkt" ] = wkt
2339+
2340+ if (
2341+ self .simulation .simulation_data .verbosity_level .value
2342+ >= VerbosityLevel .normal .value
2343+ ):
2344+ print (f" creating model dataset..." )
2345+
2346+ ds = self .modelgrid .dataset (
2347+ modeltime = self .modeltime ,
2348+ mesh = mesh ,
2349+ encoding = encode ,
2350+ )
2351+
2352+ dt = datetime .datetime .now ()
2353+ timestamp = dt .strftime ("%m/%d/%Y %H:%M:%S" )
2354+
2355+ nc_info = self .netcdf_info (mesh = mesh )
2356+ nc_info ["attrs" ]["title" ] = f"{ self .name .upper ()} input"
2357+ nc_info ["attrs" ]["source" ] = f"flopy { __version__ } "
2358+ nc_info ["attrs" ]["history" ] = f"first created { timestamp } "
2359+ if mesh is None :
2360+ nc_info ["attrs" ]["Conventions" ] = "CF-1.11"
2361+ elif mesh .upper () is "LAYERED" :
2362+ nc_info ["attrs" ]["Conventions" ] = "CF-1.11 UGRID-1.0"
2363+
2364+ ds = self .update_dataset (
2365+ ds ,
2366+ netcdf_info = nc_info ,
2367+ mesh = mesh ,
2368+ )
2369+
2370+ chunk = False
2371+ chunk_t = False
2372+ if mesh is None :
2373+ if (
2374+ "chunk_x" in encode
2375+ and encode ["chunk_x" ] is not None
2376+ and "chunk_y" in encode
2377+ and encode ["chunk_y" ] is not None
2378+ and "chunk_z" in encode
2379+ and encode ["chunk_z" ] is not None
2380+ ):
2381+ chunk = True
2382+ elif mesh .upper () == "LAYERED" :
2383+ if "chunk_face" in encode and encode ["chunk_face" ] is not None :
2384+ chunk = True
2385+ if "chunk_time" in encode and encode ["chunk_time" ] is not None :
2386+ chunk_t = True
2387+
2388+ base_encode = {}
2389+ if "deflate" in encode and encode ["deflate" ] is not None :
2390+ base_encode ["zlib" ] = True
2391+ base_encode ["complevel" ] = encode ["deflate" ]
2392+ if "shuffle" in encode and encode ["deflate" ] is not None :
2393+ base_encode ["shuffle" ] = True
2394+
2395+ encoding = {}
2396+ chunk_dims = {'time' , 'nmesh_face' , 'z' , 'y' , 'x' }
2397+ for varname , da in ds .data_vars .items ():
2398+ dims = ds .data_vars [varname ].dims
2399+ codes = dict (base_encode )
2400+ if (
2401+ not set (dims ).issubset (chunk_dims )
2402+ or not chunk or not chunk_t
2403+ ):
2404+ encoding [varname ] = codes
2405+ continue
2406+ chunksizes = []
2407+ if "time" in dims :
2408+ chunksizes .append (encode ["chunk_time" ])
2409+ if mesh is None :
2410+ if "z" in dims :
2411+ chunksizes .append (encode ["chunk_z" ])
2412+ if "y" in dims :
2413+ chunksizes .append (encode ["chunk_y" ])
2414+ if "x" in dims :
2415+ chunksizes .append (encode ["chunk_x" ])
2416+ elif mesh .upper () == "LAYERED" and "nmesh_face" in dims :
2417+ chunksizes .append (encode ["chunk_face" ])
2418+ if len (chunksizes ) > 0 :
2419+ codes ["chunksizes" ] = chunksizes
2420+ encoding [varname ] = codes
2421+
2422+ fname = self .name_file .nc_filerecord .get_data ()[0 ][0 ]
2423+
2424+ if (
2425+ self .simulation .simulation_data .verbosity_level .value
2426+ >= VerbosityLevel .normal .value
2427+ ):
2428+ print (f" writing NetCDF file { fname } ..." )
2429+ # write dataset to netcdf
2430+ ds .to_netcdf (
2431+ os .path .join (self .model_ws , fname ),
2432+ format = "NETCDF4" ,
2433+ engine = "netcdf4" ,
2434+ encoding = encoding ,
2435+ )
0 commit comments