U
    ™rf“I  ã                   @   s0  d Z ddlZddlZddlZddlZddlZej ej ej 	e
¡¡ddd¡Zej ej edd¡¡ ddlT ddlmZ dd	lmZ dd
lmZmZ ddlmZmZmZ ddlmZmZ ddlmZ ddlmZ e  e!¡Z"dd„ Z#dd„ Z$dd„ Z%dd„ Z&dd„ Z'dd„ Z(dd„ Z)dd„ Z*e!dkr,e*ƒ  dS ) z$Namelist creator for CIME's driver.
é    Nz..ÚcimeÚscriptsÚTools)Ú*)ÚCase)ÚNamelistGenerator)ÚexpectÚ	safe_copy)Ú	get_modelÚget_time_in_secondsÚget_timestamp)Úcreate_namelist_infileÚparse_input)ÚFiles)ÚGridsc                  C   sœ  i }t ƒ |d< |  d¡ d¡d |d< |  d¡|d< |  d¡|d< |  d	¡|d	< |  d
¡|d
< |  d¡|d< |  d¡|d< |  d¡|d< |  d¡|d< |  d¡|d< |  d¡|d< |  d¡rÀdnd|d< |  d¡|d< |  d¡dkrèdn|  d¡|d< |  d¡rdnd|d< |  d¡dkr"dnd|d< |  d ¡r:d!nd"|d#< |  d$¡rRdnd|d%< |  d&¡|d'< |  d(¡|d)< |  d*¡|d+< |  d,¡}|r¨d-|kr¨||d.< nd/|d.< |  d0¡d1krÊd1|d2< n2|  d0¡d3kräd1|d2< n|  d0¡d4krüd4|d2< | ||¡ | d5¡}|d1kr@|  d6¡|  d7¡kr@|jd8dd9 |  d:¡}|d;krZd<}	n„|d=krjd>}	nt|d?krœ|  d@¡dAkrŠdB}	ntdCdD |¡ƒ nB|dEkrÎ|  d@¡dAkr¼dF}	ntdCdG |¡ƒ ntdCdG |¡ƒ |	dk røtdCdH |¡ƒ |  dI¡}
|	}|
D ]x}|  | ¡ dJ ¡}|d k	r
t	|	t	|ƒ ƒ}|t	|ƒ }||	kr`tdCdK |¡ƒ |j
| ¡ dL |d9 t||ƒ}q
|  dM¡}|d k	rÊ|dNkrÊt	|	|  dO¡ ƒ}t||kdP ||¡ƒ dQ dRdS„ |  dT¡ dU¡D ƒ¡}|jdV|d9 |  dW¡}dX|krdY}dZ}n0d[|kr*dY}d\}nd]|kr>dY}d}nd}d^}|  d_¡}|dkr¼|  d`¡dk r¼dY|kr¼|  da¡}|| }t	|| ƒ}|dk r d}|jdb|d9 |jdc|d9 |  dd¡}|d k	r|d^kr|d/kr|  de¡}df|krþ|}n
t||ƒ}|jdg|d9 |  dh¡}|  di¡}t|djko<|dk  dk ||¡ƒ |  dl¡}t|dkoh|d>kdm |¡ƒ t| ||ƒ t| ||ƒ t| ||ƒ d S )nNÚ
cime_modelÚCOMPSETÚ_r   ZiyearZCCSM_BGCZBGC_MODEZCPL_I2O_PER_CATZCOMP_RUN_BARRIERSZDRV_THREADINGZ	CPL_ALBAVZ	CPL_EPBALZ	FLDS_WISOZBUDGETSÚMACHÚMPILIBÚMULTI_DRIVERz.true.z.false.ÚOSÚGLC_NECZglc_necÚPTS_MODEÚtrueÚfalseZsingle_columnÚTIMER_LEVELé   ÚposÚnegZtimer_levelZBFBFLAGÚonÚoffZbfbflagÚCONTINUE_RUNÚcontinue_runÚATM_GRIDÚatm_gridZLND_GRIDZlnd_gridÚCOMP_OCNZcompocnÚ	DOCN_MODEÚaquaZaqua_planet_sst_typeÚnoneÚRUN_TYPEÚstartupÚrun_typeÚhybridÚbranchÚ
start_typeÚCASEÚRUN_REFCASEZbrnch_retain_casename)ÚvalueÚNCPL_BASE_PERIODÚhouri  Údayi€Q ÚyearZCALENDARZNO_LEAPi€3áFz)Invalid CALENDAR for NCPL_BASE_PERIOD {} Údecadei Ìz-invalid NCPL_BASE_PERIOD NCPL_BASE_PERIOD {} z0basedt invalid overflow for NCPL_BASE_PERIOD {} ÚCOMP_CLASSESZ_NCPLz& {} ncpl doesn't divide base dt evenlyZ_cpl_dtÚCOMP_ATM)ZdatmÚxatmÚsatmÚATM_NCPLzAActive atm should match shortest model timestep atmdt={} mindt={}Ú c                 s   s   | ]}t |ƒV  qd S )N)Ústr)Ú.0Úx© rA   úH/global/u1/q/qinyi/eagles_code/eaglesrrm/driver-mct/cime_config/buildnmlÚ	<genexpr>   s     z(_create_drv_namelists.<locals>.<genexpr>ÚRUN_STARTDATEú-Ú	start_ymdÚSTOP_OPTIONÚnyearÚndaysim  Únmonthé   ÚndayÚneverZTPROF_TOTALZ	STOP_DATEÚSTOP_NZtprof_optionZtprof_nZPAUSE_OPTIONZPAUSE_NZnstepZ
esp_cpl_dtZ
INFO_MPROFZINFO_TASKMAP_MODELé   z]Node-level memory profiling (INFO_MPROF={:d}) expects positive INFO_TASKMAP_MODEL, given {:d}ZINFO_MPROF_DTz;Expected INFO_MPROF_DT between 0 and 86400 secs; given {:d})r
   Ú	get_valueÚsplitÚinit_defaultsÚ	set_valuer   ÚformatÚ
get_valuesÚupperÚintÚadd_defaultÚlowerÚminÚjoinr   Úwrite_drv_in_fileÚwrite_seq_maps_fileÚwrite_drv_flds_in_file) ÚcaseÚinfileÚconfdirÚnmlgenÚfilesÚconfigÚ	docn_moder/   Úncpl_base_periodZbasedtÚcompsZmindtÚcompÚncplZcpl_dtZtotaldtZcomp_atmZatmdtÚrun_startdateÚstop_optionZtprofoptionZ	tprofmultZtprof_totalÚstop_nÚstopnZtprofnZpauseoZpausenZesp_timeZ
info_mprofZinfo_taskmap_modelZinfo_mprof_dtrA   rA   rB   Ú_create_drv_namelists   sì    
 















 ÿ 




$







 ÿÿ
þrn   c                 C   sH   t j |  ¡ dd¡}t j |¡r*t  |¡ t j |d¡}| ||¡ d S )NÚ	Buildconfzcpl.input_data_listÚdrv_in)ÚosÚpathr[   Úget_case_rootÚexistsÚremoveÚwrite_output_file)r_   rb   ra   Údata_list_pathÚnamelist_filerA   rA   rB   r\   Ì   s
    
r\   c                 C   s~  i }i }ddg}|   d¡D ]N}||kr|  |d ¡|| ¡ < |  |d ¡dkr\d|| ¡ < qd|| ¡ < qd|kr t d	|d ¡r |d d
|d  d¡… |d< tƒ  ¡ }|dkrb| d¡}|D ]ž}	||	 }
d|	krÂt 	dd|
¡}
d|
krÂ|	d
d… }|	dd… }|| sÂ|| sÂd|	kr@|  d¡dkr`t
 d |	¡¡ qÂt|| || kd |||	¡ƒ qÂtj |d¡}| |¡ d S )NÚCPLÚESPr8   Ú_GRIDÚnullTFÚatmzz\dr   Úzg       @Úseq_mapsÚmapnameú"r=   Úidmapé   é   é   Zrof2ocn_r&   Údocnz4   NOTE: ignoring setting of {}=idmap in seq_maps.rczHNeed to provide valid mapping file between {} and {} in xml variable {} úseq_maps.rc)rU   rP   rY   ÚreÚmatchÚrfindr   Úget_versionÚget_group_variablesÚsubÚloggerÚwarningrT   r   rq   rr   r[   Úwrite_seq_maps)r_   rb   ra   Ú	gridvalueZignore_componentZexclude_listÚ
comp_classZgrid_versionÚgroup_variablesÚnamer2   Z
component1Z
component2Zseq_maps_filerA   rA   rB   r]   Õ   sD    



  ÿÿr]   c              
   C   st  |   d¡}| d¡ | d¡}g }|D ](}tj ||¡}tj |¡r&| |¡ q&t|ƒdkrpi }|D ]n}i }	t	|ƒP}
|
D ]D}d|kr|d|kr|| 
d¡d d d… \}}| ¡ }| ¡ }||	|< q|W 5 Q R X |	||< qft | ¡ d¡D ]\}}t|| || ||ƒ qæi }tj |j ddd	id
¡}tj |d¡g}t| ||d}d}|j|||d tj |dd¡}| |¡ d S )NÚCASEROOTZdrv_flds_in_filesr   ú=ú!rO   ÚNAMELIST_DEFINITION_FILEÚ	componentÚdrv©Ú	attributez namelist_definition_drv_flds.xml)rc   T©Úskip_entry_loopÚCaseDocsÚdrv_flds_in)rP   rX   Úget_defaultrq   rr   r[   ÚisfileÚappendÚlenÚopenÚ	partitionÚstripÚ	itertoolsÚcombinationsÚkeysÚcompare_drv_flds_inÚdirnamer   rR   rv   )r_   rb   rc   ÚcaserootZdrvflds_filesÚinfilesZdrvflds_filer`   ZdictsÚdict_ÚmyfileÚliner”   ÚvarÚfirstÚsecondrd   Údefinition_dirÚdefinition_filerž   r    rA   rA   rB   r^     s<    




r^   c                 C   s`   t |  ¡ ƒ | ¡ ¡}|D ]@}| | || krtd || | || ¡ƒ tdd ||¡ƒ qd S )Nz%Key: {}, 
 Value 1: {}, 
 Value 2: {}Fz9incompatible settings in drv_flds_in from 
 {} 
 and 
 {})Úsetrª   ÚintersectionÚprintrT   r   )r³   r´   Zinfile1Zinfile2Z
sharedKeysÚkeyrA   rA   rB   r«   1  s
    r«   c              
   C   sª  g }t j |jdddid¡}t j |d¡g}t j |  d¡d¡}dt jkrVt jd ntd	ƒ}d
}|  d¡rv|  d¡}|  d¡D ]"}| ¡ }t	| |ƒ}	i }
||
d< |	j
||
dd}|d
krÜ|dkrÜ|  d| ¡  ¡}n|}d}d
}||krš|d
krd |¡}|D ]}|	 |¡ q
|  d¡d | }|	 d|¡ |  d¡}|	 d|¡ || d t|ƒ }|	 d|¡ |d | }|	 t j ||¡¡ |d
 }qèW 5 Q R X q€d S )Nr˜   r™   rš   r›   znamelist_definition_modelio.xmlÚ	CASEBUILDÚcplconfÚLIDz%y%m%d-%H%M%Sr   r   Ú	NINST_MAXr8   Tr   ÚcplÚNINST_r=   z_{:04d}ÚEXEROOTú/ZdiriÚRUNDIRZdiroz.log.Úlogfilez_modelio.nml)rq   rr   r¬   rP   r[   Úenvironr   rU   rY   r   rR   rV   rT   rX   rS   r>   Úwrite_modelio_file)r_   rc   r®   rµ   r¶   ra   ÚlidÚmaxinstÚmodelrb   rd   ÚentriesZ
inst_countÚinst_stringZ
inst_indexÚentryZmoddiriZmoddirorÄ   Zmodelio_filerA   rA   rB   Ú#_create_component_modelio_namelists:  sB    





rÍ   c                 C   sš  |dkrt ‚tj |  d¡d¡}tj |¡s6t |¡ tj |dd¡}ttj |¡d |¡ƒ t	dd}| d	d
di¡g}tj |d¡}tj 
|¡rš|g}t| |ƒ}d}	|  d¡dkrÌ|  d¡}
d|
krÌd}	tj |d¡}tj |d¡}t| |||	ƒ |g}t| ||||ƒ t| |ƒ |  d¡}ttj |d¡|ƒ tj |dd¡}tj 
|¡r\t||ƒ ttj |d¡|ƒ t tj |d¡¡D ]}t||ƒ q„d S )Nrš   r»   r¼   Ú
SourceModszsrc.drvzuser_xml_dir {} does not exist Úmct)Úcomp_interfacer˜   r™   znamelist_definition_drv.xmlr=   r9   )ÚcamÚeamÚCAM_CONFIG_OPTSZ
aquaplanetz*aqua_planet = .true. 
 aqua_planet_sst = 1Úuser_nl_cplÚnamelist_infilerÃ   rp   rŸ   r    r‡   z	*modelio*)ÚAttributeErrorrq   rr   r[   rP   ÚisdirÚmakedirsr   rT   r   r¢   r   r   rn   rÍ   r	   Úglob)r_   r­   r™   ra   Úuser_xml_dirrc   r¶   Úuser_definitionrb   Úinfile_textÚcam_config_optsÚuser_nl_filerÕ   r`   Úrundirr    ÚfilenamerA   rA   rB   Úbuildnmlr  sD    
ÿ





rá   c               	   C   s.   t tjƒ} t| ƒ}t|| dƒ W 5 Q R X d S )Nrš   )r   ÚsysÚargvr   rá   )r­   r_   rA   rA   rB   Ú
_main_func­  s    

rä   Ú__main__)+Ú__doc__rq   râ   rÙ   r¨   rˆ   rr   r[   r¬   ÚabspathÚ__file__Ú	_CIMEROOTr£   Ústandard_script_setupÚ	CIME.caser   ÚCIME.nmlgenr   Ú
CIME.utilsr   r	   r
   r   r   ÚCIME.buildnmlr   r   ÚCIME.XML.filesr   ÚCIME.XML.gridsr   ÚloggingÚ	getLoggerÚ__name__rŽ   rn   r\   r]   r^   r«   rÍ   rá   rä   rA   rA   rA   rB   Ú<module>   s.   ("
 2	0,	8;
