source: trunk/libIGCM/libIGCM_config/libIGCM_config.ksh @ 907

Last change on this file since 907 was 903, checked in by sdipsl, 11 years ago
  • Dods copy is controled by an option in config.card/[Post]. See #150
  • Property licence set to
    The following licence information concerns ONLY the libIGCM tools
    ==================================================================

    Copyright © Centre National de la Recherche Scientifique CNRS
    Commissariat à l'Énergie Atomique CEA

    libIGCM : Library for Portable Models Computation of IGCM Group.

    IGCM Group is the french IPSL Global Climate Model Group.

    This library is a set of shell scripts and functions whose purpose is
    the management of the initialization, the launch, the transfer of
    output files, the post-processing and the monitoring of datas produce
    by any numerical program on any plateforme.

    This software is governed by the CeCILL license under French law and
    abiding by the rules of distribution of free software. You can use,
    modify and/ or redistribute the software under the terms of the CeCILL
    license as circulated by CEA, CNRS and INRIA at the following URL
    "http://www.cecill.info".

    As a counterpart to the access to the source code and rights to copy,
    modify and redistribute granted by the license, users are provided only
    with a limited warranty and the software's author, the holder of the
    economic rights, and the successive licensors have only limited
    liability.

    In this respect, the user's attention is drawn to the risks associated
    with loading, using, modifying and/or developing or reproducing the
    software by the user in light of its specific status of free software,
    that may mean that it is complicated to manipulate, and that also
    therefore means that it is reserved for developers and experienced
    professionals having in-depth computer knowledge. Users are therefore
    encouraged to load and test the software's suitability as regards their
    requirements in conditions enabling the security of their systems and/or
    data to be ensured and, more generally, to use and operate it in the
    same conditions as regards security.

    The fact that you are presently reading this means that you have had
    knowledge of the CeCILL license and that you accept its terms.
  • Property svn:keywords set to Revision Author Date
File size: 53.1 KB
Line 
1#!/bin/ksh
2
3#**************************************************************
4# Author: Sebastien Denvil, Martial Mancip
5# Contact: Sebastien.Denvil__at__ipsl.jussieu.fr Martial.Mancip__at__ipsl.jussieu.fr
6# $Revision::                                          $ Revision of last commit
7# $Author::                                            $ Author of last commit
8# $Date::                                              $ Date of last commit
9# IPSL (2006)
10#  This software is governed by the CeCILL licence see libIGCM/libIGCM_CeCILL.LIC
11#
12#**************************************************************
13
14#===================================
15function IGCM_config_CommonConfiguration
16{
17  IGCM_debug_PushStack "IGCM_config_CommonConfiguration" $@
18
19  # Debug Print :
20  [ ${Verbosity} -gt 0 ] && echo
21  IGCM_debug_Print 1 "IGCM_config_CommonConfiguration" $@
22
23  # config.card path
24  configPath=$1
25
26  #==================================
27  typeset option auxprint CompatibilityTag
28
29  #==================================
30  # Read libIGCM compatibility version in config.card
31  IGCM_card_DefineVariableFromOption ${configPath} Compatibility libIGCM
32  eval CompatibilityTag=${config_Compatibility_libIGCM} > /dev/null 2>&1
33
34  if [ ! "${CompatibilityTag}" = "${libIGCM_CurrentTag}" ] ; then
35    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 ."
36  fi
37
38  #==================================
39  # Read UserChoices section:
40  [ ${Verbosity} -gt 0 ] && echo
41  IGCM_debug_Print 1 "DefineArrayFromOption  : config_UserChoices"
42
43  IGCM_card_DefineArrayFromSection ${configPath} UserChoices
44  for option in ${config_UserChoices[*]} ; do
45    IGCM_card_DefineVariableFromOption ${configPath} UserChoices ${option}
46    eval auxprint=\${config_UserChoices_${option}}
47    IGCM_debug_Print 3 "${option} : ${auxprint}"
48  done
49
50  #==================================
51  # Read Ensemble section:
52  [ ${Verbosity} -gt 0 ] && echo
53  IGCM_debug_Print 1 "DefineArrayFromOption  : config_Ensemble"
54
55  IGCM_card_DefineArrayFromSection ${configPath} Ensemble
56  for option in ${config_Ensemble[*]} ; do
57    IGCM_card_DefineVariableFromOption ${configPath} Ensemble ${option}
58    eval auxprint=\${config_Ensemble_${option}}
59    IGCM_debug_Print 3 "${option} : ${auxprint}"
60  done
61
62  #==================================
63  # Read Post section:
64  [ ${Verbosity} -gt 0 ] && echo
65  IGCM_debug_Print 1 "DefineArrayFromOption : config_Post"
66
67  IGCM_card_DefineArrayFromSection ${configPath} Post
68  for option in ${config_Post[*]} ; do
69    IGCM_card_DefineVariableFromOption ${configPath} Post ${option}
70    eval auxprint=\${config_Post_${option}}
71    IGCM_debug_Print 3 "${option} : ${auxprint}"
72  done
73  [ ${Verbosity} -gt 0 ] && echo
74
75  #==================================
76  # Define default value to keep compatibility with previous card: means before changes due to TGCC
77  # Apply some overrules to ensure proper usage of computing centres resources
78  #
79  if [ X${PackDefault} = Xtrue ] ; then
80    # If we DO apply pack in this computing center
81    IGCM_debug_Print 1 "Due to inodes policy OVERRULE RebuildFromArchive value to NONE"
82    config_Post_RebuildFromArchive=NONE
83    if [ X${config_UserChoices_SpaceName} = XTEST ]; then
84      # TEST simulations will not be packed and will stay on SCRATCHDIR filesystem
85      IGCM_debug_Print 1 "SpaceName=TEST. OVERRULE PackFrequency to NONE"
86      IGCM_debug_Print 1 "SpaceName=TEST. OVERRULE destination path directories"
87      config_Post_PackFrequency=NONE
88      IGCM_sys_ChangeArchive
89    else
90      # Default to RebuildFrequency if nothing has been set up related to PackFrequency
91      [ X${config_Post_PackFrequency} = X ] && config_Post_PackFrequency=${config_Post_RebuildFrequency}
92    fi
93  else
94    # If we DO NOT apply pack in this computing center
95    config_Post_PackFrequency=NONE
96  fi
97
98  #====================================================
99  # R_SAVE : Job output directory
100  # R_BUFR : Job output buffered directory
101
102  if ( [ ! X${config_UserChoices_SpaceName} = X ] && [ ! X${config_UserChoices_ExperimentName} = X ] ) ; then
103    FreeName=$( echo ${config_UserChoices_JobName} | sed 's/.*_//' )
104    if ( [ ! X${config_Ensemble_EnsembleName} = X ] && [ ! X${config_Ensemble_EnsembleDate} = X ] ) ; then
105      R_SAVE=${R_OUT}/${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${config_Ensemble_EnsembleName}/${config_Ensemble_EnsembleDate}/${FreeName}
106      R_FIGR=${R_FIG}/${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${config_Ensemble_EnsembleName}/${config_Ensemble_EnsembleDate}/${FreeName}
107      R_BUFR=${R_BUF}/${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${config_Ensemble_EnsembleName}/${config_Ensemble_EnsembleDate}/${FreeName}
108      R_DODS=${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${config_Ensemble_EnsembleName}/${config_Ensemble_EnsembleDate}/${FreeName}
109    else
110      R_SAVE=${R_OUT}/${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${FreeName}
111      R_FIGR=${R_FIG}/${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${FreeName}
112      R_BUFR=${R_BUF}/${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${FreeName}
113      R_DODS=${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${FreeName}
114    fi
115  else
116    if ( [ ! X${config_Ensemble_EnsembleName} = X ] && [ ! X${config_Ensemble_EnsembleDate} = X ] ) ; then
117      R_SAVE=${R_OUT}/${config_UserChoices_TagName}/${config_Ensemble_EnsembleName}/${config_Ensemble_EnsembleDate}/${config_UserChoices_JobName}
118      R_FIGR=${R_FIG}/${config_UserChoices_TagName}/${config_Ensemble_EnsembleName}/${config_Ensemble_EnsembleDate}/${config_UserChoices_JobName}
119      R_BUFR=${R_BUF}/${config_UserChoices_TagName}/${config_Ensemble_EnsembleName}/${config_Ensemble_EnsembleDate}/${config_UserChoices_JobName}
120      R_DODS=${config_UserChoices_TagName}/${config_Ensemble_EnsembleName}/${config_Ensemble_EnsembleDate}/${config_UserChoices_JobName}
121    else
122      R_SAVE=${R_OUT}/${config_UserChoices_TagName}/${config_UserChoices_JobName}
123      R_FIGR=${R_FIG}/${config_UserChoices_TagName}/${config_UserChoices_JobName}
124      R_BUFR=${R_BUF}/${config_UserChoices_TagName}/${config_UserChoices_JobName}
125      R_DODS=${config_UserChoices_TagName}/${config_UserChoices_JobName}
126    fi
127  fi
128
129  #====================================================
130  # Define REBUILD_DIR : where we store files needing rebuild process
131  if [ X${config_Post_RebuildFromArchive} = Xtrue ] ; then
132    REBUILD_DIR=${R_SAVE}/REBUILD
133    if [ ! X${TaskType} = Xchecking ] ; then
134      IGCM_sys_MkdirArchive ${REBUILD_DIR}
135    fi
136  else
137    REBUILD_DIR=${R_BUFR}/REBUILD
138    if [ ! X${TaskType} = Xchecking ] ; then
139      IGCM_sys_MkdirWork ${REBUILD_DIR}
140    fi
141  fi
142
143  #====================================================
144  # DodsCopy : apply default value if not defined
145  if ( [ X${config_Post_DodsCopy} = X${NULL_STR} ] || [ X${config_Post_DodsCopy} = X ] ) ; then
146    config_Post_DodsCopy=TRUE
147  fi
148
149  IGCM_debug_PopStack "IGCM_config_CommonConfiguration"
150}
151
152#===================================
153function IGCM_config_Initialize
154{
155  IGCM_debug_PushStack "IGCM_config_Initialize"
156
157  # Debug Print :
158  echo
159  IGCM_debug_Print 1 "IGCM_config_Initialize"
160
161  if [ ! -r ${SUBMIT_DIR}/run.card ] ; then
162    #================================================#
163    #         The file run.card doesn't exist        #
164    #================================================#
165    FirstInitialize=true
166    #copy initial run.card
167    IGCM_sys_Cp ${SUBMIT_DIR}/run.card.init ${SUBMIT_DIR}/run.card
168    IGCM_debug_Print 2 "run.card copied from run.card.init"
169  else
170    FirstInitialize=false
171    IGCM_debug_Print 2 "run.card exists"
172  fi
173
174  # Test modipsl tree existence.
175  IGCM_sys_TestDir ${MODIPSL}
176  [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDir"
177  IGCM_sys_TestDir ${libIGCM}
178  [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDir"
179  IGCM_sys_TestDir ${R_EXE}
180  [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDir"
181  IGCM_sys_TestDir ${SUBMIT_DIR}
182  [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDir"
183
184  if ( $DEBUG_debug ) ; then
185    echo "Keep trace of inital SUBMIT_DIR : "
186    ls -lta ${SUBMIT_DIR}
187  fi
188
189  #==================================
190  # Read libIGCM compatibility version in config.card
191  # Read UserChoices section
192  # Read Ensemble section
193  # Read Post section
194  # Define all netcdf output directories
195  #==================================
196  IGCM_config_CommonConfiguration ${SUBMIT_DIR}/config.card
197
198  #==================================
199  # Read ListOfComponents section:
200  echo
201  IGCM_debug_Print 1 "DefineArrayFromSection : ListOfComponents"
202
203  IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/config.card ListOfComponents
204  for comp in ${config_ListOfComponents[*]} ; do
205    IGCM_card_DefineArrayFromOption ${SUBMIT_DIR}/config.card ListOfComponents ${comp}
206  done
207  IGCM_debug_Print 3 ${config_ListOfComponents[*]}
208
209  #==================================
210  # Read Executable section:
211  IGCM_card_DefineArrayFromSection   ${SUBMIT_DIR}/config.card Executable
212
213  #==================================
214  # Read Restarts section:
215  # Restarts : Gerneral rule or local for each component.
216  echo
217  IGCM_debug_Print 1 "DefineArrayFromOption : config_Restarts"
218
219  IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/config.card Restarts
220  for option in ${config_Restarts[*]} ; do
221    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card Restarts ${option}
222    eval auxprint=\${config_Restarts_${option}}
223    IGCM_debug_Print 3 "${option} : ${auxprint}"
224  done
225
226  #==================================
227  # Define Job Outputs Name
228  echo
229  IGCM_debug_Print 2 "Define Script_Output_Prefix and Exe_Output"
230  eval Script_Output_Prefix=${config_UserChoices_Script_Output_Prefix:='Script_Output'}
231  IGCM_debug_Print 3 "Script_Output_Prefix = ${Script_Output_Prefix}"
232  eval Exe_Output=out_execution
233  IGCM_debug_Print 3 "Exe_Output           = ${Exe_Output}"
234
235  #===================================================================#
236  # Prepare variables available for ${COMP}.card and ${COMP}.driver   #
237  #             But available to any son functions                    #
238  #===================================================================#
239
240  # Convert yyyy-mm-dd date to gregorian yyyymmdd
241  DateBegin=$( IGCM_date_ConvertFormatToGregorian ${config_UserChoices_DateBegin} )
242  DateEnd=$(   IGCM_date_ConvertFormatToGregorian ${config_UserChoices_DateEnd}   )
243
244  # Period Length In Days between DateBegin and DateEnd
245  (( ExperienceLengthInDays=$( IGCM_date_DaysBetweenGregorianDate ${DateEnd} ${DateBegin} )  + 1 ))
246  if [ ${ExperienceLengthInDays} -lt 0 ] ; then
247    IGCM_debug_Print 1 "Problem with dates in config.card : ${DateEnd} < ${DateBegin} ! You must check that."
248    IGCM_debug_Exit "IGCM_config_Initialize" " Wrong Dates."
249    IGCM_debug_Verif_Exit
250  fi
251
252  # Day and Year of Initial State (Given in julian format)
253  InitDay=$(( $( IGCM_date_ConvertGregorianDateToJulian $DateBegin ) % 1000 ))
254  InitYear=$(( $( IGCM_date_ConvertGregorianDateToJulian $DateBegin ) / 1000 ))
255
256  #================================================================#
257  #                  Test and Prepare directories                  #
258  #================================================================#
259
260  # ==> 4 kinds of input files :
261  #     1) R_INIT  : Initial State Files   (Etat0, carteveg)
262  #     2) R_BC    : Boundary Conditions   (Forcages, lai)
263  #     3) Parameters files (allready define through ${SUBMIT_DIR})
264  #     4) Restarts files   (allready define in IGCM_config_Initialize)
265
266  # Here we offer the possibility to redefine R_INIT, R_BC
267  # and PeriodNb through config.card
268  R_INIT=${config_UserChoices_R_INIT:=${R_IN}/INIT}
269  echo
270  IGCM_debug_Print 2 "(Re)Define R_INIT, R_BC and PeriodNb"
271  IGCM_debug_Print 3 "R_INIT=${R_INIT}"
272  R_BC=${config_UserChoices_R_BC:=${R_IN}/BC}
273  IGCM_debug_Print 3  "R_BC=${R_BC}"
274  PeriodNb=${config_UserChoices_PeriodNb:=${PeriodNb}}
275  IGCM_debug_Print 3  "Loop in main Job with ${PeriodNb} period(s)"
276
277  # Test Archive input/output.
278  echo
279  IGCM_sys_TestDirArchive ${ARCHIVE}
280  [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDirArchive"
281
282  # SD ADA SPECIFIC #
283  #      TO FIX     #
284  #IGCM_sys_TestDirArchive ${R_IN}
285  #[ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDirArchive"
286
287  if ( ${FirstInitialize} ) ; then
288    IGCM_sys_MkdirArchive   ${R_SAVE}
289    [ ! ${config_Post_PackFrequency} = NONE ] && IGCM_sys_Mkdir ${R_BUFR}
290  else
291    IGCM_sys_TestDirArchive ${R_SAVE}
292    [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDirArchive ${R_SAVE}"
293
294    if [ ! ${config_Post_PackFrequency} = NONE ] ; then
295      IGCM_sys_TestDir ${R_BUFR}
296      [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDir ${R_BUFR}"
297    fi
298
299    #Test state of run in run.card
300    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodState
301
302    if ( [ ${run_Configuration_PeriodState} != "Start" ] && [ ${run_Configuration_PeriodState} != "Running" ] && [ ${run_Configuration_PeriodState} != "OnQueue" ] && [ ${run_Configuration_PeriodState} != "Continue" ] ) ; then
303      echo
304      IGCM_debug_Print 1 "!! Error in run.card with PeriodState : " ${run_Configuration_PeriodState} "!!"
305      IGCM_debug_Print 1 "Try running ${libIGCM}/clean_month.job to fix this"
306      IGCM_debug_Exit
307      IGCM_debug_Verif_Exit
308    fi
309  fi
310
311  #====================================================
312  # Experience type : DEB(ug), DEV(elopment), RUN
313  if [ X${JobType} != XRUN ] ; then
314    echo
315    echo "===================================================="
316    echo "libIGCM JOB is NOT in RUN type mode."
317    echo "!! OUTPUT files will NOT be PROTECTED !!"
318    echo "Be carefull : you can ERASE the result of this job !"
319
320    case ${JobType} in
321    DEB)
322      echo "DEBUG mode : activation of 'set -vx' mode."
323      echo "DEBUG mode : no protection for output files."
324      echo "DEBUG mode : if active force asynchronous rebuild frequency to PeriodLength frequency."
325      ;;
326    DEV)
327      echo "DEVelopment mode : no protection for output files."
328      echo "DEVelopment mode : if active force asynchronous rebuild frequency to PeriodLength frequency."
329      ;;
330    esac
331
332    if ( [ X${config_Post_RebuildFrequency} != XNONE ] && [ ${DRYRUN} -eq 0 ] ) ; then
333      if [ X${config_Post_RebuildFrequency} != X${config_UserChoices_PeriodLength} ] ; then
334        echo "------------"
335        echo "WARNING : Job is NOT in RUN mode then we will force REBUILD Frequency"
336        echo "          to PeriodLength : ${config_UserChoices_PeriodLength}"
337        echo "------------"
338        config_Post_RebuildFrequency=${config_UserChoices_PeriodLength}
339      fi
340    fi
341    echo "===================================================="
342    echo
343  fi
344
345  #====================================================
346  #R_OUT_KSH : Storage place for job output
347  #R_OUT_EXE : Storage place for binary used during simulation
348  R_OUT_KSH=${R_SAVE}/Out
349  R_OUT_EXE=${R_SAVE}/Exe
350
351  #====================================================
352  #R_BUF_KSH : Buffer place for job output
353  #R_BUF_EXE : Buffer place for binary used during simulation
354  R_BUF_KSH=${R_BUFR}/Out
355  R_BUF_EXE=${R_BUFR}/Exe
356
357  IGCM_debug_PopStack "IGCM_config_Initialize"
358}
359
360#===================================
361function IGCM_config_DaysInPeriodLength
362{
363  IGCM_debug_PushStack "IGCM_config_DaysInPeriodLength"
364
365  typeset i
366
367  # Determine number of day(s) in PeriodLength :
368  case ${config_UserChoices_PeriodLength} in
369  *Y|*y)
370    PeriodLengthInYears=$( echo ${config_UserChoices_PeriodLength} | sed -e 's/[yY]//' )
371    echo
372    IGCM_debug_Print 2 "Number of years for PeriodLength : ${PeriodLengthInYears}"
373    PeriodLengthInDays=0
374    i=0
375    until [ $i -ge $PeriodLengthInYears ] ; do
376      (( PeriodLengthInDays = PeriodLengthInDays + $( IGCM_date_DaysInYear $(( year + i )) ) ))
377      (( i=i+1 ))
378    done
379    ;;
380  *M|*m)
381    PeriodLengthInMonths=$( echo ${config_UserChoices_PeriodLength} | sed -e 's/[mM]//' )
382    echo
383    IGCM_debug_Print 2 "Number of months for PeriodLength : ${PeriodLengthInMonths}"
384    PeriodLengthInDays=0
385    i=0
386    until [ $i -ge $PeriodLengthInMonths ] ; do
387      if [ $(( 10#${month} + ${i} )) -lt 13 ] ; then
388        (( PeriodLengthInDays  = PeriodLengthInDays + $( IGCM_date_DaysInMonth $year $(( 10#${month} + ${i} )) ) ))
389      else
390        (( PeriodLengthInDays  = PeriodLengthInDays + $( IGCM_date_DaysInMonth $year $(( 10#${month} + ${i} - 12 )) ) ))
391      fi
392      (( i=i+1 ))
393    done
394    ;;
395  *D|*d)
396    PeriodLengthInMonths=0
397    PeriodLengthInDays=$( echo ${config_UserChoices_PeriodLength} | sed -e 's/[dD]//' )
398    echo
399    IGCM_debug_Print 2 "Number of days for PeriodLength : ${PeriodLengthInDays}";;
400  *)
401    IGCM_debug_Exit "IGCM_config_DaysInPeriodLength " ${config_UserChoices_PeriodLength} " invalid period length : choose in *Y, *M, *D."
402    IGCM_debug_Verif_Exit ;;
403  esac
404
405  IGCM_debug_PopStack "IGCM_config_DaysInPeriodLength"
406}
407
408#===================================
409function IGCM_config_DateCoherency
410{
411  IGCM_debug_PushStack "IGCM_config_DateCoherency"
412
413  echo
414  IGCM_debug_Print 1 "IGCM_config_DateCoherency"
415  echo
416
417  typeset Length VerifiedPeriodDateBegin VerifiedPeriodDateEnd
418
419  # check coherency between (PeriodDateBegin, PeriodDateEnd) and (DateBegin, CumulPeriod, PeriodLength)
420  # DateBegin + CumulPeriod*PeriodLength = PeriodDateBegin
421  echo
422 
423  case ${config_UserChoices_PeriodLength} in
424  *Y|*y)
425    Length=$( IGCM_date_DaysInCurrentPeriod ${DateBegin} $(( ${CumulPeriod} * ${PeriodLengthInYears} ))Y )
426    ;;
427  *M|*m)
428    Length=$( IGCM_date_DaysInCurrentPeriod ${DateBegin} $(( ${CumulPeriod} * ${PeriodLengthInMonths} ))M )
429    ;;
430  *D|*d)
431    Length=$( IGCM_date_DaysInCurrentPeriod ${DateBegin} $(( ${CumulPeriod} * ${PeriodLengthInDays} ))D )
432    ;;
433  esac
434  VerifiedPeriodDateEnd=$( IGCM_date_AddDaysToGregorianDate ${DateBegin} ${Length}-1 )
435
436  if [ ${VerifiedPeriodDateEnd} != ${PeriodDateEnd} ] ; then
437    IGCM_debug_Print 1 "From run.card PeriodDateEnd is not consistent with DateBegin and CumulPeriod."
438    IGCM_debug_Print 1 "We have DateBegin = ${DateBegin}"
439    IGCM_debug_Print 1 "We have CumulPeriod = ${CumulPeriod}"
440    IGCM_debug_Print 1 "We have PeriodDateEnd = ${PeriodDateEnd}"
441    IGCM_debug_Print 1 "We have VerifiedPeriodDateEnd = ${VerifiedPeriodDateEnd}"
442    IGCM_debug_Print 1 "You must have change run.card in an inconsistent way."
443
444    IGCM_debug_Exit "STOP here to avoid further issues."
445  fi
446
447  # PeriodDateBegin + PeriodLength = PeriodDateEnd
448  VerifiedPeriodDateBegin=$( IGCM_date_AddDaysToGregorianDate ${VerifiedPeriodDateEnd} $(( ${PeriodLengthInDays} * -1 )) )
449
450  IGCM_debug_PopStack "IGCM_config_DateCoherency"
451}
452
453
454#===================================
455function IGCM_config_Check
456{
457  IGCM_debug_PushStack "IGCM_config_Check"
458
459  # If one of the following modulo is not zero :
460  # we will issue an error then explain and exit in
461  # AA_job IGCM_debug_Verif_Exit call before binary submission
462
463  echo
464  IGCM_debug_Print 1 "IGCM_config_Check"
465  echo
466
467  typeset i
468
469  # Check RebuildFrequency against key frequencies : PeriodLength ; PackFrequency ; TimeSeriesFrequency ; SeasonalFrequency
470  if ( [ ! X${config_Post_RebuildFrequency} = X${NULL_STR} ] && [ ! X${config_Post_RebuildFrequency} = XNONE ] ) ; then
471    AsynchronousRebuild=true
472    IGCM_debug_Print 1 "Asynchronous rebuild has been activated."
473    echo
474    # modulo (RebuildFrequency and PeriodLength/TimeSeriesFrequency/SeasonalFrequency) must be zero
475    IGCM_debug_Print 1 "Check coherence between RebuildFrequency and PeriodLength"
476    IGCM_post_CheckModuloFrequency config_Post_RebuildFrequency config_UserChoices_PeriodLength
477    IGCM_debug_Print 1 "Check coherence between PackFrequency and RebuildFrequency"
478    IGCM_post_CheckModuloFrequency config_Post_PackFrequency config_Post_RebuildFrequency
479    IGCM_debug_Print 1 "Check coherence between TimeSeriesFrequency and RebuildFrequency"
480    IGCM_post_CheckModuloFrequency config_Post_TimeSeriesFrequency config_Post_RebuildFrequency
481    IGCM_debug_Print 1 "Check coherence between SeasonalFrequency and RebuildFrequency"
482    IGCM_post_CheckModuloFrequency config_Post_SeasonalFrequency config_Post_RebuildFrequency
483  else
484    AsynchronousRebuild=false
485    IGCM_debug_Print 1 "Asynchronous rebuild has not been activated"
486    IGCM_debug_Print 1 "Proceed with standard post-treatment pathway"
487    echo
488    #modulo (PeriodLength and TimeSeriesFrequency/SeasonalFrequency) must be zero
489    IGCM_debug_Print 1 "Check coherence between TimeSeriesFrequency and PeriodLength"
490    IGCM_post_CheckModuloFrequency config_Post_TimeSeriesFrequency config_UserChoices_PeriodLength
491    IGCM_debug_Print 1 "Check coherence between SeasonalFrequency and PeriodLength"
492    IGCM_post_CheckModuloFrequency config_Post_SeasonalFrequency   config_UserChoices_PeriodLength
493  fi
494
495  # Check PackFrequency against other key frequencies
496  # Modulo (PackFrequency and TimeSeriesFrequency/SeasonalFrequency and PeriodLenght) must be zero
497  if ( [ ! X${config_Post_PackFrequency} = X${NULL_STR} ] && [ ! X${config_Post_PackFrequency} = XNONE ] ) ; then
498    Pack=true
499    #
500    IGCM_debug_Print 1 "Check coherence between PackFrequency and PeriodLength"
501    IGCM_post_CheckModuloFrequency config_Post_PackFrequency config_UserChoices_PeriodLength
502    IGCM_debug_Print 1 "Check coherence between TimeSeriesFrequency and PackFrequency"
503    IGCM_post_CheckModuloFrequency config_Post_TimeSeriesFrequency config_Post_PackFrequency
504    IGCM_debug_Print 1 "Check coherence between SeasonalFrequency and PackFrequency"
505    IGCM_post_CheckModuloFrequency config_Post_SeasonalFrequency config_Post_PackFrequency
506  else
507    Pack=false
508  fi
509
510  # modulo (TimeSeriesFrequency and all Chunck2D) must be zero
511  NbJob=${#CHUNCK2D_SIZE[@]}
512  i=0
513  until [ $i -ge $NbJob ]; do
514    value=${CHUNCK2D_SIZE[${i}]}
515    IGCM_debug_Print 1 "Check coherence between All Chunck2D frequency and TimeSeriesFrequency"
516    IGCM_post_CheckModuloFrequency value config_Post_TimeSeriesFrequency
517    case ${value} in
518    *Y|*y) ;;
519    *)
520      IGCM_debug_Print 1 "All ChunckJob2D frequency must be expressed in year *Y|*y in comp.card"
521      IGCM_debug_Exit "This will stop the job" ;;
522    esac
523    (( i=i+1 ))
524  done
525
526  # modulo (TimeSeriesFrequency and all Chunck3D) must be zero
527  NbJob=${#CHUNCK3D_SIZE[@]}
528  i=0
529  until [ $i -ge $NbJob ]; do
530    value=${CHUNCK3D_SIZE[${i}]}
531    IGCM_debug_Print 1 "Check coherence between All Chunck3D frequency and TimeSeriesFrequency"
532    IGCM_post_CheckModuloFrequency value config_Post_TimeSeriesFrequency
533    case ${value} in
534    *Y|*y) ;;
535    *)
536      IGCM_debug_Print 1 "All ChunckJob3D frequency must be expressed in year *Y|*y in comp.card"
537      IGCM_debug_Exit "This will stop the job" ;;
538    esac
539    (( i=i+1 ))
540  done
541
542  # check to be sure there is enough space on temporary filesystems to run
543  echo
544  IGCM_debug_Print 1 "Check if there is enough space on temporary filesystem"
545  IGCM_sys_check_quota
546
547  IGCM_debug_PopStack "IGCM_config_Check"
548}
549
550#===================================
551function IGCM_config_PeriodStart
552{
553  IGCM_debug_PushStack "IGCM_config_PeriodStart"
554
555  echo
556  IGCM_debug_Print 1 "IGCM_config_PeriodStart"
557  echo
558
559  if ( ${FirstInitialize} ) ; then
560    #================================================#
561    #         Initialize date/period information     #
562    #================================================#
563
564    IGCM_date_GetYearMonthDay ${DateBegin} year month day
565    IGCM_config_DaysInPeriodLength
566
567    eval PeriodDateBegin=${DateBegin} > /dev/null 2>&1
568    PeriodDateEnd=$( IGCM_date_AddDaysToGregorianDate ${DateBegin} $(( ${PeriodLengthInDays} - 1 )) )
569    eval CumulPeriod=1 > /dev/null 2>&1
570
571    #=================================================#
572    #              Write updated run.card             #
573    #=================================================#
574
575    #Correct run.card Configuration for this period
576    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin ${PeriodDateBegin}
577    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd ${PeriodDateEnd}
578    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod ${CumulPeriod}
579    if [ X$( grep "SubmitPath" ${SUBMIT_DIR}/run.card ) != X ] ; then
580      IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration SubmitPath ${SUBMIT_DIR}
581    fi
582
583    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Running"
584
585  else
586    #================================================#
587    #         The file run.card allready exist       #
588    #================================================#
589
590    #Test state of run in run.card
591    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodState
592    if ( [ ${run_Configuration_PeriodState} != "Running" ] && [ ${run_Configuration_PeriodState} != "OnQueue" ] && [ ${run_Configuration_PeriodState} != "Continue" ] ) ; then
593      echo
594      IGCM_debug_Print 1 "!! Error in run.card with PeriodState : " ${run_Configuration_PeriodState} "!!"
595      IGCM_debug_Print 1 "Try running ${libIGCM}/clean_month.job to fix this"
596      echo
597      IGCM_debug_Exit
598      IGCM_debug_Verif_Exit
599    fi
600
601    #===================================#
602    #        Read updated run.card      #
603    #===================================#
604
605    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration OldPrefix
606    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin
607    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd
608    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod
609
610    PeriodDateBegin=$( IGCM_date_ConvertFormatToGregorian ${run_Configuration_PeriodDateBegin} )
611    PeriodDateEnd=$( IGCM_date_ConvertFormatToGregorian ${run_Configuration_PeriodDateEnd} )
612    eval CumulPeriod="${run_Configuration_CumulPeriod}" > /dev/null 2>&1
613
614    LastPeriodDateEnd=$( echo ${run_Configuration_OldPrefix} | sed -e "s/${config_UserChoices_JobName}_//" )
615
616    if [ ${Period} = 1 ]; then
617      # save last Job output
618      typeset LastPeriod iLastPeriod Last_Script_Output_Name
619      (( LastPeriod=CumulPeriod-PeriodNb ))
620      iLastPeriod=$( printf "%06d" ${LastPeriod} )
621      Last_Script_Output_Name="${Script_Output_Prefix}_${config_UserChoices_JobName}.${iLastPeriod}"
622      Last_run_card="run.card.${iLastPeriod}"
623      #eval ls -l ${SUBMIT_DIR}/${Last_Script_Output_Name}
624      #eval IGCM_sys_Put_Out ${SUBMIT_DIR}/${Last_Script_Output_Name} ${R_BUF_KSH}/${Last_Script_Output_Name} > /dev/null 2>&1
625      IGCM_debug_Print 2 "Try to save previous ksh job output"
626      IGCM_sys_Cd ${SUBMIT_DIR}/
627      if [ X${Pack} = Xtrue ] ; then
628        IGCM_sys_PutBuffer_Out ${Last_Script_Output_Name} ${R_BUF_KSH}/${Last_Script_Output_Name}.$$ rw
629      else
630        IGCM_sys_Put_Out ${Last_Script_Output_Name} ${R_OUT_KSH}/${Last_Script_Output_Name}.$$ rw
631      fi
632
633      IGCM_card_CheckConflict run.card
634      if [ X${Pack} = Xtrue ] ; then
635        IGCM_sys_PutBuffer_Out ${SUBMIT_DIR}/run.card ${R_BUF_KSH}/${Last_run_card}.$$ rw
636      else
637        IGCM_sys_Put_Out ${SUBMIT_DIR}/run.card ${R_OUT_KSH}/${Last_run_card}.$$ rw
638      fi
639      IGCM_sys_Cd ${RUN_DIR}
640    else
641      unset FileToBeDeleted
642    fi
643
644    # Determine number of day(s) in PeriodLength
645    IGCM_date_GetYearMonthDay $PeriodDateBegin year month day
646    IGCM_config_DaysInPeriodLength
647
648    # Check coherency between (PeriodDateBegin, PeriodDateEnd) and (DateBegin, CumulPeriod, PeriodLength)
649    IGCM_config_DateCoherency
650    # And EXIT if not OK
651    IGCM_debug_Verif_Exit
652
653    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Running"
654  fi
655
656  # Save for futur use
657  OldPrefix=${config_UserChoices_JobName}_${PeriodDateEnd}
658
659  # BEGIN: SHOULD GO IN A FUNCTION FROM libIGCM_date.ksh
660  # Compute year_m1 and year_p1 (year minus 1Y and year plus 1Y)
661  year_m1=$(( year - 1 ))
662  year_p1=$(( year + 1 ))
663  # Compute month_m1 (month minus 1M)
664  # Compute yyyymm_m1 (yyyymm minus 1M)
665  month_m1=$(( 10#${month} - 1 ))
666  if [ ${month_m1} = 0 ]; then
667    month_m1=12
668    yyyymm_m1=${year_m1}12
669  elif [ ${month_m1} -le 9 ]; then
670    month_m1=0${month_m1}
671    yyyymm_m1=${year}${month_m1}
672  else
673    yyyymm_m1=${year}${month_m1}
674  fi
675  # Compute month_p1 (month plus 1M)
676  # Compute yyyymm_p1 (yyyymm plus 1M)
677  month_p1=$(( 10#${month} + 1 ))
678  if [ ${month_p1} = 13 ]; then
679    month_p1=01
680    yyyymm_p1=${year_p1}01
681  elif [ ${month_p1} -le 9 ]; then
682    month_p1=0${month_p1}
683    yyyymm_p1=${year}${month_p1}
684  else
685    yyyymm_p1=${year}${month_p1}
686  fi
687  #IGCM_debug_Print 1 "jg 1 month_m1 = ${month_m1} month_p1 = ${month_p1} "
688  #IGCM_debug_Print 1 "jg 1 calculate yyyymm_m1 = ${yyyymm_m1} "
689  #IGCM_debug_Print 1 "jg 1 calculate yyyymm_p1 = ${yyyymm_p1} "
690
691  #===================================================================#
692  # Calculate CyclicYear to be used for looping over a given forcing  #
693  # period. Add CyclicBegin and CyclicEnd in config.card UserChoices. #
694  #===================================================================#
695
696  # To use the variable CyclicYear, one must add in config.card CyclicBegin and CyclicEnd.
697  # CyclicBegin is the first year in the cycle. CyclicEnd is the last year included in the cycle.
698  if ( [ ! X${config_UserChoices_CyclicBegin} = X ] && [ ! X${config_UserChoices_CyclicEnd} = X ] ) ; then
699    CycleNb=$(( ${config_UserChoices_CyclicEnd} - ${config_UserChoices_CyclicBegin} + 1 ))
700    CyclicYear_p1=NOTDEFINED
701
702    # For current year
703    yeartmp=$year
704    diffy=$(( $yeartmp - ${config_UserChoices_CyclicBegin} ))
705    while [ $diffy -lt 0 ] ; do
706      yeartmp=$(( ${yeartmp} + ${CycleNb} ))
707      diffy=$(( $yeartmp - ${config_UserChoices_CyclicBegin} ))
708    done
709    CyclicYear=$(( ( ${diffy} % ${CycleNb} ) + ${config_UserChoices_CyclicBegin} ))
710
711    # For next coming year
712    yeartmp=$(( $year + 1 ))
713    diffy=$(( $yeartmp - ${config_UserChoices_CyclicBegin} ))
714    while [ $diffy -lt 0 ] ; do
715      yeartmp=$(( ${yeartmp} + ${CycleNb} ))
716      diffy=$(( $yeartmp - ${config_UserChoices_CyclicBegin} ))
717    done
718    CyclicYear_p1=$(( ( ${diffy} % ${CycleNb} ) + ${config_UserChoices_CyclicBegin} ))
719
720    IGCM_debug_Print 1 "CyclicYear   = ${CyclicYear}, CyclicYear_p1 = ${CyclicYear_p1}, current year=$year"
721  else
722    CyclicYear="ERROR_CyclicYear_Variable_Not_Defined"
723    CyclicYear_p1="ERROR_CyclicYear_p1_Variable_Not_Defined"
724    IGCM_debug_Print 1 "CyclicYear wont be use without adding CyclicBegin and CyclicEnd in config.card"
725  fi
726
727  # END: SHOULD GO IN A FUNCTION FROM libIGCM_date.ksh
728
729  #===================================================================#
730  # Prepare variables available for ${COMP}.card and ${COMP}.driver   #
731  #             But available to any son functions                    #
732  #===================================================================#
733
734  # Period Length In Days between DateBegin and DateCurrent (at end of period == PeriodDateEnd !)
735  (( SimulationLengthInDays = $( IGCM_date_DaysBetweenGregorianDate ${PeriodDateEnd} ${DateBegin} ) + 1 ))
736
737  # Debug Print :
738  echo
739  IGCM_debug_Print 1 "IGCM_config_PeriodStart : Before Execution"
740  IGCM_debug_Print 1 "Year of simulation      : ${year}"
741  IGCM_debug_Print 1 "Month of simulation     : ${month}"
742  IGCM_debug_Print 1 "PeriodLengthInDays      : ${PeriodLengthInDays}"
743  IGCM_debug_Print 1 "PeriodDateBegin         : ${PeriodDateBegin}"
744  IGCM_debug_Print 1 "PeriodDateEnd           : ${PeriodDateEnd}"
745  IGCM_debug_Print 1 "SimulationLengthInDays  : ${SimulationLengthInDays}"
746  IGCM_debug_Print 1 "ExperienceLengthInDays  : ${ExperienceLengthInDays}"
747
748  #================================================================#
749  #         Prepare variables available for comp_finalyze          #
750  #================================================================#
751
752  # Period for save files
753  eval DatesPeriod=${PeriodDateBegin}_${PeriodDateEnd} > /dev/null 2>&1
754
755  # Prefix for save files of this period
756  eval PREFIX=${config_UserChoices_JobName}_${DatesPeriod}  > /dev/null 2>&1
757
758  # List of files that will be deleted in RUN_DIR after run
759  [ -f stack ] && FileToBeDeleted[0]="stack"
760
761  # Test if the same run as already been saved :
762  if [ X${JobType} = XRUN ] ; then
763    if [ ${DRYRUN} -le 0 ] ; then
764      if ( IGCM_sys_TestFileBuffer ${R_BUF_KSH}/${PREFIX}_${Exe_Output} ) ; then
765        IGCM_debug_Exit "IGCM_config_PeriodStart" "You are currently RErunning an old job."
766        IGCM_debug_Print 1 "Because of readonly permissions, you can't RErun a job when saved files"
767        IGCM_debug_Print 1 " are still in the ARCHIVE directory. You must deleted those files, or "
768        IGCM_debug_Print 1 " the whole ${R_SAVE} tree. See clean_month.job in ${libIGCM} directory."
769        IGCM_debug_Print 1 " This exit has been initiated because at least ${R_BUF_KSH}/${PREFIX}_${Exe_Output} exists."
770        IGCM_debug_Verif_Exit
771      fi
772    fi
773  else
774    if ( IGCM_sys_TestFileBuffer ${R_BUF_KSH}/${PREFIX}_${Exe_Output} ) ; then
775      IGCM_debug_Print 1 "IGCM_config_PeriodStart" "RErun an old job. Allowed in DEBUG or DEV mode."
776    fi
777  fi
778
779  typeset ExeNameIn ExeNameFirst CompNameFirst
780  typeset comp i
781  typeset tempvar tempvarMPI tempvarNOD NbElts j NbExec
782
783  (( PROCESSUS_NUMBER = 0 ))
784  (( i=0 ))
785  (( NbExec=0 ))
786
787  OK_PARA_MPI=false
788  OK_PARA_OMP=false
789  OK_PARA_NOD=false
790  OK_PARA_MPMD=false
791
792  for comp in ${config_ListOfComponents[*]} ; do
793
794    IGCM_debug_Print 1 ${comp}
795
796    eval ExeNameIn=\${config_Executable_${comp}[0]}
797
798    # NO order in config.card for parallelized values !
799    # just use suffix : MPI , OMP and NOD (for number of NODes.)
800
801    # NOD is the number of NODes allocated
802    eval ${comp}_PROC_NOD=0
803
804    # MPI is the number of MPI processus per nodes
805    eval ${comp}_PROC_MPI=0
806
807    # OMP is the number of OpenMP threads per MPI processus
808    eval ${comp}_PROC_OMP=0
809
810    # Only if we really have an executable for the component :
811###    if [ X${ExeNameIn} != X\"\" ] ; then
812    if ( [ "X${ExeNameIn}" != X\"\" ] && [ "X${ExeNameIn}" != "Xinca.dat" ] ) ; then
813
814      # Keep the first executable found and the first CompName
815      ExeNameFirst=${ExeNameIn}
816      CompNameFirst=${comp}
817
818      # Are we a second executable?
819      (( NbExec = NbExec + 1 ))
820
821      # set 1 MPI task, 1 OpenMP thread and 1 node as default
822      eval ${comp}_PROC_MPI=1
823      eval ${comp}_PROC_OMP=1
824      eval ${comp}_PROC_NOD=1
825
826      eval NbElts=\${#config_Executable_${comp}[@]}
827
828      if [ ${NbElts} -ge 2 ] ; then
829        (( j = 2 ))
830
831        while [ $j -lt ${NbElts} ] ; do
832          eval tempvar=\${config_Executable_${comp}[${j}]}
833
834          if [ X${tempvar} = X ] ; then
835            echo "Error reading MPI/OMP parameters !!!"
836            echo "Check your config.card."
837            exit 1
838          fi
839
840          eval IGCM_debug_Print 2 ${tempvar}
841
842          case ${tempvar} in
843          *[mM][pP][iI]*)
844               # Read MPI parameter for composante
845            eval ${comp}_PROC_MPI=$( echo ${tempvar} | tr '[a-z]' '[A-Z]' | sed -e "s/MPI//" )
846            OK_PARA_MPI=true;;
847          *[oO][mM][pP]*)
848               # Read OMP parameter for composante
849            eval ${comp}_PROC_OMP=$( echo ${tempvar} | tr '[a-z]' '[A-Z]' | sed -e "s/OMP//" )
850            OK_PARA_OMP=true;;
851          *[nN][oO][dD]*)
852               # Read NOD (NumBer of Nodes) parameter for composante
853            eval ${comp}_PROC_NOD=$( echo ${tempvar} | tr '[a-z]' '[A-Z]' | sed -e "s/NOD//" )
854            OK_PARA_NOD=true
855            OK_PARA_MPI=true;;
856          esac
857
858          (( j = j + 1 ))
859        done
860
861      fi
862
863      eval tempvarMPI=\${${comp}_PROC_MPI}
864      eval tempvarNOD=\${${comp}_PROC_NOD}
865      eval tempvarOMP=\${${comp}_PROC_OMP}
866
867      (( PROCESSUS_NUMBER = PROCESSUS_NUMBER + tempvarMPI * tempvarNOD * tempvarOMP ))
868
869    fi
870
871    (( i=i+1 ))
872  done
873
874  # set MPMD mode if more than 2 executable names.
875  [ ${NbExec} -ge 2 ] && OK_PARA_MPMD=true
876
877  # Verification of BATCH_NUM_PROC_TOT total number of processors set in job header.
878  if [ X${BATCH_NUM_PROC_TOT} != X ] ; then
879    # BATCH_NUM_PROC_TOT is set
880    if ( ${OK_PARA_MPI} ) ; then
881      IGCM_debug_Print 1 "MPI/OMP/NOD found into config.card and BATCH_NUM_PROC_TOT = ${BATCH_NUM_PROC_TOT} "
882    else
883      # with previous method.
884      if [ ${BATCH_NUM_PROC_TOT} -gt 1 ] ; then
885        # with more than 1 proc
886        if ( ${OK_PARA_MPMD} ) ; then
887          # with MPMD ie CPL/oasis method
888          echo "We will use default number of MPI tasks for this machine : "
889          echo "${DEFAULT_NUM_PROC_OCE} for OCE; "
890          echo "${DEFAULT_NUM_PROC_CPL} for CPL; "
891          echo "${DEFAULT_NUM_PROC_ATM} for ATM; "
892          echo "${DEFAULT_NUM_PROC_TOTAL} for the total number of processors; "
893          OK_PARA_MPI=true
894          CPL_PROC_MPI=${DEFAULT_NUM_PROC_CPL}
895          OCE_PROC_MPI=${DEFAULT_NUM_PROC_OCE}
896          ATM_PROC_MPI=${DEFAULT_NUM_PROC_ATM}
897          PROCESSUS_NUMBER=${DEFAULT_NUM_PROC_TOTAL}
898        else
899          # with have only one executable
900          echo "We will use ${BATCH_NUM_PROC_TOT} MPI tasks for ${CompNameFirst} : ${ExeNameFirst} "
901          OK_PARA_MPI=true
902          eval ${CompNameFirst}_PROC_MPI=${BATCH_NUM_PROC_TOT}
903          PROCESSUS_NUMBER=${BATCH_NUM_PROC_TOT}
904        fi
905      else
906        PROCESSUS_NUMBER=1
907      fi
908    fi
909    # Verification with PBS parameter
910    if [ ${BATCH_NUM_PROC_TOT} -ne ${PROCESSUS_NUMBER} ] ; then
911      echo "Warning with parallelization parameters !"
912      echo "Job header variable BATCH_NUM_PROC_TOT = ${BATCH_NUM_PROC_TOT} "
913      echo "is the total number of _processors_ reserved."
914      echo "It is not equal to the sum of _processus_  = ${PROCESSUS_NUMBER}."
915      echo "We stop now."
916      exit 1
917    fi
918    NUM_PROC_CPL=${CPL_PROC_MPI} # for backward compatibility
919    NUM_PROC_OCE=${OCE_PROC_MPI} # for backward compatibility
920    NUM_PROC_ATM=${ATM_PROC_MPI} # for backward compatibility
921  else # BATCH_NUM_PROC_TOT=""
922    if ( ${OK_PARA_MPI} ) ; then
923      echo "You have not given a value of ${BATCH_NUM_PROC_TOT} processors,"
924      echo "but you have filled the parallel parameter in config->Executable->list."
925      echo "Please add BATCH_NUM_PROC_TOT variable in job header."
926      echo "We stop now."
927      exit 1
928    else
929      # sequential case !
930      if [ ${PROCESSUS_NUMBER} -eq 0 ] ; then
931        (( PROCESSUS_NUMBER = 1 ))
932        echo "PROCESSUS_NUMBER is all 0 (sequential use of old definition in config->Executable->list)."
933        echo "We set it to 1."
934      fi
935    fi
936  fi
937
938  IGCM_debug_Print 1 "MPI/OMP treatment PROCESSUS_NUMBER = ${PROCESSUS_NUMBER}"
939
940  IGCM_sys_build_execution_scripts
941
942  ExecutionFail=false
943
944  IGCM_debug_PopStack "IGCM_config_PeriodStart"
945}
946
947#===================================
948function IGCM_config_SaveSourceModifications
949{
950  IGCM_debug_PushStack "IGCM_config_SaveSourceModifications"
951
952  typeset ExeOutDateMax listVarEnv
953  ExeOutDateMax=$1
954
955  listVarEnv="ExeOutDateMax,R_OUT_EXE,PREFIX,SUBMIT_DIR"
956  IGCM_sys_RshMaster "\
957    . ${libIGCM}/libIGCM_sys/libIGCM_sys.ksh; \
958    export ExeOutDateMax=${ExeOutDateMax};\
959    export R_OUT_EXE=${R_OUT_EXE};\
960    export PREFIX=${PREFIX};\
961    export SUBMIT_DIR=${SUBMIT_DIR};\
962    export listVarEnv=${listVarEnv};\
963    Script_Output=out_SaveSourceModifications;\
964    IGCM_sys_Qsub ${libIGCM}/SaveSourceModifications.job ${ExeOutDateMax} ${R_OUT_EXE} ${PREFIX} ${SUBMIT_DIR}"
965
966  IGCM_debug_PopStack "IGCM_config_SaveSourceModifications"
967}
968
969#===================================
970function IGCM_config_PeriodEnd
971{
972  IGCM_debug_PushStack "IGCM_config_PeriodEnd"
973
974  echo
975  IGCM_debug_Print 1 "IGCM_config_PeriodEnd"
976  echo
977
978  #==================================#
979  #         Save Job output          #
980  #==================================#
981  if [ X${Pack} = Xtrue ] ; then
982    IGCM_sys_PutBuffer_Out ${Exe_Output} ${R_BUF_KSH}/${PREFIX}_${Exe_Output}
983  else
984    IGCM_sys_Put_Out ${Exe_Output} ${R_OUT_KSH}/${PREFIX}_${Exe_Output}
985  fi
986  eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${Exe_Output}"
987
988  IGCM_card_CheckConflict run.card
989  if [ X${Pack} = Xtrue ] ; then
990    IGCM_sys_PutBuffer_Out ${SUBMIT_DIR}/run.card ${R_BUF_KSH}/run.card rw
991  else
992    IGCM_sys_Put_Out ${SUBMIT_DIR}/run.card ${R_OUT_KSH}/run.card rw
993  fi
994
995  if [ ${DRYRUN} -le 1 ] ; then
996
997    IGCM_debug_Print 1 "Check components binary : size and creation date"
998
999    typeset LS_comp LS_bin ExeDate ExeCpuLog NextExeSize LastCompExeSize
1000    typeset comp i
1001    typeset ExeNameIn ExeNameOut UpdateExe ExeSecDateMax
1002
1003    #==================================#
1004    #        Get last Exe Size         #
1005    #==================================#
1006
1007    (( i=0 ))
1008    if ( ${FirstInitialize} ) ; then
1009      run_Log_LastExeSize=""
1010      for comp in ${config_ListOfComponents[*]} ; do
1011        run_Log_LastExeSize[$i]=0
1012        (( i=i+1 ))
1013      done
1014    else
1015      IGCM_card_DefineArrayFromOption ${SUBMIT_DIR}/run.card Log LastExeSize
1016    fi
1017    #==================================#
1018    #         And Build ExeDate        #
1019    #==================================#
1020
1021    # 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
1022    # 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")
1023    # 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
1024    ExeDate=""
1025    NextExeSize="( "
1026    (( i=0 ))
1027    UpdateExe=false
1028    (( ExeSecDateMax = 0 ))
1029    for comp in ${config_ListOfComponents[*]} ; do
1030
1031      IGCM_debug_Print 3 ${comp}
1032
1033      eval ExeNameIn=\${config_Executable_${comp}[0]}
1034      eval ExeNameOut=\${config_Executable_${comp}[1]}
1035      # Only if we really have an executable for the component :
1036      if [ X${ExeNameIn} = X\"\" ] ; then
1037        # If there is no exe file for this component
1038        (( ExeSize=0 ))
1039      else
1040        eval LS_bin=${R_EXE}/${ExeNameIn}
1041        IGCM_sys_FileSize ${LS_bin} ExeSize
1042
1043        set +A LS_comp -- $( LC_TIME=en_US ls -l ${LS_bin} )
1044        if [ X${ExeDate} = X ] ; then
1045          # First component exe date
1046          ExeDate=${comp}_${LS_comp[5]}_${LS_comp[6]}
1047        else
1048          ExeDate=${ExeDate}-${comp}_${LS_comp[5]}_${LS_comp[6]}
1049        fi
1050        ExeDate=${ExeDate}_${LS_comp[7]}
1051      fi
1052
1053      if [ ${i} -eq 0 ] ; then
1054        # First component
1055        NextExeSize="( "${ExeSize}
1056      else
1057        NextExeSize=${NextExeSize}", "${ExeSize}
1058      fi
1059      eval LastCompExeSize=${run_Log_LastExeSize[$i]}
1060      (( i=i+1 ))
1061
1062      if [ ${ExeSize} -ne ${LastCompExeSize} ] ; then
1063        if ( ${FirstInitialize} ) ; then
1064          IGCM_debug_Print 1 "Save first ${ExeNameIn} in ${R_OUT_EXE} !"
1065        else
1066          IGCM_debug_Print 1 "${ExeNameIn} has changed in ${R_EXE} !"
1067          IGCM_debug_Print 1 "Save latest ${ExeNameIn} in ${R_OUT_EXE} !"
1068          eval FileToBeDeleted[${#FileToBeDeleted[@]}]=${ExeNameOut}
1069        fi
1070        eval IGCM_sys_Put_Out ${ExeNameOut} ${R_OUT_EXE}/${PREFIX}_${ExeNameIn} rw
1071        UpdateExe=true
1072
1073        # SD : switch off for now
1074        #IGCM_sys_GetDate_FichWork ${LS_bin} ExeSecDate
1075        #if [ $ExeSecDateMax -lt $ExeSecDate ] ; then
1076        #  ExeSecDateMax=$ExeSecDate
1077        #fi
1078      fi
1079    done
1080
1081    # SD : switch off for now
1082    #if ( ${UpdateExe} ) ; then
1083    #  echo "Launch SaveSourceModifications."
1084    #  IGCM_config_SaveSourceModifications ${ExeSecDateMax}
1085    #fi
1086
1087    NextExeSize=${NextExeSize}" )"
1088    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Log LastExeSize "${NextExeSize}"
1089
1090    if [ ${DRYRUN} -le 1 ] ; then
1091      tail -1500 ${Exe_Output} > ${Exe_Output}_tail.txt
1092      ExeCpuLog=$( gawk -f ${libIGCM}/libIGCM_sys/IGCM_add_out.awk ${Exe_Output}_tail.txt )
1093      RET=$?
1094      if [ $RET -eq 0 ] ; then
1095        # ExeCpuLog variable contents 5 fields
1096        echo "${CumulPeriod} ${PeriodDateBegin} ${PeriodDateEnd} ${ExeCpuLog} ${ExeDate}" |   \
1097          gawk '{printf("# %11d | %15s | %15s | %19s | %19s | %15.5f | %15.5f | %15.5f | %s\n", \
1098            $1,$2,$3,$4,$5,$6,$7,$8,$9)}' >> ${SUBMIT_DIR}/run.card
1099      fi
1100      eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${Exe_Output}_tail.txt"
1101    fi
1102
1103  fi
1104
1105  # All was right ? no ? then we stop.
1106  IGCM_debug_Verif_Exit
1107
1108  # If all was OK, we can delete all files not necessary for next Job
1109  echo
1110  IGCM_debug_Print 1 "Files that will be deleted before next period-run : "
1111
1112  if [ ${DRYRUN} -le 2 ] ; then
1113    for f in ${FileToBeDeleted[@]} ; do [ -f ${f} ] && ls -la $f ; [ -f ${f} ] && rm -f $f ; done
1114  else
1115    echo ${FileToBeDeleted[@]}
1116  fi
1117
1118  #=================================================#
1119  #         Modification of libIGCM behaviour       #
1120  #=================================================#
1121
1122  # To use this function, one must copy libIGCM.card from ${libIGCM} directory
1123  # and put it in ${SUBMIT_DIR} directory. After modifications of ${SUBMIT_DIR}/libIGCM.card,
1124  # variables define inside [UserChanges] will be modified for next Period of libIGCM main loop.
1125  if [ -f ${SUBMIT_DIR}/libIGCM.card ] ; then
1126    echo
1127    echo "########################################################################"
1128    echo "!!!                 Modification of libIGCM behaviour                !!!"
1129    echo
1130
1131    IGCM_debug_Print 1 "DefineArrayFromOption  : libIGCM_UserChanges in libIGCM.card"
1132    IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/libIGCM.card UserChanges
1133    IGCM_debug_Print 2 "libIGCM_UserChanges" ${libIGCM_UserChanges[*]}
1134
1135    # Special treatments for libIGCM internals
1136    for option in ${libIGCM_UserChanges[*]} ; do
1137      IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/libIGCM.card UserChanges ${option}
1138
1139      echo "We will change : ${option}."
1140      eval echo "Previous value : " \${${option}}
1141      eval echo "Change to : " \${libIGCM_UserChanges_${option}}
1142
1143      eval ${option}=\${libIGCM_UserChanges_${option}}
1144
1145      case ${option} in
1146      config_UserChoices_DateEnd)
1147        IGCM_debug_PrintVariables 1 config_UserChoices_DateEnd
1148        DateEnd=$( IGCM_date_ConvertFormatToGregorian ${config_UserChoices_DateEnd} )
1149
1150        # Period Length In Days between DateBegin and DateEnd
1151        (( ExperienceLengthInDays=$( IGCM_date_DaysBetweenGregorianDate ${DateEnd} ${DateBegin} )  + 1 ))
1152        if [ ${ExperienceLengthInDays} -lt 0 ] ; then
1153          IGCM_debug_Print 1 "Problem with dates in libIGCM.card : ${DateEnd} < ${DateBegin} ! You must check that."
1154          IGCM_debug_Exit "IGCM_PeriodEnd" " Wrong Dates."
1155          IGCM_debug_Verif_Exit
1156        fi
1157        ;;
1158      config_UserChoices_PeriodLength)
1159        IGCM_debug_Print 1  "Change config_UserChoices_PeriodLength=${config_UserChoices_PeriodLength}"
1160        ;;
1161      PeriodNb)
1162        IGCM_debug_Print 1  "Loop in main Job with ${PeriodNb} period(s)"
1163        ;;
1164      config_Post_RebuildFrequency)
1165        IGCM_debug_Print 1  "Change config_Post_RebuildFrequency=${config_Post_RebuildFrequency} : IGCM_post_Configure"
1166        IGCM_post_Configure
1167        ;;
1168      config_Post_TimeSeriesFrequency)
1169        IGCM_debug_Print 1  "Change config_Post_TimeSeriesFrequency = ${config_Post_TimeSeriesFrequency} : IGCM_post_Configure"
1170        IGCM_post_Configure
1171        ;;
1172      config_Post_SeasonalFrequency)
1173        IGCM_debug_Print 1  "Change config_Post_SeasonalFrequency = ${config_Post_SeasonalFrequency} : IGCM_post_Configure"
1174        IGCM_post_Configure
1175        ;;
1176      esac
1177    done
1178
1179    echo
1180    echo "########################################################################"
1181    echo
1182  fi
1183
1184  #=================================================#
1185  #         Determine next computed period          #
1186  #=================================================#
1187
1188  PeriodDateBegin=$( IGCM_date_AddDaysToGregorianDate ${PeriodDateEnd} 1 )
1189  IGCM_date_GetYearMonthDay $PeriodDateBegin year month day
1190  year_m1=$(( year - 1 ))
1191  year_p1=$(( year + 1 ))
1192  IGCM_config_DaysInPeriodLength
1193  PeriodDateEnd=$( IGCM_date_AddDaysToGregorianDate ${PeriodDateBegin} $(( ${PeriodLengthInDays} - 1 )) )
1194
1195  # Debug Print :
1196  echo
1197  IGCM_debug_Print 1 "IGCM_config_PeriodEnd : Preparing Next Execution"
1198  IGCM_debug_Print 1 "PeriodDateBegin       : ${PeriodDateBegin}"
1199  IGCM_debug_Print 1 "PeriodDateEnd         : ${PeriodDateEnd}"
1200  IGCM_debug_Print 1 "PeriodLengthInDays    : ${PeriodLengthInDays}"
1201
1202  PeriodDateBegin=$( IGCM_date_ConvertFormatToHuman ${PeriodDateBegin} )
1203  PeriodDateEnd=$( IGCM_date_ConvertFormatToHuman ${PeriodDateEnd} )
1204
1205  (( CumulPeriod = CumulPeriod + 1 ))
1206
1207  # Debug Print :
1208  echo
1209  IGCM_debug_Print 3 "PeriodDateBegin Human : ${PeriodDateBegin}"
1210  IGCM_debug_Print 3 "PeriodDateEnd Human   : ${PeriodDateEnd}"
1211  IGCM_debug_Print 3 "CumulPeriod           : ${CumulPeriod}"
1212
1213  #=================================================#
1214  #             Write updated run.card              #
1215  #=================================================#
1216
1217  IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration OldPrefix ${OldPrefix}
1218  IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin ${PeriodDateBegin}
1219  IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd ${PeriodDateEnd}
1220  IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod ${CumulPeriod}
1221
1222  if ( ${FirstInitialize} ) ; then
1223    # It's no more the first time
1224    FirstInitialize=false
1225  fi
1226
1227  IGCM_debug_PopStack "IGCM_config_PeriodEnd"
1228}
1229
1230#===================================
1231function IGCM_config_Finalize
1232{
1233  IGCM_debug_PushStack "IGCM_config_Finalize"
1234
1235  echo
1236  IGCM_debug_Print 1 "IGCM_config_Finalize"
1237  echo
1238
1239  if ( $DEBUG_debug ) ; then
1240    # Inform the rabbitMQ queue
1241
1242    # TO BE A FUNCTION BEGIN #
1243
1244    if [ X${ActivateBigBro} = Xtrue ] ; then
1245      # Only cosmetics
1246      decal=0
1247      while [ ${decal} -lt ${IGCM_debug_LenStack} ]; do
1248        printf ' ' >> ${StackFileLocation}/stack
1249        (( decal = decal + 1 ))
1250      done
1251      # RabbitMQ message
1252      code=1100
1253      #
1254      Body=$( echo "{\"code\":\"${code}\",\"simuid\":\"${simuid}\",\"jobid\":\"${jobid}\",\"status\":\"OK\",\"timestamp\":\"$( date +"%Y-%m-%d-%T" )\"}" )
1255      encodedBody=$( echo "${Body}" | base64 -w 0 )
1256      #
1257      #sendAMQPMsg -h localhost -p 5672 -f ${SUBMIT_DIR}/config.card -b ${encodedBody}
1258      echo sendAMQPMsg -h localhost -p 5672 -b "${Body}"      >> ${StackFileLocation}/stack
1259      echo sendAMQPMsg -h localhost -p 5672 -b ${encodedBody} >> /tmp/send.AMQP.${jobid}.history.txt
1260      sendAMQPMsg -h localhost -p 5672 -b ${encodedBody}
1261      status=$?
1262      if [ ${status} -gt 0 ] ; then
1263        IGCM_debug_Print 2 "IGCM_debug_PopStack : command sendAMQPMsg failed error code ${status}"
1264        echo  sendAMQPMsg -h localhost -p 5672 -b "${Body}"
1265        exit
1266      fi
1267    fi
1268
1269    # TO BE A FUNCTION END #
1270
1271  fi
1272
1273  if [ ${SimulationLengthInDays} -ge ${ExperienceLengthInDays} ] ; then
1274    #==========================#
1275    # End of entire simulation #
1276    #==========================#
1277
1278    # Mail notification
1279    IGCM_sys_SendMail
1280
1281    #
1282    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Completed"
1283    IGCM_debug_Print 1 "Normal End of computation."
1284
1285    if ( $DEBUG_debug ) ; then
1286      # Inform the rabbitMQ queue
1287
1288      # TO BE A FUNCTION BEGIN #
1289
1290      if [ X${ActivateBigBro} = Xtrue ] ; then
1291        # Only cosmetics
1292        decal=0
1293        while [ ${decal} -lt ${IGCM_debug_LenStack} ]; do
1294          printf ' ' >> ${StackFileLocation}/stack
1295          (( decal = decal + 1 ))
1296        done
1297        # RabbitMQ message
1298        code=0100
1299        #
1300        Body=$( echo "{\"code\":\"${code}\",\"simuid\":\"${simuid}\",\"jobid\":\"${jobid}\",\"status\":\"OK\",\"timestamp\":\"$( date +"%Y-%m-%d-%T" )\"}" )
1301        encodedBody=$( echo "${Body}" | base64 -w 0 )
1302        #
1303        #sendAMQPMsg -h localhost -p 5672 -f ${SUBMIT_DIR}/config.card -b ${encodedBody}
1304        echo sendAMQPMsg -h localhost -p 5672 -b "${Body}"      >> ${StackFileLocation}/stack
1305        echo sendAMQPMsg -h localhost -p 5672 -b ${encodedBody} >> /tmp/send.AMQP.${jobid}.history.txt
1306        sendAMQPMsg -h localhost -p 5672 -b ${encodedBody}
1307        status=$?
1308        if [ ${status} -gt 0 ] ; then
1309          IGCM_debug_Print 2 "IGCM_debug_PopStack : command sendAMQPMsg failed error code ${status}"
1310          echo  sendAMQPMsg -h localhost -p 5672 -b "${Body}"
1311          exit
1312        fi
1313      fi
1314
1315      # TO BE A FUNCTION END #
1316
1317      echo
1318      IGCM_debug_Print 1 "Your files on ${R_SAVE} :"
1319      IGCM_sys_Tree ${R_SAVE}
1320
1321      IGCM_debug_Print 1 "Your files on ${R_BUFR} :"
1322      IGCM_sys_Tree ${R_BUFR}
1323    fi
1324  else
1325    #=================#
1326    # Submit next job #
1327    #=================#
1328
1329    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "OnQueue"
1330
1331    # Name of next Ksh Script output :
1332    eval Script_Output="${Script_Output_Prefix}_${config_UserChoices_JobName}.$( printf "%06d" ${CumulPeriod} )"
1333
1334    IGCM_debug_Print 1 "Submit next job"
1335    # SUBMIT NEXT JOB from SUBMIT_DIR and come back in RUN_DIR
1336    IGCM_sys_Cd ${SUBMIT_DIR} 
1337    # Keep only the 5 latest ${Script_Output_Prefix}_${config_UserChoices_JobName}
1338    ScriptTot=$( ls ${Script_Output_Prefix}_${config_UserChoices_JobName}.?????? 2>/dev/null | wc -l )
1339    [ ${ScriptTot} -gt 5 ] && rm -f $( ls ${Script_Output_Prefix}_${config_UserChoices_JobName}.?????? | head -$(( ${ScriptTot} - 5 )) )
1340    # Submit next job and come back
1341    IGCM_sys_Qsub ${SUBMIT_DIR}/Job_${config_UserChoices_JobName}
1342    IGCM_sys_Cd -
1343  fi
1344
1345  # Supress Non Deleted Boundary files
1346  #if [ ${DRYRUN} -le 2 ] ; then
1347  #  IGCM_comp_DelFixeBoundaryFiles
1348  #  ls -la
1349  #fi
1350
1351  # Clean ${RUN_DIR}=${RUN_DIR_PATH}/${config_UserChoices_JobName}.${$}
1352  # Only for production run (No clean up in DEV or DEB mode)
1353  # and command sent from .. directory.
1354  IGCM_sys_Cd ..
1355  [ X${JobType} = XRUN ] && IGCM_sys_Rm -rf ${RUN_DIR}
1356
1357  IGCM_debug_PopStack "IGCM_config_Finalize"
1358}
1359
1360#===================================
Note: See TracBrowser for help on using the repository browser.