- Timestamp:
- 04/16/14 18:03:11 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/libIGCM/libIGCM_ensemble/libIGCM_ensemble.ksh
r895 r1001 2 2 3 3 #************************************************************** 4 # Author: S onia Labetoulle5 # Contact: Sonia.Labetoulle__at__locean-ipsl.upmc.fr4 # Author: Sebastien Denvil, Sonia Labetoulle, Nicolas Lebas 5 # Contact: Nicolas.Lebas__at__locean-ipsl.upmc.fr 6 6 # $Revision:: $ Revision of last commit 7 7 # $Author:: $ Author of last commit … … 12 12 #************************************************************** 13 13 14 function IGCM_ensemble_CastInit 15 { 16 IGCM_debug_PushStack "IGCM_ensemble_CastInit" 17 14 # Read which ensemble type are active 15 function IGCM_ensemble_Init 16 { 17 IGCM_debug_PushStack "IGCM_ensemble_Init" 18 19 IGCM_card_DefineVariableFromOption ${FileName} Ens_PERTURB active 20 IGCM_card_DefineVariableFromOption ${FileName} Ens_DATE active 21 IGCM_card_DefineVariableFromOption ${FileName} Ens_PARAMETRIC active 22 23 IGCM_debug_Print 1 "Ens_PERTURB ACTIVE = ${ensemble_Ens_PERTURB_active}" 24 IGCM_debug_Print 1 "Ens_DATE ACTIVE = ${ensemble_Ens_DATE_active}" 25 IGCM_debug_Print 1 "Ens_PARAMETRIC ACTIVE = ${ensemble_Ens_PARAMETRIC_active}" 26 echo "" 27 28 IGCM_debug_PopStack "IGCM_ensemble_Init" 29 } 30 31 # Set Alphanumerical variables ajust to member nb 32 function IGCM_ensemble_SetAlpha 33 { 34 IGCM_debug_PushStack "IGCM_ensemble_SetAlpha" 35 18 36 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 19 37 set -A AlphaMonth a b c d e f g h i j k l 38 39 IGCM_debug_PopStack "IGCM_ensemble_SetAlpha" 40 } 41 42 ############### Perturb ENSEMBLE ################# 43 function IGCM_ensemble_CastInit 44 { 45 IGCM_debug_PushStack "IGCM_ensemble_CastInit" 20 46 21 47 IGCM_sys_Mkdir ${RUN_DIR} … … 25 51 IGCM_sys_Cp ${SUBMIT_DIR}/Job_* ${RUN_DIR} 26 52 IGCM_sys_Cp ${SUBMIT_DIR}/run.card.init ${RUN_DIR} 27 53 if [ -f ${SUBMIT_DIR}/Qsub.* ]; then 54 IGCM_sys_Cp ${SUBMIT_DIR}/Qsub.* ${RUN_DIR} 55 fi 56 28 57 # Useful? 29 58 #if [ -f ${SUBMIT_DIR}/CreatedDir.txt ] ; then … … 35 64 #fi 36 65 37 IGCM_card_DefineVariableFromOption ${FileName} Ens_PERTURB actif38 66 IGCM_card_DefineVariableFromOption ${FileName} Ens_PERTURB NAME 39 IGCM_card_DefineVariableFromOption ${FileName} Ens_PERTURB DEBUT_INIT40 IGCM_card_DefineVariableFromOption ${FileName} Ens_PERTURB FIN_INIT41 IGCM_card_DefineVariableFromOption ${FileName} Ens_PERTURB PERIODICIT E67 IGCM_card_DefineVariableFromOption ${FileName} Ens_PERTURB BEGIN_INIT 68 IGCM_card_DefineVariableFromOption ${FileName} Ens_PERTURB END_INIT 69 IGCM_card_DefineVariableFromOption ${FileName} Ens_PERTURB PERIODICITY 42 70 IGCM_card_DefineArrayFromOption ${FileName} Ens_PERTURB NONPERIODIC 43 IGCM_card_DefineVariableFromOption ${FileName} Ens_PERTURB DUREE44 IGCM_card_DefineArrayFromOption ${FileName} Ens_PERTURB DUREE_NONPERIODIC71 IGCM_card_DefineVariableFromOption ${FileName} Ens_PERTURB LENGTH 72 IGCM_card_DefineArrayFromOption ${FileName} Ens_PERTURB LENGTH_NONPERIODIC 45 73 IGCM_card_DefineVariableFromOption ${FileName} Ens_PERTURB MEMBER 46 74 IGCM_card_DefineArrayFromOption ${FileName} Ens_PERTURB PERTURB_BIN 47 75 IGCM_card_DefineVariableFromOption ${FileName} Ens_PERTURB INITFROM 48 76 IGCM_card_DefineVariableFromOption ${FileName} Ens_PERTURB INITPATH 77 IGCM_card_DefineVariableFromOption config.card UserChoices JobName 49 78 IGCM_card_DefineVariableFromOption config.card UserChoices TagName 50 79 IGCM_card_DefineVariableFromOption config.card UserChoices CalendarType … … 52 81 53 82 echo 54 IGCM_debug_Print 1 "ACTIVE = ${ensemble_Ens_PERTURB_actif}" 83 IGCM_debug_Print 1 "[Ens_PERTURB]" 84 IGCM_debug_Print 1 "ACTIVE = ${ensemble_Ens_PERTURB_active}" 55 85 IGCM_debug_Print 1 "NAME = ${ensemble_Ens_PERTURB_NAME}" 56 IGCM_debug_Print 1 " DEBUT_INIT = ${ensemble_Ens_PERTURB_DEBUT_INIT}"57 IGCM_debug_Print 1 " FIN_INIT = ${ensemble_Ens_PERTURB_FIN_INIT}"58 IGCM_debug_Print 1 "PERIODICIT E = ${ensemble_Ens_PERTURB_PERIODICITE}"86 IGCM_debug_Print 1 "BEGIN_INIT = ${ensemble_Ens_PERTURB_BEGIN_INIT}" 87 IGCM_debug_Print 1 "END_INIT = ${ensemble_Ens_PERTURB_END_INIT}" 88 IGCM_debug_Print 1 "PERIODICITY = ${ensemble_Ens_PERTURB_PERIODICITY}" 59 89 IGCM_debug_Print 1 "NONPERIODIC = ${ensemble_Ens_PERTURB_NONPERIODIC[*]}" 60 IGCM_debug_Print 1 " DUREE = ${ensemble_Ens_PERTURB_DUREE}"61 IGCM_debug_Print 1 " DUREE_NONPERIODIC = ${ensemble_Ens_PERTURB_DUREE_NONPERIODIC[*]}"90 IGCM_debug_Print 1 "LENGTH = ${ensemble_Ens_PERTURB_LENGTH}" 91 IGCM_debug_Print 1 "LENGTH_NONPERIODIC = ${ensemble_Ens_PERTURB_LENGTH_NONPERIODIC[*]}" 62 92 IGCM_debug_Print 1 "MEMBER = ${ensemble_Ens_PERTURB_MEMBER}" 63 93 IGCM_debug_Print 1 "PERTURB_BIN = ${ensemble_Ens_PERTURB_PERTURB_BIN[*]}" 64 94 IGCM_debug_Print 1 "INITFROM = ${ensemble_Ens_PERTURB_INITFROM}" 65 95 IGCM_debug_Print 1 "INITPATH = ${ensemble_Ens_PERTURB_INITPATH}" 96 IGCM_debug_Print 1 "JobName = ${config_UserChoices_JobName}" 66 97 IGCM_debug_Print 1 "TagName = ${config_UserChoices_TagName}" 67 98 IGCM_debug_Print 1 "CalendarType = ${config_UserChoices_CalendarType}" 68 99 IGCM_debug_Print 1 "ListOfComponents = ${config_ListOfComponents[*]}" 69 100 70 101 PerturbExe=${ensemble_Ens_PERTURB_PERTURB_BIN[0]} 71 102 PerturbComp=${ensemble_Ens_PERTURB_PERTURB_BIN[1]} … … 79 110 IGCM_debug_Print 1 "PerturbVar = ${PerturbVar}" 80 111 IGCM_debug_Print 1 "PerturbAmp = ${PerturbAmp}" 81 112 113 IGCM_ensemble_SetAlpha ${ensemble_Ens_PERTURB_MEMBER} 114 82 115 # A few checks Period case: 83 116 84 # ... Check PERIODICIT E...85 case ${ensemble_Ens_PERTURB_PERIODICIT E} in117 # ... Check PERIODICITY ... 118 case ${ensemble_Ens_PERTURB_PERIODICITY} in 86 119 _0_) 87 120 IGCM_debug_Print 1 "periodic start not active" … … 90 123 *[Yy]|*[Mm]) 91 124 CastPeriodicStart=true 92 IGCM_debug_Print 1 "Periodic length : ${ensemble_Ens_PERTURB_PERIODICIT E}" ;;125 IGCM_debug_Print 1 "Periodic length : ${ensemble_Ens_PERTURB_PERIODICITY}" ;; 93 126 *) 94 IGCM_debug_Exit "IGCM_ensemble_CastInit ${ensemble_Ens_PERTURB_PERIODICIT E} : invalid PERIODICITE"127 IGCM_debug_Exit "IGCM_ensemble_CastInit ${ensemble_Ens_PERTURB_PERIODICITY} : invalid PERIODICITY" 95 128 IGCM_debug_Exit "Choose a value in *Y or *M" 96 129 IGCM_debug_Verif_Exit ;; 97 130 esac 98 # ... Check DUREE...99 case ${ensemble_Ens_PERTURB_ DUREE} in131 # ... Check LENGTH ... 132 case ${ensemble_Ens_PERTURB_LENGTH} in 100 133 *[Yy]|*[Mm]) 101 IGCM_debug_Print 1 "Periodic duration : ${ensemble_Ens_PERTURB_ DUREE}" ;;134 IGCM_debug_Print 1 "Periodic duration : ${ensemble_Ens_PERTURB_LENGTH}" ;; 102 135 *) 103 IGCM_debug_Exit "IGCM_ensemble_CastInit ${ensemble_Ens_PERTURB_ DUREE} invalid DUREE"136 IGCM_debug_Exit "IGCM_ensemble_CastInit ${ensemble_Ens_PERTURB_LENGTH} invalid LENGTH" 104 137 IGCM_debug_Exit "Choose a value in choose in *Y or *M" 105 138 IGCM_debug_Verif_Exit ;; … … 110 143 while [ $DateNum -lt ${#ensemble_Ens_PERTURB_NONPERIODIC[*]} ] ; do 111 144 112 # - Check DUREE_NONPERIODIC113 case ${ensemble_Ens_PERTURB_ DUREE_NONPERIODIC[$DateNum]} in145 # - Check LENGTH_NONPERIODIC 146 case ${ensemble_Ens_PERTURB_LENGTH_NONPERIODIC[$DateNum]} in 114 147 _0_) 115 148 IGCM_debug_Print 1 "non-periodic start not active" … … 117 150 ;; 118 151 *[Yy]|*[Mm]) 119 IGCM_debug_Print 1 "Non-periodic duration : ${ensemble_Ens_PERTURB_ DUREE_NONPERIODIC[$DateNum]}"152 IGCM_debug_Print 1 "Non-periodic duration : ${ensemble_Ens_PERTURB_LENGTH_NONPERIODIC[$DateNum]}" 120 153 CastNonPeriodicStart=true 121 154 ;; 122 155 *) 123 IGCM_debug_Exit "IGCM_ensemble_CastInit ${ensemble_Ens_PERTURB_ DUREE_NONPERIODIC[$DateNum]} : invalid DUREE"156 IGCM_debug_Exit "IGCM_ensemble_CastInit ${ensemble_Ens_PERTURB_LENGTH_NONPERIODIC[$DateNum]} : invalid LENGTH" 124 157 IGCM_debug_Exit "choose in *Y or *M" 125 158 IGCM_debug_Verif_Exit ;; … … 160 193 161 194 # ... Loop over DateBegin ... 162 eval DateBegin=\${ensemble_Ens_PERTURB_ DEBUT_INIT}163 164 while [ ${DateBegin} -le ${ensemble_Ens_PERTURB_ FIN_INIT} ] ; do195 eval DateBegin=\${ensemble_Ens_PERTURB_BEGIN_INIT} 196 197 while [ ${DateBegin} -le ${ensemble_Ens_PERTURB_END_INIT} ] ; do 165 198 IGCM_date_GetYearMonth ${DateBegin} year month 166 199 167 # - Determine number of day(s) in PERIODICIT E168 PeriodLengthInDays=$( IGCM_date_DaysInCurrentPeriod ${DateBegin} ${ensemble_Ens_PERTURB_PERIODICIT E} )169 170 # - Determine number of day(s) in DUREE171 DureeLengthInDays=$(( $( IGCM_date_DaysInCurrentPeriod ${DateBegin} ${ensemble_Ens_PERTURB_ DUREE} ) - 1 ))200 # - Determine number of day(s) in PERIODICITY 201 PeriodLengthInDays=$( IGCM_date_DaysInCurrentPeriod ${DateBegin} ${ensemble_Ens_PERTURB_PERIODICITY} ) 202 203 # - Determine number of day(s) in LENGTH 204 DureeLengthInDays=$(( $( IGCM_date_DaysInCurrentPeriod ${DateBegin} ${ensemble_Ens_PERTURB_LENGTH} ) - 1 )) 172 205 173 206 # - Determine DateEnd … … 175 208 176 209 # - Build directory name 177 IGCM_ensemble_CastDirectoryName ${ensemble_Ens_PERTURB_NAME} ${ensemble_Ens_PERTURB_PERIODICIT E} $year $month $StartDir210 IGCM_ensemble_CastDirectoryName ${ensemble_Ens_PERTURB_NAME} ${ensemble_Ens_PERTURB_PERIODICITY} $year $month $StartDir 178 211 179 212 # - Determine RestartDate … … 209 242 if [ ! -d ${SUBMIT_DIR}/${StartDir}/${MemberDir} ] ; then 210 243 IGCM_sys_Mkdir ${SUBMIT_DIR}/${StartDir}/${MemberDir} 211 #IGCM_sys_Cp -r COMP/ PARAM/ ${StartDir}/${MemberDir}212 244 IGCM_sys_Cd ${SUBMIT_DIR}/${StartDir}/${MemberDir} 213 245 ln -s ../../COMP 214 246 ln -s ../../PARAM 215 247 ln -s ../../POST 248 ln -s ../../DRIVER 216 249 IGCM_sys_Cd ${RUN_DIR} 217 250 IGCM_sys_Cp config.card run.card.init ${SUBMIT_DIR}/${StartDir}/${MemberDir} 218 IGCM_sys_Cp Job_${ ensemble_Ens_PERTURB_NAME} ${SUBMIT_DIR}/${StartDir}/${MemberDir}/${JobName}251 IGCM_sys_Cp Job_${config_UserChoices_JobName} ${SUBMIT_DIR}/${StartDir}/${MemberDir}/${JobName} 219 252 220 253 # Dump command to be lauched 221 254 echo "cd ${StartDir}/${MemberDir}/ ;" >> ${RUN_DIR}/Qsub.${StartDir}.txt 222 255 echo "${SUBMIT} ${JobName} ; cd -" >> ${RUN_DIR}/Qsub.${StartDir}.txt 256 257 # * Update files : config.card, Job_, COMP/comp.card 258 IGCM_ensemble_CastFilesUpdate ${DateBegin} ${DateEnd} ${RestartDate} 259 260 # * Apply noise on restart file 261 IGCM_ensemble_CastPerturbFile 223 262 fi 224 225 # * Update files : config.card, Job_, COMP/comp.card 226 IGCM_ensemble_CastFilesUpdate ${DateBegin} ${DateEnd} ${RestartDate} 227 228 # * Apply noise on restart file 229 IGCM_ensemble_CastPerturbFile 230 263 231 264 (( i = i + 1 )) 232 265 done … … 237 270 # - Next DateBegin 238 271 echo "$DateBegin $PeriodLengthInDays" 239 case ${ensemble_Ens_PERTURB_PERIODICIT E} in272 case ${ensemble_Ens_PERTURB_PERIODICITY} in 240 273 *[Yy]|*[Mm]) 241 274 (( DateBegin = $( IGCM_date_AddDaysToGregorianDate ${DateBegin} ${PeriodLengthInDays} ) )) … … 266 299 while [ $DateNum -lt ${#ensemble_Ens_PERTURB_NONPERIODIC[*]} ] ; do 267 300 DateBegin=${ensemble_Ens_PERTURB_NONPERIODIC[$DateNum]} 268 Duree=${ensemble_Ens_PERTURB_ DUREE_NONPERIODIC[$DateNum]}301 Duree=${ensemble_Ens_PERTURB_LENGTH_NONPERIODIC[$DateNum]} 269 302 echo ">${DateBegin}<" 270 303 echo ">${Duree}<" 271 304 272 # - Determine number of day(s) in DUREE_NONPERIODIC305 # - Determine number of day(s) in LENGTH_NONPERIODIC 273 306 IGCM_date_GetYearMonth ${DateBegin} year month 274 307 DureeLengthInDays=$(( $( IGCM_date_DaysInCurrentPeriod ${DateBegin} ${Duree} ) - 1 )) … … 323 356 ln -s ../../PARAM 324 357 ln -s ../../POST 358 ln -s ../../DRIVER 325 359 IGCM_sys_Cd ${RUN_DIR} 326 360 IGCM_sys_Cp config.card run.card.init ${SUBMIT_DIR}/${StartDir}/${MemberDir} 327 IGCM_sys_Cp Job_${ ensemble_Ens_PERTURB_NAME} ${SUBMIT_DIR}/${StartDir}/${MemberDir}/Job_${MemberDir}361 IGCM_sys_Cp Job_${config_UserChoices_JobName} ${SUBMIT_DIR}/${StartDir}/${MemberDir}/Job_${MemberDir} 328 362 329 363 # Dump command to be lauched 330 364 echo "cd ${StartDir}/${MemberDir}/ ;" >> Qsub.${StartDir}.txt 331 365 echo "${SUBMIT} ${JobName} ; cd -" >> Qsub.${StartDir}.txt 366 367 # * Update files : config.card, Job_, COMP/comp.card 368 echo "${PeriodDateEnd} ? ${DateEnd}" 369 if [ ${PeriodDateEnd} -gt ${DateEnd} ] ; then 370 DateEnd=${PeriodDateEnd} 371 fi 372 IGCM_ensemble_CastFilesUpdate ${DateBegin} ${DateEnd} ${RestartDate} 373 374 # * Apply noise on restart file 375 IGCM_ensemble_CastPerturbFile 332 376 fi 333 334 # * Update files : config.card, Job_, COMP/comp.card 335 echo "${PeriodDateEnd} ? ${DateEnd}" 336 if [ ${PeriodDateEnd} -gt ${DateEnd} ] ; then 337 DateEnd=${PeriodDateEnd} 338 fi 339 IGCM_ensemble_CastFilesUpdate ${DateBegin} ${DateEnd} ${RestartDate} 340 341 # * Apply noise on restart file 342 IGCM_ensemble_CastPerturbFile 377 343 378 (( i = i + 1 )) 344 379 done … … 381 416 382 417 # ==> Job 383 sed -e "s/\(#.*\)${ ensemble_Ens_PERTURB_NAME}\( *#.*\)/\1${MemberDir} \2/" \384 -e "s/\(#.*Script_Output_\)${ ensemble_Ens_PERTURB_NAME}\(\.*\)/\1${MemberDir}\2/" \418 sed -e "s/\(#.*\)${config_UserChoices_JobName}\( *#.*\)/\1${MemberDir} \2/" \ 419 -e "s/\(#.*Script_Output_\)${config_UserChoices_JobName}\(\.*\)/\1${MemberDir}\2/" \ 385 420 -e "s/^PeriodNb=.*/PeriodNb=60/" \ 386 421 ${SUBMIT_DIR}/${StartDir}/${MemberDir}/Job_${MemberDir} > Job_${MemberDir}.tmp … … 601 636 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card ${PerturbComp} RestartJobName ${MemberDir} 602 637 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card ${PerturbComp} RestartPath ${RestartDir}/ 603 638 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card Ensemble EnsembleType "Ens_PERTURB" 639 604 640 IGCM_debug_PopStack "IGCM_ensemble_CastPerturbFile" 605 641 } 642 643 ############### Date ENSEMBLE ################# 644 function IGCM_ensemble_DateInit 645 { 646 IGCM_debug_PushStack "IGCM_ensemble_DateInit" 647 648 IGCM_sys_Mkdir ${RUN_DIR} 649 650 IGCM_sys_Cp ${SUBMIT_DIR}/config.card ${RUN_DIR} 651 IGCM_sys_Cp ${SUBMIT_DIR}/ensemble.card ${RUN_DIR} 652 IGCM_sys_Cp ${SUBMIT_DIR}/Job_* ${RUN_DIR} 653 IGCM_sys_Cp ${SUBMIT_DIR}/run.card.init ${RUN_DIR} 654 if [ -f ${SUBMIT_DIR}/Qsub.* ]; then 655 IGCM_sys_Cp ${SUBMIT_DIR}/Qsub.* ${RUN_DIR} 656 fi 657 658 IGCM_card_DefineVariableFromOption ${FileName} Ens_DATE active 659 IGCM_card_DefineVariableFromOption ${FileName} Ens_DATE NAME 660 IGCM_card_DefineVariableFromOption ${FileName} Ens_DATE BEGIN_INIT 661 IGCM_card_DefineVariableFromOption ${FileName} Ens_DATE BEGIN_RESTART 662 IGCM_card_DefineVariableFromOption ${FileName} Ens_DATE END_INIT 663 IGCM_card_DefineVariableFromOption ${FileName} Ens_DATE PERIODICITY 664 IGCM_card_DefineArrayFromOption ${FileName} Ens_DATE NONPERIODIC 665 IGCM_card_DefineArrayFromOption ${FileName} Ens_DATE RESTART_NONPERIODIC 666 IGCM_card_DefineVariableFromOption ${FileName} Ens_DATE LENGTH 667 IGCM_card_DefineArrayFromOption ${FileName} Ens_DATE LENGTH_NONPERIODIC 668 IGCM_card_DefineVariableFromOption ${FileName} Ens_DATE INITFROM 669 IGCM_card_DefineVariableFromOption ${FileName} Ens_DATE INITPATH 670 IGCM_card_DefineVariableFromOption config.card UserChoices JobName 671 IGCM_card_DefineVariableFromOption config.card UserChoices TagName 672 IGCM_card_DefineVariableFromOption config.card UserChoices CalendarType 673 IGCM_card_DefineArrayFromSection config.card ListOfComponents 674 675 echo 676 IGCM_debug_Print 1 "[Ens_DATE]" 677 IGCM_debug_Print 1 "ACTIVE = ${ensemble_Ens_DATE_active}" 678 IGCM_debug_Print 1 "NAME = ${ensemble_Ens_DATE_NAME}" 679 IGCM_debug_Print 1 "BEGIN_INIT = ${ensemble_Ens_DATE_BEGIN_INIT}" 680 IGCM_debug_Print 1 "END_INIT = ${ensemble_Ens_DATE_END_INIT}" 681 IGCM_debug_Print 1 "PERIODICITY = ${ensemble_Ens_DATE_PERIODICITY}" 682 IGCM_debug_Print 1 "BEGIN_RESTART = ${ensemble_Ens_DATE_BEGIN_RESTART}" 683 IGCM_debug_Print 1 "NONPERIODIC = ${ensemble_Ens_DATE_NONPERIODIC[*]}" 684 IGCM_debug_Print 1 "RESTART_NONPERIODIC= ${ensemble_Ens_DATE_RESTART_NONPERIODIC[*]}" 685 IGCM_debug_Print 1 "LENGTH = ${ensemble_Ens_DATE_LENGTH}" 686 IGCM_debug_Print 1 "LENGTH_NONPERIODIC = ${ensemble_Ens_DATE_LENGTH_NONPERIODIC[*]}" 687 IGCM_debug_Print 1 "INITFROM = ${ensemble_Ens_DATE_INITFROM}" 688 IGCM_debug_Print 1 "INITPATH = ${ensemble_Ens_DATE_INITPATH}" 689 IGCM_debug_Print 1 "JobName = ${config_UserChoices_JobName}" 690 IGCM_debug_Print 1 "TagName = ${config_UserChoices_TagName}" 691 IGCM_debug_Print 1 "CalendarType = ${config_UserChoices_CalendarType}" 692 IGCM_debug_Print 1 "ListOfComponents = ${config_ListOfComponents[*]}" 693 echo "" 694 695 ensemble_Ens_DATE_MEMBER=1 # actually use only 1 member 696 IGCM_ensemble_SetAlpha ${ensemble_Ens_DATE_MEMBER} 697 698 IGCM_debug_Print 1 "Check args..." 699 DatePeriodicStart=false 700 DateNonPeriodicStart=false 701 702 # ... Check LENGTH ... 703 case ${ensemble_Ens_DATE_LENGTH} in 704 *[Yy]|*[Mm]) 705 IGCM_debug_Print 1 "Default simulation duration : ${ensemble_Ens_DATE_LENGTH}" ;; 706 *) 707 IGCM_debug_Exit "IGCM_ensemble_DateInit ${ensemble_Ens_DATE_LENGTH} invalid LENGTH" 708 IGCM_debug_Exit "Choose a value in choose in *Y or *M" 709 IGCM_debug_Verif_Exit ;; 710 esac 711 712 # *************************************** 713 # A few checks Period case: 714 # *************************************** 715 # if all Periodic params are not filled: desactivate Periodic mode 716 totalPeriodArgs=4 717 periodFillArgs=0 718 719 if [[ X${ensemble_Ens_DATE_BEGIN_RESTART} != "X" ]]; then 720 (( periodFillArgs = periodFillArgs + 1 )) 721 fi 722 723 if [[ X${ensemble_Ens_DATE_BEGIN_INIT} != "X" ]]; then 724 (( periodFillArgs = periodFillArgs + 1 )) 725 fi 726 727 if [[ X${ensemble_Ens_DATE_END_INIT} != "X" ]]; then 728 (( periodFillArgs = periodFillArgs + 1 )) 729 fi 730 731 if [[ X${ensemble_Ens_DATE_PERIODICITY} != "X" ]]; then 732 (( periodFillArgs = periodFillArgs + 1 )) 733 734 # ... Check PERIODICITY ... 735 case ${ensemble_Ens_DATE_PERIODICITY} in 736 *[Yy]|*[Mm]) 737 IGCM_debug_Print 1 "Periodic length : ${ensemble_Ens_DATE_PERIODICITY}" ;; 738 *) 739 IGCM_debug_Exit "IGCM_ensemble_DateInit ${ensemble_Ens_DATE_PERIODICITY} : invalid PERIODICITY" 740 IGCM_debug_Exit "Choose a value in *Y or *M" 741 IGCM_debug_Verif_Exit ;; 742 esac 743 fi # if periodicity 744 745 if [[ ${periodFillArgs} = ${totalPeriodArgs} ]]; then 746 DatePeriodicStart=true 747 else 748 if [[ ${periodFillArgs} = 0 ]]; then 749 IGCM_debug_Print 1 "Periodic start NOT ACTIVE" 750 DatePeriodicStart=false 751 else 752 IGCM_debug_Exit "IGCM_ensemble_DateInit missing arguments for Periodic mode!" 753 IGCM_debug_Exit "Get only ${periodFillArgs} on ${totalPeriodArgs} args. Check ${FileName} file." 754 IGCM_debug_Verif_Exit 755 fi 756 fi 757 758 # *************************************** 759 # A few checks for the Non-Periodic case: 760 # *************************************** 761 if [[ ${#ensemble_Ens_DATE_NONPERIODIC[*]} != ${#ensemble_Ens_DATE_RESTART_NONPERIODIC[*]} ]] ; then 762 IGCM_debug_Exit "IGCM_ensemble_DateInit: NONPERIODIC and RESTART_NONPERIODIC lists have different sizes" 763 IGCM_debug_Verif_Exit 764 fi 765 766 # Use LENGTH if no NONPERIODIC_LENGTH given 767 if [[ ${#ensemble_Ens_DATE_NONPERIODIC[*]} > 0 ]] && [[ ${ensemble_Ens_DATE_NONPERIODIC[*]} != _0_ ]]; then 768 DateNonPeriodicStart=true 769 770 if [[ ${#ensemble_Ens_DATE_LENGTH_NONPERIODIC[*]} < ${#ensemble_Ens_DATE_NONPERIODIC[*]} ]] ; then 771 IGCM_debug_Print 1 "WARNING: LENGTH_NONPERIODIC is not fill (or not correctly). Use LENGTH value '${ensemble_Ens_DATE_LENGTH}' for all NONPERIODIC runs" 772 DateNum=0 773 while [ $DateNum -lt ${#ensemble_Ens_DATE_NONPERIODIC[*]} ] ; do 774 ensemble_Ens_DATE_LENGTH_NONPERIODIC[DateNum]=${ensemble_Ens_DATE_LENGTH} 775 (( DateNum = DateNum + 1 )) 776 done 777 fi 778 else 779 IGCM_debug_Print 1 "Non-Periodic start NOT ACTIVE" 780 DateNonPeriodicStart=false 781 fi 782 783 if [[ ${DateNonPeriodicStart} = true ]]; then 784 DateNum=0 785 while [ $DateNum -lt ${#ensemble_Ens_DATE_NONPERIODIC[*]} ] ; do 786 # - Check LENGTH_NONPERIODIC 787 case ${ensemble_Ens_DATE_LENGTH_NONPERIODIC[$DateNum]} in 788 *[Yy]|*[Mm]) 789 IGCM_debug_Print 1 "Non-periodic duration $DateNum: ${ensemble_Ens_DATE_LENGTH_NONPERIODIC[$DateNum]}" 790 ;; 791 *) 792 IGCM_debug_Exit "IGCM_ensemble_DateInit ${ensemble_Ens_DATE_LENGTH_NONPERIODIC[$DateNum]} : invalid NON PERIODIC LENGTH" 793 IGCM_debug_Exit "choose in *Y or *M" 794 IGCM_debug_Verif_Exit ;; 795 esac 796 797 # - Check RESTART_NONPERIODIC 798 case ${ensemble_Ens_DATE_RESTART_NONPERIODIC[$DateNum]} in 799 _0_) 800 IGCM_debug_Exit "IGCM_ensemble_DateInit ${ensemble_Ens_DATE_RESTART_NONPERIODIC[$DateNum]} : invalid NON PERIODIC RESTART" 801 IGCM_debug_Verif_Exit ;; 802 esac 803 804 (( DateNum = DateNum + 1 )) 805 done 806 fi # DateNonPeriodicStart = true 807 808 IGCM_debug_PopStack "IGCM_ensemble_DateInit" 809 } 810 811 function IGCM_ensemble_DatePeriodicStarts 812 { 813 IGCM_debug_PushStack "IGCM_ensemble_DatePeriodicStarts" 814 815 [ ${DatePeriodicStart} = false ] && return 816 817 echo 818 IGCM_debug_Print 1 ">>> MANAGE PERIODIC STARTS <<<" 819 820 #.. Manage periodic starts .. 821 # ====================== 822 823 # - Build directory name 824 StartDir="${ensemble_Ens_DATE_NAME}" 825 826 # - Create directory for current DateBegin 827 if [ ! -d ${StartDir} ] ; then 828 IGCM_sys_Mkdir ${SUBMIT_DIR}/${StartDir} 829 IGCM_sys_Cd ${SUBMIT_DIR}/${StartDir} 830 ln -s ../../.resol . 831 ln -s ../../.libmpi . 832 IGCM_sys_Cd ${RUN_DIR} 833 fi 834 835 # ... Loop over DateBegin ... 836 eval DateBegin=\${ensemble_Ens_DATE_BEGIN_INIT} 837 eval RestartDate=\${ensemble_Ens_DATE_BEGIN_RESTART} 838 839 while [ ${DateBegin} -le ${ensemble_Ens_DATE_END_INIT} ] ; do 840 IGCM_date_GetYearMonth ${DateBegin} year month 841 842 echo "========================================================================" 843 echo "New DateBegin = $DateBegin" 844 845 # - Determine number of day(s) in PERIODICITY 846 PeriodLengthInDays=$( IGCM_date_DaysInCurrentPeriod ${DateBegin} ${ensemble_Ens_DATE_PERIODICITY} ) 847 848 # - Determine number of day(s) in LENGTH 849 DureeLengthInDays=$(( $( IGCM_date_DaysInCurrentPeriod ${DateBegin} ${ensemble_Ens_DATE_LENGTH} ) - 1 )) 850 851 # - Determine DateEnd 852 (( DateEnd = $( IGCM_date_AddDaysToGregorianDate ${DateBegin} ${DureeLengthInDays} ) )) 853 854 IGCM_debug_Print 2 "${DateBegin} => ${DateEnd} : ${StartDir}" 855 echo "${DateBegin} ${DateEnd} ${StartDir}" >> ${RUN_DIR}/CreatedDir.txt 856 857 # - Loop over members (default =1 no member) 858 i=0 859 while [ $i -lt ${ensemble_Ens_DATE_MEMBER} ] ; do 860 MemberDir="${ensemble_Ens_DATE_INITFROM}${RestartDate}${Alpha[$i]}" 861 echo 862 IGCM_debug_Print 3 "${MemberDir}" 863 864 JobName="Job_${MemberDir}" 865 866 # * Create directory if it doesn't exist and copy/link files 867 if [ ! -d ${SUBMIT_DIR}/${StartDir}/${MemberDir} ] ; then 868 IGCM_sys_Mkdir ${SUBMIT_DIR}/${StartDir}/${MemberDir} 869 IGCM_sys_Cd ${SUBMIT_DIR}/${StartDir}/${MemberDir} 870 ln -s ../../COMP 871 ln -s ../../PARAM 872 ln -s ../../POST 873 ln -s ../../DRIVER 874 IGCM_sys_Cd ${RUN_DIR} 875 IGCM_sys_Cp config.card run.card.init ${SUBMIT_DIR}/${StartDir}/${MemberDir} 876 IGCM_sys_Cp Job_${config_UserChoices_JobName} ${SUBMIT_DIR}/${StartDir}/${MemberDir}/${JobName} 877 878 # Dump command to be lauched 879 echo "cd ${StartDir}/${MemberDir}/ ;" >> ${RUN_DIR}/Qsub.${StartDir}.txt 880 echo "${SUBMIT} ${JobName} ; cd -" >> ${RUN_DIR}/Qsub.${StartDir}.txt 881 882 # * Update files : config.card, Job_, COMP/comp.card 883 IGCM_ensemble_DateFilesUpdate ${DateBegin} ${DateEnd} ${RestartDate} 884 fi 885 886 (( i = i + 1 )) 887 done 888 889 # - Next DateBegin & RestartDate 890 echo "$DateBegin $PeriodLengthInDays" 891 case ${ensemble_Ens_DATE_PERIODICITY} in 892 *[Yy]|*[Mm]) 893 (( DateBegin = $( IGCM_date_AddDaysToGregorianDate ${DateBegin} ${PeriodLengthInDays} ) )) 894 (( RestartDate = $( IGCM_date_AddDaysToGregorianDate ${RestartDate} ${PeriodLengthInDays} ) )) 895 ;; 896 esac 897 898 done 899 900 # Done. Save ${StartDir} submission text file 901 IGCM_sys_Cp ${RUN_DIR}/Qsub.${StartDir}.txt ${SUBMIT_DIR} 902 903 IGCM_debug_PopStack "IGCM_ensemble_DatePeriodicStarts" 904 } 905 906 function IGCM_ensemble_DateNonPeriodicStarts 907 { 908 IGCM_debug_PushStack "IGCM_ensemble_DateNonPeriodicStarts" 909 910 #.. Manage non periodic starts => Loop over DateBegin .. 911 # ========================== 912 913 [ ${DateNonPeriodicStart} = false ] && return 914 915 echo 916 IGCM_debug_Print 1 ">>> MANAGE NON PERIODIC STARTS <<<" 917 918 # - Build directory name 919 echo "" 920 echo "========================================================================" 921 echo "ensemble_Ens_DATE_NAME = ${ensemble_Ens_DATE_NAME}" 922 StartDir="${ensemble_Ens_DATE_NAME}" 923 924 # - Does $StartDir already exist ? 925 if [ ! -d ${SUBMIT_DIR}/${StartDir} ] ; then 926 IGCM_sys_Mkdir ${SUBMIT_DIR}/${StartDir} 927 IGCM_sys_Cd ${SUBMIT_DIR}/${StartDir} 928 ln -s ../../.resol . 929 ln -s ../../.libmpi . 930 IGCM_sys_Cd ${RUN_DIR} 931 fi 932 933 DateNum=0 934 # ... Loop over ensemble_Ens_DATE_NONPERIODIC ... 935 while [ $DateNum -lt ${#ensemble_Ens_DATE_NONPERIODIC[*]} ] ; do 936 DateBegin=${ensemble_Ens_DATE_NONPERIODIC[$DateNum]} 937 Duree=${ensemble_Ens_DATE_LENGTH_NONPERIODIC[$DateNum]} 938 RestartDate=${ensemble_Ens_DATE_RESTART_NONPERIODIC[$DateNum]} 939 940 # - Determine number of day(s) in LENGTH_NONPERIODIC 941 IGCM_date_GetYearMonth ${DateBegin} year month 942 DureeLengthInDays=$(( $( IGCM_date_DaysInCurrentPeriod ${DateBegin} ${Duree} ) - 1 )) 943 944 # - Determine DateEnd 945 (( DateEnd = $( IGCM_date_AddDaysToGregorianDate ${DateBegin} ${DureeLengthInDays} ) )) 946 947 IGCM_debug_Print 2 "${DateBegin} => ${DateEnd} : ${StartDir}" 948 echo "${DateBegin} ${DateEnd} ${StartDir}" >> ${RUN_DIR}/CreatedDir.txt 949 950 PeriodDateEnd=$( grep -m1 ${StartDir} ${RUN_DIR}/CreatedDir.txt | cut -f2 -d\ ) 951 952 # - Loop over members 953 i=0 954 while [ $i -lt ${ensemble_Ens_DATE_MEMBER} ] ; do 955 MemberDir="${ensemble_Ens_DATE_INITFROM}${RestartDate}${Alpha[$i]}" 956 IGCM_debug_Print 3 "${MemberDir}" 957 958 JobName="Job_${MemberDir}" 959 960 # * Create directory if it doesn't exist and copy files 961 if [ ! -d ${SUBMIT_DIR}/${StartDir}/${MemberDir} ] ; then 962 IGCM_sys_Mkdir ${SUBMIT_DIR}/${StartDir}/${MemberDir} 963 IGCM_sys_Cd ${SUBMIT_DIR}/${StartDir}/${MemberDir} 964 ln -s ../../COMP 965 ln -s ../../PARAM 966 ln -s ../../POST 967 ln -s ../../DRIVER 968 IGCM_sys_Cd ${RUN_DIR} 969 IGCM_sys_Cp config.card run.card.init ${SUBMIT_DIR}/${StartDir}/${MemberDir} 970 IGCM_sys_Cp Job_${config_UserChoices_JobName} ${SUBMIT_DIR}/${StartDir}/${MemberDir}/Job_${MemberDir} 971 972 # Dump command to be lauched 973 echo "cd ${StartDir}/${MemberDir}/ ;" >> ${RUN_DIR}/Qsub.${StartDir}.txt 974 echo "${SUBMIT} ${JobName} ; cd -" >> ${RUN_DIR}/Qsub.${StartDir}.txt 975 976 # * Update files : config.card, Job_, COMP/comp.card 977 IGCM_ensemble_DateFilesUpdate ${DateBegin} ${DateEnd} ${RestartDate} 978 fi 979 980 (( i = i + 1 )) 981 done 982 983 # Done. Save ${StartDir} submission text file 984 IGCM_sys_Cp ${RUN_DIR}/Qsub.${StartDir}.txt ${SUBMIT_DIR} 985 986 (( DateNum = DateNum + 1 )) 987 done 988 989 # Done. Save ${StartDir} submission text file 990 IGCM_sys_Cp ${RUN_DIR}/Qsub.${StartDir}.txt ${SUBMIT_DIR} 991 992 IGCM_debug_PopStack "IGCM_ensemble_DateNonPeriodicStarts" 993 } 994 995 function IGCM_ensemble_DateFilesUpdate 996 { 997 IGCM_debug_PushStack "IGCM_ensemble_DateFilesUpdate" 998 999 # Debug Print : 1000 echo 1001 IGCM_debug_Print 1 "IGCM_ensemble_DateFilesUpdate :" 1002 1003 HumanDateBegin=$( IGCM_date_ConvertFormatToHuman ${1} ) 1004 HumanDateEnd=$( IGCM_date_ConvertFormatToHuman ${2} ) 1005 HumanRestartDate=$( IGCM_date_ConvertFormatToHuman ${3} ) 1006 # ==> config.card 1007 # [ENSEMBLE] 1008 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card Ensemble EnsembleRun 'y' 1009 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card Ensemble EnsembleName ${ensemble_Ens_DATE_NAME} 1010 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card Ensemble EnsembleDate ${HumanDateBegin} 1011 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card Ensemble EnsembleType "Ens_DATE" 1012 1013 # [UserChoices] 1014 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card UserChoices JobName ${MemberDir} 1015 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card UserChoices DateBegin ${HumanDateBegin} 1016 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card UserChoices DateEnd ${HumanDateEnd} 1017 1018 # [Restarts] 1019 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card Restarts OverRule "y" 1020 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card Restarts RestartDate ${HumanRestartDate} 1021 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card Restarts RestartJobName ${ensemble_Ens_DATE_INITFROM} 1022 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card Restarts RestartPath ${ensemble_Ens_DATE_INITPATH} 1023 1024 # [ATM/OCE/...] 1025 for comp in ${config_ListOfComponents[*]} ; do 1026 IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card ${comp} Restart "n" 1027 done 1028 1029 # ==> Job 1030 sed -e "s/\(#.*\)${config_UserChoices_JobName}\( *#.*\)/\1${MemberDir} \2/" \ 1031 -e "s/\(#.*Script_Output_\)${config_UserChoices_JobName}\(\.*\)/\1${MemberDir}\2/" \ 1032 -e "s/^PeriodNb=.*/PeriodNb=60/" \ 1033 ${SUBMIT_DIR}/${StartDir}/${MemberDir}/Job_${MemberDir} > Job_${MemberDir}.tmp 1034 IGCM_sys_Mv Job_${MemberDir}.tmp ${SUBMIT_DIR}/${StartDir}/${MemberDir}/Job_${MemberDir} 1035 1036 IGCM_debug_PopStack "IGCM_ensemble_DateFilesUpdate" 1037 } 1038 1039 ############### Parametric ENSEMBLE #################
Note: See TracChangeset
for help on using the changeset viewer.