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

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