Ignore:
Timestamp:
12/22/11 16:04:47 (12 years ago)
Author:
sdipsl
Message:
  • Prepare libIGCM for TGCC migration. For now work for CCRT machines ONLY
  • SX8, SX9 and Titane are independant from DMNFS
    • 30 seconds between execution instead of at least 3 minutes ; sometimes hours
  • SX8, SX9 and Titane use their SCRATCHDIR as a BUFFER (for restart and text)
  • Titane simulations are entirely post-processed on titane mono
    • Working except create_se and atlas (missing software : ncap2, openpbm, ImageMagick?)
  • Cards are the same up to now
  • New indentation to ease readability ("svn diff -x -b" to ignore space when differencing)
  • Project (gen2211) is inherited from AA_job by post-processing jobs
    • will stop during config_check if Project is empty
  • Prepare easy switching (submitting post-processing here or there)
  • Homogenize CCRTs libIGCM_sys
  • Bugfixes
  • Cosmetics

First steps and still a long way to go.

File:
1 edited

Legend:

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

    r541 r544  
    1515function IGCM_config_Initialize 
    1616{ 
    17     IGCM_debug_PushStack "IGCM_config_Initialize" 
    18  
    19     # Debug Print : 
     17  IGCM_debug_PushStack "IGCM_config_Initialize" 
     18 
     19  # Debug Print : 
     20  echo 
     21  IGCM_debug_Print 1 "IGCM_config_Initialize" 
     22 
     23  if [ ! -r ${SUBMIT_DIR}/run.card ]; then  
     24    #================================================# 
     25    #         The file run.card doesn't exist        # 
     26    #================================================# 
     27    FirstInitialize=true 
     28    #copy initial run.card 
     29    IGCM_sys_Cp ${SUBMIT_DIR}/run.card.init ${SUBMIT_DIR}/run.card 
     30    IGCM_debug_Print 2 "run.card copied from run.card.init" 
     31  else 
     32    FirstInitialize=false 
     33    IGCM_debug_Print 2 "run.card exists" 
     34  fi 
     35 
     36  # Test modipsl tree existence. 
     37  IGCM_sys_TestDir ${MODIPSL} 
     38  [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDir" 
     39  IGCM_sys_TestDir ${libIGCM} 
     40  [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDir" 
     41  IGCM_sys_TestDir ${R_EXE} 
     42  [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDir" 
     43  IGCM_sys_TestDir ${SUBMIT_DIR} 
     44  [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDir" 
     45 
     46  if ( $DEBUG_debug ) ; then 
     47    echo "Keep trace of inital SUBMIT_DIR : " 
     48    ls -lta ${SUBMIT_DIR} 
     49  fi 
     50 
     51  #================================== 
     52 
     53  typeset option auxprint CompatibilityTag 
     54  # Read libIGCM compatibility version in config.card 
     55  IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card Compatibility libIGCM 
     56  eval CompatibilityTag=${config_Compatibility_libIGCM} > /dev/null 2>&1         
     57 
     58  if [ ! "${CompatibilityTag}" = "${libIGCM_CurrentTag}" ] ; then 
     59    IGCM_debug_Exit "config.card is not compatible with libIGCM version ${libIGCM_CurrentTag} see libIGCM FAQ http://wiki.ipsl.jussieu.fr/wiki_ipsl/IGCMG/libIGCM/DocUtilisateur/FAQ ." 
     60  fi 
     61 
     62  #================================== 
     63  IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/config.card UserChoices 
     64 
     65  for option in ${config_UserChoices[*]} ; do 
     66    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card UserChoices ${option} 
     67  done 
     68  echo 
     69  IGCM_debug_Print 1 "DefineArrayFromOption  : config_UserChoices" 
     70  # Name Space of this experience  
     71  if [ X${config_UserChoices_SpaceName} != X ] ; then 
     72    IGCM_debug_PrintVariables 3 config_UserChoices_SpaceName 
     73  fi 
     74  # Expericence class of the run 
     75  if [ X${config_UserChoices_ExperimentName} != X ] ; then 
     76    IGCM_debug_PrintVariables 3 config_UserChoices_ExperimentName 
     77  fi 
     78  IGCM_debug_PrintVariables 3 config_UserChoices_JobName 
     79  if [ 3 -le ${Verbosity} ] ; then 
     80    echo "--------------Debug3-->" "config_UserChoices_LongName=" 
     81    echo "--------------Debug3-->" \"${config_UserChoices_LongName}\" 
     82  fi 
     83  IGCM_debug_PrintVariables 3 config_UserChoices_TagName 
     84  IGCM_debug_PrintVariables 3 config_UserChoices_CalendarType 
     85  IGCM_debug_PrintVariables 3 config_UserChoices_DateBegin 
     86  IGCM_debug_PrintVariables 3 config_UserChoices_DateEnd 
     87  IGCM_debug_PrintVariables 3 config_UserChoices_PeriodLength 
     88 
     89  #================================== 
     90 
     91  IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/config.card ListOfComponents 
     92  for comp in ${config_ListOfComponents[*]} ; do 
     93    IGCM_card_DefineArrayFromOption ${SUBMIT_DIR}/config.card ListOfComponents ${comp} 
     94  done 
     95 
     96  echo 
     97  IGCM_debug_Print 1 "DefineArrayFromSection : ListOfComponents" 
     98  IGCM_debug_Print 3 ${config_ListOfComponents[*]} 
     99 
     100  NbComponents=${#config_ListOfComponents[*]} 
     101 
     102  #================================== 
     103  # Define principal executable 
     104  IGCM_card_DefineArrayFromSection   ${SUBMIT_DIR}/config.card Executable 
     105  IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card Executable Name 
     106   
     107  #================================== 
     108  # Define Outputs Name 
     109  IGCM_debug_Print 2 "Define Script_Output_Prefix and Exe_Output" 
     110  eval Script_Output_Prefix=${config_UserChoices_Script_Output_Prefix:='Script_Output'} 
     111  IGCM_debug_Print 3 "Script_Output_Prefix = ${Script_Output_Prefix}" 
     112  eval Exe_Output=out_${config_Executable_Name} 
     113  IGCM_debug_Print 3 "Exe_Output           = ${Exe_Output}" 
     114 
     115  #================================== 
     116 
     117  #===================================================================# 
     118  # Prepare variables available for ${COMP}.card and ${COMP}.driver   # 
     119  #             But available to any son functions                    # 
     120  #===================================================================# 
     121 
     122  # Convert yyyy-mm-dd date to gregorian yyyymmdd 
     123  DateBegin=$( IGCM_date_ConvertFormatToGregorian ${config_UserChoices_DateBegin} ) 
     124  DateEnd=$( IGCM_date_ConvertFormatToGregorian ${config_UserChoices_DateEnd} ) 
     125 
     126  # Period Length In Days between DateBegin and DateEnd 
     127  (( ExperienceLengthInDays=$( IGCM_date_DaysBetweenGregorianDate ${DateEnd} ${DateBegin} )  + 1 )) 
     128  if [ ${ExperienceLengthInDays} -lt 0 ] ; then 
     129    IGCM_debug_Print 1 "Problem with dates in config.card : ${DateEnd} < ${DateBegin} ! You must check that." 
     130    IGCM_debug_Exit "IGCM_config_Initialize" " Wrong Dates." 
     131    IGCM_debug_Verif_Exit  
     132  fi 
     133 
     134  # Day and Year of Initial State (Given in julian format) 
     135  InitDay=$(( $( IGCM_date_ConvertGregorianDateToJulian $DateBegin ) % 1000 )) 
     136  InitYear=$(( $( IGCM_date_ConvertGregorianDateToJulian $DateBegin ) / 1000 )) 
     137 
     138  #================================== 
     139  # Restarts : Gerneral rule or local for each component ? 
     140  IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/config.card Restarts 
     141 
     142  echo 
     143  IGCM_debug_Print 1 "DefineArrayFromOption : config_Restarts" 
     144 
     145  for option in ${config_Restarts[*]} ; do 
     146    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card Restarts ${option} 
     147    eval auxprint=\${config_Restarts_${option}} 
     148    IGCM_debug_Print 3 "${option} : ${auxprint}" 
     149  done 
     150 
     151  #================================================================# 
     152  #                  Test and Prepare directories                  # 
     153  #================================================================# 
     154 
     155  # ==> 4 kinds of input files : 
     156  #     1) R_INIT  : Initial State Files   (Etat0, carteveg) 
     157  #     2) R_BC    : Boundary Conditions   (Forcages, lai) 
     158  #     3) Parameters files (allready define through ${SUBMIT_DIR}) 
     159  #     4) Restarts files   (allready define in IGCM_config_Initialize) 
     160 
     161  # Here we offer the possibility to redefine R_INIT, R_BC 
     162  # and PeriodNb through config.card 
     163  R_INIT=${config_UserChoices_R_INIT:=${R_IN}/INIT} 
     164  IGCM_debug_Print 2 "(Re)Define R_INIT, R_BC and PeriodNb" 
     165  IGCM_debug_Print 3 "R_INIT=${R_INIT}" 
     166  R_BC=${config_UserChoices_R_BC:=${R_IN}/BC} 
     167  IGCM_debug_Print 3  "R_BC=${R_BC}" 
     168  PeriodNb=${config_UserChoices_PeriodNb:=${PeriodNb}} 
     169  IGCM_debug_Print 3  "Loop in main Job with ${PeriodNb} period(s)" 
     170 
     171  # Test Archive input/output. 
     172  IGCM_sys_TestDirArchive ${ARCHIVE} 
     173  [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDirArchive" 
     174  IGCM_sys_TestDirArchive ${R_IN} 
     175  [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDirArchive" 
     176 
     177  #==================================================== 
     178  #R_SAVE : Job output directory 
     179  if ( [ ! X${config_UserChoices_SpaceName} = X ] && [ ! X${config_UserChoices_ExperimentName} = X ] ) ; then 
     180    FreeName=$( echo ${config_UserChoices_JobName} | sed 's/.*_//' ) 
     181    R_SAVE=${R_OUT}/${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${FreeName} 
     182    R_BUFR=${R_BUF}/${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${FreeName} 
     183    R_DODS=${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${FreeName} 
     184  else 
     185    R_SAVE=${R_OUT}/${config_UserChoices_TagName}/${config_UserChoices_JobName} 
     186    R_BUFR=${R_BUF}/${config_UserChoices_TagName}/${config_UserChoices_JobName} 
     187    R_DODS=${config_UserChoices_TagName}/${config_UserChoices_JobName} 
     188  fi 
     189 
     190  if ( ${FirstInitialize} ) ; then  
     191    IGCM_sys_MkdirArchive ${R_SAVE} 
     192    IGCM_sys_Mkdir        ${R_BUFR} 
     193  else 
     194    IGCM_sys_TestDirArchive ${R_SAVE} 
     195    [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDirArchive ${R_SAVE}" 
     196 
     197    IGCM_sys_TestDir        ${R_BUFR} 
     198    [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDir ${R_BUFR}" 
     199    #Test state of run in run.card 
     200    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodState 
     201     
     202    if ( [ ${run_Configuration_PeriodState} != "Start" ] && [ ${run_Configuration_PeriodState} != "Running" ] && [ ${run_Configuration_PeriodState} != "OnQueue" ] && [ ${run_Configuration_PeriodState} != "Continue" ] ) ; then 
     203      echo  
     204      IGCM_debug_Print 1 "!! Error in run.card with PeriodState : " ${run_Configuration_PeriodState} "!!" 
     205      IGCM_debug_Print 1 "Try running ${libIGCM}/clean_month.job to fix this" 
     206      IGCM_debug_Exit 
     207      IGCM_debug_Verif_Exit 
     208    fi 
     209  fi 
     210 
     211  #================================== 
     212  # Post :  
     213  IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/config.card Post 
     214 
     215  echo 
     216  IGCM_debug_Print 1 "DefineArrayFromOption : config_Post" 
     217 
     218  for option in ${config_Post[*]} ; do 
     219    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card Post ${option} 
     220    eval auxprint=\${config_Post_${option}} 
     221    IGCM_debug_Print 3 "${option} : ${auxprint}" 
     222  done 
     223 
     224  #==================================================== 
     225  # Define REBUILD_DIR : where we store files needing rebuild process 
     226  if [ X${config_Post_RebuildFromArchive} = Xtrue ] ; then 
     227    REBUILD_DIR=${R_SAVE}/TMP 
     228    IGCM_sys_MkdirArchive ${REBUILD_DIR} 
     229  else 
     230    REBUILD_DIR=${BIG_DIR}/${config_UserChoices_TagName}/${config_UserChoices_JobName} 
     231    IGCM_sys_MkdirWork ${REBUILD_DIR} 
     232  fi 
     233 
     234  #==================================================== 
     235  # Experience type : DEB(ug), DEV(elopment), RUN  
     236  if [ X${JobType} != XRUN ] ; then 
    20237    echo 
    21     IGCM_debug_Print 1 "IGCM_config_Initialize" 
    22  
    23     if [ ! -r ${SUBMIT_DIR}/run.card ]; then  
    24         #================================================# 
    25         #         The file run.card doesn't exist        # 
    26         #================================================# 
    27         FirstInitialize=true 
    28         #copy initial run.card 
    29         IGCM_sys_Cp ${SUBMIT_DIR}/run.card.init ${SUBMIT_DIR}/run.card 
    30         IGCM_debug_Print 2 "run.card copied from run.card.init" 
    31     else 
    32         FirstInitialize=false 
    33         IGCM_debug_Print 2 "run.card exists" 
     238    echo "====================================================" 
     239    echo "libIGCM JOB is NOT in RUN type mode." 
     240    echo "!! OUTPUT files will NOT be PROTECTED !!" 
     241    echo "Be carefull : you can ERASE the result of this job !" 
     242 
     243    case ${JobType} in 
     244    DEB) 
     245      echo "DEBUG mode : activation of 'set -vx' mode." 
     246      echo "DEBUG mode : no protection for output files." 
     247      echo "DEBUG mode : if active force asynchronous rebuild frequency to PeriodLength frequency." 
     248      ;; 
     249    DEV) 
     250      echo "DEVelopment mode : no protection for output files." 
     251      echo "DEVelopment mode : if active force asynchronous rebuild frequency to PeriodLength frequency." 
     252      ;; 
     253    esac 
     254 
     255    if ( [ X${config_Post_RebuildFrequency} != XNONE ] && [ ${DRYRUN} -eq 0 ] ) ; then 
     256      if [ X${config_Post_RebuildFrequency} != X${config_UserChoices_PeriodLength} ] ; then 
     257        echo "------------" 
     258        echo "WARNING : Job is NOT in RUN mode then we will force REBUILD Frequency" 
     259        echo "          to PeriodLength : ${config_UserChoices_PeriodLength}" 
     260        echo "------------" 
     261        config_Post_RebuildFrequency=${config_UserChoices_PeriodLength} 
     262      fi 
    34263    fi 
    35  
    36     # Test modipsl tree existence. 
    37     IGCM_sys_TestDir ${MODIPSL} 
    38     [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDir" 
    39     IGCM_sys_TestDir ${libIGCM} 
    40     [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDir" 
    41     IGCM_sys_TestDir ${R_EXE} 
    42     [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDir" 
    43     IGCM_sys_TestDir ${SUBMIT_DIR} 
    44     [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDir" 
    45  
    46     if ( $DEBUG_debug ) ; then 
    47         echo "Keep trace of inital SUBMIT_DIR : " 
    48         ls -lta ${SUBMIT_DIR} 
    49     fi 
    50  
    51     #================================== 
    52  
    53     typeset option auxprint CompatibilityTag 
    54     # Read libIGCM compatibility version in config.card 
    55     IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card Compatibility libIGCM 
    56     eval CompatibilityTag=${config_Compatibility_libIGCM} > /dev/null 2>&1       
    57  
    58     if [ ! "${CompatibilityTag}" = "${libIGCM_CurrentTag}" ] ; then 
    59         IGCM_debug_Exit "config.card is not compatible with libIGCM version ${libIGCM_CurrentTag} see libIGCM FAQ http://wiki.ipsl.jussieu.fr/wiki_ipsl/IGCMG/libIGCM/DocUtilisateur/FAQ ." 
    60     fi 
    61  
    62     #================================== 
    63     IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/config.card UserChoices 
    64  
    65     for option in ${config_UserChoices[*]} ; do 
    66         IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card UserChoices ${option} 
    67     done 
     264    echo "====================================================" 
    68265    echo 
    69     IGCM_debug_Print 1 "DefineArrayFromOption  : config_UserChoices" 
    70     # Name Space of this experience  
    71     if [ X${config_UserChoices_SpaceName} != X ] ; then 
    72         IGCM_debug_PrintVariables 3 config_UserChoices_SpaceName 
    73     fi 
    74     # Expericence class of the run 
    75     if [ X${config_UserChoices_ExperimentName} != X ] ; then 
    76         IGCM_debug_PrintVariables 3 config_UserChoices_ExperimentName 
    77     fi 
    78     IGCM_debug_PrintVariables 3 config_UserChoices_JobName 
    79     if [ 3 -le ${Verbosity} ] ; then 
    80         echo "--------------Debug3-->" "config_UserChoices_LongName=" 
    81         echo "--------------Debug3-->" \"${config_UserChoices_LongName}\" 
    82     fi 
    83     IGCM_debug_PrintVariables 3 config_UserChoices_TagName 
    84     IGCM_debug_PrintVariables 3 config_UserChoices_CalendarType 
    85     IGCM_debug_PrintVariables 3 config_UserChoices_DateBegin 
    86     IGCM_debug_PrintVariables 3 config_UserChoices_DateEnd 
    87     IGCM_debug_PrintVariables 3 config_UserChoices_PeriodLength 
    88  
    89     #================================== 
    90  
    91     IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/config.card ListOfComponents 
    92     for comp in ${config_ListOfComponents[*]} ; do 
    93         IGCM_card_DefineArrayFromOption ${SUBMIT_DIR}/config.card ListOfComponents ${comp} 
    94     done 
    95  
    96     echo 
    97     IGCM_debug_Print 1 "DefineArrayFromSection : ListOfComponents" 
    98     IGCM_debug_Print 3 ${config_ListOfComponents[*]} 
    99  
    100     NbComponents=${#config_ListOfComponents[*]} 
    101  
    102     #================================== 
    103     # Define principal executable 
    104  
    105     IGCM_card_DefineArrayFromSection   ${SUBMIT_DIR}/config.card Executable 
    106     IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card Executable Name 
    107      
    108     #================================== 
    109     # Define Outputs Name 
    110     IGCM_debug_Print 2 "Define Script_Output_Prefix and Exe_Output" 
    111     eval Script_Output_Prefix=${config_UserChoices_Script_Output_Prefix:='Script_Output'} 
    112     IGCM_debug_Print 3 "Script_Output_Prefix = ${Script_Output_Prefix}" 
    113     eval Exe_Output=out_${config_Executable_Name} 
    114     IGCM_debug_Print 3 "Exe_Output           = ${Exe_Output}" 
    115  
    116     #================================== 
    117  
    118     #===================================================================# 
    119     # Prepare variables available for ${COMP}.card and ${COMP}.driver   # 
    120     #             But available to any son functions                    # 
    121     #===================================================================# 
    122  
    123     # Convert yyyy-mm-dd date to gregorian yyyymmdd 
    124     DateBegin=$( IGCM_date_ConvertFormatToGregorian ${config_UserChoices_DateBegin} ) 
    125     DateEnd=$( IGCM_date_ConvertFormatToGregorian ${config_UserChoices_DateEnd} ) 
    126  
    127     # Period Length In Days between DateBegin and DateEnd 
    128     (( ExperienceLengthInDays=$( IGCM_date_DaysBetweenGregorianDate ${DateEnd} ${DateBegin} )  + 1 )) 
    129     if [ ${ExperienceLengthInDays} -lt 0 ] ; then 
    130         IGCM_debug_Print 1 "Problem with dates in config.card : ${DateEnd} < ${DateBegin} ! You must check that." 
    131         IGCM_debug_Exit "IGCM_config_Initialize" " Wrong Dates." 
    132         IGCM_debug_Verif_Exit  
    133     fi 
    134  
    135     # Day and Year of Initial State (Given in julian format) 
    136     InitDay=$(( $( IGCM_date_ConvertGregorianDateToJulian $DateBegin ) % 1000 )) 
    137     InitYear=$(( $( IGCM_date_ConvertGregorianDateToJulian $DateBegin ) / 1000 )) 
    138  
    139     #================================== 
    140     # Restarts : Gerneral rule or local for each component ? 
    141     IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/config.card Restarts 
    142  
    143     echo 
    144     IGCM_debug_Print 1 "DefineArrayFromOption : config_Restarts" 
    145  
    146     for option in ${config_Restarts[*]} ; do 
    147         IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card Restarts ${option} 
    148         eval auxprint=\${config_Restarts_${option}} 
    149         IGCM_debug_Print 3 "${option} : ${auxprint}" 
    150     done 
    151  
    152     #================================================================# 
    153     #                  Test and Prepare directories                  # 
    154     #================================================================# 
    155  
    156     # ==> 4 kinds of input files : 
    157     #     1) R_INIT  : Initial State Files   (Etat0, carteveg) 
    158     #     2) R_BC    : Boundary Conditions   (Forcages, lai) 
    159     #     3) Parameters files (allready define through ${SUBMIT_DIR}) 
    160     #     4) Restarts files   (allready define in IGCM_config_Initialize) 
    161  
    162     # Here we offer the possibility to redefine R_INIT, R_BC 
    163     # and PeriodNb through config.card 
    164     R_INIT=${config_UserChoices_R_INIT:=${R_IN}/INIT} 
    165     IGCM_debug_Print 2 "(Re)Define R_INIT, R_BC and PeriodNb" 
    166     IGCM_debug_Print 3 "R_INIT=${R_INIT}" 
    167     R_BC=${config_UserChoices_R_BC:=${R_IN}/BC} 
    168     IGCM_debug_Print 3  "R_BC=${R_BC}" 
    169     PeriodNb=${config_UserChoices_PeriodNb:=${PeriodNb}} 
    170     IGCM_debug_Print 3  "Loop in main Job with ${PeriodNb} period(s)" 
    171  
    172     # Test Archive input/output. 
    173     IGCM_sys_TestDirArchive ${ARCHIVE} 
    174     [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDirArchive" 
    175     IGCM_sys_TestDirArchive ${R_IN} 
    176     [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDirArchive" 
    177  
    178     #==================================================== 
    179     #R_SAVE : Job output directory 
    180     if ( [ ! X${config_UserChoices_SpaceName} = X ] && [ ! X${config_UserChoices_ExperimentName} = X ] ) ; then 
    181         FreeName=$( echo ${config_UserChoices_JobName} | sed 's/.*_//' ) 
    182         R_SAVE=${R_OUT}/${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${FreeName} 
    183         R_DODS=${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${FreeName} 
    184     else 
    185         R_SAVE=${R_OUT}/${config_UserChoices_TagName}/${config_UserChoices_JobName} 
    186         R_DODS=${config_UserChoices_TagName}/${config_UserChoices_JobName} 
    187     fi 
    188  
    189     if ( ${FirstInitialize} ) ; then  
    190         IGCM_sys_MkdirArchive ${R_SAVE} 
    191     else 
    192         IGCM_sys_TestDirArchive ${R_SAVE} 
    193         [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDirArchive" 
    194         #Test state of run in run.card 
    195         IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodState 
    196          
    197         if ( [ ${run_Configuration_PeriodState} != "Start" ] && [ ${run_Configuration_PeriodState} != "Running" ] && [ ${run_Configuration_PeriodState} != "OnQueue" ] && [ ${run_Configuration_PeriodState} != "Continue" ] ) ; then 
    198             echo  
    199             IGCM_debug_Print 1 "!! Error in run.card with PeriodState : " ${run_Configuration_PeriodState} "!!" 
    200             IGCM_debug_Print 1 "Try running ${libIGCM}/clean_month.job to fix this" 
    201             IGCM_debug_Exit 
    202             IGCM_debug_Verif_Exit 
    203         fi 
    204     fi 
    205  
    206     #================================== 
    207     # Post :  
    208     IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/config.card Post 
    209  
    210     echo 
    211     IGCM_debug_Print 1 "DefineArrayFromOption : config_Post" 
    212  
    213     for option in ${config_Post[*]} ; do 
    214         IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card Post ${option} 
    215         eval auxprint=\${config_Post_${option}} 
    216         IGCM_debug_Print 3 "${option} : ${auxprint}" 
    217     done 
    218  
    219     #==================================================== 
    220     # Define REBUILD_DIR : where we store files needing rebuild process 
    221     if [ X${config_Post_RebuildFromArchive} = Xtrue ] ; then 
    222         REBUILD_DIR=${R_SAVE}/TMP 
    223         IGCM_sys_MkdirArchive ${REBUILD_DIR} 
    224     else 
    225         REBUILD_DIR=${BIG_DIR}/${config_UserChoices_TagName}/${config_UserChoices_JobName} 
    226         IGCM_sys_MkdirWork ${REBUILD_DIR} 
    227     fi 
    228  
    229     #==================================================== 
    230     # Experience type : DEB(ug), DEV(elopment), RUN  
    231     if [ X${JobType} != XRUN ] ; then 
    232         echo 
    233         echo "====================================================" 
    234         echo "libIGCM JOB is NOT in RUN type mode." 
    235         echo "!! OUTPUT files will NOT be PROTECTED !!" 
    236         echo "Be carefull : you can ERASE the result of this job !" 
    237  
    238         case ${JobType} in 
    239             DEB) 
    240                 echo "DEBUG mode : activation of 'set -vx' mode." 
    241                 echo "DEBUG mode : no protection for output files." 
    242                 echo "DEBUG mode : if active force asynchronous rebuild frequency to PeriodLength frequency." 
    243                 ;; 
    244             DEV) 
    245                 echo "DEVelopment mode : no protection for output files." 
    246                 echo "DEVelopment mode : if active force asynchronous rebuild frequency to PeriodLength frequency." 
    247                 ;; 
    248         esac 
    249  
    250         if ( [ X${config_Post_RebuildFrequency} != XNONE ] && [ ${DRYRUN} -eq 0 ] ) ; then 
    251             if [ X${config_Post_RebuildFrequency} != X${config_UserChoices_PeriodLength} ] ; then 
    252                 echo "------------" 
    253                 echo "WARNING : Job is NOT in RUN mode then we will force REBUILD Frequency" 
    254                 echo "          to PeriodLength : ${config_UserChoices_PeriodLength}" 
    255                 echo "------------" 
    256                 config_Post_RebuildFrequency=${config_UserChoices_PeriodLength} 
    257             fi 
    258         fi 
    259         echo "====================================================" 
    260         echo 
    261     fi 
    262  
    263     #==================================================== 
    264     #R_OUT_KSH : Storage place for job output 
    265     #R_OUT_EXE : Storage place for binary used during simulation 
    266     R_OUT_KSH=${R_SAVE}/Out 
    267     R_OUT_EXE=${R_SAVE}/Exe 
    268  
    269     IGCM_debug_PopStack "IGCM_config_Initialize" 
     266  fi 
     267 
     268  #==================================================== 
     269  #R_OUT_KSH : Storage place for job output 
     270  #R_OUT_EXE : Storage place for binary used during simulation 
     271  R_OUT_KSH=${R_SAVE}/Out 
     272  R_OUT_EXE=${R_SAVE}/Exe 
     273 
     274  #==================================================== 
     275  #R_BUF_KSH : Buffer place for job output 
     276  #R_BUF_EXE : Buffer place for binary used during simulation 
     277  R_BUF_KSH=${R_BUFR}/Out 
     278  R_BUF_EXE=${R_BUFR}/Exe 
     279 
     280  IGCM_debug_PopStack "IGCM_config_Initialize" 
    270281} 
    271282 
     
    273284function IGCM_config_Analyse_PeriodLength 
    274285{ 
    275     IGCM_debug_PushStack "IGCM_config_Analyse_PeriodLength" 
    276  
    277     typeset i 
    278  
    279     # Determine number of day(s) in PeriodLength : 
    280     case ${config_UserChoices_PeriodLength} in 
    281         *Y|*y) 
    282             PeriodLengthInYears=$( echo ${config_UserChoices_PeriodLength} | sed -e 's/[yY]//' )  
    283             IGCM_debug_Print 2 "Number of years for PeriodLength : ${PeriodLengthInYears}" 
    284             PeriodLengthInDays=0 
    285             i=0 
    286             until [ $i -ge $PeriodLengthInYears ] ; do  
    287                 (( PeriodLengthInDays = PeriodLengthInDays + $( IGCM_date_DaysInYear $(( year + i )) ) ))  
    288                 (( i=i+1 ))  
    289             done  
    290             ;; 
    291         *M|*m) 
    292             PeriodLengthInMonths=$( echo ${config_UserChoices_PeriodLength} | sed -e 's/[mM]//' )  
    293             IGCM_debug_Print 2 "Number of months for PeriodLength : ${PeriodLengthInMonths}" 
    294             PeriodLengthInDays=0 
    295             i=0 
    296             until [ $i -ge $PeriodLengthInMonths ] ; do  
    297                 if [ $(( month + i )) -lt 13 ] ; then  
    298                     (( PeriodLengthInDays  = PeriodLengthInDays + $( IGCM_date_DaysInMonth $year $(( month + i )) ) ))   
    299                 else  
    300                     (( PeriodLengthInDays  = PeriodLengthInDays + $( IGCM_date_DaysInMonth $year $(( month + i - 12 )) ) ))   
    301                 fi  
    302                 (( i=i+1 ))  
    303             done  
    304             ;; 
    305         *D|*d)   
    306             PeriodLengthInMonths=0 
    307             PeriodLengthInDays=$( echo ${config_UserChoices_PeriodLength} | sed -e 's/[dD]//' );; 
    308         *)  
    309             IGCM_debug_Exit "IGCM_config_Analyse_PeriodLength " ${config_UserChoices_PeriodLength} " invalid period length : choose in *Y, *M, *D." 
    310             IGCM_debug_Verif_Exit ;; 
    311     esac 
    312  
    313     IGCM_debug_PopStack "IGCM_config_Analyse_PeriodLength" 
     286  IGCM_debug_PushStack "IGCM_config_Analyse_PeriodLength" 
     287 
     288  typeset i 
     289 
     290  # Determine number of day(s) in PeriodLength : 
     291  case ${config_UserChoices_PeriodLength} in 
     292  *Y|*y) 
     293    PeriodLengthInYears=$( echo ${config_UserChoices_PeriodLength} | sed -e 's/[yY]//' )  
     294    IGCM_debug_Print 2 "Number of years for PeriodLength : ${PeriodLengthInYears}" 
     295    PeriodLengthInDays=0 
     296    i=0 
     297    until [ $i -ge $PeriodLengthInYears ] ; do  
     298      (( PeriodLengthInDays = PeriodLengthInDays + $( IGCM_date_DaysInYear $(( year + i )) ) ))  
     299      (( i=i+1 ))  
     300    done  
     301    ;; 
     302  *M|*m) 
     303    PeriodLengthInMonths=$( echo ${config_UserChoices_PeriodLength} | sed -e 's/[mM]//' )  
     304    IGCM_debug_Print 2 "Number of months for PeriodLength : ${PeriodLengthInMonths}" 
     305    PeriodLengthInDays=0 
     306    i=0 
     307    until [ $i -ge $PeriodLengthInMonths ] ; do  
     308      if [ $(( month + i )) -lt 13 ] ; then  
     309        (( PeriodLengthInDays  = PeriodLengthInDays + $( IGCM_date_DaysInMonth $year $(( month + i )) ) ))   
     310      else  
     311        (( PeriodLengthInDays  = PeriodLengthInDays + $( IGCM_date_DaysInMonth $year $(( month + i - 12 )) ) ))   
     312      fi  
     313      (( i=i+1 ))  
     314    done  
     315    ;; 
     316  *D|*d)   
     317    PeriodLengthInMonths=0 
     318    PeriodLengthInDays=$( echo ${config_UserChoices_PeriodLength} | sed -e 's/[dD]//' );; 
     319  *)  
     320    IGCM_debug_Exit "IGCM_config_Analyse_PeriodLength " ${config_UserChoices_PeriodLength} " invalid period length : choose in *Y, *M, *D." 
     321    IGCM_debug_Verif_Exit ;; 
     322  esac 
     323 
     324  IGCM_debug_PopStack "IGCM_config_Analyse_PeriodLength" 
    314325} 
    315326 
     
    317328function IGCM_config_Check 
    318329{ 
    319     IGCM_debug_PushStack "IGCM_config_Check" 
    320  
    321     # If one of the following modulo is not zero : 
    322     # we will issue an error then explain and exit in 
    323     # AA_job IGCM_debug_Verif_Exit call before binary submission 
    324  
     330  IGCM_debug_PushStack "IGCM_config_Check" 
     331 
     332  # If one of the following modulo is not zero : 
     333  # we will issue an error then explain and exit in 
     334  # AA_job IGCM_debug_Verif_Exit call before binary submission 
     335 
     336  echo 
     337  IGCM_debug_Print 1 "IGCM_config_Check" 
     338  echo 
     339 
     340  typeset i 
     341 
     342  if ( [ ! X${config_Post_RebuildFrequency} = X${NULL_STR} ] || [ ! X${config_Post_RebuildFrequency} = XNONE ] ) ; then 
     343    AsynchronousRebuild=true 
     344    IGCM_debug_Print 1 "Asynchronous rebuild has been activated." 
    325345    echo 
    326     IGCM_debug_Print 1 "IGCM_config_Check" 
     346    # modulo (RebuildFrequency and PeriodLength/TimeSeriesFrequency/SeasonalFrequency) must be zero 
     347    IGCM_debug_Print 1 "Check coherence between RebuildFrequency and PeriodLength" 
     348    IGCM_post_CheckModuloFrequency config_Post_RebuildFrequency config_UserChoices_PeriodLength 
     349    IGCM_debug_Print 1 "Check coherence between TimeSeriesFrequency and RebuildFrequency" 
     350    IGCM_post_CheckModuloFrequency config_Post_TimeSeriesFrequency config_Post_RebuildFrequency 
     351    IGCM_debug_Print 1 "Check coherence between SeasonalFrequency and RebuildFrequency" 
     352    IGCM_post_CheckModuloFrequency config_Post_SeasonalFrequency config_Post_RebuildFrequency 
     353  else 
     354    AsynchronousRebuild=false 
     355    IGCM_debug_Print 1 "Asynchronous rebuild has not been activated" 
     356    IGCM_debug_Print 1 "Proceed with standard post-treatment pathway" 
    327357    echo 
    328  
    329     typeset i 
    330  
    331     if ( [ ! X${config_Post_RebuildFrequency} = X${NULL_STR} ] || [ ! X${config_Post_RebuildFrequency} = XNONE ] ) ; then 
    332         AsynchronousRebuild=true 
    333         IGCM_debug_Print 1 "Asynchronous rebuild has been activated." 
    334         echo 
    335         # modulo (RebuildFrequency and PeriodLength/TimeSeriesFrequency/SeasonalFrequency) must be zero 
    336         IGCM_debug_Print 1 "Check coherence between RebuildFrequency and PeriodLength" 
    337         IGCM_post_CheckModuloFrequency config_Post_RebuildFrequency config_UserChoices_PeriodLength 
    338         IGCM_debug_Print 1 "Check coherence between TimeSeriesFrequency and RebuildFrequency" 
    339         IGCM_post_CheckModuloFrequency config_Post_TimeSeriesFrequency config_Post_RebuildFrequency 
    340         IGCM_debug_Print 1 "Check coherence between SeasonalFrequency and RebuildFrequency" 
    341         IGCM_post_CheckModuloFrequency config_Post_SeasonalFrequency config_Post_RebuildFrequency 
    342     else 
    343         AsynchronousRebuild=false 
    344         IGCM_debug_Print 1 "Asynchronous rebuild has not been activated" 
    345         IGCM_debug_Print 1 "Proceed with standard post-treatment pathway" 
    346         echo 
    347         #modulo (TimeSeriesFrequency/SeasonalFrequency and PeriodLenght) must be zero 
    348         IGCM_debug_Print 1 "Check coherence between TimeSeriesFrequency and PeriodLength" 
    349         IGCM_post_CheckModuloFrequency config_Post_TimeSeriesFrequency config_UserChoices_PeriodLength 
    350         IGCM_debug_Print 1 "Check coherence between SeasonalFrequency and PeriodLength" 
    351         IGCM_post_CheckModuloFrequency config_Post_SeasonalFrequency   config_UserChoices_PeriodLength 
    352     fi 
    353  
    354     #modulo (TimeSeriesFrequency and all Chunck2D) must be zero 
    355     NbJob=${#CHUNCK2D_SIZE[@]} 
    356     i=0 
    357     until [ $i -ge $NbJob ]; do 
    358         value=${CHUNCK2D_SIZE[${i}]} 
    359         IGCM_debug_Print 1 "Check coherence between All Chunck2D frequency and TimeSeriesFrequency" 
    360         IGCM_post_CheckModuloFrequency value config_Post_TimeSeriesFrequency 
    361         case ${value} in   
    362             *Y|*y) ;;  
    363             *)  IGCM_debug_Print 1 "All ChunckJob2D frequency must be expressed in year *Y|*y in comp.card" 
    364                 IGCM_debug_Exit "This will stop the job" ;; 
    365         esac 
    366         (( i=i+1 )) 
    367     done 
    368  
    369     #modulo (TimeSeriesFrequency and all Chunck3D) must be zero 
    370     NbJob=${#CHUNCK3D_SIZE[@]} 
    371     i=0 
    372     until [ $i -ge $NbJob ]; do 
    373         value=${CHUNCK3D_SIZE[${i}]} 
    374         IGCM_debug_Print 1 "Check coherence between All Chunck3D frequency and TimeSeriesFrequency" 
    375         IGCM_post_CheckModuloFrequency value config_Post_TimeSeriesFrequency 
    376         case ${value} in   
    377             *Y|*y) ;;  
    378             *)  IGCM_debug_Print 1 "All ChunckJob3D frequency must be expressed in year *Y|*y in comp.card" 
    379                 IGCM_debug_Exit "This will stop the job" ;; 
    380         esac 
    381         (( i=i+1 )) 
    382     done 
    383  
    384     IGCM_debug_PopStack "IGCM_config_Check" 
     358    #modulo (TimeSeriesFrequency/SeasonalFrequency and PeriodLenght) must be zero 
     359    IGCM_debug_Print 1 "Check coherence between TimeSeriesFrequency and PeriodLength" 
     360    IGCM_post_CheckModuloFrequency config_Post_TimeSeriesFrequency config_UserChoices_PeriodLength 
     361    IGCM_debug_Print 1 "Check coherence between SeasonalFrequency and PeriodLength" 
     362    IGCM_post_CheckModuloFrequency config_Post_SeasonalFrequency   config_UserChoices_PeriodLength 
     363  fi 
     364 
     365  #modulo (TimeSeriesFrequency and all Chunck2D) must be zero 
     366  NbJob=${#CHUNCK2D_SIZE[@]} 
     367  i=0 
     368  until [ $i -ge $NbJob ]; do 
     369    value=${CHUNCK2D_SIZE[${i}]} 
     370    IGCM_debug_Print 1 "Check coherence between All Chunck2D frequency and TimeSeriesFrequency" 
     371    IGCM_post_CheckModuloFrequency value config_Post_TimeSeriesFrequency 
     372    case ${value} in   
     373    *Y|*y) ;;  
     374    *)  IGCM_debug_Print 1 "All ChunckJob2D frequency must be expressed in year *Y|*y in comp.card" 
     375      IGCM_debug_Exit "This will stop the job" ;; 
     376    esac 
     377    (( i=i+1 )) 
     378  done 
     379 
     380  #modulo (TimeSeriesFrequency and all Chunck3D) must be zero 
     381  NbJob=${#CHUNCK3D_SIZE[@]} 
     382  i=0 
     383  until [ $i -ge $NbJob ]; do 
     384    value=${CHUNCK3D_SIZE[${i}]} 
     385    IGCM_debug_Print 1 "Check coherence between All Chunck3D frequency and TimeSeriesFrequency" 
     386    IGCM_post_CheckModuloFrequency value config_Post_TimeSeriesFrequency 
     387    case ${value} in   
     388    *Y|*y) ;;  
     389    *)  IGCM_debug_Print 1 "All ChunckJob3D frequency must be expressed in year *Y|*y in comp.card" 
     390      IGCM_debug_Exit "This will stop the job" ;; 
     391    esac 
     392    (( i=i+1 )) 
     393  done 
     394 
     395  IGCM_debug_PopStack "IGCM_config_Check" 
    385396} 
    386397 
     
    388399function IGCM_config_PeriodStart 
    389400{ 
    390     IGCM_debug_PushStack "IGCM_config_PeriodStart" 
    391  
    392     echo 
    393     IGCM_debug_Print 1 "IGCM_config_PeriodStart" 
    394     echo 
    395  
    396     if ( ${FirstInitialize} ) ; then 
    397         #================================================# 
    398         #         Initialize date/period information     # 
    399         #================================================# 
    400  
    401         IGCM_date_GetYearMonthDay $DateBegin year month day 
    402         IGCM_config_Analyse_PeriodLength 
    403  
    404         eval PeriodDateBegin=${DateBegin} > /dev/null 2>&1 
    405         PeriodDateEnd=$( IGCM_date_AddDaysToGregorianDate ${DateBegin} $(( ${PeriodLengthInDays} - 1 )) ) 
    406         eval CumulPeriod=1 > /dev/null 2>&1 
    407  
    408         #=================================================# 
    409         #              Write updated run.card             # 
    410         #=================================================# 
    411  
    412         #Correct run.card Configuration for this period 
    413         IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin ${PeriodDateBegin} 
    414         IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd ${PeriodDateEnd} 
    415         IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod ${CumulPeriod} 
    416         if [ X$( grep "SubmitPath" ${SUBMIT_DIR}/run.card ) != X ] ; then 
    417             IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration SubmitPath ${SUBMIT_DIR} 
    418         fi 
    419  
    420         IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Running" 
    421   
     401  IGCM_debug_PushStack "IGCM_config_PeriodStart" 
     402 
     403  echo 
     404  IGCM_debug_Print 1 "IGCM_config_PeriodStart" 
     405  echo 
     406 
     407  if ( ${FirstInitialize} ) ; then 
     408    #================================================# 
     409    #         Initialize date/period information     # 
     410    #================================================# 
     411 
     412    IGCM_date_GetYearMonthDay $DateBegin year month day 
     413    IGCM_config_Analyse_PeriodLength 
     414 
     415    eval PeriodDateBegin=${DateBegin} > /dev/null 2>&1 
     416    PeriodDateEnd=$( IGCM_date_AddDaysToGregorianDate ${DateBegin} $(( ${PeriodLengthInDays} - 1 )) ) 
     417    eval CumulPeriod=1 > /dev/null 2>&1 
     418 
     419    #=================================================# 
     420    #              Write updated run.card             # 
     421    #=================================================# 
     422 
     423    #Correct run.card Configuration for this period 
     424    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin ${PeriodDateBegin} 
     425    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd ${PeriodDateEnd} 
     426    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod ${CumulPeriod} 
     427    if [ X$( grep "SubmitPath" ${SUBMIT_DIR}/run.card ) != X ] ; then 
     428      IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration SubmitPath ${SUBMIT_DIR} 
     429    fi 
     430 
     431    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Running" 
     432     
     433  else 
     434    #================================================# 
     435    #         The file run.card allready exist       # 
     436    #================================================# 
     437 
     438    #Test state of run in run.card 
     439    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodState 
     440    if ( [ ${run_Configuration_PeriodState} != "Running" ] && [ ${run_Configuration_PeriodState} != "OnQueue" ] && [ ${run_Configuration_PeriodState} != "Continue" ] ) ; then 
     441      echo  
     442      IGCM_debug_Print 1 "!! Error in run.card with PeriodState : " ${run_Configuration_PeriodState} "!!" 
     443      IGCM_debug_Print 1 "Try running ${libIGCM}/clean_month.job to fix this" 
     444      echo 
     445      IGCM_debug_Exit 
     446      IGCM_debug_Verif_Exit 
     447    fi 
     448 
     449    #===================================# 
     450    #        Read updated run.card      # 
     451    #===================================# 
     452 
     453    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration OldPrefix 
     454    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin 
     455    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd 
     456    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod 
     457 
     458    PeriodDateBegin=$( IGCM_date_ConvertFormatToGregorian ${run_Configuration_PeriodDateBegin} ) 
     459    PeriodDateEnd=$( IGCM_date_ConvertFormatToGregorian ${run_Configuration_PeriodDateEnd} ) 
     460    eval CumulPeriod="${run_Configuration_CumulPeriod}" > /dev/null 2>&1 
     461 
     462    LastPeriodDateEnd=$( echo ${run_Configuration_OldPrefix} | sed -e "s/${config_UserChoices_JobName}_//" ) 
     463 
     464    typeset LastDate 
     465    set +A LastDate -- $( echo ${LastPeriodDateEnd} | sed -e "s/\([0-9]\{${dY}\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\1 \2 \3/" ) 
     466    LastYearDateEnd=${LastDate[0]} 
     467    LastMonthDateEnd=${LastDate[1]} 
     468    LastDayDateEnd=${LastDate[2]} 
     469 
     470    if [ ${Period} = 1 ]; then 
     471      # save last Job output 
     472      typeset LastPeriod iLastPeriod Last_Script_Output_Name 
     473      (( LastPeriod=CumulPeriod-PeriodNb )) 
     474      iLastPeriod=$( printf "%06d" ${LastPeriod} ) 
     475      Last_Script_Output_Name="${Script_Output_Prefix}_${config_UserChoices_JobName}.${iLastPeriod}" 
     476      Last_run_card="run.card.${iLastPeriod}" 
     477      #eval ls -l ${SUBMIT_DIR}/${Last_Script_Output_Name} 
     478      #eval IGCM_sys_Put_Out ${SUBMIT_DIR}/${Last_Script_Output_Name} ${R_BUF_KSH}/${Last_Script_Output_Name} > /dev/null 2>&1 
     479      IGCM_debug_Print 2 "Try to save previous ksh job output" 
     480      IGCM_sys_Cd ${SUBMIT_DIR}/ 
     481      IGCM_sys_PutBuffer_Out ${Last_Script_Output_Name} ${R_BUF_KSH}/${Last_Script_Output_Name}.$$ rw 
     482 
     483      IGCM_card_CheckConflict run.card 
     484      IGCM_sys_PutBuffer_Out ${SUBMIT_DIR}/run.card ${R_BUF_KSH}/${Last_run_card}.$$ rw 
     485 
     486      IGCM_sys_Cd ${RUN_DIR} 
    422487    else 
    423         #================================================# 
    424         #         The file run.card allready exist       # 
    425         #================================================# 
    426  
    427         #Test state of run in run.card 
    428         IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodState 
    429         if ( [ ${run_Configuration_PeriodState} != "Running" ] && [ ${run_Configuration_PeriodState} != "OnQueue" ] && [ ${run_Configuration_PeriodState} != "Continue" ] ) ; then 
    430             echo  
    431             IGCM_debug_Print 1 "!! Error in run.card with PeriodState : " ${run_Configuration_PeriodState} "!!" 
    432             IGCM_debug_Print 1 "Try running ${libIGCM}/clean_month.job to fix this" 
    433             echo 
    434             IGCM_debug_Exit 
    435             IGCM_debug_Verif_Exit 
    436         fi 
    437  
    438         #===================================# 
    439         #        Read updated run.card      # 
    440         #===================================# 
    441  
    442         IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration OldPrefix 
    443         IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin 
    444         IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd 
    445         IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod 
    446  
    447         PeriodDateBegin=$( IGCM_date_ConvertFormatToGregorian ${run_Configuration_PeriodDateBegin} ) 
    448         PeriodDateEnd=$( IGCM_date_ConvertFormatToGregorian ${run_Configuration_PeriodDateEnd} ) 
    449         eval CumulPeriod="${run_Configuration_CumulPeriod}" > /dev/null 2>&1 
    450  
    451         LastPeriodDateEnd=$( echo ${run_Configuration_OldPrefix} | sed -e "s/${config_UserChoices_JobName}_//" ) 
    452  
    453         typeset LastDate 
    454         set +A LastDate -- $( echo ${LastPeriodDateEnd} | sed -e "s/\([0-9]\{${dY}\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\1 \2 \3/" ) 
    455         LastYearDateEnd=${LastDate[0]} 
    456         LastMonthDateEnd=${LastDate[1]} 
    457         LastDayDateEnd=${LastDate[2]} 
    458  
    459         if [ ${Period} = 1 ]; then 
    460            # save last Job output 
    461             typeset LastPeriod iLastPeriod Last_Script_Output_Name 
    462             (( LastPeriod=CumulPeriod-PeriodNb )) 
    463             iLastPeriod=$( printf "%06d" ${LastPeriod} ) 
    464             Last_Script_Output_Name="${Script_Output_Prefix}_${config_UserChoices_JobName}.${iLastPeriod}" 
    465             Last_run_card="run.card.${iLastPeriod}" 
    466             #eval ls -l ${SUBMIT_DIR}/${Last_Script_Output_Name} 
    467             #eval IGCM_sys_Put_Out ${SUBMIT_DIR}/${Last_Script_Output_Name} ${R_OUT_KSH}/${Last_Script_Output_Name} > /dev/null 2>&1 
    468             IGCM_debug_Print 2 "Try to save previous ksh job output" 
    469             IGCM_sys_Cd ${SUBMIT_DIR}/ 
    470             IGCM_sys_Put_Out ${Last_Script_Output_Name} ${R_OUT_KSH}/${Last_Script_Output_Name}.$$ rw 
    471  
    472             IGCM_card_CheckConflict run.card 
    473             IGCM_sys_Put_Out ${SUBMIT_DIR}/run.card ${R_OUT_KSH}/${Last_run_card}.$$ rw 
    474  
    475             IGCM_sys_Cd ${RUN_DIR} 
    476         else 
    477             unset FileToBeDeleted 
    478         fi 
    479  
    480         IGCM_date_GetYearMonthDay $PeriodDateBegin year month day 
    481         IGCM_config_Analyse_PeriodLength 
    482  
    483         IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Running" 
    484  
    485     fi     
    486     OldPrefix=${config_UserChoices_JobName}_${PeriodDateEnd} 
    487  
    488     # BEGIN: SHOULD GO IN A FUNCTION FROM libIGCM_date.ksh 
    489     # Compute year_m1 and year_p1 (year minus 1Y and year plus 1Y) 
    490     year_m1=$(( year - 1 )) 
    491     year_p1=$(( year + 1 ))      
    492     # Compute month_m1 (month minus 1M) 
    493     # Compute yyyymm_m1 (yyyymm minus 1M) 
    494     month_m1=$(( month - 1 )) 
    495     if [ ${month_m1} = 0 ]; then 
    496         month_m1=12 
    497         yyyymm_m1=${year_m1}12 
    498     elif [ ${month_m1} -le 9 ]; then 
    499         month_m1=0${month_m1} 
    500         yyyymm_m1=${year}${month_m1} 
    501     else 
    502         yyyymm_m1=${year}${month_m1} 
     488      unset FileToBeDeleted 
    503489    fi 
    504     # Compute month_p1 (month plus 1M) 
    505     # Compute yyyymm_p1 (yyyymm plus 1M) 
    506     month_p1=$(( month + 1 )) 
    507     if [ ${month_p1} = 13 ]; then 
    508         month_p1=01 
    509         yyyymm_p1=${year_p1}01 
    510     elif [ ${month_p1} -le 9 ]; then 
    511         month_p1=0${month_p1} 
    512         yyyymm_p1=${year}${month_p1} 
    513     else 
    514         yyyymm_p1=${year}${month_p1} 
     490 
     491    IGCM_date_GetYearMonthDay $PeriodDateBegin year month day 
     492    IGCM_config_Analyse_PeriodLength 
     493 
     494    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Running" 
     495 
     496  fi     
     497  OldPrefix=${config_UserChoices_JobName}_${PeriodDateEnd} 
     498 
     499  # BEGIN: SHOULD GO IN A FUNCTION FROM libIGCM_date.ksh 
     500  # Compute year_m1 and year_p1 (year minus 1Y and year plus 1Y) 
     501  year_m1=$(( year - 1 )) 
     502  year_p1=$(( year + 1 ))        
     503  # Compute month_m1 (month minus 1M) 
     504  # Compute yyyymm_m1 (yyyymm minus 1M) 
     505  month_m1=$(( month - 1 )) 
     506  if [ ${month_m1} = 0 ]; then 
     507    month_m1=12 
     508    yyyymm_m1=${year_m1}12 
     509  elif [ ${month_m1} -le 9 ]; then 
     510    month_m1=0${month_m1} 
     511    yyyymm_m1=${year}${month_m1} 
     512  else 
     513    yyyymm_m1=${year}${month_m1} 
     514  fi 
     515  # Compute month_p1 (month plus 1M) 
     516  # Compute yyyymm_p1 (yyyymm plus 1M) 
     517  month_p1=$(( month + 1 )) 
     518  if [ ${month_p1} = 13 ]; then 
     519    month_p1=01 
     520    yyyymm_p1=${year_p1}01 
     521  elif [ ${month_p1} -le 9 ]; then 
     522    month_p1=0${month_p1} 
     523    yyyymm_p1=${year}${month_p1} 
     524  else 
     525    yyyymm_p1=${year}${month_p1} 
     526  fi 
     527  #IGCM_debug_Print 1 "jg 1 month_m1 = ${month_m1} month_p1 = ${month_p1} " 
     528  #IGCM_debug_Print 1 "jg 1 calculate yyyymm_m1 = ${yyyymm_m1} " 
     529  #IGCM_debug_Print 1 "jg 1 calculate yyyymm_p1 = ${yyyymm_p1} " 
     530 
     531  # END: SHOULD GO IN A FUNCTION FROM libIGCM_date.ksh 
     532 
     533  #===================================================================# 
     534  # Prepare variables available for ${COMP}.card and ${COMP}.driver   # 
     535  #             But available to any son functions                    # 
     536  #===================================================================# 
     537 
     538  # Period Length In Days between DateBegin and DateCurrent (at end of period == PeriodDateEnd !) 
     539  (( SimulationLengthInDays = $( IGCM_date_DaysBetweenGregorianDate ${PeriodDateEnd} ${DateBegin} ) + 1 )) 
     540 
     541  # Debug Print : 
     542  IGCM_debug_Print 1 "IGCM_config_PeriodStart : Before Execution" 
     543  IGCM_debug_Print 1 "Year of simulation      : ${year}" 
     544  IGCM_debug_Print 1 "Month of simulation     : ${month}" 
     545  IGCM_debug_Print 1 "PeriodLengthInDays      : ${PeriodLengthInDays}" 
     546  IGCM_debug_Print 1 "PeriodDateBegin         : ${PeriodDateBegin}" 
     547  IGCM_debug_Print 1 "PeriodDateEnd           : ${PeriodDateEnd}" 
     548  IGCM_debug_Print 1 "SimulationLengthInDays  : ${SimulationLengthInDays}" 
     549  IGCM_debug_Print 1 "ExperienceLengthInDays  : ${ExperienceLengthInDays}" 
     550 
     551  #================================================================# 
     552  #         Prepare variables available for comp_finalyze          # 
     553  #================================================================# 
     554 
     555  # Period for save files 
     556  eval DatesPeriod=${PeriodDateBegin}_${PeriodDateEnd} > /dev/null 2>&1 
     557 
     558  # Prefix for save files of this period 
     559  eval PREFIX=${config_UserChoices_JobName}_${DatesPeriod}  > /dev/null 2>&1 
     560 
     561  # List of files that will be deleted in RUN_DIR after run 
     562  [ -f stack ] && FileToBeDeleted[0]="stack" 
     563 
     564  # Test if the same run as already been saved : 
     565  if [ X${JobType} = XRUN ] ; then 
     566    if [ ${DRYRUN} -le 0 ] ; then 
     567      if ( IGCM_sys_TestFileBuffer ${R_BUF_KSH}/${PREFIX}_${Exe_Output} ) ; then 
     568        IGCM_debug_Exit "IGCM_config_PeriodStart" "You are currently RErunning an old job." 
     569        IGCM_debug_Print 1 "Because of readonly permissions, you can't RErun a job when saved files" 
     570        IGCM_debug_Print 1 " are still in the ARCHIVE directory. You must deleted those files, or " 
     571        IGCM_debug_Print 1 " the whole ${R_SAVE} tree. See clean_month.job in ${libIGCM} directory." 
     572        IGCM_debug_Print 1 " This exit has been initiated because at least ${R_BUF_KSH}/${PREFIX}_${Exe_Output} exists." 
     573        IGCM_debug_Verif_Exit 
     574      fi 
    515575    fi 
    516     #IGCM_debug_Print 1 "jg 1 month_m1 = ${month_m1} month_p1 = ${month_p1} " 
    517     #IGCM_debug_Print 1 "jg 1 calculate yyyymm_m1 = ${yyyymm_m1} " 
    518     #IGCM_debug_Print 1 "jg 1 calculate yyyymm_p1 = ${yyyymm_p1} " 
    519  
    520     # END: SHOULD GO IN A FUNCTION FROM libIGCM_date.ksh 
    521  
    522     #===================================================================# 
    523     # Prepare variables available for ${COMP}.card and ${COMP}.driver   # 
    524     #             But available to any son functions                    # 
    525     #===================================================================# 
    526  
    527     # Period Length In Days between DateBegin and DateCurrent (at end of period == PeriodDateEnd !) 
    528     (( SimulationLengthInDays = $( IGCM_date_DaysBetweenGregorianDate ${PeriodDateEnd} ${DateBegin} ) + 1 )) 
    529  
    530     # Debug Print : 
    531     IGCM_debug_Print 1 "IGCM_config_PeriodStart : Before Execution" 
    532     IGCM_debug_Print 1 "Year of simulation      : ${year}" 
    533     IGCM_debug_Print 1 "Month of simulation     : ${month}" 
    534     IGCM_debug_Print 1 "PeriodLengthInDays      : ${PeriodLengthInDays}" 
    535     IGCM_debug_Print 1 "PeriodDateBegin         : ${PeriodDateBegin}" 
    536     IGCM_debug_Print 1 "PeriodDateEnd           : ${PeriodDateEnd}" 
    537     IGCM_debug_Print 1 "SimulationLengthInDays  : ${SimulationLengthInDays}" 
    538     IGCM_debug_Print 1 "ExperienceLengthInDays  : ${ExperienceLengthInDays}" 
    539  
    540     #================================================================# 
    541     #         Prepare variables available for comp_finalyze          # 
    542     #================================================================# 
    543  
    544     # Period for save files 
    545     eval DatesPeriod=${PeriodDateBegin}_${PeriodDateEnd} > /dev/null 2>&1 
    546  
    547     # Prefix for save files of this period 
    548     eval PREFIX=${config_UserChoices_JobName}_${DatesPeriod}  > /dev/null 2>&1 
    549  
    550     # List of files that will be deleted in RUN_DIR after run 
    551     [ -f stack ] && FileToBeDeleted[0]="stack" 
    552  
    553     # Test if the same run as already been saved : 
    554     if [ X${JobType} = XRUN ] ; then 
    555         if [ ${DRYRUN} -le 0 ] ; then 
    556             if ( IGCM_sys_TestFileArchive ${R_OUT_KSH}/${PREFIX}_${Exe_Output} ) ; then 
    557                 IGCM_debug_Exit "IGCM_config_PeriodStart" "You are currently RErunning an old job." 
    558                 IGCM_debug_Print 1 "Because of readonly permissions, you can't RErun a job when saved files" 
    559                 IGCM_debug_Print 1 " are still in the ARCHIVE directory. You must deleted those files, or " 
    560                 IGCM_debug_Print 1 " the whole ${R_SAVE} tree. See clean_month.job in ${libIGCM} directory." 
    561                 IGCM_debug_Print 1 " This exit has been initiated because at least ${R_OUT_KSH}/${PREFIX}_${Exe_Output} exists." 
    562                 IGCM_debug_Verif_Exit 
    563             fi 
    564         fi 
    565     else 
    566         if ( IGCM_sys_TestFileArchive ${R_OUT_KSH}/${PREFIX}_${Exe_Output} ) ; then 
    567             IGCM_debug_Print 1 "IGCM_config_PeriodStart" "RErun an old job. Allowed in DEBUG or DEV mode." 
    568         fi 
     576  else 
     577    if ( IGCM_sys_TestFileBuffer ${R_BUF_KSH}/${PREFIX}_${Exe_Output} ) ; then 
     578      IGCM_debug_Print 1 "IGCM_config_PeriodStart" "RErun an old job. Allowed in DEBUG or DEV mode." 
    569579    fi 
    570  
    571     ExecutionFail=false 
    572  
    573     IGCM_debug_PopStack "IGCM_config_PeriodStart" 
     580  fi 
     581 
     582  ExecutionFail=false 
     583 
     584  IGCM_debug_PopStack "IGCM_config_PeriodStart" 
    574585} 
    575586 
     
    577588function IGCM_config_SaveSourceModifications 
    578589{ 
    579     IGCM_debug_PushStack "IGCM_config_SaveSourceModifications" 
    580  
    581     typeset ExeOutDateMax listVarEnv 
    582     ExeOutDateMax=$1 
    583  
    584     listVarEnv="ExeOutDateMax,R_OUT_EXE,PREFIX,SUBMIT_DIR" 
    585     IGCM_sys_RshMaster "\ 
     590  IGCM_debug_PushStack "IGCM_config_SaveSourceModifications" 
     591 
     592  typeset ExeOutDateMax listVarEnv 
     593  ExeOutDateMax=$1 
     594 
     595  listVarEnv="ExeOutDateMax,R_OUT_EXE,PREFIX,SUBMIT_DIR" 
     596  IGCM_sys_RshMaster "\ 
    586597       . ${libIGCM}/libIGCM_sys/libIGCM_sys.ksh; \ 
    587        export ExeOutDateMax=${ExeOutDateMax};\ 
     598    export ExeOutDateMax=${ExeOutDateMax};\ 
    588599       export R_OUT_EXE=${R_OUT_EXE};\ 
    589600       export PREFIX=${PREFIX};\ 
     
    593604       IGCM_sys_Qsub ${libIGCM}/SaveSourceModifications.job ${ExeOutDateMax} ${R_OUT_EXE} ${PREFIX} ${SUBMIT_DIR}" 
    594605 
    595     IGCM_debug_PopStack "IGCM_config_SaveSourceModifications" 
     606  IGCM_debug_PopStack "IGCM_config_SaveSourceModifications" 
    596607} 
    597608 
     
    599610function IGCM_config_PeriodEnd 
    600611{ 
    601     IGCM_debug_PushStack "IGCM_config_PeriodEnd" 
    602  
    603     echo 
    604     IGCM_debug_Print 1 "IGCM_config_PeriodEnd" 
    605     echo 
    606  
    607     #==================================# 
    608     #         Save Job output          # 
    609     #==================================# 
    610     IGCM_sys_Put_Out ${Exe_Output} ${R_OUT_KSH}/${PREFIX}_${Exe_Output} 
    611     eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${Exe_Output}" 
    612  
    613     IGCM_card_CheckConflict run.card 
    614     IGCM_sys_Put_Out ${SUBMIT_DIR}/run.card ${R_OUT_KSH}/run.card rw 
    615  
    616     IGCM_debug_Print 1 "Check components binary : size and creation date" 
    617  
    618     typeset LS_comp LS_bin ExeDate ExeCpuLog NextExeSize LastCompExeSize 
    619     typeset comp i     
    620     typeset ExeNameIn ExeNameOut UpdateExe ExeSecDateMax 
    621  
    622     #==================================# 
    623     #        Get last Exe Size         # 
    624     #==================================# 
    625  
    626     (( i=0 )) 
    627     if ( ${FirstInitialize} ) ; then 
     612  IGCM_debug_PushStack "IGCM_config_PeriodEnd" 
     613 
     614  echo 
     615  IGCM_debug_Print 1 "IGCM_config_PeriodEnd" 
     616  echo 
     617 
     618  #==================================# 
     619  #         Save Job output          # 
     620  #==================================# 
     621  IGCM_sys_PutBuffer_Out ${Exe_Output} ${R_BUF_KSH}/${PREFIX}_${Exe_Output} 
     622  eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${Exe_Output}" 
     623 
     624      IGCM_card_CheckConflict run.card 
     625      IGCM_sys_PutBuffer_Out ${SUBMIT_DIR}/run.card ${R_BUF_KSH}/run.card rw 
     626 
     627      IGCM_debug_Print 1 "Check components binary : size and creation date" 
     628 
     629      typeset LS_comp LS_bin ExeDate ExeCpuLog NextExeSize LastCompExeSize 
     630      typeset comp i     
     631      typeset ExeNameIn ExeNameOut UpdateExe ExeSecDateMax 
     632 
     633      #==================================# 
     634      #        Get last Exe Size         # 
     635      #==================================# 
     636 
     637      (( i=0 )) 
     638      if ( ${FirstInitialize} ) ; then 
    628639        run_Log_LastExeSize="" 
    629640        for comp in ${config_ListOfComponents[*]} ; do 
    630             run_Log_LastExeSize[$i]=0 
    631             (( i=i+1 )) 
     641          run_Log_LastExeSize[$i]=0 
     642          (( i=i+1 )) 
    632643        done 
    633     else 
     644      else 
    634645        IGCM_card_DefineArrayFromOption ${SUBMIT_DIR}/run.card Log LastExeSize 
    635     fi 
    636     #==================================# 
    637     #         And Build ExeDate        # 
    638     #==================================# 
    639  
    640     # ExeDate = ATM_Jun_12_09:34-SRF_Jun_12_09:34-OCE_Jun_12_09:34-ICE_Jun_12_09:34-CPL_Jun_12_09:33 
    641     # Would be nice to have next line but no way to format ls output (need to ls -l --time-style "+%Y-%m-%dT%H:%M") 
    642     # ExeDate = ATM_2009-06-12T09:34+SRF_2009-06-12T09:34+OCE_2009-06-12T09:34+ICE_2009-06-12T09:34+CPL_2009-06-12T09:34 
    643     ExeDate="" 
    644     NextExeSize="( " 
    645     (( i=0 )) 
    646     UpdateExe=false 
    647     (( ExeSecDateMax = 0 )) 
    648     for comp in ${config_ListOfComponents[*]} ; do 
     646      fi 
     647      #==================================# 
     648      #         And Build ExeDate        # 
     649      #==================================# 
     650 
     651      # ExeDate = ATM_Jun_12_09:34-SRF_Jun_12_09:34-OCE_Jun_12_09:34-ICE_Jun_12_09:34-CPL_Jun_12_09:33 
     652      # Would be nice to have next line but no way to format ls output (need to ls -l --time-style "+%Y-%m-%dT%H:%M") 
     653      # ExeDate = ATM_2009-06-12T09:34+SRF_2009-06-12T09:34+OCE_2009-06-12T09:34+ICE_2009-06-12T09:34+CPL_2009-06-12T09:34 
     654      ExeDate="" 
     655      NextExeSize="( " 
     656      (( i=0 )) 
     657      UpdateExe=false 
     658      (( ExeSecDateMax = 0 )) 
     659      for comp in ${config_ListOfComponents[*]} ; do 
    649660 
    650661        IGCM_debug_Print 3 ${comp} 
     
    654665        # Only if we really have an executable for the component : 
    655666        if [ X${ExeNameIn} = X\"\" ] ; then 
    656             # If there is no exe file for this component 
    657             (( ExeSize=0 )) 
     667          # If there is no exe file for this component 
     668          (( ExeSize=0 )) 
    658669        else 
    659             eval LS_bin=${R_EXE}/${ExeNameIn} 
    660             IGCM_sys_FileSize ${LS_bin} ExeSize 
    661  
    662             set +A LS_comp -- $( LC_TIME=en_US ls -l ${LS_bin} ) 
    663             if [ X${ExeDate} = X ] ; then  
    664                 # First component exe date 
    665                 ExeDate=${comp}_${LS_comp[5]}_${LS_comp[6]} 
    666             else 
    667                 ExeDate=${ExeDate}-${comp}_${LS_comp[5]}_${LS_comp[6]} 
    668             fi 
    669             ExeDate=${ExeDate}_${LS_comp[7]} 
     670          eval LS_bin=${R_EXE}/${ExeNameIn} 
     671          IGCM_sys_FileSize ${LS_bin} ExeSize 
     672 
     673          set +A LS_comp -- $( LC_TIME=en_US ls -l ${LS_bin} ) 
     674          if [ X${ExeDate} = X ] ; then  
     675            # First component exe date 
     676            ExeDate=${comp}_${LS_comp[5]}_${LS_comp[6]} 
     677          else 
     678            ExeDate=${ExeDate}-${comp}_${LS_comp[5]}_${LS_comp[6]} 
     679          fi 
     680          ExeDate=${ExeDate}_${LS_comp[7]} 
    670681        fi 
    671682 
    672683        if [ ${i} -eq 0 ] ; then 
    673             # First component 
    674             NextExeSize="( "${ExeSize} 
     684          # First component 
     685          NextExeSize="( "${ExeSize} 
    675686        else 
    676             NextExeSize=${NextExeSize}", "${ExeSize} 
     687          NextExeSize=${NextExeSize}", "${ExeSize} 
    677688        fi 
    678689        eval LastCompExeSize=${run_Log_LastExeSize[$i]} 
     
    680691 
    681692        if [ ${ExeSize} -ne ${LastCompExeSize} ] ; then 
    682             if ( ${FirstInitialize} ) ; then 
    683                 IGCM_debug_Print 1 "Save first ${ExeNameIn} in ${R_OUT_EXE} !" 
    684             else 
    685                 IGCM_debug_Print 1 "${ExeNameIn} has changed in ${R_EXE} !" 
    686                 IGCM_debug_Print 1 "Save latest ${ExeNameIn} in ${R_OUT_EXE} !" 
    687                 eval FileToBeDeleted[${#FileToBeDeleted[@]}]=${ExeNameOut} 
    688             fi 
    689             eval IGCM_sys_Put_Out ${ExeNameOut} ${R_OUT_EXE}/${PREFIX}_${ExeNameIn} rw 
    690             UpdateExe=true 
    691  
    692             IGCM_sys_GetDate_FichWork ${LS_bin} ExeSecDate 
    693             if [ $ExeSecDateMax -lt $ExeSecDate ] ; then 
    694                 ExeSecDateMax=$ExeSecDate 
    695             fi 
     693          if ( ${FirstInitialize} ) ; then 
     694            IGCM_debug_Print 1 "Save first ${ExeNameIn} in ${R_OUT_EXE} !" 
     695          else 
     696            IGCM_debug_Print 1 "${ExeNameIn} has changed in ${R_EXE} !" 
     697            IGCM_debug_Print 1 "Save latest ${ExeNameIn} in ${R_OUT_EXE} !" 
     698            eval FileToBeDeleted[${#FileToBeDeleted[@]}]=${ExeNameOut} 
     699          fi 
     700          eval IGCM_sys_Put_Out ${ExeNameOut} ${R_OUT_EXE}/${PREFIX}_${ExeNameIn} rw 
     701          UpdateExe=true 
     702 
     703          IGCM_sys_GetDate_FichWork ${LS_bin} ExeSecDate 
     704          if [ $ExeSecDateMax -lt $ExeSecDate ] ; then 
     705            ExeSecDateMax=$ExeSecDate 
     706          fi 
    696707        fi 
    697     done 
    698  
    699     if ( ${UpdateExe} ) ; then 
    700         echo "Launch SaveSourceModifications." 
    701         IGCM_config_SaveSourceModifications ${ExeSecDateMax} 
    702     fi 
    703  
    704     NextExeSize=${NextExeSize}" )" 
    705     IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Log LastExeSize "${NextExeSize}" 
    706  
    707     if [ ${DRYRUN} -le 1 ] ; then 
     708      done 
     709 
     710# SD : switch off for now 
     711#      if ( ${UpdateExe} ) ; then 
     712#       echo "Launch SaveSourceModifications." 
     713#       IGCM_config_SaveSourceModifications ${ExeSecDateMax} 
     714#      fi 
     715 
     716      NextExeSize=${NextExeSize}" )" 
     717      IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Log LastExeSize "${NextExeSize}" 
     718 
     719      if [ ${DRYRUN} -le 1 ] ; then 
    708720        tail -1500 ${Exe_Output} > ${Exe_Output}_tail.txt 
    709721        ExeCpuLog=$( gawk -f ${libIGCM}/libIGCM_sys/IGCM_add_out.awk ${Exe_Output}_tail.txt ) 
    710722        RET=$? 
    711723        if [ $RET -eq 0 ] ; then 
    712             # ExeCpuLog variable contents 5 fields 
    713             echo "${CumulPeriod} ${PeriodDateBegin} ${PeriodDateEnd} ${ExeCpuLog} ${ExeDate}" |   \ 
    714              gawk '{printf("# %11d | %15s | %15s | %19s | %19s | %15.5f | %15.5f | %15.5f | %s\n", \ 
    715                               $1,$2,$3,$4,$5,$6,$7,$8,$9)}' >> ${SUBMIT_DIR}/run.card 
     724          # ExeCpuLog variable contents 5 fields 
     725          echo "${CumulPeriod} ${PeriodDateBegin} ${PeriodDateEnd} ${ExeCpuLog} ${ExeDate}" |   \ 
     726            gawk '{printf("# %11d | %15s | %15s | %19s | %19s | %15.5f | %15.5f | %15.5f | %s\n", \ 
     727            $1,$2,$3,$4,$5,$6,$7,$8,$9)}' >> ${SUBMIT_DIR}/run.card 
    716728        fi 
    717729        eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${Exe_Output}_tail.txt" 
    718     fi 
    719  
    720     # All was right ? no ? then we stop. 
    721     IGCM_debug_Verif_Exit 
    722  
    723     # If all was OK, we can delete all files not necessary for next Job 
    724     echo 
    725     IGCM_debug_Print 1 "Files that will be deleted before next period-run : " 
    726  
    727     if [ ${DRYRUN} -le 2 ] ; then 
     730      fi 
     731 
     732      # All was right ? no ? then we stop. 
     733      IGCM_debug_Verif_Exit 
     734 
     735      # If all was OK, we can delete all files not necessary for next Job 
     736      echo 
     737      IGCM_debug_Print 1 "Files that will be deleted before next period-run : " 
     738 
     739      if [ ${DRYRUN} -le 2 ] ; then 
    728740        for f in ${FileToBeDeleted[@]} ; do [ -f ${f} ] && ls -la $f ; [ -f ${f} ] && rm -f $f ; done 
    729     else 
     741      else 
    730742        echo ${FileToBeDeleted[@]} 
    731     fi 
    732  
    733     #=================================================# 
    734     #         Modification of libIGCM behaviour       # 
    735     #=================================================# 
    736  
    737     # To use this function, one must copy libIGCM.card from ${libIGCM} directory 
    738     # and put it in ${SUBMIT_DIR} directory. After modifications of ${SUBMIT_DIR}/libIGCM.card, 
    739     # variables define inside [UserChanges] will be modified for next Period of libIGCM main loop.  
    740     if [ -f ${SUBMIT_DIR}/libIGCM.card ] ; then 
     743      fi 
     744 
     745      #=================================================# 
     746      #         Modification of libIGCM behaviour       # 
     747      #=================================================# 
     748 
     749      # To use this function, one must copy libIGCM.card from ${libIGCM} directory 
     750      # and put it in ${SUBMIT_DIR} directory. After modifications of ${SUBMIT_DIR}/libIGCM.card, 
     751      # variables define inside [UserChanges] will be modified for next Period of libIGCM main loop.  
     752      if [ -f ${SUBMIT_DIR}/libIGCM.card ] ; then 
    741753        echo 
    742754        echo "########################################################################" 
     
    750762        # Special treatments for libIGCM internals 
    751763        for option in ${libIGCM_UserChanges[*]} ; do 
    752             IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/libIGCM.card UserChanges ${option} 
    753  
    754             echo "We will change : ${option}." 
    755             eval echo "Previous value : " \${${option}} 
    756             eval echo "Change to : " \${libIGCM_UserChanges_${option}} 
    757              
    758             eval ${option}=\${libIGCM_UserChanges_${option}} 
    759  
    760             case ${option} in 
    761                 config_UserChoices_DateEnd) 
    762                     IGCM_debug_PrintVariables 1 config_UserChoices_DateEnd 
    763                     DateEnd=$( IGCM_date_ConvertFormatToGregorian ${config_UserChoices_DateEnd} ) 
    764  
    765                     # Period Length In Days between DateBegin and DateEnd 
    766                     (( ExperienceLengthInDays=$( IGCM_date_DaysBetweenGregorianDate ${DateEnd} ${DateBegin} )  + 1 )) 
    767                     if [ ${ExperienceLengthInDays} -lt 0 ] ; then 
    768                         IGCM_debug_Print 1 "Problem with dates in libIGCM.card : ${DateEnd} < ${DateBegin} ! You must check that." 
    769                         IGCM_debug_Exit "IGCM_PeriodEnd" " Wrong Dates." 
    770                         IGCM_debug_Verif_Exit  
    771                     fi 
    772                     ;; 
    773                 config_UserChoices_PeriodLength) 
    774                     IGCM_debug_Print 1  "Change config_UserChoices_PeriodLength=${config_UserChoices_PeriodLength}" 
    775                     ;; 
    776                 PeriodNb) 
    777                     IGCM_debug_Print 1  "Loop in main Job with ${PeriodNb} period(s)" 
    778                     ;; 
    779                 config_Post_RebuildFrequency) 
    780                     IGCM_debug_Print 1  "Change config_Post_RebuildFrequency=${config_Post_RebuildFrequency} : IGCM_post_Configure" 
    781                     IGCM_post_Configure 
    782                     ;; 
    783                 config_Post_TimeSeriesFrequency) 
    784                     IGCM_debug_Print 1  "Change config_Post_TimeSeriesFrequency = ${config_Post_TimeSeriesFrequency} : IGCM_post_Initialize" 
    785                     IGCM_post_Configure 
    786                     ;; 
    787                 config_Post_SeasonalFrequency) 
    788                     IGCM_debug_Print 1  "Change config_Post_SeasonalFrequency = ${config_Post_SeasonalFrequency} : IGCM_post_Initialize" 
    789                     IGCM_post_Configure 
    790                     ;; 
    791             esac 
    792         done 
    793  
    794         echo 
    795         echo "########################################################################" 
    796         echo 
    797     fi 
    798  
    799     #=================================================# 
    800     #         Determine next computed period          # 
    801     #=================================================# 
    802  
    803     PeriodDateBegin=$( IGCM_date_AddDaysToGregorianDate ${PeriodDateEnd} 1 ) 
    804     IGCM_date_GetYearMonthDay $PeriodDateBegin year month day 
    805     year_m1=$(( year - 1 )) 
    806     year_p1=$(( year + 1 )) 
    807     IGCM_config_Analyse_PeriodLength 
    808     PeriodDateEnd=$( IGCM_date_AddDaysToGregorianDate ${PeriodDateBegin} $(( ${PeriodLengthInDays} - 1 )) ) 
    809  
    810     # Debug Print : 
    811     echo 
    812     IGCM_debug_Print 1 "IGCM_config_PeriodEnd : Preparing Next Execution" 
    813     IGCM_debug_Print 1 "PeriodDateBegin       : ${PeriodDateBegin}" 
    814     IGCM_debug_Print 1 "PeriodDateEnd         : ${PeriodDateEnd}" 
    815     IGCM_debug_Print 1 "PeriodLengthInDays    : ${PeriodLengthInDays}" 
    816  
    817     PeriodDateBegin=$( IGCM_date_ConvertFormatToHuman ${PeriodDateBegin} ) 
    818     PeriodDateEnd=$( IGCM_date_ConvertFormatToHuman ${PeriodDateEnd} ) 
    819  
    820     (( CumulPeriod = CumulPeriod + 1 )) 
    821  
    822     # Debug Print : 
    823     echo 
    824     IGCM_debug_Print 3 "PeriodDateBegin Human : ${PeriodDateBegin}" 
    825     IGCM_debug_Print 3 "PeriodDateEnd Human   : ${PeriodDateEnd}" 
    826     IGCM_debug_Print 3 "CumulPeriod           : ${CumulPeriod}" 
    827  
    828     #=================================================# 
    829     #             Write updated run.card              # 
    830     #=================================================# 
    831  
    832     IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration OldPrefix ${OldPrefix} 
    833     IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin ${PeriodDateBegin} 
    834     IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd ${PeriodDateEnd} 
    835     IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod ${CumulPeriod} 
    836  
    837     if ( ${FirstInitialize} ) ; then 
    838         # It's no more the first time 
    839         FirstInitialize=false 
    840     fi 
    841  
    842     IGCM_debug_PopStack "IGCM_config_PeriodEnd" 
     764          IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/libIGCM.card UserChanges ${option} 
     765 
     766          echo "We will change : ${option}." 
     767          eval echo "Previous value : " \${${option}} 
     768          eval echo "Change to : " \${libIGCM_UserChanges_${option}} 
     769           
     770          eval ${option}=\${libIGCM_UserChanges_${option}} 
     771 
     772          case ${option} in 
     773          config_UserChoices_DateEnd) 
     774          IGCM_debug_PrintVariables 1 config_UserChoices_DateEnd 
     775          DateEnd=$( IGCM_date_ConvertFormatToGregorian ${config_UserChoices_DateEnd} ) 
     776 
     777          # Period Length In Days between DateBegin and DateEnd 
     778          (( ExperienceLengthInDays=$( IGCM_date_DaysBetweenGregorianDate ${DateEnd} ${DateBegin} )  + 1 )) 
     779          if [ ${ExperienceLengthInDays} -lt 0 ] ; then 
     780            IGCM_debug_Print 1 "Problem with dates in libIGCM.card : ${DateEnd} < ${DateBegin} ! You must check that." 
     781            IGCM_debug_Exit "IGCM_PeriodEnd" " Wrong Dates." 
     782            IGCM_debug_Verif_Exit  
     783          fi 
     784          ;; 
     785          config_UserChoices_PeriodLength) 
     786        IGCM_debug_Print 1  "Change config_UserChoices_PeriodLength=${config_UserChoices_PeriodLength}" 
     787        ;; 
     788        PeriodNb) 
     789              IGCM_debug_Print 1  "Loop in main Job with ${PeriodNb} period(s)" 
     790              ;; 
     791              config_Post_RebuildFrequency) 
     792            IGCM_debug_Print 1  "Change config_Post_RebuildFrequency=${config_Post_RebuildFrequency} : IGCM_post_Configure" 
     793            IGCM_post_Configure 
     794            ;; 
     795            config_Post_TimeSeriesFrequency) 
     796    IGCM_debug_Print 1  "Change config_Post_TimeSeriesFrequency = ${config_Post_TimeSeriesFrequency} : IGCM_post_Initialize" 
     797    IGCM_post_Configure 
     798    ;; 
     799    config_Post_SeasonalFrequency) 
     800  IGCM_debug_Print 1  "Change config_Post_SeasonalFrequency = ${config_Post_SeasonalFrequency} : IGCM_post_Initialize" 
     801  IGCM_post_Configure 
     802  ;; 
     803  esac 
     804  done 
     805 
     806  echo 
     807  echo "########################################################################" 
     808  echo 
     809  fi 
     810 
     811  #=================================================# 
     812  #         Determine next computed period          # 
     813  #=================================================# 
     814 
     815  PeriodDateBegin=$( IGCM_date_AddDaysToGregorianDate ${PeriodDateEnd} 1 ) 
     816  IGCM_date_GetYearMonthDay $PeriodDateBegin year month day 
     817  year_m1=$(( year - 1 )) 
     818  year_p1=$(( year + 1 )) 
     819  IGCM_config_Analyse_PeriodLength 
     820  PeriodDateEnd=$( IGCM_date_AddDaysToGregorianDate ${PeriodDateBegin} $(( ${PeriodLengthInDays} - 1 )) ) 
     821 
     822  # Debug Print : 
     823  echo 
     824  IGCM_debug_Print 1 "IGCM_config_PeriodEnd : Preparing Next Execution" 
     825  IGCM_debug_Print 1 "PeriodDateBegin       : ${PeriodDateBegin}" 
     826  IGCM_debug_Print 1 "PeriodDateEnd         : ${PeriodDateEnd}" 
     827  IGCM_debug_Print 1 "PeriodLengthInDays    : ${PeriodLengthInDays}" 
     828 
     829  PeriodDateBegin=$( IGCM_date_ConvertFormatToHuman ${PeriodDateBegin} ) 
     830  PeriodDateEnd=$( IGCM_date_ConvertFormatToHuman ${PeriodDateEnd} ) 
     831 
     832  (( CumulPeriod = CumulPeriod + 1 )) 
     833 
     834  # Debug Print : 
     835  echo 
     836  IGCM_debug_Print 3 "PeriodDateBegin Human : ${PeriodDateBegin}" 
     837  IGCM_debug_Print 3 "PeriodDateEnd Human   : ${PeriodDateEnd}" 
     838  IGCM_debug_Print 3 "CumulPeriod           : ${CumulPeriod}" 
     839 
     840  #=================================================# 
     841  #             Write updated run.card              # 
     842  #=================================================# 
     843 
     844  IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration OldPrefix ${OldPrefix} 
     845  IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin ${PeriodDateBegin} 
     846  IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd ${PeriodDateEnd} 
     847  IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod ${CumulPeriod} 
     848 
     849  if ( ${FirstInitialize} ) ; then 
     850    # It's no more the first time 
     851    FirstInitialize=false 
     852  fi 
     853 
     854  IGCM_debug_PopStack "IGCM_config_PeriodEnd" 
    843855} 
    844856 
     
    846858function IGCM_config_Finalize 
    847859{ 
    848     IGCM_debug_PushStack "IGCM_config_Finalize" 
    849  
    850     echo 
    851     IGCM_debug_Print 1 "IGCM_config_Finalize" 
    852     echo 
    853  
    854     if [ ${SimulationLengthInDays} -ge ${ExperienceLengthInDays} ] ; then 
    855         #==========================# 
    856         # End of entire simulation # 
    857         #==========================# 
    858  
    859         # Mail notification 
    860         IGCM_sys_SendMail 
    861  
    862         # 
    863         IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Completed" 
    864         IGCM_debug_Print 1 "Normal End of computation." 
    865         if ( $DEBUG_debug ) ; then 
    866             echo 
    867             IGCM_debug_Print 1 "Your files on ${R_OUT} :" 
    868             IGCM_sys_Tree ${R_SAVE} 
    869         fi 
    870     else 
    871         #=================# 
    872         # Submit next job # 
    873         #=================# 
    874  
    875         IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "OnQueue" 
    876  
    877         # Name of next Ksh Script output : 
    878         eval Script_Output="${Script_Output_Prefix}_${config_UserChoices_JobName}.$( printf "%06d" ${CumulPeriod} )" 
    879  
    880         IGCM_debug_Print 1 "Submit next job" 
    881         # SUBMIT NEXT JOB from SUBMIT_DIR and come back in RUN_DIR 
    882         IGCM_sys_Cd ${SUBMIT_DIR} 
    883         # Keep only the 5 latest ${Script_Output_Prefix}_${config_UserChoices_JobName} 
    884         ScriptTot=$( ls ${Script_Output_Prefix}_${config_UserChoices_JobName}.?????? 2>/dev/null | wc -l ) 
    885         [ ${ScriptTot} -gt 5 ] && rm -f $( ls ${Script_Output_Prefix}_${config_UserChoices_JobName}.?????? | head -$(( ${ScriptTot} - 5 )) ) 
    886         # Submit next job and come back 
    887         IGCM_sys_Qsub ${SUBMIT_DIR}/Job_${config_UserChoices_JobName} 
    888         IGCM_sys_Cd - 
     860  IGCM_debug_PushStack "IGCM_config_Finalize" 
     861 
     862  echo 
     863  IGCM_debug_Print 1 "IGCM_config_Finalize" 
     864  echo 
     865 
     866  if [ ${SimulationLengthInDays} -ge ${ExperienceLengthInDays} ] ; then 
     867    #==========================# 
     868    # End of entire simulation # 
     869    #==========================# 
     870 
     871    # Mail notification 
     872    IGCM_sys_SendMail 
     873 
     874    # 
     875    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Completed" 
     876    IGCM_debug_Print 1 "Normal End of computation." 
     877    if ( $DEBUG_debug ) ; then 
     878      echo 
     879      IGCM_debug_Print 1 "Your files on ${R_SAVE} :" 
     880      IGCM_sys_Tree ${R_SAVE} 
     881 
     882      IGCM_debug_Print 1 "Your files on ${R_BUFR} :" 
     883      IGCM_sys_Tree ${R_BUFR} 
    889884    fi 
    890  
    891     # Supress Non Deleted Boundary files 
    892     if [ ${DRYRUN} -le 2 ] ; then 
    893         IGCM_comp_DelFixeBoundaryFiles 
    894         ls -la 
    895     fi 
    896      
    897     # Clean ${RUN_DIR}=${RUN_DIR_PATH}/${config_UserChoices_TagName}/${config_UserChoices_JobName} 
    898     # Only for production run (No clean up in DEV or DEB mode) 
    899     # and command sent from .. directory. 
    900     IGCM_sys_Cd .. 
    901     [ X${JobType} = XRUN ] && IGCM_sys_Rm -rf ${RUN_DIR} 
    902  
    903     IGCM_debug_PopStack "IGCM_config_Finalize" 
     885  else 
     886    #=================# 
     887    # Submit next job # 
     888    #=================# 
     889 
     890    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "OnQueue" 
     891 
     892    # Name of next Ksh Script output : 
     893    eval Script_Output="${Script_Output_Prefix}_${config_UserChoices_JobName}.$( printf "%06d" ${CumulPeriod} )" 
     894 
     895    IGCM_debug_Print 1 "Submit next job" 
     896    # SUBMIT NEXT JOB from SUBMIT_DIR and come back in RUN_DIR 
     897    IGCM_sys_Cd ${SUBMIT_DIR} 
     898    # Keep only the 5 latest ${Script_Output_Prefix}_${config_UserChoices_JobName} 
     899    ScriptTot=$( ls ${Script_Output_Prefix}_${config_UserChoices_JobName}.?????? 2>/dev/null | wc -l ) 
     900    [ ${ScriptTot} -gt 5 ] && rm -f $( ls ${Script_Output_Prefix}_${config_UserChoices_JobName}.?????? | head -$(( ${ScriptTot} - 5 )) ) 
     901    # Submit next job and come back 
     902    IGCM_sys_Qsub ${SUBMIT_DIR}/Job_${config_UserChoices_JobName} 
     903    IGCM_sys_Cd - 
     904  fi 
     905 
     906  # Supress Non Deleted Boundary files 
     907  if [ ${DRYRUN} -le 2 ] ; then 
     908    IGCM_comp_DelFixeBoundaryFiles 
     909    ls -la 
     910  fi 
     911   
     912  # Clean ${RUN_DIR}=${RUN_DIR_PATH}/${config_UserChoices_TagName}/${config_UserChoices_JobName} 
     913  # Only for production run (No clean up in DEV or DEB mode) 
     914  # and command sent from .. directory. 
     915  IGCM_sys_Cd .. 
     916  [ X${JobType} = XRUN ] && IGCM_sys_Rm -rf ${RUN_DIR} 
     917 
     918  IGCM_debug_PopStack "IGCM_config_Finalize" 
    904919} 
    905920 
Note: See TracChangeset for help on using the changeset viewer.