source: branches/libIGCM_concurrent/libIGCM_config/libIGCM_config.ksh @ 1628

Last change on this file since 1628 was 1628, checked in by aclsce, 3 months ago

Modified to add the functionality to run many instances in concurrent mode.
Only available on Irene SKL with slurm.

  • 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.4 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  first_slurm_comp=0
808
809  OK_PARA_MPI=false
810  OK_PARA_OMP=false
811  OK_PARA_NOD=false
812  OK_PARA_MPMD=false
813
814  for comp in ${config_ListOfComponents[*]} ; do
815
816      # Add a node in case of many execution in concurrent mode
817      number_rundir=$(echo ${comp} | sed 's/[^0-9]*//g')
818      if [ X${number_rundir} != X ] ; then
819          if [ ${first_slurm_comp} = "0" ] ; then
820              if [ $(( $coreNumber % $NB_CORE_PER_NODE )) -ne 0 ] ; then
821                  (( coreNumber = coreNumber + NB_CORE_PER_NODE - coreNumber % NB_CORE_PER_NODE ))
822              fi
823              echo $coreNumber
824              first_slurm_comp=1 ;
825          fi
826      fi
827
828    # Manage component executable
829    IGCM_card_DefineArrayFromOption ${configCardPath} Executable ${comp}
830
831    eval ExeNameIn=\${config_Executable_${comp}[0]}
832
833    # NO order in config.card for parallelized values !
834    # just use suffix : MPI , OMP and NOD (for number of NODes.)
835
836    # NOD is the number of NODes allocated
837    eval ${comp}_PROC_NOD=0
838
839    # MPI is the number of MPI processus per nodes
840    eval ${comp}_PROC_MPI=0
841
842    # OMP is the number of OpenMP threads per MPI processus
843    eval ${comp}_PROC_OMP=0
844
845    # DEP is the factor to increase the number of cores per process
846    eval ${comp}_PROC_DEP=0
847
848    # DEDICATED is the flag to activate the use of dedicated node for XIOS server only
849    eval ${comp}_OK_DEDICATED=0
850
851    # Only if we really have an executable for the component :
852    if ( [ "X${ExeNameIn}" != X\"\" ] && [ "X${ExeNameIn}" != "Xinca.dat" ] ) ; then
853
854      IGCM_debug_Print 1 ${comp}
855
856      # Keep the first executable found and the first CompName
857      eval ExeNameFirst=${ExeNameIn}
858      CompNameFirst=${comp}
859
860      # Are we a second executable?
861      (( NbExec = NbExec + 1 ))
862
863      # set 1 MPI task, 1 OpenMP thread and 1 node as default
864      eval ${comp}_PROC_MPI=1
865      eval ${comp}_PROC_OMP=1
866      eval ${comp}_PROC_NOD=1
867      eval ${comp}_PROC_DEP=1
868
869      eval NbElts=\${#config_Executable_${comp}[@]}
870      if [ ${NbElts} -gt 2 ] ; then
871        #
872        # CURRENT METHOD TO SPECIFY MPI AND OMP RESSOURCES
873        #
874        i=2
875        while [ ${i} -lt ${NbElts} ] ; do
876          eval tempvar=\${config_Executable_${comp}[${i}]}
877          IGCM_debug_Print 2 ${tempvar}
878
879          if [ X${tempvar} = X ] ; then
880            IGCM_debug_Print 2 "Error reading MPI/OMP parameters !!!"
881            IGCM_debug_Exit "Check your config.card. Exit now"
882            IGCM_debug_Verif_Exit
883          fi
884
885          case ${tempvar} in
886          *[mM][pP][iI]*)
887            # Read MPI parameter for composante
888            eval ${comp}_PROC_MPI=$( echo ${tempvar} | tr '[a-z]' '[A-Z]' | sed -e "s/MPI//" )
889            OK_PARA_MPI=true;;
890          *[oO][mM][pP]*)
891            # Read OMP parameter for composante
892            eval ${comp}_PROC_OMP=$( echo ${tempvar} | tr '[a-z]' '[A-Z]' | sed -e "s/OMP//" )
893            ;;
894          *[nN][oO][dD]*)
895            # Read NOD (NumBer of Nodes) parameter for composante
896            eval ${comp}_PROC_NOD=$( echo ${tempvar} | tr '[a-z]' '[A-Z]' | sed -e "s/NOD//" )
897            OK_PARA_NOD=true
898            OK_PARA_MPI=true
899            ;;
900            *[dD][eE][pP]*)
901            # Read DEP parameter for composante
902            eval ${comp}_PROC_DEP=$( echo ${tempvar} | tr '[a-z]' '[A-Z]' | sed -e "s/DEP//" )
903            ;;
904            *[dD][eE][dD][iI][cC][aA][tT][eE][dD]*)
905            # Read DEDICATED parameter for composante
906            eval ${comp}_OK_DEDICATED=1
907          esac
908          (( i = i + 1 ))
909        done
910      else
911        #
912        # BACKWARD COMPATIBILITY NOT SUPPORTED ANYMORE
913        #
914        IGCM_debug_Exit "You are using a deprecated ressources specification mechanism in your config.card"
915        IGCM_debug_Exit "Please check : https://forge.ipsl.jussieu.fr/igcmg_doc/wiki/DocEsetup#ThesectionExecutable"
916        IGCM_debug_Exit "Please modify ${configCardPath}"
917        exit
918      fi
919      if [ ${comp}_PROC_NOD -gt 1 ] ; then
920            if ( [ ${comp}_PROC_MPI -gt 1 ] && [ ${comp}_PROC_OMP -gt 1 ] ) ; then
921              IGCM_debug_Print 2 "Error using MPI/OMP/NOD parameters !!!"
922              IGCM_debug_Exit "It is not allowed to use MPI and OMP and NOD parameters for the same component"
923              IGCM_debug_Exit "Check your config.card. Exit now"
924              IGCM_debug_Verif_Exit
925            fi
926            if [ "${comp}" != "IOS" ] ; then
927              IGCM_debug_Print 2 "Error using NOD parameter !!!"
928              IGCM_debug_Exit "NOD parameter is only available for IOS component "
929              IGCM_debug_Exit "Check your config.card. Exit now"
930              IGCM_debug_Verif_Exit
931            fi
932      fi
933      if ( [ ${comp}_OK_DEDICATED -eq 1 ] && [ "${comp}" != "IOS" ] ) ; then
934            IGCM_debug_Print 2 "Error using DEDICATED parameter !!!"
935            IGCM_debug_Exit "DEDICATED parameter is only available for IOS component "
936            IGCM_debug_Exit "Check your config.card. Exit now"
937            IGCM_debug_Verif_Exit
938      fi
939
940      eval tempvarMPI=\${${comp}_PROC_MPI}
941      eval tempvarNOD=\${${comp}_PROC_NOD}
942      eval tempvarOMP=\${${comp}_PROC_OMP}
943      eval tempvarDEP=\${${comp}_PROC_DEP}
944
945      # set OMP mode if more than 1 OMP thread.
946      [ ${tempvarOMP} -ge 2 ] && OK_PARA_OMP=true
947
948      # Number of OMP threads
949      [ ${openMPthreads} -lt ${tempvarOMP} ] && openMPthreads=${tempvarOMP}
950
951      # SUM UP NUMBER OF CORES
952      if [ ${comp}_PROC_NOD -gt 1 ] ; then 
953          (( coreNumber = coreNumber + tempvarNOD * NB_CORE_PER_NODE ))
954      else
955          (( coreNumber = coreNumber + tempvarMPI * tempvarNOD * tempvarOMP * tempvarDEP ))
956      fi
957      # SUM UP NUMBER OF MPI TASKS
958      (( mpiTasks = mpiTasks + tempvarMPI * tempvarNOD ))
959    fi
960  done
961
962  # MANDATORY FOR THE OPA9.DRIVER. USED TO EDIT OPA NAMELIST
963  # WE SHOULD PLANIFY NUM_PROC_??? DEPRECATION
964  NUM_PROC_CPL=${CPL_PROC_MPI}
965  NUM_PROC_OCE=${OCE_PROC_MPI}
966  NUM_PROC_ATM=${ATM_PROC_MPI}
967
968  # set MPMD mode if more than 2 executable names.
969  [ ${NbExec} -ge 2 ] && OK_PARA_MPMD=true 
970
971  # Define the execution type we are running in
972  if ( ${OK_PARA_MPMD} ) ; then
973    if ( ${OK_PARA_MPI} ) ; then
974      # MPMD always implies MPI
975      executionType=1
976    fi
977    if ( ${OK_PARA_OMP} ) ; then
978      # MPMD + MPI/OMP
979      executionType=2
980    fi
981  else
982    if ( ( ${OK_PARA_MPI} ) && ( ${OK_PARA_OMP} ) ) ; then
983      # SPMD + MPI/OMP
984      executionType=3
985    elif ( ( ${OK_PARA_MPI} ) && ( ! ${OK_PARA_OMP} ) ) ; then
986      # SPMD + MPI only
987      executionType=4
988    elif ( ( ! ${OK_PARA_MPI} ) && ( ${OK_PARA_OMP} ) ) ; then
989      # SPMD + OMP only
990      executionType=5
991    elif ( ( ! ${OK_PARA_MPI} ) && ( ! ${OK_PARA_OMP} ) ) ; then
992      # SEQUENTIAL THEN
993      executionType=6
994      coreNumber=1
995    fi
996  fi
997
998  IGCM_debug_Print 1 "MPI/OMP treatment coreNumber = ${coreNumber}"
999  IGCM_debug_Print 1 "MPI/OMP treatment mpiTasks = ${mpiTasks}"
1000  IGCM_debug_Print 1 "MPI/OMP treatment openMPthreads = ${openMPthreads}"
1001  IGCM_debug_Print 1 "MPI/OMP treatment executionType = ${executionType}"
1002
1003  IGCM_debug_PopStack "IGCM_config_ConfigureExecution"
1004}
1005
1006#===================================
1007function IGCM_config_PeriodStart
1008{
1009  IGCM_debug_PushStack "IGCM_config_PeriodStart"
1010
1011  echo
1012  IGCM_debug_Print 1 "IGCM_config_PeriodStart"
1013  echo
1014
1015  if ( ${FirstInitialize} ) ; then
1016    #================================================#
1017    #         Initialize date/period information     #
1018    #================================================#
1019
1020    IGCM_date_GetYearMonthDay ${DateBegin} year month day
1021    IGCM_config_DaysInPeriodLength
1022
1023    PeriodDateBegin=${DateBegin}
1024    PeriodDateEnd=$( IGCM_date_AddDaysToGregorianDate ${DateBegin} $(( ${PeriodLengthInDays} - 1 )) )
1025    CumulPeriod=1
1026
1027    #=================================================#
1028    #              Write updated run.card             #
1029    #=================================================#
1030
1031    #Correct run.card Configuration for this period
1032    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin ${PeriodDateBegin}
1033    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd ${PeriodDateEnd}
1034    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod ${CumulPeriod}
1035    if [ X$( grep "SubmitPath" ${SUBMIT_DIR}/run.card ) != X ] ; then
1036      IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration SubmitPath ${SUBMIT_DIR}
1037    fi
1038
1039    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Running"
1040
1041  else
1042    #================================================#
1043    #         The file run.card allready exist       #
1044    #================================================#
1045
1046    # Test state of run in run.card. Will schedule an exit if another process setted it to "Fatal"
1047    IGCM_config_StateCheck
1048    # And EXIT if not OK
1049    IGCM_debug_Verif_Exit
1050
1051    #===================================#
1052    #        Read updated run.card      #
1053    #===================================#
1054
1055    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin
1056    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd
1057    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod
1058
1059    PeriodDateBegin=$( IGCM_date_ConvertFormatToGregorian ${run_Configuration_PeriodDateBegin} )
1060    PeriodDateEnd=$( IGCM_date_ConvertFormatToGregorian ${run_Configuration_PeriodDateEnd} )
1061    CumulPeriod=${run_Configuration_CumulPeriod}
1062
1063    LastPeriodDateEnd=$( IGCM_date_AddDaysToGregorianDate $( IGCM_date_ConvertFormatToGregorian ${PeriodDateBegin} ) -1 )
1064
1065    if [ ${Period} = 1 ]; then
1066      # save last Job output and current run.card
1067      typeset Potential
1068      IGCM_sys_Cd ${SUBMIT_DIR}
1069      #
1070      IGCM_debug_Print 2 "Save previous ksh job output"
1071      for Potential in $( ls ${Script_Output_Prefix}_${config_UserChoices_JobName}.[0-9][0-9][0-9][0-9][0-9][0-9] ) ; do
1072        if [ X${Pack} = Xtrue ] ; then
1073          ( IGCM_sys_TestFileBuffer  ${R_BUF_KSH}/${Potential} ) || IGCM_sys_Cp ${Potential} ${R_BUF_KSH}/${Potential}.$$
1074        else
1075          ( IGCM_sys_TestFileArchive ${R_OUT_KSH}/${Potential} ) || IGCM_sys_Put_Out ${Potential} ${R_OUT_KSH}/${Potential}.$$ NOMOVE
1076          IGCM_debug_Print 1 "Save of previous ksh job output is not done for Pack=false"
1077        fi
1078      done
1079
1080      #
1081      IGCM_debug_Print 2 "Save current run.card"
1082      IGCM_card_CheckConflict run.card
1083
1084      if [ X${Pack} = Xtrue ] ; then
1085        IGCM_sys_Cp ${SUBMIT_DIR}/run.card ${R_BUF_KSH}/run.card
1086      else
1087        IGCM_sys_Put_Out ${SUBMIT_DIR}/run.card ${R_OUT_KSH}/run.card NOMOVE
1088        IGCM_debug_Print 1 "Save of run.card is not done for Pack=false"
1089      fi
1090      #
1091      IGCM_sys_Cd ${RUN_DIR}
1092    else
1093      unset FileToBeDeleted
1094    fi
1095
1096    # Determine number of day(s) in PeriodLength
1097    IGCM_date_GetYearMonthDay $PeriodDateBegin year month day
1098    IGCM_config_DaysInPeriodLength
1099
1100    # Check coherency between (PeriodDateBegin, PeriodDateEnd) and (DateBegin, CumulPeriod, PeriodLength)
1101    IGCM_config_DateCoherency
1102    # And EXIT if not OK
1103    IGCM_debug_Verif_Exit
1104
1105    # Test state of run in run.card. Will schedule an exit if another process setted it to "Fatal"
1106    IGCM_config_StateCheck
1107    # And EXIT if not OK
1108    IGCM_debug_Verif_Exit
1109
1110    # We can say we are "Running" now.
1111    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Running"
1112  fi
1113
1114  # BEGIN: SHOULD GO IN A FUNCTION FROM libIGCM_date.ksh
1115  # Compute year_m1 and year_p1 (year minus 1Y and year plus 1Y)
1116  year_m1=$(( year - 1 ))
1117  year_p1=$(( year + 1 ))
1118  # Compute month_m1 (month minus 1M)
1119  # Compute yyyymm_m1 (yyyymm minus 1M)
1120  month_m1=$(( 10#${month} - 1 ))
1121  if [ ${month_m1} = 0 ]; then
1122    month_m1=12
1123    yyyymm_m1=${year_m1}12
1124  elif [ ${month_m1} -le 9 ]; then
1125    month_m1=0${month_m1}
1126    yyyymm_m1=${year}${month_m1}
1127  else
1128    yyyymm_m1=${year}${month_m1}
1129  fi
1130  # Compute month_p1 (month plus 1M)
1131  # Compute yyyymm_p1 (yyyymm plus 1M)
1132  month_p1=$(( 10#${month} + 1 ))
1133  if [ ${month_p1} = 13 ]; then
1134    month_p1=01
1135    yyyymm_p1=${year_p1}01
1136  elif [ ${month_p1} -le 9 ]; then
1137    month_p1=0${month_p1}
1138    yyyymm_p1=${year}${month_p1}
1139  else
1140    yyyymm_p1=${year}${month_p1}
1141  fi
1142
1143
1144  #===================================================================#
1145  # Calculate CyclicYear to be used for looping over a given forcing  #
1146  # period. Add CyclicBegin and CyclicEnd in config.card UserChoices. #
1147  #===================================================================#
1148
1149  # To use the variable CyclicYear, one must add in config.card CyclicBegin and CyclicEnd.
1150  # CyclicBegin is the first year in the cycle. CyclicEnd is the last year included in the cycle.
1151  if ( [ ! X${config_UserChoices_CyclicBegin} = X ] && [ ! X${config_UserChoices_CyclicEnd} = X ] ) ; then
1152    CycleNb=$(( ${config_UserChoices_CyclicEnd} - ${config_UserChoices_CyclicBegin} + 1 ))
1153    #CyclicYear_p1=  #NOTDEFINED
1154 
1155    # For current year
1156    yeartmp=$year
1157    diffy=$(( $yeartmp - ${config_UserChoices_CyclicBegin} ))
1158    while [ $diffy -lt 0 ] ; do
1159      yeartmp=$(( ${yeartmp} + ${CycleNb} ))
1160      diffy=$(( $yeartmp - ${config_UserChoices_CyclicBegin} ))
1161    done
1162    CyclicYear=$(( ( ${diffy} % ${CycleNb} ) + ${config_UserChoices_CyclicBegin} ))
1163
1164    # For next coming year
1165    CyclicYear_p1=$(( CyclicYear + 1 ))
1166
1167    # For previous year
1168    CyclicYear_m1=$(( CyclicYear - 1 ))
1169
1170    IGCM_debug_Print 1 "CyclicYear   = ${CyclicYear}, current year=$year"
1171    IGCM_debug_Print 1 "CyclicYear_p1 = ${CyclicYear_p1}, CyclicYear_m1 = ${CyclicYear_m1} "
1172  else
1173    CyclicYear="ERROR_CyclicYear_Variable_Not_Defined"
1174    CyclicYear_p1="ERROR_CyclicYear_p1_Variable_Not_Defined"
1175    IGCM_debug_Print 1 "CyclicYear wont be use without adding CyclicBegin and CyclicEnd in config.card"
1176  fi
1177
1178  # END: SHOULD GO IN A FUNCTION FROM libIGCM_date.ksh
1179
1180  #===================================================================#
1181  # Prepare variables available for ${COMP}.card and ${COMP}.driver   #
1182  #             But available to any son functions                    #
1183  #===================================================================#
1184
1185  # Period Length In Days between DateBegin and DateCurrent (at end of period == PeriodDateEnd !)
1186  (( SimulationLengthInDays = $( IGCM_date_DaysBetweenGregorianDate ${PeriodDateEnd} ${DateBegin} ) + 1 ))
1187
1188  # Debug Print :
1189  echo
1190  IGCM_debug_Print 1 "IGCM_config_PeriodStart : Before Execution"
1191  IGCM_debug_Print 1 "Year of simulation      : ${year}"
1192  IGCM_debug_Print 1 "Month of simulation     : ${month}"
1193  IGCM_debug_Print 1 "PeriodLengthInDays      : ${PeriodLengthInDays}"
1194  IGCM_debug_Print 1 "PeriodDateBegin         : ${PeriodDateBegin}"
1195  IGCM_debug_Print 1 "PeriodDateEnd           : ${PeriodDateEnd}"
1196  IGCM_debug_Print 1 "SimulationLengthInDays  : ${SimulationLengthInDays}"
1197  IGCM_debug_Print 1 "ExperienceLengthInDays  : ${ExperienceLengthInDays}"
1198
1199  #================================================================#
1200  #         Prepare variables available for comp_finalyze          #
1201  #================================================================#
1202
1203  # Period for save files
1204  DatesPeriod=${PeriodDateBegin}_${PeriodDateEnd}
1205
1206  # Prefix for save files of this period
1207  PREFIX=${config_UserChoices_JobName}_${DatesPeriod}
1208
1209  # List of files that will be deleted in RUN_DIR after run
1210  [ -f stack ] && FileToBeDeleted[0]="stack"
1211
1212  # Test if the same run as already been saved :
1213  if [ X${JobType} = XRUN ] ; then
1214    if [ ${DRYRUN} -le 0 ] ; then
1215      if ( IGCM_sys_TestFileBuffer ${R_BUF_KSH}/${PREFIX}_${Exe_Output} ) ; then
1216        IGCM_debug_Exit "IGCM_config_PeriodStart" "You are currently re-running an old job."
1217        IGCM_debug_Print 1 "Because of readonly permissions, you can't re-run a job when saved files"
1218        IGCM_debug_Print 1 " are still in the ARCHIVE directory. You must deleted those files, or "
1219        IGCM_debug_Print 1 " the whole ${R_SAVE} tree. See different clean_*.job in ${libIGCM} directory."
1220        IGCM_debug_Print 1 " This exit has been initiated because at least ${R_BUF_KSH}/${PREFIX}_${Exe_Output} exists."
1221        IGCM_debug_Verif_Exit
1222      fi
1223    fi
1224  else
1225    if ( IGCM_sys_TestFileBuffer ${R_BUF_KSH}/${PREFIX}_${Exe_Output} ) ; then
1226      IGCM_debug_Print 1 "IGCM_config_PeriodStart" "RErun an old job. Allowed in DEBUG or DEV mode."
1227    fi
1228  fi
1229
1230  #================================================================#
1231  #       Prepare variables available for binary execution         #
1232  #       Call function for creation of run script                 #
1233  #       Only done once per job                                   #
1234  #================================================================#
1235
1236  if [ ${Period} -eq 1 ]; then
1237    # Define the execution context (MPMD, SPMD, MPI/OMP ...)
1238    IGCM_config_ConfigureExecution ${SUBMIT_DIR}/config.card
1239    # Create the execution script for the current context
1240    IGCM_sys_build_execution_scripts
1241  fi
1242
1243  ExecutionFail=false
1244
1245  # Update the rabbitMQ queue
1246  IGCM_debug_BigBro_Update
1247
1248  IGCM_debug_PopStack "IGCM_config_PeriodStart"
1249}
1250
1251#===================================
1252function IGCM_config_SaveSourceModifications
1253{
1254  IGCM_debug_PushStack "IGCM_config_SaveSourceModifications"
1255
1256  typeset ExeOutDateMax listVarEnv
1257  ExeOutDateMax=$1
1258
1259  listVarEnv="ExeOutDateMax,R_OUT_EXE,PREFIX,SUBMIT_DIR"
1260  IGCM_sys_RshMaster "\
1261    . ${libIGCM}/libIGCM_sys/libIGCM_sys.ksh; \
1262    export ExeOutDateMax=${ExeOutDateMax};\
1263    export R_OUT_EXE=${R_OUT_EXE};\
1264    export PREFIX=${PREFIX};\
1265    export SUBMIT_DIR=${SUBMIT_DIR};\
1266    export listVarEnv=${listVarEnv};\
1267    Script_Output=out_SaveSourceModifications;\
1268    IGCM_sys_Qsub ${libIGCM}/SaveSourceModifications.job ${ExeOutDateMax} ${R_OUT_EXE} ${PREFIX} ${SUBMIT_DIR}"
1269
1270  IGCM_debug_PopStack "IGCM_config_SaveSourceModifications"
1271}
1272
1273#===================================
1274function IGCM_config_PeriodEnd
1275{
1276  IGCM_debug_PushStack "IGCM_config_PeriodEnd"
1277
1278  echo
1279  IGCM_debug_Print 1 "IGCM_config_PeriodEnd"
1280  echo
1281
1282  if [ ${DRYRUN} -le 1 ] ; then
1283
1284    IGCM_debug_Print 1 "Check components binary : size and creation date"
1285
1286    typeset LS_comp LS_bin ExeDate ExeCpuLog NextExeSize LastCompExeSize
1287    typeset comp i
1288    typeset ExeNameIn ExeNameOut UpdateExe ExeSecDateMax
1289
1290    #==================================#
1291    #        Get last Exe Size         #
1292    #==================================#
1293
1294    (( i=0 ))
1295    if ( ${FirstInitialize} ) ; then
1296      run_Log_LastExeSize=""
1297      for comp in ${config_ListOfComponents[*]} ; do
1298        run_Log_LastExeSize[$i]=0
1299        (( i=i+1 ))
1300      done
1301    else
1302      IGCM_card_DefineArrayFromOption ${SUBMIT_DIR}/run.card Log LastExeSize
1303    fi
1304    #==================================#
1305    #         And Build ExeDate        #
1306    #==================================#
1307
1308    # 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
1309    # 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")
1310    # 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
1311    ExeDate=""
1312    NextExeSize="( "
1313    (( i=0 ))
1314    UpdateExe=false
1315    (( ExeSecDateMax = 0 ))
1316    for comp in ${config_ListOfComponents[*]} ; do
1317
1318      IGCM_debug_Print 3 ${comp}
1319
1320      eval ExeNameIn=\${config_Executable_${comp}[0]}
1321      eval ExeNameOut=\${config_Executable_${comp}[1]}
1322      # Only if we really have an executable for the component :
1323      if [ X${ExeNameIn} = X\"\" ] ; then
1324        # If there is no exe file for this component
1325        (( ExeSize=0 ))
1326      else
1327        eval ExeNameIn=${ExeNameIn}
1328        LS_bin=${R_EXE}/${ExeNameIn}
1329        IGCM_sys_FileSize ${LS_bin} ExeSize
1330
1331        set +A LS_comp -- $( LC_TIME=en_US ls -l ${LS_bin} )
1332        if [ X${ExeDate} = X ] ; then
1333          # First component exe date
1334          ExeDate=${comp}_${LS_comp[5]}_${LS_comp[6]}
1335        else
1336          ExeDate=${ExeDate}-${comp}_${LS_comp[5]}_${LS_comp[6]}
1337        fi
1338        ExeDate=${ExeDate}_${LS_comp[7]}
1339      fi
1340
1341      if [ ${i} -eq 0 ] ; then
1342        # First component
1343        NextExeSize="( "${ExeSize}
1344      else
1345        NextExeSize=${NextExeSize}", "${ExeSize}
1346      fi
1347      LastCompExeSize=${run_Log_LastExeSize[$i]}
1348      (( i=i+1 ))
1349
1350      if [ ${ExeSize} -ne ${LastCompExeSize} ] ; then
1351        if ( ${FirstInitialize} ) ; then
1352          IGCM_debug_Print 1 "Save first ${ExeNameIn} in ${R_OUT_EXE} !"
1353        else
1354          IGCM_debug_Print 1 "${ExeNameIn} has changed in ${R_EXE} !"
1355          IGCM_debug_Print 1 "Save latest ${ExeNameIn} in ${R_OUT_EXE} !"
1356          FileToBeDeleted[${#FileToBeDeleted[@]}]=${ExeNameOut}
1357        fi
1358        IGCM_sys_Put_Out ${ExeNameOut} ${R_OUT_EXE}/${PREFIX}_${ExeNameIn} rw
1359        UpdateExe=true
1360
1361        # SD : switch off for now
1362        #IGCM_sys_GetDate_FichWork ${LS_bin} ExeSecDate
1363        #if [ $ExeSecDateMax -lt $ExeSecDate ] ; then
1364        #  ExeSecDateMax=$ExeSecDate
1365        #fi
1366      fi
1367    done
1368
1369    # SD : switch off for now
1370    #if ( ${UpdateExe} ) ; then
1371    #  echo "Launch SaveSourceModifications."
1372    #  IGCM_config_SaveSourceModifications ${ExeSecDateMax}
1373    #fi
1374
1375    NextExeSize=${NextExeSize}" )"
1376    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Log LastExeSize "${NextExeSize}"
1377
1378    if [ ${DRYRUN} -le 1 ] ; then
1379      tail -1500 ${Exe_Output} > ${Exe_Output}_tail.txt
1380      ExeCpuLog=$( gawk -f ${libIGCM}/libIGCM_sys/IGCM_add_out.awk ${Exe_Output}_tail.txt )
1381      RET=$?
1382      if [ $RET -eq 0 ] ; then
1383        # ExeCpuLog variable contents 5 fields
1384        echo "${CumulPeriod} ${PeriodDateBegin} ${PeriodDateEnd} ${ExeCpuLog} ${ExeDate}" |   \
1385          gawk '{printf("# %11d | %15s | %15s | %19s | %19s | %15.5f | %15.5f | %15.5f | %s\n", \
1386            $1,$2,$3,$4,$5,$6,$7,$8,$9)}' >> ${SUBMIT_DIR}/run.card
1387      fi
1388      FileToBeDeleted[${#FileToBeDeleted[@]}]=${Exe_Output}_tail.txt
1389    fi
1390
1391  fi
1392
1393  #==================================#
1394  #         Save Job output          #
1395  #==================================#
1396  if [ X${Pack} = Xtrue ] ; then
1397    IGCM_sys_PutBuffer_Out ${Exe_Output} ${R_BUF_KSH}/${PREFIX}_${Exe_Output}
1398  else
1399    IGCM_sys_Put_Out ${Exe_Output} ${R_OUT_KSH}/${PREFIX}_${Exe_Output}
1400  fi
1401  FileToBeDeleted[${#FileToBeDeleted[@]}]=${Exe_Output}
1402
1403  # All was right ? no ? then we stop.
1404  IGCM_debug_Verif_Exit
1405
1406  # If all was OK, we can delete all files not necessary for next Job
1407  echo
1408  IGCM_debug_Print 1 "Files that will be deleted before next period-run : "
1409
1410  if [ ${DRYRUN} -le 2 ] ; then
1411    for f in ${FileToBeDeleted[@]} ; do [ -f ${f} ] && ls -la $f ; [ -f ${f} ] && rm -f $f ; done
1412  else
1413    echo ${FileToBeDeleted[@]}
1414  fi
1415
1416  # Send some accounting element to the user if CumulPeriod=3
1417  if [ ${CumulPeriod} -eq 3 ] ; then
1418    echo
1419    IGCM_debug_Print 1 "Send email containing some accounting information : "
1420
1421    RealCpuTime=$( echo ${ExeCpuLog} | gawk '{print $3}' )
1422
1423    consumeHoursPerPeriod=$( echo "scale=6;${RealCpuTime}*${coreNumber}/3600" | bc )
1424
1425    consumeHoursPerWholeSimulation=$( echo "scale=6;${consumeHoursPerPeriod}/${PeriodLengthInDays}*${ExperienceLengthInDays}" | bc )
1426
1427    recommendedNbPeriodsPerJob=$( echo "scale=6;${jobWarningDelay}/3600/${consumeHoursPerPeriod}*${coreNumber}" | bc )
1428   
1429    IGCM_sys_SendMail Accounting
1430  fi
1431
1432  #=================================================#
1433  #         Modification of libIGCM behaviour       #
1434  #=================================================#
1435
1436  # To use this function, one must copy libIGCM.card from ${libIGCM} directory
1437  # and put it in ${SUBMIT_DIR} directory. After modifications of ${SUBMIT_DIR}/libIGCM.card,
1438  # variables define inside [UserChanges] will be modified for next Period of libIGCM main loop.
1439  if [ -f ${SUBMIT_DIR}/libIGCM.card ] ; then
1440    echo
1441    echo "########################################################################"
1442    echo "!!!                 Modification of libIGCM behaviour                !!!"
1443    echo
1444
1445    IGCM_debug_Print 1 "DefineArrayFromOption  : libIGCM_UserChanges in libIGCM.card"
1446    IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/libIGCM.card UserChanges
1447    IGCM_debug_Print 2 "libIGCM_UserChanges" ${libIGCM_UserChanges[*]}
1448
1449    # Special treatments for libIGCM internals
1450    for option in ${libIGCM_UserChanges[*]} ; do
1451      IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/libIGCM.card UserChanges ${option}
1452
1453      echo "We will change : ${option}."
1454      eval echo "Previous value : " \${${option}}
1455      eval echo "Change to : " \${libIGCM_UserChanges_${option}}
1456
1457      eval ${option}=\${libIGCM_UserChanges_${option}}
1458
1459      case ${option} in
1460      config_UserChoices_DateEnd)
1461        IGCM_debug_PrintVariables 1 config_UserChoices_DateEnd
1462        DateEnd=$( IGCM_date_ConvertFormatToGregorian ${config_UserChoices_DateEnd} )
1463
1464        # Period Length In Days between DateBegin and DateEnd
1465        (( ExperienceLengthInDays=$( IGCM_date_DaysBetweenGregorianDate ${DateEnd} ${DateBegin} )  + 1 ))
1466        if [ ${ExperienceLengthInDays} -lt 0 ] ; then
1467          IGCM_debug_Print 1 "Problem with dates in libIGCM.card : ${DateEnd} < ${DateBegin} ! You must check that."
1468          IGCM_debug_Exit "IGCM_PeriodEnd have wrong dates."
1469          IGCM_debug_Verif_Exit
1470        fi
1471        ;;
1472      config_UserChoices_PeriodLength)
1473        IGCM_debug_Print 1  "Change config_UserChoices_PeriodLength=${config_UserChoices_PeriodLength}"
1474        ;;
1475      NbPeriodsPerJob)
1476        IGCM_debug_Print 1  "Loop in main Job with ${NbPeriodsPerJob} period(s)"
1477        ;;
1478      config_Post_RebuildFrequency)
1479        IGCM_debug_Print 1  "Change config_Post_RebuildFrequency=${config_Post_RebuildFrequency} : IGCM_post_Configure"
1480        IGCM_post_Configure
1481        ;;
1482      config_Post_TimeSeriesFrequency)
1483        IGCM_debug_Print 1  "Change config_Post_TimeSeriesFrequency = ${config_Post_TimeSeriesFrequency} : IGCM_post_Configure"
1484        IGCM_post_Configure
1485        ;;
1486      config_Post_SeasonalFrequency)
1487        IGCM_debug_Print 1  "Change config_Post_SeasonalFrequency = ${config_Post_SeasonalFrequency} : IGCM_post_Configure"
1488        IGCM_post_Configure
1489        ;;
1490      esac
1491    done
1492
1493    echo
1494    echo "########################################################################"
1495    echo
1496  fi
1497
1498  #=================================================#
1499  #         Determine next computed period          #
1500  #=================================================#
1501
1502  PeriodDateBegin=$( IGCM_date_AddDaysToGregorianDate ${PeriodDateEnd} 1 )
1503  IGCM_date_GetYearMonthDay $PeriodDateBegin year month day
1504  year_m1=$(( year - 1 ))
1505  year_p1=$(( year + 1 ))
1506  IGCM_config_DaysInPeriodLength
1507  PeriodDateEnd=$( IGCM_date_AddDaysToGregorianDate ${PeriodDateBegin} $(( ${PeriodLengthInDays} - 1 )) )
1508
1509  # Debug Print :
1510  echo
1511  IGCM_debug_Print 1 "IGCM_config_PeriodEnd : Preparing Next Execution"
1512  IGCM_debug_Print 1 "PeriodDateBegin       : ${PeriodDateBegin}"
1513  IGCM_debug_Print 1 "PeriodDateEnd         : ${PeriodDateEnd}"
1514  IGCM_debug_Print 1 "PeriodLengthInDays    : ${PeriodLengthInDays}"
1515
1516  PeriodDateBegin=$( IGCM_date_ConvertFormatToHuman ${PeriodDateBegin} )
1517  PeriodDateEnd=$( IGCM_date_ConvertFormatToHuman ${PeriodDateEnd} )
1518
1519  (( CumulPeriod = CumulPeriod + 1 ))
1520
1521  # Debug Print :
1522  echo
1523  IGCM_debug_Print 3 "PeriodDateBegin Human : ${PeriodDateBegin}"
1524  IGCM_debug_Print 3 "PeriodDateEnd Human   : ${PeriodDateEnd}"
1525  IGCM_debug_Print 3 "CumulPeriod           : ${CumulPeriod}"
1526
1527  #=================================================#
1528  #             Write updated run.card              #
1529  #=================================================#
1530
1531  IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin ${PeriodDateBegin}
1532  IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd ${PeriodDateEnd}
1533  IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod ${CumulPeriod}
1534
1535  if ( ${FirstInitialize} ) ; then
1536    # It's no more the first time
1537    FirstInitialize=false
1538  fi
1539
1540  IGCM_debug_PopStack "IGCM_config_PeriodEnd"
1541}
1542
1543#===================================
1544function IGCM_config_Finalize
1545{
1546  IGCM_debug_PushStack "IGCM_config_Finalize"
1547
1548  echo
1549  IGCM_debug_Print 1 "IGCM_config_Finalize"
1550  echo
1551
1552  # Test state of run in run.card. Will schedule an exit if another process setted it to "Fatal"
1553  IGCM_config_StateCheck
1554
1555  # And EXIT if not OK
1556  IGCM_debug_Verif_Exit
1557
1558  if [ ${SimulationLengthInDays} -ge ${ExperienceLengthInDays} ] ; then
1559    #==========================#
1560    # End of entire simulation #
1561    #==========================#
1562    simulationIsOver=true
1563
1564    # Mail notification
1565    IGCM_sys_SendMail
1566    #
1567    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Completed"
1568    #
1569    IGCM_debug_Print 1 "Normal End of computation."
1570
1571  else
1572    #=================#
1573    # Submit next job #
1574    #=================#
1575    simulationIsOver=false
1576
1577    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "OnQueue"
1578
1579    # Name of next Ksh Script output :
1580    Script_Output=${Script_Output_Prefix}_${config_UserChoices_JobName}.$( printf "%06d" ${CumulPeriod} )
1581
1582    IGCM_debug_Print 1 "Submit next job"
1583    # SUBMIT NEXT JOB from SUBMIT_DIR and come back in RUN_DIR
1584    IGCM_sys_Cd ${SUBMIT_DIR}
1585    # Keep only the 5 latest ${Script_Output_Prefix}_${config_UserChoices_JobName}
1586    ScriptTot=$( ls ${Script_Output_Prefix}_${config_UserChoices_JobName}.?????? 2>/dev/null | wc -l )
1587    [ ${ScriptTot} -gt 5 ] && rm -f $( ls ${Script_Output_Prefix}_${config_UserChoices_JobName}.?????? | head -$(( ${ScriptTot} - 5 )) )
1588    # Submit next job and come back
1589    IGCM_sys_Qsub ${SUBMIT_DIR}/Job_${config_UserChoices_JobName}
1590    IGCM_sys_Cd -
1591  fi
1592
1593  # Clean ${RUN_DIR}=${RUN_DIR_PATH}/${config_UserChoices_JobName}.${$}
1594  # Only for production run (No clean up in DEV or DEB mode)
1595  # and command sent from .. directory.
1596  IGCM_sys_Cd ..
1597  [ X${JobType} = XRUN ] && IGCM_sys_RmRunDir -rf ${RUN_DIR_PATH}
1598
1599  # Inform the rabbitMQ queue
1600  IGCM_debug_BigBro_Finalize
1601
1602  IGCM_debug_PopStack "IGCM_config_Finalize"
1603}
1604
1605#===================================
Note: See TracBrowser for help on using the repository browser.