o
    MhN                     @   s   d dl Zd dlZd dlZd dlmZ d dlZd dlZe	d 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)datetimeignore)	get_datesget_num_factorget_dir_pathroundingget_sectors)origSurfData_CheckernewSurfData_Checker)driverc                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )gen_surf_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t | _|dd | _ |dd | _!d S )!Nvariablespeciesmodesectorssyr_listeyr_list	filenamesdiammwrho	sulfactorfracnumstrnumfilencvars
param_fileindir outdirgridcgridresmeanmean_yrcheckerFSEdataT	checkValsytagoutputzE3SM_surf_emis.nc)"startendfilenamegetvarblr   r   	all_sectsstart_yr_listend_yr_listfilename_list	all_diamsall_mwsall_rhosall_sulfactors	all_fracsall_numstrsr   r   r   r   r   r    r!   r"   r#   r$   r%   r&   pd	DataFramer'   r(   outfile)selfr*   r+   r,   kwargs r>   X/global/cfs/cdirs/e3sm/www/hass877/share/emis_processing/FlexEmis/src/surfEmis_driver.py__init__   s>   zgen_surf_emis.__init__c                 C   s2  | j d krt}dd}t||| _ t| j }dddd}| jd krN| jd ks.| j	d kr3t
d ntd| j td	| j	 | jd
 t| j	 }| | _| jd krq|d| j d d  | _| jg krpt
d| j d n5t|d j|d | jk t| jkr| j|d j|d | jk< nt }| j|d< | j|d< |ddg }| jd kr|d| j d d  | _n'zt| jt| jksJ d| j|d j|d | jk< W n	   | j|d< Y | jd kr|d| j d d  | _n(zt| jt| jksJ d| j|d j|d | jk< W n	   | j|d< Y | jd kr5|d| j d d  | _n(zt| jt| jksEJ d| j|d j|d | jk< W n	   | j|d< Y | jd krs|d| j d d  | _n(zt| jt| jksJ d| j|d j|d | jk< W n	   | j|d< Y | jd kr|d| j d d  | _n(zt| jt| jksJ d| j|d j|d | jk< W n	   | j|d< Y | jd kr|d| j d d  | _n(zt| jt| jksJ d| j|d j|d | jk< W n	   | j|d< Y | jd kr-|| jd d  gt| j | _tj|d< tj|d< tj|d < | jd krW| jgt| j | _| jgt| j | _ nt| jt| jksfJ d!t| jt| j ksuJ d"| j!d kr| j"gt| j | _!nt| jt| j!ksJ d#| j|d j|d | jk< | j |d j|d | jk< | j!|d  j|d | jk< | j#d kr|d| j d d$ $ d% | _#n(zt| jt| j#ksJ d&| j#|d$ j|d | jk< W n	   | j#|d$< Y td'| jd( t|d| j d j%d)d* td( d S )+N/)z..datazE3SM_emis_default_params.csvZSO2_em_anthroZBC_em_anthroZOC_em_anthro)soZbcZpoz=
Either variable name or species and mode has to be declared!z
Selected species: z
Selected mode: Z_az
species==''sectorz
Unknown sectors for: z(
Specify sector for non-default species.r   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!   Zstart_yrZend_yrZOrigFileNamez?List of starting years and sectors should have the same length!z=List of ending years and sectors should have the same length!z6List of files and sectors should have the same length!r   r   z8List of numfile and sectors should have the same length!z"
Selected parameters for species: 
T)drop)&r   __name__joinpkg_resourcesZresource_streamr9   Zread_csvr.   r   r   	Exceptionprintstrlowerr/   querytolistlenlocr:   r3   r4   r5   r6   r7   r8   r   npnanr0   r*   r+   r1   r2   r,   r   uniqueZreset_index)r<   Zresource_packageZresource_pathZdfZspecies_originnameZtmp_varr>   r>   r?   
get_params1   s   






&


 
      


$ zgen_surf_emis.get_paramsc                 C   s  t | t| j}t| j}| jdkrt d zt|t|t|| j| jd	 }W n   t|t|t|| j| jddd	 }Y t | t dt| t
|jtt|t|d}t d	 td
g}	|jddd}|jd|	fd}|j}
| jd krt d t
jdd |dd}|
|_t d 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gtj|d jtjddddfd}||fS |dk r+d|vr+t 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& }t d' zt|t|t|| j| jd	 }W n   t|t|t|| j| jddd	 }Y t | t dt| t
|jtt|t|d}z
|ddd(}W n   Y |j}
| jd krt d t
jdd |dd}|
|_t d t|d jdkrdgtj|d d d d)f jtjddddfdgtj|d d)d d f jtjddddfd*}||fS 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*}||fS )+NTz
Remapping from RLL to SE grid.)fileindoutr    r"   	longitudelatitude)rX   rY   rZ   r    r"   ZxdimZydimz
Remapped files are output to:)timez
Re-formatting data for E3SM.g     j@lev   )Zaxisr^   z
Getting monthly climotology.)Zuse_floxz
time.monthr]   z
Assigning coordinates.Zncollat)ZdtypeZdegrees_north)unitsZ	long_namelonZdegrees_eastZPaZ	dummy_dim)ra   rc   r^   i  Z	em_anthroz"
Using CMIP6 biomass burning data.g  G
_FillValueZmissing_valueZ_biomass_fixed_-.ncz
Using the RLL grid data.)r\   r[   r   )ra   rc   )rM   r   r   r   r&   r   rN   r    r"   Zgen_remapped_filesxrZopen_datasetselslicerT   arrayZexpand_dimsZassign_coordsattrsr#   Zset_optionsgroupbyrB   Zfloat32encodingload	to_netcdfrenamerR   shapeZfloat64)r<   r,   r*   r+   r.   Zin_dir_pathZout_dir_pathZfnamerB   r^   rk   coordsZpre_biomassr>   r>   r?   get_data   s   


&( 
""",$2 &( ..
""zgen_surf_emis.get_datac           '      C   s  d}|    tt| jt| j }tt| jdkr)| j| }| j| }n| j}| j	}|| d }| j
d krG| jd krGt| 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|||}| j|
|||d\}}|	d	krt|}| jd krt|jd
 |k rtd|	 | ddi}g d|d< tjt |d t |d dd}|j!}tj"|dg|gd}|j#|d}zI|| j#||	 dj$| | }|	t%|| j#ddj&|ddifi}|d | j'(dd )  d |	 t%|| j#ddj&|| | ddifi}W n@   |*d| j$| | }|	t%|| j&|ddifi}|d | j'(dd )  d |	 t%|| j&|| | ddifi}Y |+| |+| qsddt,- .d|j/d |j/d d} d | j'v r@| jd }| j| jd |||d\}}td!| j' d"  t0| j1}!| jd kr|ddi}|| j#|d# dj$| | }"|| j#|d$ dj$| | }#dg|ft%|| j#ddj&|"ddift%|| j#ddj&|#ddifd%}$tj2|$|d&}%d'|%j&v r"|%j3dd(4d'}%d)dhi|%_5|%6|!t | j'd* t | d+ t | d,   | j7rot8|| j| j9| j| j| j| j'| j| j	}&| j| j:d-< |&| j:d.< | j:| j:j;<| j | _:||| |fS )/NgWTDr_   dater]   z
====Processing z sector now.====
   )r*   r+   r.   ZBB   z0
Copying same year for the whole time period in month)r_   rF                     	   ru      rv   z-01-01z-12-31ZMS)Zfreq)dimsrr   )rw   )rE   r   rb   zmolecules/cm2/s_z(particles/cm2/s) * 6.022e26z<This data was produced using the E3SM emission pre-processorz&Taufiq Hassan (taufiq.hassan@pnnl.gov)z%Y-%m-%d %H:%M:%Sr    Znominal_resolution)ZcommentZcontactZcreation_dateZorigin_gridZorigin_nominal_resolutionrC   z
Producing the z: IND and ENE outputs to be used in the elevated emissions.INDENE)rt   r   r   )	data_varsrr   r^   r`   unlimited_dimsZ
_IND_emis_re   rf   r   Orig (Tg/yr))=rW   rT   Zargmaxrj   r1   r0   rR   setr*   r+   r$   r#   r   zipr/   r2   r4   r5   r3   r6   r8   r7   r   rM   r   rs   r   r]   copyrp   rg   Zcftime_rangerN   rw   Z	DataArrayrh   rB   listr   r.   splitupperZfillnaupdater   todaystrftimerk   r   r   DatasetZiselrH   rm   ro   r%   r	   r   r'   r   Zisin)'r<   ZavgodrY   r*   r+   ZyearsZdatesr   num_varssectr,   ser   r   r   r   Znum_strr   Zorig_varnameZfactorZ
num_factorrB   rr   Z
av_sectorsZdata_renamedZ
date_rangeZmonthsZselArrZemis_valZnew_varZnum_varrk   dir_pathZemis_indZemis_eneZdata_vars_indZds_indZ	orig_valsr>   r>   r?   get_vars   s   

 
 $PF


0(
zgen_surf_emis.get_varsc           	         s  |   \}}}}t| j}| jdkrztj|||d}| jd kr/|ddi}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r|ddi}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d | jrt|| jd | j| j| jd}|| jd< | jddg dd | jddg< t| j d S d S )NZso2)r   rr   rk   rw   r]   CLIMre   r   )rd   c                       i | ]}| qS r>   r>   .0varcompr>   r?   
<dictcomp>d      z+gen_surf_emis.prod_emis.<locals>.<dictcomp>c                    r   r>   r>   r   Zcoordr   r>   r?   r   e  r   r   NETCDF3_64BIT)rm   formatc                    r   r>   r>   r   r   r>   r?   r   q  r   c                    r   r>   r>   r   r   r>   r?   r   r  r   r   )r    zNew (Tg/yr)r   c                 S   s   t | S )N)r   )xr>   r>   r?   <lambda>x  s    z)gen_surf_emis.prod_emis.<locals>.<lambda>)r   r   r   r.   rg   r   r#   rp   rN   r$   r(   r*   r+   rm   dictr   r   rr   ro   r   r;   r%   r
   r4   r   r!   r'   ZapplymaprM   )	r<   r   r   rk   rr   r   ZdsZ	encodingsZnew_valsr>   r   r?   	prod_emisV  s:   



8

.
"zgen_surf_emis.prod_emisc                 C   s   t d | jd krt| jd | _nt| jd t| j | _t| j}t dt|d t|d | j d | 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   re   zFile source:rA   z_*_r   r   )r   )rM   r#   rN   r$   r(   r*   r+   r   r   r;   rg   Zopen_mfdatasetrn   ro   )r<   Znumvalr   rB   r>   r>   r?   combine_numvars{  s   

..2zgen_surf_emis.combine_numvarsN)	rI   
__module____qualname__r@   rW   rs   r   r   r   r>   r>   r>   r?   r      s    ! G[%r   )Zxarrayrg   ZnumpyrT   Zpandasr9   r   rK   warningsfilterwarningsZ	src.utilsr   r   r   r   r   Zsrc.checkersr	   r
   Zsrc.ggen.driver_modr   objectr   r>   r>   r>   r?   <module>   s    
