o
    ™rf“I  ã                   @   s2  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 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rtdn|  d¡|d< |  d¡r‚dnd|d< |  d¡dkrdnd|d< |  d ¡ršd!nd"|d#< |  d$¡r¥dnd|d%< |  d&¡|d'< |  d(¡|d)< |  d*¡|d+< |  d,¡}|rÎd-|v rÎ||d.< nd/|d.< |  d0¡d1krÞd1|d2< n|  d0¡d3krêd1|d2< n|  d0¡d4krõd4|d2< | ||¡ | d5¡}|d1kr|  d6¡|  d7¡kr|jd8dd9 |  d:¡}|d;kr$d<}	nB|d=kr,d>}	n:|d?krE|  d@¡dAkr<dB}	n*tdCdD |¡ƒ n!|dEkr^|  d@¡dAkrUdF}	ntdCdG |¡ƒ ntdCdG |¡ƒ |	dk rstdCdH |¡ƒ |  dI¡}
|	}|
D ]<}|  | ¡ dJ ¡}|d ur·t	|	t	|ƒ ƒ}|t	|ƒ }||	kr§tdCdK |¡ƒ |j
| ¡ dL |d9 t||ƒ}q||  dM¡}|d urÜ|dNvrÜt	|	|  dO¡ ƒ}t||kdP ||¡ƒ dQ dRdS„ |  dT¡ dU¡D ƒ¡}|jdV|d9 |  dW¡}dX|v rdY}dZ}nd[|v rdY}d\}nd]|v rdY}d}nd}d^}|  d_¡}|dkrU|  d`¡dk rUdY|v rU|  da¡}|| }t	|| ƒ}|dk rGd}|jdb|d9 |jdc|d9 |  dd¡}|d ur‚|d^kr‚|d/kr‚|  de¡}df|v rv|}nt||ƒ}|jdg|d9 |  dh¡}|  di¡}t|djko•|dk  dk ||¡ƒ |  dl¡}t|dko«|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_necZPTS_MODEÚtrueÚfalseZsingle_columnÚTIMER_LEVELé   ÚposÚnegZtimer_levelZBFBFLAGÚonÚoffZbfbflagÚCONTINUE_RUNÚcontinue_runZATM_GRIDZ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ÚsatmZATM_NCPLzAActive atm should match shortest model timestep atmdt={} mindt={}Ú c                 s   s    | ]}t |ƒV  qd S )N)Ústr)Ú.0Úx© r=   úH/global/u1/q/qinyi/eagles_code/eaglesrrm/driver-mct/cime_config/buildnmlÚ	<genexpr>   s   € z(_create_drv_namelists.<locals>.<genexpr>ZRUN_STARTDATEú-Z	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atmdtZrun_startdateÚstop_optionZtprofoptionZ	tprofmultZtprof_totalÚstop_nÚstopnZtprofnZpauseoZpausenZesp_timeZ
info_mprofZinfo_taskmap_modelZinfo_mprof_dtr=   r=   r>   Ú_create_drv_namelists   sè   
 















€

ÿ 




$







þ
þrg   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ÚpathrU   Úget_case_rootÚexistsÚremoveÚwrite_output_file)rY   r\   r[   Údata_list_pathÚnamelist_filer=   r=   r>   rV   Ì   s
   
rV   c                 C   sx  i }i }ddg}|   d¡D ]'}||vr4|  |d ¡|| ¡ < |  |d ¡dkr.d|| ¡ < qd|| ¡ < qd|v rPt d	|d ¡rP|d d
|d  d¡… |d< tƒ  ¡ }|dkr®| d¡}|D ]M}	||	 }
d|	v r­t 	dd|
¡}
d|
kr­|	d
d… }|	dd… }|| s­|| s­d|	v r|  d¡dkrœt
 d |	¡¡ q`t|| || kd |||	¡ƒ q`tj |d¡}| |¡ d S )NÚCPLÚESPr5   Ú_GRIDÚnullTFÚatmzz\dr   Úzg       @Úseq_mapsÚmapnameú"r9   Ú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)rO   rJ   rS   ÚreÚmatchÚrfindr   Úget_versionÚget_group_variablesÚsubÚloggerÚwarningrN   r   rj   rk   rU   Úwrite_seq_maps)rY   r\   r[   Ú	gridvalueZignore_componentZexclude_listÚ
comp_classZgrid_versionÚgroup_variablesÚnamer/   Z
component1Z
component2Zseq_maps_filer=   r=   r>   rW   Õ   sD   €

€
þ€rW   c              	   C   sŠ  |   d¡}| d¡ | d¡}g }|D ]}tj ||¡}tj |¡r'| |¡ qt|ƒdkrÃi }|D ]A}i }	t	|ƒ-}
|
D ]"}d|v r_d|vr_| 
d¡d d d… \}}| ¡ }| ¡ }||	|< q=W d   ƒ n1 sjw   Y  |	||< q2t | ¡ 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 d S )NÚCASEROOTZdrv_flds_in_filesr   ú=ú!rI   ÚNAMELIST_DEFINITION_FILEÚ	componentÚdrv©Ú	attributez namelist_definition_drv_flds.xml)r]   T©Úskip_entry_loopÚCaseDocsÚdrv_flds_in)rJ   rR   Úget_defaultrj   rk   rU   ÚisfileÚappendÚlenÚopenÚ	partitionÚstripÚ	itertoolsÚcombinationsÚkeysÚcompare_drv_flds_inÚdirnamer   rL   ro   )rY   r\   r]   ÚcaserootZdrvflds_filesÚinfilesZdrvflds_filerZ   ZdictsÚdict_ÚmyfileÚliner   ÚvarÚfirstÚsecondr^   Údefinition_dirÚdefinition_filer—   r™   r=   r=   r>   rX     sF   



€
€ûÿ
ærX   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ÚprintrN   r   )r¬   r­   Zinfile1Zinfile2Z
sharedKeysÚkeyr=   r=   r>   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v r+t jd ntd	ƒ}d
}|  d¡r;|  d¡}|  d¡D ]š}| ¡ }t	| |ƒ‡}	i }
||
d< |	j
||
dd}|d
krl|dkrl|  d| ¡  ¡}n|}d}d
}||krË|d
krd |¡}|D ]}|	 |¡ q|  d¡d | }|	 d|¡ |  d¡}|	 d|¡ || d t|ƒ }|	 d|¡ |d | }|	 t j ||¡¡ |d
 }||ksvW d   ƒ n1 sÕw   Y  q@d S )Nr‘   r’   r“   r”   znamelist_definition_modelio.xmlÚ	CASEBUILDÚcplconfÚLIDz%y%m%d-%H%M%Sr   r   Ú	NINST_MAXr5   Tr–   ÚcplÚNINST_r9   z_{:04d}ÚEXEROOTú/ZdiriÚRUNDIRZdiroz.log.Úlogfilez_modelio.nml)rj   rk   r¥   rJ   rU   Úenvironr   rO   rS   r   rL   rP   rN   rR   rM   r:   Úwrite_modelio_file)rY   r]   r§   r®   r¯   r[   ÚlidÚmaxinstÚmodelr\   r^   ÚentriesZ
inst_countÚinst_stringZ
inst_indexÚentryZmoddiriZmoddiror½   Zmodelio_filer=   r=   r>   Ú#_create_component_modelio_namelists:  sL   



é€õ€þrÆ   c                 C   s–  |dkrt ‚tj |  d¡d¡}tj |¡st |¡ tj |dd¡}ttj |¡d |¡ƒ t	dd}| d	d
di¡g}tj |d¡}tj 
|¡rM|g}t| |ƒ}d}	|  d¡dv rf|  d¡}
d|
v rfd}	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.xmlr9   r6   )ÚcamZeamÚCAM_CONFIG_OPTSZ
aquaplanetz*aqua_planet = .true. 
 aqua_planet_sst = 1Úuser_nl_cplÚnamelist_infiler¼   ri   r˜   r™   r€   z	*modelio*)ÚAttributeErrorrj   rk   rU   rJ   ÚisdirÚmakedirsr   rN   r   r›   r   r   rg   rÆ   r	   Úglob)rY   r¦   r’   r[   Úuser_xml_dirr]   r¯   Úuser_definitionr\   Úinfile_textZcam_config_optsÚuser_nl_filerÍ   rZ   Úrundirr™   Úfilenamer=   r=   r>   Úbuildnmlr  sF   
ÿ





ÿrØ   c                  C   sD   t tjƒ} t| ƒ}t|| dƒ W d   ƒ d S 1 sw   Y  d S )Nr“   )r   ÚsysÚargvr   rØ   )r¦   rY   r=   r=   r>   Ú
_main_func­  s   

"ÿrÛ   Ú__main__)+Ú__doc__rj   rÙ   rÑ   r¡   r   rk   rU   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‡   rg   rV   rW   rX   r¤   rÆ   rØ   rÛ   r=   r=   r=   r>   Ú<module>   s2   ("
 2	0,	8;
ÿ