U Š÷ÎgN ã@s¨dZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddlZ ddlZddlZddlZddlZddlZddlZddlZddlmZddl mZmZmZmZmZmZddl m!Z!m"Z"m#Z#m$Z$ddl%Tddl m&Z&ddlm'Z'm(Z(m)Z)m*Z*m+Z+d d d d d gZ,e-ƒZ.dd„Z/e dddddd¡Z0dd „Z1dd „Z2dd„Z3dd„Z4Gdd „d ej5j6ƒZ7Gdd „d ej5j6ƒZ8Gdd „d ej5j6ƒZ9dS)z6HYCOM related initialization and post-processing 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_timedeltaÚdate_hycom2normalÚdate_normal2hycomÚ HYCOMInit1Ú HYCOMInit2Ú HYCOMPostcCs |rdSdS)NÚYESÚNO©)Úxrrú7/lfs/h1/ops/para/packages/hafs.v2.0.8/ush/hafs/hycom.pyÚyesnosrilé écCsrt|tƒrt|ƒ}t|tƒr.tj|dd}nmsz,HYCOMInit1.make_products..éÿÿÿÿgÅ@zhycom.{fahr:03d}.az{com}/{out_prefix}.{RUN}.{pn}©Zpnzhycom.{fahr:03d}.bÚ restart_outÚabÚ.Ú spin_archv_aÚ spin_archv_bú blkdat.inputú+{com}/{out_prefix}.{RUN}.hycom.blkdat.input)Úlogr rerRr2rkÚlistÚranger&rXrr5ÚcyclerZ init_file2aZ init_file2bÚtimestrr4rxr{r|Ú blkdat_input) rNÚloggerZfhrsZftimesÚftimeÚ prodnameAÚ filepathAÚ prodnameBÚ filepathBÚwhatryÚlocalrrsrrY^sVþ ÿ ÿ þzHYCOMInit1.make_productscCs|dkr dS|dkrdSdS)NérééÀr)rNZcychourrrrÚlast_lead_time_todayˆs zHYCOMInit1.last_lead_time_todaycCsb| ¡}|jj}t |j|j|jd¡}| d¡}|j}|  dt |ƒ¡|  d¡}|  d¡}|  d¡}|  dt |ƒ¡t |j|j|jddd¡} t |j dƒ} |  d t | ƒ¡|  d t | ƒ¡|j dkrâ|j||| d d } n|j||| | | d d } tj | ¡} d} t| ƒrd} |  dt | ƒ| f¡|j||| d d }tj |¡}|  dd¡}|sttj |j| d¡¡}tj |j|j¡}t|d|ddÂ}| d¡}d}| dkrTd}|j }|j }|  dt |ƒ|||f¡t|dƒ@}t|dƒ*}| |j|||||||||dd ¡W5QRXW5QRXttt | !d¡ƒdd|dt "dd ¡W5QRXd!S)"z.!Fills the RTOFS staging area with RTOFS data.rz%Y%m%dzFRD: inputs=%sZ ocean_datasetÚ ocean_nowÚ ocean_fcstzFRD: oceands=%srpzFRD: oceanatime=%szFRD: cyctime=%sÚa)rtry)rtr†ryrvzFRD1: zeroloc=%s zerostat=%d Ú RTOFS_STAGEr1z rtofs.%Y%m%dTF©Úkeepr…Úrm_firstz!{PARMhycom}/hafs_get_rtofs.nml.inz get_rtofs.nmlz6FRDa: dir0=%s starthr=%d endhr=%d lastleadtimetoday=%drAÚwtrŽ)rtZINDIR1ZINDIR2ZINDIR3ZSTARTHRZENDHRZLAST_LEAD_TIME_TODAYZhafs_get_rtofs©Zallranks©r…zget_rtofs.nml.0N)#rr5r‚r'ÚyearÚmonthÚdayÚstrftimeÚ rtofs_inputsÚinfoÚreprr7rÚhourÚlocateÚosr:ÚdirnamerÚjoinÚworkdirÚhafsÚnamelistZNamelistInserterrfrr2rCÚwriteÚparseÚcheckrunÚmpirunÚmpiÚgetexeÚrename)rNr…ÚcycZ rtofs_atimeZ rtofs_ymdÚinputsZoceandsr‘r’Z oceanatimeZcyctimeZzerolocZzerodirZzerostatZloc0Zdir0ÚoutdirÚniÚdZparminZparmoutZlastleadtimetodayZstarthrZendhrÚinfÚoutfrrrÚfind_rtofs_datas`             ýzHYCOMInit1.find_rtofs_datac CsF| ¡}d|_d|_z¶t|_t|j|j |ddˆ}| |¡t j j |  d¡|d|j jddt j j |  d ¡|dd }|  d |¡}t||d|d | |¡|j}tdƒ}t|jjƒ}td |ƒ}|  d||¡}|j d|d} |  d||¡} |j d| d} t|| d|d t| | d|d |j ¡D]B\}} | d¡\} }|j d| d|dd}| j||d|dq.|j ¡D]6\}} | d¡\} }|  d |¡}t||d|d q|d|_W5QRXt|_Wnttk r}z.|jdt|ƒfddt|_‚t  d¡W5d}~XYn(| d¡t|_‚t  d¡YnXdS)zxRuns the hycom initialization for hycominit1. Raises an exception if something goes wrong. Returns on success.NFTr•z{com}ršz./hycom_settings)Úfrominfoú{intercom}/hycominitrkú{intercom}/hycominit/©r–r…rúhafs_basin.{fahr:03d}.aú{intercom}/hycominit/{pn}rwúhafs_basin.{fahr:03d}.brzÚ{Ú}z {RUN}.hycom)ryrG)rnr¹r–r…ú2FATAL ERROR: Unhandled exception in ocean init: %s©Úexc_infoéú"FATAL ERROR: Failed in ocean init.)!rrVrWr Ústaterr§ÚscrubÚ select_domainÚprodutilÚfileopÚmakedirsrƒrkÚdeliverrÚ create_bc_icrGrKrr5r‚rrxr6Úsplitr Ú ExceptionÚcriticalr$r ÚsysÚexit)rNr…rµÚprodnameÚ locintercomrGrtr†r‡rˆr‰rŠÚprodrŒryÚlocr<rrrÚrunÓsn ÿ    ÿ  ÿÿ zHYCOMInit1.runcCs˜|jj}td|jjƒ}|j}|jd}|dd}t|d|jjƒ}d}d} d} d} | dkrl| dkrld} d} | d¡| |¡| d ¡| |¡dS) Ni «ÿÿrpirTéFzCreate subdomain from RTOFS.zSpin up analysis.)r5r‚rrSrXr Úrtofs_subset_bdry_initÚ rtofs_spin)rNr…Z thiscycleZ prevcycleZspinlenZfsecsrXÚendZ ocean_statusZboundary_conditions_from_rtofsZ same_domainZforce_coldstartZspinZcreate_subdomainrrrrÎ!s"     zHYCOMInit1.create_bc_icc Csä| dd¡}|jj}d}|dkr.|dkr.d}n´|dkrD|dkrDd}nž|dkrZ|dkrZd }nˆ|d krhd }nz|d krvd }nl|dkr„d}n^|dkr’d}nP|dkr d}nB|dkr®d}n4|dkr¼d}n&d|ttƒf}t |¡tj  |¡‚d|_ |j }|  d¡}d}t |dƒx} | D]l} |   ¡} t| ƒdkr@| d||  ¡f¡q | \} } }}| |kr | |j kr d}||_||_d}q W5QRX~ ~ |sÆd|t|ƒt|j ƒf}| |¡tj |¡‚t d ¡|  d!¡}d}t |dƒú}|D]î} |   ¡} t| ƒd"kr| d||  ¡f¡qä| \ }}}}}}}}}}}t|ƒ}t|ƒ}t|ƒ}t|ƒ}t|ƒ}t|ƒ}t|ƒ}||jkrä|  |¡d#kräd}||||f\|_|_|_|_||||f\|_|_|_|_ |||_!|_"qäW5QRX|sd$|t|jƒt|ƒf}| |¡tj |¡‚t d ¡|j#d%ks,t$‚|j% &|j#d&|j ¡|j% &|j#d'|j!¡|j% &|j#d(|j"¡|j% &|j#d)|j¡t d*d+ƒ}| 'd,j(f|j)Ž¡W5QRX| d-|||||||f¡t d.|j |j!|j|j"f¡dS)/NÚ hycom_domainÚsmallÚlarge©ÚALÚEPÚCPÚSLÚLSÚ nhc_basin©ÚWPÚIOÚ jtnh_basin©ÚSHÚSPZSIÚ jtsh_basinráÚ hat10_basinrâÚ hep20_basinrãÚ hcp70_basinrèÚ hwp30_basinréÚ hin40_basin©räråÚ hsn50_basinÚ hsp60_basinz=No ocean basin available for basin=%s lat=%s. Run uncoupled.Ú rtofs_gloú({PARMhycom}/hafs_hycom.application_tableFrAéú%s: ignore line %sTú.linkfrÙZhafs_rtofs_subregionrÅZhafs_isubregion2avgz$FATAL ERROR: Invalid ijgrid value %sz{FIXhycom}/%s.%s.regional.gridú regional.gridz{FIXhycom}/%s.%s.regional.depthúregional.depthz#{FIXhycom}/hafs_%s.%s.regional.gridzregional.subgridz${FIXhycom}/hafs_%s.%s.regional.depthzregional.subdepthr”r1rvr?rg ¬@z %Y%m%d_%H%M%Sz9{COMrtofs}/rtofs.{aYMD}/rtofs_glo.t00z.n{aHH}.archv.a.tgzz5{COMrtofs}/rtofs.{aYMD}/rtofs_glo.t00z.n{aHH}.archv.az5{COMrtofs}/rtofs.{aYMD}/rtofs_glo.t00z.n{aHH}.archv.bz./rtofs_glo.t00z.n{aHH}.archv.az./rtofs_glo.t00z.n{aHH}.archv.bz9{COMrtofs}/rtofs.{aYMD}/rtofs_glo.t00z.f{aHH}.archv.a.tgzz5{COMrtofs}/rtofs.{aYMD}/rtofs_glo.t00z.f{aHH}.archv.az5{COMrtofs}/rtofs.{aYMD}/rtofs_glo.t00z.f{aHH}.archv.bz./rtofs_glo.t00z.f{aHH}.archv.az./rtofs_glo.t00z.f{aHH}.archv.bTr$ú File %s exists, untar it into %súr:gzú%FATAL ERROR: Neither %s nor %s existsz archv_in.%d.az archv_in.%d.bzsubregion.%d.inzsubregion.%d.outr˜aÂarchv_in.%d.b hafs_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) rorš)*r#r r¡rrGrrr&r_ÚaliasÚbatchexer¯rÑr¨r rrÒrÓÚlinkabr5r‚r7rržr¢rƒr¤r:ÚexistsrÊrËrÚtarfilerCÚ extractallrªr`r]r^r[r\r¬)rNr…r²r(rrGrrÚcmdrr±r³ÚicountÚatypeZihrÚnowZfilestringtimeZ rtofsatgzZrtofsaZrtofsbZarchvaZarchvbÚtgzZ subregion_inZ subregion_outrHrršrrÚ¶s’    ÿÿÿÿ                ýöz!HYCOMInit1.rtofs_subset_bdry_initc CsD|jj}t|j d|ƒ}d}| d¡}| d¡}| d¡}| d¡}| d¡} tj |¡rptj j || d|d tj |¡r’tj j ||d|d n^tj |¡rÒ|  d ||f¡t   |d ¡} |  ¡W5QRXn| d ||f¡‚t d ¡|  dt|ƒ¡|  dt| ƒ¡|dkrDd} t | ¡tsDtsDtj | ¡‚| || dd|¡t ddƒ.} |  ¡|  ¡ ¡} t| dƒ}t|ƒ}W5QRX|  dt|ƒt|ƒt||ƒtt||ddƒtt t||ddƒƒt|ƒf¡t t||ddƒ|kr|  d¡| !dd¡n(|  d| "d¡| "d¡f¡| #|¡dS)Nrpéz8{COMrtofs}/rtofs.{aYMD}/rtofs_glo.t00z.n00.restart.a.tgzz4{COMrtofs}/rtofs.{aYMD}/rtofs_glo.t00z.n00.restart.az4{COMrtofs}/rtofs.{aYMD}/rtofs_glo.t00z.n00.restart.bz./rtofs_glo.t00z.n00.restart.az./rtofs_glo.t00z.n00.restart.bTr$r+r,r-rÅzrestart_in_a=%szrestart_in_b=%sz1WARNING: No hycom restart file found. Giving up.z restart_pre.aú restart_pre.brArùzjSOME STRING FOR WHICH TO GREP - ryd=%s spinstart=%s ryd-spinstart=%s to_fraction(...)=%s abs=%s epsilon=%s)Únegokz?Restart is at right time. Move restart_pre to restart_forspin.Ú restart_prerxzERestart is at wrong time (%s instead of %s). Will use archv2restart.ú%Y%m%d%H)$r5r‚rrSrƒr¤r:r1rÊrËrr r2rCr3rÑrÒrÓr¡rr Úallow_fallbacksZexpectr¨r ÚOceanRestartMissingÚrestart2restartÚreadlinerÏr%rrÚabsÚmoveabržÚ archv2restart)rNr…r±Z spinstartÚepsilonZrtofs_restart_atgzZrtofs_restart_aZrtofs_restart_bZ restart_in_aZ restart_in_br8rÚbfÚsplatZrydfZrydrrrrÛsh             ÿ    þ ÿzHYCOMInit1.rtofs_spincCs0|j}|tk r||kr|St|j|dƒdkS©Nrg{®Gáz„?©ÚblkdatÚ NO_DEFAULTrB©rNZflagnameÚdefaultrJrrrÚblkflagGs ÿzHYCOMInit1.blkflagcCsN| |¡}tjj|d|dd| ¡dtjj|d|dd| ¡ddS©Nú.aTr¼ú.b©rƒrÊrËrr©rNZsfromr'r&rrrÚcopyabNs ÿÿzHYCOMInit1.copyabcCs<t|d|dd| ¡dt|d|dd| ¡ddS©NrPFr¼rQ©rr©rNr&r'rrrrCUszHYCOMInit1.moveabcCsN| |¡}tjj|d|dd| ¡dtjj|d|dd| ¡ddS©NrPTr$rQ©rƒrÊrËrrrSrrrr0Ys ÿÿzHYCOMInit1.linkabc Cs‚|jdk r|jSt t¡}||_| d¡}t|ƒD}|D]8}t d|¡}|r8| d¡\}}t |ƒ}||  |¡q8W5QRX|jS©Nz?{PARMhycom}/hafs_{RUNmodIDout}.{gridlabelout}.fcst.blkdat.inputz^\s*(\S+)\s*'\s*(\S+)\s*' = r) rcÚ collectionsÚ defaultdictr€rƒrCrDrErFr%Úappend©rNrµr„rHrIrJÚvalZkwdrrrrJ`s     zHYCOMInit1.blkdatcCs|jddS©NÚbaclinr©rJ©rNrrrraoszHYCOMInit1.baclinc Csø| dd¡| dd¡| dd¡| dd¡|j}| dd¡tdƒrX| dd ¡ntd ƒrl| d d ¡td d |dtdd |dtdd |dtdd |dtd dƒ"}| d|j|j|j|f¡W5QRXt |  d¡ƒd k}t ||ddS)Nú:{FIXhycom}/hafs_{RUNmodIDout}.{gridlabelout}.regional.gridr)ú;{FIXhycom}/hafs_{RUNmodIDout}.{gridlabelout}.regional.depthr*zhafs_basin.000Z archv2r_inzrestart_forspin.bZrestart_forspinZ restart_inr:r<zarchv2restart.inT©r r…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) Zhafs_archv2restartrš) r0rarrrCrªr]r^rr3r¯r¬)rNr…raZarinr4rrrrDss8ÿÿÿÿ    õ zHYCOMInit1.archv2restartc CsÜ|jj}tddƒ6}| ¡ ¡}t|dƒ} | ¡ ¡} t| dƒ} W5QRXt| d¡ƒ} d| d¡|j f} | || | |j |j |j |j | df| dk}t||d t| d|d |d d \}}}t|d ƒ}t|dƒê}| ¡ d¡}| ¡ d¡}| d||f¡~~t| ddƒž}d }|rº| ¡}|rºt|ƒdkrLqº| d¡}| ¡ d¡}| dd¡ ¡}t|ƒdkr†qºd|dd…t|dƒt|dƒf}| |¡q&W5QRXW5QRXW5QRXdS)Núregional.grid.brArZhafs_restart2restartz restart.%s.%sr=rPz.b.oneršTr¼)é&iUiSr˜z z%s %s rhz min, max =r1rÅz%s %16.7E%16.7E rÙ)r5r‚rCrArÏr&r3r¯ržrr[r\r]r^r¬rr rªr Úreplacer%)rNZin_aZin_bZout_aZout_br…r±ZrgbfZidm_moreZ idmglobalZjdm_moreZ jdmglobalÚexrxr4ZncZwcbZtwcZroutfZglobalfÚline1Úline2ZregionfZgoZglineZrlinerGÚolinerrrr@šsJ    ÿÿ     ÿzHYCOMInit1.restart2restart)NrQ)Ú__name__Ú __module__Ú __qualname__rOrUrYrr¸rØrÎrÉÚpropertyrŸr#rÚrÛrKrNrTrCr0rJrarDr@Ú __classcell__rrrhrrHs0*DNn  \5   'cs¾eZdZdd„Zd)‡fdd„ Zedd„ƒZd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zefdd„Zdd„Zdd „Zd!d"„Zd#d$„Zed%d&„ƒZed'd(„ƒZ‡ZS)*rcCs t ¡dSrLrMrrrrrOÂrPzHYCOMInit2.remove_oceanNrQc svtt|ƒj|||fd|i|—Ž||_| ¡| dd¡|_d|_d|_d|_ d|_ d|_ d|_ d|_ d|_d|_dS)NrRrSr)rTrrUrXrYrZrSr[r\r]r^r_r`Ú_HYCOMInit2__rtofs_inputsZ_HYCOMInit2__rtofs_inputs_ymdÚ_HYCOMInit2__blkdatrdrhrrrUÄs"ÿÿzHYCOMInit2.__init__cCs8|jdkr2| dd¡}tj |j||jj¡}||_|jSr)rsr7r¨r r!r5r‚r"rrrrŸÕs   zHYCOMInit2.rtofs_inputsc CsÐ| ¡}tƒ|_ddddddddd d d g }|D]d}d D]Z}d ||f}| d|¡}t|j||j|d}||_||j|<| d||t |ƒf¡q6q.t|jd|j| d¡d|_ t|jd|j| d¡d|_ dS)rjÚairtmpÚprecipÚpresurÚradflxÚshwflxÚsurtmpÚtauewdÚtaunwdÚvapmixÚwndspdZriversryz forcing.%s.%sz{com}/{out_prefix}.{RUN}.rmz %s => %s (%s)Úlimitsz%{com}/{out_prefix}.{RUN}.hycom.limitsr}r~N) rr4Úforcing_productsr2r rerRrnÚdebugr¡rr„)rNr…ZffilesZffileryÚfileZcomfrÖrrrrYÝs: ÿ  þþzHYCOMInit2.make_productsc Cs¼|jj}d}| dd¡}| dd¡}| dd¡}|jj}|j}t|d|ƒ} | dd¡| d d ¡| || |d|||d |¡td d ƒ(} |  dt t |ƒƒt t | ƒƒf¡W5QRXdS)NrÚ adjust_riverÚ adjust_tempZforecast_forcing_intervalrorprdr)rer*Úfcstrr˜z %f %f false false ) r5r‚rZrXrr0Úrtofs_get_forcingrCrªr%r) rNr…r±Ú adjust_windrƒr„ÚintervalZ startdaterXÚenddateÚlimitfrrrÚmake_forecast_forcingûs2   ÿÿÿ   þz HYCOMInit2.make_forecast_forcingc Cs*| ¡}zªt|_t|j|j |dd~}| |¡| |¡tj j |  d¡|d|j   ¡D]&\}}|  d|¡}t||d|dq\td|  d¡d|dd|_W5QRXt|_Wnrtk rþ}z.|jd t|ƒfdd t|_‚t d ¡W5d }~XYn(| d ¡t|_‚t d ¡YnXd S)zxRuns the hycom initialization for hycominit2. Raises an exception if something goes wrong. Returns on success.Tr•rºršr»r¼z./limitsz{intercom}/hycominit/limitsrÂrÃrÅNrÆ)rr rÇrr§rÈrÉr‹rÊrËrÌrƒr€r6rrWr rÐrÑr$r rÒrÓ)rNr…rµÚnamerÖrÕr<rrrrØs> ÿ   ÿÿ zHYCOMInit2.runc Csä| dd¡}|jj}d}|dkr.|dkr.d}n´|dkrD|dkrDd}nž|dkrZ|dkrZd }nˆ|d krhd }nz|d krvd }nl|dkr„d}n^|dkr’d}nP|dkr d}nB|dkr®d}n4|dkr¼d}n&d|ttƒf}t |¡tj  |¡‚d|_ |j }|  d¡}d}t |dƒx} | D]l} |   ¡} t| ƒdkr@| d||  ¡f¡q | \} } }}| |kr | |j kr d}||_||_d}q W5QRX~ ~ |sÆd|t|ƒt|j ƒf}| |¡tj |¡‚t d ¡|  d!¡}d}t |dƒú}|D]î} |   ¡} t| ƒd"kr| d||  ¡f¡qä| \ }}}}}}}}}}}t|ƒ}t|ƒ}t|ƒ}t|ƒ}t|ƒ}t|ƒ}t|ƒ}||jkrä|  |¡d#kräd}||||f\|_|_|_|_||||f\|_|_|_|_ |||_!|_"qäW5QRX|sd$|t|jƒt|ƒf}| |¡tj |¡‚t d ¡|j#d%ks,t$‚|j% &|j#d&|j ¡|j% &|j#d'|j!¡|j% &|j#d(|j"¡|j% &|j#d)|j¡t d*d+ƒ}| 'd,j(f|j)Ž¡W5QRX| d-|||||||f¡t d.|j |j!|j|j"f¡dS)/NrÝrÞrßràrærçrêrërîrárïrârðrãrñrèròrérórôrõrözFWARNING: No ocean basin available for basin=%s lat=%s. Run uncoupled.r÷røFrArùrúTrûrÅrürýrrþÚ hycominit2rrrrGrkr˜rrrrrrrrrÉGsð ÿ     ÿ     ÿ  ÿ ÿÿÿ     õ ÿþzHYCOMInit2.select_domainc CsÄ| ¡}tdƒ}tdƒ}|jj}|}|j} d} | dd¡} | dd¡} tddd ƒD]4} |||kr`| j||||d }| d t | ƒt |ƒf¡| dkr°| j||||d }d } t |ƒræ| d t |ƒt |ƒt |ƒt |ƒf¡|S| dkr€t |g|| | dr2| d t |ƒt |ƒt |ƒt |ƒf¡|Sd|| f}|  |¡t j |¡‚t d¡n | dt |ƒt |ƒt |ƒf¡||}qRd| d¡|f}| ¡  |¡t j |¡‚t d¡dS)Ni`Tr9rZ max_grib_waiti„Zgrib_sleep_timeéiöÿÿÿrv)rtr†zLooking for: %s - %srÙz%s %s %s => %s)r…ÚmaxwaitÚ sleeptimez@FATAL ERROR: %s: did not exist or was too small after %d secondsrÅz %s<=%s+%sz>FATAL ERROR: Cannot find file for time %s; first file tried %sr=)rrr5r‚rŸrZrr£r r¡rrrÑr¨r Ú NoOceanDatarÒrÓr rž)rNÚatmosdsÚgridÚtimer…ZsixhrsrEZatime0rtZrinputZglocsetrrZitryZglocZgloc0rrrrÚgetges1¸sV  þ þ       zHYCOMInit2.getges1c(CsX|dkr,d}| d¡}| d¡}| d¡}n"d}| d¡}| d¡}| d ¡}|jj} t|d ƒ} td ƒ} t||ƒd |d} d tt| ƒƒg} || }|| }|| }tt|  d ¡ƒƒ}tt|  d¡ƒƒ}|  d ¡}|  d¡}t j   |¡rø|d}|dkr d}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 }|  d(¡}tƒ}||krr| |||¡}| d)¡d*}t|d+|d,t||d-|d+d.|  d/| d)¡|d0|d0f¡d1| d)¡}| d2||||||f¡|| 7}qØtd3d4ƒ}| d5 |¡¡W5QRXtt jd6ƒ}| d7|¡t j d8d9¡} | d9krÖ|  d:d9¡} | d9krìtj d:¡} tt| ƒd;d+d<}!t|!ƒtd=d4ƒ}"|" d5 | ¡¡W5QRXtd>d4ƒ}#|# d?||f¡W5QRXtd@d4ƒ}$|$ dA¡W5QRX|  dB¡}tt jd6ƒ}| dC|¡tƒ}t ddDƒD]"}%dE|%}&| dF||%|&f¡qªtdGd4ƒ}'|' d5 |¡¡W5QRXt j d8d9¡} | d9kr|  d:d9¡} | d9kr.tj d:¡} tt| ƒdHd+d<}!t|!ƒ| !|¡dS)INZanalrÙZatmos1_datasetZ atmos1_fluxZ atmos1_gridroZatmos2_datasetZ atmos2_fluxZ atmos2_gridrpr9z%d Úwgrib2Ú grb2indexz /grb2indexz hour fcstZaveZUFLXZsurface)ZFLUXZLEVELZTYPEZVFLXÚTMPz2 m above groundr…ZSPFHZPRATEZUGRDz10 m above groundZVGRDZSHTFLZLHTFLZDLWRFZULWRFZDSWRFZUSWRFZPRESZLANDZPRMSLz sea levelzhafs_gfs2ofsinputs.pyr=z.sfcflxTrfz.in2)r…r%z%s %s %s %s %s Únonezgfs2outputs.%s.outz%%s %s %s %s %s < /dev/null > %s 2>&1 úcommand.file.previewr˜r1Z TOTAL_TASKSzCALLING gfs2ofsinputs %d Ú MPISERIALz *MISSING*Ú mpiserial)ú-mršr™z listflx.datz intp_pars.dataÓ &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 / zjpdt_table.datz8 8 0 0 8 0 0 0 0 8 8 8 8 0 0 0Z hafs_gfs2ofs2zCALLING gfs2ofs2 %d rýzgfs2ofs.%d.outz%s %d > %s 2>&1 úcommand.file.preview_gfs2ofs)rrž)"r7r5r‚rrr&Úroundr.r3r¯r¤r:ÚisdirrŸr€r•ržrrr]rCrªr¦Úenvironr ÚgetrÊrËÚfind_exer­r®r¬rÚofs_timeinterp_forcing)(rNZdate1Zdate2Úmoder…Úihoursr’Z atmos_fluxZ atmos_gridr±ZhoursteprEÚnmZlistflxZrdate1Zrdate2Zstopdater–r—Z wgrib2locZ grb2indexlocZTYPExrZdateir²r4ÚcommandsZsfZflxfileZ g2oinputs_outZcfpfÚttZmpiserial_pathZcmd2ZlistflxfZippdfÚjÚiZ gfs2ofs_outÚfidrrrÚofs_seasforce4çsÖ                            ï  ÿÿ          ÷        zHYCOMInit2.ofs_seasforce4c Cs¶d}d}d}t|dƒŠ}| ¡}|D]*}|dkr$| d¡dkr$|dd…}qPq$|dkrnd|f}tj |¡‚| |¡|D]}|d7}| |¡r||d7}q|W5QRX|||||fS)NrrAÚspané z(%s: could not find data records in file.rÙ)rCÚtellrr¨r ÚOceanDataInvalidÚseek) rNÚfilenameÚ num_timesZblinesÚanamer¶ÚstartrIrrrrÚofs_forcing_infous$      zHYCOMInit2.ofs_forcing_infoc Csˆtjjd|ddddD]X}dD]N}d|d|}tj |¡r d|d|}| d ||f¡t ||¡q qW5QRXtt t |  d ¡ƒƒƒ}d d d dddggd d ddddggg}|D]È\}} d|f} |  | ¡\} } } } | D]ž}d|f}d|f}|  |¡\} }}}|| | ||||g}dd„|Dƒ}d  |¡d}| d|t|ƒf¡t|dƒ}| |¡W5QRXt||k|dqâqºdS)NÚtempT)r…r—) rurvrwrxryrzr{r|r}r~ryz ../forcing.rzzforcing.z Move %s => %sZhafs_timeinterp_forcingrvrurwrzr}r~r{r|rxryztemp/forcing.%s.bztimeinterp_forcing.%s.incSsg|] }t|ƒ‘qSr©r$©rqr«rrrru©sz5HYCOMInit2.ofs_timeinterp_forcing..Ú z %s: write %sr˜rš)rÊÚcdrr¤r:r1r r°r.r­r®r¯r·r¦r¡rCrªr¬)rNr…Zofieldryr&r'r¤ZxfieldZifieldZofieldsZifileÚ_r´ÚiheadZtfileZofileÚ num_framesZoheadÚsnamer²Ztfrrrr¤‰s8  ÿ ü     z!HYCOMInit2.ofs_timeinterp_forcingc Cs–| d¡\}}}}| d¡\}}}}||||g}d dd„|Dƒ¡d}tddƒ}| |¡W5QRX| dd ¡| d ¡} tt| ƒdk|d dS) Nzforcing.surtem.bzforcing.airtmp.br»cSsg|] }t|ƒ‘qSrr¹rºrrrruµsz2HYCOMInit2.ofs_correct_forcing..zcorrect_forcing.inr˜zforcing.airtmpzforcing.airtm1Úhafs_correct_forcingrš)r·r¦rCrªrCr¯r¬r3) rNr…r½r¿r¾rÀrµr²ZcfifrÁrrrÚofs_correct_forcing±s    zHYCOMInit2.ofs_correct_forcingcCs0|j}|tk r||kr|St|j|dƒdkSrHrIrLrrrrN¼s ÿzHYCOMInit2.blkflagc  Csü| dd¡} | dd¡} | dd¡} | dd¡} | dt|ƒt|ƒt|ƒf¡d} | sl| sl| sl| d¡n„d } | d ¡t| d ¡d d |dt| d¡dd |dt| d¡dd |dt| d¡dd |d| ||||¡|rð| |¡| d kr| dd¡| d¡d } n | d¡|d krøtddƒ}|  ¡  ¡}|d}W5QRX|dkrj| d¡nŽ|  |¡|dkrø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 rvzNo atmospheric forcing createdrzCreate atmospheric forcing.z {FIXhycom}/ismus_msk1760x880.datzismus_msk1760x880.datTr¼z!{FIXhycom}/ismus_msk3072x1536.datzismus_msk3072x1536.datz {FIXhycom}/ismus_msk1440x721.datzismus_msk1440x721.datz {FIXhycom}/ismus_msk1440x720.datzismus_msk1440x720.datz;{FIXhycom}/hafs_{RUNmodIDout}.{gridlabelout}.forcing.riverszforcing.riversz"Station River Forcing Files copiedz$River Forcing Files are not employedz ../tmpvitrArŽÚSz0Hurricane too shallow to run parameterized windsrÙzforcing.wndspd.azforcing.wndspd.a.originalzforcing.wndspd.bzforcing.wndspd.b.originalzforcing.tauewd.azforcing.tauewd.a.originalzforcing.tauewd.bzforcing.tauewd.b.originalzforcing.taunwd.azforcing.taunwd.a.originalzforcing.taunwd.bzforcing.taunwd.b.originalzforcing.wdspd1.azforcing.wdspd1.bzforcing.tauew1.azforcing.tauew1.bzforcing.taunw1.azforcing.taunw1.bzRename %s to %s)rNr r¡rÚicstrr­rÂrTrCrArÏZofs_windforcingr¤r°)rNZsrtdater‰Zintvlrƒr„r‡r¥r…rÃrÄrÅrÆZforcingfilesmaderrrGÚdepthZrenamemeZifromZitorrrr†Ãsj    ÿ     ÿ         ô zHYCOMInit2.rtofs_get_forcingcCsN| |¡}tjj|d|dd| ¡dtjj|d|dd| ¡ddSrOrRrSrrrrTs ÿÿzHYCOMInit2.copyabcCs<t|d|dd| ¡dt|d|dd| ¡ddSrUrVrWrrrrC szHYCOMInit2.moveabcCsN| |¡}tjj|d|dd| ¡dtjj|d|dd| ¡ddSrXrYrSrrrr0s ÿÿzHYCOMInit2.linkabc Cs‚|jdk r|jSt t¡}||_| d¡}t|ƒD}|D]8}t d|¡}|r8| d¡\}}t |ƒ}||  |¡q8W5QRX|jSrZ) rtr[r\r€rƒrCrDrErFr%r]r^rrrrJs     zHYCOMInit2.blkdatcCs|jddSr`rbrcrrrra$szHYCOMInit2.baclin)NrQ)rnrorprOrUrqrŸrYr‹rØrÉr•r­r·r¤rÂrKrNr†rTrCr0rJrarrrrrhrrÁs. 6q/( @ cs>eZdZdZd ‡fdd„ Zdd„Zedd„ƒZd d „Z‡Z S) rzRRuns the ocean post-processor on the HyCOM output, in parallel with the model.rQc s(tt|ƒj|||f|Ž||_d|_dS)NF)rTrrUrXÚ _ncks_path)rNrer5rfrXrgrhrrrU,szHYCOMPost.__init__cCs6|j}| ¡}tt|ƒdddd||fdk|ddS)Nz-Oz-4z-LÚ6z /dev/nullrš)Ú ncks_pathrr¬Úbigexe)rNÚsourceÚtargetÚncksr…rrrÚ copy_ncks1s ÿzHYCOMPost.copy_nckscCsV|jdkrP| dd¡}|js,tjjddd}|dksJt|tƒrF|dksJt‚||_|jS)zÑReturns the path to ncks. Returns None if ncks cannot be found. This function will only search for ncks once, and will cache the result. Set self._ncks_path=False to force a recheck.FrÐr1)Ú raise_missingN)rÊr¯rÊrËr£r#r$r)rNrÐrrrrÌ7s  ÿÿzHYCOMPost.ncks_pathc1 Cs8 | ¡}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 }qfW5QRX|  d| | | ||f¡d|||f}tjj|ddd| ¡dtjj|ddd| ¡dd|||f}tjj|ddd| ¡dtjj|ddd| ¡d|  d¡|jj}d }t|d|ƒ}| d¡}t|jjƒ}td |ƒ}| d||¡}|jd|d}| d||¡}|jd|d}|  d|¡d }d!}tjj||d|dtjj||d|dtd"d#ƒ8}| d$|t |jƒt |jƒt |jƒt |jƒ|f¡W5QRX|  d%¡d&|}d"|g}td'd(ƒ4} |D](}!t|!ƒ}"|  |" ¡¡W5QRXqÞW5QRXt| ƒt| ƒt| ƒd)œ}#td'ƒR}td*d(ƒ<}$|D]0} |# ¡D]\}%}&|  |%|&¡} qP|$ | ¡qDW5QRXW5QRXd+| d,¡|f}'|'d-}(tt | !d.¡ƒj"|(d/ƒ})t#|)d*k|d0| $|(| %d1|(¡¡d2}d3}*|||*k rt|d|ƒ}| d¡}|jd4kr”d5|}+d6 &|+d7g¡},d }-d8}.|-|.krŠt'j( )d9|,¡r^qŠn(|-d:}-| *d;t|,ƒ|-f¡t+ ,d<¡q<|-|.kr¶| -d=t|,ƒ|-f¡‚t. /d>¡|  dt|+ƒ¡d6 &d9|+dg¡}/d6 &d9|+dg¡}0d }d!}tjj|/|d|dtjj|0|d|dtd"d#ƒ8}| d$|t |jƒt |jƒt |jƒt |jƒ|f¡W5QRX|  d%¡d&|}d"|g}td'd(ƒ4} |D](}!t|!ƒ}"|  |" ¡¡W5QRXqŽW5QRXt| ƒt| ƒt| ƒd)œ}#td'ƒR}td*d(ƒ<}$|D]0} |# ¡D]\}%}&|  |%|&¡} q|$ | ¡qôW5QRXW5QRXd+| d,¡|f}'|'d-}(tt | !d?¡ƒj"|(d/ƒ})t#|)d*k|d0| $|(| %d1|(¡¡d@|}+d6 &|+d7g¡},d }-d8}.|-|.krt'j( )d9|,¡rÔqn(|-d:}-| *d;t|,ƒ|-f¡t+ ,d<¡q²|-|.kr,| -d=t|,ƒ|-f¡‚t. /d>¡|  dt|+ƒ¡d6 &d9|+dg¡}/d6 &d9|+dg¡}0dA}dB}tjj|/|d|dtjj|0|d|dtd"d#ƒ8}| d$|t |jƒt |jƒt |jƒt |jƒ|f¡W5QRX|  dC¡dD|}d"|g}td'd(ƒ4} |D](}!t|!ƒ}"|  |" ¡¡W5QRXqW5QRXt| ƒt| ƒt| ƒd)œ}#td'ƒR}td*d(ƒ<}$|D]0} |# ¡D]\}%}&|  |%|&¡} qv|$ | ¡qjW5QRXW5QRXdE| d,¡|f}'|'d-}(tt | !dF¡ƒj"|(dGƒ})t#|)d*k|d0| $|(| %d1|(¡¡|d27}qì|  dH¡W5QR£dISQRXdIS)Jz5Called from the ocean post job to run the HyCOM post.Tr•z {FIXhycom}z {PARMhycom}z{out_prefix_nodate}rlrAz^export idm=(.*)$rz^export jdm=(.*)$z^export kdm=(.*)$z^export gridlabelout=(.*)$rBz>POSTINFO- idm=%d jdm=%d kdm=%d gridlabelout=%s RUNmodIDout=%s z%s/hafs_%s.%s.regional.gridrPzregional.grid.ar$rQrgz%s/hafs_%s.%s.regional.depthzregional.depth.azregional.depth.bz%Convert hafs_basin.000.[ab] to NetCDFrpz%Y_%j_%Hr½r¾rwr¿z"Will create ocean products for %s zarchv.azarchv.bZtopzfiler˜zž%s NetCDF %d 'yyyy' = year %d 'month ' = month %d 'day ' = day %d 'hour ' = hour %d 'verfhr' = verification hour zDo Volume HEREz%s/hafs_hycom.archv2data_3z.inZ tempinfileÚw)z&idmz&jdmz&kdmÚinfilez%s.hycom.3z.f%03dz{out_prefix}.{RUN}z.ncZhafs_archv3z2nc)ZCDF051ršz{com}/rogš™™™™™¹?)rrrrŽzarchv.%sr1z.txté´z../../forecast/rÙz%WARNING: Cannot find file %s %d timesr¯z3FATAL ERROR: Cannot find file %s %d times - exitingrÅZhafs_archv2data3zzarchs.%szarchs.azarchs.bzDo SURFACE HEREz%s/hafs_hycom.archv2data_2d.inz%s.hycom.2d.f%03dZhafs_archv2data2d)ZCDF001zfinishing up hereN)0rr rÇrr§rÈrXrƒrCrDrEr&rFr rÊrËrr5r‚rržrrªr›rœrr¢Úreadr¡r6rir.r3r¯r9r¬rÑrÈr¦r¤r:r1r r”ÚsleeprÑrÒrÓ)1rNr…rµrXZFIXhycomZ PARMhycomZopnZhycomsettingsfileZhsfrIrJr]r^rrrGr&ZstimeZnavtimeZarchtimeZarchtimestringrtr†r‡rˆr‰rŠZarchxaZarchxbr¶ZparmfileÚ filenamesZiffÚfnameZfilenÚ replacementsr·ÚsrcZtargÚoutfileZ outfileNCZ archv2datarEZnotabinZlogfileZ timessleptÚsleepmaxZafileÚbfilerrrrØFsx           ÿÿÿÿ     &ù   &  "      &ù   &  "    &ù   &  "  z HYCOMPost.run)rQ) rnrorpÚ__doc__rUrÑrqrÌrØrrrrrhrr(s  ):rßrDrÒr¤Úglobr'Úmathr)r[Ú subprocessr2Úprodutil.fileoprÊÚ produtil.logÚprodutil.clusterÚtcutil.numericsÚtcutilZ hafs.inputr¨Z hafs.namelistZ hafs.hafstaskÚhafs.exceptionsr”ÚshutilÚ produtil.cdrrrrrrrÚprodutil.datastorer r r r Ú produtil.runrrrrrrÚ__all__ÚobjectrKrr+rrr@rKZhafstaskZHAFSTaskrrrrrrrÚs@H     }k