@@ -124,7 +124,10 @@ def gen_hybrid_pres(
124
124
in the TSC (time step convergence) test
125
125
126
126
"""
127
- nlev , ncol = size
127
+ if len (size ) == 2 :
128
+ nlev , ncol = size
129
+ elif len (size ) == 3 :
130
+ _ , nlev , ncol = size
128
131
p_0 = 100000
129
132
130
133
if seed is not None :
@@ -262,6 +265,10 @@ def make_ensemble(
262
265
_area , _ = gen_field (self .size [- 1 :])
263
266
_area = norm (_area )
264
267
268
+ # Last dimension of self.size should be number of columns
269
+ lat = np .linspace (- np .pi / 2 , np .pi / 2 , self .size [- 1 ])
270
+ lon = np .linspace (0 , 2 * np .pi , self .size [- 1 ])
271
+
265
272
# 2/3 ocean, 1/3 land
266
273
_landfrac = np .zeros (self .size [- 1 ])
267
274
_landfrac [: self .size [- 1 ] // 3 ] = 1.0
@@ -288,6 +295,8 @@ def make_ensemble(
288
295
ens_data [iinst ]["hybi" ] = hybi
289
296
ens_data [iinst ]["LANDFRAC" ] = _landfrac
290
297
ens_data [iinst ]["area" ] = _area
298
+ ens_data [iinst ]["lon" ] = lon
299
+ ens_data [iinst ]["lat" ] = lat
291
300
292
301
self .ens_data = ens_data
293
302
@@ -319,6 +328,16 @@ def get_file_times(
319
328
f"{ sim_start } -{ istep :05d} "
320
329
for istep in range (0 , step_mult * self .ntimes , step_mult )
321
330
]
331
+ elif timestep .lower () == "yearly-year-month-day" :
332
+ file_times = pd .date_range (
333
+ start = sim_start , periods = self .ntimes , freq = "YS" , unit = "s"
334
+ )
335
+ file_times = [_time .strftime ("%04Y-%m-%d" ) for _time in file_times ]
336
+ elif timestep .lower () == "year" :
337
+ file_times = pd .date_range (
338
+ start = sim_start , periods = self .ntimes , freq = "YS" , unit = "s"
339
+ )
340
+ file_times = [_time .strftime ("%04Y" ) for _time in file_times ]
322
341
else :
323
342
raise NotImplementedError (f"FREQ: { timestep } NOT YET IMPLEMENTED" )
324
343
return file_times
@@ -330,7 +349,9 @@ def write_to_nc(
330
349
timestep : str = "month" ,
331
350
step_mult : int = 1 ,
332
351
hist_file_pattern : str = "eam_{inst:04d}.h0.{time}" ,
352
+ casename : bool = True ,
333
353
file_suffix : str = None ,
354
+ ** kwargs ,
334
355
):
335
356
"""Write generated data to a netCDF file."""
336
357
# Make an xarray.Dataset for each instance so it can be written to a file.
@@ -361,33 +382,46 @@ def write_to_nc(
361
382
if file_suffix is not None :
362
383
extn = f"{ extn } .{ file_suffix } "
363
384
385
+ _time_suffix = kwargs .get ("time_suffix" , None )
386
+ if _time_suffix is None :
387
+ _time_suffix = ""
388
+
364
389
# TODO: Parallelize this
365
390
for iinst in self .ens_data :
366
391
for itime in range (self .ntimes ):
367
392
_outfile_name = hist_file_pattern .format (
368
- inst = (iinst + 1 ), time = file_times [itime ]
393
+ inst = (iinst + 1 ), time = file_times [itime ], time_suffix = _time_suffix
369
394
)
370
395
data_vars = {}
371
396
for _var in self .vars :
372
397
data_vars [_var ] = (self .dims , self .ens_data [iinst ][_var ][itime ])
373
- data_vars ["PS" ] = (self .dims [- 1 :], self .ens_data [iinst ]["PS" ])
374
- data_vars ["area" ] = (self .dims [- 1 :], self .ens_data [iinst ]["area" ])
375
- data_vars ["LANDFRAC" ] = (
376
- ("time" , self .dims [- 1 ]),
377
- np .expand_dims (self .ens_data [iinst ]["LANDFRAC" ], 0 ),
378
- )
379
-
380
- data_vars ["hyai" ] = (self .dims [:1 ], self .ens_data [iinst ]["hyai" ])
381
- data_vars ["hybi" ] = (self .dims [:1 ], self .ens_data [iinst ]["hybi" ])
382
- data_vars ["P0" ] = self .ens_data [iinst ]["P0" ]
383
398
384
- _dset = xr .Dataset (
385
- data_vars = data_vars ,
386
- coords = coords ,
387
- attrs = {** ds_attrs , "inst" : iinst },
388
- )
399
+ # 1-D variables only x/y
400
+ for _var in ["PS" , "area" , "lon" , "lat" ]:
401
+ data_vars [_var ] = (self .dims [- 1 :], self .ens_data [iinst ][_var ])
402
+
403
+ if "mvko" not in self .name :
404
+ data_vars ["LANDFRAC" ] = (
405
+ ("time" , self .dims [- 1 ]),
406
+ np .expand_dims (self .ens_data [iinst ]["LANDFRAC" ], 0 ),
407
+ )
408
+ data_vars ["hyai" ] = (self .dims [:1 ], self .ens_data [iinst ]["hyai" ])
409
+ data_vars ["hybi" ] = (self .dims [:1 ], self .ens_data [iinst ]["hybi" ])
410
+ data_vars ["P0" ] = self .ens_data [iinst ]["P0" ]
411
+ try :
412
+ _dset = xr .Dataset (
413
+ data_vars = data_vars ,
414
+ coords = coords ,
415
+ attrs = {** ds_attrs , "inst" : iinst },
416
+ )
417
+ except ValueError :
418
+ breakpoint ()
389
419
ens_xarray [iinst ] = _dset
390
- _out_file = Path (out_path , f"{ self .name } .{ _outfile_name } .{ extn } " )
420
+ if casename :
421
+ _filename = f"{ self .name } .{ _outfile_name } .{ extn } "
422
+ else :
423
+ _filename = f"{ _outfile_name } .{ extn } "
424
+ _out_file = Path (out_path , _filename )
391
425
_dset .to_netcdf (
392
426
_out_file ,
393
427
unlimited_dims = "time" ,
@@ -441,27 +475,37 @@ def main(args):
441
475
variables = _test ["variables" ],
442
476
ntimes = _test ["ntimes" ],
443
477
ninst = _test ["ninst" ],
478
+ dims = _test .get ("dims" , ("nlev" , "ncol" )),
444
479
)
445
480
mimic_case .make_ensemble (** _test [case ]["ensemble" ])
446
481
482
+ # Defaults for file output
447
483
out_path = Path ("./data" , _testname , mimic_case .name )
448
484
file_suffix = None
449
485
step_mult = 1
450
- timestep = "month"
486
+ # Will be overridden if set in "to_nc" below
487
+ timestep = _test .get ("timestep" , "month" )
488
+ casename = True
451
489
452
490
if "to_nc" in _test [case ]:
453
491
# If the to_nc has variables in config file, use that, otherwise use default
454
492
out_path = Path (_test [case ]["to_nc" ].get ("out_path" , out_path ))
455
493
file_suffix = _test [case ]["to_nc" ].get ("file_suffix" , file_suffix )
456
494
timestep = _test [case ]["to_nc" ].get ("timestep" , timestep )
457
495
step_mult = _test [case ]["to_nc" ].get ("step_mult" , step_mult )
496
+ casename = _test [case ]["to_nc" ].get ("casename" , casename )
497
+ time_suffix = _test [case ]["to_nc" ].get ("time_suffix" , None )
498
+ else :
499
+ time_suffix = ""
458
500
459
501
mimic_case .write_to_nc (
460
502
out_path = out_path ,
461
503
hist_file_pattern = _test ["hist_file_fmt" ],
504
+ casename = casename ,
462
505
file_suffix = file_suffix ,
463
506
timestep = timestep ,
464
507
step_mult = step_mult ,
508
+ time_suffix = time_suffix ,
465
509
)
466
510
out_dirs [_testname ][case ] = out_path
467
511
0 commit comments