Skip to content
Snippets Groups Projects
netcdf.py 2.75 KiB
Newer Older
  • Learn to ignore specific revisions
  • import logging
    
    jacques.grelet_ird.fr's avatar
    jacques.grelet_ird.fr committed
    from netCDF4 import Dataset
    
    from numpy import arange, dtype
    
    from physical_parameter import Roscop
    
    def writeNetCDF(fileName, fe, variables_1D):
    
    jacques.grelet_ird.fr's avatar
    jacques.grelet_ird.fr committed
    
    
        # ncvars is a dictionary that store a netcdf variable for each physical parameter key
        ncvars = {}
    
        # variables and dimensions use for 1D and 2D variables
    
        #variables_1D = ['TIME', 'LATITUDE', 'LONGITUDE']
    
    jacques.grelet_ird.fr's avatar
    jacques.grelet_ird.fr committed
        variables = variables_1D.copy()
        dims_2D = ['TIME', 'DEPTH']
    
    
        # move to main after tests
        r = Roscop("code_roscop.csv")
    
    
    jacques.grelet_ird.fr's avatar
    jacques.grelet_ird.fr committed
        # create netcdf file
        nc = Dataset(fileName, "w", format="NETCDF3_CLASSIC")
    
        logging.debug(' ' + nc.data_model)
    
        print('writing netCDF file: {}'.format(fileName))
    
    jacques.grelet_ird.fr's avatar
    jacques.grelet_ird.fr committed
        # create dimensions
    
        # n is number of profiles, m the max size of profiles
        time = nc.createDimension("TIME", fe.n)
        lat = nc.createDimension("LATITUDE", fe.n)
        lon = nc.createDimension("LONGITUDE", fe.n)
        depth = nc.createDimension('DEPTH', fe.m)
    
    
    jacques.grelet_ird.fr's avatar
    jacques.grelet_ird.fr committed
        # debug
    
        logging.debug(" depth: {}, time: {}, lat: {}, lon: {}".format(
            len(depth), len(time), len(lat), len(lon)))
    
        # create variables
        # add dimensions before variables list
        for k in fe.keys:
    
    jacques Grelet's avatar
    jacques Grelet committed
            variables.append(k)
        # variables.extend(fe.keys())
        for key in variables:
    
            # for each variables get the attributes dictionary from Roscop
            hash = r[key]
    
            # _FillValue attribute must be set when variable is created
            # (using fill_value keyword to createVariable)
            if '_FillValue' in hash:
                fillvalue = hash['_FillValue']
                # remove from the dictionary
                hash.pop('_FillValue')
            else:
                fillvalue = None
            # create the variable
    
    jacques.grelet_ird.fr's avatar
    jacques.grelet_ird.fr committed
            if any(key in item for item in variables_1D):
    
                ncvars[key] = nc.createVariable(
    
    jacques Grelet's avatar
    jacques Grelet committed
                    key, dtype(hash['types']).char, (key,), fill_value=fillvalue)
            else:
    
                ncvars[key] = nc.createVariable(
    
    jacques.grelet_ird.fr's avatar
    jacques.grelet_ird.fr committed
                    key, dtype(hash['types']).char, dims_2D, fill_value=fillvalue)
    
            # remove from the dictionary
            hash.pop('types')
            # create dynamically variable attributes
            for k in hash.keys():
    
                setattr(ncvars[key], k, hash[k])
    
    jacques.grelet_ird.fr's avatar
    jacques.grelet_ird.fr committed
        nc._enddef()
    
    jacques Grelet's avatar
    jacques Grelet committed
        for key in variables:
    
    jacques.grelet_ird.fr's avatar
    jacques.grelet_ird.fr committed
            logging.debug(" var: {}, dims: {}, shape: {}, dtype: {}, ndim: {}".format(
    
                key, ncvars[key].dimensions, ncvars[key].shape, ncvars[key].dtype, ncvars[key].ndim))
    
        # write the ncvars
    
    jacques.grelet_ird.fr's avatar
    jacques.grelet_ird.fr committed
        for key in variables:
            if any(key in item for item in variables_1D):
    
                #print("Key: {}, {}".format(key,fe[key]))
    
                ncvars[key][:] = fe[key]
    
    jacques.grelet_ird.fr's avatar
    jacques.grelet_ird.fr committed
            else:
    
                #print("Key: {}, {}".format(key,fe[key]))
    
                ncvars[key][:, :] = fe[key]
    
    jacques.grelet_ird.fr's avatar
    jacques.grelet_ird.fr committed
    
        # close the netcdf file
        nc.close()
    
        print('done...')