o
    Míhˆ  ã                   @   sx   d dl Z d dlZ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mZ d dlmZmZmZmZ G dd„ deƒZdS )é    N)ÚPath)Úproduct)Úgenerate_grids)Úget_dir_pathÚ
exec_shellÚcheckerÚ	get_sizesc                   @   s8   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zed	d
„ ƒZdS )Údriverc                 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¡| _t tt| jƒƒd ¡| _| j d¡ dS )a”  
        Initiates driver class.

        Parameters
        ----------
        **kwargs : Multiple arguments
            Output resolution
            Input resolution
            Input filenames
            Input grid filename
            Input directory
            Output directory
            Input mapping file
        Options:
            Add single dim
            Apply multiprocessing

        ÚresNÚiresÚfileÚinfileÚgridÚindÚ ÚoutÚmapfileZsdimÚmpÚxdimÚlonÚydimÚlatz	/log.ggenz
=== driver init done ===)ÚgetÚ_resÚ_iresÚ_fileZ_infileÚ_gridÚ_indirÚ_outdirÚ_mfÚ_sdimÚ_mpr   r   ÚloggingÚ	getLoggerÚstrr   ÚloggerÚinfo)ÚselfÚkwargs© r)   úX/global/cfs/cdirs/e3sm/www/hass877/share/emis_processing/FlexEmis/src/ggen/driver_mod.pyÚ__init__   s   zdriver.__init__c                 C   sú   t | j| j| j| jd}| j|_|j}t|ƒ}|  ¡ }t	| jƒ}|D ]R}g }t
||ƒD ]:\}}	| jdkrF|  | t|ƒt|	ƒ|¡}
|
    S | j d¡ tj| j| t|ƒt|	ƒ|gd}| ¡  | |¡ q+| jdkrt|D ]}| ¡  qmq"| j d¡ dS )z¡
        Generate remapped files.
        Has option to apply multiprocessing.
        
        Depends on gen_weights & apply_weights methods.
        
        ©r   r   r   r   Nz
Applied multiprocessing.)ÚtargetÚargsz 
=== gen_remapped_files done ===)r   r   r   r   r   r   r   r   Úgen_weightsr   r   r!   Úapply_weightsr$   r%   r&   r   ÚProcessÚstartÚappendÚjoin)r'   Ú	gen_gridsZ	file_listZlist_of_filelistZmap_listÚdir_pathÚfilelistÚ	processesr   r   ÚfnameÚpÚprocessr)   r)   r*   Úgen_remapped_files1   s*   


 

€zdriver.gen_remapped_filesc                 C   sÐ  g }| j dkrE| j d¡ tt| j ƒƒ ¡ s6t| jƒ}|| j  }tt|ƒƒ | j dt|ƒ ¡ | 	|¡ nªt| j ƒ}t|ƒ | 	|¡ n›|  
¡ \}}|D ]’}|D ]}| j d| ¡ | j d| ¡ t|ƒ d¡d  d¡d	 }t|ƒ d¡d  d¡d	 }	d
}
t| jƒ}|td| d |	 d ƒ }t|ƒ ¡ sÍtd|
› d|› d|› d|› ƒ}|d	krÁ| j d| d |	 d t|ƒ ¡ n| j d¡ | 	|¡ qQ| j dt|ƒ d ¡ | 	|¡ qQqM| j d¡ |S )z‹
        Generates weights/mapping files.

        Returns
        -------
        maps : List
            List of mapping files.

        Nz2
Specifying map file suppresses weight generation.zUsing weights from z
Input SCRIP:zOutput SCRIP:ú/éÿÿÿÿÚ_r   Z	fv2fv_flxÚmap_ú.nczncremap --alg_typ=z --src_grd=z --dst_grd=z --map=z
Generated map_z.nc mapping file in z,
ERROR: Weights were not generated properly!Ú
z already exists!
Using it.z
=== gen_weights done ===)r   r%   r&   r   r$   Úis_filer   r   r   r3   Ú
gen_scripsÚsplitr   r   )r'   Úmapsr6   r9   Úlist_inÚlist_outZin_scripZ	out_scripZinsZoutsÚalgoÚrcr)   r)   r*   r/   U   sB   





 &ïzdriver.gen_weightsc                 C   s¤   t | j| j| j| jd}| j|_| j|_| 	¡ }t
t |¡ ¡ ƒ}t | j| j| j| jd}| jdkr7| j|_n| j|_| ¡ }t
t |¡ ¡ ƒ}| j d¡ ||fS )zÖ
        Generates input and out SCRIP files.

        Returns
        -------
        list_in : List
            List of input SCRIP files.
        list_out : List
            List of Output SCRIP files.

        r,   Nz
=== gen_scrips done ===)r   r   r   r   r   r   r   r   r   Zget_inp_scripÚlistÚpdÚSeriesÚuniquer   r   r   r
   Zget_out_scripr%   r&   )r'   r5   rG   rH   r)   r)   r*   rD   ‡   s   

zdriver.gen_scripsc                 C   sr  |  d¡d   d¡d }|t|  d¡d   d¡d d | ƒ }| j d| d	 | ¡ t|ƒ ¡ sUtd
|› d|› d|› ƒ}|dkrN| j dt|ƒ ¡ n| j d¡ n| j dt|ƒ d ¡ | jdkr±| j d¡ t 	dg¡}t
 t|ƒ¡}|jddd}	|	jd|fd}
|
d jdd d¡|
d< |
d jdd d¡|
d< |
 ¡ jt|ƒ dd¡dd | j d¡ |S )a  
        Applies weights on the input files.

        Parameters
        ----------
        mapfile : NetCDF file
            Weights/Mapping files.
        file : NetCDF file
            Input files.
        dir_path : Directory
            Path to output directory.

        r=   r>   r@   é   rA   r   r?   z

Applying z on zncremap --map=ú z
Generated remapped file z*
ERROR: Remapped files were not generated!rB   z already exists.Nz
Adding a singleton dim: lev.g     jø@Úlev)Úaxis)rQ   Zlat_verticesZlon_verticesz_lev.ncÚNETCDF3_64BIT)Úformatz
=== apply_weights done ===)rE   r$   r%   r&   r   rC   r   r    ÚnpÚarrayÚxrÚopen_datasetÚexpand_dimsÚassign_coordsÚiselÚdropÚloadÚ	to_netcdfÚreplace)r'   r   r   r6   Zout_map_tagr9   rJ   rQ   ÚdataZdata1Zdata2r)   r)   r*   r0   ª   s(   (
zdriver.apply_weightsN)	Ú__name__Ú
__module__Ú__qualname__r+   r<   r/   rD   Ústaticmethodr0   r)   r)   r)   r*   r	      s    #$2#r	   )r"   Úmultiprocessingr   ÚpandasrL   ÚnumpyrU   ÚxarrayrW   Úpathlibr   Ú	itertoolsr   Zsrc.ggen.ggridsr   Zsrc.ggen.utilsr   r   r   r   Úobjectr	   r)   r)   r)   r*   Ú<module>   s    