U �������g�>����������������������@���sd���d�dl�Zzd�dlZW�n �epek r4���d�dlZY�nX�d�dlmZ�d�dlZ d�dl ZG�dd��d�ZdS�)�����N)�interpolatec�������������������@���s^���e�Zd�ZdZddd�Zdd��Zdddddd d ddgddd 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&| dk�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��<�nd|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�|�jdk�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��<�nd|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|�_nd|�_ 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���