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
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)
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)
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.
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()
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())
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()
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()