''' Creates Nemo Bdy netCDF file ready for population Written by John Kazimierz Farey, started August 30, 2012 Port of Matlab code of James Harle ''' # pylint: disable=E1103 # pylint: disable=no-name-in-module from netCDF4 import Dataset import datetime import logging def CreateBDYNetcdfFile(filename, N, I, J, K, rw, h, orig, fv, calendar, grd): """ This method creates a template of bdy netcdf files. A common for T, I, U, V, E grid types. """ gridNames = ['T', 'I', 'U', 'V', 'E', 'Z'] # All possible grids # Dimension Lengths xb_len = N yb_len = 1 x_len = I y_len = J depth_len = K # Enter define mode ncid = Dataset(filename, 'w', clobber=True, format='NETCDF4') #define dimensions if grd in gridNames and grd != 'Z': # i.e grid NOT barotropic (Z) dimztID = ncid.createDimension('z', depth_len) else: logging.error('Grid tpye not known') dimxbID = ncid.createDimension('xb', xb_len) dimybID = ncid.createDimension('yb', yb_len) dimxID = ncid.createDimension('x', x_len) dimyID = ncid.createDimension('y', y_len) dimtcID = ncid.createDimension('time_counter', None) #define variable vartcID = ncid.createVariable('time_counter', 'f4', ('time_counter', )) varlonID = ncid.createVariable('nav_lon', 'f4', ('y', 'x', )) varlatID = ncid.createVariable('nav_lat', 'f4', ('y', 'x', )) if grd in ['E']: varztID = ncid.createVariable('deptht', 'f4', ('z', 'yb', 'xb', )) varmskID = ncid.createVariable('bdy_msk', 'f4', ('y', 'x', ), fill_value=fv) varN1pID = ncid.createVariable('N1p', 'f4', ('time_counter', 'z', 'yb', 'xb', ), fill_value=fv) varN3nID = ncid.createVariable('N3n', 'f4', ('time_counter', 'z', 'yb', 'xb', ), fill_value=fv) varN5sID = ncid.createVariable('N5s', 'f4', ('time_counter', 'z', 'yb', 'xb', ), fill_value=fv) elif grd in ['T', 'I']: varztID = ncid.createVariable('deptht', 'f4', ('z', 'yb', 'xb', )) varmskID = ncid.createVariable('bdy_msk', 'f4', ('y', 'x', ), fill_value=fv) vartmpID = ncid.createVariable('votemper', 'f4', ('time_counter', 'z', 'yb', 'xb', ), fill_value=fv) varsalID = ncid.createVariable('vosaline', 'f4', ('time_counter', 'z', 'yb', 'xb', ), fill_value=fv) if grd == 'I': varildID = ncid.createVariable('ileadfra', 'f4', ('time_counter', 'yb', 'xb',), fill_value=fv) variicID = ncid.createVariable('iicethic', 'f4', ('time_counter', 'yb', 'xb',), fill_value=fv) varisnID = ncid.createVariable('isnowthi', 'f4', ('time_counter', 'yb', 'xb',), fill_value=fv) elif grd == 'U': varztID = ncid.createVariable('depthu', 'f4', ('z', 'yb', 'xb', ), fill_value=fv) varbtuID = ncid.createVariable('vobtcrtx', 'f4', ('time_counter', 'yb', 'xb', ), fill_value=fv) vartouID = ncid.createVariable('vozocrtx', 'f4', ('time_counter', 'z', 'yb', 'xb', ), fill_value=fv) elif grd == 'V': varztID = ncid.createVariable('depthv', 'f4', ('z', 'yb', 'xb', )) varbtvID = ncid.createVariable('vobtcrty', 'f4', ('time_counter', 'yb', 'xb', ), fill_value=fv) vartovID = ncid.createVariable('vomecrty', 'f4', ('time_counter', 'z', 'yb', 'xb',), fill_value=fv) elif grd == 'Z': varsshID = ncid.createVariable('sossheig', 'f4', ('time_counter', 'yb', 'xb', ), fill_value=fv) varmskID = ncid.createVariable('bdy_msk', 'f4', ('y', 'x', ), fill_value=fv) else: logging.error("Unknow Grid input") varnbiID = ncid.createVariable('nbidta', 'i4', ('yb', 'xb', )) varnbjID = ncid.createVariable('nbjdta', 'i4', ('yb', 'xb', )) varnbrID = ncid.createVariable('nbrdta', 'i4', ('yb', 'xb', )) #Global Attributes ncid.file_name = filename ncid.creation_date = str(datetime.datetime.now()) ncid.rim_width = rw ncid.history = h ncid.institution = 'National Oceanography Centre, Livepool, U.K.' #Time axis attributes vartcID.axis = 'T' vartcID.standard_name = 'time' vartcID.units = 'seconds since '+orig vartcID.title = 'Time' vartcID.long_name = 'Time axis' vartcID.time_origin = orig vartcID.calendar = calendar #Longitude axis attributes varlonID.axis = 'Longitude' varlonID.short_name = 'nav_lon' varlonID.units = 'degrees_east' varlonID.long_name = 'Longitude' #Latitude axis attributes varlatID.axis = 'Latitude' varlatID.short_name = 'nav_lat' varlatID.units = 'degrees_east' varlatID.long_name = 'Latitude' #nbidta attributes varnbiID.short_name = 'nbidta' varnbiID.units = 'unitless' varnbiID.long_name = 'Bdy i indices' #nbjdta attributes varnbjID.short_name = 'nbjdta' varnbjID.units = 'unitless' varnbjID.long_name = 'Bdy j indices' #nbrdta attributes varnbrID.short_name = 'nbrdta' varnbrID.units = 'unitless' varnbrID.long_name = 'Bdy discrete distance' if grd == 'E': varztID.axis = 'Depth' varztID.short_name = 'deptht' varztID.units = 'm' varztID.long_name = 'Depth' varmskID.short_name = 'bdy_msk' varmskID.units = 'unitless' varmskID.long_name = 'Structured boundary mask' varN1pID.units = 'mmol/m^3' varN1pID.short_name = 'N1p' varN1pID.long_name = 'Phosphate' varN1pID.grid = 'bdyT' varN3nID.units = 'mmol/m^3' varN3nID.short_name = 'N3n' varN3nID.long_name = 'Nitrate' varN3nID.grid = 'bdyT' varN5sID.units = 'mmol/m^3' varN5sID.short_name = 'N5s' varN5sID.long_name = 'Silicate' varN5sID.grid = 'bdyT' if grd in ['T', 'I']: varztID.axis = 'Depth' varztID.short_name = 'deptht' varztID.units = 'm' varztID.long_name = 'Depth' varmskID.short_name = 'bdy_msk' varmskID.units = 'unitless' varmskID.long_name = 'Structured boundary mask' vartmpID.units = 'C' vartmpID.short_name = 'votemper' vartmpID.long_name = 'Temperature' vartmpID.grid = 'bdyT' varsalID.units = 'PSU' varsalID.short_name = 'vosaline' varsalID.long_name = 'Salinity' varsalID.grid = 'bdyT' if grd == 'I': varildID.units = '%' varildID.short_name = 'ildsconc' varildID.long_name = 'Ice lead fraction' varildID.grid = 'bdyT' variicID.units = 'm' variicID.short_name = 'iicethic' variicID.long_name = 'Ice thickness' variicID.grid = 'bdyT' varisnID.units = 'm' varisnID.short_name = 'isnowthi' varisnID.long_name = 'Snow thickness' varisnID.grid = 'bdyT' elif grd == 'U': varztID.axis = 'Depth' varztID.short_name = 'depthu' varztID.units = 'm' varztID.long_name = 'Depth' varbtuID.units = 'm/s' varbtuID.short_name = 'vobtcrtx' varbtuID.long_name = 'Thickness-weighted depth-averaged zonal Current' varbtuID.grid = 'bdyU' vartouID.units = 'm/s' vartouID.short_name = 'vozocrtx' vartouID.long_name = 'Zonal Current' vartouID.grid = 'bdyU' elif grd == 'V': varztID.axis = 'Depth' varztID.short_name = 'depthv' varztID.units = 'm' varztID.long_name = 'Depth' varbtvID.units = 'm/s' varbtvID.short_name = 'vobtcrty' varbtvID.long_name = 'Thickness-weighted depth-averaged meridional Current' varbtvID.grid = 'bdyV' vartovID.units = 'm/s' vartovID.short_name = 'vomecrty' vartovID.long_name = 'Meridional Current' vartovID.grid = 'bdyV' elif grd == 'Z': varsshID.units = 'm' varsshID.short_name = 'sossheig' varsshID.long_name = 'Sea Surface Height' varsshID.grid = 'bdyT' varmskID.short_name = 'bdy_msk' varmskID.units = 'unitless' varmskID.long_name = 'Structured boundary mask' else: logging.error('Unknown Grid') ncid.close()