U

�������g�>����������������������@���sd���d�dl�Zzd�dlZW�n �epek
r4���d�dlZY�nX�d�dlmZ�d�dlZ	d�dl
ZG�dd��d�ZdS�)�����N)�interpolatec�������������������@���s^���e�Zd�ZdZddd�Zdd��Zdddddd	d
ddgddd
dddfdd�Zdd��Zddd�ZdS�)�obc_variablezN A class describing an open boundary condition variable
    on an obc_segment Fc�����������������K���s��d|�_�||�_g�|�_|�j�d��|�j�|j��|dk	r^|�j�|��|���D�]\}}|�j�|��qH|�jdkr�dd|�j�d|�j�f|�_n4|�jdkr�dd	|�j�d
�|�j�d|�j�d|�j�f|�_d|�_	d|�_
d|�_d
|�_d|�_
d|�_||�_|r�t�|�j�|�_ntj|�jtjjd�|�_dS�)a��� constructor of obc_variable : import from segment and adds
        attributes specific to this variable

        *** args :

        * segment : existing obc_segment object

        * variable_name : name of the variable in output file

        *** kwargs (mandatory) :

        * geometry : shape of the output field (line, surface)

        * obctype : radiation, flather,...

        F�
variable_nameN�line�time�ny_�nx_�surface�nz_�_i��������i���g-C��6?g333333�?��
staggerloc)Zvectorr����items�append�__dict__�update�geometry�segment_name�dimensions_nameZxmsg�guess�gtypeZnscanZepsxZrelc�
use_locstream�ESMF�Field�locstream_target�field_target�grid_target�
StaggerLoc�CENTER)�self�segmentr���r����kwargs�key�value��r%����F/lfs/h1/ops/prod/packages/hafs.v2.0.7/ush/mom6_obc/lib_obc_variable.py�__init__���sF����

�

����zobc_variable.__init__c�����������������C���sB���|�j�dkr"t�|�j|�j|�jf�}n|�j�dkr>t�|�j|�jf�}|S�)Nr	���r���)r����np�empty�nz�ny�nx)r ����datar%���r%���r&����allocateM���s
����

zobc_variable.allocateNT�zr����lon�lat�bilinearc��������������	���C���s���|dk	r$|�j�|||
||||d�|�_n|�j�|||
||||d�|�_tj|||d�}|�jdkr�|dd�|�j|�j�|�j|�j�f�}t�	|||�j
|�j�\|�_|�_
|�_n.||�j|�j�|�j|�j�f�}d|�_d|�_
d|�_ztj||	|d�|�_W�n���td��Y�nX�|���}tj|�jtjjd�}|dk�r�|
d	k�rDtj||�jtjjtjjd
�}nN|
dk�rltj||�jtjjtjjd
�}n&|
dk�r�tj||�jtjjtjjd
�}n|}|��||||�j|�j |�j!�|�_"|�j�#���|�#���|S�)
a�� interpolate_from performs a serie of operation :
        * read input data
        * perform extrapolation over land if desired
            * read or create mask if extrapolation
        * call ESMF for regridding

        Optional arguments (=default) :

        * frame=None : time record from input data (e.g. 1,2,..,12) when input
                       file contains more than one record.
        * maskfile=None : to read mask from a file (else uses missing value
                                                    of variable)
        * maskvar=None : if maskfile is defined, we need to provide name of
                         mask array in maskfile
        * missing_value=None : when missing value attribute not defined in
                               input file, this allows to pass it
        * use_locstream=False : interpolate from ESMF grid to ESMF locstream
                                instead of ESMF grid, a bit faster.
                                use only to interpolate to boundary.
        * from_global=True : if input file is global leave to true. If input
                             is regional, set to False.
                             interpolating from a regional extraction can
                             significantly speed up processing.
        N)�x_coords�y_coords�autocrop�use_gridspec)�framer	������������r���z!input data time variable not readr
���r2���)�unmapped_action�
regrid_method�patchZconserve)$�create_source_grid�gridsrc�ncdf�
read_fieldr����jmin_src�jmax_src�imin_src�imax_src�read_vert_coordr,���r+����depthr*����dz�	read_time�timesrc�print�copyr���r���r���r����Regridr����UnmappedAction�IGNORE�RegridMethod�BILINEAR�PATCH�CONSERVE�perform_interpolationr���r���r-����destroy)r ����filename�variabler7���ZmaskfileZmaskvar�
missing_value�from_global�	depthname�timename�coord_namesr3���r4����method�interpolatorr5���r6���Zdatasrc�
dataextrap�	field_src�regridmer%���r%���r&����interpolate_fromU���s������
�	
�����


�

�

�
��
zobc_variable.interpolate_fromc�����������������C���s���|�j�dkr$|jd�d�d�d��df�}|�j�dkrH|jd�d�dd�d��f�}|�j�dkrl|jd�d�d�d��df�}|�j�dkr�|jd�d�dd�d��f�}|����}|�jdk�r�t�|�j�D��]2}	||	d�d��d�d��f����|jd�d��<�tj	|j|j|j
k<�|||�}|j���}
t�|
�}t�
|�d�}t�
t�|
��d�}
t�t|
��}tj	|d�d��<�t|
|��dk�rt�|�t�||��k�r�tj||�|
|�dd�}|||d�|d�d����||d�|d�d��<�||d��|d|d��<�||d��||d�d��<�n tj||�|
|�dd�}||�}nJt|
|��dk�r6|
|�|d�d��<�n&|�jd	k�rPd
|d�d��<�nd|d�d��<�|�r�|�jdk�r�|���||	d�d��df<�n"|�jdk�r�|���||	dd�d��f<�q�|���|�j|�jd��|�j|�jd��f�||	d�d��d�d��f<�q��n�|�jdk�r�|d�d��d�d��f����|jd�d��<�tj	|j|j|j
k<�|||�}|j���}
t�|
�}t�
|�d�}t�
t�|
��d�}
t�t|
��}tj	|d�d��<�t|
|��dk�rPt�|�t�||��k�r.tj||�|
|�dd�}|||d�|d�d����||d�|d�d��<�||d��|d|d��<�||d��||d�d��<�n tj||�|
|�dd�}||�}n0t|
|��dk�rt|
|�|d�d��<�nd|d�d��<�|�r�t�|���|�j|�jf�|d�d��d�d��f<�n8|���|�j|�jd��|�j|�jd��f�|d�d��d�d��f<�|S�)
Nr���r����������������r	����nearest)�kind�saltg������A@r8���r���)�orientation�coordsr.���r���r(����aranger*����	transposer-����nan�
fill_valuerJ����isfinite�where�isnanr)����len�minr����interp1dr���r,���r+����jmin�jmax�imin�imax�reshape)r ���r]���r_���r^���r���r���r���Zcoord_boundaryr-���ZkzZdata_with_gapsZnogapsZ
nogaps_posZoknansZdata_interp�interpr%���r%���r&���rR�������s�����



$


0
�� "


0


���z"obc_variable.perform_interpolationc�����������������C���s��|rzt�j|t�jj||dd�}d|�_|jd�d�jd�|�_d|�_|jd�d�jd�|�_	|rj|sjd|�_
d|�_nd|�_
d|�_�n�|d�k	r�|d�k	r�|}	|}
nHt�
||d��}t�
||d��}t|j�dkr�t�||�\}	}
n|}	|}
|�r:t�|�j|	|
�\|�_|�_|�_|�_	|	|�j|�j	�|�j|�j�f�}	|
|�j|�j	�|�j|�j�f�}
|	j\}
}|�sbd|�_||�_d|�_|
|�_	|�r�|�s�t�jt�||
g�dd�}d|�_
d|�_n t��t�||
g��}d|�_
d|�_|jt�jjgd��|	j|jt�jj�d�d�d��<�|
j|jt�jj�d�d�d��<�|S�)NT)rT����filetype�	is_sphererZ����add_corner_staggerr���r���ra���)�
num_peri_dimsr
���)r����Grid�
FileFormat�GRIDSPECrB���rh����shaperC���r@���rA���r���Zkewr>���r?���rp���r(����meshgrid�lc�find_subsetr����array�
add_coordsr���r����T)r ���rT���rW���rZ���r3���r4���r5���r6���r=����lon_src�lat_srcZlonsZlatsZny_srcZnx_srcr%���r%���r&���r<�����sl������
�����
�zobc_variable.create_source_grid)F)NNTF)	�__name__�
__module__�__qualname__�__doc__r'���r.���r`���rR���r<���r%���r%���r%���r&���r���
���s0���
<���������
eX�������r���)
�numpyr(����esmpyr����ImportError�ModuleNotFoundError�scipyr����
lib_ioncdfr>����
lib_commonr����r���r%���r%���r%���r&����<module>���s���