Beispiel #1
0
    def __var_get(self, key):
        lays = len(self.dimensions['LAY'])
        times = len(self.dimensions['TSTEP'])
        rows = len(self.dimensions['ROW'])
        cols = len(self.dimensions['COL'])
        hght = 1
        pres = 2
        time = 3
        date = 4
        out_idx = zeros(self.__memmap.shape,
                        dtype='b').reshape(times, lays, 2, rows * cols + 4)
        out_idx[:, :, 0, 3:-1] = hght
        out_idx[:, :, 1, 3:-1] = pres
        out_idx[:, :, :, 1] = time
        out_idx[:, :, :, 2] = date
        out_idx = out_idx.ravel()
        buf = self.__memmap[out_idx == 0].reshape(lays * 2 * times, 2)
        if not (buf[:, 0] == buf[:, 1]).all():
            raise ValueError("Buffer")
        tmpvals = self.__memmap[out_idx == 1].reshape(times, lays, rows, cols)
        v = self.variables['HGHT'] = PseudoNetCDFVariable(
            self, 'HGHT', 'f', ('TSTEP', 'LAY', 'ROW', 'COL'), values=tmpvals)
        v.units = 'm'
        v.long_name = 'HGHT'.ljust(16)
        v.var_desc = 'Top Height'
        tmpvals = self.__memmap[out_idx == 2].reshape(times, lays, rows, cols)
        v = self.variables['PRES'] = PseudoNetCDFVariable(
            self, 'PRES', 'f', ('TSTEP', 'LAY', 'ROW', 'COL'), values=tmpvals)
        v.units = 'hPA'
        v.long_name = 'PRES'.ljust(16)
        v.var_desc = 'Pressure at center'
        tslice = slice(None, None, len(self.dimensions['LAY']) * 2)
        dateblock = self.__memmap[out_idx == 4][tslice].view('>i')
        hourblock = self.__memmap[out_idx == 3][tslice]
        self.variables['TFLAG'] = ConvertCAMxTime(dateblock, hourblock,
                                                  len(self.dimensions['VAR']))

        return self.variables[key]
Beispiel #2
0
    def __init__(self,
                 rf,
                 mode='r',
                 P_ALP=None,
                 P_BET=None,
                 P_GAM=None,
                 XCENT=None,
                 YCENT=None,
                 GDTYP=None):
        """
        Initialization included reading the header and learning
        about the format.
        
        see __readheader and __gettimestep() for more info
        """
        self.__rffile = rf
        self.__mode = mode

        self.createDimension('DATE-TIME', 2)

        self.__readheader()

        # Add IOAPI metavariables
        nlays = self.NLAYS = len(self.dimensions['LAY'])
        nrows = self.NROWS = len(self.dimensions['ROW'])
        ncols = self.NCOLS = len(self.dimensions['COL'])
        nvars = self.NVARS = len(self.dimensions['VAR'])
        nsteps = self.NSTEPS = len(self.dimensions['TSTEP'])
        setattr(self, 'VAR-LIST',
                "".join([i.ljust(16) for i in self.__var_names__]))
        self.NAME = self.__emiss_hdr['name'][0, :,
                                             0].copy().view('S10')[0].decode()
        self.NOTE = self.__emiss_hdr['note'][0, :,
                                             0].copy().view('S60')[0].decode()
        self.ITZON = self.__emiss_hdr['itzon'][0]
        self.FTYPE = 1
        self.VGTYP = 2
        self.VGTOP = 10000.
        self.VGLVLS = linspace(0, 1, self.NLAYS + 1)[::-1]
        self.GDNAM = "CAMx            "
        self.UPNAM = "CAMx            "
        self.FILEDESC = "CAMx            "
        # Create variables
        self.variables = PseudoNetCDFVariables(
            self.__variables, self.__var_names__ + ['TFLAG', 'ETFLAG'])
        tflag = ConvertCAMxTime(self.__memmap__['DATE']['BDATE'],
                                self.__memmap__['DATE']['BTIME'], self.NVARS)
        etflag = ConvertCAMxTime(self.__memmap__['DATE']['EDATE'],
                                 self.__memmap__['DATE']['ETIME'], self.NVARS)
        tflagv = self.createVariable('TFLAG',
                                     'i', ('TSTEP', 'VAR', 'DATE-TIME'),
                                     values=tflag,
                                     units='DATE-TIME',
                                     long_name='TFLAG'.ljust(16),
                                     var_desc='TFLAG'.ljust(80))
        etflagv = self.createVariable('ETFLAG',
                                      'i', ('TSTEP', 'VAR', 'DATE-TIME'),
                                      values=etflag,
                                      units='DATE-TIME',
                                      long_name='ETFLAG'.ljust(16),
                                      var_desc='Ending TFLAG'.ljust(80))

        self.SDATE, self.STIME = self.variables['TFLAG'][0, 0, :]
        self.TSTEP = self.variables['ETFLAG'][
            0, 0, 1] - self.variables['TFLAG'][0, 0, 1]
        if not P_ALP is None:
            self.P_ALP = P_ALP
        if not P_BET is None:
            self.P_BET = P_BET
        if not P_GAM is None:
            self.P_GAM = P_GAM
        if not XCENT is None:
            self.XCENT = XCENT
        if not YCENT is None:
            self.YCENT = YCENT
        if not GDTYP is None:
            self.GDTYP = GDTYP
        try:
            add_cf_from_ioapi(self)
        except Exception as e:
            warn(repr(e))
            pass
Beispiel #3
0
    def __init__(self,
                 rf,
                 mode='r',
                 P_ALP=None,
                 P_BET=None,
                 P_GAM=None,
                 XCENT=None,
                 YCENT=None,
                 GDTYP=None,
                 endian='big',
                 chemparam=None):
        """
        Parameters
        ----------
        rf : string or RecordFile
            usually a path to a CAMx formatted file, can be a FortranFileUtil
            RecordFile object.
        mode : string
            file open mode read ('r'), write ('w'), append ('a', 'r+')
        P_ALP : float
            see IOAPI GRIDDESC documentation
        P_BET : float
            see IOAPI GRIDDESC documentation
        P_GAM : float
            see IOAPI GRIDDESC documentation
        XCENT : float
            see IOAPI GRIDDESC documentation
        YCENT : float
            see IOAPI GRIDDESC documentation
        GDTYP : float
            see IOAPI GRIDDESC documentation
        endian : string
            'big' or 'little' usually only if mistaken compile
        chemparam : None or string
            used to identify gases and aerosols

        Returns
        -------
        outf : uamiv
            PseudoNetCDFFile populated from file
        """
        if chemparam is None:
            self._aerosol_names = None
        else:
            self._aerosol_names = get_chemparam_names(chemparam)['aerosol']

        self.__endianprefix = dict(big='>', little='<')[endian]
        self._make_header_fmt()
        self.__rffile = rf
        self.__mode = mode

        self.createDimension('DATE-TIME', 2)

        self.__readheader()

        # Add IOAPI metavariables
        self.NLAYS = len(self.dimensions['LAY'])
        self.NROWS = len(self.dimensions['ROW'])
        self.NCOLS = len(self.dimensions['COL'])
        self.NVARS = len(self.dimensions['VAR'])
        self.NSTEPS = len(self.dimensions['TSTEP'])
        varlist = "".join([i.ljust(16) for i in self.__var_names__])
        setattr(self, 'VAR-LIST', varlist)
        self.NAME = self.__emiss_hdr['name'][0, :,
                                             0].copy().view('S10')[0].decode()
        self.NOTE = self.__emiss_hdr['note'][0, :,
                                             0].copy().view('S60')[0].decode()
        self.ITZON = self.__emiss_hdr['itzon'][0]
        self.FTYPE = 1
        self.VGTYP = 2
        self.VGTOP = 10000.
        self.VGLVLS = linspace(0, 1, self.NLAYS + 1)[::-1]
        self.GDNAM = "CAMx            "
        self.UPNAM = "CAMx            "
        self.FILEDESC = "CAMx            "
        # Create variables
        self.variables = PseudoNetCDFVariables(
            self.__variables, ['TFLAG', 'ETFLAG'] + self.__var_names__)
        tflag = ConvertCAMxTime(self.__memmap__['DATE']['BDATE'],
                                self.__memmap__['DATE']['BTIME'], self.NVARS)
        etflag = ConvertCAMxTime(self.__memmap__['DATE']['EDATE'],
                                 self.__memmap__['DATE']['ETIME'], self.NVARS)
        tflagv = self.createVariable('TFLAG',
                                     'i', ('TSTEP', 'VAR', 'DATE-TIME'),
                                     values=tflag,
                                     units='DATE-TIME',
                                     long_name='TFLAG'.ljust(16),
                                     var_desc='TFLAG'.ljust(80))
        etflagv = self.createVariable('ETFLAG',
                                      'i', ('TSTEP', 'VAR', 'DATE-TIME'),
                                      values=etflag,
                                      units='DATE-TIME',
                                      long_name='ETFLAG'.ljust(16),
                                      var_desc='Ending TFLAG'.ljust(80))

        self.SDATE, self.STIME = self.variables['TFLAG'][0, 0, :]
        self.TSTEP = etflagv[0, 0, 1] - tflagv[0, 0, 1]
        if P_ALP is not None:
            self.P_ALP = P_ALP
        if P_BET is not None:
            self.P_BET = P_BET
        if P_GAM is not None:
            self.P_GAM = P_GAM
        if XCENT is not None:
            self.XCENT = XCENT
        if YCENT is not None:
            self.YCENT = YCENT
        if GDTYP is not None:
            self.GDTYP = GDTYP
Beispiel #4
0
    def __init__(self,
                 rf,
                 mode='r',
                 P_ALP=None,
                 P_BET=None,
                 P_GAM=None,
                 XCENT=None,
                 YCENT=None,
                 GDTYP=None,
                 endian='big',
                 chemparam=None):
        """
        Initialization included reading the header and learning
        about the format.
        
        see __readheader and __gettimestep() for more info
        """
        if chemparam is None:
            self._aerosol_names = None
        else:
            self._aerosol_names = get_chemparam_names(chemparam)['aerosol']

        ep = self.__endianprefix = dict(big='>', little='<')[endian]
        self.__emiss_hdr_fmt = dtype(
            dict(names=[
                'SPAD', 'name', 'note', 'itzon', 'nspec', 'ibdate', 'btime',
                'iedate', 'etime', 'EPAD'
            ],
                 formats=[
                     ep + 'i',
                     '(10, 4)%sS1' % ep,
                     '(60,4)%sS1' % ep, ep + 'i', ep + 'i', ep + 'i', ep + 'f',
                     ep + 'i', ep + 'f', ep + 'i'
                 ]))
        self.__grid_hdr_fmt = dtype(
            dict(names=[
                'SPAD', 'plon', 'plat', 'iutm', 'xorg', 'yorg', 'delx', 'dely',
                'nx', 'ny', 'nz', 'iproj', 'istag', 'tlat1', 'tlat2', 'rdum',
                'EPAD'
            ],
                 formats=[
                     ep + 'i', ep + 'f', ep + 'f', ep + 'i', ep + 'f',
                     ep + 'f', ep + 'f', ep + 'f', ep + 'i', ep + 'i',
                     ep + 'i', ep + 'i', ep + 'i', ep + 'f', ep + 'f',
                     ep + 'f', ep + 'i'
                 ]))
        self.__cell_hdr_fmt = dtype(
            dict(names=['SPAD', 'ione1', 'ione2', 'nx', 'ny', 'EPAD'],
                 formats=[
                     ep + 'i', ep + 'i', ep + 'i', ep + 'i', ep + 'i', ep + 'i'
                 ]))
        self.__time_hdr_fmt = dtype(
            dict(names=['SPAD', 'ibdate', 'btime', 'iedate', 'etime', 'EPAD'],
                 formats=[
                     ep + 'i', ep + 'i', ep + 'f', ep + 'i', ep + 'f', ep + 'i'
                 ]))
        self.__spc_fmt = dtype("(10,4)%sS1" % ep)
        self.__rffile = rf
        self.__mode = mode

        self.createDimension('DATE-TIME', 2)

        self.__readheader()

        # Add IOAPI metavariables
        nlays = self.NLAYS = len(self.dimensions['LAY'])
        nrows = self.NROWS = len(self.dimensions['ROW'])
        ncols = self.NCOLS = len(self.dimensions['COL'])
        nvars = self.NVARS = len(self.dimensions['VAR'])
        nsteps = self.NSTEPS = len(self.dimensions['TSTEP'])
        setattr(self, 'VAR-LIST',
                "".join([i.ljust(16) for i in self.__var_names__]))
        self.NAME = self.__emiss_hdr['name'][0, :,
                                             0].copy().view('S10')[0].decode()
        self.NOTE = self.__emiss_hdr['note'][0, :,
                                             0].copy().view('S60')[0].decode()
        self.ITZON = self.__emiss_hdr['itzon'][0]
        self.FTYPE = 1
        self.VGTYP = 2
        self.VGTOP = 10000.
        self.VGLVLS = linspace(0, 1, self.NLAYS + 1)[::-1]
        self.GDNAM = "CAMx            "
        self.UPNAM = "CAMx            "
        self.FILEDESC = "CAMx            "
        # Create variables
        self.variables = PseudoNetCDFVariables(
            self.__variables, ['TFLAG', 'ETFLAG'] + self.__var_names__)
        tflag = ConvertCAMxTime(self.__memmap__['DATE']['BDATE'],
                                self.__memmap__['DATE']['BTIME'], self.NVARS)
        etflag = ConvertCAMxTime(self.__memmap__['DATE']['EDATE'],
                                 self.__memmap__['DATE']['ETIME'], self.NVARS)
        tflagv = self.createVariable('TFLAG',
                                     'i', ('TSTEP', 'VAR', 'DATE-TIME'),
                                     values=tflag,
                                     units='DATE-TIME',
                                     long_name='TFLAG'.ljust(16),
                                     var_desc='TFLAG'.ljust(80))
        etflagv = self.createVariable('ETFLAG',
                                      'i', ('TSTEP', 'VAR', 'DATE-TIME'),
                                      values=etflag,
                                      units='DATE-TIME',
                                      long_name='ETFLAG'.ljust(16),
                                      var_desc='Ending TFLAG'.ljust(80))

        self.SDATE, self.STIME = self.variables['TFLAG'][0, 0, :]
        self.TSTEP = self.variables['ETFLAG'][
            0, 0, 1] - self.variables['TFLAG'][0, 0, 1]
        if not P_ALP is None:
            self.P_ALP = P_ALP
        if not P_BET is None:
            self.P_BET = P_BET
        if not P_GAM is None:
            self.P_GAM = P_GAM
        if not XCENT is None:
            self.XCENT = XCENT
        if not YCENT is None:
            self.YCENT = YCENT
        if not GDTYP is None:
            self.GDTYP = GDTYP
        try:
            add_cf_from_ioapi(self)
        except Exception as e:
            warn(repr(e))
            pass