U

����� g�p���������������������@���s���d�Z�ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
ZddlZddl
ZddlZddlZddlZddlZddlZddlZddlmZ�ddl
mZmZmZmZmZmZ�ddlmZmZm Z m!Z!�ddl"T�ddlm#Z#�ddl
m$Z$m%Z%m&Z&m'Z'm(Z(�e)��Z*d	d
��Z+e�ddd
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.ZstringsZhycomstringsZboolsZ
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��Zdd��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_outZrestart_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�rdS�|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�}	td|�}
td	|�}t
d
�}t
d�}
t
d�}t
|jd
��}|�	dt
|	����td|	�}|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,���zrtofs.%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��(}
|
�
dtt|��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.NFzself.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�}|��dd
�}|����}
|�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�}td|�}|��|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
oceanftimeZoceanfhrZchosen_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����endZocean_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���zcommands %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�filestringtimeZarchvaZarchvbZsubregion_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�},tdJ|'�|)|d��tdJ|(�|*|d��tdJ|)�|+|d��tdJ|)�|,|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�.bzrestart_in.ar����zrestart_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����zforecast.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��Zrestart_in_aZrestart_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�	grb2indexZhmon_getkpdsZhmon_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	wgrib2locZgrb2indexlocr!��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
����}ddd
dddggddddddggg}|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���zSTORM.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�dd
|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	��tdd
|d��tdd
|d��tdd
|d��tdd
|d��tdd��"}|�d|�j|�j|�j|f���W�5�Q�R�X�t	|��
d��dk�}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(CD

.rG���c�����������������������s����e�Zd�Zdd��Zd3��fdd�	Zedd���Zd	d
��Zdd��Zd
d��Z	dd��Z
dd��Zdd��Zdd��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|��tdd
��(}
|
�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�}|��dd
�}|����}
|�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�}td|�}|��|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|ddd
��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
����}ddd
dddggddddddggg}|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�dd
|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�dS�)
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�tj
jd|d��tj
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}
|d7�}|	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|d7�}qH|�
d||t|�f���t
jjdd|dd��t
jjdd|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�fnameZfilenZreplacementsr�����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