- Timestamp:
- 09/17/19 10:55:34 (5 years ago)
- Location:
- trunk/libIGCM
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/libIGCM/ins_job
r1475 r1489 359 359 echo "Directory ${j}/${JobName} exists already. It will not be overwritten." 360 360 echo "Remove the existing directory or change JobName before relaunching ins_job." 361 continue 361 #continue 362 exit 362 363 fi 363 364 echo "=> Submit directory ${JobName} will be created with cards from EXPERIMENTS/${config_UserChoices_ExpType}" … … 370 371 fi 371 372 rm -f ${j}/${F_CFG} 372 rm -f ${j}/${F_CFG_ENS}373 # rm -f ${j}/${F_CFG_ENS} 373 374 rm -f ${j}/${F_CFG}.bak 374 375 j=${j}/${JobName} … … 452 453 # Limited to hindcast/forecast and date restart Ensemble for the time being 453 454 if [ ${x_e} = 'true' ] ; then 455 if [ ! -f ${F_CFG_ENS} ] ; then 456 echo "" 457 echo "################## WARNING ##################" 458 echo "No ensemble.card available in current directory" 459 echo "" 460 exit 461 # continue 462 fi 463 454 464 #.. Read input data from ensemble.card .. 455 465 SUBMIT_DIR=${SUBMIT_DIR_ENS} … … 460 470 IGCM_ensemble_Init 461 471 462 if [[ ${ensemble_Ens_PARAMETRIC_active} = 'y' ]] ; then463 echo "WARNING: Parametric Ensemble is not implemented yet..."464 fi465 466 472 if [[ ${ensemble_Ens_DATE_active} = 'y' ]] ; then 467 473 IGCM_sys_Cd ${SUBMIT_DIR} … … 469 475 # As it says 470 476 IGCM_sys_Cd ${SUBMIT_DIR} 471 IGCM_ensemble_DatePeriodicStarts472 # As it says473 IGCM_sys_Cd ${SUBMIT_DIR}474 477 IGCM_ensemble_DateNonPeriodicStarts 475 # Clean476 IGCM_sys_Rm -rf ${RUN_DIR}477 478 fi 478 479 … … 484 485 IGCM_ensemble_CastPeriodicStarts 485 486 # As it says 486 IGCM_sys_Cd ${SUBMIT_DIR} 487 IGCM_ensemble_CastNonPeriodicStarts 488 # As it says 489 IGCM_sys_Cd ${SUBMIT_DIR} 490 IGCM_ensemble_CastMemberList 491 # Done 492 #IGCM_sys_Cp ${RUN_DIR}/CreatedDir.txt ${SUBMIT_DIR} 493 IGCM_sys_Cd ${SUBMIT_DIR} 494 # Clean 495 IGCM_sys_Rm -rf ${RUN_DIR} 496 fi 487 #IGCM_sys_Cd ${SUBMIT_DIR} 488 #IGCM_ensemble_CastMemberList 489 fi 490 # Done 491 IGCM_sys_Cd ${SUBMIT_DIR} 492 # Clean 493 IGCM_sys_Rm -rf ${RUN_DIR} 494 497 495 fi 498 496 #- -
trunk/libIGCM/libIGCM_ensemble/libIGCM_ensemble.ksh
r1475 r1489 21 21 # IPSL (2014) 22 22 # 23 # >>> Uniform DATE and PERTURB ensemble (remove old, useless), ADD some functions <<< 24 # add : IGCM_ensemble_InitRunDir, IGCM_ensemble_FilesUpdate (unique function) 25 # DATE ensemble : removed periodic case 26 # : all dates are NON-periodic 27 # CAST PERTURBED ensemble : removed NON-periodic case 28 # : all casts are periodic (*Y or *M) 29 # : removed Ens_PERTURB_PERTU_MAP_LIST case 30 # 31 # Author: Simona Flavoni & Nicola Lebas 32 # Contact: Simona.Flavoni__at__locean-ipsl.upmc.fr 33 # IPSL (2019) 23 34 #************************************************************** 24 35 … … 30 41 IGCM_card_DefineVariableFromOption ${F_CFG_ENS} Ens_PERTURB active 31 42 IGCM_card_DefineVariableFromOption ${F_CFG_ENS} Ens_DATE active 32 IGCM_card_DefineVariableFromOption ${F_CFG_ENS} Ens_PARAMETRIC active 43 44 Job_Period=10 # PARAMETER USED in function IGCM_ensemble_FilesUpdate 33 45 34 46 IGCM_debug_Print 1 "Ens_PERTURB ACTIVE = ${ensemble_Ens_PERTURB_active}" 35 47 IGCM_debug_Print 1 "Ens_DATE ACTIVE = ${ensemble_Ens_DATE_active}" 36 IGCM_debug_Print 1 "Ens_PARAMETRIC ACTIVE = ${ensemble_Ens_PARAMETRIC_active}"37 48 echo "" 38 49 … … 48 59 } 49 60 50 # Set Alphanumerical variables ajust to member nb 51 function IGCM_ensemble_SetAlpha 52 { 53 IGCM_debug_PushStack "IGCM_ensemble_SetAlpha" 54 55 set -A Alpha A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 56 set -A AlphaMonth a b c d e f g h i j k l 57 58 IGCM_debug_PopStack "IGCM_ensemble_SetAlpha" 59 } 60 61 ############### Perturb ENSEMBLE ################# 62 function IGCM_ensemble_CastInit 63 { 64 IGCM_debug_PushStack "IGCM_ensemble_CastInit" 65 61 62 ############### ENSEMBLE ################# 63 function IGCM_ensemble_InitRunDir 64 { 65 66 if [ -d ${SUBMIT_DIR}/${JobName} ] ; then 67 IGCM_debug_Print 3 "STOP directory ${SUBMIT_DIR}/${JobName} already exists." 68 exit # SF: stop at this point because in ENSEMBLE case need to be stopped 69 fi 66 70 IGCM_sys_Mkdir ${RUN_DIR} 67 71 … … 76 80 IGCM_sys_Cp ${SUBMIT_DIR}/Qclean.* ${RUN_DIR} 77 81 fi 82 83 } 84 85 ############### Create Member Directory ENSEMBLE ################# 86 function IGCM_ensemble_CreateMemberDir 87 { 88 89 # if [ ! -d ${SUBMIT_DIR}/${StartDir}/${MemberDir} ] ; then 90 IGCM_sys_Mkdir ${SUBMIT_DIR}/${StartDir}/${MemberDir} 91 IGCM_sys_Cd ${SUBMIT_DIR}/${StartDir}/${MemberDir} 92 ln -s ../../COMP 93 ln -s ../../PARAM 94 ln -s ../../POST 95 ln -s ../../DRIVER 96 IGCM_sys_Cd ${RUN_DIR} 97 IGCM_sys_Cp config.card run.card.init ${SUBMIT_DIR}/${StartDir}/${MemberDir} 98 IGCM_sys_Cp Job_${config_UserChoices_JobName} ${SUBMIT_DIR}/${StartDir}/${MemberDir}/${JobName} 99 100 # Dump command to be lauched 101 echo "cd ${StartDir}/${MemberDir}/ ;" >> ${RUN_DIR}/Qsub.${StartDir}.sh 102 echo "${SUBMIT} ${JobName} ; cd -" >> ${RUN_DIR}/Qsub.${StartDir}.sh 103 104 echo "cd ${StartDir}/${MemberDir}/ ;" >> ${RUN_DIR}/Qclean.latestPackperiod.${StartDir}.sh 105 echo "${libIGCM}/clean_latestPackperiod.job ; cd -" >> ${RUN_DIR}/Qclean.latestPackperiod.${StartDir}.sh 106 107 echo "cd ${StartDir}/${MemberDir}/ ;" >> ${RUN_DIR}/Qclean.PeriodLength.${StartDir}.sh 108 echo "${libIGCM}/clean_PeriodLength.job ; cd -" >> ${RUN_DIR}/Qclean.PeriodLength.${StartDir}.sh 109 110 } 111 112 113 ############### FilesUpdate ENSEMBLE ################# 114 function IGCM_ensemble_FilesUpdate 115 { 116 IGCM_debug_PushStack "IGCM_ensemble_FilesUpdate" 117 118 # Debug Print : 119 echo 120 IGCM_debug_Print 1 "IGCM_ensemble_FilesUpdate :" 121 122 EnsembleType=${1} 123 MemberNb=${2} 124 HumanDateBegin=$( IGCM_date_ConvertFormatToHuman ${3} ) 125 HumanDateEnd=$( IGCM_date_ConvertFormatToHuman ${4} ) 126 HumanRestartDate=$( IGCM_date_ConvertFormatToHuman ${5} ) 127 if [[ X${6} != "X" ]]; then 128 initFrom=${6} # non periodic config (INITFROM could be different between members) 129 else 130 initFrom=$(eval echo $\ensemble_Ens_${EnsembleType}_INITFROM) # periodic (same INITFROM value) 131 fi 132 133 if [[ X${7} != "X" ]]; then 134 initPath=${7} # non periodic config (INITPATH could be different between members) 135 else 136 initPath=$(eval echo $\ensemble_Ens_${EnsembleType}_INITPATH) # periodic (same INITPATH value) 137 fi 78 138 79 ## Init some variables 80 CastPeriodicStart=false 81 CastNonPeriodicStart=false 82 CastRestartNonPer=false 83 CastLengthNonPer=false 139 # ==> config.card 140 # [ENSEMBLE] 141 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card Ensemble EnsembleRun 'y' 142 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card Ensemble EnsembleName $(eval echo $\ensemble_Ens_${EnsembleType}_NAME) 143 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card Ensemble EnsembleDate ${HumanDateBegin} 144 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card Ensemble EnsembleType "Ens_${EnsembleType}" 84 145 85 # Useful? 86 #if [ -f ${SUBMIT_DIR}/CreatedDir.txt ] ; then 87 # IGCM_sys_Cp ${SUBMIT_DIR}/CreatedDir.txt ${RUN_DIR} 88 #fi 89 # Useful? 90 #if [ -f ${SUBMIT_DIR}/Qsub.sh ] ; then 91 # IGCM_sys_Cp ${SUBMIT_DIR}/Qsub.sh ${RUN_DIR} 92 #fi 93 echo ${PWD} 146 # [UserChoices] 147 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card UserChoices JobName ${MemberDir} 148 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card UserChoices DateBegin ${HumanDateBegin} 149 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card UserChoices DateEnd ${HumanDateEnd} 150 # Adhoc exceptioN for CMIP6 : update realisation number in member field. 151 if ( [ X"$( echo ${config_UserChoices_ExpType} | grep CMIP6 )" != "X" ] ) ; then 152 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card UserChoices Member "r${MemberNb}i1p1f1" 153 fi 154 155 # [Restarts] 156 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card Restarts OverRule "n" 157 # [ATM/OCE/...] 158 for comp in ${config_ListOfComponents[*]} ; do 159 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card ${comp} Restart "y" 160 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card ${comp} RestartDate ${HumanRestartDate} 161 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card ${comp} RestartJobName ${initFrom} 162 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card ${comp} RestartPath ${initPath} 163 164 # Adhoc exception for CMIP6 : exclude XIOS from the restart overrule mechanism. 165 if ( [ X${comp} = XIOS ] && [ X"$( echo ${config_UserChoices_ExpType} | grep CMIP6 )" != "X" ] ) ; then 166 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card ${comp} Restart "n" 167 fi 168 done 169 170 unset initFrom 171 172 # ==> Job 173 sed -e "s/\(#.*Script_Output_\)${config_UserChoices_JobName}\(\.*\)/\1${MemberDir}\2/" \ 174 -e "s/\(#.*\)${config_UserChoices_JobName}\(\.*\)/\1${MemberDir} \2/" \ 175 -e "s/^PeriodNb=.*/PeriodNb=${Job_Period}/" \ 176 ${SUBMIT_DIR}/${StartDir}/${MemberDir}/Job_${MemberDir} > Job_${MemberDir}.tmp 177 IGCM_sys_Mv Job_${MemberDir}.tmp ${SUBMIT_DIR}/${StartDir}/${MemberDir}/Job_${MemberDir} 178 179 IGCM_debug_PopStack "IGCM_ensemble_FilesUpdate" 180 } 181 182 183 ############### Perturb ENSEMBLE ################# 184 function IGCM_ensemble_CastInit 185 { 186 IGCM_debug_PushStack "IGCM_ensemble_CastInit" 187 188 IGCM_ensemble_InitRunDir 189 190 ## Init some variables (only periodic case) 191 CastPeriodicStart=true 192 193 echo " pwd id : ${PWD}" 94 194 95 195 IGCM_card_DefineVariableFromOption ${F_CFG_ENS} Ens_PERTURB active … … 98 198 IGCM_card_DefineVariableFromOption ${F_CFG_ENS} Ens_PERTURB END_INIT 99 199 IGCM_card_DefineVariableFromOption ${F_CFG_ENS} Ens_PERTURB PERIODICITY 100 IGCM_card_DefineArrayFromOption ${F_CFG_ENS} Ens_PERTURB NONPERIODIC101 IGCM_card_DefineArrayFromOption ${F_CFG_ENS} Ens_PERTURB RESTART_NONPERIODIC102 200 IGCM_card_DefineVariableFromOption ${F_CFG_ENS} Ens_PERTURB LENGTH 103 IGCM_card_DefineArrayFromOption ${F_CFG_ENS} Ens_PERTURB LENGTH_NONPERIODIC104 201 IGCM_card_DefineVariableFromOption ${F_CFG_ENS} Ens_PERTURB MEMBER 105 IGCM_card_DefineArrayFromOption ${F_CFG_ENS} Ens_PERTURB PERTU_MAP_LIST106 202 IGCM_card_DefineArrayFromOption ${F_CFG_ENS} Ens_PERTURB MEMBER_NAMESLIST 107 203 IGCM_card_DefineVariableFromOption ${F_CFG_ENS} Ens_PERTURB MEMBER_INITFROM … … 122 218 IGCM_debug_Print 1 "END_INIT = ${ensemble_Ens_PERTURB_END_INIT}" 123 219 IGCM_debug_Print 1 "PERIODICITY = ${ensemble_Ens_PERTURB_PERIODICITY}" 124 IGCM_debug_Print 1 "NONPERIODIC = ${ensemble_Ens_PERTURB_NONPERIODIC[*]}"125 IGCM_debug_Print 1 "RESTART_NONPERIODIC=${ensemble_Ens_PERTURB_RESTART_NONPERIODIC[*]}"126 220 IGCM_debug_Print 1 "LENGTH = ${ensemble_Ens_PERTURB_LENGTH}" 127 IGCM_debug_Print 1 "LENGTH_NONPERIODIC= ${ensemble_Ens_PERTURB_LENGTH_NONPERIODIC[*]}"128 221 IGCM_debug_Print 1 "MEMBER = ${ensemble_Ens_PERTURB_MEMBER}" 129 IGCM_debug_Print 1 "PERTU_MAP_LIST = ${ensemble_Ens_PERTURB_PERTU_MAP_LIST[*]}"130 222 IGCM_debug_Print 1 "MEMBER_NAMESLIST = ${ensemble_Ens_PERTURB_MEMBER_NAMESLIST[*]}" 131 223 IGCM_debug_Print 1 "MEMBER_INITFROM = ${ensemble_Ens_PERTURB_MEMBER_INITFROM}" … … 139 231 IGCM_debug_Print 1 "ListOfComponents = ${config_ListOfComponents[*]}" 140 232 141 ### Retro compatibility with former param name ###142 if [ X"${ensemble_Ens_PERTURB_MEMBER_LIST[0]}" != "XOption" ];143 then144 if [ X"${ensemble_Ens_PERTURB_PERTU_MAP_LIST[0]}" = "XOption" ];145 then146 ensemble_Ens_PERTURB_PERTU_MAP_LIST=${ensemble_Ens_PERTURB_MEMBER_LIST}147 IGCM_debug_Print 1 "WARNING: PERTU_MAP_LIST is deprecacated, please use PERTURB_PERTU_MAP_LIST instead."148 else149 IGCM_debug_Print 1 "WARNING: both PERTURB_PERTU_MAP_LIST and PERTU_MAP_LIST are specified!"150 IGCM_debug_Print 1 "Ignore PERTU_MAP_LIST which is deprecated."151 fi152 fi153 ####### End of retro compatibility code #######154 233 155 234 ### Check unset variables and set them to empty 156 235 # Following var are set because they could be unset in some 157 236 # use case (ex: non periodic if periodic is active...) 158 if [[ X"${ensemble_Ens_PERTURB_RESTART_NONPERIODIC[0]}" = "XOption" || X"${ensemble_Ens_PERTURB_RESTART_NONPERIODIC[0]}" = "X" ]];159 then160 ensemble_Ens_PERTURB_RESTART_NONPERIODIC[0]=_0_161 CastRestartNonPer=false162 else163 CastRestartNonPer=true164 fi165 if [[ X"${ensemble_Ens_PERTURB_PERTU_MAP_LIST[0]}" = "XOption" || X"${ensemble_Ens_PERTURB_PERTU_MAP_LIST[0]}" = "X" ]];166 then167 ensemble_Ens_PERTURB_PERTU_MAP_LIST[0]=_0_168 fi169 if [[ X"${ensemble_Ens_PERTURB_LENGTH_NONPERIODIC[0]}" = "XOption" || X"${ensemble_Ens_PERTURB_LENGTH_NONPERIODIC[0]}" = "X" ]];170 then171 CastLengthNonPer=false172 ensemble_Ens_PERTURB_LENGTH_NONPERIODIC[0]=_0_173 else174 CastLengthNonPer=true175 fi176 if [ X"${ensemble_Ens_PERTURB_NONPERIODIC[0]}" = "XOption" ];177 then178 ensemble_Ens_PERTURB_NONPERIODIC[0]=_0_179 fi180 237 if [[ "${ensemble_Ens_PERTURB_PERIODICITY}" = _0_ || "${ensemble_Ens_PERTURB_PERIODICITY}" = '' ]]; 181 238 then … … 223 280 ;; 224 281 esac 225 IGCM_ensemble_SetAlpha ${ensemble_Ens_PERTURB_MEMBER}226 282 227 283 # A few checks Period case: … … 251 307 esac 252 308 253 ################################254 if [[ ${#ensemble_Ens_PERTURB_NONPERIODIC[*]} != ${#ensemble_Ens_PERTURB_RESTART_NONPERIODIC[*]} && CastRestartNonPer = "true" ]] ; then255 IGCM_debug_Exit "IGCM_ensemble_CastInit: NONPERIODIC and RESTART_NONPERIODIC lists have different sizes"256 IGCM_debug_Verif_Exit257 fi258 if [[ ${#ensemble_Ens_PERTURB_NONPERIODIC[*]} > 0 ]] && [[ ${ensemble_Ens_PERTURB_NONPERIODIC[0]} != _0_ ]]; then259 DateNonPeriodicStart=true260 261 # Use LENGTH if no NONPERIODIC_LENGTH given262 if [[ ${#ensemble_Ens_PERTURB_LENGTH_NONPERIODIC[*]} < ${#ensemble_Ens_PERTURB_NONPERIODIC[*]} || ${ensemble_Ens_PERTURB_LENGTH_NONPERIODIC[0]} = _0_ ]] ; then263 IGCM_debug_Print 1 "WARNING: LENGTH_NONPERIODIC is not fill (or not correctly). Use LENGTH value '${ensemble_Ens_PERTURB_LENGTH}' for all NONPERIODIC runs"264 echo "WARNING: LENGTH_NONPERIODIC is not fill (or not correctly). Use LENGTH value '${ensemble_Ens_PERTURB_LENGTH}' for all NONPERIODIC runs"265 DateNum=0266 while [ ${DateNum} -lt ${#ensemble_Ens_PERTURB_NONPERIODIC[*]} ] ; do267 ensemble_Ens_PERTURB_LENGTH_NONPERIODIC[${DateNum}]=${ensemble_Ens_PERTURB_LENGTH}268 (( DateNum = DateNum + 1 ))269 done270 fi271 # Check lengths272 DateNum=0273 while [ ${DateNum} -lt ${#ensemble_Ens_PERTURB_NONPERIODIC[*]} ] ; do274 # - Check LENGTH_NONPERIODIC275 case ${ensemble_Ens_PERTURB_LENGTH_NONPERIODIC[${DateNum}]} in276 _0_)277 IGCM_debug_Print 1 "non-periodic start not active"278 CastNonPeriodicStart=false279 break280 ;;281 *[Yy]|*[Mm])282 IGCM_debug_Print 1 "Non-periodic duration : ${ensemble_Ens_PERTURB_LENGTH_NONPERIODIC[${DateNum}]}"283 CastNonPeriodicStart=true284 ;;285 *)286 IGCM_debug_Exit "IGCM_ensemble_CastInit ${ensemble_Ens_PERTURB_LENGTH_NONPERIODIC[${DateNum}]} : invalid LENGTH"287 IGCM_debug_Exit "choose in *Y or *M"288 IGCM_debug_Verif_Exit ;;289 esac290 (( DateNum = DateNum + 1 ))291 292 # - Check RESTART_NONPERIODIC293 if [[ DateNonPeriodicStart ]]; then294 case ${ensemble_Ens_PERTURB_RESTART_NONPERIODIC[${DateNum}]} in295 _0_)296 IGCM_debug_Exit "IGCM_ensemble_CastInit ${ensemble_Ens_PERTURB_RESTART_NONPERIODIC[${DateNum}]} : invalid NON PERIODIC RESTART"297 IGCM_debug_Verif_Exit ;;298 esac299 fi300 done301 302 # Use INITFROM if no INITFROM_NONPERIODIC given303 if [ ${#ensemble_Ens_PERTURB_INITFROM_NONPERIODIC[*]} -lt ${#ensemble_Ens_PERTURB_NONPERIODIC[*]} ] ; then304 IGCM_debug_Print 1 "WARNING: INITFROM_NONPERIODIC is not fill (or not correctly). Use INITFROM value '${ensemble_Ens_PERTURB_INITFROM}' for all NONPERIODIC runs"305 DateNum=0306 while [ ${DateNum} -lt ${#ensemble_Ens_PERTURB_NONPERIODIC[*]} ] ; do307 ensemble_Ens_PERTURB_INITFROM_NONPERIODIC[${DateNum}]=${ensemble_Ens_PERTURB_INITFROM}308 (( DateNum = DateNum + 1 ))309 done310 fi311 312 # Use INITPATH if no INITPATH_NONPERIODIC given313 if [ ${#ensemble_Ens_PERTURB_INITPATH_NONPERIODIC[*]} -lt ${#ensemble_Ens_PERTURB_NONPERIODIC[*]} ] ; then314 IGCM_debug_Print 1 "WARNING: INITPATH_NONPERIODIC is not fill (or not correctly). Use INITPATH value '${ensemble_Ens_PERTURB_INITPATH}' for all NONPERIODIC runs"315 DateNum=0316 while [ ${DateNum} -lt ${#ensemble_Ens_PERTURB_NONPERIODIC[*]} ] ; do317 ensemble_Ens_PERTURB_INITPATH_NONPERIODIC[${DateNum}]=${ensemble_Ens_PERTURB_INITPATH}318 (( DateNum = DateNum + 1 ))319 done320 fi321 else322 IGCM_debug_Print 1 "Non-Periodic start NOT ACTIVE"323 DateNonPeriodicStart=false324 fi325 ################################326 327 # A few checks for the Non-Periodic case:328 329 # A few checks for the PERTU_MAP_LIST case:330 case ${ensemble_Ens_PERTURB_PERTU_MAP_LIST[0]} in331 _0_)332 IGCM_debug_Print 1 "list of perturbation maps not active"333 CastMemberList=false334 ;;335 *)336 if [ ${CastPeriodicStart} = "true" ] ; then337 IGCM_debug_Exit "list of perturbation maps for periodic start not implemented, will stop execution"338 IGCM_debug_Verif_Exit339 elif [ ${CastNonPeriodicStart} = "true" ] ; then340 IGCM_debug_Exit "list of perturbation maps for non periodic start not implemented, will stop execution"341 IGCM_debug_Verif_Exit342 fi343 344 # test that MEMBER_NAMESLIST and PERTU_MAP_LIST have the same size345 346 if [ ${#ensemble_Ens_PERTURB_PERTU_MAP_LIST[*]} -ne ${#ensemble_Ens_PERTURB_MEMBER_NAMESLIST[*]} ] ; then347 IGCM_debug_Exit "number of elements in PERTU_MAP_LIST and MEMBER_NAMESLIST differ"348 IGCM_debug_Verif_Exit349 fi350 351 IGCM_debug_Print 1 "list of perturbation maps : ${ensemble_Ens_PERTURB_PERTU_MAP_LIST[*]}"352 IGCM_debug_Print 1 "list of members names : ${ensemble_Ens_PERTURB_MEMBER_NAMESLIST[*]}"353 CastMemberList=true354 ;;355 esac356 357 # IGCM_debug_Exit "fin du test PERTU_MAP_LIST"358 # IGCM_debug_Verif_Exit359 360 309 # Need to know all the restart filename of the component we will apply the noise to 361 310 IGCM_card_DefineArrayFromOption config.card ListOfComponents ${PerturbComp} … … 399 348 400 349 # - Determine number of day(s) in LENGTH 401 Dur eeLengthInDays=$(( $( IGCM_date_DaysInCurrentPeriod ${DateBegin} ${ensemble_Ens_PERTURB_LENGTH} ) - 1 ))350 DurationLengthInDays=$(( $( IGCM_date_DaysInCurrentPeriod ${DateBegin} ${ensemble_Ens_PERTURB_LENGTH} ) - 1 )) 402 351 403 352 # - Determine DateEnd 404 (( DateEnd = $( IGCM_date_AddDaysToGregorianDate ${DateBegin} ${Dur eeLengthInDays} ) ))353 (( DateEnd = $( IGCM_date_AddDaysToGregorianDate ${DateBegin} ${DurationLengthInDays} ) )) 405 354 406 355 # - Build directory name 407 IGCM_ensemble_CastDirectoryName ${ensemble_Ens_PERTURB_NAME} ${ensemble_Ens_PERTURB_PERIODICITY} $year $month $StartDir 356 #SF IGCM_ensemble_CastDirectoryName ${ensemble_Ens_PERTURB_NAME} ${ensemble_Ens_PERTURB_PERIODICITY} ${year} ${month} ${StartDir} 357 IGCM_ensemble_CastDirectoryName ${ensemble_Ens_PERTURB_NAME} ${ensemble_Ens_PERTURB_PERIODICITY} ${year} ${month} 358 # StartDir="${ensemble_Ens_PERTURB_NAME}" 408 359 409 360 # - Determine RestartDate … … 428 379 429 380 # - Loop over members 430 i=0 431 while [ $i -lt ${ensemble_Ens_PERTURB_MEMBER} ] ; do 432 MemberDir="${StartDir}${Alpha[$i]}" 381 i=1 382 while [ $i -le ${ensemble_Ens_PERTURB_MEMBER} ] ; do 383 if [ $((i)) -le 9 ] ; then 384 MemberDir="${StartDir}"-0"$((i))" 385 else 386 MemberDir="${StartDir}-$((i))" 387 fi 433 388 echo 434 389 IGCM_debug_Print 3 "${MemberDir}" … … 438 393 # * Create directory if it doesn't exist and copy/link files 439 394 if [ ! -d ${SUBMIT_DIR}/${StartDir}/${MemberDir} ] ; then 440 IGCM_sys_Mkdir ${SUBMIT_DIR}/${StartDir}/${MemberDir} 441 IGCM_sys_Cd ${SUBMIT_DIR}/${StartDir}/${MemberDir} 442 ln -s ../../COMP 443 ln -s ../../PARAM 444 ln -s ../../POST 445 ln -s ../../DRIVER 446 IGCM_sys_Cd ${RUN_DIR} 447 IGCM_sys_Cp config.card run.card.init ${SUBMIT_DIR}/${StartDir}/${MemberDir} 448 IGCM_sys_Cp Job_${config_UserChoices_JobName} ${SUBMIT_DIR}/${StartDir}/${MemberDir}/${JobName} 449 450 # Dump command to be lauched 451 echo "cd ${StartDir}/${MemberDir}/ ;" >> ${RUN_DIR}/Qsub.${StartDir}.sh 452 echo "${SUBMIT} ${JobName} ; cd -" >> ${RUN_DIR}/Qsub.${StartDir}.sh 453 454 echo "cd ${StartDir}/${MemberDir}/ ;" >> ${RUN_DIR}/Qclean.PeriodLength.${StartDir}.sh 455 echo "${libIGCM}/clean_PeriodLength.job ; cd -" >> ${RUN_DIR}/Qclean.PeriodLength.${StartDir}.sh 395 396 # * Create ${SUBMIT_DIR}/${StartDir}/${MemberDir} directories 397 # link COMP PARAM POST and DRIVER 398 # cp config.card, run.card.init, Job_ 399 # and Dump command to be launched 400 IGCM_ensemble_CreateMemberDir 456 401 457 402 # * Update files : config.card, Job_, COMP/comp.card 458 IGCM_ensemble_ CastFilesUpdate ${DateBegin} ${DateEnd} ${RestartDate}403 IGCM_ensemble_FilesUpdate "PERTURB" ${i} ${DateBegin} ${DateEnd} ${RestartDate} 459 404 460 405 # * Apply noise on restart file … … 468 413 IGCM_sys_Cp ${RUN_DIR}/Qsub.${StartDir}.sh ${SUBMIT_DIR} 469 414 IGCM_sys_Cp ${RUN_DIR}/Qclean.PeriodLength.${StartDir}.sh ${SUBMIT_DIR} 415 IGCM_sys_Cp ${RUN_DIR}/Qclean.latestPackperiod.${StartDir}.sh ${SUBMIT_DIR} 470 416 471 417 # - Next DateBegin … … 482 428 } 483 429 484 function IGCM_ensemble_CastNonPeriodicStarts485 {486 IGCM_debug_PushStack "IGCM_ensemble_CastNonPeriodicStarts"487 488 #.. Manage non periodic starts => Loop over DateBegin ..489 # ==========================490 491 [ ${CastNonPeriodicStart} = false ] && return492 493 echo494 IGCM_debug_Print 1 "Manage non periodic starts"495 496 DateNum=0497 # ... Loop over ensemble_Ens_PERTURB_NONPERIODIC ...498 echo ">${DateNum}<"499 echo ">${#ensemble_Ens_PERTURB_NONPERIODIC[*]}<"500 while [ ${DateNum} -lt ${#ensemble_Ens_PERTURB_NONPERIODIC[*]} ] ; do501 DateBegin=${ensemble_Ens_PERTURB_NONPERIODIC[${DateNum}]}502 Duree=${ensemble_Ens_PERTURB_LENGTH_NONPERIODIC[${DateNum}]}503 echo ">${DateBegin}<"504 echo ">${Duree}<"505 506 # - Determine number of day(s) in LENGTH_NONPERIODIC507 IGCM_date_GetYearMonth ${DateBegin} year month508 DureeLengthInDays=$(( $( IGCM_date_DaysInCurrentPeriod ${DateBegin} ${Duree} ) - 1 ))509 510 # - Build directory name511 echo "========================================================================"512 echo "ensemble_Ens_PERTURB_NAME = ${ensemble_Ens_PERTURB_NAME}"513 IGCM_ensemble_CastDirectoryName ${ensemble_Ens_PERTURB_NAME} ${Duree} $year $month $StartDir514 515 # - Determine DateEnd516 (( DateEnd = $( IGCM_date_AddDaysToGregorianDate ${DateBegin} ${DureeLengthInDays} ) ))517 echo ">${DateEnd}<"518 echo "tout va bien 1"519 520 # - Determine RestartDate521 if [[ ${CastRestartNonPer} == "true" ]]; then522 RestartDate=${ensemble_Ens_PERTURB_RESTART_NONPERIODIC[${DateNum}]}523 else524 (( Offset = -1 ))525 (( RestartDate = $( IGCM_date_AddDaysToGregorianDate ${DateBegin} ${Offset} ) ))526 fi527 528 IGCM_debug_Print 2 "${DateBegin} => ${DateEnd} : ${StartDir}"529 530 # - Does $StartDir already exist ?531 #echo "tout va bien 2" ${StartDir}532 if [ ! -d ${SUBMIT_DIR}/${StartDir} ] ; then533 echo "create dir"534 IGCM_sys_Mkdir ${SUBMIT_DIR}/${StartDir}535 IGCM_sys_Cd ${SUBMIT_DIR}/${StartDir}536 ln -s ../../.resol .537 ln -s ../../.libmpi .538 IGCM_sys_Cd ${RUN_DIR}539 echo "${DateBegin} ${DateEnd} ${StartDir}" >> ${RUN_DIR}/CreatedDir.txt540 fi541 PeriodDateEnd=$( grep -m1 ${StartDir} ${RUN_DIR}/CreatedDir.txt | cut -f2 -d\ )542 543 # - Create directory in which to store new restart files if it does'nt already exist544 RestartDir=${STORAGE}/IGCM_IN/${config_UserChoices_TagName}/${StartDir}545 IGCM_sys_MkdirArchive ${RestartDir}546 547 # - Loop over members548 i=0549 while [ $i -lt ${ensemble_Ens_PERTURB_MEMBER} ] ; do550 MemberDir="${StartDir}${Alpha[$i]}"551 IGCM_debug_Print 3 "${MemberDir}"552 553 JobName="Job_${MemberDir}"554 555 # * Create directory if it doesn't exist and copy files556 if [ ! -d ${SUBMIT_DIR}/${StartDir}/${MemberDir} ] ; then557 IGCM_sys_Mkdir ${SUBMIT_DIR}/${StartDir}/${MemberDir}558 #IGCM_sys_Cp -r COMP/ PARAM/ ${StartDir}/${MemberDir}559 IGCM_sys_Cd ${SUBMIT_DIR}/${StartDir}/${MemberDir}560 ln -s ../../COMP561 ln -s ../../PARAM562 ln -s ../../POST563 ln -s ../../DRIVER564 IGCM_sys_Cd ${RUN_DIR}565 IGCM_sys_Cp config.card run.card.init ${SUBMIT_DIR}/${StartDir}/${MemberDir}566 IGCM_sys_Cp Job_${config_UserChoices_JobName} ${SUBMIT_DIR}/${StartDir}/${MemberDir}/Job_${MemberDir}567 568 # Dump command to be lauched569 echo "cd ${StartDir}/${MemberDir}/ ;" >> Qsub.${StartDir}.sh570 echo "${SUBMIT} ${JobName} ; cd -" >> Qsub.${StartDir}.sh571 572 echo "cd ${StartDir}/${MemberDir}/ ;" >> ${RUN_DIR}/Qclean.PeriodLength.${StartDir}.sh573 echo "${libIGCM}/clean_PeriodLength.job ; cd -" >> ${RUN_DIR}/Qclean.PeriodLength.${StartDir}.sh574 575 # * Update files : config.card, Job_, COMP/comp.card576 echo "${PeriodDateEnd} ? ${DateEnd}"577 if [ ${PeriodDateEnd} -gt ${DateEnd} ] ; then578 DateEnd=${PeriodDateEnd}579 fi580 581 IGCM_ensemble_CastFilesUpdate ${DateBegin} ${DateEnd} ${RestartDate}582 583 # * Apply noise on restart file584 IGCM_ensemble_CastPerturbFile585 fi586 587 (( i = i + 1 ))588 done589 590 # Done. Save ${StartDir} submission text file591 IGCM_sys_Cp ${RUN_DIR}/Qsub.${StartDir}.sh ${SUBMIT_DIR}592 IGCM_sys_Cp ${RUN_DIR}/Qclean.PeriodLength.${StartDir}.sh ${SUBMIT_DIR}593 594 (( DateNum = DateNum + 1 ))595 done596 IGCM_debug_PopStack "IGCM_ensemble_CastNonPeriodicStarts"597 }598 599 430 function IGCM_ensemble_CastMemberList 600 431 { … … 615 446 eval DateBegin=\${ensemble_Ens_PERTURB_BEGIN_INIT} 616 447 617 IGCM_date_GetYearMonth ${DateBegin} year month448 IGCM_date_GetYearMonth ${DateBegin} ${year} ${month} 618 449 619 450 # - Determine number of day(s) in LENGTH 620 Dur eeLengthInDays=$(( $( IGCM_date_DaysInCurrentPeriod ${DateBegin} ${ensemble_Ens_PERTURB_LENGTH} ) - 1 ))451 DurationLengthInDays=$(( $( IGCM_date_DaysInCurrentPeriod ${DateBegin} ${ensemble_Ens_PERTURB_LENGTH} ) - 1 )) 621 452 622 453 # - Determine DateEnd 623 DateEnd=$( IGCM_date_AddDaysToGregorianDate ${DateBegin} ${Dur eeLengthInDays} )454 DateEnd=$( IGCM_date_AddDaysToGregorianDate ${DateBegin} ${DurationLengthInDays} ) 624 455 625 456 # bad hack enforce yearly for parent directory name 626 457 # - Build directory name 627 IGCM_ensemble_CastDirectoryName ${ensemble_Ens_PERTURB_NAME} 1Y $year $month $StartDir 458 IGCM_ensemble_CastDirectoryName ${ensemble_Ens_PERTURB_NAME} 1Y ${year} ${month} 459 #SF IGCM_ensemble_CastDirectoryName ${ensemble_Ens_PERTURB_NAME} 1Y ${year} ${month} ${StartDir} 628 460 629 461 # - Determine RestartDate … … 648 480 649 481 # - Loop over members 650 i= 0651 nbmember=${ #ensemble_Ens_PERTURB_PERTU_MAP_LIST[*]}482 i=1 483 nbmember=${ensemble_Ens_PERTURB_MEMBER} 652 484 while [ $i -lt $nbmember ] ; do 653 MemberDir=${ensemble_Ens_PERTURB_MEMBER_NAMESLIST[${i}]} 654 MemberVec=${ensemble_Ens_PERTURB_PERTU_MAP_LIST[${i}]} 485 MemberVec=${ensemble_PERTURB_MEMBER_[${i}]} 486 MemberDir=${config_UserChoices_Member} 487 echo 488 IGCM_debug_Print 3 "print nbmember: ${nbmember}" 489 IGCM_debug_Print 3 "print MemberVec: ${ensemble_PERTURB_MEMBER[${i}]}" 655 490 656 491 JobName="Job_${MemberDir}" … … 660 495 # * Create directory if it doesn't exist and copy/link files 661 496 if [ ! -d ${SUBMIT_DIR}/${StartDir}/${MemberDir} ] ; then 662 IGCM_sys_Mkdir ${SUBMIT_DIR}/${StartDir}/${MemberDir} 663 IGCM_sys_Cd ${SUBMIT_DIR}/${StartDir}/${MemberDir} 664 ln -s ../../COMP 665 ln -s ../../PARAM 666 ln -s ../../POST 667 ln -s ../../DRIVER 668 IGCM_sys_Cd ${RUN_DIR} 669 IGCM_sys_Cp config.card run.card.init ${SUBMIT_DIR}/${StartDir}/${MemberDir} 670 IGCM_sys_Cp Job_${config_UserChoices_JobName} ${SUBMIT_DIR}/${StartDir}/${MemberDir}/${JobName} 671 672 # Dump command to be lauched 673 echo "cd ${StartDir}/${MemberDir}/ ;" >> ${RUN_DIR}/Qsub.${StartDir}.sh 674 echo "${SUBMIT} ${JobName} ; cd -" >> ${RUN_DIR}/Qsub.${StartDir}.sh 675 676 echo "cd ${StartDir}/${MemberDir}/ ;" >> ${RUN_DIR}/Qclean.PeriodLength.${StartDir}.sh 677 echo "${libIGCM}/clean_PeriodLength.job ; cd -" >> ${RUN_DIR}/Qclean.PeriodLength.${StartDir}.sh 497 498 # * Create ${SUBMIT_DIR}/${StartDir}/${MemberDir} directories 499 # link COMP PARAM POST and DRIVER 500 # cp config.card, run.card.init, Job_ 501 # and Dump command to be launched 502 IGCM_ensemble_CreateMemberDir 678 503 679 504 # * Update files : config.card, Job_, COMP/comp.card 680 IGCM_ensemble_ CastFilesUpdate ${DateBegin} ${DateEnd} ${RestartDate}505 IGCM_ensemble_FilesUpdate "PERTURB" ${i} ${DateBegin} ${DateEnd} ${RestartDate} ${InitFrom} ${InitPath} 681 506 682 507 # * Apply noise on restart file … … 692 517 693 518 IGCM_debug_PopStack "IGCM_ensemble_CastMemberList" 694 }695 696 function IGCM_ensemble_CastFilesUpdate697 {698 IGCM_debug_PushStack "IGCM_ensemble_CastFilesUpdate"699 700 # Debug Print :701 echo702 IGCM_debug_Print 1 "IGCM_ensemble_CastFilesUpdate :"703 704 HumanDateBegin=$( IGCM_date_ConvertFormatToHuman ${1} )705 HumanDateEnd=$( IGCM_date_ConvertFormatToHuman ${2} )706 HumanRestartDate=$( IGCM_date_ConvertFormatToHuman ${3} )707 # ==> config.card708 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card Ensemble EnsembleRun 'y'709 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card Ensemble EnsembleName ${ensemble_Ens_PERTURB_NAME}710 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card Ensemble EnsembleDate ${StartDir}711 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card Ensemble EnsembleType "Ens_PERTURB"712 713 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card UserChoices JobName ${MemberDir}714 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card UserChoices DateBegin ${HumanDateBegin}715 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card UserChoices DateEnd ${HumanDateEnd}716 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card Restarts OverRule "n"717 718 for comp in ${config_ListOfComponents[*]} ; do719 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card ${comp} Restart "y"720 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card ${comp} RestartDate ${HumanRestartDate}721 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card ${comp} RestartJobName ${ensemble_Ens_PERTURB_INITFROM}722 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card ${comp} RestartPath ${ensemble_Ens_PERTURB_INITPATH}723 done724 # Adhoc exception for CMIP6 : exclude XIOS from the restart overrule mechanism.725 if ( [ X${comp} = XIOS ] && [ X"$( echo ${config_UserChoices_ExpType} | grep CMIP6 )" != "X" ] ) ; then726 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card ${comp} Restart "n"727 fi728 729 # ==> Job730 sed -e "s/\(#.*Script_Output_\)${config_UserChoices_JobName}\(\.*\)/\1${MemberDir}\2/" \731 -e "s/\(#.*\)${config_UserChoices_JobName}\(\.*\)/\1${MemberDir} \2/" \732 -e "s/^PeriodNb=.*/PeriodNb=5/" \733 ${SUBMIT_DIR}/${StartDir}/${MemberDir}/Job_${MemberDir} > Job_${MemberDir}.tmp734 IGCM_sys_Mv Job_${MemberDir}.tmp ${SUBMIT_DIR}/${StartDir}/${MemberDir}/Job_${MemberDir}735 736 IGCM_debug_PopStack "IGCM_ensemble_CastFilesUpdate"737 519 } 738 520 … … 747 529 748 530 Name=$1 749 Duree=$2750 year=$3751 month=$4531 PeriodLen=$2 532 Year=$3 533 Month=$4 752 534 753 535 # - Build directory name 754 case ${ Duree} in536 case ${PeriodLen} in 755 537 *Y|*y) 756 siecle="$( echo $year | cut -c1-2 )" 757 siecle=$( (( $siecle - 18 )) ) 758 StartYear="${siecle}$( echo $year | cut -c3-4 )" 759 StartDir="${Name}${StartYear}" 760 ;; 761 *M|*m) 762 echo $month 763 siecle="$( echo $year | cut -c1-2 )" 764 siecle=$( (( $siecle - 18 )) ) 765 StartYear="${siecle}$( echo $year | cut -c3-4 )" 766 StartMonth="${AlphaMonth[ (( 10#${month} - 1 )) ]}" 767 StartDir="${Name}${StartYear}${StartMonth}" 538 StartDir="${Name}${year}" 768 539 ;; 769 540 esac … … 998 769 IGCM_debug_PushStack "IGCM_ensemble_DateInit" 999 770 1000 IGCM_sys_Mkdir ${RUN_DIR} 1001 1002 IGCM_sys_Cp ${SUBMIT_DIR}/config.card ${RUN_DIR} 1003 IGCM_sys_Cp ${SUBMIT_DIR}/ensemble.card ${RUN_DIR} 1004 IGCM_sys_Cp ${SUBMIT_DIR}/Job_* ${RUN_DIR} 1005 IGCM_sys_Cp ${SUBMIT_DIR}/run.card.init ${RUN_DIR} 1006 if [ -f ${SUBMIT_DIR}/Qsub.* ]; then 1007 IGCM_sys_Cp ${SUBMIT_DIR}/Qsub.* ${RUN_DIR} 1008 fi 1009 if [ -f ${SUBMIT_DIR}/Qclean.* ]; then 1010 IGCM_sys_Cp ${SUBMIT_DIR}/Qclean.* ${RUN_DIR} 1011 fi 771 IGCM_ensemble_InitRunDir 1012 772 1013 773 IGCM_card_DefineVariableFromOption ${F_CFG_ENS} Ens_DATE active … … 1016 776 IGCM_card_DefineVariableFromOption ${F_CFG_ENS} Ens_DATE BEGIN_RESTART 1017 777 IGCM_card_DefineVariableFromOption ${F_CFG_ENS} Ens_DATE END_INIT 1018 IGCM_card_DefineVariableFromOption ${F_CFG_ENS} Ens_DATE PERIODICITY778 IGCM_card_DefineVariableFromOption ${F_CFG_ENS} Ens_DATE STARTDATE 1019 779 IGCM_card_DefineArrayFromOption ${F_CFG_ENS} Ens_DATE NONPERIODIC 1020 780 IGCM_card_DefineArrayFromOption ${F_CFG_ENS} Ens_DATE RESTART_NONPERIODIC … … 1036 796 IGCM_debug_Print 1 "BEGIN_INIT = ${ensemble_Ens_DATE_BEGIN_INIT}" 1037 797 IGCM_debug_Print 1 "END_INIT = ${ensemble_Ens_DATE_END_INIT}" 1038 IGCM_debug_Print 1 "PERIODICITY = ${ensemble_Ens_DATE_PERIODICITY}"1039 798 IGCM_debug_Print 1 "BEGIN_RESTART = ${ensemble_Ens_DATE_BEGIN_RESTART}" 799 IGCM_debug_Print 1 "STARTDATE = ${ensemble_Ens_DATE_STARTDATE}" 1040 800 IGCM_debug_Print 1 "NONPERIODIC = ${ensemble_Ens_DATE_NONPERIODIC[*]}" 1041 801 IGCM_debug_Print 1 "RESTART_NONPERIODIC = ${ensemble_Ens_DATE_RESTART_NONPERIODIC[*]}" … … 1052 812 echo "" 1053 813 1054 ensemble_Ens_DATE_MEMBER=1 # actually use only 1 member1055 IGCM_ensemble_SetAlpha ${ensemble_Ens_DATE_MEMBER}1056 1057 814 IGCM_debug_Print 1 "Check args..." 1058 DatePeriodicStart=false 1059 DateNonPeriodicStart=false 815 DateNonPeriodicStart=true 1060 816 1061 817 # ... Check LENGTH ... … … 1070 826 1071 827 # *************************************** 1072 # A few checks Period case:1073 # ***************************************1074 # if all Periodic params are not filled: desactivate Periodic mode1075 totalPeriodArgs=41076 periodFillArgs=01077 1078 if [[ X${ensemble_Ens_DATE_BEGIN_RESTART} != "X" ]]; then1079 (( periodFillArgs = periodFillArgs + 1 ))1080 fi1081 1082 if [[ X${ensemble_Ens_DATE_BEGIN_INIT} != "X" ]]; then1083 (( periodFillArgs = periodFillArgs + 1 ))1084 fi1085 1086 if [[ X${ensemble_Ens_DATE_END_INIT} != "X" ]]; then1087 (( periodFillArgs = periodFillArgs + 1 ))1088 fi1089 1090 if [[ X${ensemble_Ens_DATE_PERIODICITY} != "X" ]]; then1091 (( periodFillArgs = periodFillArgs + 1 ))1092 1093 # ... Check PERIODICITY ...1094 case ${ensemble_Ens_DATE_PERIODICITY} in1095 *[Yy]|*[Mm])1096 IGCM_debug_Print 1 "Periodic length : ${ensemble_Ens_DATE_PERIODICITY}" ;;1097 *)1098 IGCM_debug_Exit "IGCM_ensemble_DateInit ${ensemble_Ens_DATE_PERIODICITY} : invalid PERIODICITY"1099 IGCM_debug_Exit "Choose a value in *Y or *M"1100 IGCM_debug_Verif_Exit ;;1101 esac1102 fi # if periodicity1103 1104 if [[ ${periodFillArgs} = ${totalPeriodArgs} ]]; then1105 DatePeriodicStart=true1106 else1107 if [[ ${periodFillArgs} = 0 ]]; then1108 IGCM_debug_Print 1 "Periodic start NOT ACTIVE"1109 DatePeriodicStart=false1110 else1111 IGCM_debug_Exit "IGCM_ensemble_DateInit missing arguments for Periodic mode!"1112 IGCM_debug_Exit "Get only ${periodFillArgs} on ${totalPeriodArgs} args. Check ${F_CFG_ENS} file."1113 IGCM_debug_Verif_Exit1114 fi1115 fi1116 1117 # ***************************************1118 828 # A few checks for the Non-Periodic case: 1119 829 # *************************************** 1120 if [[ ${#ensemble_Ens_DATE_NONPERIODIC[*]} != ${#ensemble_Ens_DATE_RESTART_NONPERIODIC[*]} ]] ; then1121 IGCM_debug_Exit "IGCM_ensemble_DateInit: NONPERIODIC and RESTART_NONPERIODIC lists have different sizes"1122 IGCM_debug_Verif_Exit1123 fi1124 1125 if [[ ${#ensemble_Ens_DATE_ NONPERIODIC[*]} > 0 ]] && [[ ${ensemble_Ens_DATE_NONPERIODIC[*]} != _0_ ]]; then830 # if [[ ${#ensemble_Ens_DATE_NONPERIODIC[*]} != ${#ensemble_Ens_DATE_RESTART_NONPERIODIC[*]} ]] ; then 831 # IGCM_debug_Exit "IGCM_ensemble_DateInit: NONPERIODIC and RESTART_NONPERIODIC lists have different sizes" 832 # IGCM_debug_Verif_Exit 833 # fi 834 835 if [[ ${#ensemble_Ens_DATE_RESTART_NONPERIODIC[*]} > 0 ]] && [[ ${ensemble_Ens_DATE_RESTART_NONPERIODIC[*]} != _0_ ]]; then 1126 836 DateNonPeriodicStart=true 1127 837 1128 838 # Use LENGTH if no NONPERIODIC_LENGTH given 1129 if [[ ${#ensemble_Ens_DATE_LENGTH_NONPERIODIC[*]} < ${#ensemble_Ens_DATE_NONPERIODIC[*]} ]] ; then 1130 IGCM_debug_Print 1 "WARNING: LENGTH_NONPERIODIC is not fill (or not correctly). Use LENGTH value '${ensemble_Ens_DATE_LENGTH}' for all NONPERIODIC runs" 839 if [[ ${#ensemble_Ens_DATE_LENGTH_NONPERIODIC[*]} < ${#ensemble_Ens_DATE_NONPERIODIC[*]} ]] || 840 [[ X"${ensemble_Ens_DATE_LENGTH_NONPERIODIC[0]}" = "XOption" ]] ; then 841 IGCM_debug_Print 1 "WARNING: LENGTH_NONPERIODIC is not fill (or not correctly). " 842 IGCM_debug_Print 1 "Use LENGTH value '${ensemble_Ens_DATE_LENGTH}' for all NONPERIODIC runs" 1131 843 DateNum=0 1132 844 while [ ${DateNum} -lt ${#ensemble_Ens_DATE_NONPERIODIC[*]} ] ; do … … 1135 847 done 1136 848 fi 1137 849 850 # Use STARTDATE if no NONPERIODIC start date given 851 if [[ ${#ensemble_Ens_DATE_NONPERIODIC[*]} < ${#ensemble_Ens_DATE_RESTART_NONPERIODIC[*]} ]] || 852 [[ X"${ensemble_Ens_DATE_NONPERIODIC[0]}" = "XOption" ]] ; then 853 IGCM_debug_Print 1 "WARNING: NONPERIODIC start date not fill (or not correctly)." 854 IGCM_debug_Print 1 "Use STARTDATE value '${ensemble_Ens_DATE_STARTDATE}' for all NONPERIODIC runs" 855 DateNum=0 856 while [ ${DateNum} -lt ${#ensemble_Ens_DATE_RESTART_NONPERIODIC[*]} ] ; do 857 ensemble_Ens_DATE_NONPERIODIC[${DateNum}]=${ensemble_Ens_DATE_STARTDATE} 858 (( DateNum = DateNum + 1 )) 859 done 860 fi 861 1138 862 # Use INITFROM if no INITFROM_NONPERIODIC given 1139 863 if [ ${#ensemble_Ens_DATE_INITFROM_NONPERIODIC[*]} -lt ${#ensemble_Ens_DATE_NONPERIODIC[*]} ] ; then … … 1188 912 } 1189 913 1190 function IGCM_ensemble_DatePeriodicStarts1191 {1192 IGCM_debug_PushStack "IGCM_ensemble_DatePeriodicStarts"1193 1194 [ ${DatePeriodicStart} = false ] && return1195 1196 echo1197 IGCM_debug_Print 1 ">>> MANAGE PERIODIC STARTS <<<"1198 1199 #.. Manage periodic starts ..1200 # ======================1201 1202 # - Build directory name1203 StartDir="${ensemble_Ens_DATE_NAME}"1204 1205 # - Create directory for current DateBegin1206 if [ ! -d ${StartDir} ] ; then1207 IGCM_sys_Mkdir ${SUBMIT_DIR}/${StartDir}1208 IGCM_sys_Cd ${SUBMIT_DIR}/${StartDir}1209 ln -s ../../.resol .1210 ln -s ../../.libmpi .1211 IGCM_sys_Cd ${RUN_DIR}1212 fi1213 1214 # ... Loop over DateBegin ...1215 eval DateBegin=\${ensemble_Ens_DATE_BEGIN_INIT}1216 eval RestartDate=\${ensemble_Ens_DATE_BEGIN_RESTART}1217 1218 DateNum=01219 while [ ${DateBegin} -le ${ensemble_Ens_DATE_END_INIT} ] ; do1220 IGCM_date_GetYearMonth ${DateBegin} year month1221 1222 echo "========================================================================"1223 echo "New DateBegin = $DateBegin"1224 1225 # - Determine number of day(s) in PERIODICITY1226 PeriodLengthInDays=$( IGCM_date_DaysInCurrentPeriod ${DateBegin} ${ensemble_Ens_DATE_PERIODICITY} )1227 1228 # - Determine number of day(s) in LENGTH1229 DureeLengthInDays=$(( $( IGCM_date_DaysInCurrentPeriod ${DateBegin} ${ensemble_Ens_DATE_LENGTH} ) - 1 ))1230 1231 # - Determine DateEnd1232 (( DateEnd = $( IGCM_date_AddDaysToGregorianDate ${DateBegin} ${DureeLengthInDays} ) ))1233 1234 IGCM_debug_Print 2 "${DateBegin} => ${DateEnd} : ${StartDir}"1235 echo "${DateBegin} ${DateEnd} ${StartDir}" >> ${RUN_DIR}/CreatedDir.txt1236 1237 # - Loop over members (default =1 no member)1238 i=01239 while [ $i -lt ${ensemble_Ens_DATE_MEMBER} ] ; do1240 MemberDir="${ensemble_Ens_DATE_NAME}${DateNum}${Alpha[$i]}_per"1241 echo1242 IGCM_debug_Print 3 "${MemberDir}"1243 1244 JobName="Job_${MemberDir}"1245 1246 # * Create directory if it doesn't exist and copy/link files1247 if [ ! -d ${SUBMIT_DIR}/${StartDir}/${MemberDir} ] ; then1248 IGCM_sys_Mkdir ${SUBMIT_DIR}/${StartDir}/${MemberDir}1249 IGCM_sys_Cd ${SUBMIT_DIR}/${StartDir}/${MemberDir}1250 ln -s ../../COMP1251 ln -s ../../PARAM1252 ln -s ../../POST1253 ln -s ../../DRIVER1254 IGCM_sys_Cd ${RUN_DIR}1255 IGCM_sys_Cp config.card run.card.init ${SUBMIT_DIR}/${StartDir}/${MemberDir}1256 IGCM_sys_Cp Job_${config_UserChoices_JobName} ${SUBMIT_DIR}/${StartDir}/${MemberDir}/${JobName}1257 1258 # Dump command to be lauched1259 echo "cd ${StartDir}/${MemberDir}/ ;" >> ${RUN_DIR}/Qsub.${StartDir}.sh1260 echo "${SUBMIT} ${JobName} ; cd -" >> ${RUN_DIR}/Qsub.${StartDir}.sh1261 1262 echo "cd ${StartDir}/${MemberDir}/ ;" >> ${RUN_DIR}/Qclean.PeriodLength.${StartDir}.sh1263 echo "${libIGCM}/clean_PeriodLength.job ; cd -" >> ${RUN_DIR}/Qclean.PeriodLength.${StartDir}.sh1264 1265 # * Update files : config.card, Job_, COMP/comp.card1266 IGCM_ensemble_DateFilesUpdate ${DateBegin} ${DateEnd} ${RestartDate}1267 fi1268 1269 (( i = i + 1 ))1270 done1271 1272 # - Next DateBegin & RestartDate1273 echo "$DateBegin $PeriodLengthInDays"1274 case ${ensemble_Ens_DATE_PERIODICITY} in1275 *[Yy]|*[Mm])1276 (( DateBegin = $( IGCM_date_AddDaysToGregorianDate ${DateBegin} ${PeriodLengthInDays} ) ))1277 (( RestartDate = $( IGCM_date_AddDaysToGregorianDate ${RestartDate} ${PeriodLengthInDays} ) ))1278 ;;1279 esac1280 1281 (( DateNum = DateNum + 1 )) # increment number of restart date1282 done1283 1284 # Done. Save ${StartDir} submission text file1285 IGCM_sys_Cp ${RUN_DIR}/Qsub.${StartDir}.sh ${SUBMIT_DIR}1286 IGCM_sys_Cp ${RUN_DIR}/Qclean.PeriodLength.${StartDir}.sh ${SUBMIT_DIR}1287 1288 IGCM_debug_PopStack "IGCM_ensemble_DatePeriodicStarts"1289 }1290 1291 914 function IGCM_ensemble_DateNonPeriodicStarts 1292 915 { … … 1324 947 InitFrom=${ensemble_Ens_DATE_INITFROM_NONPERIODIC[${DateNum}]} 1325 948 InitPath=${ensemble_Ens_DATE_INITPATH_NONPERIODIC[${DateNum}]} 1326 949 (( ii=DateNum + 1 )) 950 951 MemberDir="${ensemble_Ens_DATE_NAME}${ii}" 952 IGCM_debug_Print 3 "${MemberDir}" 953 echo "Create: ${MemberDir}" 954 1327 955 # - Determine number of day(s) in LENGTH_NONPERIODIC 1328 956 IGCM_date_GetYearMonth ${DateBegin} year month … … 1337 965 PeriodDateEnd=$( grep -m1 ${StartDir} ${RUN_DIR}/CreatedDir.txt | cut -f2 -d\ ) 1338 966 1339 # - Loop over members 1340 i=0 1341 while [ $i -lt ${ensemble_Ens_DATE_MEMBER} ] ; do 1342 MemberDir="${ensemble_Ens_DATE_NAME}${DateNum}${Alpha[$i]}" 1343 IGCM_debug_Print 3 "${MemberDir}" 1344 1345 JobName="Job_${MemberDir}" 1346 967 JobName="Job_${MemberDir}" 968 1347 969 # * Create directory if it doesn't exist and copy files 1348 if [ ! -d ${SUBMIT_DIR}/${StartDir}/${MemberDir} ] ; then 1349 IGCM_sys_Mkdir ${SUBMIT_DIR}/${StartDir}/${MemberDir} 1350 IGCM_sys_Cd ${SUBMIT_DIR}/${StartDir}/${MemberDir} 1351 ln -s ../../COMP 1352 ln -s ../../PARAM 1353 ln -s ../../POST 1354 ln -s ../../DRIVER 1355 IGCM_sys_Cd ${RUN_DIR} 1356 IGCM_sys_Cp config.card run.card.init ${SUBMIT_DIR}/${StartDir}/${MemberDir} 1357 IGCM_sys_Cp Job_${config_UserChoices_JobName} ${SUBMIT_DIR}/${StartDir}/${MemberDir}/Job_${MemberDir} 1358 1359 # Dump command to be lauched 1360 echo "cd ${StartDir}/${MemberDir}/ ;" >> ${RUN_DIR}/Qsub.${StartDir}.sh 1361 echo "${SUBMIT} ${JobName} ; cd -" >> ${RUN_DIR}/Qsub.${StartDir}.sh 1362 1363 echo "cd ${StartDir}/${MemberDir}/ ;" >> ${RUN_DIR}/Qclean.PeriodLength.${StartDir}.sh 1364 echo "${libIGCM}/clean_PeriodLength.job ; cd -" >> ${RUN_DIR}/Qclean.PeriodLength.${StartDir}.sh 1365 970 if [ ! -d ${SUBMIT_DIR}/${StartDir}/${MemberDir} ] ; then 971 972 # * Create ${SUBMIT_DIR}/${StartDir}/${MemberDir} directories 973 # link COMP PARAM POST and DRIVER 974 # cp config.card, run.card.init, Job_ 975 # and Dump command to be launched 976 IGCM_ensemble_CreateMemberDir 977 1366 978 # * Update files : config.card, Job_, COMP/comp.card 1367 IGCM_ensemble_DateFilesUpdate ${DateBegin} ${DateEnd} ${RestartDate} ${InitFrom} ${InitPath} 1368 fi 1369 1370 (( i = i + 1 )) 1371 done 1372 979 IGCM_ensemble_FilesUpdate "DATE" ${ii} ${DateBegin} ${DateEnd} ${RestartDate} ${InitFrom} ${InitPath} 980 fi 981 1373 982 # Done. Save ${StartDir} submission text file 1374 983 IGCM_sys_Cp ${RUN_DIR}/Qsub.${StartDir}.sh ${SUBMIT_DIR} 1375 984 IGCM_sys_Cp ${RUN_DIR}/Qclean.PeriodLength.${StartDir}.sh ${SUBMIT_DIR} 985 IGCM_sys_Cp ${RUN_DIR}/Qclean.latestPackperiod.${StartDir}.sh ${SUBMIT_DIR} 1376 986 1377 987 (( DateNum = DateNum + 1 )) 1378 988 done 1379 989 1380 # Done. Save ${StartDir} submission text file1381 IGCM_sys_Cp ${RUN_DIR}/Qsub.${StartDir}.sh ${SUBMIT_DIR}1382 IGCM_sys_Cp ${RUN_DIR}/Qclean.month.${StartDir}.sh ${SUBMIT_DIR}1383 IGCM_sys_Cp ${RUN_DIR}/Qclean.year.${StartDir}.sh ${SUBMIT_DIR}1384 1385 990 IGCM_debug_PopStack "IGCM_ensemble_DateNonPeriodicStarts" 1386 991 } 1387 992 1388 function IGCM_ensemble_DateFilesUpdate1389 {1390 IGCM_debug_PushStack "IGCM_ensemble_DateFilesUpdate"1391 1392 # Debug Print :1393 echo1394 IGCM_debug_Print 1 "IGCM_ensemble_DateFilesUpdate :"1395 1396 HumanDateBegin=$( IGCM_date_ConvertFormatToHuman ${1} )1397 HumanDateEnd=$( IGCM_date_ConvertFormatToHuman ${2} )1398 HumanRestartDate=$( IGCM_date_ConvertFormatToHuman ${3} )1399 if [[ X${4} != "X" ]]; then1400 initFrom=${4} # non periodic config (INITFROM could be different between members)1401 else1402 initFrom=${ensemble_Ens_DATE_INITFROM} # periodic (same INITFROM value)1403 fi1404 1405 if [[ X${5} != "X" ]]; then1406 initPath=${5} # non periodic config (INITPATH could be different between members)1407 else1408 initPath=${ensemble_Ens_DATE_INITPATH} # periodic (same INITPATH value)1409 fi1410 1411 # ==> config.card1412 # [ENSEMBLE]1413 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card Ensemble EnsembleRun 'y'1414 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card Ensemble EnsembleName ${ensemble_Ens_DATE_NAME}1415 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card Ensemble EnsembleDate ${HumanDateBegin}1416 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card Ensemble EnsembleType "Ens_DATE"1417 1418 # [UserChoices]1419 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card UserChoices JobName ${MemberDir}1420 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card UserChoices DateBegin ${HumanDateBegin}1421 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card UserChoices DateEnd ${HumanDateEnd}1422 1423 # [Restarts]1424 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card Restarts OverRule "y"1425 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card Restarts RestartDate ${HumanRestartDate}1426 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card Restarts RestartJobName ${initFrom}1427 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card Restarts RestartPath ${initPath}1428 1429 # [ATM/OCE/...]1430 for comp in ${config_ListOfComponents[*]} ; do1431 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card ${comp} Restart "n"1432 done1433 unset initFrom1434 1435 # ==> Job1436 sed -e "s/\(#.*Script_Output_\)${config_UserChoices_JobName}\(\.*\)/\1${MemberDir}\2/" \1437 -e "s/\(#.*\)${config_UserChoices_JobName}\(\.*\)/\1${MemberDir} \2/" \1438 -e "s/^PeriodNb=.*/PeriodNb=5/" \1439 ${SUBMIT_DIR}/${StartDir}/${MemberDir}/Job_${MemberDir} > Job_${MemberDir}.tmp1440 IGCM_sys_Mv Job_${MemberDir}.tmp ${SUBMIT_DIR}/${StartDir}/${MemberDir}/Job_${MemberDir}1441 1442 IGCM_debug_PopStack "IGCM_ensemble_DateFilesUpdate"1443 }1444 1445 ############### Parametric ENSEMBLE #################
Note: See TracChangeset
for help on using the changeset viewer.