Пример #1
0
    def init_file(self, filename, time_units="seconds since 1970-01-01T00:00"):
        """
        Initializes netCDF file for writing

        Args:
            filename: Name of the netCDF file
            time_units: Units for the time variable in format "<time> since <date string>"
        Returns:
            Dataset object
        """
        if os.access(filename, os.R_OK):
            out_data = Dataset(filename, "r+")
        else:
            out_data = Dataset(filename, "w")
            if len(self.data.shape) == 2:
                for d, dim in enumerate(["y", "x"]):
                    out_data.createDimension(dim, self.data.shape[d])
            else:
                for d, dim in enumerate(["y", "x"]):
                    out_data.createDimension(dim, self.data.shape[d + 1])
            out_data.createDimension("time", len(self.times))
            time_var = out_data.createVariable("time", "i8", ("time", ))
            time_var[:] = date2num(self.times.to_pydatetime(), time_units)
            time_var.units = time_units
            out_data.Conventions = "CF-1.6"
        return out_data
Пример #2
0
def PutNC_3D(Var,
             tim,
             lat,
             lon,
             description='None',
             symbol='Var',
             unit='--',
             fill=9.96921e+36,
             filename='result.nc'):
    """
概要:
    3次元(空間分布×時間変化)の気象変量をnetCDF形式のファイルで出力する関数。
書式:
     PutNC_3D( Var, tim, lat, lon, description='None', symbol='Var', unit='--', fill=9.96921e+36, filename='result.nc' )
引数(必須):
    Var:内容を書き出す3次元配列変数。第0次元は日付、第1次元は緯度、第2次元は経度とする。
    tim:配列Varがカバーする日付の配列。日付はPythonの日付オブジェクトで与える。Varの第0次元の要素数と一致していなくてはならない。
    lat:配列Varの各行が位置する緯度値が格納されている配列。Varの第1次元の要素数と一致していなくてはならない。
    lon:配列Varの各列が位置する経度値が格納されている配列。Varの第2次元の要素数と一致していなくてはならない。
引数(必要に応じ指定):
    description:データの正式名称などデータを説明する文。
    symbol:データに対して用いる記号
    unit:データの数値が従う単位
    fill:無効値として取り扱う数値。デフォルト値は、9.96921e+36
    filename:出力されるファイルの名前。デフォルト値は'result.nc'。
 戻り値:なし。
    """
    fh = Dataset(join(filename), "w")
    fh.title = '3-D data crated by PutNC_3D function.'
    fh.source = "Agro-Meteorological Grid Square Data System NIAES, NARO"
    fh.Conventions = "None"
    fh.creation_date = "Created " + dt.now().strftime("%Y/%m/%d %H:%M:%S JST")
    fh.createDimension("time", len(tim))
    fh.createDimension("lat", len(lat))
    fh.createDimension("lon", len(lon))
    nc_Var = fh.createVariable(symbol,
                               "f4", (
                                   "time",
                                   "lat",
                                   "lon",
                               ),
                               fill_value=fill)
    nc_time = fh.createVariable("time",
                                "f8", ("time", ),
                                fill_value=9.969209968386869E36)
    nc_lat = fh.createVariable("lat", "f4", ("lat", ))
    nc_lon = fh.createVariable("lon", "f4", ("lon", ))
    nc_time.calendar = "standard"
    nc_time.units = "days since 1900-1-1 00:00:0.0"
    nc_lat.long_name = "latitude"
    nc_lat.units = "degrees_north"
    nc_lon.long_name = "longitude"
    nc_lon.units = "degrees_east"
    nc_Var.long_name = description + '(' + symbol + ')'
    nc_Var.units = unit
    nc_Var[:, :, :] = Var
    nc_time[:] = date2num(tim[:], units=nc_time.units)
    nc_lat[:] = lat
    nc_lon[:] = lon
    fh.close()
Пример #3
0
    def init_file(self, filename, time_units="seconds since 1970-01-01T00:00"):
        """
        Initializes netCDF file for writing

        Args:
            filename: Name of the netCDF file
            time_units: Units for the time variable in format "<time> since <date string>"
        Returns:
            Dataset object
        """
        if os.access(filename, os.R_OK):
            out_data = Dataset(filename, "r+")
        else:
            out_data = Dataset(filename, "w")
            if len(self.data.shape) == 2:
                for d, dim in enumerate(["y", "x"]):
                    out_data.createDimension(dim, self.data.shape[d])
            else:
                for d, dim in enumerate(["y", "x"]):
                    out_data.createDimension(dim, self.data.shape[d+1])
            out_data.createDimension("time", len(self.times))
            time_var = out_data.createVariable("time", "i8", ("time",))
            time_var[:] = date2num(self.times.to_pydatetime(), time_units)
            time_var.units = time_units
            out_data.Conventions = "CF-1.6"
        return out_data
Пример #4
0
    def new(self, secs):
        """
        Creates a new seNorge netCDF file.
        Convention: Climate and Forecast (CF) version 1.4
        
        @param secs: in seconds since 1970-01-01 00:00:00
        """
        # create new file
        rootgrp = Dataset(self.filename, 'w')  # create new file using netcdf4
        #        rootgrp = netcdf_file(self.filename, 'w') # create new file using scipy.IO

        # add root dimensions
        rootgrp.createDimension('time', size=self.default_senorge_time)
        rootgrp.createDimension('x', size=self.default_senorge_width)
        rootgrp.createDimension('y', size=self.default_senorge_height)

        # add root attributes
        rootgrp.Conventions = "CF-1.4"
        rootgrp.institution = "Norwegian Water Resources and Energy Directorate (NVE)"
        rootgrp.source = ""
        rootgrp.history = ""
        rootgrp.references = ""
        rootgrp.comment = "Data distributed via www.senorge.no"

        self.rootgrp = rootgrp

        # add coordinates
        time = self.rootgrp.createVariable('time', 'f8', ('time', ))
        time.units = 'seconds since 1970-01-01 00:00:00 +00:00'
        time.long_name = 'time'
        time.standard_name = 'time'
        time[:] = secs

        self._set_utm()
        self._set_latlon()
Пример #5
0
 def interpolate_to_netcdf(self,
                           in_lon,
                           in_lat,
                           out_path,
                           date_unit="seconds since 1970-01-01T00:00",
                           interp_type="spline"):
     """
     Calls the interpolation function and then saves the MRMS data to a netCDF file. It will also create 
     separate directories for each variable if they are not already available.
     """
     if interp_type == "spline":
         out_data = self.interpolate_grid(in_lon, in_lat)
     else:
         out_data = self.max_neighbor(in_lon, in_lat)
     if not os.access(out_path + self.variable, os.R_OK):
         try:
             os.mkdir(out_path + self.variable)
         except OSError:
             print(out_path + self.variable + " already created")
     out_file = out_path + self.variable + "/" + "{0}_{1}_{2}.nc".format(
         self.variable, self.start_date.strftime("%Y%m%d-%H:%M"),
         self.end_date.strftime("%Y%m%d-%H:%M"))
     out_obj = Dataset(out_file, "w")
     out_obj.createDimension("time", out_data.shape[0])
     out_obj.createDimension("y", out_data.shape[1])
     out_obj.createDimension("x", out_data.shape[2])
     data_var = out_obj.createVariable(self.variable,
                                       "f4", ("time", "y", "x"),
                                       zlib=True,
                                       fill_value=-9999.0,
                                       least_significant_digit=3)
     data_var[:] = out_data
     data_var.long_name = self.variable
     data_var.coordinates = "latitude longitude"
     if "MESH" in self.variable or "QPE" in self.variable:
         data_var.units = "mm"
     elif "Reflectivity" in self.variable:
         data_var.units = "dBZ"
     elif "Rotation" in self.variable:
         data_var.units = "s-1"
     else:
         data_var.units = ""
     out_lon = out_obj.createVariable("longitude",
                                      "f4", ("y", "x"),
                                      zlib=True)
     out_lon[:] = in_lon
     out_lon.units = "degrees_east"
     out_lat = out_obj.createVariable("latitude",
                                      "f4", ("y", "x"),
                                      zlib=True)
     out_lat[:] = in_lat
     out_lat.units = "degrees_north"
     dates = out_obj.createVariable("time", "i8", ("time", ), zlib=True)
     dates[:] = np.round(date2num(self.all_dates.to_pydatetime(),
                                  date_unit)).astype(np.int64)
     dates.long_name = "Valid date"
     dates.units = date_unit
     out_obj.Conventions = "CF-1.6"
     out_obj.close()
     return
Пример #6
0
    def new(self, secs):
        """
        Creates a new seNorge netCDF file.
        Convention: Climate and Forecast (CF) version 1.4
        
        @param secs: in seconds since 1970-01-01 00:00:00
        """
        # create new file
        rootgrp = Dataset(self.filename, 'w') # create new file using netcdf4
#        rootgrp = netcdf_file(self.filename, 'w') # create new file using scipy.IO
        
        # add root dimensions
        rootgrp.createDimension('time', size=self.default_senorge_time)
        rootgrp.createDimension('x', size=self.default_senorge_width)
        rootgrp.createDimension('y', size=self.default_senorge_height)
        
        # add root attributes
        rootgrp.Conventions = "CF-1.4"
        rootgrp.institution = "Norwegian Water Resources and Energy Directorate (NVE)"
        rootgrp.source = ""
        rootgrp.history = ""
        rootgrp.references = ""
        rootgrp.comment = "Data distributed via www.senorge.no"
        
        self.rootgrp = rootgrp
        
        # add coordinates
        time = self.rootgrp.createVariable('time', 'f8', ('time',))
        time.units = 'seconds since 1970-01-01 00:00:00 +00:00'
        time.long_name = 'time'
        time.standard_name = 'time'
        time[:] = secs
        
        self._set_utm()
        self._set_latlon()
Пример #7
0
def outputNC(output_file, nc4_file, total, interest_lon, interest_lat, time_steps, var_list, avg_dict):
    print('Writing new nc4 file')
    nc4_out = Dataset(output_file, 'w', format='NETCDF4')

    #copying dimentions
    for (name, dim) in nc4_file.dimensions.items():
        nc4_out.createDimension(name, len(dim) if not dim.isunlimited() else None)

    #copying variables
    for (name, value) in nc4_file.variables.items():
        nc4_vars = nc4_out.createVariable(name, value.datatype, value.dimensions)
        nc4_vars.setncatts(nc4_file[name].__dict__)
        if name in {"lat", "lon", "time"}:
            nc4_out[name][:] = nc4_file[name][:]

    dt = datetime.datetime.utcnow()
    dt = dt.replace(microsecond=0)

    nc4_out.Conventions='CF-1.6'
    nc4_out.title=''
    nc4_out.institution=''
    nc4_out.history='date created: '+ dt.isoformat() +'+00:00'
    nc4_out.references='https://github.com/c-h-david/shbaam/'
    nc4_out.comment=''
    nc4_out.featureType='timeSeries'

    for var in var_list:
        for i in range(total):
            lon_index, lat_index = interest_lon[i][0],interest_lat[i][0]
            long_term_mean = avg_dict[var][i]
            for time in range(time_steps):
                nc4_out[var][time,lat_index,lon_index] = nc4_file.variables[var][time,lat_index,lon_index] - long_term_mean
    nc4_out.close()
    print("Success -- creating nc4 file")
def CreateOutputFile(FileName,data):
    # Create file
    File = NetCDFFile(FileName,'w')
    # Define some global attribs
    File.Conventions='COARDS'
    # Time is record dimension
    File.createDimension('time',None)
    var = File.createVariable('time','d',('time',))
    var.long_name = 'time'
    var.units = 'year'
    # axes
    try:
        File.createDimension('level',data.File.dimensions['level'])
        var = File.createVariable('level','f',('level',))
        var.long_name = 'pressure level'
        var.units = 'mb'
        var[:] = data.File.variables['level'][:].astype('f')
    except: pass
    File.createDimension('lat',data.File.dimensions['lat'])
    var = File.createVariable('lat','f',('lat',))
    var.long_name = 'latitude'
    var.units = 'degrees_north'
    var[:] = data.File.variables['lat'][:]
    File.createDimension('lon',data.File.dimensions['lon'])
    var = File.createVariable('lon','f',('lon',))
    var.long_name = 'longitude'
    var.units = 'degrees_east'
    var[:] = data.File.variables['lon'][:]
    # create variables
    var = File.createVariable(Field,'f',\
                                  data.Field.dimensions)
    var.long_name = data.Field.long_name
    var.units = data.Field.units
    return File
Пример #9
0
    def writeNC(self):
        """
        Save the data to the file that GNOME can read
        """
        def create_nc_var(outfile,
                          name,
                          dimensions,
                          attdict,
                          dtype='f8',
                          zlib=False,
                          complevel=0):

            nc = Dataset(outfile, 'a')
            tmp = nc.createVariable(name,
                                    dtype,
                                    dimensions,
                                    zlib=zlib,
                                    complevel=complevel)
            for aa in attdict.keys():
                tmp.setncattr(aa, attdict[aa])
            #nc.variables[name][:] = var
            nc.close()

        #### Write netcdf file ####
        ####create netcdf File####
        nc = Dataset(self.outfile, 'w', format='NETCDF3_CLASSIC')
        nc.file_type = 'Full_Grid'
        nc.Conventions = 'COARDS'
        nc.grid_type = 'curvilinear'
        nc.set_fill_off()
        #nc.Created = datetime.now().isoformat()
        ####Create dimensions####
        nc.createDimension('x', self.x)
        nc.createDimension('y', self.y)
        nc.createDimension('time', None)  ##unlimited dimension
        nc.close()

        ####adding variables####
        create_nc_var(self.outfile, 'time', ('time'),
                      {'units': 'seconds since 1970-01-01 00:00:00'})
        create_nc_var(self.outfile,'lon',('y','x'),{'long_name':'Longitude',\
            'units':'degrees_east','standard_name':'longitude'})
        create_nc_var(self.outfile,'lat',('y','x'),{'long_name':'Latitude',\
            'units':'degrees_north','standard_name':'latitude'})
        create_nc_var(self.outfile,'air_u',('time','y','x'),{'long_name':'Eastward Air Velocity',\
            'units':'m/s','missing_value':'-99999.0','standard_name':'eastward_wind'})
        create_nc_var(self.outfile,'air_v',('time','y','x'),{'long_name':'Northward Air Velocity',\
            'units':'m/s','missing_value':'-99999.0','standard_name':'northward_wind'})

        time_new = SecondsSince(self.t, basetime=datetime(1970, 1, 1))
        ######Now writting the variables######
        nc = Dataset(self.outfile, 'a')
        nc.variables['time'][:] = time_new
        nc.variables['lon'][:] = self.lon
        nc.variables['lat'][:] = self.lat
        nc.variables['air_u'][:] = self.air_u
        nc.variables['air_v'][:] = self.air_v
        print "Generating NCEP wind file %s for GNOME!!!\n" % self.outfile
        nc.close()
Пример #10
0
 def _set_global_attributes(ncfile: nc.Dataset,
                            path: Path) -> None:  # type: ignore[import]
     ncfile.Conventions = "CF-1.8 UGRID-1.0"
     ncfile.title = "Delft3D-FM 1D2D network for model " + path.name.rstrip(
         "_net.nc")
     ncfile.source = f"HYDROLIB-core v.{__version__}, D-HyDAMO, model {path.name.rstrip('_net.nc')}"
     ncfile.history = f"Created on {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} by {Path(__file__).name}."
     ncfile.institution = "Deltares/HKV"
     ncfile.references = "https://github.com/openearth/delft3dfmpy/; https://www.deltares.nl; https://www.hkv.nl"
Пример #11
0
def writeCMIP5File(modelName, scenario, myvarname, lon, lat, time, mydata,
                   mydataanomaly, outfilename):

    myformat = 'NETCDF3_CLASSIC'

    if os.path.exists(outfilename):
        os.remove(outfilename)
    print("Results written to netcdf file: %s" % (outfilename))
    if myvarname == "sic": myvar = "SIC"

    f1 = Dataset(outfilename, mode='w', format=myformat)
    f1.title = "IPCC AR5 %s" % (myvar)
    f1.description = "IPCC AR5 running averages of %s for model %s for scenario %s" % (
        myvar, modelName, scenario)
    f1.history = "Created " + str(datetime.now())
    f1.source = "Trond Kristiansen ([email protected])"
    f1.type = "File in NetCDF3 format created using iceExtract.py"
    f1.Conventions = "CF-1.0"
    """Define dimensions"""
    f1.createDimension('x', len(lon))
    f1.createDimension('y', len(lat))
    f1.createDimension('time', None)

    vnc = f1.createVariable('longitude', 'd', ('x', ), zlib=False)
    vnc.long_name = 'Longitude'
    vnc.units = 'degree_east'
    vnc.standard_name = 'longitude'
    vnc[:] = lon

    vnc = f1.createVariable('latitude', 'd', ('y', ), zlib=False)
    vnc.long_name = 'Latitude'
    vnc.units = 'degree_north'
    vnc.standard_name = 'latitude'
    vnc[:] = lat

    v_time = f1.createVariable('time', 'd', ('time', ), zlib=False)
    v_time.long_name = 'Years'
    v_time.units = 'Years'
    v_time.field = 'time, scalar, series'
    v_time[:] = time

    v_temp = f1.createVariable('SIC', 'd', (
        'time',
        'y',
        'x',
    ), zlib=False)
    v_temp.long_name = "Sea-ice area fraction (%)"
    v_temp.units = "%"
    v_temp.time = "time"
    v_temp.field = "SIC, scalar, series"
    v_temp.missing_value = 1e20

    if myvarname == 'sic':
        f1.variables['SIC'][:, :, :] = mydata

    f1.close()
Пример #12
0
def _create_global_attributes(f: netCDF4.Dataset, global_attr: dict,
                              level: int):
    f.Conventions = 'CF-1.7'
    f.year, f.month, f.day = _get_measurement_date(f)
    f.uuid = uuid.uuid4().hex
    f.history = f"Radar file created: {utils.get_current_time()}"
    f.level = level
    if global_attr and isinstance(global_attr, dict):
        for key, value in global_attr.items():
            setattr(f, key, value)
Пример #13
0
def writeCMIP5File(modelName,scenario,myvarname,lon,lat,time,mydata,mydataanomaly,outfilename):
    
     myformat='NETCDF3_CLASSIC'
     
     if os.path.exists(outfilename):
          os.remove(outfilename)
     print "Results written to netcdf file: %s"%(outfilename)
     if myvarname=="sic": myvar="SIC"
     
     f1 = Dataset(outfilename, mode='w', format=myformat)
     f1.title       = "IPCC AR5 %s"%(myvar)
     f1.description = "IPCC AR5 running averages of %s for model %s for scenario %s"%(myvar,modelName,scenario)
     f1.history     = "Created " + str(datetime.now())
     f1.source      = "Trond Kristiansen ([email protected])"
     f1.type        = "File in NetCDF3 format created using iceExtract.py"
     f1.Conventions = "CF-1.0"

     """Define dimensions"""
     f1.createDimension('x',  len(lon))
     f1.createDimension('y', len(lat))
     f1.createDimension('time', None)
        
     vnc = f1.createVariable('longitude', 'd', ('x',),zlib=False)
     vnc.long_name = 'Longitude'
     vnc.units = 'degree_east'
     vnc.standard_name = 'longitude'
     vnc[:] = lon

     vnc = f1.createVariable('latitude', 'd', ('y',),zlib=False)
     vnc.long_name = 'Latitude'
     vnc.units = 'degree_north'
     vnc.standard_name = 'latitude'
     vnc[:] = lat

     v_time = f1.createVariable('time', 'd', ('time',),zlib=False)
     v_time.long_name = 'Years'
     v_time.units = 'Years'
     v_time.field = 'time, scalar, series'
     v_time[:]=time     
     
     v_temp=f1.createVariable('SIC', 'd', ('time', 'y', 'x',),zlib=False)
     v_temp.long_name = "Sea-ice area fraction (%)"
     v_temp.units = "%"
     v_temp.time = "time"
     v_temp.field="SIC, scalar, series"
     v_temp.missing_value = 1e20
     
    
     if myvarname=='sic':
          f1.variables['SIC'][:,:,:]  = mydata
          
     f1.close()
Пример #14
0
def PutNC_Map(Var,
              lat,
              lon,
              description='Variable',
              symbol='Var',
              unit='--',
              fill=9.96921e+36,
              filename='result.nc'):
    """
概要:
    2次元(空間分布)の気象変量をnetCDF形式のファイルで出力する関数。
書式:
     PutNC_Map( Var, lat, lon, description='Variable', symbol='Var', unit='--', fill=9.96921e+36, filename='result.nc')
引数(必須):
    Var:内容を書き出す配列変数。
    lat:配列Varの各行が位置する緯度値が格納されている配列。Varの第1次元の要素数と一致していなくてはならない。
    lon:配列Varの各列が位置する経度値が格納されている配列。Varの第2次元の要素数と一致していなくてはならない。
引数(必要に応じ指定):
    description:データの正式名称などデータを説明する文。
    symbol:データに対して用いる記号
    unit:データの数値が従う単位
    fill:無効値として取り扱う数値。デフォルト値は、9.96921e+36
    filename:出力されるファイルの名前。デフォルト値は'result.nc'。
 戻り値:なし。
    """
    #----------------------------------------------------------------------------------
    fh = Dataset(filename, "w")
    fh.title = 'Map data crated by PutNC_Map function.'
    fh.source = "Agro-Meteorological Grid Square Data System NIAES, NARO"
    fh.Conventions = "None"
    fh.creation_date = "Created " + dt.now().strftime("%Y/%m/%d %H:%M:%S JST")
    fh.createDimension("lat", len(lat))
    fh.createDimension("lon", len(lon))
    nc_data = fh.createVariable(symbol,
                                "f4", (
                                    "lat",
                                    "lon",
                                ),
                                fill_value=fill)
    nc_lat = fh.createVariable("lat", "f4", ("lat", ))
    nc_lon = fh.createVariable("lon", "f4", ("lon", ))
    nc_lat.long_name = "latitude"
    nc_lat.units = "degrees_north"
    nc_lon.long_name = "longitude"
    nc_lon.units = "degrees_east"
    nc_data.long_name = description + '(' + symbol + ')'
    nc_data.units = unit
    nc_data[:, :] = Var
    nc_lat[:] = lat
    nc_lon[:] = lon
    fh.close()
Пример #15
0
def tamoc_nc_file(fname, title, summary, source):
    """
    Write the header meta data to an netCDF file for a TAMOC output
    
    The TAMOC suite stores its output by detaul in a netCDF dataset file.  
    This function writes the standard TAMOC metadata to the header of the 
    netCDF file.  
    
    Parameters
    ----------
    fname : str
        File name of the file to write
    title:  str
        String stating the TAMOC module where the data originated and the 
        type of data contained.  
    summary : str
        String summarizing what is contained in the dataset or information
        needed to interpret the dataset
    source : str
        String describing the source of the data in the dataset or of related
        datasets
    
    Returns
    -------
    nc : `netCDF4.Dataset` object
        The `netCDF4.Dataset` object containing the open netCDF4 file where
        the data should be stored.
    
    """
    
    # Create the netCDF dataset object
    nc = Dataset(fname, 'w', format='NETCDF4_CLASSIC')
    
    # Write the netCDF header data for a TAMOC suite output
    nc.Conventions = 'TAMOC Modeling Suite Output File'
    nc.Metadata_Conventions = 'TAMOC Python Model'
    nc.featureType = 'profile'
    nc.cdm_data_type = 'Profile'
    nc.nodc_template_version = \
        'NODC_NetCDF_Profile_Orthogonal_Template_v1.0'
    nc.title = title
    nc.summary = summary
    nc.source = source
    nc.creator_url = 'http://github.com/socolofs/tamoc'
    nc.date_created = datetime.today().isoformat(' ')
    nc.date_modified = datetime.today().isoformat(' ')
    nc.history = 'Creation'
    
    # Return the netCDF dataset
    return nc
Пример #16
0
def tamoc_nc_file(fname, title, summary, source):
    """
    Write the header meta data to an netCDF file for a TAMOC output
    
    The TAMOC suite stores its output by detaul in a netCDF dataset file.  
    This function writes the standard TAMOC metadata to the header of the 
    netCDF file.  
    
    Parameters
    ----------
    fname : str
        File name of the file to write
    title:  str
        String stating the TAMOC module where the data originated and the 
        type of data contained.  
    summary : str
        String summarizing what is contained in the dataset or information
        needed to interpret the dataset
    source : str
        String describing the source of the data in the dataset or of related
        datasets
    
    Returns
    -------
    nc : `netCDF4.Dataset` object
        The `netCDF4.Dataset` object containing the open netCDF4 file where
        the data should be stored.
    
    """

    # Create the netCDF dataset object
    nc = Dataset(fname, 'w', format='NETCDF4_CLASSIC')

    # Write the netCDF header data for a TAMOC suite output
    nc.Conventions = 'TAMOC Modeling Suite Output File'
    nc.Metadata_Conventions = 'TAMOC Python Model'
    nc.featureType = 'profile'
    nc.cdm_data_type = 'Profile'
    nc.nodc_template_version = \
        'NODC_NetCDF_Profile_Orthogonal_Template_v1.0'
    nc.title = title
    nc.summary = summary
    nc.source = source
    nc.creator_url = 'http://github.com/socolofs/tamoc'
    nc.date_created = datetime.today().isoformat(' ')
    nc.date_modified = datetime.today().isoformat(' ')
    nc.history = 'Creation'

    # Return the netCDF dataset
    return nc
Пример #17
0
 def interpolate_to_netcdf(self, in_lon, in_lat, out_path, date_unit="seconds since 1970-01-01T00:00",
                           interp_type="spline"):
     """
     Calls the interpolation function and then saves the MRMS data to a netCDF file. It will also create 
     separate directories for each variable if they are not already available.
     """
     if interp_type == "spline":
         out_data = self.interpolate_grid(in_lon, in_lat)
     else:
         out_data = self.max_neighbor(in_lon, in_lat)
     if not os.access(out_path + self.variable, os.R_OK):
         try:
             os.mkdir(out_path + self.variable)
         except OSError:
             print(out_path + self.variable + " already created")
     out_file = out_path + self.variable + "/" + "{0}_{1}_{2}.nc".format(self.variable,
                                                                         self.start_date.strftime("%Y%m%d-%H:%M"),
                                                                         self.end_date.strftime("%Y%m%d-%H:%M"))
     out_obj = Dataset(out_file, "w")
     out_obj.createDimension("time", out_data.shape[0])
     out_obj.createDimension("y", out_data.shape[1])
     out_obj.createDimension("x", out_data.shape[2])
     data_var = out_obj.createVariable(self.variable, "f4", ("time", "y", "x"), zlib=True, 
                                       fill_value=-9999.0,
                                       least_significant_digit=3)
     data_var[:] = out_data
     data_var.long_name = self.variable
     data_var.coordinates = "latitude longitude"
     if "MESH" in self.variable or "QPE" in self.variable:
         data_var.units = "mm"
     elif "Reflectivity" in self.variable:
         data_var.units = "dBZ"
     elif "Rotation" in self.variable:
         data_var.units = "s-1"
     else:
         data_var.units = ""
     out_lon = out_obj.createVariable("longitude", "f4", ("y", "x"), zlib=True)
     out_lon[:] = in_lon
     out_lon.units = "degrees_east"
     out_lat = out_obj.createVariable("latitude", "f4", ("y", "x"), zlib=True)
     out_lat[:] = in_lat
     out_lat.units = "degrees_north"
     dates = out_obj.createVariable("time", "i8", ("time",), zlib=True)
     dates[:] = np.round(date2num(self.all_dates.to_pydatetime(), date_unit)).astype(np.int64)
     dates.long_name = "Valid date"
     dates.units = date_unit
     out_obj.Conventions="CF-1.6"
     out_obj.close()
     return
Пример #18
0
    def init(cls, ds: Dataset) -> bool:

        # CF convention
        try:
            _ = ds.Conventions
        except AttributeError:
            cf = 'CF-1.6'
            ds.Conventions = cf

        # time coordinate
        try:
            _ = ds.variables["time"]
        except KeyError:
            tdim = ds.createDimension('time', None)
            time = ds.createVariable('time', np.float64, (tdim.name, ))
            time.units = 'milliseconds since 1970-01-01T00:00:00'
            time.calendar = 'gregorian'

        # version
        try:
            version = ds.version
            if version > lib_info.lib_version:
                raise RuntimeError("Project has a future version: %s" %
                                   version)
            if version < lib_info.lib_version:
                raise RuntimeError("Project has a path version: %s" % version)
        except AttributeError:
            ds.version = lib_info.lib_version

        # created
        try:
            _ = ds.created
        except AttributeError:
            ds.created = date2num(datetime.utcnow(),
                                  ds.variables["time"].units,
                                  ds.variables["time"].calendar)

        # modified
        try:
            _ = ds.modified
        except AttributeError:
            ds.modified = date2num(datetime.utcnow(),
                                   ds.variables["time"].units,
                                   ds.variables["time"].calendar)

        ds.sync()

        return True
Пример #19
0
    def create_netcdf(self, path):

        # File format:
        outformat = "NETCDF3_CLASSIC"  #"NETCDF4"
        # File where we going to write
        ncfile = Dataset(path, 'w', format=outformat)

        # global attributes
        ncfile.Conventions = "CF-1.8 UGRID-1.0"
        ncfile.history = "Created on {} D-Flow 1D, D-Flow FM".format(
            datetime.now())
        ncfile.institution = "Deltares"
        ncfile.reference = "http://www.deltares.nl"
        ncfile.source = "Python script to prepare HyDAMO import"

        return ncfile
Пример #20
0
def setup_netcdf_dataset(config, grid, crs):
    """Create NetCDF file, add required dimensions and coordinate variables"""
    nc = Dataset(config['output_file'], 'w', format='NETCDF4')
    nc.title = "Input data for NanoFASE model"
    nc.Conventions = 'CF-1.6'
    crs_var = nc.createVariable('crs', 'i4')
    crs_var.spatial_ref = crs.to_wkt(
    )  # QGIS/ArcGIS recognises spatial_ref to define CRS
    crs_var.crs_wkt = crs.to_wkt(
    )  # Latest CF conventions say crs_wkt can be used
    # Time dimensions and coordinate variable
    t_dim = nc.createDimension('t', None)
    t = nc.createVariable('t', 'i4', ('t', ))
    t.units = "seconds since {0} 00:00:00".format(config['time']['start_date'])
    t.standard_name = 'time'
    t.calendar = 'gregorian'
    t[:] = [
        i * int(config['time']['dt']) for i in range(int(config['time']['n']))
    ]
    # x dimension and coordinate variable
    x_dim = nc.createDimension('x', grid.width)
    x = nc.createVariable('x', 'f4', ('x', ))
    x.units = 'm'
    x.standard_name = 'projection_x_coordinate'
    x.axis = 'X'
    x[:] = [grid.bounds.left + i * grid.res[0] for i in range(grid.width)]
    # y dimension and coordinate variable
    y_dim = nc.createDimension('y', grid.height)
    y = nc.createVariable('y', 'f4', ('y', ))
    y.units = 'm'
    y.standard_name = 'projection_y_coordinate'
    y.axis = 'Y'
    y[:] = [grid.bounds.top - i * grid.res[1] for i in range(grid.height)]
    # Add the flow direction
    flow_dir = grid.read(
        1, masked=True)  # Get the flow direction array from the raster
    grid_mask = np.ma.getmask(
        flow_dir
    )  # Use the extent of the flow direction array to create a mask for all other data
    nc_var = nc.createVariable('flow_dir', 'i4', ('y', 'x'))
    nc_var.long_name = 'flow direction of water in grid cell'
    nc_var[:] = flow_dir
    # Route the reaches using the flow direction
    routed_reaches = routing(flow_dir)
    # Return the NetCDF file
    return nc, grid_mask
Пример #21
0
 def new(self, secs):
     """
     Creates a new seNorge netCDF file.
     Convention: Climate and Forecast (CF) version 1.4
     
     :Parameters:
         - secs: in seconds since 1970-01-01 00:00:00
     """
     # create new file
     try:
         rootgrp = Dataset(self.filename, 'w', format='NETCDF3_CLASSIC')
         # add root dimensions
         rootgrp.createDimension('time', size=self.default_senorge_time)
         rootgrp.createDimension('x', size=default_senorge_width)
         rootgrp.createDimension('y', size=default_senorge_height)
     except TypeError:
         rootgrp = Dataset(self.filename, 'w')
         # add root dimensions
         rootgrp.createDimension('time', self.default_senorge_time)
         rootgrp.createDimension('x', default_senorge_width)
         rootgrp.createDimension('y', default_senorge_height)
     
     # add root attributes
     rootgrp.Conventions = "CF-1.4"
     rootgrp.institution = "Norwegian Water Resources and Energy Directorate (NVE)"
     rootgrp.source = ""
     rootgrp.history = "%s created" % time.ctime(time.time())
     rootgrp.references = ""
     rootgrp.comment = "Data distributed via www.senorge.no"
     
     self.rootgrp = rootgrp
     
     # add coordinates
     try:
         times = self.rootgrp.createVariable('time', 'f8', ('time',))
     except TypeError:
         times = self.rootgrp.createVariable('time', 'f', ('time',))
     times.units = 'seconds since 1970-01-01 00:00:00 +00:00'
     times.long_name = 'time'
     times.standard_name = 'time'
     times.axis = 'T'
     times.calendar = 'standard'
     times[:] = secs
     
     self._set_utm()
     self._set_latlon()
Пример #22
0
def write_depth_meridional(ofile, data, data_name, lat, depth):
    f1 = Dataset(ofile, 'w', clobber=True,
                 format='NETCDF4')  #'w' stands for write
    ys = f1.createDimension('y', data.shape[1])
    zs = f1.createDimension('z', data.shape[0])
    meris = f1.createVariable('lat', np.float64, ('z', 'y'))
    depths = f1.createVariable('depth', np.float64, ('z', 'y'))
    data1 = f1.createVariable(data_name, np.float64, ('z', 'y'))

    meris[:, :] = lat.copy()
    depths[:, ] = depth.copy()
    data1[:, :] = data.copy()
    #lons[:] = np.arange(48, 51.1, 0.1)

    f1.Conventions = 'CF-1.0'

    f1.close()
Пример #23
0
def write_nc_file(daily_results, filename, nc, anom_mode=False):
    #Grab every 4th time value to represent daily
    daily_time_var = nc.variables['time'][::4]

    nc_out = Dataset(filename, mode='w', format='NETCDF4')
    nc_out.createDimension('lon', LONS)
    nc_out.createDimension('lat', LATS)
    nc_out.createDimension('time', None)  #UNLIMITED
    nc_out.createDimension('month', MONTHS_YEAR)
    nc_out.title = ''
    nc_out.institution = ''
    nc_out.project = ''
    nc_out.contact = '*****@*****.**'
    nc_out.Conventions = "CF-1.6"

    longitude = nc_out.createVariable('lon', 'f8', ('lon', ))
    longitude.standard_name = 'longitude'
    longitude.long_name = 'longitude'
    longitude.units = 'degrees_east'
    longitude.modulo = 360.0
    longitude.axis = 'X'
    longitude[:] = np.arange(0, 360.0, 2.0)

    latitude = nc_out.createVariable('lat', 'f8', ('lat', ))
    latitude.standard_name = 'latitude'
    latitude.long_name = 'latitude'
    latitude.units = 'degrees_north'
    latitude.axis = 'Y'
    latitude[:] = np.arange(-90.0, 92.0, 2.0)

    time = nc_out.createVariable('time', 'f8', ('time', ))
    time.units = 'hours since 1-1-1 0:0:0'
    time.calendar = 'standard'  #Gregorian
    time[:] = daily_time_var

    if anom_mode:
        daily_mean = nc_out.createVariable('daily_anom', 'f8',
                                           ('time', 'lat', 'lon'))
        daily_mean.long_name = 'z500 daily anomaly vs 1981-2010'
    else:
        daily_mean = nc_out.createVariable('daily_mean', 'f8',
                                           ('time', 'lat', 'lon'))
        daily_mean.long_name = 'z500 daily mean'

    daily_mean[:] = daily_results
    nc_out.close()
Пример #24
0
def generate_nc(parser_context):
    parser = XLSParser()
    with open(parser_context.filepath, 'r') as f:
        doc = f.read()
    info = parser.extract_worksheets(doc)
    nccl = info[parser_context.worksheet]
    #header_line = 3
    #columns = nccl[header_line]
    #data_range = (4, 66)
    data_rows = nccl[parser_context.data_range[0]:parser_context.data_range[1]]
    print 'Generating',parser_context.output_file
    nc = Dataset(parser_context.output_file, 'w')
    nc.createDimension('time', len(data_rows)*12)
    nc.GDAL = "GDAL 1.9.2, released 2012/10/08"
    nc.history = "Created dynamically in IPython Notebook 2013-11-14"
    nc.title = nccl[0][0]
    nc.summary = nccl[1][0]
    nc.naming_authority = 'GLOS'
    nc.source = 'GLERL'
    nc.standard_name_vocabulary = "http://www.cgd.ucar.edu/cms/eaton/cf-metadata/standard_name.html"
    nc.project = 'GLOS'
    nc.Conventions = "CF-1.6"
    time = nc.createVariable('time', 'f8', ('time',))
    time.standard_name = 'time'
    time.units = 'seconds since 1970-01-01'
    time.long_name = 'Time'
    time.axis = 'T'
    precip = nc.createVariable(parser_context.variable, 'f8', ('time',), fill_value=parser_context.fill_value)
    #precip.standard_name = 'precipitation_amount'
    precip.standard_name = parser_context.standard_name

    precip.units = parser_context.units
    for i,row in enumerate(data_rows):
        for j in xrange(12):
            the_date = datetime(row[0], j+1, 1)
            timestamp = calendar.timegm(the_date.utctimetuple())
            time[i*12 + j] = timestamp
            try:
                value = float(row[j+1])
            except ValueError:
                continue
            except TypeError:
                continue

            precip[i*12 + j] = value
    nc.close() 
Пример #25
0
    def create_netcdf(self, path, version):

        # File format:
        outformat = "NETCDF3_CLASSIC"  #"NETCDF4"
        # File where we going to write
        ncfile = Dataset(path, 'w', format=outformat)

        # global attributes
        ncfile.Conventions = "CF-1.8 UGRID-1.0"
        ncfile.title = 'Delft3D-FM 1D2D network for model ' + os.path.split(
            path)[-1].rstrip('_net.nc')
        ncfile.source = f"delft3dfmpy v.{version['number']}, D-HyDAMO, model {os.path.split(path)[-1].rstrip('_net.nc')}"
        ncfile.history = f"Created on {version['date']} by {os.path.split(__file__)[-1]}."
        ncfile.institution = "Deltares/HKV"
        ncfile.references = "https://github.com/openearth/delft3dfmpy/; https://www.deltares.nl; https://www.hkv.nl"
        ncfile.comment = f"Tested and compatible with D-Flow FM {version['dfm_version']}, DIMRset {version['dimr_version']} and D-HYDRO suite 1D2D {version['suite_version']}"

        return ncfile
Пример #26
0
def write_nc_file(daily_results, filename, nc, anom_mode=False):
    #Grab every 4th time value to represent daily
    daily_time_var = nc.variables['time'][::4]

    nc_out = Dataset(filename, mode='w', format='NETCDF4') 
    nc_out.createDimension('lon', LONS)
    nc_out.createDimension('lat', LATS)
    nc_out.createDimension('time', None) #UNLIMITED
    nc_out.createDimension('month', MONTHS_YEAR)
    nc_out.title = ''
    nc_out.institution = ''
    nc_out.project = ''
    nc_out.contact = '*****@*****.**'
    nc_out.Conventions = "CF-1.6"
    
    longitude = nc_out.createVariable('lon', 'f8', ('lon',))
    longitude.standard_name = 'longitude'
    longitude.long_name = 'longitude'
    longitude.units = 'degrees_east'
    longitude.modulo = 360.0
    longitude.axis = 'X'
    longitude[:] = np.arange(0, 360.0, 2.0)
    
    latitude = nc_out.createVariable('lat', 'f8', ('lat',))
    latitude.standard_name = 'latitude'
    latitude.long_name = 'latitude'
    latitude.units = 'degrees_north'
    latitude.axis = 'Y'
    latitude[:] = np.arange(-90.0, 92.0, 2.0)
    
    time = nc_out.createVariable('time', 'f8', ('time',))
    time.units = 'hours since 1-1-1 0:0:0' 
    time.calendar = 'standard' #Gregorian
    time[:] = daily_time_var 
    
    if anom_mode:
        daily_mean = nc_out.createVariable('daily_anom', 'f8', ('time', 'lat', 'lon'))
        daily_mean.long_name = 'z500 daily anomaly vs 1981-2010'
    else:
        daily_mean = nc_out.createVariable('daily_mean', 'f8', ('time', 'lat', 'lon'))
        daily_mean.long_name = 'z500 daily mean'

    daily_mean[:] = daily_results
    nc_out.close()
Пример #27
0
def prepare_file(fname, x, y):
    print "  preparing file '%s'..." % fname
    nc = NC(fname, "w", format="NETCDF3_CLASSIC")
    nc.set_fill_off()
    nc.createDimension("time", None)
    nc.createDimension("x", size=x.size)
    nc.createDimension("y", size=y.size)

    t_var = nc.createVariable("time", 'f', dimensions=("time", ))

    x_var = nc.createVariable("x", 'f', dimensions=("x", ))
    x_var[:] = x

    y_var = nc.createVariable("y", 'f', dimensions=("y", ))
    y_var[:] = y

    # put dimensions metadata in a dictionary:
    #   name : (unit, long_name, standard_name)
    attributes = {
        "x":
        ("m", "X-coordinate in Cartesian system", "projection_x_coordinate"),
        "y":
        ("m", "Y-coordinate in Cartesian system", "projection_y_coordinate"),
        "time": ("years since 2004-1-1", "time", "time")
    }

    for each in list(attributes.keys()):
        var = nc.variables[each]
        var.units = attributes[each][0]
        var.long_name = attributes[each][1]
        var.standard_name = attributes[each][2]

    ps = nc.createVariable("mapping", 'b')
    ps.grid_mapping_name = "polar_stereographic"
    ps.straight_vertical_longitude_from_pole = -39.0
    ps.latitude_of_projection_origin = 90.0
    ps.standard_parallel = 71.0
    nc.Conventions = "CF-1.3"

    nc.createDimension("nv", size=2)
    t_bounds = nc.createVariable('time_bounds', 'f4', ('time', 'nv'))
    nc.variables['time'].bounds = 'time_bounds'

    return (nc, t_var, t_bounds)
Пример #28
0
def write_etopo_cache(arcmins, version, lons, lats, topo):
    log.debug('writing etopo cache %d %s %s %s' % (arcmins, lons, lats, topo))

    etopo_path = os.path.join(etopo_dir, etopo_filename(arcmins, version))
    toponc = Dataset(etopo_path, 'w')

    dim_x = toponc.createDimension('x', lons.size)
    dim_y = toponc.createDimension('y', lats.size)

    var_lons = toponc.createVariable('x', 'f8', ('x', ))
    var_lons.long_name = 'Longitude'
    var_lons.actual_range = [-180., 180.]
    var_lons.units = 'degrees'
    var_lats = toponc.createVariable('y', 'f8', ('y', ))
    var_lats.long_name = 'Latitude'
    var_lats.actual_range = [-90., 90.]
    var_lats.units = 'degrees'
    var_topo = toponc.createVariable('z',
                                     'i4', (
                                         'y',
                                         'x',
                                     ),
                                     fill_value=-2**31)
    var_topo.long_name = 'z'
    var_topo.actual_range = [topo.min(), topo.max()]

    toponc.Conventions = 'COARDS/CF-1.0'
    toponc.title = etopo_path
    toponc.history = 'downsampled from ETOPO1 by libcchdo'
    toponc.GMT_version = '4.4.0'
    toponc.node_offset = 0

    try:
        log.info('Writing %s' % etopo_path)
        var_lons[:] = lons
        var_lats[:] = lats
        var_topo[:] = topo
    finally:
        toponc.close()
Пример #29
0
def write_3D(ofile, data, data_name, lat, lon, depth):
    f1 = Dataset(ofile, 'w', clobber=True,
                 format='NETCDF4')  #'w' stands for write
    f1.createDimension('x', data.shape[2])
    f1.createDimension('y', data.shape[1])
    f1.createDimension('depth', data.shape[0])
    lato = f1.createVariable('lat', np.float64, ('y', 'x'))
    lono = f1.createVariable('lon', np.float64, ('y', 'x'))
    deptho = f1.createVariable('depth', np.float64, ('depth', ))
    data1 = f1.createVariable(data_name,
                              np.float64, ('depth', 'y', 'x'),
                              fill_value=9e33)
    data1.coordinates = "lat lon"

    lato[:] = lat.copy()
    lono[:] = lon.copy()
    deptho[:] = depth.copy()
    data1[:] = data.copy()
    #lons[:] = np.arange(48, 51.1, 0.1)

    f1.Conventions = 'CF-1.0'

    f1.close()
Пример #30
0
def create_netcdf_file(filename, lon, lat, T, file_sections):

    T = T - 1
    root_grp = Dataset(filename, 'w', format='NETCDF4', clobber=True)
    root_grp.Conventions = 'CF-1.0'
    # dimensions
    root_grp.createDimension('time', len(T))
    root_grp.createDimension('nx_grid', lon.shape[1])
    root_grp.createDimension('ny_grid', lon.shape[0])
    # variables
    times = root_grp.createVariable('time', 'f8', ('time', ))
    base_date = np.double(num2date(T[0]).year), np.double(
        num2date(T[0]).month), np.double(num2date(T[0]).day), np.double(
            num2date(T[0]).hour), np.double(num2date(T[0]).minute), np.double(
                num2date(T[0]).second)
    times.base_date = base_date
    latitudes = root_grp.createVariable('lat', 'f4', (
        'ny_grid',
        'nx_grid',
    ))
    longitudes = root_grp.createVariable('lon', 'f4', (
        'ny_grid',
        'nx_grid',
    ))
    ## add the main var
    times[:] = np.ceil(abs(T - T[0]) * 1000) / 1000
    latitudes[:, :] = lat
    longitudes[:, :] = lon
    ## save the rest
    temp = {}
    for m in file_sections:
        temp[m] = root_grp.createVariable(m, 'f4', (
            'time',
            'ny_grid',
            'nx_grid',
        ))
    return temp, root_grp
Пример #31
0
def createfile(filename):
    ''' Creates the netCDF file to then be opened in field2nc. 

        Needs changing when extracting a different field #**# indicate 
        that there is something that needs changing. 
    '''
    print filename
    f = Dataset(filename,'w')

    zres = 180 #**#
    latres = 324 #**#
    lonres = 432 #**#
    # Create dimensions
    time = f.createDimension('time',None)
    z_hybrid_height = f.createDimension('z_hybrid_height',zres)
    latitude = f.createDimension('latitude',latres)
    longitude = f.createDimension('longitude',lonres)

    # Create variables (added s on the end to differentiate between dimensions
    #                   and variables)
    times = f.createVariable('time','f4',('time',),zlib=True)
    z_hybrid_heights = f.createVariable('z_hybrid_height','f4',
                                        ('z_hybrid_height',),zlib=True)
    latitudes = f.createVariable('latitude','f4',('latitude',),zlib=True)
    longitudes = f.createVariable('longitude','f4',('longitude',),zlib=True)
    v = f.createVariable('u','f4',('time','z_hybrid_height','latitude',
                                   'longitude',),zlib=True) #**#

    # Add in attributes
    f.Conventions = 'CF-1.6'
    times.units = 'hours since 1981-09-01 00:00:00'
    times.standard_name = 'time'
    times.calendar = '360_day'
    times.axis = 'T'
    z_hybrid_heights.positive = 'up'
    z_hybrid_heights.long_name = 'atmosphere hybrid height coordinate'
    z_hybrid_heights.standard_name = 'atmosphere_hybrid_height_coordinate'
    z_hybrid_heights.units = 'm'
    z_hybrid_heights.axis = 'Z'
    latitudes.bounds = 'bounds_latitude'
    latitudes.units = 'degrees_north'
    latitudes.standard_name = 'latitude'
    latitudes.point_spacing = 'even'
    latitudes.axis = 'Y'
    longitudes.bounds = 'bounds_longitude'
    longitudes.modulo = 360.
    longitudes.point_spacing = 'even'
    longitudes.standard_name = 'longitude'
    longitudes.units = 'degrees_east'
    longitudes.axis = 'X'
    longitudes.topology = 'circular'
    #**#
    v.lookup_source = 'defaults (cdunifpp V0.13)'
    v.standard_name = 'eastward_wind'
    v.long_name = 'U COMPONENT OF WIND AFTER TIMESTEP'
    v.units = 'm s-1'
    v.missing_value = -1.073742e+09
    #**#

    # Add in values of lat, lon and height
    fieldfile = 'xjleha.pj'+filename[-13:-5] #**#
    f2 = cdms2.open('/group_workspaces/jasmin/hiresgw/xjleh/'+fieldfile)#**#
    var = f2.getVariables()    
    v2 = var[9]#**#

    z2 = f2.getVariables()[0]
    zvals = z2.domain[0][0][:]
    # Check the length of the latitude dimension
    if v2.shape[2] == 324:
        latvals = np.linspace(-90+90./324,90-90./324,324)
    elif v2.shape[2] == 325:
        latvals = np.linspace(-90,90,325)
    else: raise ValueError('Unhandled latitude dimension')

    # Check the length of the latitude dimension
    if v2.shape[3] == 432 and v2.shape[2] == 324:
        lonvals = np.linspace(0,360-360./432,432)
    elif v2.shape[3] == 432 and v2.shape[2] == 325:
        lonvals = np.linspace(360./(432*2),360.-360./(432*2),432)
    else: raise ValueError('Unhandled longitude dimension')
    
    latitudes[:] = latvals[:]
    longitudes[:] = lonvals[:]
    z_hybrid_heights[:] = zvals[:]
    f2.close()

    f.close()
def ConvertNCCF(TheFileIn,TheFileOut,TheTimes,TheDaysArray,TheCLats,TheCLongs,TheClimPeriod,TheMissing,TheType):
    ''' Discover what is in the file '''
    ''' Open and read in all bits '''
    ''' Write out in cf compliant style '''

    ncf=Dataset(TheFileIn,'r')
    nc_dims = list(ncf.dimensions)	# list of dimensions [dim for dim in ncf.dimensions]
    nc_vars = list(ncf.variables)  # list of nc variables [var for var in ncf.variables]
    nc_attrs = ncf.ncattrs()		# list of global attributes

    ndims=len(nc_dims)
    nvars=len(nc_vars)
    ngatts=len(nc_attrs)

# Get all global attributes
    TheGAtts=np.empty(ngatts,dtype=object)	# an empty array with the right number of string elements
    for (noo,att) in enumerate(nc_attrs):	# enumerate and use elements of the list
        TheGAtts[noo]=ncf.getncattr(att)	# get each global attribute and populate array

# Get all dimensions
    TheDims=np.empty(ndims)	# an empty array with the right number of string elements
    for (noo,dim) in enumerate(nc_dims):	# enumerate and use elements of the list
        TheDims[noo]=len(ncf.dimensions[dim])	# get length of each dimension
# NO DIMENSION ATTRIBUTES - 
#    TheDimAttrNames=[[] for i in xrange(ndims)]		# create list of lists - one for the attribute names of each dimension
#    TheDimAttrs=[[] for i in xrange(ndims)]		# create list of lists - one for the attributes of each dimension
#    for (noo,dim) in enumerate(nc_dims):	# enumerate and use elements of the list
#        TheDimAttrNames[noo]=ncf.dimensions[dim].ncattrs()	# fill names
#        for (nee,nats) in enumerate(TheDimAttrNames[noo]):      # loop through each name and get the attribute   
#            TheDimAttrs[noo][nee]=f.dimensions[dim].getncattr(nats)	

# Get all variables, and their attributes
    TheVarAttrNames=[[] for i in xrange(nvars)]		# create list of lists - one for the attribute names of each dimension
    TheVarAttrs=[[] for i in xrange(nvars)]		# create list of lists - one for the attributes of each dimension
    TheVars=[[] for i in xrange(nvars)]		# create list of lists - one for the attributes of each dimension
    for (noo,var) in enumerate(nc_vars):	# enumerate and use elements of the list
        TheVarAttrNames[noo]=ncf.variables[var].ncattrs()	# fill names
        for (nee,nats) in enumerate(TheVarAttrNames[noo]):      # loop through each name and get the attribute   
            TheVarAttrs[noo].append(ncf.variables[var].getncattr(nats))	
        TheVars[noo]=ncf.variables[nc_vars[noo]][:]


# Now write out, checking if the standard stuff is not there, and if not, then add in
    ncfw=Dataset(TheFileOut,'w',format='NETCDF3_CLASSIC')
    
# Set up the global attributes
# Is there a description?
    moo=np.where(np.array(nc_attrs) == 'description')
    if (moo[0] >= 0):
        ncfw.description=TheGAtts[moo[0]]
    else:
        ncfw.description="HadISDH monthly mean land surface "+TheType+" climate monitoring product from 1973 onwards. Quality control, homogenisation, uncertainty estimation, averaging over gridboxes (no smoothing or interpolation)."
# Is there a title?
    moo=np.where(np.array(nc_attrs) == 'title')
    if (moo[0] >= 0):
        ncfw.title=TheGAtts[moo[0]]
    else:
        ncfw.title="HadISDH monthly mean land surface "+TheType+" climate monitoring product from 1973 onwards."
# Is there an institution?
    moo=np.where(np.array(nc_attrs) == 'institution')
    if (moo[0] >= 0):
        ncfw.institution=TheGAtts[moo[0]]
    else:
        ncfw.institution="Met Office Hadley Centre (UK), National Climatic Data Centre (USA), Climatic Research Unit (UK), National Physical Laboratory (UK), Bjerknes Centre for Climate Research (Norway)"
# Is there a history?
    moo=np.where(np.array(nc_attrs) == 'history')
    if (moo[0] >= 0):
        ncfw.history=TheGAtts[moo[0]]
    else:
        ncfw.history="Updated 4 February 2014"
# Is there a source?
    moo=np.where(np.array(nc_attrs) == 'source')
    if (moo[0] >= 0):
        ncfw.source=TheGAtts[moo[0]]
    else:
        ncfw.source="HadISD.1.0.2.2013f (Dunn et al., 2012)"
# Is there a comment?
    moo=np.where(np.array(nc_attrs) == 'comment')
    if (moo[0] >= 0):
        ncfw.comment=TheGAtts[moo[0]]
    else:
        ncfw.comment=""
# Is there a reference?
    moo=np.where(np.array(nc_attrs) == 'reference')
    if (moo[0] >= 0):
        ncfw.reference=TheGAtts[moo[0]]
    else:
        ncfw.reference="Willett, K. M., Dunn, R. J. H., Thorne, P. W., Bell, S., de Podesta, M., Parker, D. E., Jones, P. D., and Williams Jr., C. N.: HadISDH land surface multi-variable humidity and temperature record for climate monitoring, Clim. Past, 10, 1983-2006, doi:10.5194/cp-10-1983-2014, 2014."
# Is there a version?
    moo=np.where(np.array(nc_attrs) == 'version')
    if (moo[0] >= 0):
        ncfw.version=TheGAtts[moo[0]]
    else:
        ncfw.version="HadISDH.2.0.0.2013p"
# Is there a Conventions?
    moo=np.where(np.array(nc_attrs) == 'Conventions')
    if (moo[0] >= 0):
        ncfw.Conventions=TheGAtts[moo[0]]
    else:
        ncfw.Conventions="CF-1.0"

# Now set up the dimensions (time, latitude, longitude, optional-month)
    data={}	# Not really sure what this is about

    moo=np.where(np.array(nc_dims) == 'time')
    goo=np.where(np.array(nc_vars) == 'time')
    if not(goo[0] >= 0): goo=np.where(np.array(nc_vars) == 'times')	# Look for mistakes in HadISDH
    if (moo[0] >= 0) & (goo[0] >= 0):
        ncfw.createDimension(nc_dims[moo[0]],ncf.variables[nc_vars[goo[0]]].size)        
    else:
        ncfw.createDimension('time',TheTimes)        
    
    data['time']=ncfw.createVariable('time','f8',('time',))    

    data['time'].setncattr('standard_name',u'time')
    data['time'].setncattr('long_name',u'time')
    data['time'].setncattr('units',u'days since 1973-1-1 00:00:00')
    data['time'].setncattr('calendar',u'gregorian')
    data['time'].setncattr('start_year',u'1973s')
    data['time'].setncattr('end_year',u'2013s')
    data['time'].setncattr('start_month',u'1s')
    data['time'].setncattr('end_month',u'12s')
    data['time'].setncattr('axis',u'T')

    moo=np.where(np.array(nc_dims) == 'latitude')
    goo=np.where(np.array(nc_vars) == 'latitude')
    if not(goo[0] >= 0): goo=np.where(np.array(nc_vars) == 'lat')	# Look for mistakes in HadISDH
    if (moo[0] >= 0) & (goo[0] >= 0):
        ncfw.createDimension(nc_dims[moo[0]],ncf.variables[nc_vars[goo[0]]].size)        
    else:
        ncfw.createDimension('latitude',TheCLats)        

    data['latitude']=ncfw.createVariable('latitude','f8',('latitude',))     
   
    data['latitude'].setncattr('standard_name',u'latitude')
    data['latitude'].setncattr('long_name',u'latitude')
    data['latitude'].setncattr('units',u'degrees_north')
    data['latitude'].setncattr('point_spacing',u'even')
    data['latitude'].setncattr('axis',u'Y')

    moo=np.where(np.array(nc_dims) == 'longitude')
    goo=np.where(np.array(nc_vars) == 'longitude')
    if not(goo[0] >= 0): goo=np.where(np.array(nc_vars) == 'lon')	# Look for mistakes in HadISDH
    if (moo[0] >= 0) & (goo[0] >= 0):
        ncfw.createDimension(nc_dims[moo[0]],ncf.variables[nc_vars[goo[0]]].size)        
    else:
        ncfw.createDimension('longitude',TheCLongs)        

    data['longitude']=ncfw.createVariable('longitude','f8',('longitude',))     
    
    data['longitude'].setncattr('standard_name',u'longitude')
    data['longitude'].setncattr('long_name',u'longitude')
    data['longitude'].setncattr('units',u'degrees_east')
    data['longitude'].setncattr('point_spacing',u'even')
    data['longitude'].setncattr('axis',u'X')

    makemonth=0    
    moo=np.where(np.array(nc_dims) == 'month')
    goo=np.where(np.array(nc_vars) == 'month')
    if not(goo[0] >= 0): goo=np.where(np.array(nc_vars) == 'months')	# Look for mistakes in HadISDH
    if (moo[0] >= 0) & (goo[0] >= 0):
        makemonth=1
        ncfw.createDimension('month',12)        
    
        data['month']=ncfw.createVariable('month','i',('month',))    

        data['month'].setncattr('standard_name',u'month')
        data['month'].setncattr('long_name',u'month')
        data['month'].setncattr('units',u'days since 1973-1-1 00:00:00')
        data['month'].setncattr('calendar',u'gregorian')
        data['month'].setncattr('start_year',u'1973s')
        data['month'].setncattr('end_year',u'1973s')
        data['month'].setncattr('start_month',u'1s')
        data['month'].setncattr('end_month',u'12s')
        data['month'].setncattr('axis',u'T')
    
# Now set up the variables
#    stop()
    for loo in range(nvars):	# miss out time, lat and lon - and month at the end
        print(loo)
	if (nc_vars[loo] != 'time') & (nc_vars[loo] != 'latitude') & (nc_vars[loo] != 'longitude') & (nc_vars[loo] != 'month') & \
	   (nc_vars[loo] != 'times') & (nc_vars[loo] != 'latitudes') & (nc_vars[loo] != 'longitudes') & (nc_vars[loo] != 'months') & \
	   (nc_vars[loo] != 'lat') & (nc_vars[loo] != 'lon'): 
	   
	    print(nc_vars[loo])

	    ncfw_var=ncfw.createVariable(nc_vars[loo],ncf.variables[nc_vars[loo]].dtype,ncf.variables[nc_vars[loo]].dimensions)

            if (any(np.where(np.array(ncf.variables[nc_vars[loo]].ncattrs()) == '_FillValue'))):
	        ncfw_var.setncattr('_FillValue',ncf.variables[nc_vars[loo]].getncattr('_FillValue')) 
            elif (any(np.where(np.array(ncf.variables[nc_vars[loo]].ncattrs()) == 'missing_value'))):
	        ncfw_var.setncattr('_FillValue',ncf.variables[nc_vars[loo]].getncattr('missing_value')) 
	    else:    
		ncfw_var.setncattr('_FillValue',TheMissing) 

            if (any(np.where(np.array(ncf.variables[nc_vars[loo]].ncattrs()) == 'missing_value'))):
	        ncfw_var.setncattr('missing_value',ncf.variables[nc_vars[loo]].getncattr('missing_value')) 
            elif (any(np.where(np.array(ncf.variables[nc_vars[loo]].ncattrs()) == '_FillValue'))):
	        ncfw_var.setncattr('missing_value',ncf.variables[nc_vars[loo]].getncattr('_FillValue')) 
	    else:    
		ncfw_var.setncattr('missing_value',TheMissing) 

            if (any(np.where(np.array(ncf.variables[nc_vars[loo]].ncattrs()) == 'valid_min'))):
	        ncfw_var.setncattr('valid_min',ncf.variables[nc_vars[loo]].getncattr('valid_min')) 
	    else:    
		ncfw_var.setncattr('valid_min',min(ncf.variables[nc_vars[0]][np.where(ncf.variables[nc_vars[0]][:] != TheMissing)])) 

            if (any(np.where(np.array(ncf.variables[nc_vars[loo]].ncattrs()) == 'valid_max'))):
	        ncfw_var.setncattr('valid_max',ncf.variables[nc_vars[loo]].getncattr('valid_max')) 
	    else:    
		ncfw_var.setncattr('valid_max',max(ncf.variables[nc_vars[0]][np.where(ncf.variables[nc_vars[0]][:] != TheMissing)])) 

            if (any(np.where(np.array(ncf.variables[nc_vars[loo]].ncattrs()) == 'reference_period'))):
	        ncfw_var.setncattr('reference_period',ncf.variables[nc_vars[loo]].getncattr('reference_period')) 
	    else:    
		ncfw_var.setncattr('reference_period',ClimPeriod) 
	        
	    ncfw_var.setncatts({'long_name':ncf.variables[nc_vars[loo]].getncattr('long_name'),
                            'units':ncf.variables[nc_vars[loo]].getncattr('units')})
# Now fill the variables
    ncfw.variables['time'][:]=TheDaysArray
    ncfw.variables['latitude'][:]=ncf.variables[nc_vars[1]][:]
    ncfw.variables['longitude'][:]=ncf.variables[nc_vars[2]][:]
    if (makemonth == 1): 
        ncfw.variables['month'][:]=TheDaysArray[0:12]

    for loo in range((nvars)):	# miss out time, lat and lon
        print(loo)
	if (nc_vars[loo] != 'time') & (nc_vars[loo] != 'latitude') & (nc_vars[loo] != 'longitude') & (nc_vars[loo] != 'month') & \
	   (nc_vars[loo] != 'times') & (nc_vars[loo] != 'latitudes') & (nc_vars[loo] != 'longitudes') & (nc_vars[loo] != 'months') & \
	   (nc_vars[loo] != 'lat') & (nc_vars[loo] != 'lon'): 
	   
	    print(nc_vars[loo])
            ncfw.variables[nc_vars[loo]][:]=ncf.variables[nc_vars[loo]][:]
   
    
    ncfw.close()
   
    return # ConvertNCCF
Пример #33
0
def outputNC(output_file, ds, total, interest_lon, interest_lat, time_steps,
             var_list, avg_dict):
    print('Writing new nc4 file')
    nc4_out = Dataset(output_file, 'w', format='NETCDF4')
    time = nc4_out.createDimension("time", None)
    lat = nc4_out.createDimension("lat", len(ds.lat.data))
    lon = nc4_out.createDimension("lon", len(ds.lon.data))

    # copying dimentions
    time = nc4_out.createVariable("time", "i4", ("time", ))
    days = []
    for i in ds.time.data:
        year = int(str(i).split('T')[0].split('-')[0])
        month = int(str(i).split('T')[0].split('-')[1])
        day = int(str(i).split('T')[0].split('-')[1])
        dt = datetime.datetime(year, month, day) - datetime.datetime(
            2002, 1, 1)
        days.append(dt.days)
    days = numpy.array(days)
    time[:] = days
    lat = nc4_out.createVariable("lat", "f4", ("lat", ))
    lat[:] = ds.lat.data[:]
    lon = nc4_out.createVariable("lon", "f4", ("lon", ))
    lon[:] = ds.lon.data[:]
    crs = nc4_out.createVariable("crs", "i4")

    if 'time' in ds.variables:
        var = ds['time']
        if 'standard_name' in var.attrs:
            time.standard_name = var.standard_name
        if 'long_name' in var.attrs:
            time.long_name = "time"
        if 'units' not in var.attrs:
            time.units = "days since 2002-01-01 00:00:00 UTC"
        if 'axis' in var.attrs:
            time.axis = var.axis
        if 'calendar' not in var.attrs:
            time.calendar = "gregorian"
        if 'bounds' in var.attrs:
            time.bounds = var.bounds

    if 'lat' in ds.variables:
        var = ds['lat']
        if 'standard_name' in var.attrs:
            lat.standard_name = var.standard_name
        if 'long_name' in var.attrs:
            lat.long_name = var.long_name
        if 'units' in var.attrs:
            lat.units = var.units
        if 'axis' in var.attrs:
            lat.axis = var.axis

    if 'lon' in ds.variables:
        var = ds['lon']
        if 'standard_name' in var.attrs:
            lon.standard_name = var.standard_name
        if 'long_name' in var.attrs:
            lon.long_name = var.long_name
        if 'units' in var.attrs:
            lon.units = var.units
        if 'axis' in var.attrs:
            lon.axis = var.axis

    #copying variables
    for (name, value) in ds.data_vars.items():
        nc4_vars = nc4_out.createVariable(name, value.dtype, value.dims)
        nc4_vars.setncatts(ds[name].attrs)

    dt = datetime.datetime.utcnow()
    dt = dt.replace(microsecond=0)
    nc4_out.Conventions = 'CF-1.6'
    nc4_out.title = ''
    nc4_out.institution = ''
    nc4_out.history = 'date created: ' + dt.isoformat() + '+00:00'
    nc4_out.references = 'https://github.com/c-h-david/shbaam/'
    nc4_out.comment = ''
    nc4_out.featureType = 'timeSeries'

    for var in var_list:
        nc4_out[var][:, :, :] = numpy.nan
        for i in range(total):
            lon_index, lat_index = interest_lon[i][0], interest_lat[i][0]
            long_term_mean = avg_dict[var][i]
            for time in range(time_steps):
                nc4_out[var][time, lat_index,
                             lon_index] = ds[var][time, lat_index,
                                                  lon_index] - long_term_mean

    nc4_out.close()
    print("Success -- creating nc4 file\n")
Пример #34
0
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

from pysofaconventions import *
from netCDF4 import Dataset
import time
import numpy as np
import soundfile as sf

#----------Create it----------#

filePath = "/Volumes/Dinge/SOFA/S3A/AudioBooth.sofa"
rootgrp = Dataset(filePath, 'w', format='NETCDF4')

#----------Required Attributes----------#

rootgrp.Conventions = 'SOFA'
rootgrp.Version = SOFAAPI.getAPIVersion()
rootgrp.SOFAConventions = 'AmbisonicsDRIR'
rootgrp.SOFAConventionsVersion = SOFAAmbisonicsDRIR.getConventionVersion()
rootgrp.APIName = 'pysofaconventions'
rootgrp.APIVersion = SOFAAPI.getAPIVersion()
rootgrp.AuthorContact = '*****@*****.**'
rootgrp.Organization = 'Eurecat - UPF'
rootgrp.License = 'Please ask authors for permission'
rootgrp.DataType = 'FIRE'
rootgrp.RoomType = 'reverberant'
rootgrp.DateCreated = time.ctime(time.time())
rootgrp.DateModified = time.ctime(time.time())
rootgrp.Title = 'AudioBooth'
rootgrp.AmbisonicsOrder = '1'
Пример #35
0
def createBryFile(confM2R):
    if (confM2R.myformat == 'NETCDF4'):
        myzlib = True
    else:
        myzlib = False
    grdROMS = confM2R.grdROMS

    if os.path.exists(confM2R.bryname):
        os.remove(confM2R.bryname)
    print(('\n=>Creating initial Boundary (BRY) file {}'.format(confM2R.bryname)))

    f1 = Dataset(confM2R.bryname, mode='w', format=confM2R.myformat)
    f1.title = "Boundary forcing file (BRY) used for forcing of the ROMS model"
    f1.description = "Created for the {} grid file".format(confM2R.romsgridpath)
    f1.grdFile = "{}".format(confM2R.romsgridpath)
    f1.history = 'Created ' + time.ctime(time.time())
    f1.source = "{} ({})".format(confM2R.authorname, confM2R.authoremail)
    f1.type = "File in {} format created using MODEL2ROMS".format(confM2R.myformat)
    f1.link = "https://github.com/trondkr/model2roms"
    f1.Conventions = "CF-1.0"

    """ Define dimensions """
    f1.createDimension('xi_rho', grdROMS.xi_rho)
    f1.createDimension('eta_rho', grdROMS.eta_rho)
    f1.createDimension('xi_u', grdROMS.xi_u)
    f1.createDimension('eta_u', grdROMS.eta_u)
    f1.createDimension('xi_v', grdROMS.xi_v)
    f1.createDimension('eta_v', grdROMS.eta_v)
    f1.createDimension('xi_psi', grdROMS.xi_psi)
    f1.createDimension('eta_psi', grdROMS.eta_psi)
    f1.createDimension('ocean_time', None)
    f1.createDimension('s_rho', len(grdROMS.s_rho))
    f1.createDimension('s_w', len(grdROMS.s_w))

    vnc = f1.createVariable('lon_rho', 'd', ('eta_rho', 'xi_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
    vnc.long_name = 'Longitude of RHO-points'
    vnc.units = 'degree_east'
    vnc.standard_name = 'longitude'
    vnc[:, :] = grdROMS.lon_rho

    vnc = f1.createVariable('lat_rho', 'd', ('eta_rho', 'xi_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
    vnc.long_name = 'Latitude of RHO-points'
    vnc.units = 'degree_north'
    vnc.standard_name = 'latitude'
    vnc[:, :] = grdROMS.lat_rho

    vnc = f1.createVariable('lon_u', 'd', ('eta_u', 'xi_u',), zlib=myzlib, fill_value=grdROMS.fillval)
    vnc.long_name = 'Longitude of U-points'
    vnc.units = 'degree_east'
    vnc.standard_name = 'longitude'
    vnc[:, :] = grdROMS.lon_u

    vnc = f1.createVariable('lat_u', 'd', ('eta_u', 'xi_u',), zlib=myzlib, fill_value=grdROMS.fillval)
    vnc.long_name = 'Latitude of U-points'
    vnc.units = 'degree_north'
    vnc.standard_name = 'latitude'
    vnc[:, :] = grdROMS.lat_u

    vnc = f1.createVariable('lon_v', 'd', ('eta_v', 'xi_v',), zlib=myzlib, fill_value=grdROMS.fillval)
    vnc.long_name = 'Longitude of V-points'
    vnc.units = 'degree_east'
    vnc.standard_name = 'longitude'
    vnc[:, :] = grdROMS.lon_v

    vnc = f1.createVariable('lat_v', 'd', ('eta_v', 'xi_v',), zlib=myzlib, fill_value=grdROMS.fillval)
    vnc.long_name = 'Latitude of V-points'
    vnc.units = 'degree_north'
    vnc.standard_name = 'latitude'
    vnc[:, :] = grdROMS.lat_v

    vnc = f1.createVariable('lat_psi', 'd', ('eta_psi', 'xi_psi',), zlib=myzlib, fill_value=grdROMS.fillval)
    vnc.long_name = 'Latitude of PSI-points'
    vnc.units = 'degree_north'
    vnc.standard_name = 'latitude'
    vnc[:, :] = grdROMS.lat_psi

    vnc = f1.createVariable('lon_psi', 'd', ('eta_psi', 'xi_psi',), zlib=myzlib, fill_value=grdROMS.fillval)
    vnc.long_name = 'Longitude of PSI-points'
    vnc.units = 'degree_east'
    vnc.standard_name = 'longitude'
    vnc[:, :] = grdROMS.lon_psi

    vnc = f1.createVariable('h', 'd', ('eta_rho', 'xi_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
    vnc.long_name = "Bathymetry at RHO-points"
    vnc.units = "meter"
    vnc.coordinates = "lat_rho lon_rho"
    vnc.field = "bath, scalar"
    vnc[:, :] = grdROMS.h

    vnc = f1.createVariable('s_rho', 'd', ('s_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
    vnc.long_name = "S-coordinate at RHO-points"
    vnc.valid_min = -1.
    vnc.valid_max = 0.

    if grdROMS.vtransform == 2:
        vnc.standard_name = "ocean_s_coordinate_g2"
        vnc.formula_terms = "s: s_rho C: Cs_r eta: zeta depth: h depth_c: hc"
    if grdROMS.vtransform == 1:
        vnc.standard_name = "ocean_s_coordinate_g1"
        vnc.formula_terms = "s: s_rho C: Cs_r eta: zeta depth: h depth_c: hc"
    vnc.field = "s_rho, scalar"
    vnc[:] = grdROMS.s_rho

    vnc = f1.createVariable('s_w', 'd', ('s_w',), zlib=myzlib, fill_value=grdROMS.fillval)
    vnc.long_name = "S-coordinate at W-points"
    vnc.valid_min = -1.
    vnc.valid_max = 0.
    if grdROMS.vtransform == 2:
        vnc.standard_name = "ocean_s_coordinate_g2"
        vnc.formula_terms = "s: s_w C: Cs_w eta: zeta depth: h depth_c: hc"
    if grdROMS.vtransform == 1:
        vnc.standard_name = "ocean_s_coordinate_g1"
        vnc.formula_terms = "s: s_w C: Cs_w eta: zeta depth: h depth_c: hc"
    vnc.field = "s_w, scalar"
    vnc[:] = grdROMS.s_w

    vnc = f1.createVariable('Cs_r', 'd', ('s_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
    vnc.long_name = "S-coordinate stretching curves at RHO-points"
    vnc.valid_min = -1.
    vnc.valid_max = 0.
    vnc.field = "Cs_rho, scalar"
    vnc[:] = grdROMS.Cs_rho

    vnc = f1.createVariable('Cs_w', 'd', ('s_w',), zlib=myzlib, fill_value=grdROMS.fillval)
    vnc.long_name = "S-coordinate stretching curves at W-points"
    vnc.valid_min = -1.
    vnc.valid_max = 0.
    vnc.field = "Cs_w, scalar"
    vnc[:] = grdROMS.Cs_w

    vnc = f1.createVariable('hc', 'd')
    vnc.long_name = "S-coordinate parameter, critical depth";
    vnc.units = "meter"
    vnc[:] = grdROMS.hc

    vnc = f1.createVariable('z_r', 'd', ('s_rho', 'eta_rho', 'xi_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
    vnc.long_name = "Sigma layer to depth matrix";
    vnc.units = "meter"
    vnc[:, :, :] = grdROMS.z_r

    vnc = f1.createVariable('Tcline', 'd')
    vnc.long_name = "S-coordinate surface/bottom layer width"
    vnc.units = "meter"
    vnc[:] = grdROMS.tcline

    vnc = f1.createVariable('theta_s', 'd')
    vnc.long_name = "S-coordinate surface control parameter"
    vnc[:] = grdROMS.theta_s

    vnc = f1.createVariable('theta_b', 'd')
    vnc.long_name = "S-coordinate bottom control parameter"
    vnc[:] = grdROMS.theta_b

    vnc = f1.createVariable('angle', 'd', ('eta_rho', 'xi_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
    vnc.long_name = "angle between xi axis and east"
    vnc.units = "radian"

    v_time = f1.createVariable('ocean_time', 'd', ('ocean_time',), zlib=myzlib, fill_value=grdROMS.fillval)
    
    v_time.long_name = 'seconds since 1948-01-01 00:00:00'
    v_time.units = 'seconds since 1948-01-01 00:00:00'
    v_time.field = 'time, scalar, series'

    if (confM2R.oceanindatatype == "NORESM"):
        v_time.calendar = 'noleap'
    else:
        v_time.calendar = 'standard'

    v_temp_west = f1.createVariable('temp_west', 'f', ('ocean_time', 's_rho', 'eta_rho',), zlib=myzlib,
                                    fill_value=grdROMS.fillval)
    v_temp_west.long_name = "potential temperature western boundary condition"
    v_temp_west.units = "Celsius"
    v_temp_west.field = "temp_west, scalar, series"
    #v_temp_west.missing_value = grdROMS.fillval
    v_temp_west.time = "ocean_time"

    v_temp_east = f1.createVariable('temp_east', 'f', ('ocean_time', 's_rho', 'eta_rho',), zlib=myzlib,
                                    fill_value=grdROMS.fillval)
    v_temp_east.long_name = "potential temperature eastern boundary condition"
    v_temp_east.units = "Celsius"
    v_temp_east.field = "temp_east, scalar, series"
    #v_temp_east.missing_value = grdROMS.fillval
    v_temp_east.time = "ocean_time"

    v_temp_south = f1.createVariable('temp_south', 'f', ('ocean_time', 's_rho', 'xi_rho',), zlib=myzlib,
                                     fill_value=grdROMS.fillval)
    v_temp_south.long_name = "potential temperature southern boundary condition"
    v_temp_south.units = "Celsius"
    v_temp_south.field = "temp_south, scalar, series"
    #v_temp_south.missing_value = grdROMS.fillval
    v_temp_south.time = "ocean_time"

    v_temp_north = f1.createVariable('temp_north', 'f', ('ocean_time', 's_rho', 'xi_rho',), zlib=myzlib,
                                     fill_value=grdROMS.fillval)
    v_temp_north.long_name = "potential temperature northern boundary condition"
    v_temp_north.units = "Celsius"
    v_temp_north.field = "temp_north, scalar, series"
    #v_temp_north.missing_value = grdROMS.fillval
    v_temp_north.time = "ocean_time"

    v_salt_west = f1.createVariable('salt_west', 'f', ('ocean_time', 's_rho', 'eta_rho',), zlib=myzlib,
                                    fill_value=grdROMS.fillval)
    v_salt_west.long_name = "salinity western boundary condition"
    v_salt_west.field = "salt_west, scalar, series"
    #v_salt_west.missing_value = grdROMS.fillval
    v_salt_west.time = "ocean_time"

    v_salt_east = f1.createVariable('salt_east', 'f', ('ocean_time', 's_rho', 'eta_rho',), zlib=myzlib,
                                    fill_value=grdROMS.fillval)
    v_salt_east.long_name = "salinity eastern boundary condition"
    v_salt_east.field = "salt_east, scalar, series"
    #v_salt_east.missing_value = grdROMS.fillval
    v_salt_east.time = "ocean_time"

    v_salt_south = f1.createVariable('salt_south', 'f', ('ocean_time', 's_rho', 'xi_rho',), zlib=myzlib,
                                     fill_value=grdROMS.fillval)
    v_salt_south.long_name = "salinity southern boundary condition"
    v_salt_south.field = "salt_south, scalar, series"
    #v_salt_south.missing_value = grdROMS.fillval
    v_salt_south.time = "ocean_time"

    v_salt_north = f1.createVariable('salt_north', 'f', ('ocean_time', 's_rho', 'xi_rho',), zlib=myzlib,
                                     fill_value=grdROMS.fillval)
    v_salt_north.long_name = "salinity northern boundary condition"
    v_salt_north.field = "salt_north, scalar, series"
    #v_salt_north.missing_value = grdROMS.fillval
    v_salt_north.time = "ocean_time"

    v_ssh_west = f1.createVariable('zeta_west', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                   fill_value=grdROMS.fillval)
    v_ssh_west.long_name = "free-surface western boundary condition"
    v_ssh_west.units = "meter"
    v_ssh_west.field = "zeta_west, scalar, series"
    #v_ssh_west.missing_value = grdROMS.fillval
    v_ssh_west.time = "ocean_time"

    v_ssh_east = f1.createVariable('zeta_east', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                   fill_value=grdROMS.fillval)
    v_ssh_east.long_name = "free-surface eastern boundary condition"
    v_ssh_east.units = "meter"
    v_ssh_east.field = "zeta_east, scalar, series"
    #v_ssh_east.missing_value = grdROMS.fillval
    v_ssh_east.time = "ocean_time"

    v_ssh_south = f1.createVariable('zeta_south', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                    fill_value=grdROMS.fillval)
    v_ssh_south.long_name = "free-surface southern boundary condition"
    v_ssh_south.units = "meter"
    v_ssh_south.field = "zeta_south, scalar, series"
    #v_ssh_south.missing_value = grdROMS.fillval
    v_ssh_south.time = "ocean_time"

    v_ssh_north = f1.createVariable('zeta_north', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                    fill_value=grdROMS.fillval)
    v_ssh_north.long_name = "free-surface northern boundary condition"
    v_ssh_north.units = "meter"
    v_ssh_north.field = "zeta_north, scalar, series"
    #v_ssh_north.missing_value = grdROMS.fillval
    v_ssh_north.time = "ocean_time"

    v_u_west = f1.createVariable('u_west', 'f', ('ocean_time', 's_rho', 'eta_u',), zlib=myzlib,
                                 fill_value=grdROMS.fillval)
    v_u_west.long_name = "3D u-momentum western boundary condition"
    v_u_west.units = "meter second-1"
    v_u_west.field = "u_west, scalar, series"
    #v_u_west.missing_value = grdROMS.fillval
    v_u_west.time = "ocean_time"

    v_u_east = f1.createVariable('u_east', 'f', ('ocean_time', 's_rho', 'eta_u',), zlib=myzlib,
                                 fill_value=grdROMS.fillval)
    v_u_east.long_name = "3D u-momentum eastern boundary condition"
    v_u_east.units = "meter second-1"
    v_u_east.field = "u_east, scalar, series"
    #v_u_east.missing_value = grdROMS.fillval
    v_u_east.time = "ocean_time"

    v_u_south = f1.createVariable('u_south', 'f', ('ocean_time', 's_rho', 'xi_u',), zlib=myzlib,
                                  fill_value=grdROMS.fillval)
    v_u_south.long_name = "3D u-momentum southern boundary condition"
    v_u_south.units = "meter second-1"
    v_u_south.field = "u_south, scalar, series"
    #v_u_south.missing_value = grdROMS.fillval
    v_u_south.time = "ocean_time"

    v_u_north = f1.createVariable('u_north', 'f', ('ocean_time', 's_rho', 'xi_u',), zlib=myzlib,
                                  fill_value=grdROMS.fillval)
    v_u_north.long_name = "3D u-momentum northern boundary condition"
    v_u_north.units = "meter second-1"
    v_u_north.field = "u_north, scalar, series"
    #v_u_north.missing_value = grdROMS.fillval
    v_u_north.time = "ocean_time"

    v_v_west = f1.createVariable('v_west', 'f', ('ocean_time', 's_rho', 'eta_v',), zlib=myzlib,
                                 fill_value=grdROMS.fillval)
    v_v_west.long_name = "3D v-momentum western boundary condition"
    v_v_west.units = "meter second-1"
    v_v_west.field = "v_west, scalar, series"
    #v_v_west.missing_value = grdROMS.fillval
    v_v_west.time = "ocean_time"

    v_v_east = f1.createVariable('v_east', 'f', ('ocean_time', 's_rho', 'eta_v',), zlib=myzlib,
                                 fill_value=grdROMS.fillval)
    v_v_east.long_name = "3D v-momentum eastern boundary condition"
    v_v_east.units = "meter second-1"
    v_v_east.field = "v_east, scalar, series"
    #v_v_east.missing_value = grdROMS.fillval
    v_v_east.time = "ocean_time"

    v_v_south = f1.createVariable('v_south', 'f', ('ocean_time', 's_rho', 'xi_v',), zlib=myzlib,
                                  fill_value=grdROMS.fillval)
    v_v_south.long_name = "3D v-momentum southern boundary condition"
    v_v_south.units = "meter second-1"
    v_v_south.field = "v_south, scalar, series"
    #v_v_south.missing_value = grdROMS.fillval
    v_v_south.time = "ocean_time"

    v_v_north = f1.createVariable('v_north', 'f', ('ocean_time', 's_rho', 'xi_v',), zlib=myzlib,
                                  fill_value=grdROMS.fillval)
    v_v_north.long_name = "3D v-momentum northern boundary condition"
    v_v_north.units = "meter second-1"
    v_v_north.field = "v_north, scalar, series"
    #v_v_north.missing_value = grdROMS.fillval
    v_v_north.time = "ocean_time"

    v_vbar_west = f1.createVariable('vbar_west', 'f', ('ocean_time', 'eta_v',), zlib=myzlib,
                                    fill_value=grdROMS.fillval)
    v_vbar_west.long_name = "2D v-momentum western boundary condition"
    v_vbar_west.units = "meter second-1"
    v_vbar_west.field = "vbar_west, scalar, series"
    #v_vbar_west.missing_value = grdROMS.fillval
    v_vbar_west.time = "ocean_time"

    v_vbar_east = f1.createVariable('vbar_east', 'f', ('ocean_time', 'eta_v',), zlib=myzlib,
                                    fill_value=grdROMS.fillval)
    v_vbar_east.long_name = "2D v-momentum eastern boundary condition"
    v_vbar_east.units = "meter second-1"
    v_vbar_east.field = "vbar_east, scalar, series"
    #v_vbar_east.missing_value = grdROMS.fillval
    v_vbar_east.time = "ocean_time"

    v_vbar_south = f1.createVariable('vbar_south', 'f', ('ocean_time', 'xi_v',), zlib=myzlib,
                                     fill_value=grdROMS.fillval)
    v_vbar_south.long_name = "2D v-momentum southern boundary condition"
    v_vbar_south.units = "meter second-1"
    v_vbar_south.field = "vbar_south, scalar, series"
    #v_vbar_south.missing_value = grdROMS.fillval
    v_vbar_south.time = "ocean_time"

    v_vbar_north = f1.createVariable('vbar_north', 'f', ('ocean_time', 'xi_v',), zlib=myzlib,
                                     fill_value=grdROMS.fillval)
    v_vbar_north.long_name = "2D v-momentum northern boundary condition"
    v_vbar_north.units = "meter second-1"
    v_vbar_north.field = "vbar_north, scalar, series"
    #v_vbar_north.missing_value = grdROMS.fillval
    v_vbar_north.time = "ocean_time"

    v_ubar_west = f1.createVariable('ubar_west', 'f', ('ocean_time', 'eta_u',), zlib=myzlib,
                                    fill_value=grdROMS.fillval)
    v_ubar_west.long_name = "2D u-momentum western boundary condition"
    v_ubar_west.units = "meter second-1"
    v_ubar_west.field = "ubar_west, scalar, series"
   # v_ubar_west.missing_value = grdROMS.fillval
    v_ubar_west.time = "ocean_time"

    v_ubar_east = f1.createVariable('ubar_east', 'f', ('ocean_time', 'eta_u',), zlib=myzlib,
                                    fill_value=grdROMS.fillval)
    v_ubar_east.long_name = "2D u-momentum eastern boundary condition"
    v_ubar_east.units = "meter second-1"
    v_ubar_east.field = "ubar_east, scalar, series"
    #v_ubar_east.missing_value = grdROMS.fillval
    v_ubar_east.time = "ocean_time"

    v_ubar_south = f1.createVariable('ubar_south', 'f', ('ocean_time', 'xi_u',), zlib=myzlib,
                                     fill_value=grdROMS.fillval)
    v_ubar_south.long_name = "2D u-momentum southern boundary condition"
    v_ubar_south.units = "meter second-1"
    v_ubar_south.field = "ubar_south, scalar, series"
    #v_ubar_south.missing_value = grdROMS.fillval
    v_ubar_south.time = "ocean_time"

    v_ubar_north = f1.createVariable('ubar_north', 'f', ('ocean_time', 'xi_u',), zlib=myzlib,
                                     fill_value=grdROMS.fillval)
    v_ubar_north.long_name = "2D u-momentum northern boundary condition"
    v_ubar_north.units = "meter second-1"
    v_ubar_north.field = "ubar_north, scalar, series"
    #v_ubar_north.missing_value = grdROMS.fillval
    v_ubar_north.time = "ocean_time"

    if confM2R.writebcg:
        directions=['east','west','north','south']
        dimens=['eta_rho','eta_rho','xi_rho','xi_rho']

        lndirections=['eastern','western','northern','southern']
        for currentdir,lndirection,dim in zip(directions, lndirections,dimens):
            currentvar='O3_c_'+currentdir
            longname="carbonate/total dissolved inorganic carbon {} boundary condition".format(lndirection) 
            O3_c = f1.createVariable(currentvar, 'f', ('ocean_time', 's_rho', dim,), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
            O3_c.long_name = longname
            O3_c.field = "{}, scalar, series".format(currentvar) 
            O3_c.units = "mmol C/m^3" 

            currentvar='O3_TA_'+currentdir
            longname="carbonate/bioalkalinity {} boundary condition".format(lndirection) 
            O3_ta = f1.createVariable(currentvar, 'f', ('ocean_time', 's_rho', dim,), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
            O3_ta.long_name = longname
            O3_ta.field = "{}, scalar, series".format(currentvar) 
            O3_ta.units = "umol/kg" 

            currentvar='N1_p_'+currentdir
            longname="phosphate/phosphorus {} boundary condition".format(lndirection) 
            N1_p = f1.createVariable(currentvar, 'f', ('ocean_time','s_rho', dim,), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
            N1_p.long_name = longname
            N1_p.field = "{}, scalar, series".format(currentvar) 
            N1_p.units = "mmol P/m^3" 

            currentvar='N3_n_'+currentdir
            longname="nitrate/nitrogen {} boundary condition".format(lndirection) 
            N3_n = f1.createVariable(currentvar, 'f', ('ocean_time','s_rho', dim,), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
            N3_n.long_name = longname
            N3_n.field = "{}, scalar, series".format(currentvar) 
            N3_n.units = "mmol N/m^3" 

            currentvar='N5_s_'+currentdir
            longname="silicate/silicate {} boundary condition".format(lndirection) 
            N5_s = f1.createVariable(currentvar, 'f', ('ocean_time','s_rho', dim,), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
            N5_s.long_name = longname
            N5_s.field = "{}, scalar, series".format(currentvar) 
            N5_s.units = "mmol Si/m^3" 

            currentvar='O2_o_'+currentdir
            longname="oxygen/oxygen {} boundary condition".format(lndirection) 
            O2_o = f1.createVariable(currentvar, 'f', ('ocean_time', 's_rho',dim,), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
            O2_o.long_name = longname
            O2_o.field = "{}, scalar, series".format(currentvar) 
            O2_o.units = "mmol O_2/m^3" 

    if confM2R.writeice:
        ageice_west = f1.createVariable('ageice_west', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
        ageice_west.long_name = "time-averaged age of the ice western boundary conditions"
        ageice_west.units = "years"
        ageice_west.time = "ocean_time"
        ageice_west.field = "ice age, scalar, series"
        #ageice_west.missing_value = grdROMS.fillval

        ageice_east = f1.createVariable('ageice_east', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
        ageice_east.long_name = "time-averaged age of the ice eastern boundary conditions"
        ageice_east.units = "years"
        ageice_east.time = "ocean_time"
        ageice_east.field = "ice age, scalar, series"
        #ageice_east.missing_value = grdROMS.fillval

        ageice_south = f1.createVariable('ageice_south', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                         fill_value=grdROMS.fillval)
        ageice_south.long_name = "time-averaged age of the ice southern boundary conditions"
        ageice_south.units = "years"
        ageice_south.time = "ocean_time"
        ageice_south.field = "ice age, scalar, series"
        #ageice_south.missing_value = grdROMS.fillval

        ageice_north = f1.createVariable('ageice_north', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                         fill_value=grdROMS.fillval)
        ageice_north.long_name = "time-averaged age of the ice northern boundary conditions"
        ageice_north.units = "years"
        ageice_north.time = "ocean_time"
        ageice_north.field = "ice age, scalar, series"
        #ageice_north.missing_value = grdROMS.fillval

        # ----------------------------------------

        uice_west = f1.createVariable('uice_west', 'f', ('ocean_time', 'eta_u',), zlib=myzlib,
                                      fill_value=grdROMS.fillval)
        uice_west.long_name = "time-averaged age of the u-component of ice velocity western boundary conditions"
        uice_west.units = "meter second-1"
        uice_west.time = "ocean_time"
        uice_west.field = "u-component of ice velocity, scalar, series"
        #uice_west.missing_value = grdROMS.fillval

        uice_east = f1.createVariable('uice_east', 'f', ('ocean_time', 'eta_u',), zlib=myzlib,
                                      fill_value=grdROMS.fillval)
        uice_east.long_name = "time-averaged age of the u-component of ice velocity eastern boundary conditions"
        uice_east.units = "meter second-1"
        uice_east.time = "ocean_time"
        uice_east.field = "u-component of ice velocity, scalar, series"
        #uice_east.missing_value = grdROMS.fillval

        uice_south = f1.createVariable('uice_south', 'f', ('ocean_time', 'xi_u',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        uice_south.long_name = "time-averaged age of the u-component of ice velocity southern boundary conditions"
        uice_south.units = "meter second-1"
        uice_south.time = "ocean_time"
        uice_south.field = "u-component of ice velocity, scalar, series"
        #uice_south.missing_value = grdROMS.fillval

        uice_north = f1.createVariable('uice_north', 'f', ('ocean_time', 'xi_u',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        uice_north.long_name = "time-averaged age of the u-component of ice velocity northern boundary conditions"
        uice_north.units = "meter second-1"
        uice_north.time = "ocean_time"
        uice_north.field = "u-component of ice velocity, scalar, series"
        #uice_north.missing_value = grdROMS.fillval

        # ----------------------------------------

        vice_west = f1.createVariable('vice_west', 'f', ('ocean_time', 'eta_v',), zlib=myzlib,
                                      fill_value=grdROMS.fillval)
        vice_west.long_name = "time-averaged age of the v-component of ice velocity western boundary conditions"
        vice_west.units = "meter second-1"
        uice_west.time = "ocean_time"
        vice_west.field = "v-component of ice velocity, scalar, series"
        #vice_west.missing_value = grdROMS.fillval

        vice_east = f1.createVariable('vice_east', 'f', ('ocean_time', 'eta_v',), zlib=myzlib,
                                      fill_value=grdROMS.fillval)
        vice_east.long_name = "time-averaged age of the v-component of ice velocity eastern boundary conditions"
        vice_east.units = "meter second-1"
        vice_east.time = "ocean_time"
        vice_east.field = "v-component of ice velocity, scalar, series"
        #vice_east.missing_value = grdROMS.fillval

        vice_south = f1.createVariable('vice_south', 'f', ('ocean_time', 'xi_v',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        vice_south.long_name = "time-averaged age of the v-component of ice velocity southern boundary conditions"
        vice_south.units = "meter second-1"
        vice_south.time = "ocean_time"
        vice_south.field = "v-component of ice velocity, scalar, series"
        #vice_south.missing_value = grdROMS.fillval

        vice_north = f1.createVariable('vice_north', 'f', ('ocean_time', 'xi_v',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        vice_north.long_name = "time-averaged age of the u-component of ice velocity northern boundary conditions"
        vice_north.units = "meter second-1"
        vice_north.time = "ocean_time"
        vice_north.field = "v-component of ice velocity, scalar, series"
        #vice_north.missing_value = grdROMS.fillval

        # ----------------------------------------

        aice_west = f1.createVariable('aice_west', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                      fill_value=grdROMS.fillval)
        aice_west.long_name = "time-averaged fraction of cell covered by ice western boundary conditions"
        aice_west.units = "%"
        aice_west.time = "ocean_time"
        aice_west.field = "ice concentration, scalar, series"
        #aice_west.missing_value = grdROMS.fillval

        aice_east = f1.createVariable('aice_east', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                      fill_value=grdROMS.fillval)
        aice_east.long_name = "time-averaged fraction of cell covered by ice eastern boundary conditions"
        aice_east.units = "%"
        aice_east.time = "ocean_time"
        aice_east.field = "ice concentration, scalar, series"
        #aice_east.missing_value = grdROMS.fillval

        aice_south = f1.createVariable('aice_south', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        aice_south.long_name = "time-averaged fraction of cell covered by ice southern boundary conditions"
        aice_south.units = "%"
        aice_south.time = "ocean_time"
        aice_south.field = "ice concentration, scalar, series"
        #aice_south.missing_value = grdROMS.fillval

        aice_north = f1.createVariable('aice_north', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        aice_north.long_name = "time-averaged fraction of cell covered by ice northern boundary conditions"
        aice_north.units = "%"
        aice_north.time = "ocean_time"
        aice_north.field = "ice concentration, scalar, series"
        #aice_north.missing_value = grdROMS.fillval

        # ----------------------------------------

        hice_west = f1.createVariable('hice_west', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                      fill_value=grdROMS.fillval)
        hice_west.long_name = "time-averaged ice thickness in cell western boundary conditions"
        hice_west.units = "meter"
        hice_west.time = "ocean_time"
        hice_west.field = "ice thickness, scalar, series"
        #hice_west.missing_value = grdROMS.fillval

        hice_east = f1.createVariable('hice_east', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                      fill_value=grdROMS.fillval)
        hice_east.long_name = "time-averaged ice thickness in cell eastern boundary conditions"
        hice_east.units = "meter"
        hice_east.time = "ocean_time"
        hice_east.field = "ice thickness, scalar, series"
        #hice_east.missing_value = grdROMS.fillval

        hice_south = f1.createVariable('hice_south', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        hice_south.long_name = "time-averaged ice thickness in cell southern boundary conditions"
        hice_south.units = "meter"
        hice_south.time = "ocean_time"
        hice_south.field = "ice thickness, scalar, series"
        #hice_south.missing_value = grdROMS.fillval

        hice_north = f1.createVariable('hice_north', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        hice_north.long_name = "time-averaged ice thickness in cell northern boundary conditions"
        hice_north.units = "meter"
        hice_north.time = "ocean_time"
        hice_north.field = "ice thickness, scalar, series"
        #hice_north.missing_value = grdROMS.fillval

        # ----------------------------------------

        snow_thick_west = f1.createVariable('snow_thick_west', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                            fill_value=grdROMS.fillval)
        snow_thick_west.long_name = "time-averaged ice thickness in cell western boundary conditions"
        snow_thick_west.units = "meter"
        snow_thick_west.time = "ocean_time"
        snow_thick_west.field = "snow thickness, scalar, series"
        #snow_thick_west.missing_value = grdROMS.fillval

        snow_thick_east = f1.createVariable('snow_thick_east', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                            fill_value=grdROMS.fillval)
        snow_thick_east.long_name = "time-averaged ice thickness in cell eastern boundary conditions"
        snow_thick_east.units = "meter"
        snow_thick_east.time = "ocean_time"
        snow_thick_east.field = "snow thickness, scalar, series"
        #snow_thick_east.missing_value = grdROMS.fillval

        snow_thick_south = f1.createVariable('snow_thick_south', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                             fill_value=grdROMS.fillval)
        snow_thick_south.long_name = "time-averaged ice thickness in cell southern boundary conditions"
        snow_thick_south.units = "meter"
        snow_thick_south.time = "ocean_time"
        snow_thick_south.field = "snow thickness, scalar, series"
        #snow_thick_south.missing_value = grdROMS.fillval

        snow_thick_north = f1.createVariable('snow_thick_north', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                             fill_value=grdROMS.fillval)
        snow_thick_north.long_name = "time-averaged ice thickness in cell northern boundary conditions"
        snow_thick_north.units = "meter"
        snow_thick_north.time = "ocean_time"
        snow_thick_north.field = "snow thickness, scalar, series"
        #snow_thick_north.missing_value = grdROMS.fillval

        # ----------------------------------------

        ti_west = f1.createVariable('ti_west', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                    fill_value=grdROMS.fillval)
        ti_west.long_name = "time-averaged interior ice temperature cell western boundary conditions"
        ti_west.units = "degrees Celcius"
        ti_west.time = "ocean_time"
        ti_west.field = "interior temperature, scalar, series"
        #ti_west.missing_value = grdROMS.fillval

        ti_east = f1.createVariable('ti_east', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                    fill_value=grdROMS.fillval)
        ti_east.long_name = "time-averaged interior ice temperature eastern boundary conditions"
        ti_east.units = "degrees Celcius"
        ti_east.time = "ocean_time"
        ti_east.field = "interior temperature, scalar, series"
        #ti_east.missing_value = grdROMS.fillval

        ti_south = f1.createVariable('ti_south', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                     fill_value=grdROMS.fillval)
        ti_south.long_name = "time-averaged interior ice temperature southern boundary conditions"
        ti_south.units = "degrees Celcius"
        ti_south.time = "ocean_time"
        ti_south.field = "interior temperature, scalar, series"
        #ti_south.missing_value = grdROMS.fillval

        ti_north = f1.createVariable('ti_north', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                     fill_value=grdROMS.fillval)
        ti_north.long_name = "time-averaged interior ice temperature northern boundary conditions"
        ti_north.units = "degrees Celcius"
        ti_north.time = "ocean_time"
        ti_north.field = "interior temperature, scalar, series"
        #ti_north.missing_value = grdROMS.fillval

        # ----------------------------------------

        sfwat_west = f1.createVariable('sfwat_west', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        sfwat_west.long_name = "time-averaged surface melt water thickness on ice western boundary conditions"
        sfwat_west.units = "meter"
        sfwat_west.time = "ocean_time"
        sfwat_west.field = "melt water thickness, scalar, series"
        #sfwat_west.missing_value = grdROMS.fillval

        sfwat_east = f1.createVariable('sfwat_east', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        sfwat_east.long_name = "time-averaged surface melt water thickness on ice eastern boundary conditions"
        sfwat_east.units = "meter"
        sfwat_east.time = "ocean_time"
        sfwat_east.field = "melt water thickness, scalar, series"
        #sfwat_east.missing_value = grdROMS.fillval

        sfwat_south = f1.createVariable('sfwat_south', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
        sfwat_south.long_name = "time-averaged surface melt water thickness on ice southern boundary conditions"
        sfwat_south.units = "meter"
        sfwat_south.time = "ocean_time"
        sfwat_south.field = "melt water thickness, scalar, series"
        #sfwat_south.missing_value = grdROMS.fillval

        sfwat_north = f1.createVariable('sfwat_north', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
        sfwat_north.long_name = "time-averaged surface melt water thickness on ice northern boundary conditions"
        sfwat_north.units = "meter"
        sfwat_north.time = "ocean_time"
        sfwat_north.field = "melt water thickness, scalar, series"
        #sfwat_north.missing_value = grdROMS.fillval

        # ----------------------------------------

        tisrf_west = f1.createVariable('tisrf_west', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        tisrf_west.long_name = "time-averaged temperature of ice surfacewestern boundary conditions"
        tisrf_west.units = "degrees Celcius"
        tisrf_west.time = "ocean_time"
        tisrf_west.field = "surface temperature, scalar, series"
        #tisrf_west.missing_value = grdROMS.fillval

        tisrf_east = f1.createVariable('tisrf_east', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        tisrf_east.long_name = "time-averaged temperature of ice surface eastern boundary conditions"
        tisrf_east.units = "degrees Celcius"
        tisrf_east.time = "ocean_time"
        tisrf_east.field = "surface temperature, scalar, series"
        #tisrf_east.missing_value = grdROMS.fillval

        tisrf_south = f1.createVariable('tisrf_south', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
        tisrf_south.long_name = "time-averaged temperature of ice surface southern boundary conditions"
        tisrf_south.units = "degrees Celcius"
        tisrf_south.time = "ocean_time"
        tisrf_south.field = "surface temperature, scalar, series"
        #tisrf_south.missing_value = grdROMS.fillval

        tisrf_north = f1.createVariable('tisrf_north', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
        tisrf_north.long_name = "time-averaged temperature of ice surface northern boundary conditions"
        tisrf_north.units = "degrees Celcius"
        tisrf_north.time = "ocean_time"
        tisrf_north.field = "surface temperature, scalar, series"
        #tisrf_north.missing_value = grdROMS.fillval

        # ----------------------------------------

        sig11_west = f1.createVariable('sig11_west', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        sig11_west.long_name = "time-averaged internal ice stress 11 component boundary conditions"
        sig11_west.units = "Newton meter-1"
        sig11_west.time = "ocean_time"
        sig11_west.field = "ice stress 11, scalar, series"
        #sig11_west.missing_value = grdROMS.fillval

        sig11_east = f1.createVariable('sig11_east', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        sig11_east.long_name = "time-averaged internal ice stress 11 component eastern boundary conditions"
        sig11_east.units = "Newton meter-1"
        sig11_east.time = "ocean_time"
        sig11_east.field = "ice stress 11, scalar, series"
        #sig11_east.missing_value = grdROMS.fillval

        sig11_south = f1.createVariable('sig11_south', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
        sig11_south.long_name = "time-averaged internal ice stress 11 componentsouthern boundary conditions"
        sig11_south.units = "Newton meter-1"
        sig11_south.time = "ocean_time"
        sig11_south.field = "ice stress 11, scalar, series"
        #sig11_south.missing_value = grdROMS.fillval

        sig11_north = f1.createVariable('sig11_north', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
        sig11_north.long_name = "time-averaged internal ice stress 11 component northern boundary conditions"
        sig11_north.units = "Newton meter-1"
        sig11_north.time = "ocean_time"
        sig11_north.field = "ice stress 11, scalar, series"
        #sig11_north.missing_value = grdROMS.fillval

        # ----------------------------------------

        sig12_west = f1.createVariable('sig12_west', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        sig12_west.long_name = "time-averaged internal ice stress 12 component boundary conditions"
        sig12_west.units = "Newton meter-1"
        sig12_west.time = "ocean_time"
        sig12_west.field = "ice stress 12, scalar, series"
        #sig12_west.missing_value = grdROMS.fillval

        sig12_east = f1.createVariable('sig12_east', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        sig12_east.long_name = "time-averaged internal ice stress 12 component eastern boundary conditions"
        sig12_east.units = "Newton meter-1"
        sig12_east.time = "ocean_time"
        sig12_east.field = "ice stress 12, scalar, series"
        #sig12_east.missing_value = grdROMS.fillval

        sig12_south = f1.createVariable('sig12_south', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
        sig12_south.long_name = "time-averaged internal ice stress 12 componentsouthern boundary conditions"
        sig12_south.units = "Newton meter-1"
        sig12_south.time = "ocean_time"
        sig12_south.field = "ice stress 12, scalar, series"
        #sig12_south.missing_value = grdROMS.fillval

        sig12_north = f1.createVariable('sig12_north', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
        sig12_north.long_name = "time-averaged internal ice stress 12 component northern boundary conditions"
        sig12_north.units = "Newton meter-1"
        sig12_north.time = "ocean_time"
        sig12_north.field = "ice stress 12, scalar, series"
        #sig12_north.missing_value = grdROMS.fillval

        # ----------------------------------------

        sig22_west = f1.createVariable('sig22_west', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        sig22_west.long_name = "time-averaged internal ice stress 22 component boundary conditions"
        sig22_west.units = "Newton meter-1"
        sig22_west.time = "ocean_time"
        sig22_west.field = "ice stress 22, scalar, series"
        #sig22_west.missing_value = grdROMS.fillval

        sig22_east = f1.createVariable('sig22_east', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        sig22_east.long_name = "time-averaged internal ice stress 22 component eastern boundary conditions"
        sig22_east.units = "Newton meter-1"
        sig22_east.time = "ocean_time"
        sig22_east.field = "ice stress 22, scalar, series"
        #sig22_east.missing_value = grdROMS.fillval

        sig22_south = f1.createVariable('sig22_south', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
        sig22_south.long_name = "time-averaged internal ice stress 22 componentsouthern boundary conditions"
        sig22_south.units = "Newton meter-1"
        sig22_south.time = "ocean_time"
        sig22_south.field = "ice stress 22, scalar, series"
        #sig22_south.missing_value = grdROMS.fillval

        sig22_north = f1.createVariable('sig22_north', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
        sig22_north.long_name = "time-averaged internal ice stress 22 component northern boundary conditions"
        sig22_north.units = "Newton meter-1"
        sig22_north.time = "ocean_time"
        sig22_north.field = "ice stress 22, scalar, series"
        #sig22_north.missing_value = grdROMS.fillval

        # ----------------------------------------

    f1.close()
def test_isValid():

    fd, path = tempfile.mkstemp()

    def raiseWarning(warningString):
        generalTF = SOFAGeneralTF(path, 'r')
        with pytest.warns(SOFAWarning) as record:
            assert not generalTF.isValid()
        assert warningString in str(record[-1].message)
        generalTF.close()

    ## Validity of SOFAFile

    # File not valid
    rootgrp = Dataset(path, 'w', format='NETCDF4')
    rootgrp.close()
    raiseWarning('Missing required attribute: APIName')
    os.remove(path)

    # SOFA File valid
    rootgrp = Dataset(path, 'w', format='NETCDF4')
    # Attributes
    rootgrp.Conventions = 'SOFA'
    rootgrp.Version = '1.0'
    rootgrp.SOFAConventions = 'GeneralFIRE'
    rootgrp.SOFAConventionsVersion = '0.1'
    rootgrp.APIName = 'pysofaconventions'
    rootgrp.APIVersion = '0.1'
    rootgrp.APIVersion = '0.1'
    rootgrp.AuthorContact = '*****@*****.**'
    rootgrp.Organization = 'Eurecat - UPF'
    rootgrp.License = 'WTFPL - Do What the F**k You Want to Public License'
    rootgrp.DataType = 'FIRE'
    rootgrp.RoomType = 'reverberant'
    rootgrp.DateCreated = time.ctime(time.time())
    rootgrp.DateModified = time.ctime(time.time())
    rootgrp.Title = 'testpysofaconventions'
    # Dimensions
    rootgrp.createDimension('I', 1)
    rootgrp.createDimension('N', 2)
    rootgrp.createDimension('C', 3)
    rootgrp.createDimension('M', 4)
    rootgrp.createDimension('R', 5)
    rootgrp.createDimension('E', 6)
    # Variables
    sr = rootgrp.createVariable('Data.SamplingRate', 'f8', ('I', ))
    sr.Units = 'hertz'
    rootgrp.createVariable('Data.Delay', 'f8', ('M', 'R', 'E'))
    rootgrp.createVariable('Data.IR', 'f8', ('M', 'R', 'E', 'N'))
    listenerPositionVar = rootgrp.createVariable('ListenerPosition', 'f8',
                                                 ('I', 'C'))
    listenerPositionVar.Units = 'metre'
    listenerPositionVar.Type = 'cartesian'
    sourcePositionVar = rootgrp.createVariable('SourcePosition', 'f8',
                                               ('I', 'C'))
    sourcePositionVar.Units = 'metre'
    sourcePositionVar.Type = 'cartesian'
    receiverPositionVar = rootgrp.createVariable('ReceiverPosition', 'f8',
                                                 ('R', 'C', 'I'))
    receiverPositionVar.Units = 'metre'
    receiverPositionVar.Type = 'cartesian'
    emitterPositionVar = rootgrp.createVariable('EmitterPosition', 'f8',
                                                ('E', 'C', 'M'))
    emitterPositionVar.Units = 'metre'
    emitterPositionVar.Type = 'cartesian'
    rootgrp.close()

    ## Specific validity

    # Data type should be FIR
    raiseWarning('DataType is not "TF", got: "FIRE"')
    # Adjust data type and required variables to change
    rootgrp = Dataset(path, 'a')
    rootgrp.DataType = 'TF'
    rootgrp.createVariable('Data.Real', 'f8', ('M', 'R', 'N'))
    rootgrp.createVariable('Data.Imag', 'f8', ('M', 'R', 'N'))
    n = rootgrp.createVariable('N', 'f8', ('N', ))
    n.Units = 'hertz'

    rootgrp.close()

    # SOFAConventions should be GeneralTF
    raiseWarning('SOFAConventions is not "GeneralTF", got: "GeneralFIRE"')
    rootgrp = Dataset(path, 'a')
    rootgrp.SOFAConventions = 'GeneralTF'
    rootgrp.close()

    # All right
    generalTF = SOFAGeneralTF(path, 'r')
    assert generalTF.isValid()
    generalTF.close()
    os.remove(path)
Пример #37
0
def createBryFile(confM2R):
    if (confM2R.myformat == 'NETCDF4'):
        myzlib = True
    else:
        myzlib = False
    grdROMS = confM2R.grdROMS

    if os.path.exists(confM2R.bryname):
        os.remove(confM2R.bryname)
    print(('\n=>Creating initial Boundary (BRY) file {}'.format(confM2R.bryname)))

    f1 = Dataset(confM2R.bryname, mode='w', format=confM2R.myformat)
    f1.title = "Boundary forcing file (BRY) used for forcing of the ROMS model"
    f1.description = "Created for the {} grid file".format(confM2R.romsgridpath)
    f1.grdFile = "{}".format(confM2R.romsgridpath)
    f1.history = 'Created ' + time.ctime(time.time())
    f1.source = "{} ({})".format(confM2R.authorname, confM2R.authoremail)
    f1.type = "File in {} format created using MODEL2ROMS".format(confM2R.myformat)
    f1.link = "https://github.com/trondkr/model2roms"
    f1.Conventions = "CF-1.0"

    """ Define dimensions """
    f1.createDimension('xi_rho', grdROMS.xi_rho)
    f1.createDimension('eta_rho', grdROMS.eta_rho)
    f1.createDimension('xi_u', grdROMS.xi_u)
    f1.createDimension('eta_u', grdROMS.eta_u)
    f1.createDimension('xi_v', grdROMS.xi_v)
    f1.createDimension('eta_v', grdROMS.eta_v)
    f1.createDimension('xi_psi', grdROMS.xi_psi)
    f1.createDimension('eta_psi', grdROMS.eta_psi)
    f1.createDimension('ocean_time', None)
    f1.createDimension('s_rho', len(grdROMS.s_rho))
    f1.createDimension('s_w', len(grdROMS.s_w))

    vnc = f1.createVariable('lon_rho', 'd', ('eta_rho', 'xi_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
    vnc.long_name = 'Longitude of RHO-points'
    vnc.units = 'degree_east'
    vnc.standard_name = 'longitude'
    vnc[:, :] = grdROMS.lon_rho

    vnc = f1.createVariable('lat_rho', 'd', ('eta_rho', 'xi_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
    vnc.long_name = 'Latitude of RHO-points'
    vnc.units = 'degree_north'
    vnc.standard_name = 'latitude'
    vnc[:, :] = grdROMS.lat_rho

    vnc = f1.createVariable('lon_u', 'd', ('eta_u', 'xi_u',), zlib=myzlib, fill_value=grdROMS.fillval)
    vnc.long_name = 'Longitude of U-points'
    vnc.units = 'degree_east'
    vnc.standard_name = 'longitude'
    vnc[:, :] = grdROMS.lon_u

    vnc = f1.createVariable('lat_u', 'd', ('eta_u', 'xi_u',), zlib=myzlib, fill_value=grdROMS.fillval)
    vnc.long_name = 'Latitude of U-points'
    vnc.units = 'degree_north'
    vnc.standard_name = 'latitude'
    vnc[:, :] = grdROMS.lat_u

    vnc = f1.createVariable('lon_v', 'd', ('eta_v', 'xi_v',), zlib=myzlib, fill_value=grdROMS.fillval)
    vnc.long_name = 'Longitude of V-points'
    vnc.units = 'degree_east'
    vnc.standard_name = 'longitude'
    vnc[:, :] = grdROMS.lon_v

    vnc = f1.createVariable('lat_v', 'd', ('eta_v', 'xi_v',), zlib=myzlib, fill_value=grdROMS.fillval)
    vnc.long_name = 'Latitude of V-points'
    vnc.units = 'degree_north'
    vnc.standard_name = 'latitude'
    vnc[:, :] = grdROMS.lat_v

    vnc = f1.createVariable('lat_psi', 'd', ('eta_psi', 'xi_psi',), zlib=myzlib, fill_value=grdROMS.fillval)
    vnc.long_name = 'Latitude of PSI-points'
    vnc.units = 'degree_north'
    vnc.standard_name = 'latitude'
    vnc[:, :] = grdROMS.lat_psi

    vnc = f1.createVariable('lon_psi', 'd', ('eta_psi', 'xi_psi',), zlib=myzlib, fill_value=grdROMS.fillval)
    vnc.long_name = 'Longitude of PSI-points'
    vnc.units = 'degree_east'
    vnc.standard_name = 'longitude'
    vnc[:, :] = grdROMS.lon_psi

    vnc = f1.createVariable('h', 'd', ('eta_rho', 'xi_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
    vnc.long_name = "Bathymetry at RHO-points"
    vnc.units = "meter"
    vnc.coordinates = "lat_rho lon_rho"
    vnc.field = "bath, scalar"
    vnc[:, :] = grdROMS.h

    vnc = f1.createVariable('s_rho', 'd', ('s_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
    vnc.long_name = "S-coordinate at RHO-points"
    vnc.valid_min = -1.
    vnc.valid_max = 0.

    if grdROMS.vtransform == 2:
        vnc.standard_name = "ocean_s_coordinate_g2"
        vnc.formula_terms = "s: s_rho C: Cs_r eta: zeta depth: h depth_c: hc"
    if grdROMS.vtransform == 1:
        vnc.standard_name = "ocean_s_coordinate_g1"
        vnc.formula_terms = "s: s_rho C: Cs_r eta: zeta depth: h depth_c: hc"
    vnc.field = "s_rho, scalar"
    vnc[:] = grdROMS.s_rho

    vnc = f1.createVariable('s_w', 'd', ('s_w',), zlib=myzlib, fill_value=grdROMS.fillval)
    vnc.long_name = "S-coordinate at W-points"
    vnc.valid_min = -1.
    vnc.valid_max = 0.
    if grdROMS.vtransform == 2:
        vnc.standard_name = "ocean_s_coordinate_g2"
        vnc.formula_terms = "s: s_w C: Cs_w eta: zeta depth: h depth_c: hc"
    if grdROMS.vtransform == 1:
        vnc.standard_name = "ocean_s_coordinate_g1"
        vnc.formula_terms = "s: s_w C: Cs_w eta: zeta depth: h depth_c: hc"
    vnc.field = "s_w, scalar"
    vnc[:] = grdROMS.s_w

    vnc = f1.createVariable('Cs_r', 'd', ('s_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
    vnc.long_name = "S-coordinate stretching curves at RHO-points"
    vnc.valid_min = -1.
    vnc.valid_max = 0.
    vnc.field = "Cs_rho, scalar"
    vnc[:] = grdROMS.Cs_rho

    vnc = f1.createVariable('Cs_w', 'd', ('s_w',), zlib=myzlib, fill_value=grdROMS.fillval)
    vnc.long_name = "S-coordinate stretching curves at W-points"
    vnc.valid_min = -1.
    vnc.valid_max = 0.
    vnc.field = "Cs_w, scalar"
    vnc[:] = grdROMS.Cs_w

    vnc = f1.createVariable('hc', 'd')
    vnc.long_name = "S-coordinate parameter, critical depth";
    vnc.units = "meter"
    vnc[:] = grdROMS.hc

    vnc = f1.createVariable('z_r', 'd', ('s_rho', 'eta_rho', 'xi_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
    vnc.long_name = "Sigma layer to depth matrix";
    vnc.units = "meter"
    vnc[:, :, :] = grdROMS.z_r

    vnc = f1.createVariable('Tcline', 'd')
    vnc.long_name = "S-coordinate surface/bottom layer width"
    vnc.units = "meter"
    vnc[:] = grdROMS.tcline

    vnc = f1.createVariable('theta_s', 'd')
    vnc.long_name = "S-coordinate surface control parameter"
    vnc[:] = grdROMS.theta_s

    vnc = f1.createVariable('theta_b', 'd')
    vnc.long_name = "S-coordinate bottom control parameter"
    vnc[:] = grdROMS.theta_b

    vnc = f1.createVariable('angle', 'd', ('eta_rho', 'xi_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
    vnc.long_name = "angle between xi axis and east"
    vnc.units = "radian"

    v_time = f1.createVariable('ocean_time', 'd', ('ocean_time',), zlib=myzlib, fill_value=grdROMS.fillval)
    
    v_time.long_name = 'seconds since 1948-01-01 00:00:00'
    v_time.units = 'seconds since 1948-01-01 00:00:00'
    v_time.field = 'time, scalar, series'

    if (confM2R.indatatype == "NORESM"):
        v_time.calendar = 'noleap'
    else:
        v_time.calendar = 'standard'

    v_temp_west = f1.createVariable('temp_west', 'f', ('ocean_time', 's_rho', 'eta_rho',), zlib=myzlib,
                                    fill_value=grdROMS.fillval)
    v_temp_west.long_name = "potential temperature western boundary condition"
    v_temp_west.units = "Celsius"
    v_temp_west.field = "temp_west, scalar, series"
    #v_temp_west.missing_value = grdROMS.fillval
    v_temp_west.time = "ocean_time"

    v_temp_east = f1.createVariable('temp_east', 'f', ('ocean_time', 's_rho', 'eta_rho',), zlib=myzlib,
                                    fill_value=grdROMS.fillval)
    v_temp_east.long_name = "potential temperature eastern boundary condition"
    v_temp_east.units = "Celsius"
    v_temp_east.field = "temp_east, scalar, series"
    #v_temp_east.missing_value = grdROMS.fillval
    v_temp_east.time = "ocean_time"

    v_temp_south = f1.createVariable('temp_south', 'f', ('ocean_time', 's_rho', 'xi_rho',), zlib=myzlib,
                                     fill_value=grdROMS.fillval)
    v_temp_south.long_name = "potential temperature southern boundary condition"
    v_temp_south.units = "Celsius"
    v_temp_south.field = "temp_south, scalar, series"
    #v_temp_south.missing_value = grdROMS.fillval
    v_temp_south.time = "ocean_time"

    v_temp_north = f1.createVariable('temp_north', 'f', ('ocean_time', 's_rho', 'xi_rho',), zlib=myzlib,
                                     fill_value=grdROMS.fillval)
    v_temp_north.long_name = "potential temperature northern boundary condition"
    v_temp_north.units = "Celsius"
    v_temp_north.field = "temp_north, scalar, series"
    #v_temp_north.missing_value = grdROMS.fillval
    v_temp_north.time = "ocean_time"

    v_salt_west = f1.createVariable('salt_west', 'f', ('ocean_time', 's_rho', 'eta_rho',), zlib=myzlib,
                                    fill_value=grdROMS.fillval)
    v_salt_west.long_name = "salinity western boundary condition"
    v_salt_west.field = "salt_west, scalar, series"
    #v_salt_west.missing_value = grdROMS.fillval
    v_salt_west.time = "ocean_time"

    v_salt_east = f1.createVariable('salt_east', 'f', ('ocean_time', 's_rho', 'eta_rho',), zlib=myzlib,
                                    fill_value=grdROMS.fillval)
    v_salt_east.long_name = "salinity eastern boundary condition"
    v_salt_east.field = "salt_east, scalar, series"
    #v_salt_east.missing_value = grdROMS.fillval
    v_salt_east.time = "ocean_time"

    v_salt_south = f1.createVariable('salt_south', 'f', ('ocean_time', 's_rho', 'xi_rho',), zlib=myzlib,
                                     fill_value=grdROMS.fillval)
    v_salt_south.long_name = "salinity southern boundary condition"
    v_salt_south.field = "salt_south, scalar, series"
    #v_salt_south.missing_value = grdROMS.fillval
    v_salt_south.time = "ocean_time"

    v_salt_north = f1.createVariable('salt_north', 'f', ('ocean_time', 's_rho', 'xi_rho',), zlib=myzlib,
                                     fill_value=grdROMS.fillval)
    v_salt_north.long_name = "salinity northern boundary condition"
    v_salt_north.field = "salt_north, scalar, series"
    #v_salt_north.missing_value = grdROMS.fillval
    v_salt_north.time = "ocean_time"

    v_ssh_west = f1.createVariable('zeta_west', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                   fill_value=grdROMS.fillval)
    v_ssh_west.long_name = "free-surface western boundary condition"
    v_ssh_west.units = "meter"
    v_ssh_west.field = "zeta_west, scalar, series"
    #v_ssh_west.missing_value = grdROMS.fillval
    v_ssh_west.time = "ocean_time"

    v_ssh_east = f1.createVariable('zeta_east', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                   fill_value=grdROMS.fillval)
    v_ssh_east.long_name = "free-surface eastern boundary condition"
    v_ssh_east.units = "meter"
    v_ssh_east.field = "zeta_east, scalar, series"
    #v_ssh_east.missing_value = grdROMS.fillval
    v_ssh_east.time = "ocean_time"

    v_ssh_south = f1.createVariable('zeta_south', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                    fill_value=grdROMS.fillval)
    v_ssh_south.long_name = "free-surface southern boundary condition"
    v_ssh_south.units = "meter"
    v_ssh_south.field = "zeta_south, scalar, series"
    #v_ssh_south.missing_value = grdROMS.fillval
    v_ssh_south.time = "ocean_time"

    v_ssh_north = f1.createVariable('zeta_north', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                    fill_value=grdROMS.fillval)
    v_ssh_north.long_name = "free-surface northern boundary condition"
    v_ssh_north.units = "meter"
    v_ssh_north.field = "zeta_north, scalar, series"
    #v_ssh_north.missing_value = grdROMS.fillval
    v_ssh_north.time = "ocean_time"

    v_u_west = f1.createVariable('u_west', 'f', ('ocean_time', 's_rho', 'eta_u',), zlib=myzlib,
                                 fill_value=grdROMS.fillval)
    v_u_west.long_name = "3D u-momentum western boundary condition"
    v_u_west.units = "meter second-1"
    v_u_west.field = "u_west, scalar, series"
    #v_u_west.missing_value = grdROMS.fillval
    v_u_west.time = "ocean_time"

    v_u_east = f1.createVariable('u_east', 'f', ('ocean_time', 's_rho', 'eta_u',), zlib=myzlib,
                                 fill_value=grdROMS.fillval)
    v_u_east.long_name = "3D u-momentum eastern boundary condition"
    v_u_east.units = "meter second-1"
    v_u_east.field = "u_east, scalar, series"
    #v_u_east.missing_value = grdROMS.fillval
    v_u_east.time = "ocean_time"

    v_u_south = f1.createVariable('u_south', 'f', ('ocean_time', 's_rho', 'xi_u',), zlib=myzlib,
                                  fill_value=grdROMS.fillval)
    v_u_south.long_name = "3D u-momentum southern boundary condition"
    v_u_south.units = "meter second-1"
    v_u_south.field = "u_south, scalar, series"
    #v_u_south.missing_value = grdROMS.fillval
    v_u_south.time = "ocean_time"

    v_u_north = f1.createVariable('u_north', 'f', ('ocean_time', 's_rho', 'xi_u',), zlib=myzlib,
                                  fill_value=grdROMS.fillval)
    v_u_north.long_name = "3D u-momentum northern boundary condition"
    v_u_north.units = "meter second-1"
    v_u_north.field = "u_north, scalar, series"
    #v_u_north.missing_value = grdROMS.fillval
    v_u_north.time = "ocean_time"

    v_v_west = f1.createVariable('v_west', 'f', ('ocean_time', 's_rho', 'eta_v',), zlib=myzlib,
                                 fill_value=grdROMS.fillval)
    v_v_west.long_name = "3D v-momentum western boundary condition"
    v_v_west.units = "meter second-1"
    v_v_west.field = "v_west, scalar, series"
    #v_v_west.missing_value = grdROMS.fillval
    v_v_west.time = "ocean_time"

    v_v_east = f1.createVariable('v_east', 'f', ('ocean_time', 's_rho', 'eta_v',), zlib=myzlib,
                                 fill_value=grdROMS.fillval)
    v_v_east.long_name = "3D v-momentum eastern boundary condition"
    v_v_east.units = "meter second-1"
    v_v_east.field = "v_east, scalar, series"
    #v_v_east.missing_value = grdROMS.fillval
    v_v_east.time = "ocean_time"

    v_v_south = f1.createVariable('v_south', 'f', ('ocean_time', 's_rho', 'xi_v',), zlib=myzlib,
                                  fill_value=grdROMS.fillval)
    v_v_south.long_name = "3D v-momentum southern boundary condition"
    v_v_south.units = "meter second-1"
    v_v_south.field = "v_south, scalar, series"
    #v_v_south.missing_value = grdROMS.fillval
    v_v_south.time = "ocean_time"

    v_v_north = f1.createVariable('v_north', 'f', ('ocean_time', 's_rho', 'xi_v',), zlib=myzlib,
                                  fill_value=grdROMS.fillval)
    v_v_north.long_name = "3D v-momentum northern boundary condition"
    v_v_north.units = "meter second-1"
    v_v_north.field = "v_north, scalar, series"
    #v_v_north.missing_value = grdROMS.fillval
    v_v_north.time = "ocean_time"

    v_vbar_west = f1.createVariable('vbar_west', 'f', ('ocean_time', 'eta_v',), zlib=myzlib,
                                    fill_value=grdROMS.fillval)
    v_vbar_west.long_name = "2D v-momentum western boundary condition"
    v_vbar_west.units = "meter second-1"
    v_vbar_west.field = "vbar_west, scalar, series"
    #v_vbar_west.missing_value = grdROMS.fillval
    v_vbar_west.time = "ocean_time"

    v_vbar_east = f1.createVariable('vbar_east', 'f', ('ocean_time', 'eta_v',), zlib=myzlib,
                                    fill_value=grdROMS.fillval)
    v_vbar_east.long_name = "2D v-momentum eastern boundary condition"
    v_vbar_east.units = "meter second-1"
    v_vbar_east.field = "vbar_east, scalar, series"
    #v_vbar_east.missing_value = grdROMS.fillval
    v_vbar_east.time = "ocean_time"

    v_vbar_south = f1.createVariable('vbar_south', 'f', ('ocean_time', 'xi_v',), zlib=myzlib,
                                     fill_value=grdROMS.fillval)
    v_vbar_south.long_name = "2D v-momentum southern boundary condition"
    v_vbar_south.units = "meter second-1"
    v_vbar_south.field = "vbar_south, scalar, series"
    #v_vbar_south.missing_value = grdROMS.fillval
    v_vbar_south.time = "ocean_time"

    v_vbar_north = f1.createVariable('vbar_north', 'f', ('ocean_time', 'xi_v',), zlib=myzlib,
                                     fill_value=grdROMS.fillval)
    v_vbar_north.long_name = "2D v-momentum northern boundary condition"
    v_vbar_north.units = "meter second-1"
    v_vbar_north.field = "vbar_north, scalar, series"
    #v_vbar_north.missing_value = grdROMS.fillval
    v_vbar_north.time = "ocean_time"

    v_ubar_west = f1.createVariable('ubar_west', 'f', ('ocean_time', 'eta_u',), zlib=myzlib,
                                    fill_value=grdROMS.fillval)
    v_ubar_west.long_name = "2D u-momentum western boundary condition"
    v_ubar_west.units = "meter second-1"
    v_ubar_west.field = "ubar_west, scalar, series"
   # v_ubar_west.missing_value = grdROMS.fillval
    v_ubar_west.time = "ocean_time"

    v_ubar_east = f1.createVariable('ubar_east', 'f', ('ocean_time', 'eta_u',), zlib=myzlib,
                                    fill_value=grdROMS.fillval)
    v_ubar_east.long_name = "2D u-momentum eastern boundary condition"
    v_ubar_east.units = "meter second-1"
    v_ubar_east.field = "ubar_east, scalar, series"
    #v_ubar_east.missing_value = grdROMS.fillval
    v_ubar_east.time = "ocean_time"

    v_ubar_south = f1.createVariable('ubar_south', 'f', ('ocean_time', 'xi_u',), zlib=myzlib,
                                     fill_value=grdROMS.fillval)
    v_ubar_south.long_name = "2D u-momentum southern boundary condition"
    v_ubar_south.units = "meter second-1"
    v_ubar_south.field = "ubar_south, scalar, series"
    #v_ubar_south.missing_value = grdROMS.fillval
    v_ubar_south.time = "ocean_time"

    v_ubar_north = f1.createVariable('ubar_north', 'f', ('ocean_time', 'xi_u',), zlib=myzlib,
                                     fill_value=grdROMS.fillval)
    v_ubar_north.long_name = "2D u-momentum northern boundary condition"
    v_ubar_north.units = "meter second-1"
    v_ubar_north.field = "ubar_north, scalar, series"
    #v_ubar_north.missing_value = grdROMS.fillval
    v_ubar_north.time = "ocean_time"

    if confM2R.writebcg:
        directions=['east','west','north','south']
        dimens=['eta_rho','eta_rho','xi_rho','xi_rho']

        lndirections=['eastern','western','northern','southern']
        for currentdir,lndirection,dim in zip(directions, lndirections,dimens):
            currentvar='O3_c_'+currentdir
            longname="carbonate/total dissolved inorganic carbon {} boundary condition".format(lndirection) 
            O3_c = f1.createVariable(currentvar, 'f', ('ocean_time', 's_rho', dim,), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
            O3_c.long_name = longname
            O3_c.field = "{}, scalar, series".format(currentvar) 
            O3_c.units = "mmol C/m^3" 

            currentvar='O3_TA_'+currentdir
            longname="carbonate/bioalkalinity {} boundary condition".format(lndirection) 
            O3_ta = f1.createVariable(currentvar, 'f', ('ocean_time', 's_rho', dim,), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
            O3_ta.long_name = longname
            O3_ta.field = "{}, scalar, series".format(currentvar) 
            O3_ta.units = "umol/kg" 

            currentvar='N1_p_'+currentdir
            longname="phosphate/phosphorus {} boundary condition".format(lndirection) 
            N1_p = f1.createVariable(currentvar, 'f', ('ocean_time','s_rho', dim,), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
            N1_p.long_name = longname
            N1_p.field = "{}, scalar, series".format(currentvar) 
            N1_p.units = "mmol P/m^3" 

            currentvar='N3_n_'+currentdir
            longname="nitrate/nitrogen {} boundary condition".format(lndirection) 
            N3_n = f1.createVariable(currentvar, 'f', ('ocean_time','s_rho', dim,), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
            N3_n.long_name = longname
            N3_n.field = "{}, scalar, series".format(currentvar) 
            N3_n.units = "mmol N/m^3" 

            currentvar='N5_s_'+currentdir
            longname="silicate/silicate {} boundary condition".format(lndirection) 
            N5_s = f1.createVariable(currentvar, 'f', ('ocean_time','s_rho', dim,), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
            N5_s.long_name = longname
            N5_s.field = "{}, scalar, series".format(currentvar) 
            N5_s.units = "mmol Si/m^3" 

            currentvar='O2_o_'+currentdir
            longname="oxygen/oxygen {} boundary condition".format(lndirection) 
            O2_o = f1.createVariable(currentvar, 'f', ('ocean_time', 's_rho',dim,), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
            O2_o.long_name = longname
            O2_o.field = "{}, scalar, series".format(currentvar) 
            O2_o.units = "mmol O_2/m^3" 

    if confM2R.writeice:
        ageice_west = f1.createVariable('ageice_west', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
        ageice_west.long_name = "time-averaged age of the ice western boundary conditions"
        ageice_west.units = "years"
        ageice_west.time = "ocean_time"
        ageice_west.field = "ice age, scalar, series"
        #ageice_west.missing_value = grdROMS.fillval

        ageice_east = f1.createVariable('ageice_east', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
        ageice_east.long_name = "time-averaged age of the ice eastern boundary conditions"
        ageice_east.units = "years"
        ageice_east.time = "ocean_time"
        ageice_east.field = "ice age, scalar, series"
        #ageice_east.missing_value = grdROMS.fillval

        ageice_south = f1.createVariable('ageice_south', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                         fill_value=grdROMS.fillval)
        ageice_south.long_name = "time-averaged age of the ice southern boundary conditions"
        ageice_south.units = "years"
        ageice_south.time = "ocean_time"
        ageice_south.field = "ice age, scalar, series"
        #ageice_south.missing_value = grdROMS.fillval

        ageice_north = f1.createVariable('ageice_north', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                         fill_value=grdROMS.fillval)
        ageice_north.long_name = "time-averaged age of the ice northern boundary conditions"
        ageice_north.units = "years"
        ageice_north.time = "ocean_time"
        ageice_north.field = "ice age, scalar, series"
        #ageice_north.missing_value = grdROMS.fillval

        # ----------------------------------------

        uice_west = f1.createVariable('uice_west', 'f', ('ocean_time', 'eta_u',), zlib=myzlib,
                                      fill_value=grdROMS.fillval)
        uice_west.long_name = "time-averaged age of the u-component of ice velocity western boundary conditions"
        uice_west.units = "meter second-1"
        uice_west.time = "ocean_time"
        uice_west.field = "u-component of ice velocity, scalar, series"
        #uice_west.missing_value = grdROMS.fillval

        uice_east = f1.createVariable('uice_east', 'f', ('ocean_time', 'eta_u',), zlib=myzlib,
                                      fill_value=grdROMS.fillval)
        uice_east.long_name = "time-averaged age of the u-component of ice velocity eastern boundary conditions"
        uice_east.units = "meter second-1"
        uice_east.time = "ocean_time"
        uice_east.field = "u-component of ice velocity, scalar, series"
        #uice_east.missing_value = grdROMS.fillval

        uice_south = f1.createVariable('uice_south', 'f', ('ocean_time', 'xi_u',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        uice_south.long_name = "time-averaged age of the u-component of ice velocity southern boundary conditions"
        uice_south.units = "meter second-1"
        uice_south.time = "ocean_time"
        uice_south.field = "u-component of ice velocity, scalar, series"
        #uice_south.missing_value = grdROMS.fillval

        uice_north = f1.createVariable('uice_north', 'f', ('ocean_time', 'xi_u',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        uice_north.long_name = "time-averaged age of the u-component of ice velocity northern boundary conditions"
        uice_north.units = "meter second-1"
        uice_north.time = "ocean_time"
        uice_north.field = "u-component of ice velocity, scalar, series"
        #uice_north.missing_value = grdROMS.fillval

        # ----------------------------------------

        vice_west = f1.createVariable('vice_west', 'f', ('ocean_time', 'eta_v',), zlib=myzlib,
                                      fill_value=grdROMS.fillval)
        vice_west.long_name = "time-averaged age of the v-component of ice velocity western boundary conditions"
        vice_west.units = "meter second-1"
        uice_west.time = "ocean_time"
        vice_west.field = "v-component of ice velocity, scalar, series"
        #vice_west.missing_value = grdROMS.fillval

        vice_east = f1.createVariable('vice_east', 'f', ('ocean_time', 'eta_v',), zlib=myzlib,
                                      fill_value=grdROMS.fillval)
        vice_east.long_name = "time-averaged age of the v-component of ice velocity eastern boundary conditions"
        vice_east.units = "meter second-1"
        vice_east.time = "ocean_time"
        vice_east.field = "v-component of ice velocity, scalar, series"
        #vice_east.missing_value = grdROMS.fillval

        vice_south = f1.createVariable('vice_south', 'f', ('ocean_time', 'xi_v',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        vice_south.long_name = "time-averaged age of the v-component of ice velocity southern boundary conditions"
        vice_south.units = "meter second-1"
        vice_south.time = "ocean_time"
        vice_south.field = "v-component of ice velocity, scalar, series"
        #vice_south.missing_value = grdROMS.fillval

        vice_north = f1.createVariable('vice_north', 'f', ('ocean_time', 'xi_v',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        vice_north.long_name = "time-averaged age of the u-component of ice velocity northern boundary conditions"
        vice_north.units = "meter second-1"
        vice_north.time = "ocean_time"
        vice_north.field = "v-component of ice velocity, scalar, series"
        #vice_north.missing_value = grdROMS.fillval

        # ----------------------------------------

        aice_west = f1.createVariable('aice_west', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                      fill_value=grdROMS.fillval)
        aice_west.long_name = "time-averaged fraction of cell covered by ice western boundary conditions"
        aice_west.units = "%"
        aice_west.time = "ocean_time"
        aice_west.field = "ice concentration, scalar, series"
        #aice_west.missing_value = grdROMS.fillval

        aice_east = f1.createVariable('aice_east', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                      fill_value=grdROMS.fillval)
        aice_east.long_name = "time-averaged fraction of cell covered by ice eastern boundary conditions"
        aice_east.units = "%"
        aice_east.time = "ocean_time"
        aice_east.field = "ice concentration, scalar, series"
        #aice_east.missing_value = grdROMS.fillval

        aice_south = f1.createVariable('aice_south', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        aice_south.long_name = "time-averaged fraction of cell covered by ice southern boundary conditions"
        aice_south.units = "%"
        aice_south.time = "ocean_time"
        aice_south.field = "ice concentration, scalar, series"
        #aice_south.missing_value = grdROMS.fillval

        aice_north = f1.createVariable('aice_north', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        aice_north.long_name = "time-averaged fraction of cell covered by ice northern boundary conditions"
        aice_north.units = "%"
        aice_north.time = "ocean_time"
        aice_north.field = "ice concentration, scalar, series"
        #aice_north.missing_value = grdROMS.fillval

        # ----------------------------------------

        hice_west = f1.createVariable('hice_west', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                      fill_value=grdROMS.fillval)
        hice_west.long_name = "time-averaged ice thickness in cell western boundary conditions"
        hice_west.units = "meter"
        hice_west.time = "ocean_time"
        hice_west.field = "ice thickness, scalar, series"
        #hice_west.missing_value = grdROMS.fillval

        hice_east = f1.createVariable('hice_east', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                      fill_value=grdROMS.fillval)
        hice_east.long_name = "time-averaged ice thickness in cell eastern boundary conditions"
        hice_east.units = "meter"
        hice_east.time = "ocean_time"
        hice_east.field = "ice thickness, scalar, series"
        #hice_east.missing_value = grdROMS.fillval

        hice_south = f1.createVariable('hice_south', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        hice_south.long_name = "time-averaged ice thickness in cell southern boundary conditions"
        hice_south.units = "meter"
        hice_south.time = "ocean_time"
        hice_south.field = "ice thickness, scalar, series"
        #hice_south.missing_value = grdROMS.fillval

        hice_north = f1.createVariable('hice_north', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        hice_north.long_name = "time-averaged ice thickness in cell northern boundary conditions"
        hice_north.units = "meter"
        hice_north.time = "ocean_time"
        hice_north.field = "ice thickness, scalar, series"
        #hice_north.missing_value = grdROMS.fillval

        # ----------------------------------------

        snow_thick_west = f1.createVariable('snow_thick_west', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                            fill_value=grdROMS.fillval)
        snow_thick_west.long_name = "time-averaged ice thickness in cell western boundary conditions"
        snow_thick_west.units = "meter"
        snow_thick_west.time = "ocean_time"
        snow_thick_west.field = "snow thickness, scalar, series"
        #snow_thick_west.missing_value = grdROMS.fillval

        snow_thick_east = f1.createVariable('snow_thick_east', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                            fill_value=grdROMS.fillval)
        snow_thick_east.long_name = "time-averaged ice thickness in cell eastern boundary conditions"
        snow_thick_east.units = "meter"
        snow_thick_east.time = "ocean_time"
        snow_thick_east.field = "snow thickness, scalar, series"
        #snow_thick_east.missing_value = grdROMS.fillval

        snow_thick_south = f1.createVariable('snow_thick_south', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                             fill_value=grdROMS.fillval)
        snow_thick_south.long_name = "time-averaged ice thickness in cell southern boundary conditions"
        snow_thick_south.units = "meter"
        snow_thick_south.time = "ocean_time"
        snow_thick_south.field = "snow thickness, scalar, series"
        #snow_thick_south.missing_value = grdROMS.fillval

        snow_thick_north = f1.createVariable('snow_thick_north', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                             fill_value=grdROMS.fillval)
        snow_thick_north.long_name = "time-averaged ice thickness in cell northern boundary conditions"
        snow_thick_north.units = "meter"
        snow_thick_north.time = "ocean_time"
        snow_thick_north.field = "snow thickness, scalar, series"
        #snow_thick_north.missing_value = grdROMS.fillval

        # ----------------------------------------

        ti_west = f1.createVariable('ti_west', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                    fill_value=grdROMS.fillval)
        ti_west.long_name = "time-averaged interior ice temperature cell western boundary conditions"
        ti_west.units = "degrees Celcius"
        ti_west.time = "ocean_time"
        ti_west.field = "interior temperature, scalar, series"
        #ti_west.missing_value = grdROMS.fillval

        ti_east = f1.createVariable('ti_east', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                    fill_value=grdROMS.fillval)
        ti_east.long_name = "time-averaged interior ice temperature eastern boundary conditions"
        ti_east.units = "degrees Celcius"
        ti_east.time = "ocean_time"
        ti_east.field = "interior temperature, scalar, series"
        #ti_east.missing_value = grdROMS.fillval

        ti_south = f1.createVariable('ti_south', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                     fill_value=grdROMS.fillval)
        ti_south.long_name = "time-averaged interior ice temperature southern boundary conditions"
        ti_south.units = "degrees Celcius"
        ti_south.time = "ocean_time"
        ti_south.field = "interior temperature, scalar, series"
        #ti_south.missing_value = grdROMS.fillval

        ti_north = f1.createVariable('ti_north', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                     fill_value=grdROMS.fillval)
        ti_north.long_name = "time-averaged interior ice temperature northern boundary conditions"
        ti_north.units = "degrees Celcius"
        ti_north.time = "ocean_time"
        ti_north.field = "interior temperature, scalar, series"
        #ti_north.missing_value = grdROMS.fillval

        # ----------------------------------------

        sfwat_west = f1.createVariable('sfwat_west', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        sfwat_west.long_name = "time-averaged surface melt water thickness on ice western boundary conditions"
        sfwat_west.units = "meter"
        sfwat_west.time = "ocean_time"
        sfwat_west.field = "melt water thickness, scalar, series"
        #sfwat_west.missing_value = grdROMS.fillval

        sfwat_east = f1.createVariable('sfwat_east', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        sfwat_east.long_name = "time-averaged surface melt water thickness on ice eastern boundary conditions"
        sfwat_east.units = "meter"
        sfwat_east.time = "ocean_time"
        sfwat_east.field = "melt water thickness, scalar, series"
        #sfwat_east.missing_value = grdROMS.fillval

        sfwat_south = f1.createVariable('sfwat_south', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
        sfwat_south.long_name = "time-averaged surface melt water thickness on ice southern boundary conditions"
        sfwat_south.units = "meter"
        sfwat_south.time = "ocean_time"
        sfwat_south.field = "melt water thickness, scalar, series"
        #sfwat_south.missing_value = grdROMS.fillval

        sfwat_north = f1.createVariable('sfwat_north', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
        sfwat_north.long_name = "time-averaged surface melt water thickness on ice northern boundary conditions"
        sfwat_north.units = "meter"
        sfwat_north.time = "ocean_time"
        sfwat_north.field = "melt water thickness, scalar, series"
        #sfwat_north.missing_value = grdROMS.fillval

        # ----------------------------------------

        tisrf_west = f1.createVariable('tisrf_west', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        tisrf_west.long_name = "time-averaged temperature of ice surfacewestern boundary conditions"
        tisrf_west.units = "degrees Celcius"
        tisrf_west.time = "ocean_time"
        tisrf_west.field = "surface temperature, scalar, series"
        #tisrf_west.missing_value = grdROMS.fillval

        tisrf_east = f1.createVariable('tisrf_east', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        tisrf_east.long_name = "time-averaged temperature of ice surface eastern boundary conditions"
        tisrf_east.units = "degrees Celcius"
        tisrf_east.time = "ocean_time"
        tisrf_east.field = "surface temperature, scalar, series"
        #tisrf_east.missing_value = grdROMS.fillval

        tisrf_south = f1.createVariable('tisrf_south', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
        tisrf_south.long_name = "time-averaged temperature of ice surface southern boundary conditions"
        tisrf_south.units = "degrees Celcius"
        tisrf_south.time = "ocean_time"
        tisrf_south.field = "surface temperature, scalar, series"
        #tisrf_south.missing_value = grdROMS.fillval

        tisrf_north = f1.createVariable('tisrf_north', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
        tisrf_north.long_name = "time-averaged temperature of ice surface northern boundary conditions"
        tisrf_north.units = "degrees Celcius"
        tisrf_north.time = "ocean_time"
        tisrf_north.field = "surface temperature, scalar, series"
        #tisrf_north.missing_value = grdROMS.fillval

        # ----------------------------------------

        sig11_west = f1.createVariable('sig11_west', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        sig11_west.long_name = "time-averaged internal ice stress 11 component boundary conditions"
        sig11_west.units = "Newton meter-1"
        sig11_west.time = "ocean_time"
        sig11_west.field = "ice stress 11, scalar, series"
        #sig11_west.missing_value = grdROMS.fillval

        sig11_east = f1.createVariable('sig11_east', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        sig11_east.long_name = "time-averaged internal ice stress 11 component eastern boundary conditions"
        sig11_east.units = "Newton meter-1"
        sig11_east.time = "ocean_time"
        sig11_east.field = "ice stress 11, scalar, series"
        #sig11_east.missing_value = grdROMS.fillval

        sig11_south = f1.createVariable('sig11_south', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
        sig11_south.long_name = "time-averaged internal ice stress 11 componentsouthern boundary conditions"
        sig11_south.units = "Newton meter-1"
        sig11_south.time = "ocean_time"
        sig11_south.field = "ice stress 11, scalar, series"
        #sig11_south.missing_value = grdROMS.fillval

        sig11_north = f1.createVariable('sig11_north', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
        sig11_north.long_name = "time-averaged internal ice stress 11 component northern boundary conditions"
        sig11_north.units = "Newton meter-1"
        sig11_north.time = "ocean_time"
        sig11_north.field = "ice stress 11, scalar, series"
        #sig11_north.missing_value = grdROMS.fillval

        # ----------------------------------------

        sig12_west = f1.createVariable('sig12_west', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        sig12_west.long_name = "time-averaged internal ice stress 12 component boundary conditions"
        sig12_west.units = "Newton meter-1"
        sig12_west.time = "ocean_time"
        sig12_west.field = "ice stress 12, scalar, series"
        #sig12_west.missing_value = grdROMS.fillval

        sig12_east = f1.createVariable('sig12_east', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        sig12_east.long_name = "time-averaged internal ice stress 12 component eastern boundary conditions"
        sig12_east.units = "Newton meter-1"
        sig12_east.time = "ocean_time"
        sig12_east.field = "ice stress 12, scalar, series"
        #sig12_east.missing_value = grdROMS.fillval

        sig12_south = f1.createVariable('sig12_south', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
        sig12_south.long_name = "time-averaged internal ice stress 12 componentsouthern boundary conditions"
        sig12_south.units = "Newton meter-1"
        sig12_south.time = "ocean_time"
        sig12_south.field = "ice stress 12, scalar, series"
        #sig12_south.missing_value = grdROMS.fillval

        sig12_north = f1.createVariable('sig12_north', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
        sig12_north.long_name = "time-averaged internal ice stress 12 component northern boundary conditions"
        sig12_north.units = "Newton meter-1"
        sig12_north.time = "ocean_time"
        sig12_north.field = "ice stress 12, scalar, series"
        #sig12_north.missing_value = grdROMS.fillval

        # ----------------------------------------

        sig22_west = f1.createVariable('sig22_west', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        sig22_west.long_name = "time-averaged internal ice stress 22 component boundary conditions"
        sig22_west.units = "Newton meter-1"
        sig22_west.time = "ocean_time"
        sig22_west.field = "ice stress 22, scalar, series"
        #sig22_west.missing_value = grdROMS.fillval

        sig22_east = f1.createVariable('sig22_east', 'f', ('ocean_time', 'eta_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
        sig22_east.long_name = "time-averaged internal ice stress 22 component eastern boundary conditions"
        sig22_east.units = "Newton meter-1"
        sig22_east.time = "ocean_time"
        sig22_east.field = "ice stress 22, scalar, series"
        #sig22_east.missing_value = grdROMS.fillval

        sig22_south = f1.createVariable('sig22_south', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
        sig22_south.long_name = "time-averaged internal ice stress 22 componentsouthern boundary conditions"
        sig22_south.units = "Newton meter-1"
        sig22_south.time = "ocean_time"
        sig22_south.field = "ice stress 22, scalar, series"
        #sig22_south.missing_value = grdROMS.fillval

        sig22_north = f1.createVariable('sig22_north', 'f', ('ocean_time', 'xi_rho',), zlib=myzlib,
                                        fill_value=grdROMS.fillval)
        sig22_north.long_name = "time-averaged internal ice stress 22 component northern boundary conditions"
        sig22_north.units = "Newton meter-1"
        sig22_north.time = "ocean_time"
        sig22_north.field = "ice stress 22, scalar, series"
        #sig22_north.missing_value = grdROMS.fillval

        # ----------------------------------------

    f1.close()
Пример #38
0
def create_searise_grid(filename, grid_spacing, **kwargs):
    '''
    Create dummy grid description
    '''

    if 'fileformat' not in kwargs.keys():
        fileformat = 'NETCDF4'
    else:
        fileformat = str.upper(kwargs['fileformat'])
        
    
    xdim = 'x'
    ydim = 'y'

    # define output grid, these are the extents of the Bamber domain
    e0 = -800000.0
    n0 = -3400000.0
    e1 = 700000.0
    n1 = -600000.0

    # Shift to cell centers
    e0 += grid_spacing / 2
    n0 += grid_spacing / 2
    e1 -= grid_spacing / 2
    n1 -= grid_spacing / 2

    de = dn = grid_spacing  # m
    M = int((e1 - e0) / de) + 1
    N = int((n1 - n0) / dn) + 1

    easting = np.linspace(e0, e1, M)
    northing = np.linspace(n0, n1, N)
    ee, nn = np.meshgrid(easting, northing)

    # Set up SeaRISE Projection
    projection = "+proj=stere +ellps=WGS84 +datum=WGS84 +lon_0=-39 +lat_0=90 +lat_ts=71 +units=m"
    proj = Proj(projection)

    lon, lat = proj(ee, nn, inverse=True)

    # number of grid corners
    grid_corners = 4
    # grid corner dimension name
    grid_corner_dim_name = "nv4"

    # array holding x-component of grid corners
    gc_easting = np.zeros((M, grid_corners))
    # array holding y-component of grid corners
    gc_northing = np.zeros((N, grid_corners))
    # array holding the offsets from the cell centers
    # in x-direction (counter-clockwise)
    de_vec = np.array([-de / 2, de / 2, de / 2, -de / 2])
    # array holding the offsets from the cell centers
    # in y-direction (counter-clockwise)
    dn_vec = np.array([-dn / 2, -dn / 2, dn / 2, dn / 2])
    # array holding lat-component of grid corners
    gc_lat = np.zeros((N, M, grid_corners))
    # array holding lon-component of grid corners
    gc_lon = np.zeros((N, M, grid_corners))
    
    for corner in range(0, grid_corners):
        ## grid_corners in x-direction
        gc_easting[:, corner] = easting + de_vec[corner]
        # grid corners in y-direction
        gc_northing[:, corner] = northing + dn_vec[corner]
        # meshgrid of grid corners in x-y space
        gc_ee, gc_nn = np.meshgrid(
            gc_easting[:, corner], gc_northing[:, corner])
        # project grid corners from x-y to lat-lon space
        gc_lon[:, :, corner], gc_lat[:, :, corner] = proj(
            gc_ee, gc_nn, inverse=True)


    nc = CDF(filename, 'w', format=fileformat)

    nc.createDimension(xdim, size=easting.shape[0])
    nc.createDimension(ydim, size=northing.shape[0])
    
    var = xdim
    var_out = nc.createVariable(var, 'f', dimensions=(xdim))
    var_out.axis = xdim
    var_out.long_name = "X-coordinate in Cartesian system"
    var_out.standard_name = "projection_x_coordinate"
    var_out.units = "meters"
    var_out[:] = easting

    var = ydim
    var_out = nc.createVariable(var, 'f', dimensions=(ydim))
    var_out.axis = ydim
    var_out.long_name = "Y-coordinate in Cartesian system"
    var_out.standard_name = "projection_y_coordinate"
    var_out.units = "meters"
    var_out[:] = northing

    var = 'lon'
    var_out = nc.createVariable(var, 'f', dimensions=(ydim, xdim))
    var_out.units = "degrees_east"
    var_out.valid_range = -180., 180.
    var_out.standard_name = "longitude"
    var_out.bounds = "lon_bnds"
    var_out[:] = lon

    var = 'lat'
    var_out = nc.createVariable(var, 'f', dimensions=(ydim, xdim))
    var_out.units = "degrees_north"
    var_out.valid_range = -90., 90.
    var_out.standard_name = "latitude"
    var_out.bounds = "lat_bnds"
    var_out[:] = lat

    nc.createDimension(grid_corner_dim_name, size=grid_corners)

    var = 'lon_bnds'
    # Create variable 'lon_bnds'
    var_out = nc.createVariable(
        var, 'f', dimensions=(ydim, xdim, grid_corner_dim_name))
    # Assign units to variable 'lon_bnds'
    var_out.units = "degreesE"
    # Assign values to variable 'lon_nds'
    var_out[:] = gc_lon
        
    var = 'lat_bnds'
    # Create variable 'lat_bnds'
    var_out = nc.createVariable(
        var, 'f', dimensions=(ydim, xdim, grid_corner_dim_name))
    # Assign units to variable 'lat_bnds'
    var_out.units = "degreesN"
    # Assign values to variable 'lat_bnds'
    var_out[:] = gc_lat

    var = 'dummy'
    var_out = nc.createVariable(
        var,
        'f',
        dimensions=(
            "y",
            "x"),
        fill_value=-2e9)
    var_out.units = "meters"
    var_out.long_name = "Just A Dummy"
    var_out.comment = "This is just a dummy variable for CDO."
    var_out.grid_mapping = "mapping"
    var_out.coordinates = "lon lat"
    var_out[:] = 0.

    mapping = nc.createVariable("mapping", 'c')
    mapping.ellipsoid = "WGS84"
    mapping.false_easting = 0.
    mapping.false_northing = 0.
    mapping.grid_mapping_name = "polar_stereographic"
    mapping.latitude_of_projection_origin = 90.
    mapping.standard_parallel = 71.
    mapping.straight_vertical_longitude_from_pole = -39.
    
    from time import asctime
    historystr = 'Created ' + asctime() + '\n'
    nc.history = historystr
    nc.proj4 = projection
    nc.Conventions = 'CF-1.5'
    nc.close()
def create_nc(filein):
    ''' Creates the NetCDF file to save the final averages
        in.
    '''
    filedir = filein[:-26]+'monthly_means/'
    filename = filein[-26:-20]+'.monthlymean.theta.nc'
    f = Dataset(filedir+filename,'w')

    # Create dimensions
    time = f.createDimension('time',None)
    z_hybrid_height = f.createDimension('z_hybrid_height',180)
    latitude = f.createDimension('latitude',768)
    longitude = f.createDimension('longitude',1024)
    bound = f.createDimension('bound',2)

    # Create variables (added s on the end to differentiate between dimensions
    #                   and variables)
    times = f.createVariable('time','f4',('time',))
    z_hybrid_heights = f.createVariable('z_hybrid_height','f4',
                                        ('z_hybrid_height',))
    latitudes = f.createVariable('latitude','f4',('latitude',))
    bounds_latitude = f.createVariable('bounds_latitude','f8',
                                       ('latitude','bound',))
    longitudes = f.createVariable('longitude','f4',('longitude',))
    bounds_longitude = f.createVariable('bounds_longitude','f8',
                                        ('longitude','bound',))
    u = f.createVariable('theta','f4',('time','z_hybrid_height','latitude',
                                   'longitude',),zlib=True)
    
    # Add in attributes
    f.Conventions = 'CF-1.6'
    times.units = 'months since 1991-03-01 00:00:00'
    times.standard_name = 'time'
    times.calendar = '360_day'
    times.axis = 'T'
    z_hybrid_heights.positive = 'up'
    z_hybrid_heights.long_name = 'atmosphere hybrid height coordinate'
    z_hybrid_heights.standard_name = 'atmosphere_hybrid_height_coordinate'
    z_hybrid_heights.units = 'm'
    z_hybrid_heights.axis = 'Z'
    latitudes.bounds = 'bounds_latitude'
    latitudes.units = 'degrees_north'
    latitudes.standard_name = 'latitude'
    latitudes.point_spacing = 'even'
    latitudes.axis = 'Y'
    longitudes.bounds = 'bounds_longitude'
    longitudes.modulo = 360.
    longitudes.point_spacing = 'even'
    longitudes.standard_name = 'longitude'
    longitudes.units = 'degrees_east'
    longitudes.axis = 'X'
    longitudes.topology = 'circular'
    u.long_name = 'THETA'
    u.standard_name = 'air_potential_temperature'
    u.units = 'K'
    u.missing_value = -1.073742e+099

    # need to add in a bit that saves the values of time, lat and lon
    f2 = Dataset(filein)
    
    lat = f2.variables['latitude']
    lon = f2.variables['longitude']
    height = f2.variables['z_hybrid_height']

    latitudes[:] = lat[:]
    longitudes[:] = lon[:]
    z_hybrid_heights[:] = height[:]

    f.close()
    f2.close()
Пример #40
0
def create_uGrid_ncdf(filename,
                        nMesh2_node, nMesh2_edge, nMesh2_face, nMaxMesh2_face_nodes,
                        Mesh2_edge_nodes, Mesh2_edge_faces, Mesh2_face_nodes, Mesh2_face_edges,
                        Mesh2_node_x, Mesh2_node_y, Mesh2_edge_x, Mesh2_edge_y,
                        Mesh2_face_x, Mesh2_face_y, Mesh2_face_center_x, Mesh2_face_center_y,
                        Mesh2_face_area=None,
                        Mesh2_edge_x_bnd=None, Mesh2_edge_y_bnd=None,
                        Mesh2_face_x_bnd=None, Mesh2_face_y_bnd=None,
                        coord_type='geographic',
                        dim_nMesh2_layer2d=1, dim_nMesh2_layer3d=1, dim_nMesh2_class_names_strlen=20, dim_nMesh2_suspension_classes=1,
                        start_index=0,
                        log=True):
    '''
    Function creates a NETCDF4 file. Data is stored in accordance with
    BAW convention for 2D Unstructured Grid (http://www.baw.de/methoden/index.php5/NetCDF_Unstrukturiertes_Gitter)
    
    input:
        filename - string, containing filename of netcdf file to be created.
        nMesh2_node, nMesh2_edge, nMesh2_face - integers, indicating number of nodes/edges/faces in a grid
        nMaxMesh2_face_nodes - integer, showing maximum number of nodes/edges in a face (could be 3 or 4)

        Mesh2_edge_nodes, Mesh2_edge_faces, Mesh2_face_nodes, Mesh2_face_edges,     |
        Mesh2_node_x, Mesh2_node_y, Mesh2_edge_x, Mesh2_edge_y,                     | => 1D numpy arrays with data
        Mesh2_face_x, Mesh2_face_y, Mesh2_face_center_x, Mesh2_face_center_y,       |
        Mesh2_face_area                                                             |

        coord_type  - string indicating in which variable to store passed data, in x,y or in lon,lat
                by default - 'geographic'
                'cartesian' <> 'geographic'
    '''


    # --------------------------------------------------
    #                   Creating ncdf
    # --------------------------------------------------
    root_grp = Dataset(filename, mode='w', format='NETCDF4')

    root_grp.title = 'mossco >>> uGrid conversion'
    root_grp.history = 'Createded on ' + time.ctime(time.time())
    #root_grp.comment = 'WARNING! Latitude and longitude valueas are stored as X,Y coordinates. Therefore any calculations that involve length or area in X or Y dimension are wrong'
    root_grp.Conventions = 'CF-1.6'
    #root_grp.institution = 'Bundesanstalt fuer Wasserbau - Federal Waterways Engineering and Research Institute'
    root_grp.references = 'http://www.baw.de/ und http://www.baw.de/methoden/index.php5/NetCDF'
    #root_grp.source = ''



    # --------------------------------------------------
    #                   Creating dimensions
    # --------------------------------------------------
    root_grp.createDimension('nMesh2_node', nMesh2_node)
    root_grp.createDimension('nMesh2_edge', nMesh2_edge)
    root_grp.createDimension('nMesh2_face', nMesh2_face)
    root_grp.createDimension('nMaxMesh2_face_nodes', nMaxMesh2_face_nodes)
    root_grp.createDimension('two', 2)
    root_grp.createDimension('three', 3)
    root_grp.createDimension('nMesh2_time', 1)
    root_grp.createDimension('nMesh2_data_time', None)  # None stands for UNLIMITED
    if dim_nMesh2_layer2d is not None:
        root_grp.createDimension('nMesh2_layer_2d', dim_nMesh2_layer2d)
    if dim_nMesh2_layer3d is not None:
        root_grp.createDimension('nMesh2_layer_3d', dim_nMesh2_layer3d)
    root_grp.createDimension('nMesh2_class_names_strlen', dim_nMesh2_class_names_strlen)
    root_grp.createDimension('nMesh2_suspension_classes', dim_nMesh2_suspension_classes)

    if coord_type in ['cartesian', 'both'] :
        # **********************************************************************************************************************************************
        #
        #                  1) Local coordinates
        #
        # **********************************************************************************************************************************************
        # --------------------------------------------------
        #                                   1.1) NODES
        # --------------------------------------------------

        ncVar_Mesh2_node_x = root_grp.createVariable('Mesh2_node_x', 'f8', ('nMesh2_node'), fill_value=False)
        ncVar_Mesh2_node_x.long_name = 'x-Koordinate der Knoten eines 2D-Gitters'
        ncVar_Mesh2_node_x.units = 'm'
        ncVar_Mesh2_node_x.name_id = 1650
        ncVar_Mesh2_node_x.standard_name = 'projection_x_coordinate'
        ncVar_Mesh2_node_x[:] = Mesh2_node_x[:]

        ncVar_Mesh2_node_y = root_grp.createVariable('Mesh2_node_y', 'f8', ('nMesh2_node'), fill_value=False)
        ncVar_Mesh2_node_y.long_name = 'y-Koordinate der Knoten eines 2D-Gitters'
        ncVar_Mesh2_node_y.units = 'm'
        ncVar_Mesh2_node_y.name_id = 1651
        ncVar_Mesh2_node_y.standard_name = 'projection_y_coordinate'
        ncVar_Mesh2_node_y[:] = Mesh2_node_y[:]

        # --------------------------------------------------
        #                                   1.2) EDGES
        # --------------------------------------------------

        ncVar_Mesh2_edge_x = root_grp.createVariable('Mesh2_edge_x', 'f8', ('nMesh2_edge'), fill_value=False)
        ncVar_Mesh2_edge_x.long_name = 'x-Koordinate der Kanten eines 2D-Gitters, Kantenmitte'
        ncVar_Mesh2_edge_x.units = 'm'
        ncVar_Mesh2_edge_x.name_id = 1650
        ncVar_Mesh2_edge_x.bounds = 'Mesh2_edge_x_bnd'
        ncVar_Mesh2_edge_x.standard_name = 'projection_x_coordinate'
        ncVar_Mesh2_edge_x[:] = Mesh2_edge_x[:]

        ncVar_Mesh2_edge_y = root_grp.createVariable('Mesh2_edge_y', 'f8', ('nMesh2_edge'), fill_value=False)
        ncVar_Mesh2_edge_y.long_name = 'y-Koordinate der Kanten eines 2D-Gitters, Kantenmitte'
        ncVar_Mesh2_edge_y.units = 'm'
        ncVar_Mesh2_edge_y.name_id = 1651
        ncVar_Mesh2_edge_y.bounds = 'Mesh2_edge_y_bnd'
        ncVar_Mesh2_edge_y.standard_name = 'projection_y_coordinate'
        ncVar_Mesh2_edge_y[:] = Mesh2_edge_y[:]

        # --------------------------------------------------
        #                                   1.3) FACES
        # --------------------------------------------------

        ncVar_Mesh2_face_x = root_grp.createVariable('Mesh2_face_x', 'f8', ('nMesh2_face'), fill_value=False)
        ncVar_Mesh2_face_x.long_name = 'x-Koordinate der Faces (Polygone) eines 2D-Gitters, Schwerpunkt'
        ncVar_Mesh2_face_x.units = 'm'
        ncVar_Mesh2_face_x.name_id = 1650
        ncVar_Mesh2_face_x.bounds = 'Mesh2_face_x_bnd'
        ncVar_Mesh2_face_x.standard_name = 'projection_x_coordinate'
        ncVar_Mesh2_face_x[:] = Mesh2_face_x[:]

        ncVar_Mesh2_face_y = root_grp.createVariable('Mesh2_face_y', 'f8', ('nMesh2_face'), fill_value=False)
        ncVar_Mesh2_face_y.long_name = 'y-Koordinate der Faces (Polygone) eines 2D-Gitters, Schwerpunkt'
        ncVar_Mesh2_face_y.units = 'm'
        ncVar_Mesh2_face_y.name_id = 1651
        ncVar_Mesh2_face_y.bounds = 'Mesh2_face_y_bnd'
        ncVar_Mesh2_face_y.standard_name = 'projection_y_coordinate'
        ncVar_Mesh2_face_y[:] = Mesh2_face_y[:]

        ncVar_Mesh2_face_center_x = root_grp.createVariable('Mesh2_face_center_x', 'f8', ('nMesh2_face'), fill_value=False)
        ncVar_Mesh2_face_center_x.long_name = 'x-Koordinate der Faces (Polygone) eines 2D-Gitters, Umkreismittelpunkt'
        ncVar_Mesh2_face_center_x.units = 'm'
        ncVar_Mesh2_face_center_x.name_id = 1650
        ncVar_Mesh2_face_center_x.bounds = 'Mesh2_face_x_bnd'
        ncVar_Mesh2_face_center_x.standard_name = 'projection_x_coordinate'
        ncVar_Mesh2_face_center_x[:] = Mesh2_face_center_x[:]

        ncVar_Mesh2_face_center_y = root_grp.createVariable('Mesh2_face_center_y', 'f8', ('nMesh2_face'), fill_value=False)
        ncVar_Mesh2_face_center_y.long_name = 'y-Koordinate der Faces (Polygone) eines 2D-Gitters, Umkreismittelpunkt'
        ncVar_Mesh2_face_center_y.units = 'm'
        ncVar_Mesh2_face_center_y.name_id = 1651
        ncVar_Mesh2_face_center_y.bounds = 'Mesh2_face_y_bnd'
        ncVar_Mesh2_face_center_y.standard_name = 'projection_y_coordinate'
        ncVar_Mesh2_face_center_y[:] = Mesh2_face_center_y[:]

        # --------------------------------------------------
        #                                   1.4) OPTIONAL / BORDERS
        # --------------------------------------------------
        if Mesh2_edge_x_bnd is not None and Mesh2_edge_y_bnd is not None:
            ncVar_Mesh2_edge_x_bnd = root_grp.createVariable('Mesh2_edge_x_bnd', 'f8', ('nMesh2_edge', 'two'), fill_value=False)
            ncVar_Mesh2_edge_y_bnd = root_grp.createVariable('Mesh2_edge_y_bnd', 'f8', ('nMesh2_edge', 'two'), fill_value=False)
            ncVar_Mesh2_edge_x_bnd[...] = Mesh2_edge_x_bnd
            ncVar_Mesh2_edge_y_bnd[...] = Mesh2_edge_y_bnd
        if Mesh2_face_x_bnd is not None and Mesh2_face_y_bnd is not None:
            ncVar_Mesh2_face_x_bnd = root_grp.createVariable('Mesh2_face_x_bnd', 'f8', ('nMesh2_face', 'nMaxMesh2_face_nodes'), fill_value=-999)
            ncVar_Mesh2_face_y_bnd = root_grp.createVariable('Mesh2_face_y_bnd', 'f8', ('nMesh2_face', 'nMaxMesh2_face_nodes'), fill_value=-999)
            ncVar_Mesh2_face_x_bnd[...] = Mesh2_face_x_bnd
            ncVar_Mesh2_face_y_bnd[...] = Mesh2_face_y_bnd

        if coord_type == 'cartesian':
            # ------------------------------------------------------------------------------------
            #                                   3.5) Topology
            # ------------------------------------------------------------------------------------

            ncVar_Mesh2 = root_grp.createVariable('Mesh2', 'i', fill_value=False)
            ncVar_Mesh2.long_name = 'UnTRIM Gitternetz, Drei- und Vierecke gemischt, kein SubGrid'
            ncVar_Mesh2.cf_role = 'mesh_topology'
            ncVar_Mesh2.dimensionality = 2
            ncVar_Mesh2.node_coordinates = 'Mesh2_node_x Mesh2_node_y Mesh2_node_lon Mesh2_node_lat'
            ncVar_Mesh2.edge_coordinates = 'Mesh2_edge_x Mesh2_edge_y Mesh2_edge_lon Mesh2_edge_lat'
            ncVar_Mesh2.face_coordinates = 'Mesh2_face_x Mesh2_face_y Mesh2_face_lon Mesh2_face_lat Mesh2_face_center_x Mesh2_face_center_y Mesh2_face_center_lon Mesh2_face_center_lat'
            ncVar_Mesh2.edge_node_connectivity = 'Mesh2_edge_nodes'
            ncVar_Mesh2.edge_face_connectivity = 'Mesh2_edge_faces'
            ncVar_Mesh2.face_node_connectivity = 'Mesh2_face_nodes'
            ncVar_Mesh2.face_edge_connectivity = 'Mesh2_face_edges'

            # ------------------------------------------------------------------------------------
            #                                   3.6) Area
            # ------------------------------------------------------------------------------------
            if Mesh2_face_area is not None:
                ncVar_Mesh2_face_area = root_grp.createVariable('Mesh2_face_area', 'f8', ('nMesh2_face'), fill_value=1.e+31)
                ncVar_Mesh2_face_area.long_name = 'Zellenflaeche'
                ncVar_Mesh2_face_area.units = 'm2'
                ncVar_Mesh2_face_area.name_id = 1656
                ncVar_Mesh2_face_area.valid_range = [Mesh2_face_area[:].min(), Mesh2_face_area[:].max()]
                ncVar_Mesh2_face_area.coordinates = 'Mesh2_face_x Mesh2_face_y Mesh2_face_lon Mesh2_face_lat'
                ncVar_Mesh2_face_area.grid_mapping = 'Mesh2_crs'
                ncVar_Mesh2_face_area.standard_name = 'cell_area'
                ncVar_Mesh2_face_area.mesh = 'Mesh2'
                ncVar_Mesh2_face_area.location = 'face'
                ncVar_Mesh2_face_area [:] = Mesh2_face_area[:]
    
    elif coord_type in ['geographic', 'both']:
        # *********************************************************************************************************************************************
        #
        #                  2) Georaphical coordinates
        #
        # *********************************************************************************************************************************************
        ncVar_Mesh2_crs = root_grp.createVariable('Mesh2_crs', 'i', (), fill_value=False)
        ncVar_Mesh2_crs[:] = 4326
        ncVar_Mesh2_crs.epsg_code = "EPSG:4326"
        ncVar_Mesh2_crs.comment = "LON, LAT : WGS84, EPSG:4326"
        ncVar_Mesh2_crs.grid_mapping_name = "latitude_longitude"
        #ncVar_Mesh2_crs.grid_mapping_name = "rotated_latitude_longitude"
        ncVar_Mesh2_crs.longitude_of_prime_meridian = 0.0
        ncVar_Mesh2_crs.semi_major_axis = 6378137.0
        ncVar_Mesh2_crs.inverse_flattening = 298.257223563
        # --------------------------------------------------
        #                                   2.1) NODES
        # --------------------------------------------------

        ncVar_Mesh2_node_lon = root_grp.createVariable('Mesh2_node_lon', 'f8', ('nMesh2_node'), fill_value=False)
        ncVar_Mesh2_node_lon.long_name = 'geografische Laenge der 2D-Gitter-Knoten'
        ncVar_Mesh2_node_lon.units = 'degrees_east'
        ncVar_Mesh2_node_lon.name_id = 1653
        ncVar_Mesh2_node_lon.standard_name = 'longitude'
        ncVar_Mesh2_node_lon[:] = Mesh2_node_x[:]

        ncVar_Mesh2_node_lat = root_grp.createVariable('Mesh2_node_lat', 'f8', ('nMesh2_node'), fill_value=False)
        ncVar_Mesh2_node_lat.long_name = 'geografische Breite der 2D-Gitter-Knoten'
        ncVar_Mesh2_node_lat.units = 'degrees_north'
        ncVar_Mesh2_node_lat.name_id = 1652
        ncVar_Mesh2_node_lat.standard_name = 'latitude'
        ncVar_Mesh2_node_lat[:] = Mesh2_node_y[:]

        # --------------------------------------------------
        #                                   2.2) EDGES
        # --------------------------------------------------

        ncVar_Mesh2_edge_lon = root_grp.createVariable('Mesh2_edge_lon', 'f8', ('nMesh2_edge'), fill_value=False)
        ncVar_Mesh2_edge_lon.long_name = 'geografische Laenge der 2D-Gitter-Kanten, Kantenmitte'
        ncVar_Mesh2_edge_lon.units = 'degrees_east'
        ncVar_Mesh2_edge_lon.name_id = 1653
        ncVar_Mesh2_edge_lon.bounds = 'Mesh2_edge_lon_bnd'
        ncVar_Mesh2_edge_lon.standard_name = 'longitude'
        ncVar_Mesh2_edge_lon[:] = Mesh2_edge_x[:]

        ncVar_Mesh2_edge_lat = root_grp.createVariable('Mesh2_edge_lat', 'f8', ('nMesh2_edge'), fill_value=False)
        ncVar_Mesh2_edge_lat.long_name = 'geografische Breite der 2D-Gitter-Kanten, Kantenmitte'
        ncVar_Mesh2_edge_lat.units = 'degrees_north'
        ncVar_Mesh2_edge_lat.name_id = 1652
        ncVar_Mesh2_edge_lat.bounds = 'Mesh2_edge_lat_bnd'
        ncVar_Mesh2_edge_lat.standard_name = 'latitude'
        ncVar_Mesh2_edge_lat[:] = Mesh2_edge_y[:]

        # --------------------------------------------------
        #                                   2.3) FACES
        # --------------------------------------------------

        ncVar_Mesh2_face_lon = root_grp.createVariable('Mesh2_face_lon', 'f8', ('nMesh2_face'), fill_value=False)
        ncVar_Mesh2_face_lon.long_name = 'geografische Laenge der 2D-Gitter-Faces (Polygone), Schwerpunkt'
        ncVar_Mesh2_face_lon.units = 'degrees_east'
        ncVar_Mesh2_face_lon.name_id = 1653
        ncVar_Mesh2_face_lon.bounds = 'Mesh2_face_lon_bnd'
        ncVar_Mesh2_face_lon.standard_name = 'longitude'
        ncVar_Mesh2_face_lon[:] = Mesh2_face_x[:]

        ncVar_Mesh2_face_lat = root_grp.createVariable('Mesh2_face_lat', 'f8', ('nMesh2_face'), fill_value=False)
        ncVar_Mesh2_face_lat.long_name = 'geografische Breite der 2D-Gitter-Faces (Polygone), Schwerpunkt'
        ncVar_Mesh2_face_lat.units = 'degrees_north'
        ncVar_Mesh2_face_lat.name_id = 1652
        ncVar_Mesh2_face_lat.bounds = 'Mesh2_face_lat_bnd'
        ncVar_Mesh2_face_lat.standard_name = 'latitude'
        ncVar_Mesh2_face_lat[:] = Mesh2_face_y[:]

        ncVar_Mesh2_face_center_lon = root_grp.createVariable('Mesh2_face_center_lon', 'f8', ('nMesh2_face'), fill_value=False)
        ncVar_Mesh2_face_center_lon.long_name = 'geografische Laenge der 2D-Gitter-Faces (Polygone), Umkreismittelpunkt'
        ncVar_Mesh2_face_center_lon.units = 'degrees_east'
        ncVar_Mesh2_face_center_lon.name_id = 1653
        ncVar_Mesh2_face_center_lon.standard_name = 'longitude'
        ncVar_Mesh2_face_center_lon[:] = Mesh2_face_center_x[:]

        ncVar_Mesh2_face_center_lat = root_grp.createVariable('Mesh2_face_center_lat', 'f8', ('nMesh2_face'), fill_value=False)
        ncVar_Mesh2_face_center_lat.long_name = 'geografische Breite der 2D-Gitter-faces (Polygone), Umkreismittelpunkt'
        ncVar_Mesh2_face_center_lat.units = 'degrees_north'
        ncVar_Mesh2_face_center_lat.name_id = 1652
        ncVar_Mesh2_face_center_lat.standard_name = 'latitude'
        ncVar_Mesh2_face_center_lat[:] = Mesh2_face_center_y[:]

        # --------------------------------------------------
        #                                   2.4) OPTIONAL / BORDERS
        # --------------------------------------------------
        if Mesh2_edge_x_bnd is not None and Mesh2_edge_y_bnd is not None:
            ncVar_Mesh2_edge_lon_bnd = root_grp.createVariable('Mesh2_edge_lon_bnd', 'f8', ('nMesh2_edge', 'two'), fill_value=False)
            ncVar_Mesh2_edge_lat_bnd = root_grp.createVariable('Mesh2_edge_lat_bnd', 'f8', ('nMesh2_edge', 'two'), fill_value=False)
            ncVar_Mesh2_edge_lon_bnd[...] = Mesh2_edge_x_bnd
            ncVar_Mesh2_edge_lat_bnd[...] = Mesh2_edge_y_bnd
        if Mesh2_face_x_bnd is not None and Mesh2_face_y_bnd is not None:
            ncVar_Mesh2_face_lon_bnd = root_grp.createVariable('Mesh2_face_lon_bnd', 'f8', ('nMesh2_face', 'nMaxMesh2_face_nodes'), fill_value=-999)
            ncVar_Mesh2_face_lat_bnd = root_grp.createVariable('Mesh2_face_lat_bnd', 'f8', ('nMesh2_face', 'nMaxMesh2_face_nodes'), fill_value=-999)
            ncVar_Mesh2_face_lon_bnd[...] = Mesh2_face_x_bnd
            ncVar_Mesh2_face_lat_bnd[...] = Mesh2_face_y_bnd

        # ------------------------------------------------------------------------------------
        #                                   3.5) Topology
        # ------------------------------------------------------------------------------------

        ncVar_Mesh2 = root_grp.createVariable('Mesh2', 'i', fill_value=False)
        #ncVar_Mesh2.long_name = 'UnTRIM Gitternetz, Drei- und Vierecke gemischt, kein SubGrid'
        ncVar_Mesh2.long_name = 'UnTRIM Gitternetz, Vierecke, kein SubGrid'
        ncVar_Mesh2.cf_role = 'mesh_topology'
        ncVar_Mesh2.dimensionality = 2
        ncVar_Mesh2.node_coordinates = 'Mesh2_node_lon Mesh2_node_lat Mesh2_node_x Mesh2_node_y'
        ncVar_Mesh2.edge_coordinates = 'Mesh2_edge_lon Mesh2_edge_lat Mesh2_edge_x Mesh2_edge_y'
        ncVar_Mesh2.face_coordinates = 'Mesh2_face_lon Mesh2_face_lat Mesh2_face_x Mesh2_face_y Mesh2_face_center_lon Mesh2_face_center_lat Mesh2_face_center_x Mesh2_face_center_y '
        ncVar_Mesh2.edge_node_connectivity = 'Mesh2_edge_nodes'
        ncVar_Mesh2.edge_face_connectivity = 'Mesh2_edge_faces'
        ncVar_Mesh2.face_node_connectivity = 'Mesh2_face_nodes'
        ncVar_Mesh2.face_edge_connectivity = 'Mesh2_face_edges'


    
    else:
        err_msg = 'passed <coord_type = {0}> is invalid. Choose "cartesian", "geographic" or "both"'.format(coord_type)
        raise TypeError(err_msg)
    # **************************************************
    #
    #                  3) Topological coordinates
    #
    # **************************************************
    # --------------------------------------------------
    #                                   3.1) EDGE >>> NODES
    # --------------------------------------------------

    ncVar_Mesh2_edge_nodes = root_grp.createVariable('Mesh2_edge_nodes', 'i', ('nMesh2_edge', 'two'))
    ncVar_Mesh2_edge_nodes.long_name = 'Knotenverzeichnis der Kanten, Anfangs- und Endpunkt'
    ncVar_Mesh2_edge_nodes.cf_role = 'edge_node_connectivity'
    ncVar_Mesh2_edge_nodes.start_index = start_index
    ncVar_Mesh2_edge_nodes[:] = Mesh2_edge_nodes[:]

    # --------------------------------------------------
    #                                   3.2) EDGE >>> FACES
    # --------------------------------------------------

    ncVar_Mesh2_edge_faces = root_grp.createVariable('Mesh2_edge_faces', 'i', ('nMesh2_edge', 'two'), fill_value=-999)
    ncVar_Mesh2_edge_faces.long_name = 'Face- (Polygon-) Verzeichnis der Kanten, linker und rechter Nachbar'
    ncVar_Mesh2_edge_faces.cf_role = 'edge_face_connectivity'
    ncVar_Mesh2_edge_faces.start_index = start_index
    ncVar_Mesh2_edge_faces[:] = Mesh2_edge_faces[:]

    # --------------------------------------------------
    #                                   3.3) FACE >>> NODES
    # --------------------------------------------------

    ncVar_Mesh2_face_nodes = root_grp.createVariable('Mesh2_face_nodes', 'i', ('nMesh2_face', 'nMaxMesh2_face_nodes'), fill_value=-999)
    ncVar_Mesh2_face_nodes.long_name = 'Knotenverzeichnis der Faces (Polygone),entgegen dem Uhrzeigersinn'
    ncVar_Mesh2_face_nodes.cf_role = 'face_node_connectivity'
    ncVar_Mesh2_face_nodes.start_index = start_index
    ncVar_Mesh2_face_nodes[:] = Mesh2_face_nodes[:]

    # ------------------------------------------------------------------------------------
    #                                   3.4) FACE >>> EDGES
    # ------------------------------------------------------------------------------------

    ncVar_Mesh2_face_edges = root_grp.createVariable('Mesh2_face_edges', 'i', ('nMesh2_face', 'nMaxMesh2_face_nodes'), fill_value=-999)
    ncVar_Mesh2_face_edges.long_name = 'Kantenverzeichnis der Faces (Polygone),entgegen dem Uhrzeigersinn'
    ncVar_Mesh2_face_edges.cf_role = 'face_edge_connectivity'
    ncVar_Mesh2_face_edges.start_index = start_index
    ncVar_Mesh2_face_edges[:] = Mesh2_face_edges[:]


    # --------------------------------------------------
    #                   Closing ncdf
    # --------------------------------------------------
    root_grp.close()

    if log: print 'File created succesfully: %s' % (filename)
Пример #41
0
def writeclimfile(confM2R, ntime, myvar, data1=None, data2=None, data3=None, data4=None):
    if confM2R.myformat == 'NETCDF4':
        myzlib = True
    else:
        myzlib = False

    grdROMS = confM2R.grdROMS

    if confM2R.grdROMS.ioClimInitialized is False:
        confM2R.grdROMS.ioClimInitialized = True
        if os.path.exists(confM2R.climname):
            os.remove(confM2R.climname)

        f1 = Dataset(confM2R.climname, mode='w', format=confM2R.myformat)
        f1.title = "Climatology forcing file (CLIM) used for forcing the ROMS model"
        f1.description = "Created for grid file: %s" % (confM2R.romsgridpath)
        f1.grd_file = "Gridfile: %s" % (confM2R.romsgridpath)
        f1.history = "Created " + time.ctime(time.time())
        f1.source = "{} ({})".format(confM2R.authorname,confM2R.authoremail)
        f1.type = "File in %s format created using MODEL2ROMS" % (confM2R.myformat)
        f1.link = "https://github.com/trondkr/model2roms"
        f1.Conventions = "CF-1.0"

        # Define dimensions
        f1.createDimension('xi_rho', grdROMS.xi_rho)
        f1.createDimension('eta_rho', grdROMS.eta_rho)
        f1.createDimension('xi_u', grdROMS.xi_u)
        f1.createDimension('eta_u', grdROMS.eta_u)
        f1.createDimension('xi_v', grdROMS.xi_v)
        f1.createDimension('eta_v', grdROMS.eta_v)
        f1.createDimension('xi_psi', grdROMS.xi_psi)
        f1.createDimension('eta_psi', grdROMS.eta_psi)
        f1.createDimension('s_rho', len(grdROMS.s_rho))
        f1.createDimension('s_w', len(grdROMS.s_w))
        if confM2R.isclimatology:
            f1.createDimension('clim_time', 12)
        else:
            f1.createDimension('ocean_time', None)

        vnc = f1.createVariable('lon_rho', 'd', ('eta_rho', 'xi_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = 'Longitude of RHO-points'
        vnc.units = 'degree_east'
        vnc.standard_name = 'longitude'
        vnc[:, :] = grdROMS.lon_rho

        vnc = f1.createVariable('lat_rho', 'd', ('eta_rho', 'xi_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = 'Latitude of RHO-points'
        vnc.units = 'degree_north'
        vnc.standard_name = 'latitude'
        vnc[:, :] = grdROMS.lat_rho

        vnc = f1.createVariable('lon_u', 'd', ('eta_u', 'xi_u',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = 'Longitude of U-points'
        vnc.units = 'degree_east'
        vnc.standard_name = 'longitude'
        vnc[:, :] = grdROMS.lon_u

        vnc = f1.createVariable('lat_u', 'd', ('eta_u', 'xi_u',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = 'Latitude of U-points'
        vnc.units = 'degree_north'
        vnc.standard_name = 'latitude'
        vnc[:, :] = grdROMS.lat_u

        vnc = f1.createVariable('lon_v', 'd', ('eta_v', 'xi_v',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = 'Longitude of V-points'
        vnc.units = 'degree_east'
        vnc.standard_name = 'longitude'
        vnc[:, :] = grdROMS.lon_v

        vnc = f1.createVariable('lat_v', 'd', ('eta_v', 'xi_v',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = 'Latitude of V-points'
        vnc.units = 'degree_north'
        vnc.standard_name = 'latitude'
        vnc[:, :] = grdROMS.lat_v

        vnc = f1.createVariable('lat_psi', 'd', ('eta_psi', 'xi_psi',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = 'Latitude of PSI-points'
        vnc.units = 'degree_north'
        vnc.standard_name = 'latitude'
        vnc[:, :] = grdROMS.lat_psi

        vnc = f1.createVariable('lon_psi', 'd', ('eta_psi', 'xi_psi',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = 'Longitude of PSI-points'
        vnc.units = 'degree_east'
        vnc.standard_name = 'longitude'
        vnc[:, :] = grdROMS.lon_psi

        vnc = f1.createVariable('h', 'd', ('eta_rho', 'xi_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = 'Bathymetry at RHO-points'
        vnc.units = 'meter'
        vnc.field = "bath, scalar"
        vnc[:, :] = grdROMS.h

        vnc = f1.createVariable('f', 'd', ('eta_rho', 'xi_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = 'Coriolis parameter at RHO-points'
        vnc.units = 'second-1'
        vnc.field = "Coriolis, scalar"
        vnc[:, :] = grdROMS.f

        vnc = f1.createVariable('pm', 'd', ('eta_rho', 'xi_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = 'curvilinear coordinate metric in XI'
        vnc.units = 'meter-1'
        vnc.field = "pm, scalar"
        vnc[:, :] = grdROMS.pm

        vnc = f1.createVariable('pn', 'd', ('eta_rho', 'xi_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = 'curvilinear coordinate metric in ETA'
        vnc.units = 'meter-1'
        vnc.field = "pn, scalar"
        vnc[:, :] = grdROMS.pn

        vnc = f1.createVariable('s_rho', 'd', ('s_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = "S-coordinate at RHO-points"
        vnc.valid_min = -1.
        vnc.valid_max = 0.
        if grdROMS.vtransform == 2:
            vnc.standard_name = "ocean_s_coordinate_g2"
            vnc.formula_terms = "s: s_rho C: Cs_r eta: zeta depth: h depth_c: hc"
        if grdROMS.vtransform == 1:
            vnc.standard_name = "ocean_s_coordinate_g1"
            vnc.formula_terms = "s: s_rho C: Cs_r eta: zeta depth: h depth_c: hc"
        vnc.field = "s_rho, scalar"
        vnc[:] = grdROMS.s_rho

        vnc = f1.createVariable('s_w', 'd', ('s_w',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = "S-coordinate at W-points"
        vnc.valid_min = -1.
        vnc.valid_max = 0.
        if grdROMS.vtransform == 2:
            vnc.standard_name = "ocean_s_coordinate_g2"
            vnc.formula_terms = "s: s_w C: Cs_w eta: zeta depth: h depth_c: hc"
        if grdROMS.vtransform == 1:
            vnc.standard_name = "ocean_s_coordinate_g1"
            vnc.formula_terms = "s: s_w C: Cs_w eta: zeta depth: h depth_c: hc"
        vnc.field = "s_w, scalar"
        vnc[:] = grdROMS.s_w

        vnc = f1.createVariable('Cs_r', 'd', ('s_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = "S-coordinate stretching curves at RHO-points"
        vnc.valid_min = -1.
        vnc.valid_max = 0.
        vnc.field = "s_rho, scalar"
        vnc[:] = grdROMS.Cs_rho

        vnc = f1.createVariable('Cs_w', 'd', ('s_w',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = "S-coordinate stretching curves at W-points"
        vnc.valid_min = -1.
        vnc.valid_max = 0.
        vnc.field = "s_w, scalar"
        vnc[:] = grdROMS.Cs_w

        vnc = f1.createVariable('hc', 'd')
        vnc.long_name = "S-coordinate parameter, critical depth";
        vnc.units = "meter"
        vnc[:] = grdROMS.hc

        vnc = f1.createVariable('z_r', 'd', ('s_rho', 'eta_rho', 'xi_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = "Sigma layer to depth matrix";
        vnc.units = "meter"
        vnc[:, :, :] = grdROMS.z_r

        vnc = f1.createVariable('z_w', 'd', ('s_w', 'eta_rho', 'xi_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = "Sigma layer to depth matrix";
        vnc.units = "meter"
        vnc[:, :, :] = grdROMS.z_w

        vnc = f1.createVariable('Tcline', 'd')
        vnc.long_name = "S-coordinate surface/bottom layer width"
        vnc.units = "meter"
        vnc[:] = grdROMS.tcline

        vnc = f1.createVariable('theta_s', 'd')
        vnc.long_name = "S-coordinate surface control parameter"
        vnc[:] = grdROMS.theta_s

        vnc = f1.createVariable('theta_b', 'd')
        vnc.long_name = "S-coordinate bottom control parameter"
        vnc[:] = grdROMS.theta_b

        vnc = f1.createVariable('angle', 'd', ('eta_rho', 'xi_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = "angle between xi axis and east"
        vnc.units = "radian"
        vnc[:, :] = grdROMS.angle

        # Now start creating variables for regular climatology/bry/init creations
        if not confM2R.isclimatology:
            v_time = f1.createVariable('ocean_time', 'd', ('ocean_time',), zlib=myzlib, fill_value=grdROMS.fillval)
            v_time.long_name = 'seconds since 1948-01-01 00:00:00'
            v_time.units = 'seconds since 1948-01-01 00:00:00'
            v_time.field = 'time, scalar, series'
            if (confM2R.indatatype == "NORESM"):
                v_time.calendar = 'noleap'
            else:
                v_time.calendar = 'standard'

            v_u = f1.createVariable('u', 'f', ('ocean_time', 's_rho', 'eta_u', 'xi_u',), zlib=myzlib,
                                    fill_value=grdROMS.fillval)
            v_u.long_name = "u-momentum component"
            v_u.units = "meter second-1"
            v_u.time = "ocean_time"
            v_u.field = "u-velocity, scalar, series"
            #v_u.missing_value = grdROMS.fillval

            v_v = f1.createVariable('v', 'f', ('ocean_time', 's_rho', 'eta_v', 'xi_v',), zlib=myzlib,
                                    fill_value=grdROMS.fillval)
            v_v.long_name = "v-momentum component"
            v_v.units = "meter second-1"
            v_v.time = "ocean_time"
            v_v.field = "v-velocity, scalar, series"
            #v_v.missing_value = grdROMS.fillval

            v_salt = f1.createVariable('salt', 'f', ('ocean_time', 's_rho', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
            v_salt.long_name = "salinity"
            v_salt.time = "ocean_time"
            v_salt.field = "salinity, scalar, series"
            #v_salt.missing_value = grdROMS.fillval

            v_temp = f1.createVariable('temp', 'f', ('ocean_time', 's_rho', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
            v_temp.long_name = "potential temperature"
            v_temp.units = "Celsius"
            v_temp.time = "ocean_time"
            v_temp.field = "temperature, scalar, series"
            #v_temp.missing_value = grdROMS.fillval

            v_ssh = f1.createVariable('zeta', 'f', ('ocean_time', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                      fill_value=grdROMS.fillval)
            v_ssh.long_name = "sea level"
            v_ssh.units = "meter"
            v_ssh.time = "ocean_time"
            v_ssh.field = "sea level, scalar, series"
            #v_ssh.missing_value = grdROMS.fillval

            v_ubar = f1.createVariable('ubar', 'f', ('ocean_time', 'eta_u', 'xi_u',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
            v_ubar.long_name = "u-2D momentum"
            v_ubar.units = "meter second-1"
            v_ubar.time = "ocean_time"
            v_ubar.field = "u2-D velocity, scalar, series"
            #v_ubar.missing_value = grdROMS.fillval

            v_vbar = f1.createVariable('vbar', 'f', ('ocean_time', 'eta_v', 'xi_v',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
            v_vbar.long_name = "v-2D momentum"
            v_vbar.units = "meter second-1"
            v_vbar.time = "ocean_time"
            v_vbar.field = "v2-D velocity, scalar, series"
            #v_vbar.missing_value = grdROMS.fillval

            if confM2R.writeice:
                ageice = f1.createVariable('ageice', 'f', ('ocean_time', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                           fill_value=grdROMS.fillval)
                ageice.long_name = "time-averaged age of the ice"
                ageice.units = "years"
                ageice.time = "ocean_time"
                ageice.field = "ice age, scalar, series"
                #ageice.missing_value = grdROMS.fillval

                uice = f1.createVariable('uice', 'd', ('ocean_time', 'eta_u', 'xi_u',), zlib=myzlib,
                                         fill_value=grdROMS.fillval)
                uice.long_name = "time-averaged u-component of ice velocity"
                uice.units = "meter second-1"
                uice.time = "ocean_time"
                uice.field = "u-component of ice velocity, scalar, series"
                #uice.missing_value = grdROMS.fillval

                vice = f1.createVariable('vice', 'd', ('ocean_time', 'eta_v', 'xi_v',), zlib=myzlib,
                                         fill_value=grdROMS.fillval)

                vice.long_name = "time-averaged v-component of ice velocity"
                vice.units = "meter second-1"
                vice.time = "ocean_time"
                vice.field = "v-component of ice velocity, scalar, series"
                #vice.missing_value = grdROMS.fillval

                aice = f1.createVariable('aice', 'f', ('ocean_time', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                         fill_value=grdROMS.fillval)

                aice.long_name = "time-averaged fraction of cell covered by ice"
                aice.time = "ocean_time"
                aice.field = "ice concentration, scalar, series"
                #aice.missing_value = grdROMS.fillval

                hice = f1.createVariable('hice', 'f', ('ocean_time', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                         fill_value=grdROMS.fillval)
                hice.long_name = "time-averaged average ice thickness in cell"
                hice.units = "meter"
                hice.time = "ocean_time"
                hice.field = "ice thickness, scalar, series"
                #hice.missing_value = grdROMS.fillval

                snow_thick = f1.createVariable('snow_thick', 'f', ('ocean_time', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                               fill_value=grdROMS.fillval)

                snow_thick.long_name = "time-averaged thickness of snow cover"
                snow_thick.units = "meter"
                snow_thick.time = "ocean_time"
                snow_thick.field = "snow thickness, scalar, series"
                #snow_thick.missing_value = grdROMS.fillval

                ti = f1.createVariable('ti', 'f', ('ocean_time', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)

                ti.long_name = "time-averaged interior ice temperature"
                ti.units = "degrees Celcius"
                ti.time = "ocean_time"
                ti.field = "interior temperature, scalar, series"
                #ti.missing_value = grdROMS.fillval

                sfwat = f1.createVariable('sfwat', 'f', ('ocean_time', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                          fill_value=grdROMS.fillval)

                sfwat.long_name = "time-averaged surface melt water thickness on ice"
                sfwat.units = "meter"
                sfwat.time = "ocean_time"
                sfwat.field = "melt water thickness, scalar, series"
                #sfwat.missing_value = grdROMS.fillval

                tisrf = f1.createVariable('tisrf', 'f', ('ocean_time', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                          fill_value=grdROMS.fillval)
                tisrf.long_name = "time-averaged temperature of ice surface"
                tisrf.units = "degrees Celcius"
                tisrf.time = "ocean_time"
                tisrf.field = "surface temperature, scalar, series"
                #tisrf.missing_value = grdROMS.fillval

                sig11 = f1.createVariable('sig11', 'f', ('ocean_time', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                          fill_value=grdROMS.fillval)

                sig11.long_name = "time-averaged internal ice stress 11 component"
                sig11.units = "Newton meter-1"
                sig11.time = "ocean_time"
                sig11.field = "ice stress 11, scalar, series"
                #sig11.missing_value = grdROMS.fillval

                sig12 = f1.createVariable('sig12', 'f', ('ocean_time', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                          fill_value=grdROMS.fillval)

                sig12.long_name = "time-averaged internal ice stress 12 component"
                sig12.units = "Newton meter-1"
                sig12.time = "ocean_time"
                sig12.field = "ice stress 12, scalar, series"
                #sig12.missing_value = grdROMS.fillval

                sig22 = f1.createVariable('sig22', 'f', ('ocean_time', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                          fill_value=grdROMS.fillval)

                sig22.long_name = "time-averaged internal ice stress 22 component"
                sig22.units = "Newton meter-1"
                sig22.time = "ocean_time"
                sig22.field = "ice stress 22, scalar, series"
                #sig22.missing_value = grdROMS.fillval
            if confM2R.writebcg:

                v_o3_c = f1.createVariable('O3_c', 'f', ('ocean_time', 's_rho', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
                v_o3_c.long_name = "carbonate/total dissolved inorganic carbon"
                v_o3_c.time = "ocean_time"
                v_o3_c.units = "mmol C/m^3"
                v_o3_c.field = "O3_c, scalar, series"

                v_o3_ta = f1.createVariable('O3_TA', 'f', ('ocean_time', 's_rho', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
                v_o3_ta.long_name = "carbonate/bioalkalinity"
                v_o3_ta.time = "ocean_time"
                v_o3_ta.units = "umol/kg"
                v_o3_ta.field = "O3_ta, scalar, series"

                v_n1_p = f1.createVariable('N1_p', 'f', ('ocean_time', 's_rho', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
                v_n1_p.long_name = "phosphate/phosphorus"
                v_n1_p.time = "ocean_time"
                v_n1_p.units = "mmol P/m^3"
                v_n1_p.field = "N1_p, scalar, series"

                v_o2_o = f1.createVariable('O2_o', 'f', ('ocean_time', 's_rho', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
                v_o2_o.long_name = "oxygen/oxygen"
                v_o2_o.time = "ocean_time"
                v_o2_o.units = "mmol O_2/m^3"
                v_o2_o.field = "O2_o, scalar, series"

                v_n3_n = f1.createVariable('N3_n', 'f', ('ocean_time', 's_rho', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
                v_n3_n.long_name = "nitrate/nitrogen"
                v_n3_n.time = "ocean_time"
                v_n3_n.units = "mmol N/m^3"
                v_n3_n.field = "N3_n, scalar, series"

                v_n5_s = f1.createVariable('N5_s', 'f', ('ocean_time', 's_rho', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
                v_n5_s.long_name = "silicate/silicate"
                v_n5_s.time = "ocean_time"
                v_n5_s.units = "mmol Si/m^3"
                v_n5_s.field = "N5_s, scalar, series"

        # If we are creating climatology files with loops every 360 days, then create these variables here
        if confM2R.isclimatology:
            v_time = f1.createVariable('clim_time', 'd', ('clim_time',), zlib=myzlib, fill_value=grdROMS.fillval)
            v_time.units = 'day'
            v_time.field = 'time, scalar, series'
            v_time.calendar = 'standard'
            v_time.cycle_length = 360.

            v_salt = f1.createVariable('salt', 'f', ('clim_time', 's_rho', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
            v_salt.long_name = "salinity"
            v_salt.time = "clim_time"
            v_salt.field = "salinity, scalar, series"
            #v_salt.missing_value = grdROMS.fillval

            v_salt = f1.createVariable('SSS', 'f', ('clim_time', 's_rho', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
            v_salt.long_name = "salinity"
            v_salt.time = "clim_time"
            v_salt.field = "salinity, scalar, series"
            #v_salt.missing_value = grdROMS.fillval

            v_temp = f1.createVariable('temp', 'f', ('clim_time', 's_rho', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
            v_temp.long_name = "potential temperature"
            v_temp.units = "Celsius"
            v_temp.time = "clim_time"
            v_temp.field = "temperature, scalar, series"
            #v_temp.missing_value = grdROMS.fillval

    else:
        f1 = Dataset(confM2R.climname, mode='a', format=confM2R.myformat)

    if confM2R.isclimatology is False:
        if myvar == confM2R.globalvarnames[0]:

            if grdROMS.timeunits[0:7] == "seconds":
                print("time units ", grdROMS.timeunits, grdROMS.timeunits[0:7])
                f1.variables['ocean_time'][ntime] = grdROMS.time
                d = num2date(grdROMS.time, units=f1.variables['ocean_time'].long_name,
                             calendar=f1.variables['ocean_time'].calendar)
            else:
                f1.variables['ocean_time'][ntime] = grdROMS.time * 86400.0

                d = num2date(grdROMS.time * 86400.0, units=f1.variables['ocean_time'].long_name,
                             calendar=f1.variables['ocean_time'].calendar)
            grdROMS.message = d

        if myvar == 'temperature':
            f1.variables['temp'][ntime, :, :, :] = data1
        if myvar == 'salinity':
            f1.variables['salt'][ntime, :, :, :] = data1
        if myvar == 'ssh':
            f1.variables['zeta'][ntime, :, :] = data1
        if myvar == 'vvel':
            f1.variables['u'][ntime, :, :, :] = data1
            f1.variables['v'][ntime, :, :, :] = data2

            f1.variables['ubar'][ntime, :, :] = data3
            f1.variables['vbar'][ntime, :, :] = data4

        if confM2R.writeice:
            if myvar == "ageice":
                # print "NOTE! Setting values of ageice to ZERO! (IOWrite.py)"
                data1 = np.where(abs(data1) > 100, 0, data1)
                f1.variables['ageice'][ntime, :, :] = data1

            if myvar == 'uice':
                data1 = np.where(abs(data1) > 120, 0, data1)
                f1.variables['uice'][ntime, :, :] = data1 * 0.01  # NorESM is cm/s divide by 100 to get m/s
                f1.variables['sfwat'][ntime, :, :] = 0.
                f1.variables['tisrf'][ntime, :, :] = 0.
                f1.variables['ti'][ntime, :, :] = 0.
                f1.variables['sig11'][ntime, :, :] = 0.
                f1.variables['sig12'][ntime, :, :] = 0.
                f1.variables['sig22'][ntime, :, :] = 0.

                if confM2R.indatatype == 'GLORYS':
                    # Special care for GLORYS as dataset does not contain sea ice age and snow thickness
                    f1.variables['ageice'][ntime, :, :] = 0.
                    f1.variables['snow_thick'][ntime, :, :] = 0

            if myvar == 'vice':
                data1 = np.where(abs(data1) > 120, 0, data1)
                f1.variables['vice'][ntime, :, :] = data1 * 0.01  # NorESM is cm/s divide by 100 to get m/s
            if myvar == 'aice':
                data1 = np.where(abs(data1) > 120, 0, data1)
                f1.variables['aice'][ntime, :, :] = data1 * 0.01  # NorESM is % divide by 100 to get fraction
            if myvar == 'hice':
                data1 = np.where(abs(data1) > 10, 0, data1)
                # data1 = np.ma.masked_where(abs(data1) > 10, data1)
                f1.variables['hice'][ntime, :, :] = data1
            if myvar == 'snow_thick':
                # data1 = np.ma.masked_where(abs(data1) > 100, data1)
                data1 = np.where(abs(data1) > 10, 0, data1)
                f1.variables['snow_thick'][ntime, :, :] = data1

        if confM2R.writebcg:
            if myvar in ['O3_c','O3_TA','N1_p','N3_n','N5_s','O2_o']:
                data1 = np.where(abs(data1) < 0, 0, data1)
                if confM2R.indatatype=="NORESM":
                    """
                    Multiply the NORESM variable by conversion factors below:
                    NORESM name     NORESM units     ERSEM name     ERSEM units    Conversion factor
                    dissic                      [mol C/m3]           O3_c                   [mmol C/m3]   1e3
                    talk                         [eq/m3]                 O3_TA                [umol/kg]         1e6/1025
                    po4                         [mol P/m3]           N1_p                   [mmol P/m3]   1e3
                    no3                         [mol N/m3]           N3_n                  [mmol N/m3]   1e3
                    si                             [mol Si/m3]           N5_s                   [mmol Si/m3]   1e3
                    o2                           [mol O2/m3]         O2_o                  [mmol O2/m3] 1e3
                    """
                
                    if myvar=="O3_TA": 
                        data1=data1*1.0e6/1025.
                    else: 
                        data1=data1*1.0e3
                f1.variables[myvar][ntime,:,:,:] = data1

    if confM2R.isclimatology:
        # Climatological time starts at the 15th of each month
        d = datetime(2012, int(ntime) + 1, 1)
        tt = d.timetuple()
        if myvar == grdROMS.vars[0]:
            f1.variables['clim_time'][ntime] = tt.tm_yday + 15

        grdROMS.message = tt.tm_yday + 15

        if myvar == 'temperature':
            f1.variables['temp'][ntime,:,:,:] = data1
        if myvar == 'salinity':
            f1.variables['salt'][ntime,:,:,:] = data1
            f1.variables['SSS'][ntime,:,:,:] = data1

    f1.close()
def makenetcdf_(datasetname, lines):
  filedate = getlinedate_(lines[0])
  ncbytes = None


  platform_code = getplatformcode_(datasetname)
  filenameroot = "GL_TS_TS_" + getplatformcallsign_(platform_code) + "_" + filedate

  # Open a new netCDF file
  ncpath = tempfile.gettempdir() + "/" + filenameroot + ".nc"
  nc = Dataset(ncpath, format="NETCDF4_CLASSIC", mode="w")

  # The DEPTH dimension is singular. Assume 5m for ships
  depthdim = nc.createDimension("DEPTH", 1)

  # Time, lat and lon dimensions are created per record
  timedim = nc.createDimension("TIME", None)
  timevar = nc.createVariable("TIME", "d", ("TIME"), fill_value = 999999.0)
  timevar.long_name = "Time"
  timevar.standard_name = "time"
  timevar.units = "days since 1950-01-01T00:00:00Z"
  timevar.valid_min = -90000;
  timevar.valid_max = 90000;
  timevar.axis = "T"

  latdim = nc.createDimension("LATITUDE", len(lines))
  latvar = nc.createVariable("LATITUDE", "f", ("LATITUDE"),
    fill_value = 99999.0)

  latvar.long_name = "Latitude of each location"
  latvar.standard_name = "latitude"
  latvar.units = "degree_north"
  latvar.valid_min = -90
  latvar.valid_max = 90
  latvar.axis = "Y"
  latvar.reference = "WGS84"
  latvar.coordinate_reference_frame = "urn:ogc:crs:EPSG::4326"

  londim = nc.createDimension("LONGITUDE", len(lines))
  lonvar = nc.createVariable("LONGITUDE", "f", ("LONGITUDE"),
    fill_value = 99999.0)

  lonvar.long_name = "Longitude of each location"
  lonvar.standard_name = "longitude"
  lonvar.units = "degree_east"
  lonvar.valid_min = -180
  lonvar.valid_max = 180
  lonvar.axis = "X"
  lonvar.reference = "WGS84"
  lonvar.coordinate_reference_frame = "urn:ogc:crs:EPSG::4326"

  positiondim = nc.createDimension("POSITION", len(lines))

  # Record position bounds
  minlon = 180
  maxlon = -180
  minlat = 90
  maxlat = -90

  # Fill in dimension variables
  print(len(lines))
  times = [0] * len(lines)
  lats = [0] * len(lines)
  lons = [0] * len(lines)
  for i in range(0, len(lines)):
    fields = str.split(lines[i], ",")
    times[i] = maketimefield_(fields[0])
    if i == 0:
      starttime = maketimeobject_(fields[0])
    
    if i == len(lines) - 1:
      endtime = maketimeobject_(fields[0])

    lats[i] = float(fields[2])
    if lats[i] < minlat:
      minlat = lats[i]

    if lats[i] > maxlat:
      maxlat = lats[i]

    lons[i] = float(fields[1])
    if lons[i] < minlon:
      minlon = lons[i]

    if lons[i] > maxlon:
      maxlon = lons[i]

  timevar[:] = times
  latvar[:] = lats
  lonvar[:] = lons

  # QC flags for dimension variables. Assume all are good
  timeqcvar = nc.createVariable("TIME_QC", "b", ("TIME"), \
   fill_value = QC_FILL_VALUE)
  assignqcvarattributes_(timeqcvar)
  timeqcvar[:] = 1

  positionqcvar = nc.createVariable("POSITION_QC", "b", ("POSITION"), \
   fill_value = QC_FILL_VALUE)
  assignqcvarattributes_(positionqcvar)
  positionqcvar[:] = 1

  # Now we create the data variables
  depthvar = nc.createVariable("DEPH", "f", ("TIME", "DEPTH"), \
    fill_value = -99999.0)
  depthvar.long_name = "Depth"
  depthvar.standard_name = "depth"
  depthvar.units = "m"
  depthvar.positive = "down"
  depthvar.valid_min = -12000.0
  depthvar.valid_max = 12000.0
  depthvar.axis = "Z"
  depthvar.reference = "sea_level"
  depthvar.coordinate_reference_frame = "urn:ogc:crs:EPSG::5113"

  depthqcvar = nc.createVariable("DEPH_QC", "b", ("TIME", "DEPTH"), \
    fill_value = QC_FILL_VALUE)
  assignqcvarattributes_(depthqcvar)
  depthqcvar[:] = 7

  positionvar = nc.createVariable("POSITIONING_SYSTEM", "c", ("TIME", "DEPTH"),\
    fill_value = " ")
  positionvar.longname = "Positioning system"
  positionvar.flag_values = "A, G, L, N, U"
  positionvar.flag_meanings = "Argos, GPS, Loran, Nominal, Unknown"

  sstvar = nc.createVariable("TEMP", "f", ("TIME", "DEPTH"), \
    fill_value = -9999)
  sstvar.long_name = "Sea temperature"
  sstvar.standard_name = "sea_water_temperature"
  sstvar.units = "degrees_C"

  # SST is not explicitly QCed with a flag, so set to Unknown.
  # Once we have per-sensor QC flags we can fill this in properly
  sstqcvar = nc.createVariable("TEMP_QC", "b", ("TIME", "DEPTH"), \
   fill_value = QC_FILL_VALUE)
  assignqcvarattributes_(sstqcvar)
  sstqcvar[:] = 0

  sssvar = nc.createVariable("PSAL", "f", ("TIME", "DEPTH"), \
    fill_value = -9999)
  sssvar.long_name = "Practical salinity"
  sssvar.standard_name = "sea_water_practical_salinity"
  sssvar.units = "0.001"

  # SSS is not explicitly QCed with a flag, so set to Unknown.
  # Once we have per-sensor QC flags we can fill this in properly
  sssqcvar = nc.createVariable("PSAL_QC", "b", ("TIME", "DEPTH"), \
   fill_value = QC_FILL_VALUE)
  assignqcvarattributes_(sssqcvar)
  sssqcvar[:] = 0

  fco2var = nc.createVariable("FCO2", "f", ("TIME", "DEPTH"), \
    fill_value = -9999)
  fco2var.long_name = "fugacity_of_CO2_in_sea_water"
  fco2var.standard_name = "fugacity_of_CO2"
  fco2var.units = "µatm"

  # We do have QC flags for the fco2
  fco2qcvar = nc.createVariable("FCO2_QC", "b", ("TIME", "DEPTH"), \
    fill_value="-128")
  assignqcvarattributes_(fco2qcvar)

  # Dimension variables for data variables
  depthdmvar = nc.createVariable("DEPH_DM", "c", ("TIME", "DEPTH"), \
    fill_value = " ")
  assigndmvarattributes_(depthdmvar)

  sstdmvar = nc.createVariable("TEMP_DM", "c", ("TIME", "DEPTH"), \
    fill_value = " ")
  assigndmvarattributes_(sstdmvar)

  sssdmvar = nc.createVariable("PSAL_DM", "c", ("TIME", "DEPTH"), \
    fill_value = " ")
  assigndmvarattributes_(sssdmvar)

  fco2dmvar = nc.createVariable("FCO2_DM", "c", ("TIME", "DEPTH"), \
    fill_value = " ")
  assigndmvarattributes_(fco2dmvar)

  # And populate them
  depths = np.empty([len(lines), 1])
  positions = np.empty([len(lines), 1], dtype="object")
  temps = np.empty([len(lines), 1])
  sals = np.empty([len(lines), 1])
  fco2s = np.empty([len(lines), 1])
  fco2qcs = np.empty([len(lines), 1])
  dms = np.empty([len(lines), 1], dtype="object")

  for i in range(0, len(lines)):
    fields = str.split(lines[i], ",")
    depths[i, 0] = 5
    positions[i, 0] = "G"
    dms[i, 0] = "R"

    if fields[3] == "":
      temps[i, 0] = -9999
    else:
      temps[i, 0] = fields[3]

    if fields[4] == "":
      sals[i, 0] = -9999
    else:
      sals[i, 0] = fields[4]

    if fields[5] == "":
      fco2s[i, 0] = -9999
    else:
      fco2s[i, 0] = fields[5]

    if len(fields[6]) == 0:
      fco2qcs[i, 0] = -128
    else:
      fco2qcs[i, 0] = makeqcvalue_(int(fields[6]))

  depthvar[:,:] = depths
  positionvar[:,:] = positions
  sstvar[:,:] = temps
  sssvar[:,:] = sals
  fco2var[:,:] = fco2s
  fco2qcvar[:,:] = fco2qcs
  depthdmvar[:,:] = dms
  sstdmvar[:,:] = dms
  sssdmvar[:,:] = dms
  fco2dmvar[:,:] = dms

  # Global attributes
  nc.id = filenameroot

  nc.data_type = "OceanSITES trajectory data"
  nc.netcdf_version = "netCDF-4 classic model"
  nc.format_version = "1.2"
  nc.Conventions = "CF-1.6 OceanSITES-Manual-1.2 Copernicus-InSituTAC-SRD-1.3 "\
    + "Copernicus-InSituTAC-ParametersList-3.1.0"

  nc.cdm_data_type = "Trajectory"
  nc.data_mode = "R"
  nc.area = "Global Ocean"

  nc.geospatial_lat_min = str(minlat)
  nc.geospatial_lat_max = str(maxlat)
  nc.geospatial_lon_min = str(minlon)
  nc.geospatial_lon_max = str(maxlon)
  nc.geospatial_vertical_min = "5.00"
  nc.geospatial_vertical_max = "5.00"

  nc.last_latitude_observation = lats[-1]
  nc.last_longitude_observation = lons[-1]
  nc.last_date_observation = endtime.strftime("%Y-%m-%dT%H:%M:%SZ")
  nc.time_coverage_start = starttime.strftime("%Y-%m-%dT%H:%M:%SZ")
  nc.time_coverage_end = endtime.strftime("%Y-%m-%dT%H:%M:%SZ")

  #datasetdate = datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ")
  #nc.date_update = datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ")
  #nc.history = datasetdate + " : Creation"

  nc.update_interval = "daily"

  nc.data_assembly_center = "BERGEN"
  nc.institution = "University of Bergen / Geophysical Institute"
  nc.institution_edmo_code = "4595"
  nc.institution_references = " "
  nc.contact = "*****@*****.**"
  nc.title = "Global Ocean - In Situ near-real time carbon observation"
  nc.author = "cmems-service"
  nc.naming_authority = "Copernicus"

  nc.platform_code = getplatformcallsign_(platform_code)
  nc.site_code = getplatformcallsign_(platform_code)

  # For buoys -> Mooring observation.
  platform_category_code = getplatformcategorycode_(platform_code)
  nc.platform_name = getplatformname_(platform_code)
  nc.source_platform_category_code = platform_category_code
  nc.source = PLATFORM_CODES[platform_category_code]

  nc.quality_control_indicator = "6" # "Not used"
  nc.quality_index = "0"

  nc.comment = " "
  nc.summary = " "
  nc.reference = "http://marine.copernicus.eu/, https://www.icos-cp.eu/"
  nc.citation = "These data were collected and made freely available by the " \
    + "Copernicus project and the programs that contribute to it."
  nc.distribution_statement = "These data follow Copernicus standards; they " \
    + "are public and free of charge. User assumes all risk for use of data. " \
    + "User must display citation in any publication or product using data. " \
    + "User must contact PI prior to any commercial use of data."

  # Write the netCDF
  nc.close()

  # Read the netCDF file into memory
  with open(ncpath, "rb") as ncfile:
    ncbytes = ncfile.read()

  # Delete the temp netCDF file
  os.remove(ncpath)

  return [filenameroot, ncbytes]
# 
# and reproject from the spherical MODICE ellipsoid to wgs84 with:
# 

# In[2]:

from netCDF4 import Dataset
import json


# In[ ]:

# Assume that /projects/CHARIS is sshfs mounted on this machine, and
# that the user has write permission
fid = Dataset('~/projects/CHARIS/snow_cover/modice.v0.4/min05yr_nc/MODICE.v0.4.1test.nc', 'w', format='NETCDF4')
fid.Conventions = "CF-1.6"
fid = Dataset('/home/vagrant/measures-byu/src/prod/cetb_file/templates/cetb_global_template.nc', 'w', format='NETCDF4')
fid.Conventions = "CF-1.6"
fid.title = "MODICE mask for a minimum number of years"
fid.product_version = "v0.4"
#fid.software_version_id = "TBD"
#fid.software_repository = "[email protected]:nsidc/measures-byu.git"
fid.source = "MODICE"
fid.source_version_id = "v04"
fid.history = ""
fid.comment = "Mask locations with 2 indicate MODICE for >= min_years."
fid.references = "Painter, T. H., Brodzik, M. J., A. Racoviteanu, R. Armstrong. 2012. Automated mapping of Earth's annual minimum exposed snow and ice with MODIS. Geophysical Research Letters, 39(20):L20501, doi:10.1029/2012GL053340."
fid.summary = ["An improved, enhanced-resolution, gridded passive microwave Earth System Data Record \n",
               "for monitoring cryospheric and hydrologic time series\n" ]fid.title = "MEaSUREs Calibrated Passive Microwave Daily EASE-Grid 2.0 Brightness Temperature ESDR"
fid.institution = ["National Snow and Ice Data Center\n",
                   "Cooperative Institute for Research in Environmental Sciences\n",
Пример #44
0
def createinitfile(confM2R, ntime, var, data1=None, data2=None, data3=None, data4=None):
    # Create initial file for use with ROMS. This is the same as extracting time 0 from
    # the climatology file.
    if (confM2R.myformat == 'NETCDF4'):
        myzlib = True
    else:
        myzlib = False

    grdROMS = confM2R.grdROMS

    if not grdROMS.ioInitInitialized:
        grdROMS.ioInitInitialized = True
        if os.path.exists(confM2R.initname):
            os.remove(confM2R.initname)

        f1 = Dataset(confM2R.initname, mode='w', format=confM2R.myformat)
        f1.title = "Initial forcing file (INIT) used for foring of the ROMS model"
        f1.description = "Created for the %s grid file" % (confM2R.romsgridpath)
        f1.grd_file = "Gridfile: %s" % (confM2R.romsgridpath)
        f1.history = "Created " + time.ctime(time.time())
        f1.source = "Trond Kristiansen ([email protected])"
        f1.type = "File in %s format created using MODEL2ROMS" % (confM2R.myformat)
        f1.link = "https://github.com/trondkr/model2roms"
        f1.Conventions = "CF-1.0"

        # Define dimensions
        f1.createDimension('xi_rho', grdROMS.xi_rho)
        f1.createDimension('eta_rho', grdROMS.eta_rho)
        f1.createDimension('xi_u', grdROMS.xi_u)
        f1.createDimension('eta_u', grdROMS.eta_u)
        f1.createDimension('xi_v', grdROMS.xi_v)
        f1.createDimension('eta_v', grdROMS.eta_v)
        f1.createDimension('xi_psi', grdROMS.xi_psi)
        f1.createDimension('eta_psi', grdROMS.eta_psi)
        f1.createDimension('ocean_time', None)
        f1.createDimension('s_rho', len(grdROMS.s_rho))
        f1.createDimension('s_w', len(grdROMS.s_w))

        vnc = f1.createVariable('lon_rho', 'd', ('eta_rho', 'xi_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = 'Longitude of RHO-points'
        vnc.units = 'degree_east'
        vnc.standard_name = 'longitude'
        vnc[:, :] = grdROMS.lon_rho

        vnc = f1.createVariable('lat_rho', 'd', ('eta_rho', 'xi_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = 'Latitude of RHO-points'
        vnc.units = 'degree_north'
        vnc.standard_name = 'latitude'
        vnc[:, :] = grdROMS.lat_rho

        vnc = f1.createVariable('lon_u', 'd', ('eta_u', 'xi_u',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = 'Longitude of U-points'
        vnc.units = 'degree_east'
        vnc.standard_name = 'longitude'
        vnc[:, :] = grdROMS.lon_u

        vnc = f1.createVariable('lat_u', 'd', ('eta_u', 'xi_u',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = 'Latitude of U-points'
        vnc.units = 'degree_north'
        vnc.standard_name = 'latitude'
        vnc[:, :] = grdROMS.lat_u

        vnc = f1.createVariable('lon_v', 'd', ('eta_v', 'xi_v',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = 'Longitude of V-points'
        vnc.units = 'degree_east'
        vnc.standard_name = 'longitude'
        vnc[:, :] = grdROMS.lon_v

        vnc = f1.createVariable('lat_v', 'd', ('eta_v', 'xi_v',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = 'Latitude of V-points'
        vnc.units = 'degree_north'
        vnc.standard_name = 'latitude'
        vnc[:, :] = grdROMS.lat_v

        vnc = f1.createVariable('lat_psi', 'd', ('eta_psi', 'xi_psi',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = 'Latitude of PSI-points'
        vnc.units = 'degree_north'
        vnc.standard_name = 'latitude'
        vnc[:, :] = grdROMS.lat_psi

        vnc = f1.createVariable('lon_psi', 'd', ('eta_psi', 'xi_psi',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = 'Longitude of PSI-points'
        vnc.units = 'degree_east'
        vnc.standard_name = 'longitude'
        vnc[:, :] = grdROMS.lon_psi

        vnc = f1.createVariable('h', 'd', ('eta_rho', 'xi_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = 'Final bathymetry at RHO points'
        vnc.units = 'meter'
        vnc.field = "bath, scalar"
        vnc[:, :] = grdROMS.h

        vnc = f1.createVariable('s_rho', 'd', ('s_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = "S-coordinate at RHO-points"
        vnc.valid_min = -1.
        vnc.valid_max = 0.
        vnc.positive = "up"
        if grdROMS.vtransform == 2:
            vnc.standard_name = "ocean_s_coordinate_g2"
            vnc.formula_terms = "s: s_rho C: Cs_r eta: zeta depth: h depth_c: hc"
        if grdROMS.vtransform == 1:
            vnc.standard_name = "ocean_s_coordinate_g1"
            vnc.formula_terms = "s: s_rho C: Cs_r eta: zeta depth: h depth_c: hc"
        vnc.field = "s_rho, scalar"
        vnc[:] = grdROMS.s_rho

        vnc = f1.createVariable('s_w', 'd', ('s_w',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = "S-coordinate at W-points"
        vnc.valid_min = -1.
        vnc.valid_max = 0.
        vnc.positive = "up"
        if grdROMS.vtransform == 2:
            vnc.standard_name = "ocean_s_coordinate_g2"
            vnc.formula_terms = "s: s_w C: Cs_w eta: zeta depth: h depth_c: hc"
        if grdROMS.vtransform == 1:
            vnc.standard_name = "ocean_s_coordinate_g1"
            vnc.formula_terms = "s: s_w C: Cs_w eta: zeta depth: h depth_c: hc"
        vnc.field = "s_w, scalar"
        vnc[:] = grdROMS.s_w

        vnc = f1.createVariable('Cs_rho', 'd', ('s_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = "S-coordinate stretching curves at RHO-points"
        vnc.valid_min = -1.
        vnc.valid_max = 0.
        vnc.field = "s_rho, scalar"
        vnc[:] = grdROMS.Cs_rho

        vnc = f1.createVariable('hc', 'd')
        vnc.long_name = "S-coordinate parameter, critical depth";
        vnc.units = "meter"
        vnc[:] = grdROMS.hc

        vnc = f1.createVariable('z_r', 'd', ('s_rho', 'eta_rho', 'xi_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = "Sigma layer to depth matrix";
        vnc.units = "meter"
        vnc[:, :, :] = grdROMS.z_r

        vnc = f1.createVariable('Tcline', 'd')
        vnc.long_name = "S-coordinate surface/bottom layer width";
        vnc.units = "meter"
        vnc[:] = grdROMS.tcline

        vnc = f1.createVariable('theta_s', 'd')
        vnc.long_name = "S-coordinate surface control parameter"
        vnc[:] = grdROMS.theta_s

        vnc = f1.createVariable('theta_b', 'd')
        vnc.long_name = "S-coordinate bottom control parameter"
        vnc[:] = grdROMS.theta_b

        vnc = f1.createVariable('angle', 'd', ('eta_rho', 'xi_rho',), zlib=myzlib, fill_value=grdROMS.fillval)
        vnc.long_name = "angle between xi axis and east"
        vnc.units = "radian"

        v_time = f1.createVariable('ocean_time', 'd', ('ocean_time',), zlib=myzlib, fill_value=grdROMS.fillval)
        
        v_time.long_name = 'seconds since 1948-01-01 00:00:00'
        v_time.units = 'seconds since 1948-01-01 00:00:00'
        v_time.field = 'time, scalar, series'
        if (confM2R.indatatype == "NORESM"):
            v_time.calendar = 'noleap'
        else:
            v_time.calendar = 'standard'

        v_temp = f1.createVariable('temp', 'f', ('ocean_time', 's_rho', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                   fill_value=grdROMS.fillval)
        v_temp.long_name = "potential temperature"
        v_temp.units = "Celsius"
        v_temp.time = "ocean_time"
        #v_temp.missing_value = grdROMS.fillval

        v_salt = f1.createVariable('salt', 'f', ('ocean_time', 's_rho', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                   fill_value=grdROMS.fillval)
        v_salt.long_name = "salinity"
        v_salt.time = "ocean_time"
        v_salt.field = "salinity, scalar, series"
        #v_salt.missing_value = grdROMS.fillval

        v_ssh = f1.createVariable('zeta', 'f', ('ocean_time', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                  fill_value=grdROMS.fillval)
        v_ssh.long_name = "sea level"
        v_ssh.units = "meter"
        v_ssh.time = "ocean_time"
        #v_ssh.missing_value = grdROMS.fillval

        v_u = f1.createVariable('u', 'f', ('ocean_time', 's_rho', 'eta_u', 'xi_u',), zlib=myzlib,
                                fill_value=grdROMS.fillval)
        v_u.long_name = "U-velocity, scalar, series"
        v_u.units = "meter second-1"
        v_u.time = "ocean_time"
        #v_u.missing_value = grdROMS.fillval

        v_v = f1.createVariable('v', 'f', ('ocean_time', 's_rho', 'eta_v', 'xi_v',), zlib=myzlib,
                                fill_value=grdROMS.fillval)
        v_v.long_name = "V-velocity, scalar, series"
        v_v.units = "meter second-1"
        v_v.time = "ocean_time"
        #v_v.missing_value = grdROMS.fillval

        v_vbar = f1.createVariable('vbar', 'f', ('ocean_time', 'eta_v', 'xi_v',), zlib=myzlib,
                                   fill_value=grdROMS.fillval)
        v_vbar.long_name = "Barotropic V-velocity, scalar, series"
        v_vbar.units = "meter second-1"
        v_vbar.time = "ocean_time"
        #v_vbar.missing_value = grdROMS.fillval

        v_ubar = f1.createVariable('ubar', 'f', ('ocean_time', 'eta_u', 'xi_u',), zlib=myzlib,
                                   fill_value=grdROMS.fillval)
        v_ubar.long_name = "Barotropic U-velocity, scalar, series"
        v_ubar.units = "meter second-1"
        v_ubar.time = "ocean_time"
        #v_ubar.missing_value = grdROMS.fillval

        if confM2R.writebcg:

            v_o3_c = f1.createVariable('O3_c', 'f', ('ocean_time', 's_rho', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
            v_o3_c.long_name = "carbonate/total dissolved inorganic carbon"
            v_o3_c.time = "ocean_time"
            v_o3_c.units = "mmol C/m^3"
            v_o3_c.field = "O3_c, scalar, series"

            v_o3_ta = f1.createVariable('O3_TA', 'f', ('ocean_time', 's_rho', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
            v_o3_ta.long_name = "carbonate/bioalkalinity"
            v_o3_ta.time = "ocean_time"
            v_o3_ta.units = "umol/kg"
            v_o3_ta.field = "O3_ta, scalar, series"

            v_n1_p = f1.createVariable('N1_p', 'f', ('ocean_time', 's_rho', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
            v_n1_p.long_name = "phosphate/phosphorus"
            v_n1_p.time = "ocean_time"
            v_n1_p.units = "mmol P/m^3"
            v_n1_p.field = "N1_p, scalar, series"

            v_o2_o = f1.createVariable('O2_o', 'f', ('ocean_time', 's_rho', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
            v_o2_o.long_name = "oxygen/oxygen"
            v_o2_o.time = "ocean_time"
            v_o2_o.units = "mmol O_2/m^3"
            v_o2_o.field = "O2_o, scalar, series"

            v_n3_n = f1.createVariable('N3_n', 'f', ('ocean_time', 's_rho', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
            v_n3_n.long_name = "nitrate/nitrogen"
            v_n3_n.time = "ocean_time"
            v_n3_n.units = "mmol N/m^3"
            v_n3_n.field = "N3_n, scalar, series"

            v_n5_s = f1.createVariable('N5_s', 'f', ('ocean_time', 's_rho', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
            v_n5_s.long_name = "silicate/silicate"
            v_n5_s.time = "ocean_time"
            v_n5_s.units = "mmol Si/m^3"
            v_n5_s.field = "N5_s, scalar, series"

        if confM2R.writeice:
            ageice = f1.createVariable('ageice', 'f', ('ocean_time', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
            ageice.long_name = "time-averaged age of the ice"
            ageice.units = "years"
            ageice.time = "ocean_time"
            ageice.field = "ice age, scalar, series"
         #   ageice.missing_value = grdROMS.fillval

            uice = f1.createVariable('uice', 'f', ('ocean_time', 'eta_u', 'xi_u',), zlib=myzlib,
                                     fill_value=grdROMS.fillval)
            uice.long_name = "time-averaged u-component of ice velocity"
            uice.units = "meter second-1"
            uice.time = "ocean_time"
            uice.field = "u-component of ice velocity, scalar, series"
          #  uice.missing_value = grdROMS.fillval

            vice = f1.createVariable('vice', 'f', ('ocean_time', 'eta_v', 'xi_v',), zlib=myzlib,
                                     fill_value=grdROMS.fillval)

            vice.long_name = "time-averaged v-component of ice velocity"
            vice.units = "meter second-1"
            vice.time = "ocean_time"
            vice.field = "v-component of ice velocity, scalar, series"
           # vice.missing_value = grdROMS.fillval

            aice = f1.createVariable('aice', 'f', ('ocean_time', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                     fill_value=grdROMS.fillval)

            aice.long_name = "time-averaged fraction of cell covered by ice"
            aice.time = "ocean_time"
            aice.field = "ice concentration, scalar, series"
            #aice.missing_value = grdROMS.fillval

            hice = f1.createVariable('hice', 'f', ('ocean_time', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                     fill_value=grdROMS.fillval)
            hice.long_name = "time-averaged average ice thickness in cell"
            hice.units = "meter"
            hice.time = "ocean_time"
            hice.field = "ice thickness, scalar, series"
            #hice.missing_value = grdROMS.fillval

            snow_thick = f1.createVariable('snow_thick', 'f', ('ocean_time', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                           fill_value=grdROMS.fillval)

            snow_thick.long_name = "time-averaged thickness of snow cover"
            snow_thick.units = "meter"
            snow_thick.time = "ocean_time"
            snow_thick.field = "snow thickness, scalar, series"
            #snow_thick.missing_value = grdROMS.fillval

            ti = f1.createVariable('ti', 'f', ('ocean_time', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                   fill_value=grdROMS.fillval)

            ti.long_name = "time-averaged interior ice temperature"
            ti.units = "degrees Celcius"
            ti.time = "ocean_time"
            ti.field = "interior temperature, scalar, series"
            #ti.missing_value = grdROMS.fillval

            sfwat = f1.createVariable('sfwat', 'f', ('ocean_time', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                      fill_value=grdROMS.fillval)

            sfwat.long_name = "time-averaged surface melt water thickness on ice"
            sfwat.units = "meter"
            sfwat.time = "ocean_time"
            sfwat.field = "melt water thickness, scalar, series"
            #sfwat.missing_value = grdROMS.fillval

            tisrf = f1.createVariable('tisrf', 'f', ('ocean_time', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                      fill_value=grdROMS.fillval)
            tisrf.long_name = "time-averaged temperature of ice surface"
            tisrf.units = "degrees Celcius"
            tisrf.time = "ocean_time"
            tisrf.field = "surface temperature, scalar, series"
            #tisrf.missing_value = grdROMS.fillval

            sig11 = f1.createVariable('sig11', 'f', ('ocean_time', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                      fill_value=grdROMS.fillval)

            sig11.long_name = "time-averaged internal ice stress 11 component"
            sig11.units = "Newton meter-1"
            sig11.time = "ocean_time"
            sig11.field = "ice stress 11, scalar, series"
            #sig11.missing_value = grdROMS.fillval

            sig12 = f1.createVariable('sig12', 'f', ('ocean_time', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                      fill_value=grdROMS.fillval)

            sig12.long_name = "time-averaged internal ice stress 12 component"
            sig12.units = "Newton meter-1"
            sig12.time = "ocean_time"
            sig12.field = "ice stress 12, scalar, series"
            #sig12.missing_value = grdROMS.fillval

            sig22 = f1.createVariable('sig22', 'f', ('ocean_time', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                      fill_value=grdROMS.fillval)

            sig22.long_name = "time-averaged internal ice stress 22 component"
            sig22.units = "Newton meter-1"
            sig22.time = "ocean_time"
            sig22.field = "ice stress 22, scalar, series"
            #sig22.missing_value = grdROMS.fillval

            vnc = f1.createVariable('tau_iw', 'd')
            vnc.long_name = "Tau_iw";
            vnc.units = "unknown"

            vnc = f1.createVariable('chu_iw', 'd')
            vnc.long_name = "Chu_iw";
            vnc.units = "unknown"

            v_tomk = f1.createVariable('t0mk', 'f', ('ocean_time', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
            v_tomk.long_name = "t0mk potential temperature"
            v_tomk.units = "Celsius"
            v_tomk.time = "ocean_time"
            #v_tomk.missing_value = grdROMS.fillval

            v_somk = f1.createVariable('s0mk', 'f', ('ocean_time', 'eta_rho', 'xi_rho',), zlib=myzlib,
                                       fill_value=grdROMS.fillval)
            v_somk.long_name = "s0mk salinity"
            v_somk.time = "ocean_time"
            v_somk.field = "salinity, scalar, series"
            #v_somk.missing_value = grdROMS.fillval

        print(("grdROMS.time: ", grdROMS.time))
        if grdROMS.timeunits[0:7] == "seconds":
            d = num2date(grdROMS.time, units=v_time.long_name, calendar=v_time.calendar)
        else:
            d = num2date(grdROMS.time * 86400.0, units=v_time.long_name, calendar=v_time.calendar)

        print('\n')
        print('=========================================================================')
        print('Created INIT file')
        print(('set inittime in grd.py for time-index to print (current=%s)' % (grdROMS.inittime)))
        print(('The time stamp for ROMS .in file saved to initial file is=> %s' % (d)))
        print(('DSTART   = %s' % (grdROMS.time)))
        print(('TIME_REF = %s' % (v_time.long_name)))
        print('=========================================================================')
        print('\n')
    else:
        f1 = Dataset(confM2R.initname, mode='a', format=confM2R.myformat)

    ntime = 0
    if (grdROMS.timeunits[0:7] == "seconds"):
        f1.variables['ocean_time'][ntime] = grdROMS.time
    else:
        f1.variables['ocean_time'][ntime] = grdROMS.time * 86400.0

    if var.lower() == 'temperature':
        f1.variables['temp'][ntime, :, :, :] = data1
        if confM2R.writeice:
            f1.variables['t0mk'][ntime, :, :] = np.squeeze(data1[len(grdROMS.z_r) - 1, :, :])
    if var.lower() == 'salinity':
        f1.variables['salt'][ntime, :, :, :] = data1
        if confM2R.writeice:
            f1.variables['s0mk'][ntime, :, :] = np.squeeze(data1[len(grdROMS.z_r) - 1, :, :])

    if var.lower() == 'ssh':
        f1.variables['zeta'][ntime, :, :] = data1
    if var in ['uvel', 'vvel', 'ubar', 'vbar']:
        f1.variables['u'][ntime, :, :, :] = data1
        f1.variables['v'][ntime, :, :, :] = data2
        f1.variables['ubar'][ntime, :, :] = data3
        f1.variables['vbar'][ntime, :, :] = data4

    if confM2R.writebcg:
        if var in ['O3_c','O3_TA','N1_p','N3_n','N5_s','O2_o']:
            data1 = np.where(abs(data1) < 0, 0, data1)
            if confM2R.indatatype=="NORESM":
                if var=="O3_TA": 
                    data1=data1*1.0e6/1025.
                else: 
                    data1=data1*1.0e3
            f1.variables[var][ntime,:,:,:] = data1

    if confM2R.writeice:
        if var.lower() == "ageice":
            data1 = np.where(abs(data1) > 120, 0, data1)
            f1.variables['ageice'][ntime, :, :] = data1

        if var.lower() in ['uice', 'vice']:
            data1 = np.where(abs(data1) > 120, 0, data1)
            f1.variables[var.lower()][ntime, :, :] = data1 / 100.

        if var.lower() == 'aice':
            data1 = np.where(abs(data1) > 120, 0, data1)
            f1.variables['aice'][ntime, :, :] = data1 / 100.
            f1.variables['sfwat'][ntime, :, :] = 0.
            f1.variables['tisrf'][ntime, :, :] = 0.
            f1.variables['ti'][ntime, :, :] = 0.
            f1.variables['sig11'][ntime, :, :] = 0.
            f1.variables['sig12'][ntime, :, :] = 0.
            f1.variables['sig22'][ntime, :, :] = 0.

            if confM2R.indatatype == 'GLORYS':
                f1.variables['snow_thick'][ntime, :, :] = 0.
                f1.variables['ageice'][ntime, :, :] = 0.

        if var.lower() == 'hice':
            data1 = np.where(abs(data1) > 10, 0, data1)
            f1.variables['hice'][ntime, :, :] = data1
        if var.lower() == 'snow_thick':
            data1 = np.where(abs(data1) > 100, 0, data1)
            f1.variables['snow_thick'][ntime, :, :] = data1

        f1.variables['tau_iw'] = 0.015
        f1.variables['chu_iw'] = 0.0012

    f1.close()
    lonsa[:]  = lons_anal
    latsa[:]  = lats_anal
    lonsf[:]  = lons_fcst
    latsf[:]  = lats_fcst

    conusmask[:] = conusmask_ccpa

    thrnumv[:] = xc[:]
    thrvalv[:] = thresh[:]
 
    rootgrp.latcorners = [lats_anal[0,0], lats_anal[0,-1], lats_anal[-1,0], lats_anal[-1,-1]]
    rootgrp.loncorners = [lons_anal[0,0], lons_anal[0,-1], lons_anal[-1,0], lons_anal[-1,-1]]

    rootgrp.stream = "s4" # ????
    rootgrp.title = "Reforecast V2 accum. ensemble-mean precip forecast and analyzed CDF + rank correlation"
    rootgrp.Conventions = "CF-1.0"  # ????
    rootgrp.history = "Revised Mar 2016 by Hamill" 
    rootgrp.institution = \
        "Reforecast from ERSL/PSD using NCEP/EMC GEFS, circa 2012"
    rootgrp.platform = "Model" 
    rootgrp.references = "http://www.esrl.noaa.gov/psd/forecasts/reforecast2/" 
    
    # ---- open ensemble data file for each year, read in data, and augment cdf 
    #      information for that year if the sample is within the month of interest
    #      or the neighboring month

    rankcorr_fa = -99.99*np.ones((nja,nia),dtype=np.float)    
    nyears = len(range(2002,2016))
    print 'nsamps = ',92*nyears
    precipa = np.zeros((nja,nia),dtype=np.float)
    precipf3d = np.zeros((92*nyears,njf,nif),dtype=np.float)
Пример #46
0
cmplgrp = Dataset('/Users/Bora/Desktop/REU/Bond/DDCode/03.nc','a')

time_1= cmplgrp.createDimension('time', None)
lat= cmplgrp.createDimension('latitude', 241)
lon= cmplgrp.createDimension('longitude', 480)

times= cmplgrp.createVariable('time',np.int32,('time',))
latitudes= cmplgrp.createVariable('latitude',np.float32,('latitude',))
longitudes=cmplgrp.createVariable('longitude',np.float32,('longitude',))
temp= cmplgrp.createVariable('t2m',np.short,('time','latitude','longitude',))
#crs = cmplgrp.createVariable('crs','i4')

import time
cmplgrp.history = 'Created ' + time.ctime(time.time())
cmplgrp.Conventions = 'CF-1.6'

latitudes.long_name = 'latitude'
latitudes.units = 'degrees_north'

longitudes.units = 'degrees_east'
longitudes.long_name='longitude'

times.long_name = 'time'
times.units = 'days since 2000-1-1 0:0:0'
times.calendar='noleap'



temp.long_name = '2 meter temperature averages for 20 years'
temp.units = 'K'
Пример #47
0
def createnetCDF(fieldfile):
    ''' Creates the netCDF file to then be opened in field2nc. 
    '''
    ncfile = '/group_workspaces/jasmin/hiresgw/mj07/'+fieldfile+'.theta.nc'
    f = Dataset(ncfile,'w')

    zres = 180
    latres = 768
    lonres = 1024
    # Create dimensions
    time = f.createDimension('time',None)
    z_hybrid_height = f.createDimension('z_hybrid_height',zres)
    latitude = f.createDimension('latitude',latres)
    longitude = f.createDimension('longitude',lonres)
    bound = f.createDimension('bound',2)

    # Create variables (added s on the end to differentiate between dimensions
    #                   and variables)
    times = f.createVariable('time','f4',('time',),zlib=True)
    z_hybrid_heights = f.createVariable('z_hybrid_height','f4',
                                        ('z_hybrid_height',),zlib=True)
    latitudes = f.createVariable('latitude','f4',('latitude',),zlib=True)
    bounds_latitude = f.createVariable('bounds_latitude','f8',
                                       ('latitude','bound',),zlib=True)
    longitudes = f.createVariable('longitude','f4',('longitude',),zlib=True)
    bounds_longitude = f.createVariable('bounds_longitude','f8',
                                        ('longitude','bound',),zlib=True)
    v = f.createVariable('theta','f4',('time','z_hybrid_height','latitude',
                                   'longitude',),zlib=True)

    # Add in attributes
    f.Conventions = 'CF-1.6'
    times.units = 'hours since 1991-03-01 00:00:00'
    times.standard_name = 'time'
    times.calendar = '360_day'
    times.axis = 'T'
    z_hybrid_heights.positive = 'up'
    z_hybrid_heights.long_name = 'atmosphere hybrid height coordinate'
    z_hybrid_heights.standard_name = 'atmosphere_hybrid_height_coordinate'
    z_hybrid_heights.units = 'm'
    z_hybrid_heights.axis = 'Z'
    latitudes.bounds = 'bounds_latitude'
    latitudes.units = 'degrees_north'
    latitudes.standard_name = 'latitude'
    latitudes.point_spacing = 'even'
    latitudes.axis = 'Y'
    longitudes.bounds = 'bounds_longitude'
    longitudes.modulo = 360.
    longitudes.point_spacing = 'even'
    longitudes.standard_name = 'longitude'
    longitudes.units = 'degrees_east'
    longitudes.axis = 'X'
    longitudes.topology = 'circular'
    v.long_name = 'THETA'
    v.standard_name = 'air_potential_temperature'
    v.units = 'K'
    v.missing_value = -1.073742e+09

    # Add in values of lat, lon and height
    f2 = cdms2.open('/group_workspaces/jasmin/hiresgw/xjanp/'+fieldfile)
    var = f2.getVariables()
    
    v2 = var[9]

    z2 = f2.getVariables()[0]
    zvals = z2.domain[0][0][:]
    # Check the length of the latitude dimension
    if v2.shape[2] == 768:
        latvals = np.linspace(-90+90./768,90-90./768,768)
    elif v2.shape[2] == 769:
        latvals = np.linspace(-90,90,769)
    else: raise ValueError('Unhandled latitude dimension')

    # Check the length of the latitude dimension
    if v2.shape[3] == 1024 and v2.shape[2] == 768:
        lonvals = np.linspace(0,360-306./1024,1024)
    elif v2.shape[3] == 1024 and v2.shape[2] == 769:
        lonvals = np.linspace(360./(1024*2),360.-360./(1024*2),1024)
    else: raise ValueError('Unhandled longitude dimension')
    
    print v2.name_in_file
    print v2.shape
    #print v2.

    latitudes[:] = latvals[:]
    longitudes[:] = lonvals[:]
    z_hybrid_heights[:] = zvals[:]
    f2.close()

    f.close()
Пример #48
0
    var = 'dummy'
    var_out = nc.createVariable(
        var,
        'f',
        dimensions=(
            "y",
            "x"),
        fill_value=-2e9)
    var_out.units = "meters"
    var_out.long_name = "Just A Dummy"
    var_out.comment = "This is just a dummy variable for CDO."
    var_out.grid_mapping = "mapping"
    var_out.coordinates = "lon lat"
    var_out[:] = 0.

    mapping = nc.createVariable("mapping", 'c')
    mapping.ellipsoid = "WGS84"
    mapping.false_easting = 0.
    mapping.false_northing = 0.
    mapping.grid_mapping_name = "polar_stereographic"
    mapping.latitude_of_projection_origin = 90.
    mapping.standard_parallel = 70.
    mapping.straight_vertical_longitude_from_pole = -45.

    from time import asctime
    historystr = 'Created ' + asctime() + '\n'
    nc.history = historystr
    nc.proj4 = projection
    nc.Conventions = 'CF-1.5'
    nc.close()
Пример #49
0
    def output_sector_netcdf(self,netcdf_path,out_path,patch_radius,config):
        """
        Segment patches of forecast tracks to only output data contined within a 
        region in the CONUS, as defined by the mapfile.

        Args:
            netcdf_path (str): Path to the full CONUS netcdf patch file.
            out_path (str): Path to output new segmented netcdf files.
            patch_radius (int): Size of the patch radius.
            config (dict): Dictonary containing information about data and
                            ML variables
        Returns:
            Segmented patch netcdf files.
        """
        
        nc_data = self.load_netcdf_data(netcdf_path,patch_radius)
    
        if nc_data is not None:
            out_filename = out_path + "{0}_{1}_{2}_model_patches.nc".format(
                                                            self.ensemble_name,
                                                            self.run_date.strftime(self.date_format),
                                                            self.member)
            out_file = Dataset(out_filename, "w")
            out_file.createDimension("p", np.shape(nc_data.variables['p'])[0])
            out_file.createDimension("row", np.shape(nc_data.variables['row'])[0])
            out_file.createDimension("col", np.shape(nc_data.variables['col'])[0])
            out_file.createVariable("p", "i4", ("p",))
            out_file.createVariable("row", "i4", ("row",))
            out_file.createVariable("col", "i4", ("col",))
            out_file.variables["p"][:] = nc_data.variables['p'][:]
            out_file.variables["row"][:] =  nc_data.variables['row'][:]
            out_file.variables["col"][:] =  nc_data.variables['col'][:]
            out_file.Conventions = "CF-1.6"
            out_file.title = "{0} Storm Patches for run {1} member {2}".format(self.ensemble_name,
                                                                       self.run_date.strftime(self.date_format),
                                                                       self.member)
            out_file.object_variable = config.watershed_variable
            meta_variables = ["lon", "lat", "i", "j", "x", "y", "masks"]
            meta_units = ["degrees_east", "degrees_north", "", "", "m", "m", ""]
            center_vars = ["time", "centroid_lon", "centroid_lat", "centroid_i", "centroid_j", "track_id", "track_step"]
            center_units = ["hours since {0}".format(self.run_date.strftime("%Y-%m-%d %H:%M:%S")),
                    "degrees_east",
                    "degrees_north",
                    "",
                    "",
                    "",
                    ""]

            label_columns = ["Matched", "Max_Hail_Size", "Num_Matches", "Shape", "Location", "Scale"]
        
            for m, meta_variable in enumerate(meta_variables):
                if meta_variable in ["i", "j", "masks"]:
                    dtype = "i4"
                else:
                    dtype = "f4"
                m_var = out_file.createVariable(meta_variable, dtype, ("p", "row", "col"), complevel=1, zlib=True)
                m_var.long_name = meta_variable
                m_var.units = meta_units[m]
        
            for c, center_var in enumerate(center_vars):
                if center_var in ["time", "track_id", "track_step"]:
                    dtype = "i4"
                else:
                    dtype = "f4"
                c_var = out_file.createVariable(center_var, dtype, ("p",), zlib=True, complevel=1)
                c_var.long_name = center_var
                c_var.units =center_units[c]
        
            for storm_variable in config.storm_variables:
                s_var = out_file.createVariable(storm_variable + "_curr", "f4", ("p", "row", "col"), complevel=1, zlib=True)
                s_var.long_name = storm_variable
                s_var.units = ""
        
            for potential_variable in config.potential_variables:
                p_var = out_file.createVariable(potential_variable + "_prev", "f4", ("p", "row", "col"),
                                        complevel=1, zlib=True)
                p_var.long_name = potential_variable
                p_var.units = ""
        
            if config.train:
                for label_column in label_columns:
                    if label_column in ["Matched", "Num_Matches"]:
                        dtype = "i4"
                    else:
                        dtype = "f4"
                    l_var = out_file.createVariable(label_column, dtype, ("p",), zlib=True, complevel=1)
                    l_var.long_name = label_column
                    l_var.units = ""
            
            out_file.variables["time"][:] = nc_data.variables['time'][:]
    
            for c_var in ["lon", "lat"]:
                out_file.variables["centroid_" + c_var][:] =  nc_data.variables['centroid_' + c_var][:]

            for c_var in ["i", "j"]:
                out_file.variables["centroid_" + c_var][:] =  nc_data.variables["centroid_" + c_var][:]
        
            out_file.variables["track_id"][:] =  nc_data.variables['track_id'][:]
            out_file.variables["track_step"][:] =  nc_data.variables['track_step'][:]
        
            for meta_var in meta_variables:
                if meta_var in ["lon", "lat"]:
                    out_file.variables[meta_var][:] = nc_data.variables[meta_var][:]
                else:
                    out_file.variables[meta_var][:] = nc_data.variables[meta_var][:]
        
            for storm_variable in config.storm_variables:
                out_file.variables[storm_variable + "_curr"][:] = nc_data.variables[storm_variable + '_curr'][:]
        
            for p_variable in config.potential_variables:
                out_file.variables[p_variable + "_prev"][:] = nc_data.variables[p_variable + '_prev'][:]
        
            if config.train:
                for label_column in label_columns:
                    try:
                        out_file.variables[label_column][:] = nc_data.variables[label_column][:]
                    except:
                        out_file.variables[label_column][:] = 0

            out_file.close()
        
            print("Output sector nc file " + out_filename)
        else:
            print('No {0} {1} netcdf file/sector data found'.format(self.member,
                                self.run_date.strftime("%Y%m%d")))

        return
def WriteNCCF(FileName,Dates,Latitudes,Longitudes,ClimPoints,DataObject,DimObject,AttrObject,GlobAttrObject):
    ''' Sort out the date/times to write out and time bounds '''
    ''' Sort out clim bounds '''
    ''' Sort out lat and long bounds '''
    ''' Convert variables using the obtained scale_factor and add_offset: stored_var=int((var-offset)/scale) '''
    ''' Write to file, set up given dimensions, looping through all potential variables and their attributes, and then the provided dictionary of global attributes '''
    
    # Sort out date/times to write out
    print(Dates)
    TimPoints,TimBounds = MakeDaysSince(Dates['StYr'],Dates['StMon'],Dates['EdYr'],Dates['EdMon'])
    nTims = len(TimPoints)
	
    # Sort out clim bounds - paired strings
    ClimBounds = np.empty((12,2),dtype='|S10')
    for mm in range(12):
	ClimBounds[mm,0] = str(ClimPoints[0])+'-'+str(mm+1)+'-'+str(1)
	ClimBounds[mm,1] = str(ClimPoints[1])+'-'+str(mm+1)+'-'+str(MonthDays[mm])
		
    # Sort out LatBounds and LonBounds
    LatBounds = np.empty((len(Latitudes),2),dtype='float')
    LonBounds = np.empty((len(Longitudes),2),dtype='float')
	
    LatBounds[:,0] = Latitudes - ((Latitudes[1]-Latitudes[0])/2.)
    LatBounds[:,1] = Latitudes + ((Latitudes[1]-Latitudes[0])/2.)

    LonBounds[:,0] = Longitudes - ((Longitudes[1]-Longitudes[0])/2.)
    LonBounds[:,1] = Longitudes + ((Longitudes[1]-Longitudes[0])/2.)	
	
    #pdb.set_trace()
    
    # No need to convert float data using given scale_factor and add_offset to integers - done within writing program (packV = (V-offset)/scale
    # Not sure what this does to float precision though...
    # Change mdi into an integer -999 because these are stored as integers
    for vv in range(len(DataObject)):
        DataObject[vv][np.where(DataObject[vv] == OLDMDI)] = MDI

    # Create a new netCDF file - have tried zlib=True,least_significant_digit=3 (and 1) - no difference
    ncfw=Dataset(FileName,'w',format='NETCDF4_CLASSIC') # need to try NETCDF4 and also play with compression but test this first
    
    # Write out the global attributes
    if ('description' in GlobAttrObject):
        ncfw.description = GlobAttrObject['description']
	#print(GlobAttrObject['description'])
	
    if ('File_created' in GlobAttrObject):
        ncfw.File_created = GlobAttrObject['File_created']

    if ('Title' in GlobAttrObject):
        ncfw.Title = GlobAttrObject['Title']

    if ('Institution' in GlobAttrObject):
        ncfw.Institution = GlobAttrObject['Institution']

    if ('History' in GlobAttrObject):
        ncfw.History = GlobAttrObject['History']

    if ('Licence' in GlobAttrObject):
        ncfw.Licence = GlobAttrObject['Licence']

    if ('Project' in GlobAttrObject):
        ncfw.Project = GlobAttrObject['Project']

    if ('Processing_level' in GlobAttrObject):
        ncfw.Processing_level = GlobAttrObject['Processing_level']

    if ('Acknowledgement' in GlobAttrObject):
        ncfw.Acknowledgement = GlobAttrObject['Acknowledgement']

    if ('Source' in GlobAttrObject):
        ncfw.Source = GlobAttrObject['Source']

    if ('Comment' in GlobAttrObject):
        ncfw.Comment = GlobAttrObject['Comment']

    if ('References' in GlobAttrObject):
        ncfw.References = GlobAttrObject['References']

    if ('Creator_name' in GlobAttrObject):
        ncfw.Creator_name = GlobAttrObject['Creator_name']

    if ('Creator_email' in GlobAttrObject):
        ncfw.Creator_email = GlobAttrObject['Creator_email']

    if ('Version' in GlobAttrObject):
        ncfw.Version = GlobAttrObject['Version']

    if ('doi' in GlobAttrObject):
        ncfw.doi = GlobAttrObject['doi']

    if ('Conventions' in GlobAttrObject):
        ncfw.Conventions = GlobAttrObject['Conventions']

    if ('netcdf_type' in GlobAttrObject):
        ncfw.netcdf_type = GlobAttrObject['netcdf_type']
	
    # Loop through and set up the dimension names and quantities
    for vv in range(len(DimObject[0])):
        ncfw.createDimension(DimObject[0][vv],DimObject[1][vv])
	
    # Go through each dimension and set up the variable and attributes for that dimension if needed
    for vv in range(len(DimObject)-2): # ignore first two elements of the list but count all other dictionaries
        print(DimObject[vv+2]['var_name'])
	
	# NOt 100% sure this works in a loop with overwriting
	# initiate variable with name, type and dimensions
	MyVar = ncfw.createVariable(DimObject[vv+2]['var_name'],DimObject[vv+2]['var_type'],DimObject[vv+2]['var_dims'])
        
	# Apply any other attributes
        if ('standard_name' in DimObject[vv+2]):
	    MyVar.standard_name = DimObject[vv+2]['standard_name']
	    
        if ('long_name' in DimObject[vv+2]):
	    MyVar.long_name = DimObject[vv+2]['long_name']
	    
        if ('units' in DimObject[vv+2]):
	    MyVar.units = DimObject[vv+2]['units']
		   	 
        if ('axis' in DimObject[vv+2]):
	    MyVar.axis = DimObject[vv+2]['axis']

        if ('calendar' in DimObject[vv+2]):
	    MyVar.calendar = DimObject[vv+2]['calendar']

        if ('start_year' in DimObject[vv+2]):
	    MyVar.start_year = DimObject[vv+2]['start_year']

        if ('end_year' in DimObject[vv+2]):
	    MyVar.end_year = DimObject[vv+2]['end_year']

        if ('start_month' in DimObject[vv+2]):
	    MyVar.start_month = DimObject[vv+2]['start_month']

        if ('end_month' in DimObject[vv+2]):
	    MyVar.end_month = DimObject[vv+2]['end_month']

        if ('bounds' in DimObject[vv+2]):
	    MyVar.bounds = DimObject[vv+2]['bounds']

        if ('climatology' in DimObject[vv+2]):
	    MyVar.climatology = DimObject[vv+2]['climatology']

        if ('point_spacing' in DimObject[vv+2]):
	    MyVar.point_spacing = DimObject[vv+2]['point_spacing']
	
	# Provide the data to the variable
        if (DimObject[vv+2]['var_name'] == 'time'):
	    MyVar[:] = TimPoints

        if (DimObject[vv+2]['var_name'] == 'bounds_time'):
	    MyVar[:,:] = TimBounds

        if (DimObject[vv+2]['var_name'] == 'month'):
	    for mm in range(12):
	        MyVar[mm,:] = stringtoarr(MonthName[mm],10)

        if (DimObject[vv+2]['var_name'] == 'climbounds'):
	    for mm in range(12):
	        MyVar[mm,0,:] = stringtoarr(ClimBounds[mm,0],10)
	        MyVar[mm,1,:] = stringtoarr(ClimBounds[mm,1],10)

        if (DimObject[vv+2]['var_name'] == 'latitude'):
	    MyVar[:] = Latitudes

        if (DimObject[vv+2]['var_name'] == 'bounds_lat'):
	    MyVar[:,:] = LatBounds

        if (DimObject[vv+2]['var_name'] == 'longitude'):
	    MyVar[:] = Longitudes

        if (DimObject[vv+2]['var_name'] == 'bounds_lon'):
	    MyVar[:,:] = LonBounds

    # Go through each variable and set up the variable attributes
    for vv in range(len(AttrObject)): # ignore first two elements of the list but count all other dictionaries

        print(AttrObject[vv]['var_name'])

        # NOt 100% sure this works in a loop with overwriting
	# initiate variable with name, type and dimensions
	MyVar = ncfw.createVariable(AttrObject[vv]['var_name'],AttrObject[vv]['var_type'],AttrObject[vv]['var_dims'],fill_value = AttrObject[vv]['_FillValue'])
        
	# Apply any other attributes
        if ('standard_name' in AttrObject[vv]):
	    MyVar.standard_name = AttrObject[vv]['standard_name']
	    
        if ('long_name' in AttrObject[vv]):
	    MyVar.long_name = AttrObject[vv]['long_name']
	    
        if ('cell_methods' in AttrObject[vv]):
	    MyVar.cell_methods = AttrObject[vv]['cell_methods']
	    
        if ('comment' in AttrObject[vv]):
	    MyVar.comment = AttrObject[vv]['comment']
	    
        if ('units' in AttrObject[vv]):
	    MyVar.units = AttrObject[vv]['units']
		   	 
        if ('axis' in AttrObject[vv]):
	    MyVar.axis = AttrObject[vv]['axis']

        if ('add_offset' in AttrObject[vv]):
	    MyVar.add_offset = AttrObject[vv]['add_offset']

        if ('scale_factor' in AttrObject[vv]):
	    MyVar.scale_factor = AttrObject[vv]['scale_factor']

        if ('valid_min' in AttrObject[vv]):
	    MyVar.valid_min = AttrObject[vv]['valid_min']

        if ('valid_max' in AttrObject[vv]):
	    MyVar.valid_max = AttrObject[vv]['valid_max']

        if ('missing_value' in AttrObject[vv]):
	    MyVar.missing_value = AttrObject[vv]['missing_value']

#        if ('_FillValue' in AttrObject[vv]):
#	    MyVar._FillValue = AttrObject[vv]['_FillValue']

        if ('reference_period' in AttrObject[vv]):
	    MyVar.reference_period = AttrObject[vv]['reference_period']

        if ('ancillary_variables' in AttrObject[vv]):
	    MyVar.ancillary_variables = AttrObject[vv]['ancillary_variables']
	
	# Provide the data to the variable - depending on howmany dimensions there are
        if (len(AttrObject[vv]['var_dims']) == 1):
	    MyVar[:] = DataObject[vv]
	    
        if (len(AttrObject[vv]['var_dims']) == 2):
	    MyVar[:,:] = DataObject[vv]
	    
        if (len(AttrObject[vv]['var_dims']) == 3):
	    MyVar[:,:,:] = DataObject[vv]
	    
	    
    ncfw.close()
   
    return # WriteNCCF
Пример #51
0
def modify_aims_netcdf(netcdf_file_path, channel_id_info):
    """ Modify the downloaded netCDF file so it passes both CF and IMOS checker
    input:
       netcdf_file_path(str)    : path of netcdf file to modify
       channel_id_index(dict) : information from xml for the channel
    """
    imos_env_path = os.path.join(os.environ.get('DATA_SERVICES_DIR'), 'lib', 'netcdf', 'imos_env')
    if not os.path.isfile(imos_env_path):
        logger = logging_aims()
        logger.error('%s is not accessible' % imos_env_path)
        close_logger(logger)
        sys.exit(1)

    dotenv.load_dotenv(imos_env_path)
    netcdf_file_obj = Dataset(netcdf_file_path, 'a', format='NETCDF4')
    netcdf_file_obj.naming_authority = 'IMOS'

    # add gatts to NetCDF
    netcdf_file_obj.aims_channel_id = int(channel_id_info['channel_id'])

    if not (channel_id_info['metadata_uuid'] == 'Not Available'):
        netcdf_file_obj.metadata_uuid = channel_id_info['metadata_uuid']

    if not netcdf_file_obj.instrument_serial_number:
        del(netcdf_file_obj.instrument_serial_number)

    # add CF gatts, values stored in lib/netcdf/imos_env
    netcdf_file_obj.Conventions            = os.environ.get('CONVENTIONS')
    netcdf_file_obj.data_centre_email      = os.environ.get('DATA_CENTRE_EMAIL')
    netcdf_file_obj.data_centre            = os.environ.get('DATA_CENTRE')
    netcdf_file_obj.project                = os.environ.get('PROJECT')
    netcdf_file_obj.acknowledgement        = os.environ.get('ACKNOWLEDGEMENT')
    netcdf_file_obj.distribution_statement = os.environ.get('DISTRIBUTION_STATEMENT')

    netcdf_file_obj.date_created           = strftime("%Y-%m-%dT%H:%M:%SZ", gmtime())
    netcdf_file_obj.quality_control_set    = 1
    imos_qc_convention                     = 'IMOS standard set using the IODE flags'
    netcdf_file_obj.author                 = 'laurent besnard'
    netcdf_file_obj.author_email           = '*****@*****.**'

    rename_netcdf_attribute(netcdf_file_obj, 'geospatial_LAT_max', 'geospatial_lat_max')
    rename_netcdf_attribute(netcdf_file_obj, 'geospatial_LAT_min', 'geospatial_lat_min')
    rename_netcdf_attribute(netcdf_file_obj, 'geospatial_LON_max', 'geospatial_lon_max')
    rename_netcdf_attribute(netcdf_file_obj, 'geospatial_LON_min', 'geospatial_lon_min')

    # variables modifications
    time           = netcdf_file_obj.variables['time']
    time.calendar  = 'gregorian'
    time.axis      = 'T'
    time.valid_min = 0.0
    time.valid_max = 9999999999.0
    netcdf_file_obj.renameDimension('time', 'TIME')
    netcdf_file_obj.renameVariable('time', 'TIME')

    netcdf_file_obj.time_coverage_start = num2date(time[:], time.units, time.calendar).min().strftime('%Y-%m-%dT%H:%M:%SZ')
    netcdf_file_obj.time_coverage_end   = num2date(time[:], time.units, time.calendar).max().strftime('%Y-%m-%dT%H:%M:%SZ')

    # latitude longitude
    latitude                  = netcdf_file_obj.variables['LATITUDE']
    latitude.axis             = 'Y'
    latitude.valid_min        = -90.0
    latitude.valid_max        = 90.0
    latitude.reference_datum  = 'geographical coordinates, WGS84 projection'
    latitude.standard_name    = 'latitude'
    latitude.long_name        = 'latitude'

    longitude                 = netcdf_file_obj.variables['LONGITUDE']
    longitude.axis            = 'X'
    longitude.valid_min       = -180.0
    longitude.valid_max       = 180.0
    longitude.reference_datum = 'geographical coordinates, WGS84 projection'
    longitude.standard_name   = 'longitude'
    longitude.long_name       = 'longitude'

    # handle masked arrays
    lon_array = longitude[:]
    lat_array = latitude[:]
    if type(lon_array) != numpy.ma.core.MaskedArray or len(lon_array) == 1:
        netcdf_file_obj.geospatial_lon_min = min(lon_array)
        netcdf_file_obj.geospatial_lon_max = max(lon_array)
    else:
        netcdf_file_obj.geospatial_lon_min = numpy.ma.MaskedArray.min(lon_array)
        netcdf_file_obj.geospatial_lon_max = numpy.ma.MaskedArray.max(lon_array)

    if type(lat_array) != numpy.ma.core.MaskedArray or len(lat_array) == 1:
        netcdf_file_obj.geospatial_lat_min = min(lat_array)
        netcdf_file_obj.geospatial_lat_max = max(lat_array)
    else:
        numpy.ma.MaskedArray.min(lat_array)
        netcdf_file_obj.geospatial_lat_min = numpy.ma.MaskedArray.min(lat_array)
        netcdf_file_obj.geospatial_lat_max = numpy.ma.MaskedArray.max(lat_array)

    # Change variable name, standard name, longname, untis ....
    if 'Seawater_Intake_Temperature' in netcdf_file_obj.variables.keys():
        var                     = netcdf_file_obj.variables['Seawater_Intake_Temperature']
        var.units               = 'Celsius'
        netcdf_file_obj.renameVariable('Seawater_Intake_Temperature', 'TEMP')
        netcdf_file_obj.renameVariable('Seawater_Intake_Temperature_quality_control', 'TEMP_quality_control')
        var.ancillary_variables = 'TEMP_quality_control'

    if 'PSAL' in netcdf_file_obj.variables.keys():
        netcdf_file_obj.variables['PSAL'].units = '1e-3'

    if 'TURB' in netcdf_file_obj.variables.keys():
        var                                                             = netcdf_file_obj.variables['TURB']
        var.units                                                       = '1'
        var.standard_name                                               = 'sea_water_turbidity'
        netcdf_file_obj.variables['TURB_quality_control'].standard_name = 'sea_water_turbidity status_flag'

    if 'DOWN_PHOTOSYNTH_FLUX' in netcdf_file_obj.variables.keys():
        var       = netcdf_file_obj.variables['DOWN_PHOTOSYNTH_FLUX']
        var.units = 'W m-2'

    if 'PEAK_WAVE_DIR' in netcdf_file_obj.variables.keys():
        var       = netcdf_file_obj.variables['PEAK_WAVE_DIR']
        var.units = 'degree'

    if 'CDIR' in netcdf_file_obj.variables.keys():
        var           = netcdf_file_obj.variables['CDIR']
        var.units     = 'degree'
        var.long_name = 'current_direction'

    if 'CSPD' in netcdf_file_obj.variables.keys():
        var           = netcdf_file_obj.variables['CSPD']
        var.long_name = 'current_magnitude'

    if 'ALBD' in netcdf_file_obj.variables.keys():
        var       = netcdf_file_obj.variables['ALBD']
        var.units = '1'

    def clean_no_cf_variables(var, netcdf_file_obj):
        """
        remove standard name of main variable and of its ancillary qc var if exists
        """
        if var in netcdf_file_obj.variables.keys():
            if hasattr(netcdf_file_obj.variables[var], 'standard_name'):
                del netcdf_file_obj.variables[var]. standard_name
        var_qc = '%s_quality_control' % var
        if var_qc in netcdf_file_obj.variables.keys():
            if hasattr(netcdf_file_obj.variables[var_qc], 'standard_name'):
                del netcdf_file_obj.variables[var_qc]. standard_name
            if hasattr(netcdf_file_obj.variables[var], 'ancillary_variables'):
                netcdf_file_obj.variables[var].ancillary_variables = var_qc

    if 'Dissolved_Oxygen_Percent' in netcdf_file_obj.variables.keys():
        clean_no_cf_variables('Dissolved_Oxygen_Percent', netcdf_file_obj)

    if 'ErrorVelocity' in netcdf_file_obj.variables.keys():
        clean_no_cf_variables('ErrorVelocity', netcdf_file_obj)
        netcdf_file_obj.variables['ErrorVelocity'].long_name = 'error_velocity'

    if 'Average_Compass_Heading' in netcdf_file_obj.variables.keys():
        clean_no_cf_variables('Average_Compass_Heading', netcdf_file_obj)
        var       = netcdf_file_obj.variables['Average_Compass_Heading']
        var.units = 'degree'

    if 'Upwelling_longwave_radiation' in netcdf_file_obj.variables.keys():
        var_str              = 'Upwelling_longwave_radiation'
        var_qc_str           = '%s_quality_control' % var_str
        var                  = netcdf_file_obj.variables[var_str]
        var_qc               = netcdf_file_obj.variables[var_qc_str]
        var.units            = 'W m-2'
        var.standard_name    = 'upwelling_longwave_flux_in_air'
        var_qc.standard_name = 'upwelling_longwave_flux_in_air status_flag'

    if 'Downwelling_longwave_radiation' in netcdf_file_obj.variables.keys():
        var_str              = 'Downwelling_longwave_radiation'
        var_qc_str           = '%s_quality_control' % var_str
        var                  = netcdf_file_obj.variables[var_str]
        var_qc               = netcdf_file_obj.variables[var_qc_str]
        var.units            = 'W m-2'
        var.standard_name    = 'downwelling_longwave_flux_in_air'
        var_qc.standard_name = 'downwelling_longwave_flux_in_air status_flag'

    if 'UP_TOT_RADIATION' in netcdf_file_obj.variables.keys():
        var_str              = 'UP_TOT_RADIATION'
        var_qc_str           = '%s_quality_control' % var_str
        var                  = netcdf_file_obj.variables[var_str]
        var_qc               = netcdf_file_obj.variables[var_qc_str]
        var.units            = 'W m-2'
        var.standard_name    = 'upwelling_longwave_flux_in_air'
        var_qc.standard_name = 'upwelling_longwave_flux_in_air status_flag'

    if 'DOWN_TOT_RADIATION' in netcdf_file_obj.variables.keys():
        var_str              = 'DOWN_TOT_RADIATION'
        var_qc_str           = '%s_quality_control' % var_str
        var                  = netcdf_file_obj.variables[var_str]
        var_qc               = netcdf_file_obj.variables[var_qc_str]
        var.units            = 'W m-2'
        var.standard_name    = 'downwelling_longwave_flux_in_air'
        var_qc.standard_name = 'downwelling_longwave_flux_in_air status_flag'

    if 'RADIATION_DOWN_NET' in netcdf_file_obj.variables.keys():
        clean_no_cf_variables('RADIATION_DOWN_NET', netcdf_file_obj)

    if 'fluorescence' in netcdf_file_obj.variables.keys():
        netcdf_file_obj.renameVariable('fluorescence', 'CPHL')
        netcdf_file_obj.variables['CPHL'].long_name = 'mass_concentration_of_inferred_chlorophyll_from_relative_fluorescence_units_in_sea_water_concentration_of_chlorophyll_in_sea_water'
        if 'fluorescence_quality_control' in netcdf_file_obj.variables.keys():
            netcdf_file_obj.renameVariable('fluorescence_quality_control', 'CPHL_quality_control')
            netcdf_file_obj.variables['CPHL_quality_control'].long_name = 'mass_concentration_of_inferred_chlorophyll_from_relative_fluorescence_units_in_sea_waterconcentration_of_chlorophyll_in_sea_water status_flag'
        clean_no_cf_variables('CPHL', netcdf_file_obj)

    if 'WDIR_10min' in netcdf_file_obj.variables.keys():
        netcdf_file_obj.variables['WDIR_10min'].units = 'degree'

    if 'WDIR_30min' in netcdf_file_obj.variables.keys():
        netcdf_file_obj.variables['WDIR_30min'].units = 'degree'

    if 'R_sigma_30min' in netcdf_file_obj.variables.keys():
        netcdf_file_obj.variables['R_sigma_30min'].units = 'degree'
        clean_no_cf_variables('R_sigma_30min', netcdf_file_obj)

    if 'WDIR_sigma_10min' in netcdf_file_obj.variables.keys():
        netcdf_file_obj.variables['WDIR_sigma_10min'].units = 'degree'
        clean_no_cf_variables('WDIR_sigma_10min', netcdf_file_obj)

    if 'WDIR_sigma_30min' in netcdf_file_obj.variables.keys():
        netcdf_file_obj.variables['WDIR_sigma_30min'].units = 'degree'
        clean_no_cf_variables('WDIR_sigma_30min', netcdf_file_obj)

    if 'ATMP' in netcdf_file_obj.variables.keys():
        netcdf_file_obj.variables['ATMP'].units = 'hPa'

    if 'RAIN_DURATION' in netcdf_file_obj.variables.keys():
        clean_no_cf_variables('RAIN_DURATION', netcdf_file_obj)

    if 'HAIL_DURATION' in netcdf_file_obj.variables.keys():
        clean_no_cf_variables('HAIL_DURATION', netcdf_file_obj)

    if 'HAIL_HIT' in netcdf_file_obj.variables.keys():
        clean_no_cf_variables('HAIL_HIT', netcdf_file_obj)
        netcdf_file_obj.variables['HAIL_HIT'].comment = netcdf_file_obj.variables['HAIL_HIT'].units
        netcdf_file_obj.variables['HAIL_HIT'].units = '1'

    if 'HAIL_INTENSITY_10min' in netcdf_file_obj.variables.keys():
        clean_no_cf_variables('HAIL_INTENSITY_10min', netcdf_file_obj)
        netcdf_file_obj.variables['HAIL_INTENSITY_10min'].comment = netcdf_file_obj.variables['HAIL_INTENSITY_10min'].units
        netcdf_file_obj.variables['HAIL_INTENSITY_10min'].units = '1'

    # add qc conventions to qc vars
    variables = netcdf_file_obj.variables.keys()
    qc_vars = [s for s in variables if '_quality_control' in s]
    if qc_vars != []:
        for var in qc_vars:
            netcdf_file_obj.variables[var].quality_control_conventions = imos_qc_convention

    # clean longnames, force lower case, remove space, remove double underscore
    for var in variables:
        if hasattr(netcdf_file_obj.variables[var], 'long_name'):
            netcdf_file_obj.variables[var].long_name = netcdf_file_obj.variables[var].long_name.replace('__', '_')
            netcdf_file_obj.variables[var].long_name = netcdf_file_obj.variables[var].long_name.replace(' _', '_')
            netcdf_file_obj.variables[var].long_name = netcdf_file_obj.variables[var].long_name.lower()

    netcdf_file_obj.close()
Пример #52
0
def tiff_to_netcdf(input_dir, output_dir, years, tempo):
    
    # Only monthly and 8-day accepted
    if tempo != 'monthly':
        if tempo != '8-day':
            quit('ERROR: temp variable should be either monthly or 8-day')      
    
    raster_list = sorted([os.path.join(input_dir, l) for l in os.listdir(input_dir) if l.endswith('.tif')]) # All rasters in input_dir

    for year in range(len(years)):
        
        raster_list_year = [r for r in raster_list if '.'+str(years[year]) in r] # List of rasters for the year

        # Ensure number of input rasters is correct
        if tempo == 'monthly' and len(raster_list_year) != 12:
            quit('ERROR: There should be 12 input rasters for the year '+str(years[year]+', but there are only '+ len(raster_list_year)+'.'))
        if tempo == '8-day' and len(raster_list_year) != 46:
            quit('ERROR: There should be 46 input rasters for the year '+str(years[year]+', but there are only '+ len(raster_list_year)+'.'))
 
        # Printing for visual quality control
        print('Packing up these '+str(len(raster_list_year))+' rasters into the .nc file for the year '+str(years[year])+':')
        print("\n".join(raster_list_year))

        # Create NetCDF file
        if tempo == 'monthly':
            out_file = os.path.join(output_dir,'GPP.VPM.v20.'+str(years[year])+'.monthly.CMG_0.05.nc')
        else:
            out_file = os.path.join(output_dir,'GPP.VPM.v20.'+str(years[year])+'.8-day.CMG_0.05.nc')
        
        nco = Dataset(out_file, 'w', clobber=True, format="NETCDF4")
        
        # Meta-data
        nco.Conventions = 'CF-1.7'
        nco.title = 'Vegetation Photosynthesis Model (VPM)'
        nco.institution = 'Department of Microbiology and Plant Biology, University of Oklahoma, Norman, Oklahoma'
        nco.source = 'http://eomf.ou.edu'
        nco.references = 'Zhang, Y., Xiao, X., Wu, X., Zhou, S., Zhang, G., Qin, Y. and Dong, J., 2017. A global moderate resolution dataset of gross primary production of vegetation for 2000-2016. Scientific data, 4, p.170165.'
        nco.history = """
        [2020-04-10] Added units to lat and lon for CF compliance. Also set least significant digit for GPP to 3 decimal places to reduce file size.
        [2020-04-08] Scale factor has been corrected to 1.
        [2020-04-07] CRS now set to WGS84. netCDF files now provided on annual basis.
        [2020-04-04] First creation of VPM in netCDF format.
        """
        nco.comment = 'This product has been aggregated from the original 8-day, 500 m data. Please cite the references if you use this data in your project. Contact Dr. Xiangming Xiao at [email protected] with your questions.'
        
        # Get shape, extent, coordinates from one of the input rasters
        ds = gdal.Open(raster_list[0])
    
        a = ds.ReadAsArray()
        nlat, nlon = np.shape(a)
    
        b = ds.GetGeoTransform()  # bbox, interval
        lon_list = np.arange(nlon)*b[1]+b[0]
        lat_list = np.arange(nlat)*b[5]+b[3]
    
        # Create dimensions, variables and attributes
        nco.createDimension('lon', nlon)
        nco.createDimension('lat', nlat)
        nco.createDimension('time', None)
        
        # Time
        time = nco.createVariable('time', 'f8', ('time',))
        time.standard_name = 'time'
        time.calendar = "gregorian"

        if tempo == 'monthly':
            time.units = 'days since %s-01-01 00:00:00' % str(years[year])
            dates = [datetime(years[year],1+n,1) for n in range(len(raster_list_year))] # list of dates
        elif tempo == '8-day':
            time.units = 'days since %s-01-01 00:00:00' % str(years[year])
            dates = [datetime(years[year],1,1)+n*timedelta(days=8) for n in range(len(raster_list_year))] # list of dates
        
        # Lon
        lon = nco.createVariable('lon', 'f4', ('lon',))
        lon.standard_name = 'longitude'
        lon.units = 'degrees_east'
        
        # Lat
        lat = nco.createVariable('lat', 'f4', ('lat',))
        lat.standard_name = 'latitude'
        lat.units = 'degrees_north'
    
        # CRS - These values pulled from gdalinfo after converting GeoTiffs to WGS84
        crs = nco.createVariable('crs', 'i4')
        crs.long_name = 'World Geodetic System 1984 (WGS84)'
        crs.grid_mapping_name = 'latitude_longitude'
        crs.longitude_of_prime_meridian = 0.0
        crs.semi_major_axis = 6378137.0
        crs.inverse_flattening = 298.257223563
        crs.spatial_ref = 'GEOGCS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["unknown"],AREA["World"],BBOX[-90,-180,90,180]],ID["EPSG",4326]]'

        # GPP
        GPP = nco.createVariable('GPP', float,  ('time', 'lat', 'lon'),
                                  zlib=True, chunksizes=None, least_significant_digit=3, fill_value=-9999)
        GPP.long_name = 'Gross Primary Production'
        if tempo == 'monthly':
            GPP.units = 'g C m-2 month-2'
        elif tempo == '8-day':
            GPP.units = 'g C m-2 day-2'
        GPP.scale_factor = 1.0
        GPP.add_offset = 0.0
        GPP.grid_mapping = 'crs'
        GPP.set_auto_maskandscale(False)
    
        # Write lon,lat
        lon[:] = lon_list
        lat[:] = lat_list
       
        # Step through each raster for the year, writing time and data to NetCDF
        for i in range(len(raster_list_year)):
    
            time[i] = date2num(dates[i],units=time.units,calendar=time.calendar) # netCDF4 function that translates datetime object into proper format for .nc
            layer = gdal.Open(raster_list_year[i])
            array = layer.ReadAsArray()  # data
            GPP[i, :, :] = array
    
        nco.close()
        
        print('I have created the file: %s\n' % out_file)
Пример #53
0
def createNetCDFFileUV(grdROMS, outfilename, myformat, mytype):

    if (myformat=='NETCDF4'):
        myzlib = True
    else:
        myzlib = False

    if os.path.exists(outfilename):
        os.remove(outfilename)
    print(('Creating atmospheric forcing file for UV wind - %s'%(outfilename)))

    f1 = Dataset(outfilename, mode='w', format=myformat)
    f1.title="Atmospheric frocing file used by the ROMS model"
    f1.description="Created for the %s grid file"%(grdROMS.grdName)
    f1.grdFile="%s"%(grdROMS.grdfilename)
    f1.history = 'Created ' + time.ctime(time.time())
    f1.source = 'Trond Kristiansen ([email protected])'
    f1.type = "File in %s format created using MODEL2ROMS"%(myformat)
    f1.link = "https://github.com/trondkr/model2roms"
    f1.Conventions = "CF-1.0"

    """ Define dimensions """
    f1.createDimension('xi_rho',  grdROMS.xi_rho)
    f1.createDimension('eta_rho', grdROMS.eta_rho)
    f1.createDimension('wind_time', None)
    
    vnc = f1.createVariable('lon_rho', 'd', ('eta_rho','xi_rho',),zlib=myzlib, fill_value=grdROMS.fill_value)
    vnc.long_name = 'Longitude of RHO-points'
    vnc.units = 'degree_east'
    vnc.standard_name = 'longitude'
    vnc[:,:] = grdROMS.lon_rho

    vnc = f1.createVariable('lat_rho', 'd', ('eta_rho','xi_rho',),zlib=myzlib, fill_value=grdROMS.fill_value)
    vnc.long_name = 'Latitude of RHO-points'
    vnc.units = 'degree_north'
    vnc.standard_name = 'latitude'
    vnc[:,:] = grdROMS.lat_rho

    v_time = f1.createVariable('wind_time', 'd', ('wind_time',),zlib=myzlib, fill_value=grdROMS.fill_value)
    
    if mytype == "NORESM":
        v_time.long_name = 'Days since 1800-01-01 00:00:00'
        v_time.units = 'Days since 1800-01-01 00:00:00'
    else:
        v_time.long_name = 'Days since 1948-01-01 00:00:00'
        v_time.units = 'Days since 1948-01-01 00:00:00'
    v_time.field = 'time, scalar, series'
    v_time.calendar='noleap'

    v_temp_west=f1.createVariable('Vwind', 'f', ('wind_time', 'eta_rho', 'xi_rho',),zlib=myzlib, fill_value=grdROMS.fill_value)
    v_temp_west.long_name = "Eta-component of wind"
    v_temp_west.units = "meter second-1"
    v_temp_west.field = "Vwind, scalar, series"
    v_temp_west.missing_value = grdROMS.fill_value
    v_temp_west.time = "wind_time"

    v_temp_west=f1.createVariable('Uwind', 'f', ('wind_time', 'eta_rho', 'xi_rho',),zlib=myzlib, fill_value=grdROMS.fill_value)
    v_temp_west.long_name = "Xi-component of wind"
    v_temp_west.units = "meter second-1"
    v_temp_west.field = "Uwind, scalar, series"
    v_temp_west.missing_value = grdROMS.fill_value
    v_temp_west.time = "wind_time"

    f1.close()
Пример #54
0
def write_nc_(date_txt, file_name, obs, additional_gatts=None, title_="", institution_="", location_="", source_=""):
    """Writes a netCDF file with name and full path specified by 'file_name' with attributes as listed by 'obs'.

    Args:
        date_txt (str):
        file_name (str):
        obs (list):
        additional_gatts (dict):
        title_ (str):
        institution_ (str):
        location_ (str):
        source_ (str):

    """

    rootgrp = Dataset(file_name, mode='w', format='NETCDF4', clobber=True)

    dimension_names = []
    for var in obs:
        if var.dim_name is not None:
            if isinstance(var.dim_name, tuple):
                for dname, dsize in zip(var.dim_name, var.dim_size):
                    if dname not in dimension_names:
                        print("Adding dimension {}".format(dname))
                        dimension_names.append(dname)
                        rootgrp.createDimension(dname, dsize)
            elif isinstance(var.dim_name, str):
                if var.dim_name not in dimension_names:
                    print("Adding dimension {}".format(var.dim_name))
                    dimension_names.append(var.dim_name)
                    rootgrp.createDimension(var.dim_name, var.dim_size[0])
            else:
                raise
        print("Adding variable {}".format(var.variable_name))
        ncvar = rootgrp.createVariable(var.variable_name, var.data_type, var.dim_name)

        # Copy attributes
        # copy_nc_attributes(var, ncvar, list(var.__dict__.keys()))

        attrs = list(var.__dict__.keys())
        for attr in attrs:
            if attr is "extra_attributes":
                if var.extra_attributes is not None:
                    for attr_extra, value_extra in var.extra_attributes.items():
                        value_extra = getattr(var, attr_extra)
                        if value_extra is not None:
                            setattr(ncvar, attr_extra, value_extra)
            elif attr is not "data":
                value = getattr(var, attr)
                if value is not None:
                    setattr(ncvar, attr, value)
        ncvar[:] = var.data

    # global attributes:
    print("Adding global attributes")
    rootgrp.Conventions = 'CF-1.7'
    rootgrp.title = title_
    rootgrp.institution = institution_
    rootgrp.location = location_
    rootgrp.source = source_
    rootgrp.year = int(date_txt[:4])
    rootgrp.month = int(date_txt[4:6])
    rootgrp.day = int(date_txt[6:8])
    rootgrp.software_version = dl_toolbox_version.__version__
#    rootgrp.git_version = git_version()
    rootgrp.file_uuid = str(uuid.uuid4().hex)
    rootgrp.references = ''
    user_name = getpass.getuser()
    now_time_utc = datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S")
    history_msg = "NETCDF4 file created by user {} on {} UTC.".format(user_name, now_time_utc)
    rootgrp.history = history_msg
    # Additional global attributes
    if additional_gatts is not None:
        for key_, value_ in zip(additional_gatts.keys(), additional_gatts.values()):
            setattr(rootgrp, key_, value_)
    rootgrp.close()
    print(history_msg)
Пример #55
0
def create_nc(var):
    ''' Creates the NetCDF file to save the final averages
        in.
    '''
    filedir = '/group_workspaces/jasmin/hiresgw/mj07/monthly_means/'
    filename = 'xjleha.monthlymean.'+var+'.nc'
    f = Dataset(filedir+filename,'w')

    # Create dimensions
    time = f.createDimension('time',None)
    z_hybrid_height = f.createDimension('z_hybrid_height',180)
    latitude = f.createDimension('latitude',325)#**#
    longitude = f.createDimension('longitude',432)
    bound = f.createDimension('bound',2)

    # Create variables (added s on the end to differentiate between dimensions
    #                   and variables)
    times = f.createVariable('time','f4',('time',))
    z_hybrid_heights = f.createVariable('z_hybrid_height','f4',
                                        ('z_hybrid_height',))
    latitudes = f.createVariable('latitude','f4',('latitude',))
    bounds_latitude = f.createVariable('bounds_latitude','f8',
                                       ('latitude','bound',))
    longitudes = f.createVariable('longitude','f4',('longitude',))
    bounds_longitude = f.createVariable('bounds_longitude','f8',
                                        ('longitude','bound',))
    v = f.createVariable('v','f4',('time','z_hybrid_height','latitude',
                                   'longitude',),zlib=True) #**#
    
    # Add in attributes
    f.Conventions = 'CF-1.6'
    times.units = 'months since 1981-09-01 00:00:00'
    times.standard_name = 'time'
    times.calendar = '360_day'
    times.axis = 'T'
    z_hybrid_heights.positive = 'up'
    z_hybrid_heights.long_name = 'atmosphere hybrid height coordinate'
    z_hybrid_heights.standard_name = 'atmosphere_hybrid_height_coordinate'
    z_hybrid_heights.units = 'm'
    z_hybrid_heights.axis = 'Z'
    latitudes.bounds = 'bounds_latitude'
    latitudes.units = 'degrees_north'
    latitudes.standard_name = 'latitude'
    latitudes.point_spacing = 'even'
    latitudes.axis = 'Y'
    longitudes.bounds = 'bounds_longitude'
    longitudes.modulo = 360.
    longitudes.point_spacing = 'even'
    longitudes.standard_name = 'longitude'
    longitudes.units = 'degrees_east'
    longitudes.axis = 'X'
    longitudes.topology = 'circular'
    #**#
    v.lookup_source = 'defaults (cdunifpp V0.13)'
    v.standard_name = 'northward_wind'
    v.long_name = 'V COMPONENT OF WIND AFTER TIMESTEP'
    v.units = 'm s-1'
    v.missing_value = -1.073742e+09
    #**#

    # need to add in a bit that saves the values of time, lat and lon
    f2 = Dataset('/group_workspaces/jasmin/hiresgw/mj07/xjleha.19810901.v.nc')
    
    lat = f2.variables['latitude']
    lon = f2.variables['longitude']
    height = f2.variables['z_hybrid_height']

    latitudes[:] = lat[:]
    longitudes[:] = lon[:]
    z_hybrid_heights[:] = height[:]

    f.close()
    f2.close()
Пример #56
0
def def_var(nc, name, units, fillvalue):
    # dimension transpose is standard: "float thk(y, x)" in NetCDF file
    var = nc.createVariable(name, 'f', dimensions=("y", "x"), fill_value=fillvalue)
    var.units = units
    return var

bed_var = def_var(nc, "topg", "m", fill_value)
bed_var.standard_name = "bedrock_altitude"
bed_var[:] = topg

thk_var = def_var(nc, "thk", "m", fill_value)
thk_var.standard_name = "land_ice_thickness"
thk_var[:] = thk

smb_var = def_var(nc, "climatic_mass_balance", "kg m-2 s-1", fill_value)
smb_var.standard_name = "land_ice_surface_specific_mass_balance_flux"
smb_var[:] = smb

artm_var = def_var(nc, "ice_surface_temp", "K", fill_value)
artm_var[:] = artm

# set global attributes
nc.Conventions = 'CF-1.4'
historysep = ' '
historystr = time.asctime() + ': ' + historysep.join(sys.argv) + '\n'
setattr(nc, 'history', historystr)

nc.close()

print('  ... PISM-bootable NetCDF file %s written' % args.o)
def createfile(filename):
    ''' Creates the netCDF file to then be opened in field2nc. 
    '''
    
    f = Dataset(filename,'w')

    zres = 180
    latres = 768
    lonres = 1024
    # Create dimensions
    time = f.createDimension('time',None)
    z_hybrid_height = f.createDimension('z_hybrid_height',zres)
    latitude = f.createDimension('latitude',latres)
    longitude = f.createDimension('longitude',lonres)

    # Create variables (added s on the end to differentiate between dimensions
    #                   and variables)
    times = f.createVariable('time','f4',('time',),zlib=True)
    z_hybrid_heights = f.createVariable('z_hybrid_height','f4',
                                        ('z_hybrid_height',),zlib=True)
    latitudes = f.createVariable('latitude','f4',('latitude',),zlib=True)
    longitudes = f.createVariable('longitude','f4',('longitude',),zlib=True)
    v = f.createVariable('T','f4',('time','z_hybrid_height','latitude',
                                   'longitude',),zlib=True)

    # Add in attributes
    f.Conventions = 'CF-1.6'
    times.units = 'hours since 1991-03-01 00:00:00'
    times.standard_name = 'time'
    times.calendar = '360_day'
    times.axis = 'T'
    z_hybrid_heights.positive = 'up'
    z_hybrid_heights.long_name = 'atmosphere hybrid height coordinate'
    z_hybrid_heights.standard_name = 'atmosphere_hybrid_height_coordinate'
    z_hybrid_heights.units = 'm'
    z_hybrid_heights.axis = 'Z'
    latitudes.bounds = 'bounds_latitude'
    latitudes.units = 'degrees_north'
    latitudes.standard_name = 'latitude'
    latitudes.point_spacing = 'even'
    latitudes.axis = 'Y'
    longitudes.bounds = 'bounds_longitude'
    longitudes.modulo = 360.
    longitudes.point_spacing = 'even'
    longitudes.standard_name = 'longitude'
    longitudes.units = 'degrees_east'
    longitudes.axis = 'X'
    longitudes.topology = 'circular'
    v.lookup_source = 'defaults (cdunifpp V0.14pre1)'
    v.standard_name = 'air_temperature'
    v.long_name = 'AIR TEMPERATURE'
    v.units = 'K'
    v.missing_value = -1.073742e+09

    # Add in values of lat, lon and height
    coordsfile = '/group_workspaces/jasmin/hiresgw/mj07/xjanpa.pb19910301.theta.nc'
    f2 = Dataset(coordsfile,'r')
    latvals = f2.variables['latitude']
    lonvals = f2.variables['longitude']
    zvals = f2.variables['z_hybrid_height']
    
    latitudes[:] = latvals[:]
    longitudes[:] = lonvals[:]
    z_hybrid_heights[:] = zvals[:]
    f2.close()

    f.close()
Пример #58
0
    var_out.units = "degrees_north"
    var_out.valid_range = -90.0, 90.0
    var_out.standard_name = "latitude"
    var_out[:] = lat

    var = "dummy"
    var_out = nc.createVariable(var, "f", dimensions=("y", "x"), fill_value=-9999)
    var_out.units = "meters"
    var_out.long_name = "Just A Dummy"
    var_out.comment = "This is just a dummy variable for CDO."
    var_out.grid_mapping = "mapping"
    var_out.coordinates = "lon lat"
    var_out[:] = 0.0

    mapping = nc.createVariable("mapping", "c")
    mapping.ellipsoid = "WGS84"
    mapping.false_easting = 0.0
    mapping.false_northing = 0.0
    mapping.grid_mapping_name = "polar_stereographic"
    mapping.latitude_of_projection_origin = 90.0
    mapping.standard_parallel = 70.0
    mapping.straight_vertical_longitude_from_pole = -45.0

    from time import asctime

    historystr = "Created " + asctime() + "\n"
    nc.history = historystr
    nc.proj4 = projection
    nc.Conventions = "CF-1.5"
    nc.close()
Пример #59
0
def cloneUM4(masterfile, newfile, startdate="copy", tn=24, dt=3600.0):
    """
    Creates a new UM4 netCDF file based on a master file.
    
    Convention: Climate and Forecast (CF) version 1.4
    
    @param secs: in seconds since 1970-01-01 00:00:00
    """
    print "Started cloning %s as %s" % (masterfile, newfile)

    # open master file
    master = Dataset(masterfile, "r")
    Mdimensions = master.dimensions.keys()

    # create new file
    rootgrp = Dataset(newfile, "w", format="NETCDF3_CLASSIC")

    # add root dimensions
    rootgrp.createDimension("time", size=tn)
    rootgrp.createDimension("rlon", size=default_UM4_width)
    rootgrp.createDimension("rlat", size=default_UM4_height)
    rootgrp.createDimension("sigma", size=1)

    # add root attributes
    rootgrp.Conventions = "CF-1.4"
    rootgrp.institution = "Norwegian Water Resources and Energy Directorate (NVE)"
    rootgrp.source = "Compiled from several +66 hour prognoses by the Norwegian Meteorological Institute (met.no)"
    rootgrp.history = "%s created" % time.ctime(time.time())
    rootgrp.references = "met.no"
    rootgrp.comment = "Progonosis data for www.senorge.no"

    # add time variable
    Mtime = master.variables["time"]
    # determine start date
    try:
        _end = date2num(iso2datetime(startdate), timeunit)
        _start = _end - ((tn - 1) * dt)
    except ValueError:
        # if the startdate is set to "copy" use the date of the last input file
        Mdate = num2date(Mtime[0], timeunit).date()
        utc6 = datetime.time(06, 00, 00)
        _end = date2num(datetime.datetime.combine(Mdate, utc6), timeunit)
        _start = _end - ((tn - 1) * dt)
        print (_end - _start) / dt
    _time = rootgrp.createVariable("time", "f8", ("time",))
    _time[:] = arange(_start, _end + dt, dt)  # ensures that _end is included
    for attr in Mtime.ncattrs():
        _time.setncattr(attr, Mtime.getncattr(attr))

    # add rlon variable
    Mrlon = master.variables["rlon"]
    _rlon = rootgrp.createVariable("rlon", "f4", ("rlon",))
    _rlon[:] = Mrlon[:]
    for attr in Mrlon.ncattrs():
        _rlon.setncattr(attr, Mrlon.getncattr(attr))

    # add rlat variable
    Mrlat = master.variables["rlat"]
    _rlat = rootgrp.createVariable("rlat", "f4", ("rlat",))
    _rlat[:] = Mrlat[:]
    for attr in Mrlat.ncattrs():
        _rlat.setncattr(attr, Mrlat.getncattr(attr))

    # add sigma variable
    try:
        Msigma = master.variables["sigma"]
        _sigma = rootgrp.createVariable("sigma", "i2", ("sigma",))
        _sigma[:] = Msigma[:]
        for attr in Msigma.ncattrs():
            _sigma.setncattr(attr, Msigma.getncattr(attr))
    except KeyError:
        print "No variable called 'sigma'!"

    for var in master.variables.keys():
        # exclude the variables referring to dimensions
        if var not in Mdimensions:
            exec ("M%s = master.variables['%s']" % (var, var))
            exec ("print 'Cloning %s', master.variables['%s'].dimensions" % (var, var))
            exec ("_%s = rootgrp.createVariable('%s', M%s.dtype, M%s.dimensions)" % (var, var, var, var))
            exec ("""for attr in M%s.ncattrs():\n\t_%s.setncattr(attr, M%s.getncattr(attr))""" % (var, var, var))

    rootgrp.close()
    master.close()
    print "Cloning completed!"