Changeset 1001 for trunk/libIGCM


Ignore:
Timestamp:
04/16/14 18:03:11 (10 years ago)
Author:
sdipsl
Message:

New features and refactoring within libIGCM_ensemble.ksh see #180 and #181

  1. Lebas.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/libIGCM/libIGCM_ensemble/libIGCM_ensemble.ksh

    r895 r1001  
    22 
    33#************************************************************** 
    4 # Author: Sonia Labetoulle 
    5 # Contact: Sonia.Labetoulle__at__locean-ipsl.upmc.fr 
     4# Author: Sebastien Denvil, Sonia Labetoulle, Nicolas Lebas 
     5# Contact: Nicolas.Lebas__at__locean-ipsl.upmc.fr 
    66# $Revision::                                          $ Revision of last commit 
    77# $Author::                                            $ Author of last commit 
     
    1212#************************************************************** 
    1313 
    14 function IGCM_ensemble_CastInit 
    15 { 
    16   IGCM_debug_PushStack "IGCM_ensemble_CastInit" 
    17  
     14# Read which ensemble type are active 
     15function 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 
     32function IGCM_ensemble_SetAlpha 
     33{ 
     34  IGCM_debug_PushStack "IGCM_ensemble_SetAlpha" 
     35   
    1836  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 
    1937  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 ################# 
     43function IGCM_ensemble_CastInit 
     44{ 
     45  IGCM_debug_PushStack "IGCM_ensemble_CastInit" 
    2046 
    2147  IGCM_sys_Mkdir ${RUN_DIR} 
     
    2551  IGCM_sys_Cp ${SUBMIT_DIR}/Job_*         ${RUN_DIR} 
    2652  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   
    2857  # Useful? 
    2958  #if [ -f  ${SUBMIT_DIR}/CreatedDir.txt ] ; then 
     
    3564  #fi 
    3665 
    37   IGCM_card_DefineVariableFromOption ${FileName} Ens_PERTURB actif 
    3866  IGCM_card_DefineVariableFromOption ${FileName} Ens_PERTURB NAME 
    39   IGCM_card_DefineVariableFromOption ${FileName} Ens_PERTURB DEBUT_INIT 
    40   IGCM_card_DefineVariableFromOption ${FileName} Ens_PERTURB FIN_INIT 
    41   IGCM_card_DefineVariableFromOption ${FileName} Ens_PERTURB PERIODICITE 
     67  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 
    4270  IGCM_card_DefineArrayFromOption    ${FileName} Ens_PERTURB NONPERIODIC 
    43   IGCM_card_DefineVariableFromOption ${FileName} Ens_PERTURB DUREE 
    44   IGCM_card_DefineArrayFromOption    ${FileName} Ens_PERTURB DUREE_NONPERIODIC 
     71  IGCM_card_DefineVariableFromOption ${FileName} Ens_PERTURB LENGTH 
     72  IGCM_card_DefineArrayFromOption    ${FileName} Ens_PERTURB LENGTH_NONPERIODIC 
    4573  IGCM_card_DefineVariableFromOption ${FileName} Ens_PERTURB MEMBER 
    4674  IGCM_card_DefineArrayFromOption    ${FileName} Ens_PERTURB PERTURB_BIN 
    4775  IGCM_card_DefineVariableFromOption ${FileName} Ens_PERTURB INITFROM 
    4876  IGCM_card_DefineVariableFromOption ${FileName} Ens_PERTURB INITPATH 
     77  IGCM_card_DefineVariableFromOption config.card UserChoices JobName 
    4978  IGCM_card_DefineVariableFromOption config.card UserChoices TagName 
    5079  IGCM_card_DefineVariableFromOption config.card UserChoices CalendarType 
     
    5281 
    5382  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}" 
    5585  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 "PERIODICITE       = ${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}" 
    5989  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[*]}" 
    6292  IGCM_debug_Print 1 "MEMBER            = ${ensemble_Ens_PERTURB_MEMBER}" 
    6393  IGCM_debug_Print 1 "PERTURB_BIN       = ${ensemble_Ens_PERTURB_PERTURB_BIN[*]}" 
    6494  IGCM_debug_Print 1 "INITFROM          = ${ensemble_Ens_PERTURB_INITFROM}" 
    6595  IGCM_debug_Print 1 "INITPATH          = ${ensemble_Ens_PERTURB_INITPATH}" 
     96  IGCM_debug_Print 1 "JobName           = ${config_UserChoices_JobName}" 
    6697  IGCM_debug_Print 1 "TagName           = ${config_UserChoices_TagName}" 
    6798  IGCM_debug_Print 1 "CalendarType      = ${config_UserChoices_CalendarType}" 
    6899  IGCM_debug_Print 1 "ListOfComponents  = ${config_ListOfComponents[*]}" 
    69  
     100   
    70101  PerturbExe=${ensemble_Ens_PERTURB_PERTURB_BIN[0]} 
    71102  PerturbComp=${ensemble_Ens_PERTURB_PERTURB_BIN[1]} 
     
    79110  IGCM_debug_Print 1 "PerturbVar  = ${PerturbVar}" 
    80111  IGCM_debug_Print 1 "PerturbAmp  = ${PerturbAmp}" 
    81  
     112   
     113  IGCM_ensemble_SetAlpha ${ensemble_Ens_PERTURB_MEMBER} 
     114   
    82115  # A few checks Period case: 
    83116 
    84   # ... Check PERIODICITE ... 
    85   case ${ensemble_Ens_PERTURB_PERIODICITE} in 
     117  # ... Check PERIODICITY ... 
     118  case ${ensemble_Ens_PERTURB_PERIODICITY} in 
    86119  _0_) 
    87120    IGCM_debug_Print 1 "periodic start not active" 
     
    90123  *[Yy]|*[Mm]) 
    91124    CastPeriodicStart=true 
    92     IGCM_debug_Print 1 "Periodic length : ${ensemble_Ens_PERTURB_PERIODICITE}" ;; 
     125    IGCM_debug_Print 1 "Periodic length : ${ensemble_Ens_PERTURB_PERIODICITY}" ;; 
    93126  *) 
    94     IGCM_debug_Exit "IGCM_ensemble_CastInit ${ensemble_Ens_PERTURB_PERIODICITE} : invalid PERIODICITE" 
     127    IGCM_debug_Exit "IGCM_ensemble_CastInit ${ensemble_Ens_PERTURB_PERIODICITY} : invalid PERIODICITY" 
    95128    IGCM_debug_Exit "Choose a value in *Y or *M" 
    96129    IGCM_debug_Verif_Exit ;; 
    97130  esac 
    98 # ... Check DUREE ... 
    99   case ${ensemble_Ens_PERTURB_DUREE} in 
     131# ... Check LENGTH ... 
     132  case ${ensemble_Ens_PERTURB_LENGTH} in 
    100133  *[Yy]|*[Mm]) 
    101     IGCM_debug_Print 1 "Periodic duration : ${ensemble_Ens_PERTURB_DUREE}" ;; 
     134    IGCM_debug_Print 1 "Periodic duration : ${ensemble_Ens_PERTURB_LENGTH}" ;; 
    102135  *) 
    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" 
    104137    IGCM_debug_Exit "Choose a value in choose in *Y or *M" 
    105138    IGCM_debug_Verif_Exit ;; 
     
    110143  while [ $DateNum -lt ${#ensemble_Ens_PERTURB_NONPERIODIC[*]} ] ; do 
    111144 
    112     # - Check DUREE_NONPERIODIC 
    113     case ${ensemble_Ens_PERTURB_DUREE_NONPERIODIC[$DateNum]} in 
     145    # - Check LENGTH_NONPERIODIC 
     146    case ${ensemble_Ens_PERTURB_LENGTH_NONPERIODIC[$DateNum]} in 
    114147    _0_) 
    115148      IGCM_debug_Print 1 "non-periodic start not active" 
     
    117150      ;; 
    118151    *[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]}" 
    120153      CastNonPeriodicStart=true 
    121154      ;; 
    122155    *) 
    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" 
    124157      IGCM_debug_Exit "choose in *Y or *M" 
    125158      IGCM_debug_Verif_Exit ;; 
     
    160193 
    161194# ... Loop over DateBegin ... 
    162   eval DateBegin=\${ensemble_Ens_PERTURB_DEBUT_INIT} 
    163  
    164   while [ ${DateBegin} -le ${ensemble_Ens_PERTURB_FIN_INIT} ] ; do 
     195  eval DateBegin=\${ensemble_Ens_PERTURB_BEGIN_INIT} 
     196 
     197  while [ ${DateBegin} -le ${ensemble_Ens_PERTURB_END_INIT} ] ; do 
    165198    IGCM_date_GetYearMonth ${DateBegin} year month 
    166199 
    167   # - Determine number of day(s) in PERIODICITE 
    168     PeriodLengthInDays=$( IGCM_date_DaysInCurrentPeriod ${DateBegin} ${ensemble_Ens_PERTURB_PERIODICITE} ) 
    169  
    170   # - Determine number of day(s) in DUREE 
    171     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 )) 
    172205 
    173206  # - Determine DateEnd 
     
    175208 
    176209  # - Build directory name 
    177     IGCM_ensemble_CastDirectoryName ${ensemble_Ens_PERTURB_NAME} ${ensemble_Ens_PERTURB_PERIODICITE} $year $month $StartDir 
     210    IGCM_ensemble_CastDirectoryName ${ensemble_Ens_PERTURB_NAME} ${ensemble_Ens_PERTURB_PERIODICITY} $year $month $StartDir 
    178211 
    179212  # - Determine RestartDate 
     
    209242      if [ ! -d  ${SUBMIT_DIR}/${StartDir}/${MemberDir} ] ; then 
    210243        IGCM_sys_Mkdir ${SUBMIT_DIR}/${StartDir}/${MemberDir} 
    211         #IGCM_sys_Cp -r COMP/ PARAM/ ${StartDir}/${MemberDir} 
    212244        IGCM_sys_Cd ${SUBMIT_DIR}/${StartDir}/${MemberDir} 
    213245        ln -s ../../COMP 
    214246        ln -s ../../PARAM 
    215247        ln -s ../../POST 
     248        ln -s ../../DRIVER 
    216249        IGCM_sys_Cd ${RUN_DIR} 
    217250        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} 
    219252 
    220253        # Dump command to be lauched 
    221254        echo "cd ${StartDir}/${MemberDir}/ ;"  >> ${RUN_DIR}/Qsub.${StartDir}.txt 
    222255        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 
    223262      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       
    231264      (( i = i + 1 )) 
    232265    done 
     
    237270  # - Next DateBegin 
    238271    echo "$DateBegin  $PeriodLengthInDays" 
    239     case ${ensemble_Ens_PERTURB_PERIODICITE} in 
     272    case ${ensemble_Ens_PERTURB_PERIODICITY} in 
    240273    *[Yy]|*[Mm]) 
    241274      (( DateBegin = $( IGCM_date_AddDaysToGregorianDate ${DateBegin} ${PeriodLengthInDays} ) )) 
     
    266299  while [ $DateNum -lt ${#ensemble_Ens_PERTURB_NONPERIODIC[*]} ] ; do 
    267300    DateBegin=${ensemble_Ens_PERTURB_NONPERIODIC[$DateNum]} 
    268     Duree=${ensemble_Ens_PERTURB_DUREE_NONPERIODIC[$DateNum]} 
     301    Duree=${ensemble_Ens_PERTURB_LENGTH_NONPERIODIC[$DateNum]} 
    269302    echo ">${DateBegin}<" 
    270303    echo ">${Duree}<" 
    271304 
    272   # - Determine number of day(s) in DUREE_NONPERIODIC 
     305  # - Determine number of day(s) in LENGTH_NONPERIODIC 
    273306    IGCM_date_GetYearMonth ${DateBegin} year month 
    274307    DureeLengthInDays=$(( $( IGCM_date_DaysInCurrentPeriod ${DateBegin} ${Duree} ) - 1 )) 
     
    323356        ln -s ../../PARAM 
    324357        ln -s ../../POST 
     358        ln -s ../../DRIVER 
    325359        IGCM_sys_Cd ${RUN_DIR} 
    326360        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} 
    328362 
    329363        # Dump command to be lauched 
    330364        echo "cd ${StartDir}/${MemberDir}/ ;"  >> Qsub.${StartDir}.txt 
    331365        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 
    332376      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       
    343378      (( i = i + 1 )) 
    344379    done 
     
    381416 
    382417  # ==> 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/" \ 
    385420      -e "s/^PeriodNb=.*/PeriodNb=60/"                                                  \ 
    386421      ${SUBMIT_DIR}/${StartDir}/${MemberDir}/Job_${MemberDir} > Job_${MemberDir}.tmp 
     
    601636  IGCM_card_WriteOption ${SUBMIT_DIR}/${StartDir}/${MemberDir}/config.card ${PerturbComp} RestartJobName ${MemberDir} 
    602637  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   
    604640  IGCM_debug_PopStack "IGCM_ensemble_CastPerturbFile" 
    605641} 
     642 
     643############### Date ENSEMBLE ################# 
     644function 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 
     811function 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 
     906function 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 
     995function 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.