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

Last change on this file since 933 was 933, checked in by sdipsl, 11 years ago

properly remove RUN_DIR_PATH used by AA_job on curie. see #141
but add some check to be sure RUN_DIR_PATH do not point to important directory.
Indeed within AA_Job you can overwrite RUN_DIR_PATH and define something like this:
RUN_DIR_PATH=$SCRATCHDIR
You don't want to erase your $SCRATCHDIR don't you

  • 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: 51.9 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  # check to be sure that RUN_DIR_PATH, that will be removed is not pointing to an important directory
548  echo
549  IGCM_debug_Print 1 "Check where RUN_DIR_PATH variable is pointing to"
550  IGCM_sys_check_path
551
552
553  IGCM_debug_PopStack "IGCM_config_Check"
554}
555
556#===================================
557function IGCM_config_PeriodStart
558{
559  IGCM_debug_PushStack "IGCM_config_PeriodStart"
560
561  echo
562  IGCM_debug_Print 1 "IGCM_config_PeriodStart"
563  echo
564
565  if ( ${FirstInitialize} ) ; then
566    #================================================#
567    #         Initialize date/period information     #
568    #================================================#
569
570    IGCM_date_GetYearMonthDay ${DateBegin} year month day
571    IGCM_config_DaysInPeriodLength
572
573    eval PeriodDateBegin=${DateBegin} > /dev/null 2>&1
574    PeriodDateEnd=$( IGCM_date_AddDaysToGregorianDate ${DateBegin} $(( ${PeriodLengthInDays} - 1 )) )
575    eval CumulPeriod=1 > /dev/null 2>&1
576
577    #=================================================#
578    #              Write updated run.card             #
579    #=================================================#
580
581    #Correct run.card Configuration for this period
582    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin ${PeriodDateBegin}
583    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd ${PeriodDateEnd}
584    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod ${CumulPeriod}
585    if [ X$( grep "SubmitPath" ${SUBMIT_DIR}/run.card ) != X ] ; then
586      IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration SubmitPath ${SUBMIT_DIR}
587    fi
588
589    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Running"
590
591  else
592    #================================================#
593    #         The file run.card allready exist       #
594    #================================================#
595
596    #Test state of run in run.card
597    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodState
598    if ( [ ${run_Configuration_PeriodState} != "Running" ] && [ ${run_Configuration_PeriodState} != "OnQueue" ] && [ ${run_Configuration_PeriodState} != "Continue" ] ) ; then
599      echo
600      IGCM_debug_Print 1 "!! Error in run.card with PeriodState : " ${run_Configuration_PeriodState} "!!"
601      IGCM_debug_Print 1 "Try running ${libIGCM}/clean_month.job to fix this"
602      echo
603      IGCM_debug_Exit
604      IGCM_debug_Verif_Exit
605    fi
606
607    #===================================#
608    #        Read updated run.card      #
609    #===================================#
610
611    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration OldPrefix
612    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin
613    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd
614    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod
615
616    PeriodDateBegin=$( IGCM_date_ConvertFormatToGregorian ${run_Configuration_PeriodDateBegin} )
617    PeriodDateEnd=$( IGCM_date_ConvertFormatToGregorian ${run_Configuration_PeriodDateEnd} )
618    eval CumulPeriod="${run_Configuration_CumulPeriod}" > /dev/null 2>&1
619
620    LastPeriodDateEnd=$( echo ${run_Configuration_OldPrefix} | sed -e "s/${config_UserChoices_JobName}_//" )
621
622    if [ ${Period} = 1 ]; then
623      # save last Job output and current run.card
624      typeset Potential
625      IGCM_sys_Cd ${SUBMIT_DIR}
626      #
627      IGCM_debug_Print 2 "Save previous ksh job output"
628      for Potential in $( ls ${Script_Output_Prefix}_${config_UserChoices_JobName}.[0-9][0-9][0-9][0-9][0-9][0-9] ) ; do
629        if [ X${Pack} = Xtrue ] ; then
630          ( IGCM_sys_TestFileBuffer  ${R_BUF_KSH}/${Potential} ) || IGCM_sys_PutBuffer_Out ${Potential} ${R_BUF_KSH}/${Potential}.$$ rw
631        else
632          ( IGCM_sys_TestFileArchive ${R_OUT_KSH}/${Potential} ) || IGCM_sys_Put_Out ${Potential} ${R_OUT_KSH}/${Potential}.$$ rw
633        fi
634      done
635      #
636      IGCM_debug_Print 2 "Save current run.card"
637      IGCM_card_CheckConflict run.card
638      if [ X${Pack} = Xtrue ] ; then
639        IGCM_sys_PutBuffer_Out ${SUBMIT_DIR}/run.card ${R_BUF_KSH}/run.card rw
640      else
641        IGCM_sys_Put_Out ${SUBMIT_DIR}/run.card ${R_OUT_KSH}/run.card rw
642      fi
643      #
644      IGCM_sys_Cd ${RUN_DIR}
645    else
646      unset FileToBeDeleted
647    fi
648
649    # Determine number of day(s) in PeriodLength
650    IGCM_date_GetYearMonthDay $PeriodDateBegin year month day
651    IGCM_config_DaysInPeriodLength
652
653    # Check coherency between (PeriodDateBegin, PeriodDateEnd) and (DateBegin, CumulPeriod, PeriodLength)
654    IGCM_config_DateCoherency
655    # And EXIT if not OK
656    IGCM_debug_Verif_Exit
657
658    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Running"
659  fi
660
661  # Save for futur use
662  OldPrefix=${config_UserChoices_JobName}_${PeriodDateEnd}
663
664  # BEGIN: SHOULD GO IN A FUNCTION FROM libIGCM_date.ksh
665  # Compute year_m1 and year_p1 (year minus 1Y and year plus 1Y)
666  year_m1=$(( year - 1 ))
667  year_p1=$(( year + 1 ))
668  # Compute month_m1 (month minus 1M)
669  # Compute yyyymm_m1 (yyyymm minus 1M)
670  month_m1=$(( 10#${month} - 1 ))
671  if [ ${month_m1} = 0 ]; then
672    month_m1=12
673    yyyymm_m1=${year_m1}12
674  elif [ ${month_m1} -le 9 ]; then
675    month_m1=0${month_m1}
676    yyyymm_m1=${year}${month_m1}
677  else
678    yyyymm_m1=${year}${month_m1}
679  fi
680  # Compute month_p1 (month plus 1M)
681  # Compute yyyymm_p1 (yyyymm plus 1M)
682  month_p1=$(( 10#${month} + 1 ))
683  if [ ${month_p1} = 13 ]; then
684    month_p1=01
685    yyyymm_p1=${year_p1}01
686  elif [ ${month_p1} -le 9 ]; then
687    month_p1=0${month_p1}
688    yyyymm_p1=${year}${month_p1}
689  else
690    yyyymm_p1=${year}${month_p1}
691  fi
692  #IGCM_debug_Print 1 "jg 1 month_m1 = ${month_m1} month_p1 = ${month_p1} "
693  #IGCM_debug_Print 1 "jg 1 calculate yyyymm_m1 = ${yyyymm_m1} "
694  #IGCM_debug_Print 1 "jg 1 calculate yyyymm_p1 = ${yyyymm_p1} "
695
696  #===================================================================#
697  # Calculate CyclicYear to be used for looping over a given forcing  #
698  # period. Add CyclicBegin and CyclicEnd in config.card UserChoices. #
699  #===================================================================#
700
701  # To use the variable CyclicYear, one must add in config.card CyclicBegin and CyclicEnd.
702  # CyclicBegin is the first year in the cycle. CyclicEnd is the last year included in the cycle.
703  if ( [ ! X${config_UserChoices_CyclicBegin} = X ] && [ ! X${config_UserChoices_CyclicEnd} = X ] ) ; then
704    CycleNb=$(( ${config_UserChoices_CyclicEnd} - ${config_UserChoices_CyclicBegin} + 1 ))
705    CyclicYear_p1=NOTDEFINED
706
707    # For current year
708    yeartmp=$year
709    diffy=$(( $yeartmp - ${config_UserChoices_CyclicBegin} ))
710    while [ $diffy -lt 0 ] ; do
711      yeartmp=$(( ${yeartmp} + ${CycleNb} ))
712      diffy=$(( $yeartmp - ${config_UserChoices_CyclicBegin} ))
713    done
714    CyclicYear=$(( ( ${diffy} % ${CycleNb} ) + ${config_UserChoices_CyclicBegin} ))
715
716    # For next coming year
717    yeartmp=$(( $year + 1 ))
718    diffy=$(( $yeartmp - ${config_UserChoices_CyclicBegin} ))
719    while [ $diffy -lt 0 ] ; do
720      yeartmp=$(( ${yeartmp} + ${CycleNb} ))
721      diffy=$(( $yeartmp - ${config_UserChoices_CyclicBegin} ))
722    done
723    CyclicYear_p1=$(( ( ${diffy} % ${CycleNb} ) + ${config_UserChoices_CyclicBegin} ))
724
725    IGCM_debug_Print 1 "CyclicYear   = ${CyclicYear}, CyclicYear_p1 = ${CyclicYear_p1}, current year=$year"
726  else
727    CyclicYear="ERROR_CyclicYear_Variable_Not_Defined"
728    CyclicYear_p1="ERROR_CyclicYear_p1_Variable_Not_Defined"
729    IGCM_debug_Print 1 "CyclicYear wont be use without adding CyclicBegin and CyclicEnd in config.card"
730  fi
731
732  # END: SHOULD GO IN A FUNCTION FROM libIGCM_date.ksh
733
734  #===================================================================#
735  # Prepare variables available for ${COMP}.card and ${COMP}.driver   #
736  #             But available to any son functions                    #
737  #===================================================================#
738
739  # Period Length In Days between DateBegin and DateCurrent (at end of period == PeriodDateEnd !)
740  (( SimulationLengthInDays = $( IGCM_date_DaysBetweenGregorianDate ${PeriodDateEnd} ${DateBegin} ) + 1 ))
741
742  # Debug Print :
743  echo
744  IGCM_debug_Print 1 "IGCM_config_PeriodStart : Before Execution"
745  IGCM_debug_Print 1 "Year of simulation      : ${year}"
746  IGCM_debug_Print 1 "Month of simulation     : ${month}"
747  IGCM_debug_Print 1 "PeriodLengthInDays      : ${PeriodLengthInDays}"
748  IGCM_debug_Print 1 "PeriodDateBegin         : ${PeriodDateBegin}"
749  IGCM_debug_Print 1 "PeriodDateEnd           : ${PeriodDateEnd}"
750  IGCM_debug_Print 1 "SimulationLengthInDays  : ${SimulationLengthInDays}"
751  IGCM_debug_Print 1 "ExperienceLengthInDays  : ${ExperienceLengthInDays}"
752
753  #================================================================#
754  #         Prepare variables available for comp_finalyze          #
755  #================================================================#
756
757  # Period for save files
758  eval DatesPeriod=${PeriodDateBegin}_${PeriodDateEnd} > /dev/null 2>&1
759
760  # Prefix for save files of this period
761  eval PREFIX=${config_UserChoices_JobName}_${DatesPeriod}  > /dev/null 2>&1
762
763  # List of files that will be deleted in RUN_DIR after run
764  [ -f stack ] && FileToBeDeleted[0]="stack"
765
766  # Test if the same run as already been saved :
767  if [ X${JobType} = XRUN ] ; then
768    if [ ${DRYRUN} -le 0 ] ; then
769      if ( IGCM_sys_TestFileBuffer ${R_BUF_KSH}/${PREFIX}_${Exe_Output} ) ; then
770        IGCM_debug_Exit "IGCM_config_PeriodStart" "You are currently RErunning an old job."
771        IGCM_debug_Print 1 "Because of readonly permissions, you can't RErun a job when saved files"
772        IGCM_debug_Print 1 " are still in the ARCHIVE directory. You must deleted those files, or "
773        IGCM_debug_Print 1 " the whole ${R_SAVE} tree. See clean_month.job in ${libIGCM} directory."
774        IGCM_debug_Print 1 " This exit has been initiated because at least ${R_BUF_KSH}/${PREFIX}_${Exe_Output} exists."
775        IGCM_debug_Verif_Exit
776      fi
777    fi
778  else
779    if ( IGCM_sys_TestFileBuffer ${R_BUF_KSH}/${PREFIX}_${Exe_Output} ) ; then
780      IGCM_debug_Print 1 "IGCM_config_PeriodStart" "RErun an old job. Allowed in DEBUG or DEV mode."
781    fi
782  fi
783
784  typeset ExeNameIn ExeNameFirst CompNameFirst
785  typeset comp i
786  typeset tempvar tempvarMPI tempvarNOD NbElts j NbExec
787
788  (( PROCESSUS_NUMBER = 0 ))
789  (( i=0 ))
790  (( NbExec=0 ))
791
792  OK_PARA_MPI=false
793  OK_PARA_OMP=false
794  OK_PARA_NOD=false
795  OK_PARA_MPMD=false
796
797  for comp in ${config_ListOfComponents[*]} ; do
798
799    IGCM_debug_Print 1 ${comp}
800
801    eval ExeNameIn=\${config_Executable_${comp}[0]}
802
803    # NO order in config.card for parallelized values !
804    # just use suffix : MPI , OMP and NOD (for number of NODes.)
805
806    # NOD is the number of NODes allocated
807    eval ${comp}_PROC_NOD=0
808
809    # MPI is the number of MPI processus per nodes
810    eval ${comp}_PROC_MPI=0
811
812    # OMP is the number of OpenMP threads per MPI processus
813    eval ${comp}_PROC_OMP=0
814
815    # Only if we really have an executable for the component :
816###    if [ X${ExeNameIn} != X\"\" ] ; then
817    if ( [ "X${ExeNameIn}" != X\"\" ] && [ "X${ExeNameIn}" != "Xinca.dat" ] ) ; then
818
819      # Keep the first executable found and the first CompName
820      ExeNameFirst=${ExeNameIn}
821      CompNameFirst=${comp}
822
823      # Are we a second executable?
824      (( NbExec = NbExec + 1 ))
825
826      # set 1 MPI task, 1 OpenMP thread and 1 node as default
827      eval ${comp}_PROC_MPI=1
828      eval ${comp}_PROC_OMP=1
829      eval ${comp}_PROC_NOD=1
830
831      eval NbElts=\${#config_Executable_${comp}[@]}
832
833      if [ ${NbElts} -ge 2 ] ; then
834        (( j = 2 ))
835
836        while [ $j -lt ${NbElts} ] ; do
837          eval tempvar=\${config_Executable_${comp}[${j}]}
838
839          if [ X${tempvar} = X ] ; then
840            echo "Error reading MPI/OMP parameters !!!"
841            echo "Check your config.card."
842            exit 1
843          fi
844
845          eval IGCM_debug_Print 2 ${tempvar}
846
847          case ${tempvar} in
848          *[mM][pP][iI]*)
849               # Read MPI parameter for composante
850            eval ${comp}_PROC_MPI=$( echo ${tempvar} | tr '[a-z]' '[A-Z]' | sed -e "s/MPI//" )
851            OK_PARA_MPI=true;;
852          *[oO][mM][pP]*)
853               # Read OMP parameter for composante
854            eval ${comp}_PROC_OMP=$( echo ${tempvar} | tr '[a-z]' '[A-Z]' | sed -e "s/OMP//" )
855            OK_PARA_OMP=true;;
856          *[nN][oO][dD]*)
857               # Read NOD (NumBer of Nodes) parameter for composante
858            eval ${comp}_PROC_NOD=$( echo ${tempvar} | tr '[a-z]' '[A-Z]' | sed -e "s/NOD//" )
859            OK_PARA_NOD=true
860            OK_PARA_MPI=true;;
861          esac
862
863          (( j = j + 1 ))
864        done
865
866      fi
867
868      eval tempvarMPI=\${${comp}_PROC_MPI}
869      eval tempvarNOD=\${${comp}_PROC_NOD}
870      eval tempvarOMP=\${${comp}_PROC_OMP}
871
872      (( PROCESSUS_NUMBER = PROCESSUS_NUMBER + tempvarMPI * tempvarNOD * tempvarOMP ))
873
874    fi
875
876    (( i=i+1 ))
877  done
878
879  # set MPMD mode if more than 2 executable names.
880  [ ${NbExec} -ge 2 ] && OK_PARA_MPMD=true
881
882  # Verification of BATCH_NUM_PROC_TOT total number of processors set in job header.
883  if [ X${BATCH_NUM_PROC_TOT} != X ] ; then
884    # BATCH_NUM_PROC_TOT is set
885    if ( ${OK_PARA_MPI} ) ; then
886      IGCM_debug_Print 1 "MPI/OMP/NOD found into config.card and BATCH_NUM_PROC_TOT = ${BATCH_NUM_PROC_TOT} "
887    else
888      # with previous method.
889      if [ ${BATCH_NUM_PROC_TOT} -gt 1 ] ; then
890        # with more than 1 proc
891        if ( ${OK_PARA_MPMD} ) ; then
892          # with MPMD ie CPL/oasis method
893          echo "We will use default number of MPI tasks for this machine : "
894          echo "${DEFAULT_NUM_PROC_OCE} for OCE; "
895          echo "${DEFAULT_NUM_PROC_CPL} for CPL; "
896          echo "${DEFAULT_NUM_PROC_ATM} for ATM; "
897          echo "${DEFAULT_NUM_PROC_TOTAL} for the total number of processors; "
898          OK_PARA_MPI=true
899          CPL_PROC_MPI=${DEFAULT_NUM_PROC_CPL}
900          OCE_PROC_MPI=${DEFAULT_NUM_PROC_OCE}
901          ATM_PROC_MPI=${DEFAULT_NUM_PROC_ATM}
902          PROCESSUS_NUMBER=${DEFAULT_NUM_PROC_TOTAL}
903        else
904          # with have only one executable
905          echo "We will use ${BATCH_NUM_PROC_TOT} MPI tasks for ${CompNameFirst} : ${ExeNameFirst} "
906          OK_PARA_MPI=true
907          eval ${CompNameFirst}_PROC_MPI=${BATCH_NUM_PROC_TOT}
908          PROCESSUS_NUMBER=${BATCH_NUM_PROC_TOT}
909        fi
910      else
911        PROCESSUS_NUMBER=1
912      fi
913    fi
914    # Verification with PBS parameter
915    if [ ${BATCH_NUM_PROC_TOT} -ne ${PROCESSUS_NUMBER} ] ; then
916      echo "Warning with parallelization parameters !"
917      echo "Job header variable BATCH_NUM_PROC_TOT = ${BATCH_NUM_PROC_TOT} "
918      echo "is the total number of _processors_ reserved."
919      echo "It is not equal to the sum of _processus_  = ${PROCESSUS_NUMBER}."
920      echo "We stop now."
921      exit 1
922    fi
923    NUM_PROC_CPL=${CPL_PROC_MPI} # for backward compatibility
924    NUM_PROC_OCE=${OCE_PROC_MPI} # for backward compatibility
925    NUM_PROC_ATM=${ATM_PROC_MPI} # for backward compatibility
926  else # BATCH_NUM_PROC_TOT=""
927    if ( ${OK_PARA_MPI} ) ; then
928      echo "You have not given a value of ${BATCH_NUM_PROC_TOT} processors,"
929      echo "but you have filled the parallel parameter in config->Executable->list."
930      echo "Please add BATCH_NUM_PROC_TOT variable in job header."
931      echo "We stop now."
932      exit 1
933    else
934      # sequential case !
935      if [ ${PROCESSUS_NUMBER} -eq 0 ] ; then
936        (( PROCESSUS_NUMBER = 1 ))
937        echo "PROCESSUS_NUMBER is all 0 (sequential use of old definition in config->Executable->list)."
938        echo "We set it to 1."
939      fi
940    fi
941  fi
942
943  IGCM_debug_Print 1 "MPI/OMP treatment PROCESSUS_NUMBER = ${PROCESSUS_NUMBER}"
944
945  IGCM_sys_build_execution_scripts
946
947  ExecutionFail=false
948
949  IGCM_debug_PopStack "IGCM_config_PeriodStart"
950}
951
952#===================================
953function IGCM_config_SaveSourceModifications
954{
955  IGCM_debug_PushStack "IGCM_config_SaveSourceModifications"
956
957  typeset ExeOutDateMax listVarEnv
958  ExeOutDateMax=$1
959
960  listVarEnv="ExeOutDateMax,R_OUT_EXE,PREFIX,SUBMIT_DIR"
961  IGCM_sys_RshMaster "\
962    . ${libIGCM}/libIGCM_sys/libIGCM_sys.ksh; \
963    export ExeOutDateMax=${ExeOutDateMax};\
964    export R_OUT_EXE=${R_OUT_EXE};\
965    export PREFIX=${PREFIX};\
966    export SUBMIT_DIR=${SUBMIT_DIR};\
967    export listVarEnv=${listVarEnv};\
968    Script_Output=out_SaveSourceModifications;\
969    IGCM_sys_Qsub ${libIGCM}/SaveSourceModifications.job ${ExeOutDateMax} ${R_OUT_EXE} ${PREFIX} ${SUBMIT_DIR}"
970
971  IGCM_debug_PopStack "IGCM_config_SaveSourceModifications"
972}
973
974#===================================
975function IGCM_config_PeriodEnd
976{
977  IGCM_debug_PushStack "IGCM_config_PeriodEnd"
978
979  echo
980  IGCM_debug_Print 1 "IGCM_config_PeriodEnd"
981  echo
982
983  #==================================#
984  #         Save Job output          #
985  #==================================#
986  if [ X${Pack} = Xtrue ] ; then
987    IGCM_sys_PutBuffer_Out ${Exe_Output} ${R_BUF_KSH}/${PREFIX}_${Exe_Output}
988  else
989    IGCM_sys_Put_Out ${Exe_Output} ${R_OUT_KSH}/${PREFIX}_${Exe_Output}
990  fi
991  eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${Exe_Output}"
992
993  if [ ${DRYRUN} -le 1 ] ; then
994
995    IGCM_debug_Print 1 "Check components binary : size and creation date"
996
997    typeset LS_comp LS_bin ExeDate ExeCpuLog NextExeSize LastCompExeSize
998    typeset comp i
999    typeset ExeNameIn ExeNameOut UpdateExe ExeSecDateMax
1000
1001    #==================================#
1002    #        Get last Exe Size         #
1003    #==================================#
1004
1005    (( i=0 ))
1006    if ( ${FirstInitialize} ) ; then
1007      run_Log_LastExeSize=""
1008      for comp in ${config_ListOfComponents[*]} ; do
1009        run_Log_LastExeSize[$i]=0
1010        (( i=i+1 ))
1011      done
1012    else
1013      IGCM_card_DefineArrayFromOption ${SUBMIT_DIR}/run.card Log LastExeSize
1014    fi
1015    #==================================#
1016    #         And Build ExeDate        #
1017    #==================================#
1018
1019    # 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
1020    # 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")
1021    # 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
1022    ExeDate=""
1023    NextExeSize="( "
1024    (( i=0 ))
1025    UpdateExe=false
1026    (( ExeSecDateMax = 0 ))
1027    for comp in ${config_ListOfComponents[*]} ; do
1028
1029      IGCM_debug_Print 3 ${comp}
1030
1031      eval ExeNameIn=\${config_Executable_${comp}[0]}
1032      eval ExeNameOut=\${config_Executable_${comp}[1]}
1033      # Only if we really have an executable for the component :
1034      if [ X${ExeNameIn} = X\"\" ] ; then
1035        # If there is no exe file for this component
1036        (( ExeSize=0 ))
1037      else
1038        eval LS_bin=${R_EXE}/${ExeNameIn}
1039        IGCM_sys_FileSize ${LS_bin} ExeSize
1040
1041        set +A LS_comp -- $( LC_TIME=en_US ls -l ${LS_bin} )
1042        if [ X${ExeDate} = X ] ; then
1043          # First component exe date
1044          ExeDate=${comp}_${LS_comp[5]}_${LS_comp[6]}
1045        else
1046          ExeDate=${ExeDate}-${comp}_${LS_comp[5]}_${LS_comp[6]}
1047        fi
1048        ExeDate=${ExeDate}_${LS_comp[7]}
1049      fi
1050
1051      if [ ${i} -eq 0 ] ; then
1052        # First component
1053        NextExeSize="( "${ExeSize}
1054      else
1055        NextExeSize=${NextExeSize}", "${ExeSize}
1056      fi
1057      eval LastCompExeSize=${run_Log_LastExeSize[$i]}
1058      (( i=i+1 ))
1059
1060      if [ ${ExeSize} -ne ${LastCompExeSize} ] ; then
1061        if ( ${FirstInitialize} ) ; then
1062          IGCM_debug_Print 1 "Save first ${ExeNameIn} in ${R_OUT_EXE} !"
1063        else
1064          IGCM_debug_Print 1 "${ExeNameIn} has changed in ${R_EXE} !"
1065          IGCM_debug_Print 1 "Save latest ${ExeNameIn} in ${R_OUT_EXE} !"
1066          eval FileToBeDeleted[${#FileToBeDeleted[@]}]=${ExeNameOut}
1067        fi
1068        eval IGCM_sys_Put_Out ${ExeNameOut} ${R_OUT_EXE}/${PREFIX}_${ExeNameIn} rw
1069        UpdateExe=true
1070
1071        # SD : switch off for now
1072        #IGCM_sys_GetDate_FichWork ${LS_bin} ExeSecDate
1073        #if [ $ExeSecDateMax -lt $ExeSecDate ] ; then
1074        #  ExeSecDateMax=$ExeSecDate
1075        #fi
1076      fi
1077    done
1078
1079    # SD : switch off for now
1080    #if ( ${UpdateExe} ) ; then
1081    #  echo "Launch SaveSourceModifications."
1082    #  IGCM_config_SaveSourceModifications ${ExeSecDateMax}
1083    #fi
1084
1085    NextExeSize=${NextExeSize}" )"
1086    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Log LastExeSize "${NextExeSize}"
1087
1088    if [ ${DRYRUN} -le 1 ] ; then
1089      tail -1500 ${Exe_Output} > ${Exe_Output}_tail.txt
1090      ExeCpuLog=$( gawk -f ${libIGCM}/libIGCM_sys/IGCM_add_out.awk ${Exe_Output}_tail.txt )
1091      RET=$?
1092      if [ $RET -eq 0 ] ; then
1093        # ExeCpuLog variable contents 5 fields
1094        echo "${CumulPeriod} ${PeriodDateBegin} ${PeriodDateEnd} ${ExeCpuLog} ${ExeDate}" |   \
1095          gawk '{printf("# %11d | %15s | %15s | %19s | %19s | %15.5f | %15.5f | %15.5f | %s\n", \
1096            $1,$2,$3,$4,$5,$6,$7,$8,$9)}' >> ${SUBMIT_DIR}/run.card
1097      fi
1098      eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${Exe_Output}_tail.txt"
1099    fi
1100
1101  fi
1102
1103  # All was right ? no ? then we stop.
1104  IGCM_debug_Verif_Exit
1105
1106  # If all was OK, we can delete all files not necessary for next Job
1107  echo
1108  IGCM_debug_Print 1 "Files that will be deleted before next period-run : "
1109
1110  if [ ${DRYRUN} -le 2 ] ; then
1111    for f in ${FileToBeDeleted[@]} ; do [ -f ${f} ] && ls -la $f ; [ -f ${f} ] && rm -f $f ; done
1112  else
1113    echo ${FileToBeDeleted[@]}
1114  fi
1115
1116  # Send some accounting element to the user if CumulPeriod=3
1117  if [ ${CumulPeriod} -eq 3 ] ; then
1118    echo
1119    IGCM_debug_Print 1 "Send email containing some accounting information : "
1120
1121    RealCpuTime=$( echo ${ExeCpuLog} | gawk '{print $3}' )
1122
1123    consumeHoursPerPeriod=$( echo "scale=6;${RealCpuTime}*${PROCESSUS_NUMBER}/3600" | bc )
1124
1125    consumeHoursPerWholeSimulation=$( echo "scale=6;${consumeHoursPerPeriod}/${PeriodLengthInDays}*${ExperienceLengthInDays}" | bc )
1126
1127    recommendedPeriodNb=$( echo "scale=6;24/${consumeHoursPerPeriod}*${PROCESSUS_NUMBER}" | bc )
1128
1129    IGCM_sys_SendMail Accounting
1130  fi
1131
1132  #=================================================#
1133  #         Modification of libIGCM behaviour       #
1134  #=================================================#
1135
1136  # To use this function, one must copy libIGCM.card from ${libIGCM} directory
1137  # and put it in ${SUBMIT_DIR} directory. After modifications of ${SUBMIT_DIR}/libIGCM.card,
1138  # variables define inside [UserChanges] will be modified for next Period of libIGCM main loop.
1139  if [ -f ${SUBMIT_DIR}/libIGCM.card ] ; then
1140    echo
1141    echo "########################################################################"
1142    echo "!!!                 Modification of libIGCM behaviour                !!!"
1143    echo
1144
1145    IGCM_debug_Print 1 "DefineArrayFromOption  : libIGCM_UserChanges in libIGCM.card"
1146    IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/libIGCM.card UserChanges
1147    IGCM_debug_Print 2 "libIGCM_UserChanges" ${libIGCM_UserChanges[*]}
1148
1149    # Special treatments for libIGCM internals
1150    for option in ${libIGCM_UserChanges[*]} ; do
1151      IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/libIGCM.card UserChanges ${option}
1152
1153      echo "We will change : ${option}."
1154      eval echo "Previous value : " \${${option}}
1155      eval echo "Change to : " \${libIGCM_UserChanges_${option}}
1156
1157      eval ${option}=\${libIGCM_UserChanges_${option}}
1158
1159      case ${option} in
1160      config_UserChoices_DateEnd)
1161        IGCM_debug_PrintVariables 1 config_UserChoices_DateEnd
1162        DateEnd=$( IGCM_date_ConvertFormatToGregorian ${config_UserChoices_DateEnd} )
1163
1164        # Period Length In Days between DateBegin and DateEnd
1165        (( ExperienceLengthInDays=$( IGCM_date_DaysBetweenGregorianDate ${DateEnd} ${DateBegin} )  + 1 ))
1166        if [ ${ExperienceLengthInDays} -lt 0 ] ; then
1167          IGCM_debug_Print 1 "Problem with dates in libIGCM.card : ${DateEnd} < ${DateBegin} ! You must check that."
1168          IGCM_debug_Exit "IGCM_PeriodEnd" " Wrong Dates."
1169          IGCM_debug_Verif_Exit
1170        fi
1171        ;;
1172      config_UserChoices_PeriodLength)
1173        IGCM_debug_Print 1  "Change config_UserChoices_PeriodLength=${config_UserChoices_PeriodLength}"
1174        ;;
1175      PeriodNb)
1176        IGCM_debug_Print 1  "Loop in main Job with ${PeriodNb} period(s)"
1177        ;;
1178      config_Post_RebuildFrequency)
1179        IGCM_debug_Print 1  "Change config_Post_RebuildFrequency=${config_Post_RebuildFrequency} : IGCM_post_Configure"
1180        IGCM_post_Configure
1181        ;;
1182      config_Post_TimeSeriesFrequency)
1183        IGCM_debug_Print 1  "Change config_Post_TimeSeriesFrequency = ${config_Post_TimeSeriesFrequency} : IGCM_post_Configure"
1184        IGCM_post_Configure
1185        ;;
1186      config_Post_SeasonalFrequency)
1187        IGCM_debug_Print 1  "Change config_Post_SeasonalFrequency = ${config_Post_SeasonalFrequency} : IGCM_post_Configure"
1188        IGCM_post_Configure
1189        ;;
1190      esac
1191    done
1192
1193    echo
1194    echo "########################################################################"
1195    echo
1196  fi
1197
1198  #=================================================#
1199  #         Determine next computed period          #
1200  #=================================================#
1201
1202  PeriodDateBegin=$( IGCM_date_AddDaysToGregorianDate ${PeriodDateEnd} 1 )
1203  IGCM_date_GetYearMonthDay $PeriodDateBegin year month day
1204  year_m1=$(( year - 1 ))
1205  year_p1=$(( year + 1 ))
1206  IGCM_config_DaysInPeriodLength
1207  PeriodDateEnd=$( IGCM_date_AddDaysToGregorianDate ${PeriodDateBegin} $(( ${PeriodLengthInDays} - 1 )) )
1208
1209  # Debug Print :
1210  echo
1211  IGCM_debug_Print 1 "IGCM_config_PeriodEnd : Preparing Next Execution"
1212  IGCM_debug_Print 1 "PeriodDateBegin       : ${PeriodDateBegin}"
1213  IGCM_debug_Print 1 "PeriodDateEnd         : ${PeriodDateEnd}"
1214  IGCM_debug_Print 1 "PeriodLengthInDays    : ${PeriodLengthInDays}"
1215
1216  PeriodDateBegin=$( IGCM_date_ConvertFormatToHuman ${PeriodDateBegin} )
1217  PeriodDateEnd=$( IGCM_date_ConvertFormatToHuman ${PeriodDateEnd} )
1218
1219  (( CumulPeriod = CumulPeriod + 1 ))
1220
1221  # Debug Print :
1222  echo
1223  IGCM_debug_Print 3 "PeriodDateBegin Human : ${PeriodDateBegin}"
1224  IGCM_debug_Print 3 "PeriodDateEnd Human   : ${PeriodDateEnd}"
1225  IGCM_debug_Print 3 "CumulPeriod           : ${CumulPeriod}"
1226
1227  #=================================================#
1228  #             Write updated run.card              #
1229  #=================================================#
1230
1231  IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration OldPrefix ${OldPrefix}
1232  IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin ${PeriodDateBegin}
1233  IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd ${PeriodDateEnd}
1234  IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod ${CumulPeriod}
1235
1236  if ( ${FirstInitialize} ) ; then
1237    # It's no more the first time
1238    FirstInitialize=false
1239  fi
1240
1241  IGCM_debug_PopStack "IGCM_config_PeriodEnd"
1242}
1243
1244#===================================
1245function IGCM_config_Finalize
1246{
1247  IGCM_debug_PushStack "IGCM_config_Finalize"
1248
1249  echo
1250  IGCM_debug_Print 1 "IGCM_config_Finalize"
1251  echo
1252
1253  if ( $DEBUG_debug ) ; then
1254    # Inform the rabbitMQ queue
1255    if [ X${ActivateBigBro} = Xtrue ] ; then
1256      # RabbitMQ message code
1257      code=1100
1258      # RabbitMQ message body
1259      Body=$( echo "{\"code\":\"${code}\",\"simuid\":\"${simuid}\",\"jobid\":\"${jobid}\",\"status\":\"OK\",\"timestamp\":\"$( date +"%Y-%m-%d-%T" )\"}" )
1260      # Fill the rabbitMQ queue
1261      IGCM_debug_sendAMQP
1262    fi
1263  fi
1264
1265  if [ ${SimulationLengthInDays} -ge ${ExperienceLengthInDays} ] ; then
1266    #==========================#
1267    # End of entire simulation #
1268    #==========================#
1269
1270    # Mail notification
1271    IGCM_sys_SendMail
1272    #
1273    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Completed"
1274    #
1275    IGCM_debug_Print 1 "Normal End of computation."
1276
1277    if ( $DEBUG_debug ) ; then
1278      if [ X${ActivateBigBro} = Xtrue ] ; then
1279        # RabbitMQ message code
1280        code=0100
1281        # RabbitMQ message body
1282        Body=$( echo "{\"code\":\"${code}\",\"simuid\":\"${simuid}\",\"jobid\":\"${jobid}\",\"status\":\"OK\",\"timestamp\":\"$( date +"%Y-%m-%d-%T" )\"}" )
1283        # Fill the rabbitMQ queue
1284        IGCM_debug_sendAMQP
1285      fi
1286      echo
1287      IGCM_debug_Print 1 "Your files on ${R_SAVE} :"
1288      IGCM_sys_Tree ${R_SAVE}
1289
1290      IGCM_debug_Print 1 "Your files on ${R_BUFR} :"
1291      IGCM_sys_Tree ${R_BUFR}
1292    fi
1293  else
1294    #=================#
1295    # Submit next job #
1296    #=================#
1297
1298    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "OnQueue"
1299
1300    # Name of next Ksh Script output :
1301    eval Script_Output="${Script_Output_Prefix}_${config_UserChoices_JobName}.$( printf "%06d" ${CumulPeriod} )"
1302
1303    IGCM_debug_Print 1 "Submit next job"
1304    # SUBMIT NEXT JOB from SUBMIT_DIR and come back in RUN_DIR
1305    IGCM_sys_Cd ${SUBMIT_DIR}
1306    # Keep only the 5 latest ${Script_Output_Prefix}_${config_UserChoices_JobName}
1307    ScriptTot=$( ls ${Script_Output_Prefix}_${config_UserChoices_JobName}.?????? 2>/dev/null | wc -l )
1308    [ ${ScriptTot} -gt 5 ] && rm -f $( ls ${Script_Output_Prefix}_${config_UserChoices_JobName}.?????? | head -$(( ${ScriptTot} - 5 )) )
1309    # Submit next job and come back
1310    IGCM_sys_Qsub ${SUBMIT_DIR}/Job_${config_UserChoices_JobName}
1311    IGCM_sys_Cd -
1312  fi
1313
1314  # Supress Non Deleted Boundary files
1315  #if [ ${DRYRUN} -le 2 ] ; then
1316  #  IGCM_comp_DelFixeBoundaryFiles
1317  #  ls -la
1318  #fi
1319
1320  # Clean ${RUN_DIR}=${RUN_DIR_PATH}/${config_UserChoices_JobName}.${$}
1321  # Only for production run (No clean up in DEV or DEB mode)
1322  # and command sent from .. directory.
1323  IGCM_sys_Cd ..
1324  [ X${JobType} = XRUN ] && IGCM_sys_Rm -rf ${RUN_DIR_PATH}
1325
1326  IGCM_debug_PopStack "IGCM_config_Finalize"
1327}
1328
1329#===================================
Note: See TracBrowser for help on using the repository browser.