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

Last change on this file since 1630 was 1630, checked in by jgipsl, 3 months ago

Only send Accounting mail if the variable jobWarningDelay has been set.

  • 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: 64.1 KB
Line 
1#!/bin/ksh
2
3#**************************************************************
4# Author: Sebastien Denvil, Martial Mancip
5# Contact: Sebastien.Denvil__at__ipsl.jussieu.fr Martial.Mancip__at__ipsl.jussieu.fr
6# $Revision::                                          $ Revision of last commit
7# $Author::                                            $ Author of last commit
8# $Date::                                              $ Date of last commit
9# IPSL (2006)
10#  This software is governed by the CeCILL licence see libIGCM/libIGCM_CeCILL.LIC
11#
12#**************************************************************
13
14#===================================
15function IGCM_config_CommonConfiguration
16{
17  IGCM_debug_PushStack "IGCM_config_CommonConfiguration" $@
18
19  # Debug Print :
20  [ ${Verbosity} -gt 0 ] && echo
21  IGCM_debug_Print 1 "IGCM_config_CommonConfiguration" $@
22
23  # config.card path
24  configCardPath=$1
25
26  #==================================
27  typeset option auxprint
28
29  #==================================
30  # Read UserChoices section:
31  [ ${Verbosity} -gt 0 ] && echo
32  IGCM_debug_Print 1 "DefineArrayFromOption  : config_UserChoices"
33
34  IGCM_card_DefineArrayFromSection ${configCardPath} UserChoices
35  for option in ${config_UserChoices[*]} ; do
36    IGCM_card_DefineVariableFromOption ${configCardPath} UserChoices ${option}
37    eval auxprint=\${config_UserChoices_${option}}
38    IGCM_debug_Print 3 "${option} : ${auxprint}"
39  done
40
41  # Set variables with shorter names on some variables which 
42  # are used in the executable name in config.card
43  ResolAtm=${config_UserChoices_ResolAtm}
44  ResolOce=${config_UserChoices_ResolOce}
45  ConfChem=${config_UserChoices_ConfChem}
46  OptMode=${config_UserChoices_OptMode}
47  ConfigType=${config_UserChoices_ConfigType}
48 
49  #==================================
50  # Read Ensemble section:
51  [ ${Verbosity} -gt 0 ] && echo
52  IGCM_debug_Print 1 "DefineArrayFromOption  : config_Ensemble"
53
54  IGCM_card_DefineArrayFromSection ${configCardPath} Ensemble
55  for option in ${config_Ensemble[*]} ; do
56    IGCM_card_DefineVariableFromOption ${configCardPath} Ensemble ${option}
57    eval auxprint=\${config_Ensemble_${option}}
58    IGCM_debug_Print 3 "${option} : ${auxprint}"
59  done
60
61  #==================================
62  # Read Post section:
63  [ ${Verbosity} -gt 0 ] && echo
64  IGCM_debug_Print 1 "DefineArrayFromOption : config_Post"
65
66  IGCM_card_DefineArrayFromSection ${configCardPath} Post
67  for option in ${config_Post[*]} ; do
68    IGCM_card_DefineVariableFromOption ${configCardPath} Post ${option}
69    eval auxprint=\${config_Post_${option}}
70    IGCM_debug_Print 3 "${option} : ${auxprint}"
71  done
72  [ ${Verbosity} -gt 0 ] && echo
73
74  #==================================
75  # Define default value to keep compatibility with previous card: means before changes due to TGCC
76  # Apply some overrules to ensure proper usage of computing centres resources
77  #
78
79  # if RebuildFrequency is not define in config.card - we initilize it to NONE
80  if [ X${config_Post_RebuildFrequency} = X ] ; then
81      config_Post_RebuildFrequency=NONE
82  fi
83
84  if [ X${PackDefault} = Xtrue ] ; then
85    if [ X${config_UserChoices_SpaceName} = XTEST ]; then
86      # TEST simulations will not be packed and will stay on SCRATCHDIR filesystem
87      IGCM_debug_Print 1 "SpaceName=TEST. OVERRULE PackFrequency to NONE"
88      config_Post_PackFrequency=NONE
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  # Define ARCHIVE : Dedicated to large files
100  # Define STORAGE : Dedicated to small/medium files
101  # Define R_OUT   : Output tree located on ARCHIVE
102  # Define R_BUF   : Output tree located on STORAGE (files waiting treatment, or file lcoation when SpaceName=!PROD)
103  # Define R_FIG   : Output tree located on STORAGE hosting figures (monitoring and atlas, and/or small files)
104  # Define R_TMP   : A temporary space used by IGCM_debug_send_AMQP_msg__MAILTUNNEL. Must be persistent in between jobs
105  IGCM_sys_defineArchives
106
107  #====================================================
108  # R_SAVE : Job output directory
109  # R_BUFR : Job output buffered directory
110  # R_CMIP : Job output directory for CMIP6 standard files
111
112  if ( [ ! X${config_UserChoices_SpaceName} = X ] && [ ! X${config_UserChoices_ExperimentName} = X ] ) ; then
113    FreeName=$( echo ${config_UserChoices_JobName} | sed 's/.*_//' )
114
115    if ( [ X${config_Post_StorageCMIP} = XSCRATCH ] || [ X${config_Post_StorageCMIP} = Xscratch ] ) ; then
116      IGCM_debug_Print 1 "LIBIGCM CONFIG:: SCRATCH R_BUF=${R_BUF}"
117      StoreCMIP=${R_BUF}
118    elif ( [ X${config_Post_StorageCMIP} = XSTORE ] || [ X${config_Post_StorageCMIP} = Xstore ] ) ; then
119      IGCM_debug_Print 1 "LIBIGCM CONFIG:: SCRATCH R_OUT=${R_OUT}"
120      StoreCMIP=${R_OUT}
121    else
122      IGCM_debug_Print 1 "LIBIGCM CONFIG:: ELSE CMIP_BUF=${CMIP6_BUF}"
123      StoreCMIP=${CMIP6_BUF}
124    fi
125    # Ensemble cases (default all members outputs in same directory)
126    if ( [ ! X${config_Ensemble_EnsembleName} = X ] ) ; then
127      R_SAVE=${R_OUT}/${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${config_Ensemble_EnsembleName}
128      R_FIGR=${R_FIG}/${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${config_Ensemble_EnsembleName}
129      R_BUFR=${R_BUF}/${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${config_Ensemble_EnsembleName}
130      R_DODS=${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${config_Ensemble_EnsembleName}
131      R_CMIP=${StoreCMIP}/${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${config_Ensemble_EnsembleName}
132      IGCM_debug_Print 1 "LIBIGCM CONFIG:: ENSEMBLE R_CMIP=${R_CMIP}"
133
134      # PERTURB Ensemble Outputs
135      if ( [ X${config_Ensemble_EnsembleType} = XEns_PERTURB ] ) ; then
136        if ( [ ! X${config_Ensemble_EnsembleDate} = X ] ) ; then
137          R_SAVE=${R_SAVE}/${config_Ensemble_EnsembleDate}/${FreeName}
138          R_FIGR=${R_FIGR}/${config_Ensemble_EnsembleDate}/${FreeName}
139          R_BUFR=${R_BUFR}/${config_Ensemble_EnsembleDate}/${FreeName}
140          R_DODS=${R_DODS}/${config_Ensemble_EnsembleDate}/${FreeName}
141          R_CMIP=${R_CMIP}/${config_Ensemble_EnsembleDate}/${FreeName}
142        else
143          R_SAVE=${R_SAVE}/${FreeName}
144          R_FIGR=${R_FIGR}/${FreeName}
145          R_BUFR=${R_BUFR}/${FreeName}
146          R_DODS=${R_DODS}/${FreeName}
147          R_CMIP=${R_CMIP}/${FreeName}
148        fi
149      # DATE Ensemble Outputs
150      elif ( [ X${config_Ensemble_EnsembleType} = XEns_DATE ] ) ; then
151        R_FIGR=${R_FIGR}/${FreeName}
152        R_BUFR=${R_BUFR}/${FreeName}
153        R_DODS=${R_DODS}/${FreeName}
154        IGCM_debug_Print 1 "LIBIGCM CONFIG:: ENSEMBLE DATE R_CMIP=${R_CMIP}"
155        if ( [ X${config_Ensemble_EnsembleMergeSave} = X ] || [ X${config_Ensemble_EnsembleMergeSave} = Xn ] || 
156             [ X${config_Ensemble_EnsembleMergeSave} = Xno ] ) ; then
157          # One SAVE directory per member, else common output dir for all members
158          R_SAVE=${R_SAVE}/${FreeName}
159          R_CMIP=${R_CMIP}/${FreeName}
160          IGCM_debug_Print 1 "LIBIGCM CONFIG:: ENSEMBLE DATE MERGE R_CMIP=${R_CMIP}"
161        fi
162      fi
163    else
164      R_SAVE=${R_OUT}/${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${FreeName}
165      R_FIGR=${R_FIG}/${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${FreeName}
166      R_BUFR=${R_BUF}/${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${FreeName}
167      R_DODS=${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${FreeName}
168      R_CMIP=${StoreCMIP}/${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${FreeName}
169    fi
170  else
171    if ( [ ! X${config_Ensemble_EnsembleName} = X ] && [ ! X${config_Ensemble_EnsembleDate} = X ] ) ; then
172      R_SAVE=${R_OUT}/${config_UserChoices_TagName}/${config_Ensemble_EnsembleName}/${config_Ensemble_EnsembleDate}/${config_UserChoices_JobName}
173      R_FIGR=${R_FIG}/${config_UserChoices_TagName}/${config_Ensemble_EnsembleName}/${config_Ensemble_EnsembleDate}/${config_UserChoices_JobName}
174      R_BUFR=${R_BUF}/${config_UserChoices_TagName}/${config_Ensemble_EnsembleName}/${config_Ensemble_EnsembleDate}/${config_UserChoices_JobName}
175      R_DODS=${config_UserChoices_TagName}/${config_Ensemble_EnsembleName}/${config_Ensemble_EnsembleDate}/${config_UserChoices_JobName}
176    else
177      R_SAVE=${R_OUT}/${config_UserChoices_TagName}/${config_UserChoices_JobName}
178      R_FIGR=${R_FIG}/${config_UserChoices_TagName}/${config_UserChoices_JobName}
179      R_BUFR=${R_BUF}/${config_UserChoices_TagName}/${config_UserChoices_JobName}
180      R_DODS=${config_UserChoices_TagName}/${config_UserChoices_JobName}
181    fi
182  fi
183 
184  IGCM_debug_Print 1 "LIBIGCM CONFIG:: R_CMIP = ${R_CMIP}"
185 
186  #====================================================
187  # Define R_OUT_KSH : Storage place for job output
188  # Define R_OUT_EXE : Storage place for binary used during simulation
189  R_OUT_KSH=${R_SAVE}/Out
190  R_OUT_EXE=${R_SAVE}/Exe
191
192  #====================================================
193  # Define R_BUF_KSH : Buffer place for job output
194  # Define R_BUF_EXE : Buffer place for binary used during simulation
195  R_BUF_KSH=${R_BUFR}/Out
196  R_BUF_EXE=${R_BUFR}/Exe
197
198  #====================================================
199  # Define REBUILD_DIR : where we store files needing rebuild process
200  REBUILD_DIR=${R_BUFR}/REBUILD
201  if [ ! X${TaskType} = Xchecking ] ; then
202    IGCM_sys_MkdirWork ${REBUILD_DIR}
203  fi
204
205  #====================================================
206  # DodsCopy : apply default value if not defined
207  if ( [ X${config_Post_DodsCopy} = X${NULL_STR} ] || [ X${config_Post_DodsCopy} = X ] ) ; then
208    config_Post_DodsCopy=TRUE
209  fi
210
211  #====================================================
212  # AtlasIPSL : apply default value if not defined
213  if ( [ X${config_Post_AtlasIPSL} = X${NULL_STR} ] || [ X${config_Post_AtlasIPSL} = X ] ) ; then
214    config_Post_AtlasIPSL=FALSE
215  fi
216
217  #====================================================
218  # ParserXIOS : apply default value if not defined
219  if ( [ X${config_Post_ParserXIOS} = X${NULL_STR} ] || [ X${config_Post_ParserXIOS} = X ] ) ; then
220    config_Post_ParserXIOS=FALSE
221  fi
222
223  #====================================================
224  # MetricsPCMDI : apply default value if not defined
225  if ( [ X${config_Post_MetricsPCMDI} = X${NULL_STR} ] || [ X${config_Post_MetricsPCMDI} = X ] ) ; then
226    config_Post_MetricsPCMDI=FALSE
227  fi
228  #====================================================
229  # Cesmep : apply default value FALSE if not defined, and if TRUE
230  # or *Y set it based on an adhoc algorithm
231  if ( [ X${config_Post_Cesmep} = X${NULL_STR} ] || [ X${config_Post_Cesmep} = XNONE ] || \
232       [ X${config_Post_Cesmep} = X ] || [ X${config_Post_Cesmep} = XFALSE ] ) ; then
233    config_Post_Cesmep=FALSE
234  elif [ X${config_Post_Cesmep} = XTRUE ]  ; then
235      if ([ ! X${config_Post_SeasonalFrequency} = XNONE ] && [ ! X${config_Post_SeasonalFrequency} = X ] ) ; then
236          config_Post_Cesmep="SE"
237      elif ([ ! X${config_Post_TimeSeriesFrequency} = XNONE ] && [ ! X${config_Post_TimeSeriesFrequency} = X ] ) ; then
238          config_Post_Cesmep="TS"
239      elif ([ ! X${config_Post_PackFrequency} = XNONE ] && [ ! X${config_Post_PackFrequency} = X ] ) ; then
240          config_Post_Cesmep="Pack"
241      else
242          # This covers case SpaceName=TEST with no SE nor TS (nor Pack)
243          config_Post_Cesmep=AtEnd
244      fi
245  fi
246  #
247  if [ X${config_Post_Cesmep} != XFALSE ] ; then
248      if ( [ X${config_Post_CesmepPeriod} != X${NULL_STR} ] && [ X${config_Post_CesmepPeriod} != X ] ) ; then
249          CesmepPeriod=${config_Post_CesmepPeriod%Y}
250      fi
251      if [ X${config_Post_Cesmep} = XSE ] ; then
252          if ([ X${config_Post_SeasonalFrequency} = XNONE ] || [ X${config_Post_SeasonalFrequency} = X ] ) ; then
253              IGCM_debug_Exit "Cannot use SE for Cesmep : SE post-processing is not active"
254          else
255              [ -z $CesmepPeriod ] && CesmepPeriod=${config_Post_SeasonalFrequency%Y}
256          fi
257      elif [ X${config_Post_Cesmep} = XTS ] ; then
258          if ([ X${config_Post_TimeSeriesFrequency} = XNONE ] || [ X${config_Post_TimeSeriesFrequency} = X ] ) ; then
259              IGCM_debug_Exit "Cannot use TS for Cesmep : TS post-processing is not active"
260          else
261              [ -z $CesmepPeriod ] && CesmepPeriod=${config_Post_TimeSeriesFrequency%Y}
262          fi
263      elif [ X${config_Post_Cesmep} = XPack ] ; then
264          if ([ X${config_Post_PackFrequency} = XNONE ] || [ X${config_Post_PackFrequency} = X ] ) ; then
265              IGCM_debug_Exit "Cannot use Packed output for Cesmep : Pack post-processing is not active"
266          else
267              [ -z $CesmepPeriod ] && CesmepPeriod=${config_Post_PackFrequency%Y}
268          fi
269      elif [ X${config_Post_Cesmep} != XAtEnd ] ; then
270          IGCM_debug_Exit "config.card's Post section's value for Cesmep (${config_Post_Cesmep}) is invalid; use SE, TS, Pack, AtEnd or TRUE"
271      else
272          [ -z $CesmepPeriod ] && CesmepPeriod=0
273      fi
274
275      if ( [ X${config_Post_CesmepComparison} = XNONE ] || [ X${config_Post_CesmepComparison} = X ] ) ; then
276          config_Post_CesmepComparison=run_comparison
277      fi
278     
279      if ( [ X${config_Post_CesmepCode} = XNONE ] || [ X${config_Post_CesmepCode} = X ] ) ; then
280          if ( [ X"${SYSTEM}" == "Xirene" ] || [ X"${SYSTEM}" == "Xirene-amd" ] ); then
281              config_Post_CesmepCode=/ccc/cont003/home/igcmg/igcmg/Tools/cesmep
282          elif ( [ X"${SYSTEM}" == "Xjeanzay" ] ); then
283              config_Post_CesmepCode=/gpfswork/rech/psl/commun/Tools/cesmep
284          elif ( [ X"${SYSTEM}" == "Xmesoipsl" ] ); then
285              config_Post_CesmepCode=/net/nfs/tools/Users/SU/jservon/cesmep_installs/cesmep_for_libIGCM
286          elif [ ${config_Post_Cesmep} != FALSE ] ; then
287              IGCM_debug_Exit "Cannot locate a default C-ESM-EP code on $SYSTEM, please set CesmepCode in section Post"
288          fi
289      fi
290      if ( [ X${config_Post_CesmepSlices} = XNONE ] || [ X${config_Post_CesmepSlices} = X ] ) ; then
291          config_Post_CesmepSlices=8
292      fi
293      if ( [ X${config_Post_CesmepSlicesDuration} != X${NULL_STR} ] && [ X${config_Post_CesmepSlicesDuration} != X ] &&\
294         [ X${config_Post_CesmepSlicesDuration} != XNONE ] ) ; then
295          CesmepSlicesDuration=${config_Post_CesmepSlicesDuration%Y}
296      else
297          CesmepSlicesDuration=$CesmepPeriod
298      fi
299      if [ $CesmepSlicesDuration -gt $CesmepPeriod ]; then
300          IGCM_debug_Exit "C-ESM-EP : you cannot set a CesmepSlicesDuration ($CesmepSlicesDuration) longer than CesmepPeriod ($CesmepPeriod)"
301      fi
302      if [ X${config_Post_CesmepReferences} = X${NULL_STR} ] || [ X${config_Post_CesmepReferences} = XNONE ] || \
303             [ X${config_Post_CesmepReferences} = X ] ; then
304          config_Post_CesmepReferences=NONE
305      fi
306  fi
307  IGCM_debug_Print 3 "config_Post_Cesmep=${config_Post_Cesmep}, CesmepPeriod=$CesmepPeriod, config_Post_CesmepSlices=$config_Post_CesmepSlices  "
308  #====================================================
309  # IgnoreNonMonotonic : apply default value if not defined
310  if ( [ X${config_Post_IgnoreNonMonotonic} = X${NULL_STR} ] || [ X${config_Post_IgnoreNonMonotonic} = X ] ) ; then
311    config_Post_IgnoreNonMonotonic=FALSE
312  fi
313
314  #====================================================
315  # LightRestartPack : apply default value if not defined
316  if ( [ X${config_Post_LightRestartPack} = X${NULL_STR} ] || [ X${config_Post_LightRestartPack} = X ] ) ; then
317    config_Post_LightRestartPack=FALSE
318  fi
319
320  #====================================================
321  # dr2xmlIPSL : apply default value if not defined
322  if ( [ X${config_Post_dr2xmlIPSL} = X${NULL_STR} ] || [ X${config_Post_dr2xmlIPSL} = X ] ) ; then
323    config_Post_dr2xmlIPSL=FALSE
324  fi
325
326
327  #====================================================
328  # Define StackFileLocation : directory where we store stack files
329  # Define StackFileName : stack file containing call tree and instrumentation
330  # Stack file containing call tree will be stored there.
331  if ( $DEBUG_debug ) ; then
332    StackFileLocation=${StackFileLocation:=${R_BUF_KSH}}
333    [ ! -d ${StackFileLocation} ] && mkdir -p ${StackFileLocation}
334    if [ X${TaskType} = Xcomputing ]; then
335      StackFileName=computing.stack.$$
336    elif [ X${TaskType} = Xpost-processing ]; then
337      StackFileName=${Script_Post_Output}.stack.$$
338    elif [ X${TaskType} = Xchecking ]; then
339      StackFileName=checking.stack.$$
340    else
341      IGCM_debug_Exit "IGCM_config_CommonConfiguration unknown TaskType : ${TaskType}"
342      IGCM_debug_Verif_Exit
343    fi
344
345    # This boolean will trigger the filling of the stack
346    # Only now we know where things should be ...
347    # We don't fill the stack when we perform checking task
348    if [ ! X${TaskType} = Xchecking ] ; then
349      ActivateStackFilling=true
350    fi
351  fi
352
353  IGCM_debug_PopStack "IGCM_config_CommonConfiguration"
354}
355
356#===================================
357function IGCM_config_Initialize
358{
359  IGCM_debug_PushStack "IGCM_config_Initialize"
360
361  # Debug Print :
362  echo
363  IGCM_debug_Print 1 "IGCM_config_Initialize"
364
365  # Test modipsl tree existence.
366  IGCM_sys_TestDir ${MODIPSL}
367  [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDir"
368  IGCM_sys_TestDir ${libIGCM}
369  [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDir"
370  IGCM_sys_TestDir ${R_EXE}
371  [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDir"
372  IGCM_sys_TestDir ${SUBMIT_DIR}
373  [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDir"
374
375  if ( $DEBUG_debug ) ; then
376    echo "Keep trace of inital SUBMIT_DIR : "
377    ls -lta ${SUBMIT_DIR}
378  fi
379
380  #==================================
381  # Read ListOfComponents section:
382  echo
383  IGCM_debug_Print 1 "DefineArrayFromSection : ListOfComponents"
384
385  IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/config.card ListOfComponents
386  for comp in ${config_ListOfComponents[*]} ; do
387    IGCM_card_DefineArrayFromOption ${SUBMIT_DIR}/config.card ListOfComponents ${comp}
388  done
389  IGCM_debug_Print 3 ${config_ListOfComponents[*]}
390
391  #==================================
392  # Read Executable section:
393  IGCM_card_DefineArrayFromSection   ${SUBMIT_DIR}/config.card Executable
394
395  #==================================
396  # Read Restarts section:
397  # Restarts : Gerneral rule or local for each component.
398  echo
399  IGCM_debug_Print 1 "DefineArrayFromOption : config_Restarts"
400
401  IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/config.card Restarts
402  for option in ${config_Restarts[*]} ; do
403    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card Restarts ${option}
404    eval auxprint=\${config_Restarts_${option}}
405    IGCM_debug_Print 3 "${option} : ${auxprint}"
406  done
407
408  #==================================
409  # Define Job Outputs Name
410  echo
411  IGCM_debug_Print 2 "Define Script_Output_Prefix and Exe_Output"
412  Script_Output_Prefix=${config_UserChoices_Script_Output_Prefix:='Script_Output'}
413  IGCM_debug_Print 3 "Script_Output_Prefix = ${Script_Output_Prefix}"
414  Exe_Output=out_execution
415  IGCM_debug_Print 3 "Exe_Output           = ${Exe_Output}"
416
417  #===================================================================#
418  # Prepare variables available for ${COMP}.card and ${COMP}.driver   #
419  #             But available to any son functions                    #
420  #===================================================================#
421
422  # Convert yyyy-mm-dd date to gregorian yyyymmdd
423  DateBegin=$( IGCM_date_ConvertFormatToGregorian ${config_UserChoices_DateBegin} )
424  DateEnd=$(   IGCM_date_ConvertFormatToGregorian ${config_UserChoices_DateEnd}   )
425  EndYear=$(( $( IGCM_date_ConvertGregorianDateToJulian $DateEnd ) / 1000 ))
426  EndYear_p1=$(( $( IGCM_date_ConvertGregorianDateToJulian $DateEnd ) / 1000 + 1 ))
427
428
429  # Period Length In Days between DateBegin and DateEnd
430  (( ExperienceLengthInDays=$( IGCM_date_DaysBetweenGregorianDate ${DateEnd} ${DateBegin} )  + 1 ))
431  if [ ${ExperienceLengthInDays} -lt 0 ] ; then
432    IGCM_debug_Print 1 "Problem with dates in config.card : ${DateEnd} < ${DateBegin} ! You must check that."
433    IGCM_debug_Exit "IGCM_config_Initialize" " Wrong Dates."
434    IGCM_debug_Verif_Exit
435  fi
436
437  # Day and Year of Initial State (Given in julian format)
438  InitDay=$(( $( IGCM_date_ConvertGregorianDateToJulian $DateBegin ) % 1000 ))
439  InitYear=$(( $( IGCM_date_ConvertGregorianDateToJulian $DateBegin ) / 1000 ))
440  InitYear_m1=$(( $( IGCM_date_ConvertGregorianDateToJulian $DateBegin ) / 1000 - 1 ))
441
442  #================================================================#
443  #                  Test and Prepare directories                  #
444  #================================================================#
445
446  # ==> 4 kinds of input files :
447  #     1) R_INIT  : Initial State Files   (Etat0, carteveg)
448  #     2) R_BC    : Boundary Conditions   (Forcages, lai)
449  #     3) Parameters files (allready define through ${SUBMIT_DIR})
450  #     4) Restarts files   (allready define in IGCM_config_Initialize)
451
452  # Here we offer the possibility to redefine R_INIT, R_BC
453  # and NbPeriodsPerJob through config.card
454  R_INIT=${config_UserChoices_R_INIT:=${R_IN}/INIT}
455  echo
456  IGCM_debug_Print 2 "(Re)Define R_INIT, R_BC and NbPeriodsPerJob"
457  IGCM_debug_Print 3 "R_IN=${R_IN}"
458  IGCM_debug_Print 3 "R_INIT=${R_INIT}"
459  R_BC=${config_UserChoices_R_BC:=${R_IN}/BC}
460  IGCM_debug_Print 3  "R_BC=${R_BC}"
461  NbPeriodsPerJob=${config_UserChoices_NbPeriodsPerJob:=${NbPeriodsPerJob}}
462  IGCM_debug_Print 3  "Loop in main Job with ${NbPeriodsPerJob} period(s)"
463 
464  # SD ADA SPECIFIC #
465  #      TO FIX     #
466  #IGCM_sys_TestDirArchive ${R_IN}
467  #[ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDirArchive"
468 
469  if ( ${FirstInitialize} ) ; then
470    IGCM_sys_MkdirArchive   ${R_SAVE}
471    [ ! ${config_Post_PackFrequency} = NONE ] && IGCM_sys_Mkdir ${R_BUFR}
472  else
473    IGCM_sys_TestDirArchive ${R_SAVE}
474    [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDirArchive ${R_SAVE}"
475
476    if [ ! ${config_Post_PackFrequency} = NONE ] ; then
477      IGCM_sys_TestDir ${R_BUFR}
478      [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDir ${R_BUFR}"
479    fi
480
481    # Test state of run in run.card. Will schedule an exit if another process setted it to "Fatal"
482    IGCM_config_StateCheck
483
484    # And EXIT if not OK
485    IGCM_debug_Verif_Exit
486  fi
487
488  #====================================================
489  # Experience type : DEB(ug), DEV(elopment), RUN
490  if [ X${JobType} != XRUN ] ; then
491    echo
492    echo "===================================================="
493    echo "libIGCM JOB is NOT in RUN type mode."
494    echo "!! OUTPUT files will NOT be PROTECTED !!"
495    echo "Be carefull : you can ERASE the result of this job !"
496
497    case ${JobType} in
498    DEB)
499      echo "DEBUG mode : activation of 'set -vx' mode."
500      echo "DEBUG mode : no protection for output files."
501      echo "DEBUG mode : if active force asynchronous rebuild frequency to PeriodLength frequency."
502      ;;
503    DEV)
504      echo "DEVelopment mode : no protection for output files."
505      echo "DEVelopment mode : if active force asynchronous rebuild frequency to PeriodLength frequency."
506      ;;
507    esac
508
509    if ( [ X${config_Post_RebuildFrequency} != XNONE ] && [ ${DRYRUN} -eq 0 ] ) ; then
510      if [ X${config_Post_RebuildFrequency} != X${config_UserChoices_PeriodLength} ] ; then
511        echo "------------"
512        echo "WARNING : Job is NOT in RUN mode then we will force REBUILD Frequency"
513        echo "          to PeriodLength : ${config_UserChoices_PeriodLength}"
514        echo "------------"
515        config_Post_RebuildFrequency=${config_UserChoices_PeriodLength}
516      fi
517    fi
518    echo "===================================================="
519    echo
520  fi
521
522  IGCM_debug_PopStack "IGCM_config_Initialize"
523}
524
525#===================================
526function IGCM_config_DaysInPeriodLength
527{
528  IGCM_debug_PushStack "IGCM_config_DaysInPeriodLength"
529
530  typeset i
531
532  # Determine number of day(s) in PeriodLength :
533  case ${config_UserChoices_PeriodLength} in
534  *Y|*y)
535    PeriodLengthInYears=$( echo ${config_UserChoices_PeriodLength} | sed -e 's/[yY]//' )
536    echo
537    IGCM_debug_Print 2 "Number of years for PeriodLength : ${PeriodLengthInYears}"
538    PeriodLengthInDays=0
539    i=0
540    until [ $i -ge $PeriodLengthInYears ] ; do
541      (( PeriodLengthInDays = PeriodLengthInDays + $( IGCM_date_DaysInYear $(( year + i )) ) ))
542      (( i=i+1 ))
543    done
544    ;;
545  *M|*m)
546    PeriodLengthInMonths=$( echo ${config_UserChoices_PeriodLength} | sed -e 's/[mM]//' )
547    echo
548    IGCM_debug_Print 2 "Number of months for PeriodLength : ${PeriodLengthInMonths}"
549    PeriodLengthInDays=0
550    i=0
551    until [ $i -ge $PeriodLengthInMonths ] ; do
552      if [ $(( 10#${month} + ${i} )) -lt 13 ] ; then
553        (( PeriodLengthInDays  = PeriodLengthInDays + $( IGCM_date_DaysInMonth $year $(( 10#${month} + ${i} )) ) ))
554      else
555        (( PeriodLengthInDays  = PeriodLengthInDays + $( IGCM_date_DaysInMonth $year $(( 10#${month} + ${i} - 12 )) ) ))
556      fi
557      (( i=i+1 ))
558    done
559    ;;
560  *D|*d)
561    PeriodLengthInMonths=0
562    PeriodLengthInDays=$( echo ${config_UserChoices_PeriodLength} | sed -e 's/[dD]//' )
563    echo
564    IGCM_debug_Print 2 "Number of days for PeriodLength : ${PeriodLengthInDays}";;
565  *)
566    IGCM_debug_Exit "IGCM_config_DaysInPeriodLength " ${config_UserChoices_PeriodLength} " invalid period length : choose in *Y, *M, *D."
567    IGCM_debug_Verif_Exit ;;
568  esac
569
570  IGCM_debug_PopStack "IGCM_config_DaysInPeriodLength"
571}
572
573#===================================
574function IGCM_config_DateCoherency
575{
576  IGCM_debug_PushStack "IGCM_config_DateCoherency"
577
578  echo
579  IGCM_debug_Print 1 "IGCM_config_DateCoherency"
580  echo
581
582  typeset Length VerifiedPeriodDateBegin VerifiedPeriodDateEnd
583
584  # check coherency between (PeriodDateBegin, PeriodDateEnd) and (DateBegin, CumulPeriod, PeriodLength)
585  # DateBegin + CumulPeriod*PeriodLength = PeriodDateBegin
586  echo
587
588  case ${config_UserChoices_PeriodLength} in
589  *Y|*y)
590    Length=$( IGCM_date_DaysInCurrentPeriod ${DateBegin} $(( ${CumulPeriod} * ${PeriodLengthInYears} ))Y )
591    ;;
592  *M|*m)
593    Length=$( IGCM_date_DaysInCurrentPeriod ${DateBegin} $(( ${CumulPeriod} * ${PeriodLengthInMonths} ))M )
594    ;;
595  *D|*d)
596    Length=$( IGCM_date_DaysInCurrentPeriod ${DateBegin} $(( ${CumulPeriod} * ${PeriodLengthInDays} ))D )
597    ;;
598  esac
599  VerifiedPeriodDateEnd=$( IGCM_date_AddDaysToGregorianDate ${DateBegin} ${Length}-1 )
600
601  if [ ${VerifiedPeriodDateEnd} != ${PeriodDateEnd} ] ; then
602    IGCM_debug_Print 1 "From run.card PeriodDateEnd is not consistent with DateBegin and CumulPeriod."
603    IGCM_debug_Print 1 "We have DateBegin = ${DateBegin}"
604    IGCM_debug_Print 1 "We have CumulPeriod = ${CumulPeriod}"
605    IGCM_debug_Print 1 "We have PeriodDateEnd = ${PeriodDateEnd}"
606    IGCM_debug_Print 1 "We have VerifiedPeriodDateEnd = ${VerifiedPeriodDateEnd}"
607    IGCM_debug_Print 1 "You must have change run.card in an inconsistent way."
608
609    IGCM_debug_Exit "STOP here to avoid further issues."
610  fi
611
612  # PeriodDateBegin + PeriodLength = PeriodDateEnd
613  VerifiedPeriodDateBegin=$( IGCM_date_AddDaysToGregorianDate ${VerifiedPeriodDateEnd} $(( ${PeriodLengthInDays} * -1 )) )
614
615  IGCM_debug_PopStack "IGCM_config_DateCoherency"
616}
617
618#===================================
619function IGCM_config_StateCheck
620{
621  IGCM_debug_PushStack "IGCM_config_StateCheck"
622
623    #Test state of run in run.card
624    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodState
625
626    if [ ${run_Configuration_PeriodState} = "Fatal" ] ; then
627      echo
628      IGCM_debug_Print 1 "!! Error in run.card with PeriodState : " ${run_Configuration_PeriodState} "!!"
629      IGCM_debug_Print 1 "Check the overall status of your simulation by visiting this page:"
630      IGCM_debug_Print 1 "https://hermes.ipsl.upmc.fr/static/simulation.detail.html?uid=${simuid}"
631      IGCM_debug_Print 1 "Then try running ${libIGCM}/clean_PeriodLenght.job to clean latest failed period"
632      IGCM_debug_Print 1 "Or try running ${libIGCM}/clean_latestPackperiod.job to clean lastest pack period."
633      IGCM_debug_Print 1 "Or use ${libIGCM}/purge_simulation.job to delete the full simulation."
634      IGCM_debug_Exit
635    elif [ $( echo ${run_Configuration_PeriodState} | grep Fatal | wc -l ) -eq 1 ] ; then
636      echo
637      IGCM_debug_Print 1 "!! Error in run.card with PeriodState : " ${run_Configuration_PeriodState} "!!"
638      IGCM_debug_Print 1 "Compute jobs has been stop because at least the above mentionned post-processing jobs fails."
639      IGCM_debug_Print 1 "Check post-processing jobs carefully by visiting this page:"
640      IGCM_debug_Print 1 "https://hermes.ipsl.upmc.fr/static/simulation.detail.html?uid=${simuid}"
641      IGCM_debug_Print 1 "Please visit that page to see how to fix issues:"
642      IGCM_debug_Print 1 "https://forge.ipsl.jussieu.fr/igcmg_doc/wiki/DocGmonitor"
643      IGCM_debug_Print 1 "Then try running ${libIGCM}/clean_PeriodLenght.job to clean latest failed period"
644      IGCM_debug_Print 1 "Or try running ${libIGCM}/clean_latestPackperiod.job to clean latest pack period."
645      IGCM_debug_Print 1 "Or use ${libIGCM}/purge_simulation.job to delete the full simulation."
646      IGCM_debug_Exit
647    fi
648
649  IGCM_debug_PopStack "IGCM_config_StateCheck"
650}
651
652#===================================
653function IGCM_config_Check
654{
655  IGCM_debug_PushStack "IGCM_config_Check"
656
657  # If one of the following modulo is not zero :
658  # we will issue an error then explain and exit in
659  # AA_job IGCM_debug_Verif_Exit call before binary submission
660
661  echo
662  IGCM_debug_Print 1 "IGCM_config_Check"
663  echo
664
665  typeset i
666
667  # Check RebuildFrequency against key frequencies : PeriodLength ; PackFrequency ; TimeSeriesFrequency ; SeasonalFrequency
668  if ( [ ! X${config_Post_RebuildFrequency} = X${NULL_STR} ] && [ ! X${config_Post_RebuildFrequency} = XNONE ] ) ; then
669    AsynchronousRebuild=true
670    IGCM_debug_Print 1 "Asynchronous rebuild has been activated."
671    echo
672    # modulo (RebuildFrequency and PeriodLength/TimeSeriesFrequency/SeasonalFrequency) must be zero
673    IGCM_debug_Print 1 "Check coherence between RebuildFrequency and PeriodLength"
674    IGCM_post_CheckModuloFrequency config_Post_RebuildFrequency config_UserChoices_PeriodLength
675    IGCM_debug_Print 1 "Check coherence between PackFrequency and RebuildFrequency"
676    IGCM_post_CheckModuloFrequency config_Post_PackFrequency config_Post_RebuildFrequency
677    IGCM_debug_Print 1 "Check coherence between TimeSeriesFrequency and RebuildFrequency"
678    IGCM_post_CheckModuloFrequency config_Post_TimeSeriesFrequency config_Post_RebuildFrequency
679    IGCM_debug_Print 1 "Check coherence between SeasonalFrequency and RebuildFrequency"
680    IGCM_post_CheckModuloFrequency config_Post_SeasonalFrequency config_Post_RebuildFrequency
681  else
682    AsynchronousRebuild=false
683    IGCM_debug_Print 1 "Asynchronous rebuild has not been activated"
684    IGCM_debug_Print 1 "Proceed with standard post-treatment pathway"
685    echo
686    #modulo (PeriodLength and TimeSeriesFrequency/SeasonalFrequency) must be zero
687    IGCM_debug_Print 1 "Check coherence between TimeSeriesFrequency and PeriodLength"
688    IGCM_post_CheckModuloFrequency config_Post_TimeSeriesFrequency config_UserChoices_PeriodLength
689    IGCM_debug_Print 1 "Check coherence between SeasonalFrequency and PeriodLength"
690    IGCM_post_CheckModuloFrequency config_Post_SeasonalFrequency   config_UserChoices_PeriodLength
691  fi
692
693  # Check PackFrequency against other key frequencies
694  # Modulo (PackFrequency and TimeSeriesFrequency/SeasonalFrequency and PeriodLenght) must be zero
695  if ( [ ! X${config_Post_PackFrequency} = X${NULL_STR} ] && [ ! X${config_Post_PackFrequency} = XNONE ] ) ; then
696    Pack=true
697    #
698    IGCM_debug_Print 1 "Check coherence between PackFrequency and PeriodLength"
699    IGCM_post_CheckModuloFrequency config_Post_PackFrequency config_UserChoices_PeriodLength
700    IGCM_debug_Print 1 "Check coherence between TimeSeriesFrequency and PackFrequency"
701    IGCM_post_CheckModuloFrequency config_Post_TimeSeriesFrequency config_Post_PackFrequency
702    IGCM_debug_Print 1 "Check coherence between SeasonalFrequency and PackFrequency"
703    IGCM_post_CheckModuloFrequency config_Post_SeasonalFrequency config_Post_PackFrequency
704  else
705    Pack=false
706  fi
707  # Loop over components
708  for comp in ${config_ListOfComponents[*]} ; do
709   
710    IGCM_card_DefineArrayFromOption ${SUBMIT_DIR}/config.card ListOfComponents ${comp}
711    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
712    card=${SUBMIT_DIR}/COMP/${compname}.card
713    IGCM_card_DefineArrayFromOption ${card} OutputFiles List
714    ListFilesName=${compname}_OutputFiles_List
715    eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
716    if [ X${FileName0} != X${NULL_STR} ] ; then
717        eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
718                   
719        (( i=0 ))
720        until [ $i -ge $NbFiles ]; do
721            (( i_ = i+3 ))
722            eval Testvar_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
723            eval Testvar=${Testvar_}
724            if [[ ${Testvar} =~ [0-9][DMY]$ ]] ; then
725                IGCM_debug_Print 1 "Check coherence between PackFrequency and specific pack frequencies"
726                DaysTemp1=$( IGCM_date_DaysInPreviousPeriod ${DateBegin} ${Testvar} )
727                DaysTemp2=$( IGCM_date_DaysInPreviousPeriod ${DateBegin} ${config_Post_PackFrequency} )
728                if [ ${DaysTemp2} -lt ${DaysTemp1} ] ; then
729                    IGCM_debug_Print 1 "PackFrequency in config.card is smaller than the specific pack frequency"
730                    IGCM_debug_Print 1 "we found in ${compname}.card"
731                    IGCM_debug_Exit "ERROR You have to modify the PackFrequency in config.card to be always greater or equal to specific pack frequencies defined in comp.card"
732                    IGCM_debug_Verif_Exit
733                fi
734                ((i = i+4))
735            else
736                ((i = i+3))
737            fi
738        done
739    fi
740  done
741
742  # modulo (TimeSeriesFrequency and all Chunck2D) must be zero
743  NbJob=${#CHUNCK2D_SIZE[@]}
744  i=0
745  until [ $i -ge $NbJob ]; do
746    value=${CHUNCK2D_SIZE[${i}]}
747    IGCM_debug_Print 1 "Check coherence between ${CHUNCK2D_NAME[${i}]} Chunck2D frequency and TimeSeriesFrequency"
748    IGCM_post_CheckModuloFrequency value config_Post_TimeSeriesFrequency
749    case ${value} in
750    *Y|*y) ;;
751    *)
752      IGCM_debug_Print 1 "All ChunckJob2D frequency must be expressed in year *Y|*y in comp.card"
753      IGCM_debug_Exit "This will stop the job" ;;
754    esac
755    (( i=i+1 ))
756  done
757
758  # modulo (TimeSeriesFrequency and all Chunck3D) must be zero
759  NbJob=${#CHUNCK3D_SIZE[@]}
760  i=0
761  until [ $i -ge $NbJob ]; do
762    value=${CHUNCK3D_SIZE[${i}]}
763    IGCM_debug_Print 1 "Check coherence between ${CHUNCK3D_NAME[${i}]} Chunck3D frequency and TimeSeriesFrequency"
764    IGCM_post_CheckModuloFrequency value config_Post_TimeSeriesFrequency
765    case ${value} in
766    *Y|*y) ;;
767    *)
768      IGCM_debug_Print 1 "All ChunckJob3D frequency must be expressed in year *Y|*y in comp.card"
769      IGCM_debug_Exit "This will stop the job" ;;
770    esac
771    (( i=i+1 ))
772  done
773
774  # check to be sure there is enough space on temporary filesystems to run
775  echo
776  IGCM_debug_Print 1 "Check if there is enough space on temporary filesystem"
777  IGCM_sys_check_quota
778
779  # check to be sure that RUN_DIR_PATH, that will be removed is not pointing to an important directory
780  echo
781  IGCM_debug_Print 1 "Check where RUN_DIR_PATH variable is pointing to"
782  IGCM_sys_check_path
783
784
785  IGCM_debug_PopStack "IGCM_config_Check"
786}
787
788#===================================
789function IGCM_config_ConfigureExecution
790{
791  IGCM_debug_PushStack " IGCM_config_ConfigureExecution"
792
793  #echo
794  IGCM_debug_Print 1 " IGCM_config_ConfigureExecution"
795  #echo
796
797  typeset ExeNameIn ExeNameFirst CompNameFirst configCardPath comp i
798  typeset tempvar tempvarMPI tempvarNOD NbElts NbExec
799
800  # config.card path
801  configCardPath=$1
802
803  coreNumber=0
804  mpiTasks=0
805  openMPthreads=0
806  NbExec=0
807
808  OK_PARA_MPI=false
809  OK_PARA_OMP=false
810  OK_PARA_NOD=false
811  OK_PARA_MPMD=false
812
813  for comp in ${config_ListOfComponents[*]} ; do
814
815    # Manage component executable
816    IGCM_card_DefineArrayFromOption ${configCardPath} Executable ${comp}
817
818    eval ExeNameIn=\${config_Executable_${comp}[0]}
819
820    # NO order in config.card for parallelized values !
821    # just use suffix : MPI , OMP and NOD (for number of NODes.)
822
823    # NOD is the number of NODes allocated
824    eval ${comp}_PROC_NOD=0
825
826    # MPI is the number of MPI processus per nodes
827    eval ${comp}_PROC_MPI=0
828
829    # OMP is the number of OpenMP threads per MPI processus
830    eval ${comp}_PROC_OMP=0
831
832    # DEP is the factor to increase the number of cores per process
833    eval ${comp}_PROC_DEP=0
834
835    # DEDICATED is the flag to activate the use of dedicated node for XIOS server only
836    eval ${comp}_OK_DEDICATED=0
837
838    # Only if we really have an executable for the component :
839    if ( [ "X${ExeNameIn}" != X\"\" ] && [ "X${ExeNameIn}" != "Xinca.dat" ] ) ; then
840
841      IGCM_debug_Print 1 ${comp}
842
843      # Keep the first executable found and the first CompName
844      eval ExeNameFirst=${ExeNameIn}
845      CompNameFirst=${comp}
846
847      # Are we a second executable?
848      (( NbExec = NbExec + 1 ))
849
850      # set 1 MPI task, 1 OpenMP thread and 1 node as default
851      eval ${comp}_PROC_MPI=1
852      eval ${comp}_PROC_OMP=1
853      eval ${comp}_PROC_NOD=1
854      eval ${comp}_PROC_DEP=1
855
856      eval NbElts=\${#config_Executable_${comp}[@]}
857      if [ ${NbElts} -gt 2 ] ; then
858        #
859        # CURRENT METHOD TO SPECIFY MPI AND OMP RESSOURCES
860        #
861        i=2
862        while [ ${i} -lt ${NbElts} ] ; do
863          eval tempvar=\${config_Executable_${comp}[${i}]}
864          IGCM_debug_Print 2 ${tempvar}
865
866          if [ X${tempvar} = X ] ; then
867            IGCM_debug_Print 2 "Error reading MPI/OMP parameters !!!"
868            IGCM_debug_Exit "Check your config.card. Exit now"
869            IGCM_debug_Verif_Exit
870          fi
871
872          case ${tempvar} in
873          *[mM][pP][iI]*)
874            # Read MPI parameter for composante
875            eval ${comp}_PROC_MPI=$( echo ${tempvar} | tr '[a-z]' '[A-Z]' | sed -e "s/MPI//" )
876            OK_PARA_MPI=true;;
877          *[oO][mM][pP]*)
878            # Read OMP parameter for composante
879            eval ${comp}_PROC_OMP=$( echo ${tempvar} | tr '[a-z]' '[A-Z]' | sed -e "s/OMP//" )
880            ;;
881          *[nN][oO][dD]*)
882            # Read NOD (NumBer of Nodes) parameter for composante
883            eval ${comp}_PROC_NOD=$( echo ${tempvar} | tr '[a-z]' '[A-Z]' | sed -e "s/NOD//" )
884            OK_PARA_NOD=true
885            OK_PARA_MPI=true
886            ;;
887            *[dD][eE][pP]*)
888            # Read DEP parameter for composante
889            eval ${comp}_PROC_DEP=$( echo ${tempvar} | tr '[a-z]' '[A-Z]' | sed -e "s/DEP//" )
890            ;;
891            *[dD][eE][dD][iI][cC][aA][tT][eE][dD]*)
892            # Read DEDICATED parameter for composante
893            eval ${comp}_OK_DEDICATED=1
894          esac
895          (( i = i + 1 ))
896        done
897      else
898        #
899        # BACKWARD COMPATIBILITY NOT SUPPORTED ANYMORE
900        #
901        IGCM_debug_Exit "You are using a deprecated ressources specification mechanism in your config.card"
902        IGCM_debug_Exit "Please check : https://forge.ipsl.jussieu.fr/igcmg_doc/wiki/DocEsetup#ThesectionExecutable"
903        IGCM_debug_Exit "Please modify ${configCardPath}"
904        exit
905      fi
906      if [ ${comp}_PROC_NOD -gt 1 ] ; then
907            if ( [ ${comp}_PROC_MPI -gt 1 ] && [ ${comp}_PROC_OMP -gt 1 ] ) ; then
908              IGCM_debug_Print 2 "Error using MPI/OMP/NOD parameters !!!"
909              IGCM_debug_Exit "It is not allowed to use MPI and OMP and NOD parameters for the same component"
910              IGCM_debug_Exit "Check your config.card. Exit now"
911              IGCM_debug_Verif_Exit
912            fi
913            if [ "${comp}" != "IOS" ] ; then
914              IGCM_debug_Print 2 "Error using NOD parameter !!!"
915              IGCM_debug_Exit "NOD parameter is only available for IOS component "
916              IGCM_debug_Exit "Check your config.card. Exit now"
917              IGCM_debug_Verif_Exit
918            fi
919      fi
920      if ( [ ${comp}_OK_DEDICATED -eq 1 ] && [ "${comp}" != "IOS" ] ) ; then
921            IGCM_debug_Print 2 "Error using DEDICATED parameter !!!"
922            IGCM_debug_Exit "DEDICATED parameter is only available for IOS component "
923            IGCM_debug_Exit "Check your config.card. Exit now"
924            IGCM_debug_Verif_Exit
925      fi
926
927      eval tempvarMPI=\${${comp}_PROC_MPI}
928      eval tempvarNOD=\${${comp}_PROC_NOD}
929      eval tempvarOMP=\${${comp}_PROC_OMP}
930      eval tempvarDEP=\${${comp}_PROC_DEP}
931
932      # set OMP mode if more than 1 OMP thread.
933      [ ${tempvarOMP} -ge 2 ] && OK_PARA_OMP=true
934
935      # Number of OMP threads
936      [ ${openMPthreads} -lt ${tempvarOMP} ] && openMPthreads=${tempvarOMP}
937
938      # SUM UP NUMBER OF CORES
939      if [ ${comp}_PROC_NOD -gt 1 ] ; then 
940          (( coreNumber = coreNumber + tempvarNOD * NB_CORE_PER_NODE ))
941      else
942          (( coreNumber = coreNumber + tempvarMPI * tempvarNOD * tempvarOMP * tempvarDEP ))
943      fi
944      # SUM UP NUMBER OF MPI TASKS
945      (( mpiTasks = mpiTasks + tempvarMPI * tempvarNOD ))
946    fi
947  done
948
949  # MANDATORY FOR THE OPA9.DRIVER. USED TO EDIT OPA NAMELIST
950  # WE SHOULD PLANIFY NUM_PROC_??? DEPRECATION
951  NUM_PROC_CPL=${CPL_PROC_MPI}
952  NUM_PROC_OCE=${OCE_PROC_MPI}
953  NUM_PROC_ATM=${ATM_PROC_MPI}
954
955  # set MPMD mode if more than 2 executable names.
956  [ ${NbExec} -ge 2 ] && OK_PARA_MPMD=true 
957
958  # Define the execution type we are running in
959  if ( ${OK_PARA_MPMD} ) ; then
960    if ( ${OK_PARA_MPI} ) ; then
961      # MPMD always implies MPI
962      executionType=1
963    fi
964    if ( ${OK_PARA_OMP} ) ; then
965      # MPMD + MPI/OMP
966      executionType=2
967    fi
968  else
969    if ( ( ${OK_PARA_MPI} ) && ( ${OK_PARA_OMP} ) ) ; then
970      # SPMD + MPI/OMP
971      executionType=3
972    elif ( ( ${OK_PARA_MPI} ) && ( ! ${OK_PARA_OMP} ) ) ; then
973      # SPMD + MPI only
974      executionType=4
975    elif ( ( ! ${OK_PARA_MPI} ) && ( ${OK_PARA_OMP} ) ) ; then
976      # SPMD + OMP only
977      executionType=5
978    elif ( ( ! ${OK_PARA_MPI} ) && ( ! ${OK_PARA_OMP} ) ) ; then
979      # SEQUENTIAL THEN
980      executionType=6
981      coreNumber=1
982    fi
983  fi
984
985  IGCM_debug_Print 1 "MPI/OMP treatment coreNumber = ${coreNumber}"
986  IGCM_debug_Print 1 "MPI/OMP treatment mpiTasks = ${mpiTasks}"
987  IGCM_debug_Print 1 "MPI/OMP treatment openMPthreads = ${openMPthreads}"
988  IGCM_debug_Print 1 "MPI/OMP treatment executionType = ${executionType}"
989
990  IGCM_debug_PopStack "IGCM_config_ConfigureExecution"
991}
992
993#===================================
994function IGCM_config_PeriodStart
995{
996  IGCM_debug_PushStack "IGCM_config_PeriodStart"
997
998  echo
999  IGCM_debug_Print 1 "IGCM_config_PeriodStart"
1000  echo
1001
1002  if ( ${FirstInitialize} ) ; then
1003    #================================================#
1004    #         Initialize date/period information     #
1005    #================================================#
1006
1007    IGCM_date_GetYearMonthDay ${DateBegin} year month day
1008    IGCM_config_DaysInPeriodLength
1009
1010    PeriodDateBegin=${DateBegin}
1011    PeriodDateEnd=$( IGCM_date_AddDaysToGregorianDate ${DateBegin} $(( ${PeriodLengthInDays} - 1 )) )
1012    CumulPeriod=1
1013
1014    #=================================================#
1015    #              Write updated run.card             #
1016    #=================================================#
1017
1018    #Correct run.card Configuration for this period
1019    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin ${PeriodDateBegin}
1020    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd ${PeriodDateEnd}
1021    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod ${CumulPeriod}
1022    if [ X$( grep "SubmitPath" ${SUBMIT_DIR}/run.card ) != X ] ; then
1023      IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration SubmitPath ${SUBMIT_DIR}
1024    fi
1025
1026    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Running"
1027
1028  else
1029    #================================================#
1030    #         The file run.card allready exist       #
1031    #================================================#
1032
1033    # Test state of run in run.card. Will schedule an exit if another process setted it to "Fatal"
1034    IGCM_config_StateCheck
1035    # And EXIT if not OK
1036    IGCM_debug_Verif_Exit
1037
1038    #===================================#
1039    #        Read updated run.card      #
1040    #===================================#
1041
1042    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin
1043    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd
1044    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod
1045
1046    PeriodDateBegin=$( IGCM_date_ConvertFormatToGregorian ${run_Configuration_PeriodDateBegin} )
1047    PeriodDateEnd=$( IGCM_date_ConvertFormatToGregorian ${run_Configuration_PeriodDateEnd} )
1048    CumulPeriod=${run_Configuration_CumulPeriod}
1049
1050    LastPeriodDateEnd=$( IGCM_date_AddDaysToGregorianDate $( IGCM_date_ConvertFormatToGregorian ${PeriodDateBegin} ) -1 )
1051
1052    if [ ${Period} = 1 ]; then
1053      # save last Job output and current run.card
1054      typeset Potential
1055      IGCM_sys_Cd ${SUBMIT_DIR}
1056      #
1057      IGCM_debug_Print 2 "Save previous ksh job output"
1058      for Potential in $( ls ${Script_Output_Prefix}_${config_UserChoices_JobName}.[0-9][0-9][0-9][0-9][0-9][0-9] ) ; do
1059        if [ X${Pack} = Xtrue ] ; then
1060          ( IGCM_sys_TestFileBuffer  ${R_BUF_KSH}/${Potential} ) || IGCM_sys_Cp ${Potential} ${R_BUF_KSH}/${Potential}.$$
1061        else
1062          ( IGCM_sys_TestFileArchive ${R_OUT_KSH}/${Potential} ) || IGCM_sys_Put_Out ${Potential} ${R_OUT_KSH}/${Potential}.$$ NOMOVE
1063          IGCM_debug_Print 1 "Save of previous ksh job output is not done for Pack=false"
1064        fi
1065      done
1066
1067      #
1068      IGCM_debug_Print 2 "Save current run.card"
1069      IGCM_card_CheckConflict run.card
1070
1071      if [ X${Pack} = Xtrue ] ; then
1072        IGCM_sys_Cp ${SUBMIT_DIR}/run.card ${R_BUF_KSH}/run.card
1073      else
1074        IGCM_sys_Put_Out ${SUBMIT_DIR}/run.card ${R_OUT_KSH}/run.card NOMOVE
1075        IGCM_debug_Print 1 "Save of run.card is not done for Pack=false"
1076      fi
1077      #
1078      IGCM_sys_Cd ${RUN_DIR}
1079    else
1080      unset FileToBeDeleted
1081    fi
1082
1083    # Determine number of day(s) in PeriodLength
1084    IGCM_date_GetYearMonthDay $PeriodDateBegin year month day
1085    IGCM_config_DaysInPeriodLength
1086
1087    # Check coherency between (PeriodDateBegin, PeriodDateEnd) and (DateBegin, CumulPeriod, PeriodLength)
1088    IGCM_config_DateCoherency
1089    # And EXIT if not OK
1090    IGCM_debug_Verif_Exit
1091
1092    # Test state of run in run.card. Will schedule an exit if another process setted it to "Fatal"
1093    IGCM_config_StateCheck
1094    # And EXIT if not OK
1095    IGCM_debug_Verif_Exit
1096
1097    # We can say we are "Running" now.
1098    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Running"
1099  fi
1100
1101  # BEGIN: SHOULD GO IN A FUNCTION FROM libIGCM_date.ksh
1102  # Compute year_m1 and year_p1 (year minus 1Y and year plus 1Y)
1103  year_m1=$(( year - 1 ))
1104  year_p1=$(( year + 1 ))
1105  # Compute month_m1 (month minus 1M)
1106  # Compute yyyymm_m1 (yyyymm minus 1M)
1107  month_m1=$(( 10#${month} - 1 ))
1108  if [ ${month_m1} = 0 ]; then
1109    month_m1=12
1110    yyyymm_m1=${year_m1}12
1111  elif [ ${month_m1} -le 9 ]; then
1112    month_m1=0${month_m1}
1113    yyyymm_m1=${year}${month_m1}
1114  else
1115    yyyymm_m1=${year}${month_m1}
1116  fi
1117  # Compute month_p1 (month plus 1M)
1118  # Compute yyyymm_p1 (yyyymm plus 1M)
1119  month_p1=$(( 10#${month} + 1 ))
1120  if [ ${month_p1} = 13 ]; then
1121    month_p1=01
1122    yyyymm_p1=${year_p1}01
1123  elif [ ${month_p1} -le 9 ]; then
1124    month_p1=0${month_p1}
1125    yyyymm_p1=${year}${month_p1}
1126  else
1127    yyyymm_p1=${year}${month_p1}
1128  fi
1129
1130
1131  #===================================================================#
1132  # Calculate CyclicYear to be used for looping over a given forcing  #
1133  # period. Add CyclicBegin and CyclicEnd in config.card UserChoices. #
1134  #===================================================================#
1135
1136  # To use the variable CyclicYear, one must add in config.card CyclicBegin and CyclicEnd.
1137  # CyclicBegin is the first year in the cycle. CyclicEnd is the last year included in the cycle.
1138  if ( [ ! X${config_UserChoices_CyclicBegin} = X ] && [ ! X${config_UserChoices_CyclicEnd} = X ] ) ; then
1139    CycleNb=$(( ${config_UserChoices_CyclicEnd} - ${config_UserChoices_CyclicBegin} + 1 ))
1140    #CyclicYear_p1=  #NOTDEFINED
1141 
1142    # For current year
1143    yeartmp=$year
1144    diffy=$(( $yeartmp - ${config_UserChoices_CyclicBegin} ))
1145    while [ $diffy -lt 0 ] ; do
1146      yeartmp=$(( ${yeartmp} + ${CycleNb} ))
1147      diffy=$(( $yeartmp - ${config_UserChoices_CyclicBegin} ))
1148    done
1149    CyclicYear=$(( ( ${diffy} % ${CycleNb} ) + ${config_UserChoices_CyclicBegin} ))
1150
1151    # For next coming year
1152    CyclicYear_p1=$(( CyclicYear + 1 ))
1153
1154    # For previous year
1155    CyclicYear_m1=$(( CyclicYear - 1 ))
1156
1157    IGCM_debug_Print 1 "CyclicYear   = ${CyclicYear}, current year=$year"
1158    IGCM_debug_Print 1 "CyclicYear_p1 = ${CyclicYear_p1}, CyclicYear_m1 = ${CyclicYear_m1} "
1159  else
1160    CyclicYear="ERROR_CyclicYear_Variable_Not_Defined"
1161    CyclicYear_p1="ERROR_CyclicYear_p1_Variable_Not_Defined"
1162    IGCM_debug_Print 1 "CyclicYear wont be use without adding CyclicBegin and CyclicEnd in config.card"
1163  fi
1164
1165  # END: SHOULD GO IN A FUNCTION FROM libIGCM_date.ksh
1166
1167  #===================================================================#
1168  # Prepare variables available for ${COMP}.card and ${COMP}.driver   #
1169  #             But available to any son functions                    #
1170  #===================================================================#
1171
1172  # Period Length In Days between DateBegin and DateCurrent (at end of period == PeriodDateEnd !)
1173  (( SimulationLengthInDays = $( IGCM_date_DaysBetweenGregorianDate ${PeriodDateEnd} ${DateBegin} ) + 1 ))
1174
1175  # Debug Print :
1176  echo
1177  IGCM_debug_Print 1 "IGCM_config_PeriodStart : Before Execution"
1178  IGCM_debug_Print 1 "Year of simulation      : ${year}"
1179  IGCM_debug_Print 1 "Month of simulation     : ${month}"
1180  IGCM_debug_Print 1 "PeriodLengthInDays      : ${PeriodLengthInDays}"
1181  IGCM_debug_Print 1 "PeriodDateBegin         : ${PeriodDateBegin}"
1182  IGCM_debug_Print 1 "PeriodDateEnd           : ${PeriodDateEnd}"
1183  IGCM_debug_Print 1 "SimulationLengthInDays  : ${SimulationLengthInDays}"
1184  IGCM_debug_Print 1 "ExperienceLengthInDays  : ${ExperienceLengthInDays}"
1185
1186  #================================================================#
1187  #         Prepare variables available for comp_finalyze          #
1188  #================================================================#
1189
1190  # Period for save files
1191  DatesPeriod=${PeriodDateBegin}_${PeriodDateEnd}
1192
1193  # Prefix for save files of this period
1194  PREFIX=${config_UserChoices_JobName}_${DatesPeriod}
1195
1196  # List of files that will be deleted in RUN_DIR after run
1197  [ -f stack ] && FileToBeDeleted[0]="stack"
1198
1199  # Test if the same run as already been saved :
1200  if [ X${JobType} = XRUN ] ; then
1201    if [ ${DRYRUN} -le 0 ] ; then
1202      if ( IGCM_sys_TestFileBuffer ${R_BUF_KSH}/${PREFIX}_${Exe_Output} ) ; then
1203        IGCM_debug_Exit "IGCM_config_PeriodStart" "You are currently re-running an old job."
1204        IGCM_debug_Print 1 "Because of readonly permissions, you can't re-run a job when saved files"
1205        IGCM_debug_Print 1 " are still in the ARCHIVE directory. You must deleted those files, or "
1206        IGCM_debug_Print 1 " the whole ${R_SAVE} tree. See different clean_*.job in ${libIGCM} directory."
1207        IGCM_debug_Print 1 " This exit has been initiated because at least ${R_BUF_KSH}/${PREFIX}_${Exe_Output} exists."
1208        IGCM_debug_Verif_Exit
1209      fi
1210    fi
1211  else
1212    if ( IGCM_sys_TestFileBuffer ${R_BUF_KSH}/${PREFIX}_${Exe_Output} ) ; then
1213      IGCM_debug_Print 1 "IGCM_config_PeriodStart" "RErun an old job. Allowed in DEBUG or DEV mode."
1214    fi
1215  fi
1216
1217  #================================================================#
1218  #       Prepare variables available for binary execution         #
1219  #       Call function for creation of run script                 #
1220  #       Only done once per job                                   #
1221  #================================================================#
1222
1223  if [ ${Period} -eq 1 ]; then
1224    # Define the execution context (MPMD, SPMD, MPI/OMP ...)
1225    IGCM_config_ConfigureExecution ${SUBMIT_DIR}/config.card
1226    # Create the execution script for the current context
1227    IGCM_sys_build_execution_scripts
1228  fi
1229
1230  ExecutionFail=false
1231
1232  # Update the rabbitMQ queue
1233  IGCM_debug_BigBro_Update
1234
1235  IGCM_debug_PopStack "IGCM_config_PeriodStart"
1236}
1237
1238#===================================
1239function IGCM_config_SaveSourceModifications
1240{
1241  IGCM_debug_PushStack "IGCM_config_SaveSourceModifications"
1242
1243  typeset ExeOutDateMax listVarEnv
1244  ExeOutDateMax=$1
1245
1246  listVarEnv="ExeOutDateMax,R_OUT_EXE,PREFIX,SUBMIT_DIR"
1247  IGCM_sys_RshMaster "\
1248    . ${libIGCM}/libIGCM_sys/libIGCM_sys.ksh; \
1249    export ExeOutDateMax=${ExeOutDateMax};\
1250    export R_OUT_EXE=${R_OUT_EXE};\
1251    export PREFIX=${PREFIX};\
1252    export SUBMIT_DIR=${SUBMIT_DIR};\
1253    export listVarEnv=${listVarEnv};\
1254    Script_Output=out_SaveSourceModifications;\
1255    IGCM_sys_Qsub ${libIGCM}/SaveSourceModifications.job ${ExeOutDateMax} ${R_OUT_EXE} ${PREFIX} ${SUBMIT_DIR}"
1256
1257  IGCM_debug_PopStack "IGCM_config_SaveSourceModifications"
1258}
1259
1260#===================================
1261function IGCM_config_PeriodEnd
1262{
1263  IGCM_debug_PushStack "IGCM_config_PeriodEnd"
1264
1265  echo
1266  IGCM_debug_Print 1 "IGCM_config_PeriodEnd"
1267  echo
1268
1269  if [ ${DRYRUN} -le 1 ] ; then
1270
1271    IGCM_debug_Print 1 "Check components binary : size and creation date"
1272
1273    typeset LS_comp LS_bin ExeDate ExeCpuLog NextExeSize LastCompExeSize
1274    typeset comp i
1275    typeset ExeNameIn ExeNameOut UpdateExe ExeSecDateMax
1276
1277    #==================================#
1278    #        Get last Exe Size         #
1279    #==================================#
1280
1281    (( i=0 ))
1282    if ( ${FirstInitialize} ) ; then
1283      run_Log_LastExeSize=""
1284      for comp in ${config_ListOfComponents[*]} ; do
1285        run_Log_LastExeSize[$i]=0
1286        (( i=i+1 ))
1287      done
1288    else
1289      IGCM_card_DefineArrayFromOption ${SUBMIT_DIR}/run.card Log LastExeSize
1290    fi
1291    #==================================#
1292    #         And Build ExeDate        #
1293    #==================================#
1294
1295    # 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
1296    # 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")
1297    # 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
1298    ExeDate=""
1299    NextExeSize="( "
1300    (( i=0 ))
1301    UpdateExe=false
1302    (( ExeSecDateMax = 0 ))
1303    for comp in ${config_ListOfComponents[*]} ; do
1304
1305      IGCM_debug_Print 3 ${comp}
1306
1307      eval ExeNameIn=\${config_Executable_${comp}[0]}
1308      eval ExeNameOut=\${config_Executable_${comp}[1]}
1309      # Only if we really have an executable for the component :
1310      if [ X${ExeNameIn} = X\"\" ] ; then
1311        # If there is no exe file for this component
1312        (( ExeSize=0 ))
1313      else
1314        eval ExeNameIn=${ExeNameIn}
1315        LS_bin=${R_EXE}/${ExeNameIn}
1316        IGCM_sys_FileSize ${LS_bin} ExeSize
1317
1318        set +A LS_comp -- $( LC_TIME=en_US ls -l ${LS_bin} )
1319        if [ X${ExeDate} = X ] ; then
1320          # First component exe date
1321          ExeDate=${comp}_${LS_comp[5]}_${LS_comp[6]}
1322        else
1323          ExeDate=${ExeDate}-${comp}_${LS_comp[5]}_${LS_comp[6]}
1324        fi
1325        ExeDate=${ExeDate}_${LS_comp[7]}
1326      fi
1327
1328      if [ ${i} -eq 0 ] ; then
1329        # First component
1330        NextExeSize="( "${ExeSize}
1331      else
1332        NextExeSize=${NextExeSize}", "${ExeSize}
1333      fi
1334      LastCompExeSize=${run_Log_LastExeSize[$i]}
1335      (( i=i+1 ))
1336
1337      if [ ${ExeSize} -ne ${LastCompExeSize} ] ; then
1338        if ( ${FirstInitialize} ) ; then
1339          IGCM_debug_Print 1 "Save first ${ExeNameIn} in ${R_OUT_EXE} !"
1340        else
1341          IGCM_debug_Print 1 "${ExeNameIn} has changed in ${R_EXE} !"
1342          IGCM_debug_Print 1 "Save latest ${ExeNameIn} in ${R_OUT_EXE} !"
1343          FileToBeDeleted[${#FileToBeDeleted[@]}]=${ExeNameOut}
1344        fi
1345        IGCM_sys_Put_Out ${ExeNameOut} ${R_OUT_EXE}/${PREFIX}_${ExeNameIn} rw
1346        UpdateExe=true
1347
1348        # SD : switch off for now
1349        #IGCM_sys_GetDate_FichWork ${LS_bin} ExeSecDate
1350        #if [ $ExeSecDateMax -lt $ExeSecDate ] ; then
1351        #  ExeSecDateMax=$ExeSecDate
1352        #fi
1353      fi
1354    done
1355
1356    # SD : switch off for now
1357    #if ( ${UpdateExe} ) ; then
1358    #  echo "Launch SaveSourceModifications."
1359    #  IGCM_config_SaveSourceModifications ${ExeSecDateMax}
1360    #fi
1361
1362    NextExeSize=${NextExeSize}" )"
1363    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Log LastExeSize "${NextExeSize}"
1364
1365    if [ ${DRYRUN} -le 1 ] ; then
1366      tail -1500 ${Exe_Output} > ${Exe_Output}_tail.txt
1367      ExeCpuLog=$( gawk -f ${libIGCM}/libIGCM_sys/IGCM_add_out.awk ${Exe_Output}_tail.txt )
1368      RET=$?
1369      if [ $RET -eq 0 ] ; then
1370        # ExeCpuLog variable contents 5 fields
1371        echo "${CumulPeriod} ${PeriodDateBegin} ${PeriodDateEnd} ${ExeCpuLog} ${ExeDate}" |   \
1372          gawk '{printf("# %11d | %15s | %15s | %19s | %19s | %15.5f | %15.5f | %15.5f | %s\n", \
1373            $1,$2,$3,$4,$5,$6,$7,$8,$9)}' >> ${SUBMIT_DIR}/run.card
1374      fi
1375      FileToBeDeleted[${#FileToBeDeleted[@]}]=${Exe_Output}_tail.txt
1376    fi
1377
1378  fi
1379
1380  #==================================#
1381  #         Save Job output          #
1382  #==================================#
1383  if [ X${Pack} = Xtrue ] ; then
1384    IGCM_sys_PutBuffer_Out ${Exe_Output} ${R_BUF_KSH}/${PREFIX}_${Exe_Output}
1385  else
1386    IGCM_sys_Put_Out ${Exe_Output} ${R_OUT_KSH}/${PREFIX}_${Exe_Output}
1387  fi
1388  FileToBeDeleted[${#FileToBeDeleted[@]}]=${Exe_Output}
1389
1390  # All was right ? no ? then we stop.
1391  IGCM_debug_Verif_Exit
1392
1393  # If all was OK, we can delete all files not necessary for next Job
1394  echo
1395  IGCM_debug_Print 1 "Files that will be deleted before next period-run : "
1396
1397  if [ ${DRYRUN} -le 2 ] ; then
1398    for f in ${FileToBeDeleted[@]} ; do [ -f ${f} ] && ls -la $f ; [ -f ${f} ] && rm -f $f ; done
1399  else
1400    echo ${FileToBeDeleted[@]}
1401  fi
1402
1403  # Send some accounting element to the user if CumulPeriod=3
1404  if [ ${CumulPeriod} -eq 3 ] ; then
1405    echo
1406    RealCpuTime=$( echo ${ExeCpuLog} | gawk '{print $3}' )
1407
1408    consumeHoursPerPeriod=$( echo "scale=6;${RealCpuTime}*${coreNumber}/3600" | bc )
1409
1410    consumeHoursPerWholeSimulation=$( echo "scale=6;${consumeHoursPerPeriod}/${PeriodLengthInDays}*${ExperienceLengthInDays}" | bc )
1411
1412    # Only continue if jobWarnaingDelay has been set in libIGCM_sys
1413    if [ ! X${jobWarningDelay} = X ] ; then
1414      recommendedNbPeriodsPerJob=$( echo "scale=6;${jobWarningDelay}/3600/${consumeHoursPerPeriod}*${coreNumber}" | bc )
1415      IGCM_debug_Print 1 "Send email containing some accounting information : "
1416      IGCM_sys_SendMail Accounting
1417    fi
1418  fi
1419
1420  #=================================================#
1421  #         Modification of libIGCM behaviour       #
1422  #=================================================#
1423
1424  # To use this function, one must copy libIGCM.card from ${libIGCM} directory
1425  # and put it in ${SUBMIT_DIR} directory. After modifications of ${SUBMIT_DIR}/libIGCM.card,
1426  # variables define inside [UserChanges] will be modified for next Period of libIGCM main loop.
1427  if [ -f ${SUBMIT_DIR}/libIGCM.card ] ; then
1428    echo
1429    echo "########################################################################"
1430    echo "!!!                 Modification of libIGCM behaviour                !!!"
1431    echo
1432
1433    IGCM_debug_Print 1 "DefineArrayFromOption  : libIGCM_UserChanges in libIGCM.card"
1434    IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/libIGCM.card UserChanges
1435    IGCM_debug_Print 2 "libIGCM_UserChanges" ${libIGCM_UserChanges[*]}
1436
1437    # Special treatments for libIGCM internals
1438    for option in ${libIGCM_UserChanges[*]} ; do
1439      IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/libIGCM.card UserChanges ${option}
1440
1441      echo "We will change : ${option}."
1442      eval echo "Previous value : " \${${option}}
1443      eval echo "Change to : " \${libIGCM_UserChanges_${option}}
1444
1445      eval ${option}=\${libIGCM_UserChanges_${option}}
1446
1447      case ${option} in
1448      config_UserChoices_DateEnd)
1449        IGCM_debug_PrintVariables 1 config_UserChoices_DateEnd
1450        DateEnd=$( IGCM_date_ConvertFormatToGregorian ${config_UserChoices_DateEnd} )
1451
1452        # Period Length In Days between DateBegin and DateEnd
1453        (( ExperienceLengthInDays=$( IGCM_date_DaysBetweenGregorianDate ${DateEnd} ${DateBegin} )  + 1 ))
1454        if [ ${ExperienceLengthInDays} -lt 0 ] ; then
1455          IGCM_debug_Print 1 "Problem with dates in libIGCM.card : ${DateEnd} < ${DateBegin} ! You must check that."
1456          IGCM_debug_Exit "IGCM_PeriodEnd have wrong dates."
1457          IGCM_debug_Verif_Exit
1458        fi
1459        ;;
1460      config_UserChoices_PeriodLength)
1461        IGCM_debug_Print 1  "Change config_UserChoices_PeriodLength=${config_UserChoices_PeriodLength}"
1462        ;;
1463      NbPeriodsPerJob)
1464        IGCM_debug_Print 1  "Loop in main Job with ${NbPeriodsPerJob} period(s)"
1465        ;;
1466      config_Post_RebuildFrequency)
1467        IGCM_debug_Print 1  "Change config_Post_RebuildFrequency=${config_Post_RebuildFrequency} : IGCM_post_Configure"
1468        IGCM_post_Configure
1469        ;;
1470      config_Post_TimeSeriesFrequency)
1471        IGCM_debug_Print 1  "Change config_Post_TimeSeriesFrequency = ${config_Post_TimeSeriesFrequency} : IGCM_post_Configure"
1472        IGCM_post_Configure
1473        ;;
1474      config_Post_SeasonalFrequency)
1475        IGCM_debug_Print 1  "Change config_Post_SeasonalFrequency = ${config_Post_SeasonalFrequency} : IGCM_post_Configure"
1476        IGCM_post_Configure
1477        ;;
1478      esac
1479    done
1480
1481    echo
1482    echo "########################################################################"
1483    echo
1484  fi
1485
1486  #=================================================#
1487  #         Determine next computed period          #
1488  #=================================================#
1489
1490  PeriodDateBegin=$( IGCM_date_AddDaysToGregorianDate ${PeriodDateEnd} 1 )
1491  IGCM_date_GetYearMonthDay $PeriodDateBegin year month day
1492  year_m1=$(( year - 1 ))
1493  year_p1=$(( year + 1 ))
1494  IGCM_config_DaysInPeriodLength
1495  PeriodDateEnd=$( IGCM_date_AddDaysToGregorianDate ${PeriodDateBegin} $(( ${PeriodLengthInDays} - 1 )) )
1496
1497  # Debug Print :
1498  echo
1499  IGCM_debug_Print 1 "IGCM_config_PeriodEnd : Preparing Next Execution"
1500  IGCM_debug_Print 1 "PeriodDateBegin       : ${PeriodDateBegin}"
1501  IGCM_debug_Print 1 "PeriodDateEnd         : ${PeriodDateEnd}"
1502  IGCM_debug_Print 1 "PeriodLengthInDays    : ${PeriodLengthInDays}"
1503
1504  PeriodDateBegin=$( IGCM_date_ConvertFormatToHuman ${PeriodDateBegin} )
1505  PeriodDateEnd=$( IGCM_date_ConvertFormatToHuman ${PeriodDateEnd} )
1506
1507  (( CumulPeriod = CumulPeriod + 1 ))
1508
1509  # Debug Print :
1510  echo
1511  IGCM_debug_Print 3 "PeriodDateBegin Human : ${PeriodDateBegin}"
1512  IGCM_debug_Print 3 "PeriodDateEnd Human   : ${PeriodDateEnd}"
1513  IGCM_debug_Print 3 "CumulPeriod           : ${CumulPeriod}"
1514
1515  #=================================================#
1516  #             Write updated run.card              #
1517  #=================================================#
1518
1519  IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin ${PeriodDateBegin}
1520  IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd ${PeriodDateEnd}
1521  IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod ${CumulPeriod}
1522
1523  if ( ${FirstInitialize} ) ; then
1524    # It's no more the first time
1525    FirstInitialize=false
1526  fi
1527
1528  IGCM_debug_PopStack "IGCM_config_PeriodEnd"
1529}
1530
1531#===================================
1532function IGCM_config_Finalize
1533{
1534  IGCM_debug_PushStack "IGCM_config_Finalize"
1535
1536  echo
1537  IGCM_debug_Print 1 "IGCM_config_Finalize"
1538  echo
1539
1540  # Test state of run in run.card. Will schedule an exit if another process setted it to "Fatal"
1541  IGCM_config_StateCheck
1542
1543  # And EXIT if not OK
1544  IGCM_debug_Verif_Exit
1545
1546  if [ ${SimulationLengthInDays} -ge ${ExperienceLengthInDays} ] ; then
1547    #==========================#
1548    # End of entire simulation #
1549    #==========================#
1550    simulationIsOver=true
1551
1552    # Mail notification
1553    IGCM_sys_SendMail
1554    #
1555    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Completed"
1556    #
1557    IGCM_debug_Print 1 "Normal End of computation."
1558
1559  else
1560    #=================#
1561    # Submit next job #
1562    #=================#
1563    simulationIsOver=false
1564
1565    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "OnQueue"
1566
1567    # Name of next Ksh Script output :
1568    Script_Output=${Script_Output_Prefix}_${config_UserChoices_JobName}.$( printf "%06d" ${CumulPeriod} )
1569
1570    IGCM_debug_Print 1 "Submit next job"
1571    # SUBMIT NEXT JOB from SUBMIT_DIR and come back in RUN_DIR
1572    IGCM_sys_Cd ${SUBMIT_DIR}
1573    # Keep only the 5 latest ${Script_Output_Prefix}_${config_UserChoices_JobName}
1574    ScriptTot=$( ls ${Script_Output_Prefix}_${config_UserChoices_JobName}.?????? 2>/dev/null | wc -l )
1575    [ ${ScriptTot} -gt 5 ] && rm -f $( ls ${Script_Output_Prefix}_${config_UserChoices_JobName}.?????? | head -$(( ${ScriptTot} - 5 )) )
1576    # Submit next job and come back
1577    IGCM_sys_Qsub ${SUBMIT_DIR}/Job_${config_UserChoices_JobName}
1578    IGCM_sys_Cd -
1579  fi
1580
1581  # Clean ${RUN_DIR}=${RUN_DIR_PATH}/${config_UserChoices_JobName}.${$}
1582  # Only for production run (No clean up in DEV or DEB mode)
1583  # and command sent from .. directory.
1584  IGCM_sys_Cd ..
1585  [ X${JobType} = XRUN ] && IGCM_sys_RmRunDir -rf ${RUN_DIR_PATH}
1586
1587  # Inform the rabbitMQ queue
1588  IGCM_debug_BigBro_Finalize
1589
1590  IGCM_debug_PopStack "IGCM_config_Finalize"
1591}
1592
1593#===================================
Note: See TracBrowser for help on using the repository browser.