Exemple #1
0
def get_emis_grid(sector):
    """
    Get emission grid set

    :param sector: (*Sector*) The sector.

    :returns: (*GridSet*) Emission grid set.
    """
    if sector == SectorEnum.AIR:
        emis_grid = GridDesc(geolib.projinfo(),
                             x_orig=-179.75,
                             x_cell=0.5,
                             x_num=720,
                             y_orig=-89.75,
                             y_cell=0.5,
                             y_num=360)
    elif sector == SectorEnum.BIOMASS:
        emis_grid = GridDesc(geolib.projinfo(),
                             x_orig=-180.0,
                             x_cell=0.25,
                             x_num=1440,
                             y_orig=-90.0,
                             y_cell=0.25,
                             y_num=720)
    elif sector == SectorEnum.SHIPS:
        emis_grid = GridDesc(geolib.projinfo(),
                             x_orig=-180.0,
                             x_cell=0.25,
                             x_num=1440,
                             y_orig=-89.75,
                             y_cell=0.25,
                             y_num=720)
    else:
        emis_grid = GridDesc(geolib.projinfo(),
                             x_orig=-179.95,
                             x_cell=0.1,
                             x_num=3600,
                             y_orig=-89.95,
                             y_cell=0.1,
                             y_num=1800)

    return emis_grid
Exemple #2
0
    def __init__(self,
                 proj=projinfo(),
                 x_coord=None,
                 y_coord=None,
                 x_orig=None,
                 x_cell=None,
                 x_num=None,
                 y_orig=None,
                 y_cell=None,
                 y_num=None):
        """
        Grid description.

        Using ``x_coord`` and ``y_coord`` or using ``x_orig``, ``x_cell``, ``x_num``,
        ``y_orig``, ``y_cell`` and ``y_num``.

        :param proj: (*ProjectionInfo*) The projection.
        :param x_coord: (*array*) X coordinate array.
        :param y_coord: (*array*) Y coordinate array.
        :param x_orig: (*float*) X coordinate at grid south-west corner.
        :param x_cell: (*float*) Grid spacing in x direction.
        :param x_num: (*int*) The number of grid cell in x direction.
        :param y_orig: (*float*) Y coordinate at grid.
        :param y_cell: (*float*) Grid spacing in y direction.
        :param y_num: (*int*) The number of grid cell in y direction.
        """
        self.proj = proj
        if x_coord is None:
            self.__x_orig = x_orig
            self.__x_cell = x_cell
            self.__x_num = x_num
            self.__y_orig = y_orig
            self.__y_cell = y_cell
            self.__y_num = y_num
            self.__x_coord = np.arange1(x_orig, x_num, x_cell)
            self.__y_coord = np.arange1(y_orig, y_num, y_cell)
        else:
            self.__x_coord = x_coord
            self.__y_coord = y_coord
            self.__x_orig = x_coord[0]
            self.__x_cell = x_coord[1] - x_coord[0]
            self.__x_num = len(x_coord)
            self.__y_orig = y_coord[0]
            self.__y_cell = y_coord[1] - y_coord[0]
            self.__y_num = len(y_coord)
Exemple #3
0
            if data is None:
                print('No RETRO species!')
                ncfile.write(dimvar.name, rdata)
            else:
                if spec.molar_mass is not None:
                    print('Convert (g/m2/s) to (mole/m2/s)')
                    data = data / spec.molar_mass
                ncfile.write(dimvar.name, data)
    
        #Close output netcdf file
        ncfile.close()
    
if __name__ == '__main__':  
    #Using RADM2 chemical mechanism
    from emips.chem_spec import RADM2

    #Set year, month and data path
    year = 2015
    month = 1
    dir_inter = r'D:\run_data\emips\run_meic\inter_data\{}{:>02d}'.format(year, month)
    if not os.path.exists(dir_inter):
        os.mkdir(dir_inter)

    #Set model grids
    proj = geolib.projinfo()
    model_grid = GridDesc(proj, x_orig=70., x_cell=0.15, x_num=502,
        y_orig=15., y_cell=0.15, y_num=330)

    #Run
    run(year, month, dir_inter, RADM2(), model_grid)
Exemple #4
0
from emips.chem_spec import Pollutant, PollutantEnum
from emips.utils import SectorEnum
from emips.spatial_alloc import GridDesc
import os
from mipylib.dataset import addfile
from mipylib import geolib

__all__ = [
    'dir_emission', 'emis_grid', 'grid_areas', 'get_emis_fn', 'read_emis'
]

dir_emission = r'M:\Data\Emission\EDGAR_HTAP\2010'

emis_grid = GridDesc(geolib.projinfo(),
                     x_orig=0.05,
                     x_cell=0.1,
                     x_num=3600,
                     y_orig=-89.95,
                     y_cell=0.1,
                     y_num=1800)

#Calculate emission grid areas
grid_areas = emis_grid.grid_areas()  #square meters


def get_emis_fn(sector, pollutant, year, month):
    """
    Get emission file path.

    :param sector: (*Sector*) The emission sector.
    :param pollutant: (*Pollutant*) The pollutant.
Exemple #5
0
def run(year, month, dir_inter):
    """
    Merge all pollutant emission files in one file for each sector.

    :param year: (*int*) Year.
    :param month: (*int*) Month.
    :param dir_inter: (*string*) Data input and output path.
    """
    #Set sectors and pollutants
    sectors = [SectorEnum.INDUSTRY, SectorEnum.AGRICULTURE, SectorEnum.ENERGY, \
        SectorEnum.RESIDENTIAL, SectorEnum.TRANSPORT, SectorEnum.SHIPS, \
        SectorEnum.AIR]
    pollutants = [PollutantEnum.BC, PollutantEnum.CH4, PollutantEnum.CO, \
        PollutantEnum.NH3, PollutantEnum.NOx, PollutantEnum.OC, PollutantEnum.PM2_5, \
        PollutantEnum.SO2, PollutantEnum.PM10, PollutantEnum.NMVOC]

    #Set model grids
    proj = geolib.projinfo()
    model_grid = GridDesc(proj,
                          x_orig=70.,
                          x_cell=0.15,
                          x_num=502,
                          y_orig=15.,
                          y_cell=0.15,
                          y_num=330)
    #Set dimensions
    tdim = np.dimension(np.arange(24), 'hour')
    ydim = np.dimension(model_grid.y_coord, 'lat', 'Y')
    xdim = np.dimension(model_grid.x_coord, 'lon', 'X')
    dims = [tdim, ydim, xdim]

    #Sector loop
    for sector in sectors:
        print('Sector: {}'.format(sector))

        #Set output sector emission file name
        outfn = os.path.join(dir_inter, \
            'emis_{}_{}_{}_hour.nc'.format(sector, year, month))
        print('Sector emission file: {}'.format(outfn))

        #Pollutant loop
        dimvars = []
        dict_spec = {}
        for pollutant in pollutants:
            #Read data in pollutant file
            if pollutant == PollutantEnum.NMVOC:
                fn = os.path.join(dir_inter, \
                    '{}_emis_lump_{}_{}_{}_hour.nc'.format(pollutant.name, \
                    sector.name, year, month))
            else:
                fn = os.path.join(dir_inter, \
                    '{}_emis_{}_{}_{}_hour.nc'.format(pollutant.name, \
                    sector.name, year, month))
            if not os.path.exists(fn):  #No emission data
                print('\tAlarm! The file not exists: {}'.format(fn))
                continue

            print('\t{}'.format(fn))
            f = dataset.addfile(fn)
            for var in f.variables():
                if var.ndim == 3:
                    if dict_spec.has_key(var.name):
                        dict_spec[var.name].append(fn)
                    else:
                        dimvars.append(var)
                        dict_spec[var.name] = [fn]

        #Create output merged netcdf data file
        gattrs = dict(Conventions='CF-1.6', Tools='Created using MeteoInfo')
        ncfile = dataset.addfile(outfn, 'c')
        ncfile.nc_define(dims, gattrs, dimvars)
        for sname, fns in dict_spec.iteritems():
            spec_data = None
            for fn in fns:
                f = dataset.addfile(fn)
                if spec_data is None:
                    spec_data = f[sname][:]
                else:
                    spec_data = spec_data + f[sname][:]
                ncfile.write(sname, spec_data)
        ncfile.close()
Exemple #6
0
from emips.chem_spec import Pollutant, PollutantEnum
from emips.utils import SectorEnum
from emips.spatial_alloc import GridDesc
import os
from mipylib.dataset import addfile
from mipylib import geolib

__all__ = ['dir_emission', 'emis_grid', 'grid_areas', 'get_emis_fn', 'read_emis']

dir_emission = r'D:\KeyData\Emission\EDGAR_HTAP\2010'

emis_grid = GridDesc(geolib.projinfo(), x_orig=0.05, x_cell=0.1, x_num=3600,
    y_orig=-89.95, y_cell=0.1, y_num=1800)

#Calculate emission grid areas
grid_areas = emis_grid.grid_areas()    #square meters

def get_emis_fn(sector, pollutant, year, month):
    """
    Get emission file path.

    :param sector: (*Sector*) The emission sector.
    :param pollutant: (*Pollutant*) The pollutant.
    :param year: (*int*) The year.
    :param month: (*int*) The month.
    :returns: (*string*) Emission file path.
    """
    pollutant_name = pollutant.name.upper()
    if pollutant == PollutantEnum.CH4:    #Only has yearly emission
        fn = 'sum_v42_FT2010_{}_{}_IPCC_{}.0.1x0.1.nc'.format(pollutant_name,
            year, sector.name.upper())
Exemple #7
0
def run(year, month, dir_inter, emission, model_grid):
    """
    Process VOC emission data by spatial allocation, temporal allocation
    and chemical speciation.

    :param year: (*int*) Year.
    :param month: (*int*) Month.
    :param dir_inter: (*string*) Data output path.
    :param emission: (*module*) Emission module.
    :param model_grid: (*GridDesc*) Model data grid describe.
    """
    #Set profile files
    temp_profile_fn = os.path.join(ge_data_dir,
                                   'amptpro.m3.default.us+can.txt')
    temp_ref_fn = os.path.join(ge_data_dir, 'amptref.m3.us+can.cair.txt')

    #Set data dimensions
    tdim = np.dimension(np.arange(24), 'hour')
    ydim = np.dimension(model_grid.y_coord, 'lat', 'Y')
    xdim = np.dimension(model_grid.x_coord, 'lon', 'X')
    dims = [tdim, ydim, xdim]

    #Set sectors and pollutants
    sectors = [SectorEnum.INDUSTRY, SectorEnum.AGRICULTURE, SectorEnum.ENERGY, \
        SectorEnum.RESIDENTIAL, SectorEnum.TRANSPORT, SectorEnum.AIR, SectorEnum.SHIPS]
    fn_sectors = ['inc', 'agr', 'pow', 'res', 'tra', 'tra', 'tra']
    pollutant = PollutantEnum.NMVOC
    pollutant.units = Units(Weight.KG, Area.M2, Period.SECOND)

    #Loop
    for sector, fn_sector in zip(sectors, fn_sectors):
        print('####################################')
        print(sector)
        print('####################################')

        #Get SCC
        scc = emis_util.get_scc(sector)

        print('Read emission data...')
        emis_data = emission.read_emis(sector, pollutant, year, month)
        if emis_data is None:  #No emission of NMVOC for some sectors
            continue
        #Longitude pivot to global grid data from 0 longitude
        emis_data, emis_grid = emission.lonpivot(
            emis_data, 0, emission.get_emis_grid(sector))
        #Expand grid to aviod NaN interpolation values
        emis_data, emis_grid = emission.grid_expand(emis_data, emis_grid)
        if sector == SectorEnum.SHIPS:
            emis_data = emis_data[::-1, :]
        #### Spatial allocation
        print('Spatial allocation of emission grid to model grid...')
        emis_data = transform(emis_data, emis_grid, model_grid)

        #### Temporal allocation
        print('Temporal allocation...')
        month_profile, week_profile, diurnal_profile, diurnal_profile_we = \
            emips.temp_alloc.read_file(temp_ref_fn, temp_profile_fn, scc)
        print('To (kg/m2/month)')
        emis_data = emis_data * 3600 * 24 * emis_util.get_month_days(
            year, month)
        print('To daily emission (kg/m2/day)...')
        weekday_data, weekend_data = emips.temp_alloc.week_allocation(
            emis_data, week_profile, year, month)
        print('To hourly emission (g/m2/s)...')
        hour_data = emips.temp_alloc.diurnal_allocation(
            weekday_data, diurnal_profile) / 3.6

        #### Chemical speciation
        print('Chemical speciation...')
        #### Set output netcdf file path
        outfn = os.path.join(dir_inter, \
            '{}_emis_{}_{}_{}_hour.nc'.format(pollutant.name, sector.name, year, month))
        print('Output file: {}'.format(outfn))

        print('Set grid speciation data...')
        fn = r'Z:\chen\MEIC_data\Grid_speciation_data(VOC)\retro_nmvoc_ratio_{}_2000_0.1deg.nc'.format(
            fn_sector)
        print('Grid speciation file: {}'.format(fn))
        f = dataset.addfile(fn)

        #Create output netcdf file and define dimensions, global attributes and variables
        gattrs = dict(Conventions='CF-1.6', Tools='Created using MeteoInfo')
        dimvars = []
        for var in f.variables():
            if var.ndim == 2:
                dimvar = dataset.DimVariable()
                dimvar.name = var.name
                dimvar.dtype = np.dtype.float
                dimvar.dims = dims
                dimvar.addattr('units', 'g/m2/s')
                dimvars.append(dimvar)
        ncfile = dataset.addfile(outfn, 'c')
        ncfile.nc_define(dims, gattrs, dimvars)

        #Write variable values
        proj = geolib.projinfo()
        ratio_grid = GridDesc(proj,
                              x_orig=0.05,
                              x_cell=0.1,
                              x_num=3600,
                              y_orig=-89.95,
                              y_cell=0.1,
                              y_num=1800)
        for dimvar in dimvars:
            print(dimvar.name)
            rdata = f[dimvar.name][:]
            rdata, rgrid = emission.grid_expand(rdata, ratio_grid)
            rdata = transform(rdata, rgrid, model_grid)
            spec_data = hour_data * rdata
            ncfile.write(dimvar.name, spec_data)

        #Close output netcdf file
        ncfile.close()
Exemple #8
0
def run(year, month, dir_inter, chem_mech):
    """
    Lump VOC species according chemical mechanism.

    :param year: (*int*) Year.
    :param month: (*int*) Month.
    :param dir_inter: (*string*) Data input and output path.
    :param chem_mech: (*ChemicalMechanism*) Chemical mechanism.
    """
    #Set sectors and pollutants
    sectors = [SectorEnum.INDUSTRY, SectorEnum.AGRICULTURE, SectorEnum.ENERGY, \
        SectorEnum.RESIDENTIAL, SectorEnum.TRANSPORT, SectorEnum.SHIPS, \
        SectorEnum.AIR]
    pollutant = PollutantEnum.NMVOC

    #Set model grids
    proj = geolib.projinfo()
    model_grid = GridDesc(proj,
                          x_orig=70.,
                          x_cell=0.15,
                          x_num=502,
                          y_orig=15.,
                          y_cell=0.15,
                          y_num=330)
    #Set dimensions
    tdim = np.dimension(np.arange(24), 'hour')
    ydim = np.dimension(model_grid.y_coord, 'lat', 'Y')
    xdim = np.dimension(model_grid.x_coord, 'lon', 'X')
    dims = [tdim, ydim, xdim]

    #Sector loop
    for sector in sectors:
        print(sector)

        #Set input file
        infn = os.path.join(dir_inter, \
            '{}_emis_{}_{}_{}_hour.nc'.format(pollutant.name, sector, year, month))
        if not os.path.exists(infn):
            print('Alarm! File not exists: {}'.format(infn))
            continue

        print('Input file: {}'.format(infn))
        #Open input file
        inf = dataset.addfile(infn)
        #Read a reference data
        vname = inf.varnames()[4]
        rdata = inf[vname][:]
        rdata[rdata != np.nan] = 0.

        #Set output file
        outfn = os.path.join(dir_inter, \
            '{}_emis_lump_{}_{}_{}_hour.nc'.format(pollutant.name, sector, year, month))
        print('Output file: {}'.format(outfn))
        #Create output netcdf file
        ncfile = dataset.addfile(outfn, 'c')
        #Set global attribute
        gattrs = dict(Conventions='CF-1.6', Tools='Created using MeteoInfo')
        #Set variables
        dimvars = []
        for spec in chem_mech.nmvoc_species():
            dimvar = dataset.DimVariable()
            dimvar.name = spec.name
            dimvar.dtype = np.dtype.float
            dimvar.dims = dims
            dimvar.addattr('units', 'mol/m2/s')
            dimvars.append(dimvar)
        #Define dimensions, global attributes and variables
        ncfile.nc_define(dims, gattrs, dimvars)

        #Write variable values
        for spec, dimvar in zip(chem_mech.nmvoc_species(), dimvars):
            print('{} species: {}'.format(chem_mech.name, spec))
            rspecs = chem_mech.lump_RETRO(spec)
            print('RETRO species: {}'.format(rspecs))
            data = None
            for rspec, ratio in rspecs.iteritems():
                if rspec.name in inf.varnames():
                    if data is None:
                        data = inf[rspec.name][:] * ratio
                    else:
                        data = data + inf[rspec.name][:] * ratio
            if data is None:
                print('No RETRO species!')
                ncfile.write(dimvar.name, rdata)
            else:
                print('Convert (g/m2/s) to (mole/m2/s)')
                data = data / spec.molar_mass
                ncfile.write(dimvar.name, data)

        #Close output netcdf file
        ncfile.close()