o
    Mhw                     @   s   d dl Zd dlZd dlZd dlmZ d dlmZ d dl	Z	d dl
Z
e
d d dlmZ d dlmZmZmZmZmZ d dlmZmZ d dlmZ G d	d
 d
eZdS )    N)Path)datetimeignore)driver)	get_datesget_num_factorget_dir_pathget_zcolrounding)newElevData_CheckerorigElevData_Checker)	gen_GFED4c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )gen_elev_emisc                 K   s  || _ || _|| _|dd | _|dd | _|dd | _|dd | _|dd | _|dd | _	|dd | _
|dd | _|d	d | _|d
d | _|dd | _|dd | _|dd | _|dd | _|dd | _|dd | _|dd | _|dd| _|dd| _|dd | _|dd | _|dd| _|dd | _|dd | _|dd | _|dd | _|dd| _|dg d | _|d!g d"| _ |d#t!" | _#|d$d | _$|d%d | _%|d&d'| _&d S )(Nprofilevariablespeciesmodesectorssyr_listeyr_list	filenamesprofilesdiammwrho	sulfactorfracnumstrnumfile
param_fileindir outdirgridcgridSEdataTresmeanmean_yraltitudecheckerF	fractions)g      ?333333?r,   皙?r-   r-   皙?r.   r.   r   r   r   r   ind_frac)gp=
ף?gRQ?g)\(?r   r   r   r   r   r   r   r   r   r   	checkValsytagprepoutputzE3SM_elev_emis.nc)'startendfilenamegetr   varblr   r   	all_sectsstart_yr_listend_yr_listfilename_listprofile_list	all_diamsall_mwsall_rhosall_sulfactors	all_fracsall_numstrsr   r   r    r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r/   pd	DataFramer0   r1   r2   outfile)selfr4   r5   r6   kwargs rI   X/global/cfs/cdirs/e3sm/www/hass877/share/emis_processing/FlexEmis/src/elevEmis_driver.py__init__   sH   zgen_elev_emis.__init__c           	      C   s  | j d krt}dd}t||| _ t| j }| jd krU| jd ks(| j	d kr-t
d n(td| j td| j	 | jd t| j	 }| | _tj|jd}| jg|d< | jd krw|d	| j d
 d  | _| jg krvt
d| d nt|d j|d | jk  | j|d j|d | jk< | jd kr|d	| j d
 d  | _nt| jt| jksJ d| j|d j|d | jk< | jd kr|d	| j d
 d  | _nt| jt| jksJ d| j|d j|d | jk< | jd kr|d	| j d
 d  | _nt| jt| jksJ d| j|d j|d | jk< | jd kr:|d	| j d
 d  | _nt| jt| jksIJ d| j|d j|d | jk< | jd krl|d	| j d
 d  | _nt| jt| jks{J d| j|d j|d | jk< | jd kr|d	| j d
 d  | _nt| jt| jksJ d| j|d j|d | jk< tj|d< tj|d< | jd kr| jgt| j | _| jgt| j | _ nt| jt| jksJ dt| jt| j ksJ d| j!d krd| j"gt| j | _!t#t$t| j!| j| j| j D ]F\}}}}|dkr9| j"d kr3d | j!|< n| j"| j!|< |dkrHd | j d! | j!|< d"|v ra| jd# t| d$ t| d% | j!|< qnt| jt| j!kssJ d&| j%d kr| j&gt| j | _%t#t$t| j!| jD ]&\}}|dkr| jd! | j%|< |dkrd | j%|< d"|v rd | j%|< qnt| jt| j!ksJ d&| j|d j|d | jk< | j |d j|d | jk< | j'd kr|d	| j d
 d' ( d( | _'td)| j t|d	| j d
 j)d*d+ d S ),N/)z..dataz!E3SM_elev_emis_default_params.csvz=
Either variable name or species and mode has to be declared!z
Selected species: z
Selected mode: _a)columnsr   z
species==''sectorz
Unknown sectors for: z(
Specify sector for non-default species.r   z:List of diameters and sectors should have the same length!r   z3List of MW and sectors should have the same length!r   z8List of density and sectors should have the same length!r   zHList of sulfactor (MWso2/MWso4) and sectors should have the same length!r   z:List of fractions and sectors should have the same length!r   z7List of numstr and sectors should have the same length!start_yrend_yrz?List of starting years and sectors should have the same length!z=List of ending years and sectors should have the same length!BBcontvolcZ	contvolc_z_elev_HR_emis_profile.nc_ELEV
_IND_emis_-.ncz6List of files and sectors should have the same length!r   r   z"
Selected parameters for species: T)drop)*r   __name__joinpkg_resourcesresource_streamrD   read_csvr8   r   r   	ExceptionprintstrlowerrE   rO   r9   querytolistlocr>   lenr?   r@   rA   rB   rC   npnanr:   r4   r5   r;   r<   r6   zipranger=   r   r   uniquereset_index)	rG   resource_packageresource_pathdftmp_varisectserI   rI   rJ   
get_params9   s   







 
     

*


(




"$zgen_elev_emis.get_paramsc                 C   s  t | j}t | j}t| jd\}}}dddd}	|	| jd d  }
|d ks*|dkrJtd | jd	krEt|
t	|t	|||}td
| nU|
d }nPtd t
|| jtt	|t	|d}|j}d||
 jd< d||
 jd< | |t	|
d t	| d t	| d   |
d t	| d t	| d }| jr(td t|t	|t	|| j| jddd }t
|jtt	|t	|d}|jd }|jd }||
 }| jd krtd t
jdd |dd}|ddi}d g|jd!d"d#fd$g|d!d%d#fd&gtj|d' jtjd(d)dd#fd&gtj|d* jtjd(d+dd#fd,}ntd- zt|t	|t	|| j| jd. }W n   t|t	|t	|| j| jddd }Y t| t
|jtt	|t	|d}|jd }|jd }||
 }|d'd*d/}| jd krtd t
jdd |dd}|ddi}d g|jd!d"d#fd$g|d!d%d#fd'gtj|d' jtjd(d)dd#fd*gtj|d* jtjd(d+dd#fd,}d|jd< d|jd< d0d1t ! "d2||d3}|||fS )4Naltitude_airSO2BCOC)sobcpo   Nonez
Using GFED4 data.ZGFEDz
Generated GFED4 data:z'_biomass_burning_emis_GFED_1997-2022.ncz"
Using CMIP6 biomass burning data.)time  G
_FillValuemissing_value_biomass_fixed_rX   rY   z'
Remapping BB data from RLL to SE grid.	longitudelatitudefileindoutr#   r&   xdimydimr#   nominal_resolutionz
Getting monthly climotology.T)use_floxz
time.monthr   monthr)   kmaltitude midlevelunits	long_namealtitude_intaltitude intervalncollatdtypedegrees_northlondegrees_eastr)   r   r   r   z%
Using the original RLL grid BB data.r   r   r   r#   r&   )r   r   <This data was produced using the E3SM emission pre-processor&Taufiq Hassan (taufiq.hassan@pnnl.gov)%Y-%m-%d %H:%M:%Scommentcontactcreation_dateorigin_gridorigin_nominal_resolution)#r   r    r"   r	   r)   r8   ra   r2   r   rb   xropen_datasetselsliceattrsencodingload	to_netcdfr%   r   r#   r&   gen_remapped_filesr'   set_optionsgroupbyrenamerM   rh   arrayfloat32float64r   todaystrftime)rG   r6   r4   r5   in_dir_pathout_dir_pathzcolrx   altitude_int_airvar_originnamer8   pre_biomassr   fnameZbiomassZ	grid_infoZres_infoZ	data_biomcoordsrI   rI   rJ   get_bb_data   s   



$2 & 


""&( 

""


zgen_elev_emis.get_bb_datac                 C   s  t | j}t | j}| jrhtd t|t|t|| j| jd	 }td| t
|d }dgtj|d jtjddddd	fd
gtj|d jtjddddd	fd
gtj|d jtjddddd	fd}nstd zt|t|t|| j| jd	 }W n   t|t|t|| j| jddd	 }Y t| t
|d }dgtj|d jtjddddd	fdgtj|d jtjddddd	fdgtj|d jtjddddd	fd}t|tdt|dd   }td | jd krtd tjg dtjd| _t| j| _ntj| jtjd| _| jd  }| jd  }	t
j|dd| jid}
t
j|	dd| jid}|
j| jddidd }|j| jddidd }|d!d  j|d d j d | _|d!d  j|d d j d | _t| jd"k d"| j| _t| jd"k d"| j| _|j| jddidd#}t
j| jd| jidgd$| _t| sm| jd" d"krtd% tjt| jd! tjd}tt| jD ]}| j| d& ||  ||d! < q|d!d  |d d  d' }t
j|d| jidgd$}|d |d< d|jd(< || ||  d }td)| j t!tt|| jD ]!\}}tt"|d d |f ||d d |f |d d |f< qd*|_#d*t$|j%|jd+dd,fi}t
j&||d-}td.t|  |' (|t|  |S td/| d0  td1| d2  |S )3Nz*
Remapping BB profile from RLL to SE grid.r   z
Remapped BB profile file: rT   r)   r   r   r   )r   r   r   r   r   r   r   r   r   r   )r)   r   r   z-
Using the original RLL grid BB profile data.r   ZfireEmisfrac_rL   z>
Setting injection heights and vertical distribution fractionsz
Setting to AEROCOM default.g   ?g"?g  @l?g  @^?gC?gI?g&1?g  @A?g  "@g?33@g  @7	@gĠ@g  @l@d   xdimsr   
fill_valueg        linear)r   rH   method   r   )r)   rH   r   r   r   z,
Injection height can not be zero (surface)!r        j@r   z3
Fillout missing places with pre-defined fractions:r   r+   )r   r   )	data_varsr   z
Saving BB profile to 
z already exists!
 Using it.z>
Note: If changes are made to the vertical profile,
make sure z does not exist!))r   r    r"   r%   ra   r   rb   r#   r&   r   r   r   rh   r   rM   r   r   splitr)   r+   cumsumr/   	DataArrayinterpvalueswherer   is_filezerosrg   rk   r   sumrj   isnannamelistr   Datasetr   r   )rG   r   r   r   r   Zfirer   Znew_prof_nameZ
alt_cumsumZ
ind_cumsumdaZda_indbbZbb_indr   rr   dzr   tempr   r   dsrI   rI   rJ   get_injection_heights   s   

"
$$$&($$$"
"""
<z#gen_elev_emis.get_injection_heightsc           7      C   s	  d}t | j}t | j}|   tt| jt| j }t	t
| jdkr3| j| }| j| }n| j}| j}|| d }| jd krQ| jd krQt| j| j}nt||}ddg|fi}	ddg|fi}
t| j| j| j| j| j| j| j| j| j| j| jD ]%\}}}}}}}}}}}td| d  d| | }t|||}|dkr| j|||d	\}}}| |}td
| t|| d }|j }tj!t	|d tj"d}t#t	|D ]}|| d ||  ||d < q|dd  |d d  d } tj$| d|idgd}!| jd krHt	|j%d |k rHtd| |& 'ddi}"g d|"d< tj(t)|d t)|d dd}#|#j*}$tj$|$dg|#gd}%|"j+|%d}td| | jd kr|& 'ddi}&g d|&d< tj(t)|d t)|d dd}#|#j*}$tj$|$dg|#gd}%|&j+|%d}|d |d< |, |-d |! }'td|'j. |'j/| | }(|t0|'j1tj|(tj2ddd ifi})|	3|) |d! | j45d!d 6  d" | t0|'j1tj|(| tj2ddd#ifi}*|
3|* |d$krUtjg d%tj"d}+t7t0|+d&\}!}}| j8rWtd' t9|t)|t)|| j:| j;d(< },t=|t)|, d$ }-dg|j/d)d*d+fd,g|d)d-d+fd.gtj|-d/ j/tj2dd0d1d+fd.gtj|-d2 j/tj2dd3d4d+fd5}nlzt9|t)|t)|| j:| j;d(< }.W n   t9|t)|t)|| j:| j;d4d1d6< }.Y t|. t=|.d$ }-dg|j/d)d*d+fd,g|d)d-d+fd/gtj|-d/ j/tj"dd0d1d+fd2gtj|-d2 j/tj"dd3d4d+fd5}td| | jd kr |-& 'ddi}/g d|/d< tj(t)|d t)|d dd}#|#j*}$tj$|$dg|#gd}%|/j+|%d}-td7|-j. d$t0|-j1tj|-j/tj2ddd ifi})|	3|) |d! | j45d!d 6  d8 t0|-j1tj|-j/| | tj2ddd#ifi}*|
3|* d9d:t>? @d;d<d=d>}d?|v rt7t0| j d&\}!}}t)|d@ t)| }0tA|0B rtdA|0 | j8rt=|t)| }1|1dB |! }2|2Cddd.}2nLzt9|0t)|t)|| j:| j;d(< }3W n   t9|0t)|t)|| j:| j;d4d1d6< }3Y t|3 t=|3}1|1dB |! }2|2Cddd/d2}2n	tdC|0 dD   t!|2j.|2& d  }4|5d!d }5t#t	|!D ]}|1|5 | jD|  |!|  |4d d |f< q| jd krYt	|4j%d |k rYtd| |4& 'ddi}"g d|"d< tj(t)|d t)|d dd}#|#j*}$tj$|$dg|#gd}%|"j+|%d}4tdE|4j. |t0|2j1tj|4j/tj2ddd ifi})|	3|) |d! | j45d!d 6  d" |5 t0|2j1tj|4j/| | tj2ddd#ifi}*|
3|* q}| jErtF|| j||| j| j| j| j4| j| j| j| jG}6| j| jHdF< |6| jHdG< |	|
||fS )HNgWTDr   dater   z
====Processing z sector now.====
   rT   )r4   r5   z
Found BB Profile: r   r   r   r   r   r)   r      z0
Copying same year for the whole time period in r   )r   r                     	   r      r   z-01-01z-12-31MS)freqr   )r   z1
Copying BB profile for the whole time period in r   z
BB data shape: r   zmolecules/cm3/s_Z_ELEV_z(particles/cm3/s) * 6.022e26rU   r   rw   z-
Remapping volcanic data from RLL to SE grid.r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   z
Volcanic data shape: Z_ELEV_contvolcr   r   r   z$0.625x0.46 degree latitudexlongitudez~60 kmr   rV   rL   z%
Using industrial/energy sector data:INDz
Make sure zI exists!
Hint: Create the surface emissions first to produce these files.z
IND/ENE data shape: r   Orig (Tg/yr))Ir   r    r"   rv   rh   argmaxr   r;   r:   rg   setr4   r5   r(   r'   r   rj   r9   r<   r=   r?   r@   r>   rA   rC   rB   ra   r   r   r   r   r   r)   r   r   rk   r   r   copyr   cftime_rangerb   r   r   r   fillnashaperM   r   r   r   updater8   r   upperr	   r%   r   r#   r&   r   open_mfdatasetr   r   r   r   r   	transposer/   r*   r   r$   r0   )7rG   avgodr   r   r   r4   r5   yearsdatesr   num_varsrs   r6   r   rt   ru   r   r   r   r   num_strr   factor
num_factorZBB_datar   r   Z	frac_fileZnew_profrx   r   rr   r   r   data_renamed
date_rangemonthsselArrZnew_prof_renamedZbc_elev_emisemis_valnew_varnum_varZaero_altr   Z	volc_dataZremapped_volcZvolc_data_renamedZind_fileZind_dataZdshapeZremapped_indZind_new	sect_name	orig_valsrI   rI   rJ   get_varsF  s&  




 


 
 
 $
H


"""&(""
 &
J


&(
* 
 &
N
0
zgen_elev_emis.get_varsc           	         s  |   \}}}}t| j}| jdkrstj|||d}| jd kr(t| jd | _	nt| j
d t| j | _	ddhi|_td d  fdd	|jD }| fd
d	|jD  |j|t| jd | j d | j	 d | j  |dd tj|||d}| jd krt| jd | _	nt| j
d t| j | _	ddhi|_td d  fdd	|jD }| fdd	|jD  |j|t| jd | j	 d | j  |dd | jrt|| jd | j| j}|| jd< | jddg dd | jddg< t| j d S d S )Nso2)r   r   r   CLIMrX   unlimited_dimsr   )r   c                       i | ]}| qS rI   rI   .0varcomprI   rJ   
<dictcomp>
      z+gen_elev_emis.prod_emis.<locals>.<dictcomp>c                    r  rI   rI   r  coordr  rI   rJ   r    r  r   NETCDF3_64BIT)r   formatc                    r  rI   rI   r  r  rI   rJ   r    r  c                    r  rI   rI   r  r  rI   rJ   r    r  r   zNew (Tg/yr)r   c                 S   s   t | S )N)r
   )r   rI   rI   rJ   <lambda>  s    z)gen_elev_emis.prod_emis.<locals>.<lambda>)r  r   r"   r8   r   r   r'   rb   r(   r1   r4   r5   r   dictr   r   r   r   r   rF   r*   r   r?   r    r$   r0   applymapra   )	rG   r   r  r   r   dir_pathr   	encodingsnew_valsrI   r  rJ   	prod_emis  s6   



8

.
"zgen_elev_emis.prod_emisc                 C   s   t d t| j}| jd krt| jd | _nt| jd t| j | _t	
t|d t|d | j d | j  }| j|t|d | j d | j  dd d S )	Nz
Combining number conc files.r  rX   rL   z_*_r   r  )r  )ra   r   r"   r'   rb   r(   r1   r4   r5   r   r   rF   r   r   )rG   numvalr"  rM   rI   rI   rJ   combine_numvars   s   

.2zgen_elev_emis.combine_numvarsN)
r[   
__module____qualname__rK   rv   r   r   r  r%  r'  rI   rI   rI   rJ   r      s    &jPS 8#r   )xarrayr   numpyrh   pandasrD   pathlibr   r   r]   warningsfilterwarningssrc.ggen.driver_modr   	src.utilsr   r   r   r	   r
   src.checkersr   r   Zsrc.prep_GFED4r   objectr   rI   rI   rI   rJ   <module>   s    
