U ����� g�p���������������������@���s���d�Z�ddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl ZddlZddl ZddlZddlZddlZddlZddlZddlZddlmZ�ddl mZmZmZmZmZmZ�ddlmZmZm Z m!Z!�ddl"T�ddlm#Z#�ddl m$Z$m%Z%m&Z&m'Z'm(Z(�e)��Z*d d ��Z+e�ddd ddd�Z,dd��Z-dd��Z.dd��Z/dd��Z0G�dd��dej1j2�Z3G�dd��dej1j2�Z4G�dd��dej5j6�Z7G�dd��dej5j8�Z9G�dd��dej1j2�Z:dS�) zbThis module will one day contain the implementation of the HyCOM initialization and forecast jobs.�����N)�NamedDir)�make_symlink� isnonempty�remove_file�deliver_file�gribver�wait_for_files)�FileProduct� COMPLETED�RUNNING�FAILED)�*)�jlogger)�to_datetime�to_datetime_rel� TimeArray�to_fraction�to_timedeltac�����������������C���s���|�rdS�dS�)N�YES�NO��)�xr���r����7/lfs/h1/ops/prod/packages/hmon.v3.2.7/ush/hwrf/hycom.py�yesno���s����r���il����������c�����������������C���sr���t�|�t�rt|��}�t�|�t�r.tj|�d�d�}�n<t�|�t�rJtj|�d�d�}�n t�|�tj�rjtjt|�d��d�}�t|��S�)N����)�hours) � isinstance�str�float�int�datetime� timedelta� fractions�Fraction�hycom_epoch)�hycomr���r���r����date_hycom2normal���s���� r(���c�����������������C���s$���t�|�tj�st|��}�t|�t��d�S�)N�Q�)r���r"���r���r���r&���)Znormalr���r���r����date_normal2hycom&���s����r*���c�����������������C���s����|���|�}t|�}t��}|�j�|��dd��D�]\}}t|�||<�q,|�j�|��dd��D�]\}}t|�||<�qV|��dd�}|r�||d<�|j f�|�S�)zuGenerates a produtil.prog.Runner for running a Hycom ksh script. Adds a bunch of variables from config sections.ZstringsZhycomstringsZboolsZ hycombools�RTOFSDIR��) � confstrinterp�exe�dict�conf�items�confstrr���r����meta�env)�task�pathZthere�e�vars�k�vr+���r���r���r���� scriptexe+���s���� r;���c�������������� ���C���sD���d}t�|�d��,}|D�] }t�d|�}|r|���d�}qW�5�Q�R�X�|S�)Nr,����rt�^export RUNmodIDout=(.*)$r���)�open�re�match�groups)r6����RUNmodIDout�f�line�mr���r���r����read_RUNmodIDout:���s����rF���c�����������������������s2��e�Zd�Zdd��ZdE��fdd� Zdd��Zd d ��Zdd��Zd d��Zdd��Z dd��Z dd��Zdd��Zdd��Z dd��Zedd���Zedd���Zdd ��Zd!d"��Zd#d$��Zd%d&��Zd'd(��Zd)d*��Zd+d,��Zd-d.��Zd/d0��Zd1d2��Zefd3d4�Zd5d6��Zd7d8��Zd9d:��Z d;d<��Z!ed=d>���Z"ed?d@���Z#dAdB��Z$dCdD��Z%���Z&S�)F� HYCOMInit1c�������������������C���s���t�����d�S��N��selfZuncoupler���r���r���r����remove_oceanD��������zHYCOMInit1.remove_oceanN�~���c��������������������s����t�t|��j|||fd|i|���d�|�_d|�_||�_|�����|��dd�|�_d�|�_ d�|�_ d�|�_d�|�_d�|�_ d�|�_d�|�_d�|�_d�|�_d�S�)N�tasknameT� spinlengthr���)�superrG����__init__�forecast_exe�run_coupled�fcstlen� make_products�confintrO����ic�jc�idm�jdm�ijgrid�Application�_HYCOMInit1__rtofs_inputs�_HYCOMInit1__rtofs_inputs_ymd�_HYCOMInit1__blkdat�rJ����dstorer0����sectionrN���rT����kwargs�� __class__r���r���rQ���F���s&������zHYCOMInit1.__init__c����������� ���������s���|�����}t|�jd|�j|��d�d�|�_d}|rRttt|�j d����}|ddd��}ntttd ���}t |�jj�����fd d�|D��}t ��|d�d �|�_t ��|d�d �|�_|D�]p}|��d|���}|�jd|d�}|��d|���}|�jd|d�} t|�j||�j|d�|�j|<�t|�j||�j| d�|�j|<�q�t��|�_dD�]4} dD�](}|d�| �}t|�j||�j�|�j|<��q.�q&t|�jd|�j�|�_t|�jd|�j�|�_t|�jd|�j|��d�d�|�_dS�)�NInitializes all Product objects to make them available to future jobs.�hycom_settings�!{com}/{out_prefix}.hycom_settings��locationFg�K7�A�9@r���N����gj�t��?c��������������������s���g�|�]}t�|d������qS�)���)r���)�.0�t��atimer���r���� <listcomp>m���s�����z,HYCOMInit1.make_products.<locals>.<listcomp>�����g������@�hmon_basin.{fahr:03d}.a�{com}/{out_prefix}.{pn}�Zpn�hmon_basin.{fahr:03d}.b�ab)�restart_outZrestart_outR�.�spin_archv_a�spin_archv_b�blkdat.input�*{com}/{out_prefix}.standalone.blkdat.input)�logr ���ra���rN���r-���rg����list�ranger!���rT���r���r0����cycler����init_file2a�init_file2b�timestrr/���rx���rz���r{����blkdat_input) rJ����loggerZbcflagZfhrsZftimes�ftime� prodnameA� filepathA� prodnameB� filepathBrw����what�localr���ro���r���rU���Y���s\��������������� ���zHYCOMInit1.make_productsc�����������������C���s���|dk�rdS�|dk�rdS�dS�)N����r������������r���)rJ���Zcychourr���r���r����last_lead_time_today����s ������zHYCOMInit1.last_lead_time_todayc�����������������C���s���|��|�j|d|�j�g��dS��z�Fills the ocean status files with information. This is called from exhwrf_ocean_init after a successful call to the run() function below. The ocstatus argument is the hwrf.coupling.OceanStatus object that fills the files.zforecast_exe=%sN��setrS���rR����rJ����ocstatusr����r���r���r���� fill_ocstatus����s����zHYCOMInit1.fill_ocstatusc����������� ������C���s����|����D�]}�qq|�|�}|D�]�}t�d|�}|sH|�d||f���q |���\}}|���}|���}|dkr�|dkr|d|�_q�|dkr�d|�_q�|�d|t|�f���q |d kr�||�_ q |�d ||f���q dS��z�Reads the ocean status back in during the forecast and check_init jobs, filling the self.run_coupled, self.forecast_exe variables.z^ *([^ =]+) *= *(.*?) *$z!%s: unparseable ocstatus line: %sZRUN_COUPLEDr���Tr���Fz.%s: ignoring unrecognized RUN_COUPLED value %srR���z%s: ignoring unknown key %sN� Zfileiter�readr?���r@����warningrA����striprS����reprrR���� rJ���r����r�����filename�linesrD���rE����key�valuer���r���r����recall_ocstatus����s2���� ����� �zHYCOMInit1.recall_ocstatusc�����������(������C���s>��|�����}|�jj}t�|j|j|jd�}|�d�}|�j}|� dt |����|��d�}|��d�}|��d�}|� dt |����|�jj}t�|j|j|jddd�} td|�} td |�}t d �}t d�} t d�}t |jd ��}|� dt | ����td| �}|j|||dd�}|� dt |����tj�|�}d}t|��r2d}d}|�s|j||| | t�dd�}|j||| | t�dd�}|� dt |����d}t|��s|j||| | t�dd�}|� dt |����d}t|��s|j||||t�dd�}|� dt |����d}t|��sd}d|�}|�|��tj�|��|� dt |�|f���|j||| dd�}|j||| dd�}tj�|�}tj�|�}|��dd�}|�s�tj�|�j|�d��}tj�|�j|�j�}t|d|dd ���x}|��d!�} d"}!| �d�}"t | d#��@}#t |!d$��*}$|$�!|j"|#|| |"|||dddd%� ��W�5�Q�R�X�W�5�Q�R�X�t#t$t%|��&d&��dd'�|d(��t�'d"d)��|dk�r0d}%|jd*�}&d}'|�s�|dk�r�d}%d}'t(dk�r�d+}%d,|j�}'|� d-t |�|&|'|%f���t | d#��@}#t |!d$��*}$|$�!|j"|#|| |||||&|'|%d.� ��W�5�Q�R�X�W�5�Q�R�X�t#t$t%|��&d&��dd'�|d(��t�'d"d/��W�5�Q�R�X�d0S�)1z.!Fills the RTOFS staging area with RTOFS data.r���z%Y%m%dzFRD: inputs=%s� ocean_dataset� ocean_now� ocean_fcstzFRD: oceands=%s逮��i�]���`T��i ���r)���rl���zFRD: oceanatime=%s�a)rp���rw���zFRD0: trying zero zeroloc=%s rr���T)rp���r����rw���zFRD1: trying zero fcst1loc=%s zFRD1: trying one fcst1loc=%s ����zFRD1: trying two fcst1loc=%s ����z,Could not find rtofs data (fcst1), file: %s zFRD1: zeroloc=%s zerostat=%d �RTOFS_STAGEr,���zrtofs.%Y%m%dF��keepr�����rm_firstz!{PARMhycom}/hmon_get_rtofs.nml.inz get_rtofs.nmlr<����wt)ZYMD�INDIR1�INDIR2�INDIR3�STARTHR�ENDHR�LAST_LEAD_TIME_TODAYZhmon_get_rtofs)Zallranks�r����zget_rtofs.nml.restartr���r����rM���z6FRDa: dir0=%s starthr=%d endhr=%d lastleadtimetoday=%d)rp���r����r����r����r����r����r����zget_rtofs.nml.0N))r~���r0���r����r"����year�month�day�strftime�rtofs_inputs�infor����r2���r���r����hour�locate�osr6����dirnamer���Zhr96�error�hwrf� exceptions�NoOceanData�join�workdirZnamelistZNamelistInserterrb���r���r-���r>����write�parse�checkrun�mpirun�mpi�getexe�renameZ fcst2stat)(rJ���r�����cycZrtofs_atimeZ rtofs_ymd�inputs�oceandsr����r����� oceanatime�prior24Zprior48Zhr6Zhr18Zhr24ZcyctimeZ oceanncsttimeZzerolocZzerodirZzerostatZnoBCZfcst1locZ fcst1loc0Z fcst1stat�msgZloc0Zloc1Zdir0Zdir1�outdirZni�dZparminZparmoutZprior24_ymd�inf�outfZlastleadtimetodayZstarthrZendhrr���r���r����find_rtofs_data����s����� �����, ����zHYCOMInit1.find_rtofs_datac�������������� ���C���s����|�j�j}d}|��dd�}|��dd�}|��dd�}|�j�j}|�j}t|d�|�} |��|| |d�|||d|��|�d��t�d d ��t d d��(} | � dtt|��tt| ��f���W�5�Q�R�X�d�S�) Nr����adjust_river�adjust_temp�forecast_forcing_intervalrk���rl����fcstz move limits to limits.standalone�limitszlimits.standaloner����� %f %f false false ) r0���r����rV���rT���r����rtofs_get_forcingr����r����r����r>���r����r ���r*����rJ���r����r�����adjust_windr����r�����intervalZ startdaterT����enddate�limitfr���r���r����make_forecast_forcing���s*�������� �z HYCOMInit1.make_forecast_forcingc�������������� ���C���sL��|�����}d|�_d|�_�z�t|�_td|�j��t|�j|�j�|dd����}|�� |��|�j jdd��|�����|�� |��|�j}|�jd|d �|�_ttt|�j�d ��|�����d��t|�jj�}td|�}|��d ||�}|�jd|d�}|��d||�}|�jd|d�} t||d|d��t|| d|d��|�j���D�]B\} }| �d�\}} |�jd|�d�| |d�}|j|| d|d���q|�jj�d�}dD�].} |�jd| |d�}|�jj|| �|d|d���qp|�jjdd��|��d�}t|d��}|� d��W�5�Q�R�X�d|�_W�5�Q�R�X�t!|�_W�nV�t"k �r4�}�z$|j#dt$|�f�dd ��t%|�_��W�5�d}~X�Y�n���t%|�_��Y�nX�dS�)!�iRuns the hycom initialization. Raises an exception if something goes wrong. Returns on success.NFzself.workdirTr����z./hycom_settings��frominfoz{forecast_exe}�rB����Z���r����r���rs���rt���ru���rv����r����r����ry����{�})rw���rB���)rj���r����r����r����zarchv.%Y_%j_%H.rw���z{spin_archv})r����rj���r����r����z./blkdat.inputz6{com}/{vit[stnum]:02d}{vit[basin1lc]}.hycom1_init.doner����z hycom1 init done for this cycle �%Unhandled exception in ocean init: %s��exc_info)&r~���rR���rS���r����state�printr����r����scrub� select_domainrg����deliverr�����create_bc_icrB����icstrr����r����r����r���r0���r����r���r����r���rx���r1����splitr����rz���r����r>���r����r ���� Exceptionr����r���r���)rJ���r����r����rB���rp���r����r����r����r����r�����prodname�prodr����rw����locZnotab�donerC���r7���r���r���r����run���sz������ � �� ��� ��zHYCOMInit1.runc�����������������c���s���|���d�}|���d�}|���d�}|���d�}|���d�}|���d�}|���d�}|���d�}|���d �} |���d �} |���d�}|��dd �}|����} |�jj}d}tt�t|�j �d��d��}|��dd�}|dks�t �t|�d�dd�D�]�}|d�d�d�}t|d�|�}t|d�|�}||k�st �t ||||d�V��t ||||d�V��| �d||�d�|�d�f���~~~q�~|dk�snt �t|�||d��|�D�]�}t|d�|�}|dk�r�|d�d�d�}t|d�|�}| �d|||�d�f���n|}| �d||�d�f���t ||||d�V��t ||||d�V��| �d|||�d�|�d�f����q�~~~~t�|j|j|j�}td|�}|��|j�}td �}| �d!t|�t|�t|�t|�t|�t|�f���t || ||d"d#�V��t || ||d$d#�V��t||d�d�D��]�}t|d�|�}||k�r|}n|}||�}ttt|d%d&���}| �d't|�t|�t|�t|�tt|d%d&��ttt|d%d&���t|�f���|dk��r�| �d(t|�t|�t|�t|�f���t ||||d"d#�V��t ||||d$d#�V���q�n�|dk�rV| �d)t|�t|�t|�t|�f���t || ||d"d#�V��t || ||d$d#�V��t || ||d"d#�V��t || ||d$d#�V���q�|}|d*k�rt|jdk��rt|}|d*k��r�|jd+k��r�|}| �d,t|�t|�t|�t|�f���t ||||d"d#�V��t ||||d$d#�V���q�d-S��.z%!Iterates over all needed input data.�atmos1_dataset�atmos2_dataset�atmos1_flux�atmos1_grid�atmos2_flux�atmos2_gridr����� ocean_pastr����� ocean_rstr����rO���r���i����rk���r����Zgdas1r����r�����������@rl���)�dataset�itemrp���r����zEhycom inputiter, request flux and master from %s at atime=%s ftime=%s�%Y%m%d%H�gfsr����r���z"negative h=%d with ahr=%d atime=%szpositive h=%d atime=%szJhycom inputiter, request flux and master from %s at h=%d atime=%s ftime=%sr����i���ziIn hycom inputiter, todayatime=%s prioratime=%s epsilon=%s hwrf_start=%s hwrf_finish=%s last_fhr_today=%sr����)r ��r��rp���r����rw����bT��negokzTfhr=%s ftime=%s oceanatime=%s oceanftime=%s oceanfhr: to_fraction=%s round=%s int=%sz7For fhr=%s oceanfhr=%s use ocean_past atime=%s ftime=%sz6For fhr=%s oceanfhr=%s use ocean_now atime=%s ftime=%s�`���r���z7For fhr=%s oceanfhr=%s use ocean_fcst atime=%s ftime=%sN�r2���rV���r~���r0���r����r!����math�ceilr ���rT����AssertionErrorr����r���r/���r����r����r"���r����r����r����r����r����r���r�����round�rJ���Zatmos1dsZatmos2dsr��r��r��r��r����r��r����r��r����rO���r����Z hwrfatimeZ hwrf_startZhwrf_finishZfcstint�hZahrrp���r����Z todayatimeZ prioratimeZlast_fhr_today�epsilon�fhrr����Z oceanftimeZoceanfhrZchosen_atimer���r���r���� inputiter���sZ��� ���� ��� �������� ��� ������������ ���� ���������� ���������������� ����������zHYCOMInit1.inputiterc�����������������C���s����|�j�j}td|�j�j�}|�j}|�jd�}|d�d�}t|d�|�j�j�}d}d} d} d}| dkrl|dkrld}d} |�d��|��|��|�d ��|��|��d�S�) Ni����rl���i��r���Fr����TzCreate subdomain from RTOFS.zSpin up analysis.)r0���r����r���rO���rT���r�����rtofs_subset_bdry_init� rtofs_spin)rJ���r����Z thiscycleZ prevcycleZspinlenZfsecsrT����endZocean_statusZboundary_conditions_from_rtofsZsame_domainZforce_coldstartZspinZcreate_subdomainr���r���r���r�������s"���� zHYCOMInit1.create_bc_icc�����������$��� ���C���s���|�j�dddd�}dtt|���d�d�d�}|�jj}|dk}d�}|d krNd }n�|dkr\d}n�|rv|d krv|dkrvd}nn|r�|dkr�d}n\|r�|dkr�|dkr�d}nB|dkr�d}n4|dkr�d}n&d|t|�f�}t�|��tj � |��d|�_|�j}|��d�}d} t |d���} | D�]v}|���}t|�dk��rB|�d||���f����q|\ } }}}}}}}}| |k�r||�jk�rd} ||�_||�_d} �qW�5�Q�R�X�~~ | �s�d|t|�t|�j�f�}|�|��tj �|��|��d �}d} t |d���}|D�]�}|���}t|�d!k��r|�d||���f����q�|\}}}}}}}}} }!}"t|�}t|�}t|�}t|�}t| �} t|!�}!t|"�}"||�jk�r�|�|�d"k�r�d} ||||f\|�_|�_|�_|�_|| |!|"f\|�_|�_|�_|�_||�|�_|�_ �q�W�5�Q�R�X�| �sd#|t|�j�t|�f�}|�|��tj �|��|�j!d$k�s$t"�|�j#�$|�j!d%|�j��|�j#�$|�j!d&|�j��|�j#�$|�j!d'|�j ��|�j#�$|�j!d(|�j��t d)d*��}#|#�%d+j&f�|�j'���W�5�Q�R�X�|�d,||||| |!|"f���t�d-|�j|�j|�j|�j f���d�S�).N�domlon�cenlo�config�rb���rl��������h����AL�EP�CP�WP�IOr&���hat10_basinr(���hcp70_basin�L��������hep20_basin�d����hwp30_basin�hin40_basin��SL�LS�hsn50_basin��SHZSPZSI�hsp60_basin�=No ocean basin available for basin=%s lat=%s. Run uncoupled.� rtofs_glo�({PARMhycom}/hmon_rtofs.application_tableFr<���� ����%s: ignore line %sT�/%s: could not find Application=%s RUNmodIDin=%s�!{PARMhycom}/hmon_rtofs.grid_table����r����(%s: could not find grid=%s RUNmodIDin=%s� hycominit1� RUNmodIDin�gridlabelin�gridlabeloutrB���rg���r�������export idm={idm} export jdm={jdm} export kdm={kdm} export kkdm={kkdm} export ic={ic} export jc={jc} export ijgrid={ijgrid} export gridlabelout={gridlabelout} export gridlabelin={gridlabelin} export RUNmodIDout={RUNmodIDout} export RUNmodIDin={RUNmodIDin} export gridno={gridno} �<HYCOM grid: i,j,kdm=%d,%d,%d ic,jc=%d,%d ijgrid=%d gridno=%d� HYCOM domain: in=%s.%s out=%s.%s�(� conffloatr!���r��� storminfo� pubbasin2r����r���r����r����r�����NoOceanBasinrD��r-���r>���r�����lenr����r����rB����grididr�����InvalidOceanInitMethod�findrY���rZ����kdmZkkdmrW���rX���r[����gridnorE��rF��rb���r��r0���r����r�����format�__dict__�$rJ���r����Z atmos_lon�basinZnhbasinr\���r����rD��Zaptable�foundZapfilerD����fieldsZapZinmodZoutmodrP���procZnp1Znp2Zmp1Zmp2Z gridtableZgridfileZingrididrE��rF��Zgrid_sourcerY���rZ���rS��rW���rX���r[���rT��rC���r���r���r���r�������s������� ��� � ������ � ����� � ����������zHYCOMInit1.select_domainc�����������������C���s8���|�j�d�kr2|��dd�}tj�|�j||�jj�}||�_�|�j�S��NZcatalogZhwrfdata)r]���r2���r�����input�DataCatalogr0���r�����rJ���Zhdr����r���r���r���r������s ���� zHYCOMInit1.rtofs_inputsc�����������������C���s8���|�j�d�kr2|��dd�}tj�|�j||�jj�}||�_�|�j�S�r\��)r^���r2���r����r]��r^��r0���r����r_��r���r���r����rtofs_inputs_ymd%��s ���� zHYCOMInit1.rtofs_inputs_ymdc�������������� ������sZ��|�j�}���dt|������fdd�}t|�j�dkrFtt|��d���}nFt|�j�dkrhtt|��d���}n$dtt�f�}���|��t j �|��|�j}|�j }|�j}|�j} |��d ||f�d ��|��d||f�d��|��d || f�d��|��d|| f�d��|�jj} tt|�j�dd��}���dd�dd��|D������t��}|��dd�} d}d}|D�]�}|d7�}t|d�| �}|�d�}d| ||f�}d| ||f�}||d|���||d|���d |�}d!|�}t|d"��@}|�d#||d$�|�jt|�j�t|�j�t|�j�t|�j �f���W�5�Q�R�X�|�!||k�|k���qL���d%t|����|d&�}���d't|����t"|��d(��d�S�))NzRI: inputsymd=%sc��������������������s���t�jj|�|d��d��d�S�)NT��forcer����)�produtil�fileopr���)�ffrom�ftor����r���r����linkf0��s����z0HYCOMInit1.rtofs_subset_bdry_init.<locals>.linkfr����Zhmon_rtofs_subregionr����Zhmon_isubregion2avgzInvalid ijgrid value %sz{FIXhycom}/%s.%s.regional.grid� regional.gridz{FIXhycom}/%s.%s.regional.depth�regional.depthz#{FIXhycom}/hmon_%s.%s.regional.gridzregional.subgridz${FIXhycom}/hmon_%s.%s.regional.depthzregional.subdepthr����zGet inputs for hours: z, c�����������������S���s���g�|�]}t�|��qS�r����r���)rm���r��r���r���r���rq���M��s�����z5HYCOMInit1.rtofs_subset_bdry_init.<locals>.<listcomp>r����r,���rr���r:���g����� �@� %Y%m%d_%H%M%Sz%s/rtofs_%s_arch%s.az%s/rtofs_%s_arch%s.bz archv_in.%d.az archv_in.%d.bzsubregion.%d.inzsubregion.%d.outr����a���archv_in.%d.b hmon_basin.%03d.b subregion %s %d 'idm ' = longitudinal array size %d 'jdm ' = latitudinal array size %d 'irefi ' = 1st index origin of subgrid or 0 if NOT aligned %d 'jrefi ' = 2nd index origin of subgrid 1 'irefo ' = longitude output reference location 1 'jrefo ' = latitude output reference location 0 'iceflg' = ice in output archive flag (0=none,1=energy loan model) rk���zcommands %s r���z bigcmd %s r����)#r`��r����r����r!���r[����alias�batchexer�����criticalr����r����rQ��rD��rB���rE��rF���linkabr0���r����r���r����rO���r����r2���r���r����r>���r����r\���rY���rZ���rW���rX����appendr����)rJ���r����r����rg���cmdr����rD��rB���rE��rF��r����Zhrrange�commandsr����ZicountZatypeZihr�now�filestringtimeZarchvaZarchvbZsubregion_inZ subregion_outrC���Zbigcmdr���r����r���r��-��sv���� ���� ������ z!HYCOMInit1.rtofs_subset_bdry_initc�����������/��� ���C���sl��|�j�j}|�jdddd�}t|�d�|�}t|�j�d�|�}tdd��(}|�dtt|��tt|��f���W�5�Q�R�X�d }|�j d ||�j d�}|d�} |d �} t| �r�t| �r�t| d|d��t| d|d���n�|�� d�}|r�d|f�}t�|��nd|f�}t�|��|��dd�} t�|j|j|jddd�}td|�}|�d�}d| |f�}d| |f�}|j�|�dt|�t|�t|�f���|d�k�r�d}t�|��t�s�|�s�tj�|��|��||dd|��tdd��.}|����|������}t|d ��}t|�}W�5�Q�R�X�|�d!t|�t|�t||��tt ||�d"d#��tt!t ||�d"d#���t|�f���t!t ||�d"d#��|k��r||�d$��|��"d%d&��n4|�d'|�d(�|�d(�f���|��#|��|��"d)d&��|��$d&d*��d+d+gd,d,gd,d-gd.d.gg}|D�]\}}|��$d/|�|���q�|��%d0d�}d}|��%d1d�}|��%d2d�}d3}|��&||d|||d3|��|��%d4d5�}t'|�� d6�d7|d"d8��t'|�� d9�d:|d"d8��t'|�� d;�d<|d"d8��t(j)j*d=|d"d>��}W�5�Q�R�X�t(j)j*d?|d"d>��} W�5�Q�R�X�t+�+d@�D��]�}!t|!d���}t,dA�D�]}"|���}#�q�|#���}$t|$dB��}%|%dCk��r:dD|!|#f�}|�|��tj�-|��t|%�}&|!d�dE��d�}'|!}(|&�dF�})|&�dG�}*|&�dH�}+|&�dI�},tdJ|'�|)|d��tdJ|(�|*|d��tdJ|)�|+|d��tdJ|)�|,|d��W�5�Q�R�X��q�|��.d.dK��dLD�]}|��$d/|�|���q�|��/dM�}-|��0|-�}.t'|.dNd"|dO��t'|.dPd"|dO��t'|.|-d"|dO��t1j2�3dQ��rZ|��"dRdS��t4dTd"|dU��d�S�)VN�cycling_intervalr ��r!��r"��rl���r����r����r��������zM{oldcom}/{old_out_prefix_nodate}.{aYMDH}.{RUNmodIDout}.warmstart_spin_restart)rp���rB����.a�.bzrestart_in.ar����zrestart_in.bZexpect_cold_startzC%s.[ab]: missing or empty (no prior cycle). Will cold start ocean.z2%s.[ab]: missing or empty. Will cold start ocean.r����r,���r���r����rk��z%s/rtofs_%s_restart.az%s/rtofs_%s_restart.bz,prior24=%s filestringtime=%s restart_in_a=%sz(No rtofs restart file found. Giving up.z restart_pre.a� restart_pre.br<�������zjSOME STRING FOR WHICH TO GREP - ryd=%s spinstart=%s ryd-spinstart=%s to_fraction(...)=%s abs=%s epsilon=%sTr��z?Restart is at right time. Move restart_pre to restart_forspin.�restart_pre�restart_forspinzERestart is at wrong time (%s instead of %s). Will use archv2restart.r��rx���� restart_inrh��ri��z regional.maskz relax.rmuz-{FIXhycom}/hmon_{RUNmodIDout}.{gridlabelout}.Zparameterized_windsr����r�����analZhycom_procsZ90zJ{PARMhycom}/hmon_{RUNmodIDout}.{gridlabelout}.fcst.blkdat.input.standaloner|���)r����r����z9{PARMhycom}/hmon_{RUNmodIDout}.{gridlabelout}.ports.input�ports.inputzG{PARMhycom}/hmon_{RUNmodIDout}.{gridlabelout}.patch.input.{hycom_procs}�patch.input�nest�r����r�����incupzhmon_basin.*.brA��rk���� ���zX%s: hycom date before Jan 10, 1901. Probable parser error or corrupted data. Line = %s�����znest/archv.%Y_%j_%H.aznest/archv.%Y_%j_%H.bzincup/incupd.%Y_%j_%H.azincup/incupd.%Y_%j_%H.bz../znest/rmu)zforcing.chlzforcing.offlux�forcing.riversz relax.sshZveldf2Zveldf4Ztbaricz iso.sigma�hmon_{RUNmodIDout}_forecastZocean_executabler����zforecast.exezforcing.surtem.azforcing.surtemzforcing.surtmp�ok�r����r����)5r0���r����rK��r���rO���r>���r����r ���r*���r����rB���r���r���Zconfboolr���r����r����r2���r"���r����r����r����r����r����Zallow_fallbacksr����r�����OceanRestartMissing�restart2restart�readliner����r(���r����abs�moveab� archv2restartro��rV���r����r���rc���cdr����globr�����OceanDataInvalid�copyabr����r����r����r6����existsr���)/rJ���r����r����ru��Z prior_cyc� spinstartr����r��Zrestart_for_spinZ restart_aZ restart_bZexpectr����r����rs��r����rt��Zrestart_in_aZrestart_in_bZbf�splatZrydfZrydZlinkmeZlfromZltor����r����r�����modeZprocsZd1Zd2Z basinfile�iZblineZbsplitZ hycomdateZ normaldate�afile�bfileZ nestafileZ nestbfileZ incupafileZ incupbfile� exec_nameZthe_execr���r���r���r�����s����� ��� �� ����� ��� �� �� � � zHYCOMInit1.rtofs_spinc�����������������C���s*��|�����}td�}td�}|�jj}|} |�j} tddd�D�]�}|| |�kr�| j||| |d�}| j||| |d�} t|�r�t| �r�|�dt |�t |�t |�t |�t |�t | �f���|| f��S�|� d|| f���n |� d t |�t | �t |�f���| |�} q6d ||||�d�f�}|������|��t j�|��d�S��Nr����rv��r��������rr����rp���r����z%s %s %s %s => %s %sz%s %s: do not exist or empty� %s<=%s+%sz Cannot find %s %s+%s for time %sr���r~���r���r0���r����r����r����r����r���r����r����r����r����r����r����r����r�����rJ����atmosdsZflux�grid�timer�����sixhrsr���atime0rp����rinput�itryZfloc�glocr����r���r���r����getges��s>��������� ����zHYCOMInit1.getgesc�������������� ���C���s8��|�����}td�}td�}|�jj}|}|�j} d} d}tddd�D�]�}|||�kr�| j||||d�} |�dt|�t| �f���| dkr�| j||||d�}d} t | �r�|�d t|�t|�t|�t| �f���| ��S�|� d | ���n |� dt|�t|�t|�f���||�}q>d|�d �|f�}|������|��t j�|��d�S�)Nr����rv��r���r���rr���r����Looking for: %s - %sr�����%s %s %s => %s�%s : do not exist or emptyr����1Cannot find file for time %s; first file tried %sr��)r~���r���r0���r����r����r����r����r����r����r���r����r����r����r����r����r����)rJ���r���r���r���r����r���r��r���rp���r����glocset�gloc0r���r���r����r���r���r����getges1��s:������� zHYCOMInit1.getges1c�����������5������C���sj��|dkr,d}|���d�}|���d�}|���d�}n.d}|���d�}|���d�}|���d�}t�d d ��|�jj} t|d��} td�}t||��d|��d�}d tt|���g} || �}|| �}||�}t t |��d���}t t |��d���}t t |��d���}t t |��d���}t t |��d���}t t |��d���}t t |��d���}t t |��d���}t t |��d���}|dk�rjd}nd}dddd�dddd�dddd�d ddd�d!ddd�d"d#dd�d$d#dd�d%d|d�d&d|d�d'd|d�d(d|d�d)d|d�d*d|d�dddd�d+ddd�d,ddd�g}|}|�j}||k��r.|�� ||||�\}}|�d-�d.�} |�d-�d/�}!t| d0|d1��t|!d0|d1��t|�d2k�r�t|!d3�d0|d1��t|d4d5||!d3�f�|d6��nt||!d3�|d0d7��t||!d3��|d6�}"d8}#|D�]x}$|"���D�]h}%|%�|$d9��d:k�r�|%�|$d;��d:k�r�|%�|$d<��d:k�r�|#|%d=�7�}#|�d>|!d3�|%���f����q�q�|�d?|#���t||!d3�d@dA|!dB�f�|#>�|d6��t|!dB�|!d0|dC��|�dD��t|�}&|&dEk�r�|�dF��t||�|d6�}'d8}#|'���D�]4}%|%�dG�d:k�r�|�dH|%������|#|%d=�7�}#�q�|#�s>dI|f�}(|�|(��tj�|(��|�dJ|#���t||d@dA| f�|#>�|d6��t|| | dK�f�|d6��n�|&d2k�rJt||�|d6�}'d8}#|'���D�]4}%|%�dG�d:k�r�|�dH|%������|#|%d=�7�}#�q�|#�sdI|f�}(|�|(��tj�|(��|�dJ|#���t||d@dAdL| f�|#>�|d6��t|| | dK�f�|d6��n dM|f�}(|�|(��tj�|(��t|!|!dN�d0|dC��t||!�|d6�})|�dO|)���t|dP|)�dQdR| | dK�|!f�|d6��t||!|!dK�f���t||!dS�d0|dC��t||!dS�|!dT�f���| �dU|�d-�|!dS�| ||f���|| 7�}�qtd dV��}*|*�d8� | ���W�5�Q�R�X�tdWdV��}+|+�dX||f���W�5�Q�R�X�|dk�rvt�dYdZ��t�d[d\��t�d]d^��t�d_d`��t�dadb��t�dcdd��t�dedf��t�dgdh��t�didj��t�dkdl��t�dmdn��t�dodp��t�dqdr��t�dsdt��t�dudv��t�dwdx��t�dydz��t�d{d|��t�d}d~��t�dd���td�dV��},|,�d���W�5�Q�R�X�|��d��}-t!��}.t"d2d��D�]N}/d�|/�}0d�|/�}1t|0dV��}2|2�d�|/���W�5�Q�R�X�|.�d�|-|0|1f����q�|�d�t#|.����td�dV��}3|3�d8� |.���W�5�Q�R�X�ttj$d���}4t�%d�t&|4��d����|��'|��d�S���Nr~��rk���r��r��r��r��r��r���listflx.dat�listflx.dat.standalonerl���rv���%d �cnvgrib�copygb�copygb2�wgrib2�wgrib�grbindex� grb2indexZhmon_getkpdsZhmon_getgds2� hour fcst�ave�UFLX�surface��FLUX�LEVEL�TYPE�VFLX�TMP�2 m above groundr�����SPFH�PRATE�UGRD�10 m above ground�VGRD�SHTFL�LHTFL�DLWRF�ULWRF�DSWRF�USWRF�PRES�LANDr��z.pgbges�.sfcflxTr���r�����.in2z-g12z-p32r�����r����rb��r,���r���r���r���r���� z%s: keep(sf): %sz KEEP(SF): z-iz-gribz.out2r����zSubset pg file.r����zpgfile is GRIB2�PRMSLzkeep (pg): z#%s: could not find any PRMSL field.z KEEP(PG): z.idxz-oz%s: is not GRIB1 nor GRIB2z.before.copygbzofs_getgds2 says gds=z-gz-i0z-az.rawz.raw.idx�%s %s %s %s %s r����� intp_pars.dat���� &intp_pars avstep = %d., ! averaging fluxes (in hours) mrffreq = %d., ! frequency of MRF fluxes (in hours) = mrffreq for no averaging flxflg = 15, ! Type of HYCOM input (=4 => nhycom=7 and =5 => nhycom=8) dbgn = 0, ! debugging =0 - no dbg; =1,2,3 - add output avg3 = 2, ! if avg3 = 1, then averaged fluxes are converted to instantaneous fields wslocal = 0 ! if wslocal = 1, then wind stress are computed from wind velcoities / �forcing.airtmp.a�forcing.airtmp.a.standalone�forcing.airtmp.b�forcing.airtmp.b.standalone�forcing.precip.a�forcing.precip.a.standalone�forcing.precip.b�forcing.precip.b.standalone�forcing.presur.a�forcing.presur.a.standalone�forcing.presur.b�forcing.presur.b.standalone�forcing.radflx.a�forcing.radflx.a.standalone�forcing.radflx.b�forcing.radflx.b.standalone�forcing.shwflx.a�forcing.shwflx.a.standalone�forcing.shwflx.b�forcing.shwflx.b.standalone�forcing.surtmp.a�forcing.surtmp.a.standalone�forcing.surtmp.b�forcing.surtmp.b.standalone�forcing.tauewd.a�forcing.tauewd.a.standalone�forcing.tauewd.b�forcing.tauewd.b.standalone�forcing.taunwd.a�forcing.taunwd.a.standalone�forcing.taunwd.b�forcing.taunwd.b.standalone�forcing.vapmix.a�forcing.vapmix.a.standalone�forcing.vapmix.b�forcing.vapmix.b.standalone�forcing.wndspd.a�forcing.wndspd.a.standalone�forcing.wndspd.b�forcing.wndspd.b.standalone�jpdt_table.dat�8 8 0 0 8 0 0 0 0 8 8 8 8 0 0 0�hmon_gfs2ofsrA��� gfs2ofs.%d.in�gfs2ofs.%d.outz%d�%s <%s> %s 2>&1 �COMMANDS %s �command.file.preview_gfs2ofs�TOTAL_TASKS�mpiexec -np �! cfp command.file.preview_gfs2ofs�(r2���r����r����r0���r����r���r���r!���r��rl��r.���r����r����r���r����r���r���r����r���Zrunstr� splitlinesrR��r����r����r���r����r����r����r���rp��r>���r����r����r���r����r�����environ�systemr����ofs_timeinterp_forcing�5rJ����date1�date2r���r�����ihoursr���� atmos_flux� atmos_gridr�����hourstepr���nm�listflx�rdate1�rdate2�stopdater���r���r���r���r���r���r���Zofs_getkpdsZofs_getgds2�TYPExrZ���dateir�����sfZpfZpgfile�flxfileZsfindexZreindexZfltrD���ZpgverZpgindexr����Zkgdt�listflxf�ippdf�jr��rr��r���� gfs2ofs_in�gfs2ofs_outrC����cfpf�ttr���r���r����ofs_seasforce3<��st��� � ������ �� �� ������ � ���zHYCOMInit1.ofs_seasforce3c�����������(������C���s��|dkr,d}|���d�}|���d�}|���d�}n.d}|���d�}|���d�}|���d�}t�d d ��|�jj} t|d��} td�}t||��d|��d�}d tt|���g} || �}|| �}||�}t t |��d���}t t |��d���}|��d�}|��d�}|dk�rd}d}nd}dddd�dddd�dddd�dddd�dddd�dddd�dddd�dd|d�dd|d�d d|d�d!d|d�d"d|d�d#d|d�dddd�d$ddd�d%ddd�d&d'dd�g}|}|�j}t t |��d(���}|��d(�}t��}|�d)d*���||k��r�|��|||�}|�d+�d,�}t|d-|d.��t||d/�|d-d0��| �d1|�d+�|d2|d2f���d3|�d+��}|�d4||||||f���|| 7�}�q�td5d6��}|�d7�|���W�5�Q�R�X�ttjd8��}|�d9|��t�d:t|��d;���td d6��} | �d7�| ���W�5�Q�R�X�td<d6��}!|!�d=||f���W�5�Q�R�X�|dk�r(t�d>d?��t�d@dA��t�dBdC��t�dDdE��t�dFdG��t�dHdI��t�dJdK��t�dLdM��t�dNdO��t�dPdQ��t�dRdS��t�dTdU��t�dVdW��t�dXdY��t�dZd[��t�d\d]��t�d^d_��t�d`da��t�dbdc��t�ddde��tdfd6��}"|"�dg��W�5�Q�R�X�|��dh�}#t��}tdidj�D�]N}$dk|$�}%dl|$�}&t|%d6��}'|'�d |$���W�5�Q�R�X�|�dm|#|%|&f����qb|�dnt|����tdod6��}|�d7�|���W�5�Q�R�X�ttjd8��}t�d:t|��dp���|��|��d�S�)qNr~��rk���r��r��r��r��r��r��r���r���rl���rv��r���r���r���r���r���r���r���r���r���r���r���r����r���r���r���r���r���r���r���r���r���r���r���r���r���r���� sea level�gfs2ofsinputs.py�%s � /bin/truer��r���Tr���r���r���r����none�gfs2outputs.%s.out�%%s %s %s %s %s < /dev/null > %s 2>&1 �command.file.previewr����r,���r ���CALLING gfs2ofsinputs %d r��� cfp command.file.previewr���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r��r��r��r��r��r��� hmon_gfs2ofs2r����rA��r��r ��r ��r��r��r��)r2���r����r����r0���r����r���r���r!���r��rl��r.���r����r����rm��r���rp��r���r����r���r���r>���r����r����r��r����r��r���r����r����r���(rJ���r��r��r���r����r��r���r��r��r����r��r��r��r��r��r��r ��r���r���Z wgrib2locZgrb2indexlocr!��rZ��r"��r����rq��rr��r#��r$��Z g2oinputs_outr*��r+��r%��r&��r'��r��r���r(��r)��rC���r���r���r����ofs_seasforce4'��s����� � ����������� � ���zHYCOMInit1.ofs_seasforce4c����������� ��� ���C���s����d}d}d�}t�|d���}|���}|D�]*}|d�kr$|�d�dkr$|dd��}�qPq$|d�krnd|f�}tj�|��|�|��|D�]}|d7�}|�|�r||d7�}q|W�5�Q�R�X�||||�|fS��Nr���r<����spanr���z(%s: could not find data records in file.r�����r>����tellrR��r����r����r����seek� rJ���r����� num_times�blines�anamer�����startrD���r����r���r���r����ofs_forcing_info���s$���� zHYCOMInit1.ofs_forcing_infoc�����������������C���s���t�jjd|dd��d�dD�]X}dD�]N}d|�d�|�}tj�|�r d|�d�|�}|�d ||f���t�||��q qW�5�Q�R�X�tt t |��d ����}ddd dddggddddddggg}|D�]�\}} d|f�} |��| �\}}} }| D�]�}d|f�}d|f�}|��|�\}}}}||| ||||g}dd��|D��}d� |�d�}|�d|t|�f���t|d��}|�|��W�5�Q�R�X�t||k�|d��q�q�d�S�)N�tempTr���� �airtmp�precip�presur�radflx�shwflx�surtmp�tauewd�taunwd�vapmix�wndspdrw����../forcing.ry����forcing.� Move %s => %s�hmon_timeinterp_forcingrH��rG��rI��rL��rO��rP��rM��rN��rJ��rK���temp/forcing.%s.b�timeinterp_forcing.%s.inc�����������������S���s���g�|�]}t�|��qS�r���rj���rm���r���r���r���r���rq�����s�����z5HYCOMInit1.ofs_timeinterp_forcing.<locals>.<listcomp>r����%s: write %sr����r�����rc��r���r���r����r6���r���r����r����rl��r����r����r����rD��r����r����r>���r����r�����rJ���r����Zofieldrw���re��rf��r��ZxfieldZifieldZofieldsZifile�_r@���iheadZtfile�ofile� num_framesZohead�snamer����Ztfr���r���r���r�����s8���� � � z!HYCOMInit1.ofs_timeinterp_forcingc����������� ��� ���C���s����|���d�\}}}}|���d�\}}}}||||g}d�dd��|D���d�}tdd��}|�|��W�5�Q�R�X�|��dd ��|��d �} tt| �dk�|d��d�S�)N�forcing.surtem.br���r���c�����������������S���s���g�|�]}t�|��qS�r���rj��rW��r���r���r���rq�����s�����z2HYCOMInit1.ofs_correct_forcing.<locals>.<listcomp>�correct_forcing.inr�����forcing.airtmp�forcing.airtm1Zhmon_correct_forcingr�����rD��r����r>���r����r���r����r����r.���� rJ���r����r[��r^��r\��r_��rB��r����Zcfif�ofs_correct_forcingr���r���r���rf����s���� zHYCOMInit1.ofs_correct_forcingc�����������!������C���s���|�j�j}tddd|d��tdd��}|�d��W�5�Q�R�X�t|�j�d�|�}|�d�}|�j�j�d�}d }|��d �\}}} } |��d�\}}}}|��d�\}}}} d }d}d\}}}}tdd���}|D�]�}|� d�dk�r|� ��}t|d��}|d 8�}t|d��}|d 7�}|� d�dkr�|� ��}t|d��}|d 8�}t|d��}|d 7�}q�W�5�Q�R�X�dt|�j �t|�j�||| ||||||g}d�dd��|D���d�}tdd��}|�|��W�5�Q�R�X�tt|��d���}t|dk�|d��d}|||g}d�dd��|D���d�}td d��}|�|��W�5�Q�R�X�tt|��d!���}t|d k�|d��t|d��}|���}|dd"��}W�5�Q�R�X�td#d�� }|�d$|| || | |f���W�5�Q�R�X�tt|��d%���} t| d#k�|d��d�S�)&N� ../tmpvitZtrackTr����r����z�000 000 000000 00000000 0000 0000 00000 000 000 0000 0000 0000 00 000 0000 0000 0000 0000 0 0000 0000 0000 0000 00 0000 00000 0000 0000 0000 0000 rl���r��r����r��r���r���zSTORM.xy.datzfwind4d.STORM.bin)NNNN�regional.grid.br<���zulat:r���rk���rz��zulon:r���c�����������������S���s���g�|�]}t�|��qS�r���rj��rW��r���r���r���rq���E��s�����z.HYCOMInit1.ofs_windforcing.<locals>.<listcomp>zfwind.inr����Z hmon_fwindr����z frc4hycom.binc�����������������S���s���g�|�]}t�|��qS�r���rj��rW��r���r���r���rq���N��s�����z wind2hycom.inZhmon_wind2hycom����zcorrect_wind.inz� frc4hycom.bin forcing.wdspd1.b,forcing.tauew1.b,forcing.taunw1.b forcing.wdspd1.a,forcing.tauew1.a,forcing.taunw1.a forcing.wndspd.b,forcing.tauewd.b,forcing.taunwd.b %d %s,%s,%s %d %s Zhmon_correct_wind)r0���r����r���r>���r����r���rO���r����rD��rR��r����r ���r!���rY���rZ���r����rl��r.���r����r����r���)!rJ���r����r����rn���ZfdateZfdate1�intvlrA��r@��ZnrecordsZsname1r[��Zsname2Zsname3ZdatfileZbinfileZlatminZlatmaxZlonminZlonmax�rgbfrD���r���r����ZfwifZhmon_ofs_fwindZbinfnameZwhifZhmon_ofs_wind2hycomZdfZnrcdsZcwifZhmon_ofs_correct_windr���r���r����ofs_windforcing%��sp���� ( �������zHYCOMInit1.ofs_windforcingc�����������������C���s0���|�j�}|tk r||kr|S�t|�j�|�d��dkS��Nr���g{�G�z�?��blkdat� NO_DEFAULTr����rJ���Zflagname�defaultro��r���r���r����blkflagh��s�����zHYCOMInit1.blkflagc �������������� ���C���s���|���dd�} |���dd�} |���dd�}|���dd�}|�dt|�t|�t|�f���d} | sl|sl|sl|�d��n�d } |�d ��t|��d�dd |d��t|��d�dd |d��t|��d�dd |d��t|��d�dd |d��|��||||��|r�|��|��| d k�r|��dd��|�d��d } n |�d��|d k�r�tdd��}|� ��� ��}|d�}W�5�Q�R�X�|dk�rj|�d��n�|��|��|dk�r�dd gd!d"gd#d$gd%d&gd'd(gd)d*gd+dgd,d!gd-d#gd.d%gd/d'gd0d)gg}|D�](\}}|�d1||f���t� ||���q�| S��2N�priverF�flxflg�wndflg�atpflgzIANOTHER STRING FOR WHICH TO GREP - mode=%s adjust_temp=%s adjust_wind=%s rr���zNo atmospheric forcing createdr���zCreate atmospheric forcing.z({FIXhycom}/ofs_atl.ismus_msk1760x880.datzismus_msk1760x880.datTr����z){FIXhycom}/ofs_atl.ismus_msk3072x1536.datzismus_msk3072x1536.datz({FIXhycom}/ofs_atl.ismus_msk1440x721.datzismus_msk1440x721.datz({FIXhycom}/ofs_atl.ismus_msk1440x720.datzismus_msk1440x720.datz;{FIXhycom}/hmon_{RUNmodIDout}.{gridlabelout}.forcing.riversr���z"Station River Forcing Files copiedz$River Forcing Files are not employedrg��r<���r�����Sz0Hurricane too shallow to run parameterized windsr����r��zforcing.wndspd.a.originalr��zforcing.wndspd.b.originalr���zforcing.tauewd.a.originalr���zforcing.tauewd.b.originalr���zforcing.taunwd.a.originalr���zforcing.taunwd.b.originalzforcing.wdspd1.azforcing.wdspd1.bzforcing.tauew1.azforcing.tauew1.bzforcing.taunw1.azforcing.taunw1.bzRename %s to %s�rs��r����r����r���r����r9��rf��r���r>���r���r����rl��r����r�����rJ���Zsrtdater����rj��r����r����r����r���r����ru��rv��rw��rx��Zforcingfilesmadern���r����depthZrenamemeZifromZitor���r���r���r����o��sj������� � �zHYCOMInit1.rtofs_get_forcingc�����������������C���sN���|���|�}tjj|d�|d�d|����d��tjj|d�|d�d|����d��d�S��Nrw��Tr����rx���r����rc��rd��r���r~����rJ���Zsfromrf��re��r���r���r���r������s���� ��������zHYCOMInit1.copyabc�����������������C���s<���t�|d�|d�d|����d��t�|d�|d�d|����d��d�S��Nrw��Fr����rx���r���r~����rJ���re��rf��r���r���r���r������s����zHYCOMInit1.moveabc�����������������C���sN���|���|�}tjj|d�|d�d|����d��tjj|d�|d�d|����d��d�S��Nrw��Tra��rx���r����rc��rd��r���r~���r��r���r���r���ro�����s���� ��������zHYCOMInit1.linkabc�������������� ���C���s����|�j�d�k r|�j�S�t�t�}||�_�|��d�}t|��D}|D�]8}t�d|�}|r8|�d�\}}t |�}||�� |��q8W�5�Q�R�X�|�j�S��Nz?{PARMhycom}/hmon_{RUNmodIDout}.{gridlabelout}.fcst.blkdat.inputz^\s*(\S+)\s*'\s*(\S+)\s*' = r���)r_����collections�defaultdictr���r����r>���r?���r@���rA���r ���rp���rJ���r����r����rC���rD���rE����valZkwdr���r���r���ro�����s���� � zHYCOMInit1.blkdatc�����������������C���s���|�j�d�d�S��N�baclinr����ro���rJ���r���r���r���r������s����zHYCOMInit1.baclinc�������������� ���C���s����|���dd��|���dd��|���dd��|���dd��|�j}|���dd��td�rX|���dd ��ntd �rl|���dd ��tdd |d��tdd |d��tdd |d��tdd |d��tdd��"}|�d|�j|�j|�j|f���W�5�Q�R�X�t |�� d��dk�}t||d��d�S�)N�:{FIXhycom}/hmon_{RUNmodIDout}.{gridlabelout}.regional.gridrh���;{FIXhycom}/hmon_{RUNmodIDout}.{gridlabelout}.regional.depthri��zhmon_basin.000Z archv2r_inzrestart_forspin.br|��r}��ry��r{��zarchv2restart.inTr���zarchv2restart.outz restart_out.bz restart_out.ar����a=��archv2r_in.b restart_in.a restart_out.a 20 'iexpt ' = experiment number x10 (000=from archive file) 3 'yrflag' = days in year flag (0=360J16,1=366J16,2=366J01,3=actual) %d 'idm ' = longitudinal array size %d 'jdm ' = latitudinal array size 2 'kapref' = thermobaric reference state (-1 to 3, optional, default 0) %d 'kdm ' = number of layers 34.0 'thbase' = reference density (sigma units) %f 'baclin' = baroclinic time step (seconds) Zhmon_archv2restartr����)ro��r���r���r���r>���r����rY���rZ���rS��r.���r����r����)rJ���r����r���Zarinrq��r���r���r���r������s8���������zHYCOMInit1.archv2restartc�����������������C���s���|�j�j}tdd��6}|������}t|d��} |������} t| d��}W�5�Q�R�X�t|��d��}d|�d�|�j f�} ||| ||�j |�j|�j|�j | d�f�| d�k}t||d ��t| d�|d |d��d\}}}t|d ����}t|d���}|����d�}|����d�}|�d||f���~~t| d�d���}d }|�r�|���}|�r�t|�dk��rL�q�|�d�}|����d�}|�dd����}t|�dk��r��q�d|dd��t|d��t|d��f�}|�|���q&W�5�Q�R�X�W�5�Q�R�X�W�5�Q�R�X�d�S�)Nrh��r<���r���Zhmon_restart2restartz restart.%s.%sr��rw��z.b.oner����Tr����)�&���iU��iS��r����z z%s %s r���z min, max =r,���r����z%s %16.7E%16.7E r����)r0���r����r>���r���r����r!���r.���r����r����rF��rW���rX���rY���rZ���r����r���r����r����rO���replacer ���)rJ���Zin_aZin_bZout_aZout_br����r����rk��Zidm_moreZ idmglobalZjdm_moreZ jdmglobal�exrx���rq��ZncZwcbZtwcZroutfZglobalfZline1Zline2ZregionfZgoZglineZrliner���Zoliner���r���r���r�����sJ������ �zHYCOMInit1.restart2restart)NrM���)'�__name__� __module__�__qualname__rK���rQ���rU���r����r����r����r����r����r����r��r����r�����propertyr����r`��r��r��r���r���r,��r9��rD��r��rf��rl��rp��rs��r����r���r���ro��ro��r���r���r���� __classcell__r���r���rd���r���rG���C���sT���E �7h�i U� �l�8(CD .rG���c�����������������������s����e�Zd�Zdd��Zd3��fdd� Zedd���Zd d ��Zdd��Zd d��Z dd��Z dd��Zdd��Zdd��Z dd��Zdd��Zdd��Zdd��Zdd ��Zd!d"��Zd#d$��Zefd%d&�Zd'd(��Zd)d*��Zd+d,��Zd-d.��Zed/d0���Zed1d2���Z���ZS�)4� HYCOMInit2c�������������������C���s���t�����d�S�rH���rI���r���r���r���r���rK���.��rL���zHYCOMInit2.remove_oceanNrM���c��������������������sv���t�t|��j|||fd|i|���||�_|�����|��dd�|�_d�|�_d�|�_d�|�_ d�|�_ d�|�_d�|�_d�|�_ d�|�_d�|�_d�S�)NrN���rO���r���)rP���r���rQ���rT���rU���rV���rO���rW���rX���rY���rZ���r[���r\����_HYCOMInit2__rtofs_inputsZ_HYCOMInit2__rtofs_inputs_ymd�_HYCOMInit2__blkdatr`���rd���r���r���rQ���0��s"������zHYCOMInit2.__init__c�����������������C���s8���|�j�d�kr2|��dd�}tj�|�j||�jj�}||�_�|�j�S�r\��)r���r2���r����r]��r^��r0���r����r_��r���r���r���r����A��s ���� zHYCOMInit2.rtofs_inputsc�������������� ���C���s����|�����}t��|�_ddddddddd d g }|D�]d}dD�]Z}d||f�}|��d |��}t|�j||�j|d�}||_||�j|<�|�d||t |�f���q4q,t|�jd|�j|��d�d�|�_ t|�jd|�j|��d�d�|�_dS�)rf���rG��rH��rI��rJ��rK��rL��rM��rN��rO��rP��rw���z forcing.%s.%s�{com}/{out_prefix}.ri���z %s => %s (%s)r����z{com}/{out_prefix}.limitsr|���r}���N)r~���r/����forcing_productsr-���r ���ra���rN���rj����debugr����r����r����)rJ���r����ZffilesZffilerw����fileZcomfr����r���r���r���rU���I��s8�������� ������zHYCOMInit2.make_productsc�����������������C���s���|��|�j|d|�j�g��dS�r����r����r����r���r���r���r����f��s����zHYCOMInit2.fill_ocstatusc����������� ������C���s����|����D�]}�qq|�|�}|D�]�}t�d|�}|sH|�d||f���q |���\}}|���}|���}|dkr�|dkr|d|�_q�|dkr�d|�_q�|�d|t|�f���q |d kr�||�_ q |�d ||f���q dS�r����r����r����r���r���r���r����p��s2���� ����� �zHYCOMInit2.recall_ocstatusc�������������� ���C���s����|�j�j}d}|��dd�}|��dd�}|��dd�}|�j�j}|�j}t|d�|�} |��dd��|��d d ��|��|| |d�|||d|��tdd ��(} | �dt t |��t t | ��f���W�5�Q�R�X�d�S�)Nr���r����r����r����rk���rl���r���rh��r���ri��r����r����r����r����)r0���r����rV���rT���r���ro��r����r>���r����r ���r*���r����r���r���r���r�������s2���������� �z HYCOMInit2.make_forecast_forcingc�������������� ���C���s ��|�����}z�t|�_t|�j|�j�|dd��|}|��|��|��|��|�j� ��D�]\}}|j d|�d��qF|�jj dd��|��d�}t |d��}|�d��W�5�Q�R�X�d|�_W�5�Q�R�X�t|�_W�nT�tk r��}�z$|jd t|�f�dd ��t|�_��W�5�d}~X�Y�n���t|�_��Y�nX�dS�)r����Tr����z./r����z./limitsz6{com}/{vit[stnum]:02d}{vit[basin1lc]}.hycom2_init.doner����z hycom2 init done for this cycle r����r����N)r~���r���r����r���r����r����r����r����r���r1���r����r����r����r>���r����rS���r ���r����r����r���r���)rJ���r����r�����namer����r����rC���r7���r���r���r���r�������s:������ - ��zHYCOMInit2.runc�����������������c���s���|���d�}|���d�}|���d�}|���d�}|���d�}|���d�}|���d�}|���d�}|���d �} |���d �} |���d�}|��dd �}|����} |�jj}d}tt�t|�j �d��d��}|��dd�}|dks�t �t|�d�dd�D�]�}|d�d�d�}t|d�|�}t|d�|�}||k�st �t ||||d�V��t ||||d�V��| �d||�d�|�d�f���~~~q�~|dk�snt �t|�||d��|�D�]�}t|d�|�}|dk�r�|d�d�d�}t|d�|�}| �d|||�d�f���n|}| �d||�d�f���t ||||d�V��t ||||d�V��| �d|||�d�|�d�f����q�~~~~t�|j|j|j�}td|�}|��|j�}td �}| �d!t|�t|�t|�t|�t|�t|�f���t || ||d"d#�V��t || ||d$d#�V��t||d�d�D��]�}t|d�|�}||k�r|}n|}||�}ttt|d%d&���}| �d't|�t|�t|�t|�tt|d%d&��ttt|d%d&���t|�f���|dk��r�| �d(t|�t|�t|�t|�f���t ||||d"d#�V��t ||||d$d#�V���q�n�|dk�rV| �d)t|�t|�t|�t|�f���t || ||d"d#�V��t || ||d$d#�V��t || ||d"d#�V��t || ||d$d#�V���q�|}|d*k�rt|jdk��rt|}|d*k��r�|jd+k��r�|}| �d,t|�t|�t|�t|�f���t ||||d"d#�V��t ||||d$d#�V���q�d-S�r���r��r��r���r���r���r�����sZ��� ���� ��� �������� ��� ������������ ���� ���������� ���������������� ����������zHYCOMInit2.inputiterc�����������$��� ���C���s���|�j�dddd�}dtt|���d�d�d�}|�jj}|dk}d�}|d krNd }n�|dkr\d}n�|rv|d krv|dkrvd}nn|r�|dkr�d}n\|r�|dkr�|dkr�d}nB|dkr�d}n4|dkr�d}n&d|t|�f�}t�|��tj � |��d|�_|�j}|��d�}d} t |d���} | D�]v}|���}t|�dk��rB|�d||���f����q|\ } }}}}}}}}| |k�r||�jk�rd} ||�_||�_d} �qW�5�Q�R�X�~~ | �s�d|t|�t|�j�f�}|�|��tj �|��|��d �}d} t |d���}|D�]�}|���}t|�d!k��r|�d||���f����q�|\}}}}}}}}} }!}"t|�}t|�}t|�}t|�}t| �} t|!�}!t|"�}"||�jk�r�|�|�d"k�r�d} ||||f\|�_|�_|�_|�_|| |!|"f\|�_|�_|�_|�_||�|�_|�_ �q�W�5�Q�R�X�| �sd#|t|�j�t|�f�}|�|��tj �|��|�j!d$k�s$t"�|�j#�$|�j!d%|�j��|�j#�$|�j!d&|�j��|�j#�$|�j!d'|�j ��|�j#�$|�j!d(|�j��t d)d*��}#|#�%d+j&f�|�j'���W�5�Q�R�X�|�d,||||| |!|"f���t�d-|�j|�j|�j|�j f���d�S�).Nr��r ��r!��r"��rl���r#��r$��r%��r&��r+��r(��r,��r-��r.��r/��r0��r1��r2��r3��r6��r7��r9��r:��r;��r<��Fr<���r=��r>��Tr?��r@��rA��r���rB��Z hycominit2rD��rE��rF��rB���rg���r����rG��rH��rI��rJ��rW��r���r���r���r�������s������� ��� � ������ � ����� � ����������zHYCOMInit2.select_domainc�����������������C���s*��|�����}td�}td�}|�jj}|} |�j} tddd�D�]�}|| |�kr�| j||| |d�}| j||| |d�} t|�r�t| �r�|�dt |�t |�t |�t |�t |�t | �f���|| f��S�|� d|| f���n |� d t |�t | �t |�f���| |�} q6d ||||�d�f�}|������|��t j�|��d�S�r���r���r���r���r���r���r��� ��s>��������� ����zHYCOMInit2.getgesc�������������� ���C���s���|�����}td�}td�}|�jj}|}|�j} d} tddd�D��]}|||�k�r*| j||||d�}|�dt|�t|�f���| dkr�| j||||d�} d} t |�r�|�d t|�t|�t|�t|�f���|��S�|d k�rJt |g|ddd ��r|�d t|�t|�t|�t|�f���|��S�|�d|���n |�dt|�t|�t|�f���||�}q:d|�d�| f�}|������ |��tj�|��d�S�)Nr����rv��r���r���rr���r���r���r����r���i�����<���ri��)r����ZmaxwaitZ sleeptimer���r���r���r��)r~���r���r0���r����r����r����r����r����r����r���r���r����r����r����r����r����r����)rJ���r���r���r���r����r���r��r���rp���r���r���r���r���r���r����r���r���r���r��� ��sJ������� ��� zHYCOMInit2.getges1c�����������5������C���sj��|dkr,d}|���d�}|���d�}|���d�}n.d}|���d�}|���d�}|���d�}t�d d ��|�jj} t|d��} td�}t||��d|��d�}d tt|���g} || �}|| �}||�}t t |��d���}t t |��d���}t t |��d���}t t |��d���}t t |��d���}t t |��d���}t t |��d���}t t |��d���}t t |��d���}|dk�rjd}nd}dddd�dddd�dddd�d ddd�d!ddd�d"d#dd�d$d#dd�d%d|d�d&d|d�d'd|d�d(d|d�d)d|d�d*d|d�dddd�d+ddd�d,ddd�g}|}|�j}||k��r.|�� ||||�\}}|�d-�d.�} |�d-�d/�}!t| d0|d1��t|!d0|d1��t|�d2k�r�t|!d3�d0|d1��t|d4d5||!d3�f�|d6��nt||!d3�|d0d7��t||!d3��|d6�}"d8}#|D�]x}$|"���D�]h}%|%�|$d9��d:k�r�|%�|$d;��d:k�r�|%�|$d<��d:k�r�|#|%d=�7�}#|�d>|!d3�|%���f����q�q�|�d?|#���t||!d3�d@dA|!dB�f�|#>�|d6��t|!dB�|!d0|dC��|�dD��t|�}&|&dEk�r�|�dF��t||�|d6�}'d8}#|'���D�]4}%|%�dG�d:k�r�|�dH|%������|#|%d=�7�}#�q�|#�s>dI|f�}(|�|(��tj�|(��|�dJ|#���t||d@dA| f�|#>�|d6��t|| | dK�f�|d6��n�|&d2k�rJt||�|d6�}'d8}#|'���D�]4}%|%�dG�d:k�r�|�dH|%������|#|%d=�7�}#�q�|#�sdI|f�}(|�|(��tj�|(��|�dJ|#���t||d@dAdL| f�|#>�|d6��t|| | dK�f�|d6��n dM|f�}(|�|(��tj�|(��t|!|!dN�d0|dC��t||!�|d6�})|�dO|)���t|dP|)�dQdR| | dK�|!f�|d6��t||!|!dK�f���t||!dS�d0|dC��t||!dS�|!dT�f���| �dU|�d-�|!dS�| ||f���|| 7�}�qtd dV��}*|*�d8� | ���W�5�Q�R�X�tdWdV��}+|+�dX||f���W�5�Q�R�X�|dk�rvt�dYdZ��t�d[d\��t�d]d^��t�d_d`��t�dadb��t�dcdd��t�dedf��t�dgdh��t�didj��t�dkdl��t�dmdn��t�dodp��t�dqdr��t�dsdt��t�dudv��t�dwdx��t�dydz��t�d{d|��t�d}d~��t�dd���td�dV��},|,�d���W�5�Q�R�X�|��d��}-t!��}.t"d2d��D�]N}/d�|/�}0d�|/�}1t|0dV��}2|2�d�|/���W�5�Q�R�X�|.�d�|-|0|1f����q�|�d�t#|.����td�dV��}3|3�d8� |.���W�5�Q�R�X�ttj$d���}4t�%d�t&|4��d����|��'|��d�S�r���r��r��r���r���r���r,��E ��st��� � ������ �� �� ������ � ���zHYCOMInit2.ofs_seasforce3c�����������(������C���s��|dkr,d}|���d�}|���d�}|���d�}n"d}|���d�}|���d�}|���d�}|�jj} t|d ��} td �}t||��d |��d�}dtt|���g} || �}|| �}||�}tt|�� d���}tt|�� d ���}|�� d�}|�� d �}|dkr�d}d}nd}dddd�dddd�dddd�dddd�dddd�dddd�dddd�dd|d�dd|d�dd|d�dd|d�d d|d�d!d|d�dddd�d"ddd�d#ddd�d$d%dd�g}|}|�j }|�� d&�}t��}|�d'd(���||k��rj|�� |||�}|�d)�d*�}t|d+|d,��t||d-�|d+d.��| �d/|�d)�|d0|d0f���d1|�d)��}|�d2||||||f���|| 7�}�q�td3d4��}|�d5�|���W�5�Q�R�X�ttjd6��}|�d7|��t�d8t|��d9���td:d4��} | �d5�| ���W�5�Q�R�X�td;d4��}!|!�d<||f���W�5�Q�R�X�td=d4��}"|"�d>��W�5�Q�R�X�|�� d?�}#t��}td@dA�D�]N}$dB|$�}%dC|$�}&t|%d4��}'|'�d|$���W�5�Q�R�X�|�dD|#|%|&f����qH|�dEt|����tdFd4��}|�d5�|���W�5�Q�R�X�ttjd6��}t�d8t|��dG���|��|��d�S�)HNr~��rk���r��r��r��r��r��r��rl���rv��r���r���r���r���r���r���r���r���r���r���r���r����r���r���r���r���r���r���r���r���r���r���r���r���r���r���r-��r.��r/��r0��r��r���Tr���r���r���r���r1��r2��r3��r4��r����r,���r ��r5��r��r6��r���r���r���r��r��r7��r����rA��r��r ��r ��r��r��r��)r2���r0���r����r���r���r!���r��rl��r.���r����r����r���rp��r���r����r���r���r>���r����r����r����r��r����r��r���r����r����r��r8��r���r���r���r9��2 ��s����� � ����������� � ���zHYCOMInit2.ofs_seasforce4c����������� ��� ���C���s����d}d}d�}t�|d���}|���}|D�]*}|d�kr$|�d�dkr$|dd��}�qPq$|d�krnd|f�}tj�|��|�|��|D�]}|d7�}|�|�r||d7�}q|W�5�Q�R�X�||||�|fS�r:��r<��r?��r���r���r���rD��� ��s$���� zHYCOMInit2.ofs_forcing_infoc�����������������C���s���t�jjd|dd��d�dD�]X}dD�]N}d|�d�|�}tj�|�r d|�d�|�}|�d ||f���t�||��q qW�5�Q�R�X�tt t |��d ����}ddd dddggddddddggg}|D�]�\}} d|f�} |��| �\}}} }| D�]�}d|f�}d|f�}|��|�\}}}}||| ||||g}dd��|D��}d� |�d�}|�d|t|�f���t|d��}|�|��W�5�Q�R�X�t||k�|d��q�q�d�S�)NrE��Tr���rF��rw���rQ��ry���rR��rS��rT��rH��rG��rI��rL��rO��rP��rM��rN��rJ��rK��rU��rV��c�����������������S���s���g�|�]}t�|��qS�r���rj��rW��r���r���r���rq�����s�����z5HYCOMInit2.ofs_timeinterp_forcing.<locals>.<listcomp>r���rX��r����r����rY��rZ��r���r���r���r��� ��s8���� � � z!HYCOMInit2.ofs_timeinterp_forcingc����������� ��� ���C���s����|���d�\}}}}|���d�\}}}}||||g}d�dd��|D���d�}tdd��}|�|��W�5�Q�R�X�|��dd ��|��d �} tt| �dk�|d��d�S�)Nr`��r���r���c�����������������S���s���g�|�]}t�|��qS�r���rj��rW��r���r���r���rq�����s�����z2HYCOMInit2.ofs_correct_forcing.<locals>.<listcomp>ra��r����rb��rc��rf��r����rd��re��r���r���r���rf����s���� zHYCOMInit2.ofs_correct_forcingc�����������������C���s0���|�j�}|tk r||kr|S�t|�j�|�d��dkS�rm��rn��rq��r���r���r���rs����s�����zHYCOMInit2.blkflagc �������������� ���C���s���|���dd�} |���dd�} |���dd�}|���dd�}|�dt|�t|�t|�f���d} | sl|sl|sl|�d��n�d } |�d ��t|��d�dd |d��t|��d�dd |d��t|��d�dd |d��t|��d�dd |d��|��||||��|r�|��|��| d k�r|��dd��|�d��d } n |�d��|d k�r�tdd��}|� ��� ��}|d�}W�5�Q�R�X�|dk�rj|�d��n�|��|��|dk�r�dd gd!d"gd#d$gd%d&gd'd(gd)d*gd+dgd,d!gd-d#gd.d%gd/d'gd0d)gg}|D�](\}}|�d1||f���t� ||���q�| S�rt��rz��r{��r���r���r���r������sj������� � �zHYCOMInit2.rtofs_get_forcingc�����������������C���sN���|���|�}tjj|d�|d�d|����d��tjj|d�|d�d|����d��d�S�r}��r~��r��r���r���r���r���b��s���� ��������zHYCOMInit2.copyabc�����������������C���s<���t�|d�|d�d|����d��t�|d�|d�d|����d��d�S�r���r���r���r���r���r���r���i��s����zHYCOMInit2.moveabc�����������������C���sN���|���|�}tjj|d�|d�d|����d��tjj|d�|d�d|����d��d�S�r���r���r��r���r���r���ro��m��s���� ��������zHYCOMInit2.linkabc�������������� ���C���s����|�j�d�k r|�j�S�t�t�}||�_�|��d�}t|��D}|D�]8}t�d|�}|r8|�d�\}}t |�}||�� |��q8W�5�Q�R�X�|�j�S�r���)r���r���r���r���r����r>���r?���r@���rA���r ���rp��r���r���r���r���ro��t��s���� � zHYCOMInit2.blkdatc�����������������C���s���|�j�d�d�S�r���r���r���r���r���r���r������s����zHYCOMInit2.baclin)NrM���)r���r���r���rK���rQ���r���r����rU���r����r����r����r����r��r����r���r���r,��r9��rD��r��rf��rp��rs��r����r���r���ro��ro��r���r���r���r���rd���r���r���-��s<��� Z�i%�n�(D r���c�������������������@���sH���e�Zd�Zdd��Zedd���Zdd��Zdd��Zd d ��Zdd��Z d d��Z dS�)�HYCOMIniterc�����������������C���s���||�_�||�_d�S�rH���)� hycomfcstr����)rJ���r���r����r���r���r���rQ������s����zHYCOMIniter.__init__c�����������������C���s���|�j�jS�rH���)r���� hycominitr���r���r���r���rC�����s����zHYCOMIniter.hycominit1c�����������������C���s0��|�j�}|j}|�|�j|��|js.|�d��dS�t��}|j���D�]\}}|� |��q>|j ���D�]\}}|� |��q\d}|D�]|}|js�|�d|j f���qx|js�|�d|j f���qxtj�|j�s�|�d|j |jf���qx|�d|j |jf���|d7�}qx|t|�k��r|�d |t|�f���d S�|�d��dS�dS�) z�This subroutine is run by the check_init job and checks to see if the initialization has succeeded. It returns True if the inputs are all present, and False if they're not.�(Hycom init says we will not run coupled.Tr���z%s: product not availablez%s: no path set in databasez%s: %s: file does not existz%s: %s: product is deliveredr����z0Have only %d of %d products. Ocean init failed.Fz#Rejoice: we have all coupled inputsN)r���r���r����r����rS���r����r���r����r1���rp��r����� availabler�����didrj���r����r6���r���r����rO��)rJ���r����Zhf�hi�prodsr����r�����countr���r���r����check_coupled_inputs���sF���� �� �� �� z HYCOMIniter.check_coupled_inputsc�����������������C���s���|r|���|�S�|�jj}|�|�j|��|js8|�d��dS�t��}|j� ��D�]\}}|� |��qH|j� ��D�]\}}|� |��qf|s�tj jd|d��tj jd|d��|�jjj}|D��]}|jr�|jr�tj�|j�s�d|jt|j�t|j�f�}|�|��tj�|��t�d|j�} | �s(t|j|j|dd��q�| � ��\} }t!| �} t"d |�}|�#d t| �t|�f���tj$�"| d�|�} | �%d�|�}| �%d �|�}||fD�]}t|j||dd���q�q�|�&d�}t'|�}|dk�s�t(�dD�]�}|j&d|d�}d}t)�)|�D�]F}|d7�}|�*|�}|||�d��}t�+dd|�}t||d|d���q�|�#d||��|dk�s�t(��q�|�s�|�jj,}|dk �szt(�|j�s�t(�|j�s�t(�t-|j�}|��.|��|��/|��dS�)z�Called from the forecast job. If just_check=True, this calls check_coupled_inputs. Otherwise, this links all hycom inputs to the local directory.r���Tr���r����r���z0%s: input not present (location=%s available=%s)zhmon_basin.0*(\d+).([ab])r���r����z"Link hour %s relative to cycle %s.rl���znest/archv.%Y_%j_%H.zincup/incupd.%Y_%j_%H.z {out_prefix}.ri��)Zrtofsr�����forcingz{com}/{out_prefix}.{part}*)�partr���r����Nz.*\.restart\.([^/]*)z restart_in.\1ra��z%s: %d files linked )0r���r���r���r����r����rS���r����r���r����r1���rp��r����rc��rd���makedirsr0���r����r���rj���r����r6���r���r���r����r����r����r�����OceanInitFailedr?���r@���r����r���rA���r!���r���r�����numericsr����r����rO��r��r����rfind�subrg���rF����link_hycom_fix�link_hycom_parm)rJ���Z just_checkr����r���r���r����r����r����r����rE���Zhrrw���Z hycomtimern���Zname1Zname2r����opZnopr����globbyZnfoundr6���Zipref� localnameZ finalname�hsprodrB���r���r���r����link_coupled_inputs���s����� �� �� �� zHYCOMIniter.link_coupled_inputsc�����������������C���sR���|�j����}dddd�}|���D�].\}}|�j�jd||d�}tjj|||dd��qd�S�) Nr|���r���r��)zfcst.blkdat.inputzpatch.input.90r��z/{PARMhycom}/hmon_{RUNmodIDout}.basin.{PARMBASE})rB���ZPARMBASETr���)r���r~���r1���r����rc��rd��r���)rJ���rB���r����ZmineZparmbaser����parmfiler���r���r���r�����s���� ���zHYCOMIniter.link_hycom_parmc����������� ������C���sH��|st��|�j���}|�jjd|d�}tddddddg�}d }d }t�|�D�]�}tj�|�}|� d �} d} |d7�}| d k�r�|� d �}|d kr�t jj|||d�d���|dd��d} n4|| d�d���}||kr�t jj|d|�|dd��d} | s�|� d||f���qH|d7�}qH|� d||t|�f���t jjdd|dd��t jjdd|dd��d�S�)Nz%{FIXhycom}/hmon_{RUNmodIDout}.basin.*r����zchl.azchl.bzofflux.azofflux.bzrivers.azrivers.br���r���Fr����zbasin.r����Tr�������rR��z%s: not linking %sz2Linked %d of %d HyCOM fix files for RUNmodIDout=%sz../relax.rmu.az nest/rmu.az../relax.rmu.bz nest/rmu.b)r��r���r~���r����r����r���r����r6����basenamerR��rc��rd��r���r����r����) rJ���rB���r����r���Zforcewanted�nZnlinkedr6���r����fdZlinkedZbdZ forcetyper���r���r���r�����s@���� � ���zHYCOMIniter.link_hycom_fixc�����������������C���sj���t�|t�s$tdt|�jt|�f���|����|�d�s:t�|� d�}|� |�}|s^tj� d��t|�|�S�)z�Returns an MPIRanksBase to run the executable chosen by the initialization. This function must only be called after link_coupled_inputszDThe ranks argument to make_exe must be an int. You provided a %s %srB���r���zCThe forecast_exe option was not specified in the ocean status file.)r���r!���� TypeError�typer���r�����read_hycom_init_varsZtvhaver��r����r����r����r�����OceanExeUnspecifiedr����)rJ���r5���r.���Zranksr���Zwantexer���r���r����make_exe<��s���� �zHYCOMIniter.make_exeN)r���r���r���rQ���r���rC��r���r���r���r���r���r���r���r���r���r������s��� .T r���c�����������������������s>���e�Zd�ZdZd ��fdd� Zdd��Zed d ���Zdd��Z���Z S�)�WRFCoupledHYCOMz7This subclass of CoupledWRF runs the HyCOM-coupled WRF.T�auxhist1Nc ��������������������s����t�|t�s$tdt|�jt|�f���tt|��j||||||f| ��||�_ t |�|�} |��dddd��|�����|�� dd�}|��dd d || ��|�����d�S�)NzcThe hycominit argument to WRFCoupledHYCOM.__init__ must be a HYCOMInit object. You passed a %s %s.ZcouplerZ hmon_wm3cZ wm3c_ranksr�����ocean_ranksr����Zoceanr'���Zhycom_ranks)r���Z HYCOMInitr���r���r���r����rP���r���rQ���� _hycominitr���Zcouple� _add_waverV���Z couplewrf)rJ���ra���r0���rb���Zwrfr����ZkeeprunZwrfdiag_streamr���rc���Zhycominiterr���rd���r���r���rQ���O��s$���� ���� zWRFCoupledHYCOM.__init__c�������������� ���C���s,��|�j�j}|j|j�}}|����}|sDd|jf�}|�|��tj� |��|shd|f�}|�|��tj� |��d}t |d��n}|D�]b}t�d|�} | r�| � d�\} }|��| |��|�d|| t|�f���|d7�}q||�d||f���q|W�5�Q�R�X�|dk��rd |f�}|�|��tj� |��n|�d ||f���d�S�)Nz"%s: no location for hycom_settingsz+%s: not available yet according to databaser���r<���zexport (\S+)=(\S+)\s*$z%s: set %s = %sr����z%s: unrecognized line "%s"z%s: no variables found in filez%s: set %d vars)r���rg���r���rj���r~���r���r����r����r����r���r>���r?���r@���rA���Ztvsetr����r����r����)rJ���r����avr����r����r����rY��rC���rD���rE����varr���r���r���r���r���f��s4���� z$WRFCoupledHYCOM.read_hycom_init_varsc�����������������C���s���|�j�S�)zReturns the HYCOMInit object.)r���r���r���r���r���r������s����zWRFCoupledHYCOM.hycominitc�����������������C���s���dS�)zp!Internal function for adding wave coupling. This must be implemented by a subclass. @protectedNr���r���r���r���r���r������s����zWRFCoupledHYCOM._add_wave)Tr���N) r���r���r����__doc__rQ���r���r���r���r���r���r���r���rd���r���r���M��s�������� r���c�����������������������s2���e�Zd�ZdZd ��fdd� Zdd��Zdd��Z���ZS�) � HYCOMPostzRRuns the ocean post-processor on the HyCOM output, in parallel with the model.rM���c��������������������s"���t�t|��j|||f|��||�_d�S�rH���)rP���r���rQ���rT���)rJ���Zdsr0���rb���rT���rc���rd���r���r���rQ������s����zHYCOMPost.__init__c�����������1������C���sR ��|�����}t|�_t|�j|�j�|dd�� �"}|�j}|��d�}|��d�}|��d�}|��d�}t|d���}|D�]�} t � d| �} | r�t| ���d ��}t � d | �} | r�t| ���d ��}t � d| �} | r�t| ���d ��} t � d| �} | r�| ���d �}t � d | �} | rf| ���d �}qfW�5�Q�R�X�|� d||| ||f���d|||f�}tjj|d�dd|�����d��tjj|d�dd|�����d��d|||f�}tjj|d�dd|�����d��tjj|d�dd|�����d��|�jj}d }d}d}|||�k�� r0t|d�|�}|�d�}|jd k�s|jdk�s|jdk�s|jdk�r&d|�}nd |�}d!�|d"g�}d }d#}||k��r�tj�d$|���rf�q�n(|d%�}|�d&t|�|f���t�d'���qD||k�r�|�d(t|�|f���t�|� d)t|����d!�d$|�dg�}d!�d$|�dg�}tjj|d*d|d��tjj|d+d|d��td,d-��}|� d.��W�5�Q�R�X�td/d-��6}|� d0t|j!�t|j"�t|j#�t|j�|f���W�5�Q�R�X�td1d-��6}|� d2t|j!�t|j"�t|j#�t|j�|f���W�5�Q�R�X�|jd k�s�|jdk�s�|jdk�s�|jdk�r�|� d3��d4|�}d1|g}td5d6��4} |D�](}!t|!��}"| � |"�$����W�5�Q�R�X��qW�5�Q�R�X�t|�t|�t| �d7�}#td5��R}td8d6��<}$|D�]0} |#�%��D�]\}%}&| �&|%|&�} �q�|$� | ���q�W�5�Q�R�X�W�5�Q�R�X�t't(|��)d9���}'t*|'d8k�|d:��d%}(td+d��N})td;d-��8}*|)D�],} |(d<k�r*|(d=k��r*|*� | ��|(d%�}(�qW�5�Q�R�X�W�5�Q�R�X�d>|t|j!�t|j"�t|j#�t|j�||f�}+|+d�},|+d�}-d;d?g}t|-d6��4}.|D�](}!t|!��}"|.� |"�$����W�5�Q�R�X��q�W�5�Q�R�X�t�+d@|,��t,|,|��-dA|,��dB|dC��t,|-|��-dA|-��dB|dC��t.d?d|dD��dE|�}d/|g}td5d6��4} |D�](}!t|!��}"| � |"�$����W�5�Q�R�X��qBW�5�Q�R�X�t|�t|�t| �d7�}#td5��R}td8d6��<}$|D�]0} |#�%��D�]\}%}&| �&|%|&�} �q�|$� | ���q�W�5�Q�R�X�W�5�Q�R�X�t't(|��)dF���}'t*|'d8k�|d:��dG|t|j�|f�}+t|+dH�}/t/�0td?dI�|/��|/�1���t.d?d|dD��dJ|�}d/|g}td5d6��4} |D�](}!t|!��}"| � |"�$����W�5�Q�R�X��qvW�5�Q�R�X�t|�t|�t| �d7�}#td5��R}td8d6��<}$|D�]0} |#�%��D�]\}%}&| �&|%|&�} �q�|$� | ���q�W�5�Q�R�X�W�5�Q�R�X�t't(|��)dF���}'t*|'d8k�|d:��dK|t|j�|f�}+t|+dH�}/t/�0td?dI�|/��|/�1���t.d?d|dD���n>|� dL��dJ|�}d/|g}td5d6��4} |D�](}!t|!��}"| � |"�$����W�5�Q�R�X��q�W�5�Q�R�X�t|�t|�td%�d7�}#td5��R}td8d6��<}$|D�]0} |#�%��D�]\}%}&| �&|%|&�} � q*|$� | ��� qW�5�Q�R�X�W�5�Q�R�X�t't(|��)dF���}'t*|'d8k�|d:��dK|t|j�|f�}+t|+dH�}/t/�0td?dI�|/��|/�1���t.d?d|dD��dM||f�}0t,d$|�d�|�j-dN|0�d�d|dC���t,d$|�d�|�j-dN|0�d�d|dC���|d7�}�q�|� dO��W�5�Q�R���dPS�Q�R�X�dQS�)Rz5Called from the ocean post job to run the HyCOM post.Tr����z {FIXhycom}z{PARMhycom}z{out_prefix_nodate}rh���r<���z^export idm=(.*)$r���z^export jdm=(.*)$z^export kdm=(.*)$z^export gridlabelout=(.*)$r=���z>POSTINFO- idm=%d jdm=%d kdm=%d gridlabelout=%s RUNmodIDout=%s z%s/hmon_%s.%s.regional.gridrw��zregional.grid.ara��rx��rh��z%s/hmon_%s.%s.regional.depthzregional.depth.azregional.depth.brk���g�������?rl���z%Y_%j_%Hr����r���r����zarchv.%szarchs.%sr,���z.txtr#��z../forecast/r����zCannot find file %s %d timesr���z&Cannot find file %s %d times - exitingz"Will create ocean products for %s zarchv.azarchv.bzfort.22r����z 120 Z topinfilez�archv.b GRIB1 %d 'yyyy' = year %d 'month ' = month %d 'day ' = day %d 'hour ' = hour %d 'verfhr' = verification hour Ztopzfilez�archv.b HYCOM %d 'yyyy' = year %d 'month ' = month %d 'day ' = day %d 'hour ' = hour %d 'verfhr' = verification hour zDo Volume HEREz%s/hmon_rtofs.archv2data_3z.inZ tempinfile�w)z&idmz&jdmz&kdm�infileZhmon_archv2data3zr����Zpartialbrz��rA��z$%s.%04d%02d%02d%02d.hmon_%s_3z.f%03dzfort.51z fort.051az{com}/Fr����r���z%s/hmon_rtofs.archv2data_3d.inZhmon_archv2data2dz%s.t%02dz.F%03d.3d.grb�wb�rbz%s/hmon_rtofs.archv2data_2d.inz%s.t%02dz.f%03d.3d.grbzDo Surface HEREz hmon_%s.%sr���zfinishing up hererr���N)2r~���r���r����r���r����r����rT���r����r>���r?���r@���r!���rA���r����rc��rd��r���r0���r����r���r����r����r����r����r6���r���r����r����r����sleepr����� exceptionr����r����r����r����r����r1���r���rl��r.���r����r����r����r���r����r����shutil�copyfileobj�close)1rJ���r����r����rT���ZFIXhycomZ PARMhycomZopnZhycomsettingsfileZhsfrD���rE���rY���rZ���rS��rF��rB���re��ZstimeZnavtimer��ZarchtimeZarchtimestringZnotabinZlogfileZ timessleptZsleepmaxr���r���Zf22r����r���� filenamesZiff�fnameZfilenZreplacementsr�����srcZtargZ archv2datar���ZibZpb�outfileZoutfileaZoutfileb�obZgbfileZnotaboutr���r���r���r�������s���� ���������������� 0 $� $� 0 & " . & & " & " & " && z HYCOMPost.runc�����������������C���s���|�����}t|�_t|�_dS�)z�Called from the unpost job to delete the HyCOM post output in preparation for a rerun of the entire post-processing for the cycle.N)r~���r���r����r ���)rJ���r����r���r���r����unrun� ��s����zHYCOMPost.unrun)rM���)r���r���r���r���rQ���r����r���r���r���r���rd���r���r������s�����r���);r���r?����sysr����r���r"���r��r$���r���� subprocess�produtil.fileoprc���produtil.log� hwrf.numericsr����Z hwrf.inputZ hwrf.hwrftaskZ hwrf.coupling�hwrf.exceptionsr���r����produtil.cdr���r���r���r���r���r���r���Zprodutil.datastorer ���r ���r���r����produtil.runr���r���r���r���r���r����objectrp��r���r&���r(���r*���r;���rF���ZhwrftaskZHWRFTaskrG���r���ZcouplingZComponentIniterr���Z CoupledWRFr���r���r���r���r���r����<module>���sZ���H �������������w��������b�GA