def main(args): nc_misval = 1.e20 #-- Define Regions and their associated masks # Note: The Atlantic should include other smaller bays/seas that are # included in the definition used in meridional_overturning.py region = np.array([ 'atlantic_arctic_ocean ', 'indian_pacific_ocean', 'global_ocean' ]) #-- Read basin masks f_basin = nc.Dataset(args.basinfile) basin_code = f_basin.variables['basin'][:] atlantic_arctic_mask = basin_code * 0. atlantic_arctic_mask[(basin_code == 2) | (basin_code == 4) | (basin_code == 6) | (basin_code == 7) | (basin_code == 8)] = 1. indo_pacific_mask = basin_code * 0. indo_pacific_mask[(basin_code == 3) | (basin_code == 5)] = 1. #-- Read model data f_in = nc.Dataset(args.infile) #-- Read in existing dimensions from history netcdf file xh = f_in.variables['xh'] yh = f_in.variables['yh'] yq = f_in.variables['yq'] z_l = f_in.variables['z_l'] z_i = f_in.variables['z_i'] tax = f_in.variables['time'] #-- Note: based on conversations with @adcroft, the overturning should be reported on the interfaces, z_i. # Also, the nominal latitude is insufficient for the basin-average fields. Based on the methods in # meridional_overturning.py, the latitude dimension should be: # # y = netCDF4.Dataset(cmdLineArgs.gridspec+'/ocean_hgrid.nc').variables['y'][::2,::2] # yy = y[1:,:].max(axis=-1)+0*z # # The quanity 'yy' above is numerically-equivalent to 'yq' #-- msftyyz if 'vmo' in f_in.variables.keys(): varname = 'vmo' msftyyz = np.ma.ones((len(tax), 3, len(z_i), len(yq))) * 0. msftyyz[:, 0, :, :] = m6toolbox.moc_maskedarray( f_in.variables[varname][:], mask=atlantic_arctic_mask) msftyyz[:, 1, :, :] = m6toolbox.moc_maskedarray( f_in.variables[varname][:], mask=indo_pacific_mask) msftyyz[:, 2, :, :] = m6toolbox.moc_maskedarray( f_in.variables[varname][:]) msftyyz[msftyyz.mask] = nc_misval msftyyz = np.ma.array(msftyyz, fill_value=nc_misval) msftyyz.long_name = 'Ocean Y Overturning Mass Streamfunction' msftyyz.units = 'kg s-1' msftyyz.coordinates = 'region' msftyyz.cell_methods = 'z_i:point yq:point time:mean' msftyyz.time_avg_info = 'average_T1,average_T2,average_DT' msftyyz.standard_name = 'ocean_y_overturning_mass_streamfunction' do_msftyyz = True else: do_msftyyz = False #-- msftyzmpa if 'vhGM' in f_in.variables.keys(): varname = 'vhGM' msftyzmpa = np.ma.ones((len(tax), 3, len(z_i), len(yq))) * 0. msftyzmpa[:, 0, :, :] = m6toolbox.moc_maskedarray( f_in.variables[varname][:], mask=atlantic_arctic_mask) msftyzmpa[:, 1, :, :] = m6toolbox.moc_maskedarray( f_in.variables[varname][:], mask=indo_pacific_mask) msftyzmpa[:, 2, :, :] = m6toolbox.moc_maskedarray( f_in.variables[varname][:]) msftyzmpa[msftyzmpa.mask] = nc_misval msftyzmpa = np.ma.array(msftyzmpa, fill_value=nc_misval) msftyzmpa.long_name = 'ocean Y overturning mass streamfunction due to parameterized mesoscale advection' msftyzmpa.units = 'kg s-1' msftyzmpa.coordinates = 'region' msftyzmpa.cell_methods = 'z_i:point yq:point time:mean' msftyzmpa.time_avg_info = 'average_T1,average_T2,average_DT' msftyzmpa.standard_name = 'ocean_y_overturning_mass_streamfunction_due_to_parameterized_'+\ 'mesoscale_advection' do_msftyzmpa = True else: do_msftyzmpa = False #-- msftyzsmpa if 'vhml' in f_in.variables.keys(): varname = 'vhml' msftyzsmpa = np.ma.ones((len(tax), 3, len(z_i), len(yq))) * 0. msftyzsmpa[:, 0, :, :] = m6toolbox.moc_maskedarray( f_in.variables[varname][:], mask=atlantic_arctic_mask) msftyzsmpa[:, 1, :, :] = m6toolbox.moc_maskedarray( f_in.variables[varname][:], mask=indo_pacific_mask) msftyzsmpa[:, 2, :, :] = m6toolbox.moc_maskedarray( f_in.variables[varname][:]) msftyzsmpa[msftyzsmpa.mask] = nc_misval msftyzsmpa = np.ma.array(msftyzsmpa, fill_value=nc_misval) msftyzsmpa.long_name = 'ocean Y overturning mass streamfunction due to parameterized submesoscale advection' msftyzsmpa.units = 'kg s-1' msftyzsmpa.coordinates = 'region' msftyzsmpa.cell_methods = 'z_i:point yq:point time:mean' msftyzsmpa.time_avg_info = 'average_T1,average_T2,average_DT' msftyzsmpa.standard_name = 'ocean_meridional_overturning_mass_streamfunction_due_to_parameterized_'+\ 'submesoscale_advection' do_msftyzsmpa = True else: do_msftyzsmpa = False #-- wmo if all(x in f_in.variables.keys() for x in ['umo', 'vmo']): varname = 'wmo' wmo = calc_w_from_convergence(f_in.variables['umo'], f_in.variables['vmo']) wmo[wmo.mask] = nc_misval wmo = np.ma.array(wmo, fill_value=nc_misval) wmo.long_name = 'Upward mass transport from resolved and parameterized advective transport' wmo.units = 'kg s-1' wmo.cell_methods = 'z_i:point xh:sum yh:sum time:mean' wmo.time_avg_info = 'average_T1,average_T2,average_DT' wmo.standard_name = 'upward_ocean_mass_transport' wmo.cell_measures = 'area:areacello' do_wmo = True else: do_wmo = False #-- mfo try: _, mfo, straits = sum_transport_in_straits(args.straitdir, monthly_average=True) #mfo[mfo.mask] = nc_misval mfo = np.ma.array(mfo, fill_value=nc_misval) strait_names = np.array([strait.cmor_name for strait in straits]) mfo.long_name = 'Sea Water Transport' mfo.units = 'kg s-1' mfo.coordinates = 'strait' mfo.cell_methods = 'time:mean' mfo.time_avg_info = 'average_T1,average_T2,average_DT' mfo.standard_name = 'sea_water_transport_across_line' do_mfo = True except: do_mfo = False #-- Read time bounds nv = f_in.variables['nv'] average_T1 = f_in.variables['average_T1'] average_T2 = f_in.variables['average_T2'] average_DT = f_in.variables['average_DT'] time_bnds = f_in.variables['time_bnds'] if any([do_msftyyz, do_msftyzsmpa, do_msftyzmpa, do_wmo, do_mfo]): #-- Generate output filename if args.outfile is None: if hasattr(f_in, 'filename'): args.outfile = f_in.filename else: args.outfile = os.path.basename(args.infile) args.outfile = args.outfile.split('.') args.outfile[-2] = args.outfile[-2] + '_refined' args.outfile = '.'.join(args.outfile) if args.refineDiagDir is not None: args.outfile = args.refineDiagDir + '/' + args.outfile #-- Write output file try: os.remove(args.outfile) except: pass if os.path.exists(args.outfile): raise IOError('Output netCDF file already exists.') exit(1) f_out = nc.Dataset(args.outfile, 'w', format='NETCDF3_CLASSIC') f_out.setncatts(f_in.__dict__) f_out.filename = os.path.basename(args.outfile) time_dim = f_out.createDimension('time', size=None) basin_dim = f_out.createDimension('basin', size=3) strait_dim = f_out.createDimension('strait', size=len(straits)) strlen_dim = f_out.createDimension('strlen', size=31) xh_dim = f_out.createDimension('xh', size=len(xh[:])) yh_dim = f_out.createDimension('yh', size=len(yh[:])) yq_dim = f_out.createDimension('yq', size=len(yq[:])) z_l_dim = f_out.createDimension('z_l', size=len(z_l[:])) z_i_dim = f_out.createDimension('z_i', size=len(z_i[:])) nv_dim = f_out.createDimension('nv', size=len(nv[:])) time_out = f_out.createVariable('time', np.float64, ('time')) xh_out = f_out.createVariable('xh', np.float64, ('xh')) yh_out = f_out.createVariable('yh', np.float64, ('yh')) yq_out = f_out.createVariable('yq', np.float64, ('yq')) region_out = f_out.createVariable('region', 'c', ('basin', 'strlen')) strait_out = f_out.createVariable('strait', 'c', ('strait', 'strlen')) z_l_out = f_out.createVariable('z_l', np.float64, ('z_l')) z_i_out = f_out.createVariable('z_i', np.float64, ('z_i')) nv_out = f_out.createVariable('nv', np.float64, ('nv')) if do_msftyyz: msftyyz_out = f_out.createVariable('msftyyz', np.float32, ('time', 'basin', 'z_i', 'yq'), fill_value=nc_misval) msftyyz_out.missing_value = nc_misval for k in msftyyz.__dict__.keys(): if k[0] != '_': msftyyz_out.setncattr(k, msftyyz.__dict__[k]) if do_msftyzsmpa: msftyzsmpa_out = f_out.createVariable( 'msftyzsmpa', np.float32, ('time', 'basin', 'z_i', 'yq'), fill_value=nc_misval) msftyzsmpa_out.missing_value = nc_misval for k in msftyzsmpa.__dict__.keys(): if k[0] != '_': msftyzsmpa_out.setncattr(k, msftyzsmpa.__dict__[k]) if do_msftyzmpa: msftyzmpa_out = f_out.createVariable( 'msftyzmpa', np.float32, ('time', 'basin', 'z_i', 'yq'), fill_value=nc_misval) msftyzmpa_out.missing_value = nc_misval for k in msftyzmpa.__dict__.keys(): if k[0] != '_': msftyzmpa_out.setncattr(k, msftyzmpa.__dict__[k]) if do_wmo: wmo_out = f_out.createVariable('wmo', np.float32, ('time', 'z_i', 'yh', 'xh'), fill_value=nc_misval) wmo_out.missing_value = nc_misval for k in wmo.__dict__.keys(): if k[0] != '_': wmo_out.setncattr(k, wmo.__dict__[k]) if do_mfo: mfo_out = f_out.createVariable('mfo', np.float32, ('time', 'strait'), fill_value=nc_misval) mfo_out.missing_value = nc_misval for k in mfo.__dict__.keys(): if k[0] != '_': mfo_out.setncattr(k, mfo.__dict__[k]) average_T1_out = f_out.createVariable('average_T1', np.float64, ('time')) average_T2_out = f_out.createVariable('average_T2', np.float64, ('time')) average_DT_out = f_out.createVariable('average_DT', np.float64, ('time')) time_bnds_out = f_out.createVariable('time_bnds', np.float64, ('time', 'nv')) time_out.setncatts(tax.__dict__) xh_out.setncatts(xh.__dict__) yh_out.setncatts(yh.__dict__) yq_out.setncatts(yq.__dict__) z_l_out.setncatts(z_l.__dict__) z_i_out.setncatts(z_i.__dict__) nv_out.setncatts(nv.__dict__) region_out.setncattr('standard_name', 'region') strait_out.setncattr('standard_name', 'region') average_T1_out.setncatts(average_T1.__dict__) average_T2_out.setncatts(average_T2.__dict__) average_DT_out.setncatts(average_DT.__dict__) time_bnds_out.setncatts(time_bnds.__dict__) time_out[:] = np.array(tax[:]) xh_out[:] = np.array(xh[:]) yh_out[:] = np.array(yh[:]) yq_out[:] = np.array(yq[:]) z_l_out[:] = np.array(z_l[:]) z_i_out[:] = np.array(z_i[:]) nv_out[:] = np.array(nv[:]) if do_msftyyz: msftyyz_out[:] = np.ma.array(msftyyz[:]) if do_msftyzsmpa: msftyzsmpa_out[:] = np.ma.array(msftyzsmpa[:]) if do_msftyzmpa: msftyzmpa_out[:] = np.ma.array(msftyzmpa[:]) if do_wmo: wmo_out[:] = np.ma.array(wmo[:]) if do_mfo: mfo_out[:] = np.array(mfo[:]) average_T1_out[:] = average_T1[:] average_T2_out[:] = average_T2[:] average_DT_out[:] = average_DT[:] time_bnds_out[:] = time_bnds[:] region_out[:] = nc.stringtochar(region) strait_out[:] = nc.stringtochar(strait_names) f_out.close() exit(0) else: print('RefineDiag for ocean_month_rho2 yielded no output.') exit(1)
def main(args): #-- Define Regions and their associated masks # Note: The Atlantic should include other smaller bays/seas that are # included in the definition used in meridional_overturning.py region = np.array( ['atlantic_arctic_ocean', 'indian_pacific_ocean', 'global_ocean']) _, nl = nc.stringtochar(region).shape #-- Read basin masks f_basin = nc.Dataset(args.basinfile) basin_code = f_basin.variables['basin'][:] atlantic_arctic_mask = basin_code * 0. atlantic_arctic_mask[(basin_code == 2) | (basin_code == 4) | (basin_code == 6) | (basin_code == 7) | (basin_code == 8)] = 1. indo_pacific_mask = basin_code * 0. indo_pacific_mask[(basin_code == 3) | (basin_code == 5)] = 1. #-- Read model data f_in = nc.Dataset(args.infile) #-- Read in existing dimensions from history netcdf file yq = f_in.variables['yq'] rho2_l = f_in.variables['rho2_l'] rho2_i = f_in.variables['rho2_i'] tax = f_in.variables['time'] if (len(yq) == 1 + atlantic_arctic_mask.shape[0]): #symmetric case atlantic_arctic_mask = np.append(atlantic_arctic_mask, np.zeros( (1, atlantic_arctic_mask.shape[1])), axis=0) indo_pacific_mask = np.append(indo_pacific_mask, np.zeros( (1, indo_pacific_mask.shape[1])), axis=0) #-- msftyrho if 'vmo' in list(f_in.variables.keys()): varname = 'vmo' msftyrho = np.ma.ones((len(tax), 3, len(rho2_i), len(yq))) * 0. msftyrho[:, 0, :, :] = m6toolbox.moc_maskedarray( f_in.variables[varname][:], mask=atlantic_arctic_mask) msftyrho[:, 1, :, :] = m6toolbox.moc_maskedarray( f_in.variables[varname][:], mask=indo_pacific_mask) msftyrho[:, 2, :, :] = m6toolbox.moc_maskedarray( f_in.variables[varname][:]) msftyrho[msftyrho.mask] = 1.e20 msftyrho = np.ma.array(msftyrho, fill_value=1.e20) msftyrho.long_name = 'Ocean Y Overturning Mass Streamfunction' msftyrho.units = 'kg s-1' msftyrho.coordinates = 'region' msftyrho.cell_methods = 'rho2_i:point yq:point time:mean' msftyrho.time_avg_info = 'average_T1,average_T2,average_DT' msftyrho.standard_name = 'ocean_y_overturning_mass_streamfunction' do_msftyrho = True else: do_msftyrho = False #-- msftyrhompa if 'vhGM' in list(f_in.variables.keys()): varname = 'vhGM' msftyrhompa = np.ma.ones((len(tax), 3, len(rho2_i), len(yq))) * 0. msftyrhompa[:, 0, :, :] = m6toolbox.moc_maskedarray( f_in.variables[varname][:], mask=atlantic_arctic_mask) msftyrhompa[:, 1, :, :] = m6toolbox.moc_maskedarray( f_in.variables[varname][:], mask=indo_pacific_mask) msftyrhompa[:, 2, :, :] = m6toolbox.moc_maskedarray( f_in.variables[varname][:]) msftyrhompa[msftyrhompa.mask] = 1.e20 msftyrhompa = np.ma.array(msftyrhompa, fill_value=1.e20) msftyrhompa.long_name = 'ocean Y overturning mass streamfunction due to parameterized mesoscale advection' msftyrhompa.units = 'kg s-1' msftyrhompa.coordinates = 'region' msftyrhompa.cell_methods = 'rho2_i:point yq:point time:mean' msftyrhompa.time_avg_info = 'average_T1,average_T2,average_DT' msftyrhompa.standard_name = 'ocean_y_overturning_mass_streamfunction_due_to_parameterized_'+\ 'mesoscale_advection' do_msftyrhompa = True else: do_msftyrhompa = False #-- Read time bounds nv = f_in.variables['nv'] average_T1 = f_in.variables['average_T1'] average_T2 = f_in.variables['average_T2'] average_DT = f_in.variables['average_DT'] time_bnds = f_in.variables['time_bnds'] if any([do_msftyrho, do_msftyrhompa]): #-- Generate output filename if args.outfile is None: if hasattr(f_in, 'filename'): args.outfile = f_in.filename else: args.outfile = os.path.basename(args.infile) args.outfile = args.outfile.split('.') args.outfile[-2] = args.outfile[-2] + '_refined' args.outfile = '.'.join(args.outfile) if args.refineDiagDir is not None: args.outfile = args.refineDiagDir + '/' + args.outfile #-- Write output file try: os.remove(args.outfile) except: pass if os.path.exists(args.outfile): raise IOError('Output netCDF file already exists.') exit(1) f_out = nc.Dataset(args.outfile, 'w', format='NETCDF3_CLASSIC') ncattrs = f_in.__dict__ ncattrs.pop('associated_files', '') # not needed for these fields f_out.setncatts(ncattrs) f_out.filename = os.path.basename(args.outfile) time_dim = f_out.createDimension('time', size=None) basin_dim = f_out.createDimension('basin', size=3) strlen_dim = f_out.createDimension('strlen', size=nl) yq_dim = f_out.createDimension('yq', size=len(yq[:])) rho2_l_dim = f_out.createDimension('rho2_l', size=len(rho2_l[:])) rho2_i_dim = f_out.createDimension('rho2_i', size=len(rho2_i[:])) nv_dim = f_out.createDimension('nv', size=len(nv[:])) time_out = f_out.createVariable('time', np.float64, ('time')) yq_out = f_out.createVariable('yq', np.float64, ('yq')) region_out = f_out.createVariable('region', 'c', ('basin', 'strlen')) rho2_l_out = f_out.createVariable('rho2_l', np.float64, ('rho2_l')) rho2_i_out = f_out.createVariable('rho2_i', np.float64, ('rho2_i')) nv_out = f_out.createVariable('nv', np.float64, ('nv')) if do_msftyrho: msftyrho_out = f_out.createVariable( 'msftyrho', np.float32, ('time', 'basin', 'rho2_i', 'yq'), fill_value=1.e20) msftyrho_out.missing_value = 1.e20 for k in list(msftyrho.__dict__.keys()): if k[0] != '_': msftyrho_out.setncattr(k, msftyrho.__dict__[k]) if do_msftyrhompa: msftyrhompa_out = f_out.createVariable( 'msftyrhompa', np.float32, ('time', 'basin', 'rho2_i', 'yq'), fill_value=1.e20) msftyrhompa_out.missing_value = 1.e20 for k in list(msftyrhompa.__dict__.keys()): if k[0] != '_': msftyrhompa_out.setncattr(k, msftyrhompa.__dict__[k]) region_out.setncattr('standard_name', 'region') average_T1_out = f_out.createVariable('average_T1', np.float64, ('time')) average_T2_out = f_out.createVariable('average_T2', np.float64, ('time')) average_DT_out = f_out.createVariable('average_DT', np.float64, ('time')) time_bnds_out = f_out.createVariable('time_bnds', np.float64, ('time', 'nv')) time_out.setncatts(tax.__dict__) yq_out.setncatts(yq.__dict__) rho2_l_out.setncatts(rho2_l.__dict__) rho2_i_out.setncatts(rho2_i.__dict__) nv_out.setncatts(nv.__dict__) average_T1_out.setncatts(average_T1.__dict__) average_T2_out.setncatts(average_T2.__dict__) average_DT_out.setncatts(average_DT.__dict__) time_bnds_out.setncatts(time_bnds.__dict__) time_out[:] = np.array(tax[:]) yq_out[:] = np.array(yq[:]) rho2_l_out[:] = np.array(rho2_l[:]) rho2_i_out[:] = np.array(rho2_i[:]) nv_out[:] = np.array(nv[:]) if do_msftyrho: msftyrho_out[:] = np.ma.array(msftyrho[:]) if do_msftyrhompa: msftyrhompa_out[:] = np.ma.array(msftyrhompa[:]) average_T1_out[:] = average_T1[:] average_T2_out[:] = average_T2[:] average_DT_out[:] = average_DT[:] time_bnds_out[:] = time_bnds[:] region_out[:] = nc.stringtochar(region) f_out.close() exit(0) else: print('RefineDiag for ocean_month_rho2 yielded no output.') exit(1)