Ignore:
Timestamp:
07/24/14 16:45:56 (10 years ago)
Author:
sdipsl
Message:

Addon for 3D perturbation mechanism. see #197
Cosmetics
SN

File:
1 edited

Legend:

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

    r1007 r1026  
    22 
    33#************************************************************** 
    4 # Author: Sebastien Denvil, Sonia Labetoulle, Nicolas Lebas 
     4# Author: Sebastien Denvil, Sonia Labetoulle, Nicolas Lebas, Sebastien Nguyen 
    55# Contact: Nicolas.Lebas__at__locean-ipsl.upmc.fr 
    66# $Revision::                                          $ Revision of last commit 
     
    1010#  This software is governed by the CeCILL licence see libIGCM/libIGCM_CeCILL.LIC 
    1111# 
     12# >>> Date ensemble <<< 
     13# Author: Nicolas Lebas (adapted from Sonia Labetoulle) 
     14# Contact: Nicolas.Lebas__at__locean-ipsl.upmc.fr 
     15# IPSL (2014) 
     16# 
     17# >>> Add 3D perturbation maps to oceanic restart <<< 
     18# Author: Sebastien Nguyen 
     19# Contact: Sebastien.Nguyen__at__locean-ipsl.upmc.fr 
     20# IPSL (2014) 
     21# 
    1222#************************************************************** 
    1323 
     
    2131  IGCM_card_DefineVariableFromOption ${F_CFG_ENS} Ens_PARAMETRIC active 
    2232 
    23   IGCM_debug_Print 1 "Ens_PERTURB ACTIVE       = ${ensemble_Ens_PERTURB_active}" 
    24   IGCM_debug_Print 1 "Ens_DATE ACTIVE       = ${ensemble_Ens_DATE_active}" 
     33  IGCM_debug_Print 1 "Ens_PERTURB ACTIVE     = ${ensemble_Ens_PERTURB_active}" 
     34  IGCM_debug_Print 1 "Ens_DATE ACTIVE        = ${ensemble_Ens_DATE_active}" 
    2535  IGCM_debug_Print 1 "Ens_PARAMETRIC ACTIVE  = ${ensemble_Ens_PARAMETRIC_active}" 
    2636  echo "" 
     
    5262  IGCM_sys_Cp ${SUBMIT_DIR}/run.card.init ${RUN_DIR} 
    5363  if [ -f ${SUBMIT_DIR}/Qsub.* ]; then 
    54       IGCM_sys_Cp ${SUBMIT_DIR}/Qsub.*        ${RUN_DIR} 
     64    IGCM_sys_Cp ${SUBMIT_DIR}/Qsub.*        ${RUN_DIR} 
    5565  fi 
    5666  if [ -f ${SUBMIT_DIR}/Qclean.* ]; then 
    57       IGCM_sys_Cp ${SUBMIT_DIR}/Qclean.*      ${RUN_DIR} 
     67    IGCM_sys_Cp ${SUBMIT_DIR}/Qclean.*      ${RUN_DIR} 
    5868  fi 
    5969 
     
    6676  #  IGCM_sys_Cp ${SUBMIT_DIR}/Qsub.sh ${RUN_DIR} 
    6777  #fi 
     78  echo ${PWD} 
     79 
     80  IGCM_card_DefineVariableFromOption ${F_CFG_ENS} Ens_PERTURB active 
    6881  IGCM_card_DefineVariableFromOption ${F_CFG_ENS} Ens_PERTURB NAME 
    6982  IGCM_card_DefineVariableFromOption ${F_CFG_ENS} Ens_PERTURB BEGIN_INIT 
     
    7487  IGCM_card_DefineArrayFromOption    ${F_CFG_ENS} Ens_PERTURB LENGTH_NONPERIODIC 
    7588  IGCM_card_DefineVariableFromOption ${F_CFG_ENS} Ens_PERTURB MEMBER 
     89  IGCM_card_DefineArrayFromOption    ${F_CFG_ENS} Ens_PERTURB MEMBER_LIST 
     90  IGCM_card_DefineArrayFromOption    ${F_CFG_ENS} Ens_PERTURB MEMBER_NAMESLIST 
     91  IGCM_card_DefineVariableFromOption ${F_CFG_ENS} Ens_PERTURB MEMBER_INITFROM 
     92  IGCM_card_DefineVariableFromOption ${F_CFG_ENS} Ens_PERTURB MEMBER_INITPATH 
    7693  IGCM_card_DefineArrayFromOption    ${F_CFG_ENS} Ens_PERTURB PERTURB_BIN 
    7794  IGCM_card_DefineVariableFromOption ${F_CFG_ENS} Ens_PERTURB INITFROM 
     
    93110  IGCM_debug_Print 1 "LENGTH_NONPERIODIC = ${ensemble_Ens_PERTURB_LENGTH_NONPERIODIC[*]}" 
    94111  IGCM_debug_Print 1 "MEMBER            = ${ensemble_Ens_PERTURB_MEMBER}" 
     112  IGCM_debug_Print 1 "MEMBER_LIST       = ${ensemble_Ens_PERTURB_MEMBER_LIST[*]}" 
     113  IGCM_debug_Print 1 "MEMBER_NAMESLIST  = ${ensemble_Ens_PERTURB_MEMBER_NAMESLIST[*]}" 
     114  IGCM_debug_Print 1 "MEMBER_INITFROM   = ${ensemble_Ens_PERTURB_MEMBER_INITFROM}" 
     115  IGCM_debug_Print 1 "MEMBER_INITPATH   = ${ensemble_Ens_PERTURB_MEMBER_INITPATH}" 
    95116  IGCM_debug_Print 1 "PERTURB_BIN       = ${ensemble_Ens_PERTURB_PERTURB_BIN[*]}" 
    96117  IGCM_debug_Print 1 "INITFROM          = ${ensemble_Ens_PERTURB_INITFROM}" 
     
    102123 
    103124  PerturbExe=${ensemble_Ens_PERTURB_PERTURB_BIN[0]} 
    104   PerturbComp=${ensemble_Ens_PERTURB_PERTURB_BIN[1]} 
    105   PerturbFile=${ensemble_Ens_PERTURB_PERTURB_BIN[2]} 
    106   PerturbVar=${ensemble_Ens_PERTURB_PERTURB_BIN[3]} 
    107   PerturbAmp=${ensemble_Ens_PERTURB_PERTURB_BIN[4]} 
    108  
    109   IGCM_debug_Print 1 "PerturbExe  = ${PerturbExe}" 
    110   IGCM_debug_Print 1 "PerturbFile = ${PerturbFile}" 
    111   IGCM_debug_Print 1 "PerturbComp = ${PerturbComp}" 
    112   IGCM_debug_Print 1 "PerturbVar  = ${PerturbVar}" 
    113   IGCM_debug_Print 1 "PerturbAmp  = ${PerturbAmp}" 
     125 
     126  case ${PerturbExe} in 
     127  AddNoise) 
     128    PerturbComp=${ensemble_Ens_PERTURB_PERTURB_BIN[1]} 
     129    PerturbFile=${ensemble_Ens_PERTURB_PERTURB_BIN[2]} 
     130    PerturbVar=${ensemble_Ens_PERTURB_PERTURB_BIN[3]} 
     131    PerturbAmp=${ensemble_Ens_PERTURB_PERTURB_BIN[4]} 
     132 
     133    IGCM_debug_Print 1 "PerturbExe  = ${PerturbExe}" 
     134    IGCM_debug_Print 1 "PerturbFile = ${PerturbFile}" 
     135    IGCM_debug_Print 1 "PerturbComp = ${PerturbComp}" 
     136    IGCM_debug_Print 1 "PerturbVar  = ${PerturbVar}" 
     137    IGCM_debug_Print 1 "PerturbAmp  = ${PerturbAmp}" 
     138    ;; 
     139  AddPertu3DOCE) 
     140    PerturbComp=${ensemble_Ens_PERTURB_PERTURB_BIN[1]} 
     141    PerturbFile=${ensemble_Ens_PERTURB_PERTURB_BIN[2]} 
     142    PerturbVar=${ensemble_Ens_PERTURB_PERTURB_BIN[3]} 
     143    PerturbMask=${ensemble_Ens_PERTURB_PERTURB_BIN[4]} 
     144 
     145    IGCM_card_DefineVariableFromOption ${F_CFG_ENS} Ens_PERTURB MASKPATH 
     146 
     147    IGCM_debug_Print 1 "PerturbExe  = ${PerturbExe}" 
     148    IGCM_debug_Print 1 "PerturbFile = ${PerturbFile}" 
     149    IGCM_debug_Print 1 "PerturbComp = ${PerturbComp}" 
     150    IGCM_debug_Print 1 "PerturbVar  = ${PerturbVar}" 
     151    IGCM_debug_Print 1 "PerturbMask = ${PerturbMask}" 
     152    IGCM_debug_Print 1 "MASK PATH   = ${ensemble_Ens_PERTURB_MASKPATH}" 
     153    ;; 
     154  esac 
    114155 
    115156  IGCM_ensemble_SetAlpha ${ensemble_Ens_PERTURB_MEMBER} 
     
    119160  # ... Check PERIODICITY ... 
    120161  case ${ensemble_Ens_PERTURB_PERIODICITY} in 
    121   _0_) 
     162  NONE) 
    122163    IGCM_debug_Print 1 "periodic start not active" 
    123164    CastPeriodicStart=false 
     
    131172    IGCM_debug_Verif_Exit ;; 
    132173  esac 
    133 # ... Check LENGTH ... 
     174  # ... Check LENGTH ... 
    134175  case ${ensemble_Ens_PERTURB_LENGTH} in 
    135176  *[Yy]|*[Mm]) 
     
    143184  # A few checks for the Non-Periodic case: 
    144185  DateNum=0 
    145   while [ $DateNum -lt ${#ensemble_Ens_PERTURB_NONPERIODIC[*]} ] ; do 
     186  while [ ${DateNum} -lt ${#ensemble_Ens_PERTURB_NONPERIODIC[*]} ] ; do 
    146187 
    147188    # - Check LENGTH_NONPERIODIC 
    148     case ${ensemble_Ens_PERTURB_LENGTH_NONPERIODIC[$DateNum]} in 
     189    case ${ensemble_Ens_PERTURB_LENGTH_NONPERIODIC[${DateNum}]} in 
    149190    _0_) 
    150191      IGCM_debug_Print 1 "non-periodic start not active" 
     
    152193      ;; 
    153194    *[Yy]|*[Mm]) 
    154       IGCM_debug_Print 1 "Non-periodic duration : ${ensemble_Ens_PERTURB_LENGTH_NONPERIODIC[$DateNum]}" 
     195      IGCM_debug_Print 1 "Non-periodic duration : ${ensemble_Ens_PERTURB_LENGTH_NONPERIODIC[${DateNum}]}" 
    155196      CastNonPeriodicStart=true 
    156197      ;; 
    157198    *) 
    158       IGCM_debug_Exit "IGCM_ensemble_CastInit ${ensemble_Ens_PERTURB_LENGTH_NONPERIODIC[$DateNum]} : invalid LENGTH" 
     199      IGCM_debug_Exit "IGCM_ensemble_CastInit ${ensemble_Ens_PERTURB_LENGTH_NONPERIODIC[${DateNum}]} : invalid LENGTH" 
    159200      IGCM_debug_Exit "choose in *Y or *M" 
    160201      IGCM_debug_Verif_Exit ;; 
     
    162203    (( DateNum = DateNum + 1 )) 
    163204  done 
     205 
     206  # A few checks for the MEMBER_LIST case: 
     207  case ${ensemble_Ens_PERTURB_MEMBER_LIST[0]} in 
     208  _0_) 
     209    IGCM_debug_Print 1 "list of perturbation maps not active" 
     210    CastMemberList=false 
     211    ;; 
     212  *) 
     213    if [ ${CastPeriodicStart} = "true" ] ; then 
     214      IGCM_debug_Exit "list of perturbation maps for periodic start not implemented, will stop execution" 
     215      IGCM_debug_Verif_Exit 
     216    elif [ ${CastNonPeriodicStart} = "true" ] ; then 
     217      IGCM_debug_Exit "list of perturbation maps for non periodic start not implemented, will stop execution" 
     218      IGCM_debug_Verif_Exit 
     219    fi 
     220 
     221    # test that MEMBER_NAMESLIST and MEMBER_LIST have the same size 
     222 
     223    if [ ${#ensemble_Ens_PERTURB_MEMBER_LIST[*]} -ne ${#ensemble_Ens_PERTURB_MEMBER_NAMESLIST[*]} ] ; then 
     224      IGCM_debug_Exit "number of elements in MEMBER_LIST and MEMBER_NAMESLIST differ" 
     225      IGCM_debug_Verif_Exit 
     226    fi 
     227 
     228    IGCM_debug_Print 1 "list of perturbation maps : ${ensemble_Ens_PERTURB_MEMBER_LIST[*]}" 
     229    IGCM_debug_Print 1 "list of members names : ${ensemble_Ens_PERTURB_MEMBER_NAMESLIST[*]}" 
     230    CastMemberList=true 
     231    ;; 
     232  esac 
     233 
     234#  IGCM_debug_Exit "fin du test MEMBER_LIST" 
     235#  IGCM_debug_Verif_Exit 
    164236 
    165237  # Need to know all the restart filename of the component we will apply the noise to 
     
    307379  echo ">${DateNum}<" 
    308380  echo ">${#ensemble_Ens_PERTURB_NONPERIODIC[*]}<" 
    309   while [ $DateNum -lt ${#ensemble_Ens_PERTURB_NONPERIODIC[*]} ] ; do 
    310     DateBegin=${ensemble_Ens_PERTURB_NONPERIODIC[$DateNum]} 
    311     Duree=${ensemble_Ens_PERTURB_LENGTH_NONPERIODIC[$DateNum]} 
     381  while [ ${DateNum} -lt ${#ensemble_Ens_PERTURB_NONPERIODIC[*]} ] ; do 
     382    DateBegin=${ensemble_Ens_PERTURB_NONPERIODIC[${DateNum}]} 
     383    Duree=${ensemble_Ens_PERTURB_LENGTH_NONPERIODIC[${DateNum}]} 
    312384    echo ">${DateBegin}<" 
    313385    echo ">${Duree}<" 
     
    384456        echo "${PeriodDateEnd} ? ${DateEnd}" 
    385457        if [ ${PeriodDateEnd} -gt ${DateEnd} ] ; then 
    386             DateEnd=${PeriodDateEnd} 
     458          DateEnd=${PeriodDateEnd} 
    387459        fi 
    388460        IGCM_ensemble_CastFilesUpdate ${DateBegin} ${DateEnd} ${RestartDate} 
     
    403475  done 
    404476  IGCM_debug_PopStack "IGCM_ensemble_CastNonPeriodicStarts" 
     477} 
     478 
     479function IGCM_ensemble_CastMemberList 
     480{ 
     481  IGCM_debug_PushStack "IGCM_ensemble_CastMemberList" 
     482 
     483  if [ ${CastMemberList} = false ] ; then 
     484    IGCM_debug_PopStack "IGCM_ensemble_CastMemberList" 
     485    return 
     486  fi 
     487 
     488  echo 
     489  IGCM_debug_Print 1 "Manage members list" 
     490 
     491#.. Manage members list .. 
     492#   ====================== 
     493 
     494  # DateBegin 
     495  eval DateBegin=\${ensemble_Ens_PERTURB_BEGIN_INIT} 
     496 
     497  IGCM_date_GetYearMonth ${DateBegin} year month 
     498 
     499  # - Determine number of day(s) in LENGTH 
     500  DureeLengthInDays=$(( $( IGCM_date_DaysInCurrentPeriod ${DateBegin} ${ensemble_Ens_PERTURB_LENGTH} ) - 1 )) 
     501 
     502  # - Determine DateEnd 
     503  DateEnd = $( IGCM_date_AddDaysToGregorianDate ${DateBegin} ${DureeLengthInDays} ) 
     504 
     505  # bad hack enforce yearly for parent directory name 
     506  # - Build directory name 
     507  IGCM_ensemble_CastDirectoryName ${ensemble_Ens_PERTURB_NAME} 1Y $year $month $StartDir 
     508 
     509  # - Determine RestartDate 
     510  (( Offset = -1 )) 
     511  RestartDate = $( IGCM_date_AddDaysToGregorianDate ${DateBegin} ${Offset} ) 
     512 
     513  IGCM_debug_Print 2 "${DateBegin} => ${DateEnd} : ${StartDir}" 
     514  echo "${DateBegin} ${DateEnd} ${StartDir}" >> ${RUN_DIR}/CreatedDir.txt 
     515 
     516  # - Create directory for current DateBegin 
     517  if [ ! -d  ${StartDir} ] ; then 
     518    IGCM_sys_Mkdir ${SUBMIT_DIR}/${StartDir} 
     519    IGCM_sys_Cd ${SUBMIT_DIR}/${StartDir} 
     520    ln -s ../../.resol . 
     521    ln -s ../../.libmpi . 
     522    IGCM_sys_Cd ${RUN_DIR} 
     523  fi 
     524 
     525  # - Create directory to store modified restart files 
     526  RestartDir=${STORAGE}/IGCM_IN/${config_UserChoices_TagName}/${StartDir} 
     527  IGCM_sys_MkdirArchive ${RestartDir} 
     528 
     529  # - Loop over members 
     530  i=0 
     531  nbmember=${#ensemble_Ens_PERTURB_MEMBER_LIST[*]} 
     532  while [ $i -lt $nbmember ] ; do 
     533    MemberDir=${ensemble_Ens_PERTURB_MEMBER_NAMESLIST[${i}]} 
     534    MemberVec=${ensemble_Ens_PERTURB_MEMBER_LIST[${i}]} 
     535 
     536    JobName="Job_${MemberDir}" 
     537    echo 
     538    IGCM_debug_Print 3 "${MemberDir}" 
     539 
     540    # * Create directory if it doesn't exist and copy/link files 
     541    if [ ! -d  ${SUBMIT_DIR}/${StartDir}/${MemberDir} ] ; then 
     542      IGCM_sys_Mkdir ${SUBMIT_DIR}/${StartDir}/${MemberDir} 
     543      IGCM_sys_Cd ${SUBMIT_DIR}/${StartDir}/${MemberDir} 
     544      ln -s ../../COMP 
     545      ln -s ../../PARAM 
     546      ln -s ../../POST 
     547      ln -s ../../DRIVER 
     548      IGCM_sys_Cd ${RUN_DIR} 
     549      IGCM_sys_Cp config.card run.card.init ${SUBMIT_DIR}/${StartDir}/${MemberDir} 
     550      IGCM_sys_Cp Job_${config_UserChoices_JobName} ${SUBMIT_DIR}/${StartDir}/${MemberDir}/${JobName} 
     551 
     552      # Dump command to be lauched 
     553      echo "cd ${StartDir}/${MemberDir}/ ;"     >> ${RUN_DIR}/Qsub.${StartDir}.sh 
     554      echo "${SUBMIT} ${JobName} ; cd -"        >> ${RUN_DIR}/Qsub.${StartDir}.sh 
     555 
     556      echo "cd ${StartDir}/${MemberDir}/ ;"     >> ${RUN_DIR}/Qclean.month.${StartDir}.sh 
     557      echo "${libIGCM}/clean_month.job ; cd -"  >> ${RUN_DIR}/Qclean.month.${StartDir}.sh 
     558 
     559      echo "cd ${StartDir}/${MemberDir}/ ;"     >> ${RUN_DIR}/Qclean.year.${StartDir}.sh 
     560      echo "${libIGCM}/clean_year.job ; cd -"   >> ${RUN_DIR}/Qclean.year.${StartDir}.sh 
     561 
     562      # * Update files : config.card, Job_, COMP/comp.card 
     563      IGCM_ensemble_CastFilesUpdate ${DateBegin} ${DateEnd} ${RestartDate} 
     564 
     565      # * Apply noise on restart file 
     566      IGCM_ensemble_CastPerturbFile 
     567    fi 
     568 
     569    (( i = i + 1 )) 
     570  done 
     571 
     572  # Done. Save ${StartDir} submission text file 
     573  IGCM_sys_Cp ${RUN_DIR}/Qsub.${StartDir}.sh ${SUBMIT_DIR} 
     574  IGCM_sys_Cp ${RUN_DIR}/Qclean.month.${StartDir}.sh ${SUBMIT_DIR} 
     575  IGCM_sys_Cp ${RUN_DIR}/Qclean.year.${StartDir}.sh ${SUBMIT_DIR} 
     576 
     577  IGCM_debug_PopStack "IGCM_ensemble_CastMemberList" 
    405578} 
    406579 
     
    436609  sed -e "s/\(#.*\)${config_UserChoices_JobName}\( *#.*\)/\1${MemberDir} \2/"            \ 
    437610      -e "s/\(#.*Script_Output_\)${config_UserChoices_JobName}\(\.*\)/\1${MemberDir}\2/" \ 
    438       -e "s/^PeriodNb=.*/PeriodNb=60/"                                                  \ 
     611      -e "s/^PeriodNb=.*/PeriodNb=60/"                                                   \ 
    439612      ${SUBMIT_DIR}/${StartDir}/${MemberDir}/Job_${MemberDir} > Job_${MemberDir}.tmp 
    440613  IGCM_sys_Mv Job_${MemberDir}.tmp ${SUBMIT_DIR}/${StartDir}/${MemberDir}/Job_${MemberDir} 
     
    459632  # - Build directory name 
    460633  case ${Duree} in 
    461     *Y|*y) 
    462       siecle="$( echo $year | cut -c1-2 )" 
    463       siecle=$( (( $siecle - 18 )) ) 
    464       StartYear="${siecle}$( echo $year | cut -c3-4 )" 
    465       StartDir="${Name}${StartYear}" 
    466       ;; 
    467     *M|*m) 
    468       echo $month 
    469       siecle="$( echo $year | cut -c1-2 )" 
    470       siecle=$( (( $siecle - 18 )) ) 
    471       StartYear="${siecle}$( echo $year | cut -c3-4 )" 
    472       StartMonth="${AlphaMonth[ (( 10#${month} - 1 )) ]}" 
    473       StartDir="${Name}${StartYear}${StartMonth}" 
    474       ;; 
     634  *Y|*y) 
     635    siecle="$( echo $year | cut -c1-2 )" 
     636    siecle=$( (( $siecle - 18 )) ) 
     637    StartYear="${siecle}$( echo $year | cut -c3-4 )" 
     638    StartDir="${Name}${StartYear}" 
     639    ;; 
     640  *M|*m) 
     641    echo $month 
     642    siecle="$( echo $year | cut -c1-2 )" 
     643    siecle=$( (( $siecle - 18 )) ) 
     644    StartYear="${siecle}$( echo $year | cut -c3-4 )" 
     645    StartMonth="${AlphaMonth[ (( 10#${month} - 1 )) ]}" 
     646    StartDir="${Name}${StartYear}${StartMonth}" 
     647    ;; 
    475648  esac 
    476649 
     
    482655  IGCM_debug_PushStack "IGCM_ensemble_CastPerturbFile" 
    483656 
    484   typeset i i_ j j4 file_out file_out_ 
     657  typeset i i_ j 
     658  typeset -Z4 j4 
     659  typeset file_out file_out_ 
    485660 
    486661  #.. Debug Print .. 
     
    597772 
    598773        elif [ X${Tared} = Xtrue ] ; then 
     774          IGCM_debug_Print 2 "IGCM_sys_Mv ${PerturbComp}_${FileIn}_${j4}.nc ${RUN_DIR}/${FileOut}_${j4}.nc" 
    599775          IGCM_sys_Mv ${PerturbComp}_${FileIn}_${j4}.nc ${RUN_DIR}/${FileOut}_${j4}.nc 
    600776 
     
    624800 
    625801      elif [ X${Tared} = Xtrue ] ; then 
     802        IGCM_debug_Print 2 "IGCM_sys_Mv ${PerturbComp}_${FileIn}.nc ${RUN_DIR}/${FileOut}.nc" 
    626803        IGCM_sys_Mv ${PerturbComp}_${FileIn}.nc ${RUN_DIR}/${FileOut}.nc 
    627804 
    628805        for generic in ${OtherGenericList[*]} ; do 
     806          IGCM_debug_Print 2 "IGCM_sys_Mv ${PerturbComp}_${ensemble_Ens_PERTURB_INITFROM}_${RestartDate}_${generic}.nc ${DirOut}/${MemberDir}_${RestartDate}_${generic}.nc" 
    629807          IGCM_sys_Mv ${PerturbComp}_${ensemble_Ens_PERTURB_INITFROM}_${RestartDate}_${generic}.nc ${DirOut}/${MemberDir}_${RestartDate}_${generic}.nc 
    630808        done 
     
    637815    ######################## 
    638816 
    639     IGCM_sys_Chmod 644 ${RUN_DIR}/${FileOut}.nc 
    640     IGCM_debug_Print 1 "${PerturbExe} ${RUN_DIR}/${FileOut}.nc ${PerturbVar} ${PerturbAmp}" 
    641     echo 
    642     ${PerturbExe} ${RUN_DIR}/${FileOut}.nc ${PerturbVar} ${PerturbAmp} > /dev/null 2>&1 
    643  
    644     if [ $? -ne 0 ] ; then 
    645       IGCM_debug_Exit "Abend $( basename ${PerturbExe} )" 
    646       IGCM_debug_Verif_Exit 
    647     fi 
    648     IGCM_sys_Put_Out ${RUN_DIR}/${FileOut}.nc ${DirOut}/ 644 
     817# treat the perturbation on different components by looking at the executable name 
     818 
     819    case ${PerturbExe} in 
     820    (AddNoise) 
     821      IGCM_sys_Chmod 644 ${RUN_DIR}/${FileOut}.nc 
     822 
     823      IGCM_debug_Print 1 "${PerturbExe} ${RUN_DIR}/${FileOut}.nc ${PerturbVar} ${PerturbAmp}" 
     824      echo 
     825 
     826      ${PerturbExe} ${RUN_DIR}/${FileOut}.nc ${PerturbVar} ${PerturbAmp}  > /dev/null 2>&1 
     827      if [ $? -ne 0 ] ; then 
     828        IGCM_debug_Exit "Abend $( basename ${PerturbExe} )" 
     829        IGCM_debug_Verif_Exit 
     830      fi 
     831      IGCM_sys_Put_Out ${RUN_DIR}/${FileOut}.nc ${DirOut}/ 644 
     832      ;; 
     833    (AddPertu3DOCE) 
     834      # where to find the pattern we apply to the restart 
     835      PatternFile=${ensemble_Ens_PERTURB_MEMBER_INITPATH}/${ensemble_Ens_PERTURB_MEMBER_INITFROM}/${MemberVec}.nc 
     836 
     837      # where to find the land mask for the grid 
     838      MaskFile=${ensemble_Ens_PERTURB_MASKPATH}/${PerturbMask} 
     839 
     840      # if there is multiple restart files rebuild restart file 
     841      if [ ${nb_restart_file} -gt 1 ] ; then 
     842        IGCM_debug_Print 1 "rebuild files ${FileOut}_????.nc" 
     843        IGCM_sys_rebuild ${RUN_DIR}/${FileOut}.nc ${RUN_DIR}/${FileOut}_????.nc 
     844      fi 
     845 
     846      # there is now a single restart file 
     847      IGCM_sys_Chmod 644 ${RUN_DIR}/${FileOut}.nc 
     848 
     849      IGCM_debug_Print 1 "${PerturbExe} ${RUN_DIR}/${FileOut}.nc ${PerturbVar} ${PatternFile} ${MaskFile}" 
     850      echo 
     851 
     852      # add pattern to restart file on variable PerturbVar 
     853      ${PerturbExe} ${RUN_DIR}/${FileOut}.nc ${PerturbVar} ${PatternFile} ${MaskFile}  > /dev/null 2>&1 
     854      if [ $? -ne 0 ] ; then 
     855        IGCM_debug_Exit "Abend $( basename ${PerturbExe} )" 
     856        IGCM_debug_Verif_Exit 
     857      fi 
     858      IGCM_sys_Put_Out ${RUN_DIR}/${FileOut}.nc ${DirOut}/ 644 
     859     ;; 
     860    esac 
     861 
    649862  fi 
    650863 
     
    671884  IGCM_sys_Cp ${SUBMIT_DIR}/run.card.init ${RUN_DIR} 
    672885  if [ -f ${SUBMIT_DIR}/Qsub.* ]; then 
    673         IGCM_sys_Cp ${SUBMIT_DIR}/Qsub.*        ${RUN_DIR} 
     886    IGCM_sys_Cp ${SUBMIT_DIR}/Qsub.*        ${RUN_DIR} 
    674887  fi 
    675888  if [ -f ${SUBMIT_DIR}/Qclean.* ]; then 
    676         IGCM_sys_Cp ${SUBMIT_DIR}/Qclean.*      ${RUN_DIR} 
     889    IGCM_sys_Cp ${SUBMIT_DIR}/Qclean.*      ${RUN_DIR} 
    677890  fi 
    678891 
     
    741954 
    742955  if [[ X${ensemble_Ens_DATE_BEGIN_RESTART} != "X" ]]; then 
    743       (( periodFillArgs = periodFillArgs + 1 )) 
     956    (( periodFillArgs = periodFillArgs + 1 )) 
    744957  fi 
    745958 
    746959  if [[ X${ensemble_Ens_DATE_BEGIN_INIT} != "X" ]]; then 
    747       (( periodFillArgs = periodFillArgs + 1 )) 
     960    (( periodFillArgs = periodFillArgs + 1 )) 
    748961  fi 
    749962 
    750963  if [[ X${ensemble_Ens_DATE_END_INIT} != "X" ]]; then 
    751       (( periodFillArgs = periodFillArgs + 1 )) 
     964    (( periodFillArgs = periodFillArgs + 1 )) 
    752965  fi 
    753966 
    754967  if [[ X${ensemble_Ens_DATE_PERIODICITY} != "X" ]]; then 
    755       (( periodFillArgs = periodFillArgs + 1 )) 
    756  
    757       # ... Check PERIODICITY ... 
    758       case ${ensemble_Ens_DATE_PERIODICITY} in 
    759           *[Yy]|*[Mm]) 
    760               IGCM_debug_Print 1 "Periodic length : ${ensemble_Ens_DATE_PERIODICITY}" ;; 
    761           *) 
    762               IGCM_debug_Exit "IGCM_ensemble_DateInit ${ensemble_Ens_DATE_PERIODICITY} : invalid PERIODICITY" 
    763               IGCM_debug_Exit "Choose a value in *Y or *M" 
    764               IGCM_debug_Verif_Exit ;; 
    765       esac 
     968    (( periodFillArgs = periodFillArgs + 1 )) 
     969 
     970    # ... Check PERIODICITY ... 
     971    case ${ensemble_Ens_DATE_PERIODICITY} in 
     972    *[Yy]|*[Mm]) 
     973      IGCM_debug_Print 1 "Periodic length : ${ensemble_Ens_DATE_PERIODICITY}" ;; 
     974    *) 
     975      IGCM_debug_Exit "IGCM_ensemble_DateInit ${ensemble_Ens_DATE_PERIODICITY} : invalid PERIODICITY" 
     976      IGCM_debug_Exit "Choose a value in *Y or *M" 
     977      IGCM_debug_Verif_Exit ;; 
     978    esac 
    766979  fi # if periodicity 
    767980 
    768981  if [[ ${periodFillArgs} = ${totalPeriodArgs} ]]; then 
    769       DatePeriodicStart=true 
     982    DatePeriodicStart=true 
    770983  else 
    771       if [[ ${periodFillArgs} = 0 ]]; then 
    772           IGCM_debug_Print 1 "Periodic start NOT ACTIVE" 
    773           DatePeriodicStart=false 
    774       else 
    775           IGCM_debug_Exit "IGCM_ensemble_DateInit missing arguments for Periodic mode!" 
    776           IGCM_debug_Exit "Get only ${periodFillArgs} on ${totalPeriodArgs} args. Check ${F_CFG_ENS} file." 
    777           IGCM_debug_Verif_Exit 
    778       fi 
     984    if [[ ${periodFillArgs} = 0 ]]; then 
     985      IGCM_debug_Print 1 "Periodic start NOT ACTIVE" 
     986      DatePeriodicStart=false 
     987    else 
     988      IGCM_debug_Exit "IGCM_ensemble_DateInit missing arguments for Periodic mode!" 
     989      IGCM_debug_Exit "Get only ${periodFillArgs} on ${totalPeriodArgs} args. Check ${F_CFG_ENS} file." 
     990      IGCM_debug_Verif_Exit 
     991    fi 
    779992  fi 
    780993 
     
    783996  # *************************************** 
    784997  if [[ ${#ensemble_Ens_DATE_NONPERIODIC[*]} != ${#ensemble_Ens_DATE_RESTART_NONPERIODIC[*]} ]] ; then 
    785       IGCM_debug_Exit "IGCM_ensemble_DateInit: NONPERIODIC and RESTART_NONPERIODIC lists have different sizes" 
    786       IGCM_debug_Verif_Exit 
     998    IGCM_debug_Exit "IGCM_ensemble_DateInit: NONPERIODIC and RESTART_NONPERIODIC lists have different sizes" 
     999    IGCM_debug_Verif_Exit 
    7871000  fi 
    7881001 
    7891002  if [[ ${#ensemble_Ens_DATE_NONPERIODIC[*]} > 0 ]] && [[ ${ensemble_Ens_DATE_NONPERIODIC[*]} != _0_ ]]; then 
    790       DateNonPeriodicStart=true 
    791  
    792       # Use LENGTH if no NONPERIODIC_LENGTH given 
    793       if [[ ${#ensemble_Ens_DATE_LENGTH_NONPERIODIC[*]} < ${#ensemble_Ens_DATE_NONPERIODIC[*]} ]] ; then 
    794           IGCM_debug_Print 1 "WARNING: LENGTH_NONPERIODIC is not fill (or not correctly). Use LENGTH value '${ensemble_Ens_DATE_LENGTH}' for all NONPERIODIC runs" 
    795           DateNum=0 
    796           while [ $DateNum -lt ${#ensemble_Ens_DATE_NONPERIODIC[*]} ] ; do 
    797               ensemble_Ens_DATE_LENGTH_NONPERIODIC[DateNum]=${ensemble_Ens_DATE_LENGTH} 
    798               (( DateNum = DateNum + 1 )) 
    799           done 
    800       fi 
    801  
    802       # Use INITFROM if no NONPERIODIC_INITFROM given 
    803       if [[ ${#ensemble_Ens_DATE_INITFROM_NONPERIODIC[*]} < ${#ensemble_Ens_DATE_NONPERIODIC[*]} ]] ; then 
    804           IGCM_debug_Print 1 "WARNING: INITFROM_NONPERIODIC is not fill (or not correctly). Use INITFROM value '${ensemble_Ens_DATE_INITFROM}' for all NONPERIODIC runs" 
    805           DateNum=0 
    806           while [ $DateNum -lt ${#ensemble_Ens_DATE_NONPERIODIC[*]} ] ; do 
    807               ensemble_Ens_DATE_INITFROM_NONPERIODIC[DateNum]=${ensemble_Ens_DATE_INITFROM} 
    808               (( DateNum = DateNum + 1 )) 
    809           done 
    810       fi 
     1003    DateNonPeriodicStart=true 
     1004 
     1005    # Use LENGTH if no NONPERIODIC_LENGTH given 
     1006    if [[ ${#ensemble_Ens_DATE_LENGTH_NONPERIODIC[*]} < ${#ensemble_Ens_DATE_NONPERIODIC[*]} ]] ; then 
     1007      IGCM_debug_Print 1 "WARNING: LENGTH_NONPERIODIC is not fill (or not correctly). Use LENGTH value '${ensemble_Ens_DATE_LENGTH}' for all NONPERIODIC runs" 
     1008      DateNum=0 
     1009      while [ ${DateNum} -lt ${#ensemble_Ens_DATE_NONPERIODIC[*]} ] ; do 
     1010        ensemble_Ens_DATE_LENGTH_NONPERIODIC[${DateNum}]=${ensemble_Ens_DATE_LENGTH} 
     1011        (( DateNum = DateNum + 1 )) 
     1012      done 
     1013    fi 
     1014 
     1015    # Use INITFROM if no NONPERIODIC_INITFROM given 
     1016    if [ ${#ensemble_Ens_DATE_INITFROM_NONPERIODIC[*]} -lt ${#ensemble_Ens_DATE_NONPERIODIC[*]} ] ; then 
     1017      IGCM_debug_Print 1 "WARNING: INITFROM_NONPERIODIC is not fill (or not correctly). Use INITFROM value '${ensemble_Ens_DATE_INITFROM}' for all NONPERIODIC runs" 
     1018      DateNum=0 
     1019      while [ ${DateNum} -lt ${#ensemble_Ens_DATE_NONPERIODIC[*]} ] ; do 
     1020        ensemble_Ens_DATE_INITFROM_NONPERIODIC[${DateNum}]=${ensemble_Ens_DATE_INITFROM} 
     1021        (( DateNum = DateNum + 1 )) 
     1022      done 
     1023    fi 
    8111024  else 
    812       IGCM_debug_Print 1 "Non-Periodic start NOT ACTIVE" 
    813       DateNonPeriodicStart=false 
     1025    IGCM_debug_Print 1 "Non-Periodic start NOT ACTIVE" 
     1026    DateNonPeriodicStart=false 
    8141027  fi 
    8151028 
    8161029  if [[ ${DateNonPeriodicStart} = true ]]; then 
    817       DateNum=0 
    818       while [ $DateNum -lt ${#ensemble_Ens_DATE_NONPERIODIC[*]} ] ; do 
    819           # - Check LENGTH_NONPERIODIC 
    820           case ${ensemble_Ens_DATE_LENGTH_NONPERIODIC[$DateNum]} in 
    821               *[Yy]|*[Mm]) 
    822                   IGCM_debug_Print 1 "Non-periodic duration $DateNum: ${ensemble_Ens_DATE_LENGTH_NONPERIODIC[$DateNum]}" 
    823                   ;; 
    824               *) 
    825                   IGCM_debug_Exit "IGCM_ensemble_DateInit ${ensemble_Ens_DATE_LENGTH_NONPERIODIC[$DateNum]} : invalid NON PERIODIC LENGTH" 
    826                   IGCM_debug_Exit "choose in *Y or *M" 
    827                   IGCM_debug_Verif_Exit ;; 
    828           esac 
    829  
    830           # - Check RESTART_NONPERIODIC 
    831           case ${ensemble_Ens_DATE_RESTART_NONPERIODIC[$DateNum]} in 
    832               _0_) 
    833                   IGCM_debug_Exit "IGCM_ensemble_DateInit ${ensemble_Ens_DATE_RESTART_NONPERIODIC[$DateNum]} : invalid NON PERIODIC RESTART" 
    834                   IGCM_debug_Verif_Exit ;; 
    835           esac 
    836  
    837           (( DateNum = DateNum + 1 )) 
    838       done 
     1030    DateNum=0 
     1031    while [ ${DateNum} -lt ${#ensemble_Ens_DATE_NONPERIODIC[*]} ] ; do 
     1032      # - Check LENGTH_NONPERIODIC 
     1033      case ${ensemble_Ens_DATE_LENGTH_NONPERIODIC[${DateNum}]} in 
     1034      *[Yy]|*[Mm]) 
     1035        IGCM_debug_Print 1 "Non-periodic duration ${DateNum}: ${ensemble_Ens_DATE_LENGTH_NONPERIODIC[${DateNum}]}" 
     1036        ;; 
     1037      *) 
     1038        IGCM_debug_Exit "IGCM_ensemble_DateInit ${ensemble_Ens_DATE_LENGTH_NONPERIODIC[${DateNum}]} : invalid NON PERIODIC LENGTH" 
     1039        IGCM_debug_Exit "choose in *Y or *M" 
     1040        IGCM_debug_Verif_Exit ;; 
     1041      esac 
     1042 
     1043      # - Check RESTART_NONPERIODIC 
     1044      case ${ensemble_Ens_DATE_RESTART_NONPERIODIC[${DateNum}]} in 
     1045      _0_) 
     1046        IGCM_debug_Exit "IGCM_ensemble_DateInit ${ensemble_Ens_DATE_RESTART_NONPERIODIC[${DateNum}]} : invalid NON PERIODIC RESTART" 
     1047        IGCM_debug_Verif_Exit ;; 
     1048      esac 
     1049 
     1050      (( DateNum = DateNum + 1 )) 
     1051    done 
    8391052  fi # DateNonPeriodicStart = true 
    8401053 
     
    8591072  # - Create directory for current DateBegin 
    8601073  if [ ! -d  ${StartDir} ] ; then 
    861       IGCM_sys_Mkdir ${SUBMIT_DIR}/${StartDir} 
    862       IGCM_sys_Cd ${SUBMIT_DIR}/${StartDir} 
    863       ln -s ../../.resol . 
    864       ln -s ../../.libmpi . 
    865       IGCM_sys_Cd ${RUN_DIR} 
     1074    IGCM_sys_Mkdir ${SUBMIT_DIR}/${StartDir} 
     1075    IGCM_sys_Cd ${SUBMIT_DIR}/${StartDir} 
     1076    ln -s ../../.resol . 
     1077    ln -s ../../.libmpi . 
     1078    IGCM_sys_Cd ${RUN_DIR} 
    8661079  fi 
    8671080 
     
    9671180  # -  Does $StartDir already exist ? 
    9681181  if [ ! -d ${SUBMIT_DIR}/${StartDir} ] ; then 
    969       IGCM_sys_Mkdir ${SUBMIT_DIR}/${StartDir} 
    970       IGCM_sys_Cd ${SUBMIT_DIR}/${StartDir} 
    971       ln -s ../../.resol . 
    972       ln -s ../../.libmpi . 
    973       IGCM_sys_Cd ${RUN_DIR} 
     1182    IGCM_sys_Mkdir ${SUBMIT_DIR}/${StartDir} 
     1183    IGCM_sys_Cd ${SUBMIT_DIR}/${StartDir} 
     1184    ln -s ../../.resol . 
     1185    ln -s ../../.libmpi . 
     1186    IGCM_sys_Cd ${RUN_DIR} 
    9741187  fi 
    9751188 
    9761189  DateNum=0 
    9771190  # ... Loop over ensemble_Ens_DATE_NONPERIODIC ... 
    978   while [ $DateNum -lt ${#ensemble_Ens_DATE_NONPERIODIC[*]} ] ; do 
    979     DateBegin=${ensemble_Ens_DATE_NONPERIODIC[$DateNum]} 
    980     Duree=${ensemble_Ens_DATE_LENGTH_NONPERIODIC[$DateNum]} 
    981     RestartDate=${ensemble_Ens_DATE_RESTART_NONPERIODIC[$DateNum]} 
    982     InitFrom=${ensemble_Ens_DATE_INITFROM_NONPERIODIC[$DateNum]} 
     1191  while [ ${DateNum} -lt ${#ensemble_Ens_DATE_NONPERIODIC[*]} ] ; do 
     1192    DateBegin=${ensemble_Ens_DATE_NONPERIODIC[${DateNum}]} 
     1193    Duree=${ensemble_Ens_DATE_LENGTH_NONPERIODIC[${DateNum}]} 
     1194    RestartDate=${ensemble_Ens_DATE_RESTART_NONPERIODIC[${DateNum}]} 
     1195    InitFrom=${ensemble_Ens_DATE_INITFROM_NONPERIODIC[${DateNum}]} 
    9831196 
    9841197  # - Determine number of day(s) in LENGTH_NONPERIODIC 
     
    10591272  HumanRestartDate=$( IGCM_date_ConvertFormatToHuman ${3} ) 
    10601273  if [[ X${4} != "X" ]]; then 
    1061       initFrom=${4} # non periodic config (INITFROM could be different between members) 
     1274    initFrom=${4} # non periodic config (INITFROM could be different between members) 
    10621275  else 
    1063       initFrom=${ensemble_Ens_DATE_INITFROM} # periodic (same INITFROM value) 
     1276    initFrom=${ensemble_Ens_DATE_INITFROM} # periodic (same INITFROM value) 
    10641277  fi 
    10651278 
     
    10911304  sed -e "s/\(#.*\)${config_UserChoices_JobName}\( *#.*\)/\1${MemberDir} \2/"            \ 
    10921305      -e "s/\(#.*Script_Output_\)${config_UserChoices_JobName}\(\.*\)/\1${MemberDir}\2/" \ 
    1093       -e "s/^PeriodNb=.*/PeriodNb=60/"                                                  \ 
     1306      -e "s/^PeriodNb=.*/PeriodNb=60/"                                                   \ 
    10941307      ${SUBMIT_DIR}/${StartDir}/${MemberDir}/Job_${MemberDir} > Job_${MemberDir}.tmp 
    10951308  IGCM_sys_Mv Job_${MemberDir}.tmp ${SUBMIT_DIR}/${StartDir}/${MemberDir}/Job_${MemberDir} 
Note: See TracChangeset for help on using the changeset viewer.