New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
prepare_job.sh in utils/CI/sette – NEMO

source: utils/CI/sette/prepare_job.sh @ 13790

Last change on this file since 13790 was 13790, checked in by acc, 23 months ago

Add -T option to sette.sh to set ln_timing true for all, non-AGRIF SETTE tests. Also archives timing.output files to the validation directory. Added first attempt at batch files for ARCHER2 (MPMD version still needs some work)

  • Property svn:executable set to *
File size: 14.5 KB
Line 
1#####################################################
2# Author : Simona Flavoni for NEMO
3# Contact : sflod@locean-ipsl.upmc.fr
4#
5# ----------------------------------------------------------------------
6# NEMO/SETTE , NEMO Consortium (2010)
7# Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
8# ----------------------------------------------------------------------
9#
10# Some scripts called by sette.sh
11# prepare_job.sh   : creates the job script for running job
12######################################################
13#set -vx
14set -o posix
15#set -u
16#set -e
17#+
18#
19# ================
20# prepare_job.sh
21# ================
22#
23# -------------------------------------------------
24# script that creates the job script for NEMO tests
25# -------------------------------------------------
26#
27# SYNOPSIS
28# ========
29#
30# ::
31#
32#  $ ./prepare_job.sh INPUT_FILE_CONFIG_NAME NUMBER_PROC TEST_NAME MPI_FLAG JOB_FILE
33#
34#
35# DESCRIPTION
36# ===========
37#
38# Part of the SETTE package to run tests for NEMO
39#
40# prepare the script $JOB_FILE to run the tests
41#
42# EXAMPLES
43# ========
44#
45# ::
46#
47#  $ ./prepare_job.sh INPUT_FILE_CONFIG_NAME NUMBER_PROC TEST_NAME MPI_FLAG $JOB_FILE
48#
49# prepare the $JOB_FILE for execution
50#
51#
52# TODO
53# ====
54#
55# option debug
56#
57#
58# EVOLUTIONS
59# ==========
60#
61# $Id: prepare_job.sh 3050 2011-11-07 14:11:34Z acc $
62#
63#
64#
65#   * creation
66#
67#-
68#
69
70usage=" Usage : ./prepare_job.sh INPUT_FILE_CONFIG_NAME NUMBER_PROC TEST_NAME MPI_FLAG JOB_FILE NUM_XIO_SERVERS"
71usage=" example : ./prepare_job.sh input_ORCA2_ICE_PISCES.cfg 8 SHORT no/yes $JOB_FILE 0 2"
72
73
74minargcount=6
75        if [ ${#} -lt ${minargcount} ]
76        then
77                echo "not enough arguments for prepare_job.sh script"
78                echo "control number of argument of prepare_job.sh in sette.sh"
79                echo "${usage}"
80        exit 1
81        fi
82        unset minargcount
83   if [ ! -f ${SETTE_DIR}/output.sette ] ; then
84           touch ${SETTE_DIR}/output.sette
85   fi
86       
87#
88# set and export TEST_NAME. It will be used within the post_test_tidyup function
89#
90INPUTARFILE=$1
91NB_PROC=$2
92TEST_NAME=$3
93MPI_FLAG=$4
94JOB_FILE=$5
95NXIO_PROC=$6
96NEMO_VALID=$7
97
98# export EXE_DIR. This directory is used to execute model
99#
100#
101#
102echo "date: `date`" >> ${SETTE_DIR}/output.sette
103echo "" >> ${SETTE_DIR}/output.sette
104echo "running config: ${NEW_CONF}" >> ${SETTE_DIR}/output.sette
105echo "" >> ${SETTE_DIR}/output.sette
106echo "list of cpp_keys: " >> ${SETTE_DIR}/output.sette
107echo "`more ${CONFIG_DIR}/${NEW_CONF}/cpp_${NEW_CONF}.fcm`" >> ${SETTE_DIR}/output.sette
108echo "" >> ${SETTE_DIR}/output.sette
109echo "compiling with: ${CMP_NAM}" >> ${SETTE_DIR}/output.sette
110echo "" >> ${SETTE_DIR}/output.sette
111echo "executing script : \"fcm_job $@\" " >> ${SETTE_DIR}/output.sette
112echo "            " >> ${SETTE_DIR}/output.sette
113
114################################################################
115# SET INPUT
116# get the input tarfile if needed
117if [ "$(cat ${SETTE_DIR}/$INPUTARFILE | wc -w)" -ne 0 ] ; then
118   echo "looking for input files in ${SETTE_DIR}/$INPUTARFILE " >> ${SETTE_DIR}/output.sette
119# number of tarfiles: NBTAR
120   NBTAR=`cat ${SETTE_DIR}/$INPUTARFILE |wc -l` 
121   echo "NB of tarfiles ${NBTAR} " >> ${SETTE_DIR}/output.sette
122# loop on tarfiles
123# read file name and directory
124   while read tar_file dir_conf_forc
125   do
126       echo looking for tarfile ${tar_file} and directory ${FORCING_DIR}/${dir_conf_forc}
127       echo looking for tarfile ${tar_file} and directory ${FORCING_DIR}/${dir_conf_forc} >> ${SETTE_DIR}/output.sette
128       if [ -d ${FORCING_DIR}/${dir_conf_forc} ] ; then
129      # input dir ar there, only check the links
130           echo "input dir ar there, only check the links" >> ${SETTE_DIR}/output.sette
131      # extract tarfile
132       else       
133      if [ ! -f ${FORCING_DIR}/${tar_file} ] ; then 
134          echo "tarfile  ${FORCING_DIR}/${tar_file} cannot be found we stop " ; exit 2 ; fi
135
136      echo " extract from tarfile ${FORCING_DIR}/${tar_file} in  ${FORCING_DIR}/${dir_conf_forc}" >> ${SETTE_DIR}/output.sette
137
138      istgz=$( echo ${FORCING_DIR}/${tar_file} | grep -c "gz$" )
139      if [ $istgz -eq 1 ]
140      then
141          withdir=$( tar tfz ${FORCING_DIR}/${tar_file} | head -n 1  | grep -c "${dir_conf_forc}/$" )
142      else
143          withdir=$( tar tf  ${FORCING_DIR}/${tar_file} | head -n 1  | grep -c "${dir_conf_forc}/$" )
144      fi
145      if [ $withdir -eq 0 ]
146      then
147          mkdir ${FORCING_DIR}/${dir_conf_forc} 
148          cd    ${FORCING_DIR}/${dir_conf_forc}
149      else
150          cd    ${FORCING_DIR}
151      fi
152      if [ $istgz -eq 1 ]
153      then
154          tar xvfz ${FORCING_DIR}/${tar_file}
155      else
156               tar xvf ${FORCING_DIR}/${tar_file}
157          [ $( ls -1 *gz 2>/dev/null | wc -l ) -gt 0 ] && gunzip -f *gz
158      fi
159       fi
160       # Tarfile and input dir ar there, only check the links
161       cd ${FORCING_DIR}/${dir_conf_forc}
162       for fida in *
163       do
164           [ -f ${EXE_DIR}/${fida} ] || ln -s ${FORCING_DIR}/${dir_conf_forc}/${fida} ${EXE_DIR}/${fida}
165       done
166   done < ${SETTE_DIR}/$INPUTARFILE
167   
168else
169    echo "no input file to be searched "
170fi
171################################################################
172
173################################################################
174# RUN OPA
175cd ${EXE_DIR}
176if [ ! -r ${EXE_DIR}/nemo ]
177    then
178    echo "executable nemo does not exist"
179    echo "executable nemo does not exist, exit"  >> ${SETTE_DIR}/output.sette
180    exit 1
181fi
182
183# example for NOCS ClusterVision system using SLURM batch submission (requires ${SETTE_DIR}/sette_batch_template file)
184#
185  #  if [ ${MPI_FLAG} == "no" ] ; then
186      case ${COMPILER} in
187         X64_MOBILIS*)
188                                NB_REM=$( echo $NB_PROC $NXIO_PROC | awk '{print ( $1 + $2 ) % 16}')
189               if [ ${NB_REM} == 0 ] ; then
190               # number of processes required is an integer multiple of 16
191               #
192               NB_NODES=$( echo $NB_PROC $NXIO_PROC | awk '{print ($1 + $2 ) / 16}')
193            else
194               #
195               # number of processes required is not an integer multiple of 16
196               # round up the number of nodes required.
197               #
198               NB_NODES=$( echo $NB_PROC $NXIO_PROC | awk '{printf("%d",($1 + $2 ) / 16 + 1 )}')
199                  fi
200            ;;
201         X86_ARCHER2*)
202                                OSPACE=2
203                                SSPACE=4
204                                NB_REM=$( echo $NB_PROC $OSPACE $NXIO_PROC $SSPACE | awk '{print ( $1 * $2 + $3 * $4 ) % 128}')
205                                echo "NB_REM= "$NB_REM
206               if [ ${NB_REM} == 0 ] ; then
207               # number of processes required is an integer multiple of 128
208               #
209               NB_NODES=$( echo $NB_PROC $OSPACE $NXIO_PROC $SSPACE | awk '{print ( $1 * $2 + $3 * $4 ) / 128}')
210            else
211               #
212               # number of processes required is not an integer multiple of 128
213               # round up the number of nodes required.
214               #
215               NB_NODES=$( echo $NB_PROC $OSPACE $NXIO_PROC $SSPACE | awk '{printf("%d",( $1 * $2 + $3 * $4 ) / 128 + 1 )}')
216                  fi
217            ;;
218                        XC_ARCHER_INTEL)
219                                # ocean cores are packed 24 to a node
220                                NB_REM=$( echo $NB_PROC | awk '{print ( $1 % 24 ) }')
221                                if [ ${NB_REM} == 0 ] ; then
222                                        # number of processes required is an integer multiple of 24
223                                        #
224                                        NB_NODES=$( echo $NB_PROC $NXIO_PROC | awk '{print ($1) / 24}')
225                                else
226                                        #
227                                        # number of processes required is not an integer multiple of 24
228                                        # round up the number of nodes required.
229                                        #
230                                        NB_NODES=$( echo $NB_PROC | awk '{printf("%d",($1) / 24 + 1 )}')
231                                fi
232                                # xios cores are sparsely packed at 4 to a node
233                                # but can not share nodes with the ocean cores
234                                NB_REM=$( echo $NXIO_PROC | awk '{print ( $2 % 4 ) }')
235                                if [ ${NB_REM} == 0 ] ; then
236                                        # number of processes required is an integer multiple of 4                           
237                                        #
238                                        NB_NODES=$( echo $NB_NODES $NXIO_PROC | awk '{print ($1 + ( $2 / 4 ))}')                   
239                                else
240                                        #
241                                        # number of processes required is not an integer multiple of 4                             
242                                        # round up the number of nodes required.
243                                        #
244                                        NB_NODES=$( echo $NB_NODES $NXIO_PROC | awk '{print ($1 + ( $2 / 4 ) + 1)}') 
245                                fi
246                                ;;
247                        XC40_METO*) #Setup for Met Office XC40 with any compiler
248                                # ocean cores are packed 32 to a node
249                                # If we need more than one node then have to use parallel queue and XIOS must have a node to itself
250                                NB_REM=$( echo $NB_PROC | awk '{print ( $1 % 32 ) }')
251                                if [ ${NB_REM} == 0 ] ; then
252                                        # number of processes required is an integer multiple of 32
253                                        #
254                                        NB_NODES=$( echo $NB_PROC $NXIO_PROC | awk '{print ($1) / 32}')
255                                else
256                                        #
257                                        # number of processes required is not an integer multiple of 32
258                                        # round up the number of nodes required.
259                                        #
260                                        NB_NODES=$( echo $NB_PROC $NXIO_PROC | awk '{printf("%d",($1) / 32 + 1 )}')
261                                fi
262                                # xios cores are sparsely packed at 4 to a node
263                                if [ $NXIO_PROC == 0 ] ; then
264                                    NB_XNODES=0
265                                else
266                                    NB_REM=$( echo $NXIO_PROC | awk '{print ( $1 % 4 ) }')
267                                    if [ ${NB_REM} == 0 ] ; then
268                                            # number of processes required is an integer multiple of 4                           
269                                            #
270                                            NB_XNODES=$( echo $NXIO_PROC | awk '{print (( $1 / 4 ) + 1)}') 
271                                    else
272                                            #
273                                            # number of processes required is not an integer multiple of 4                             
274                                            # round up the number of nodes required.
275                                            #
276                                            NB_XNODES=$( echo $NXIO_PROC | awk '{printf("%d",($1) / 4 + 1) }')                   
277                                    fi
278                                fi
279                                if [ ${NB_XNODES} -ge 1 ] ; then
280                                   NB_NODES=$((NB_NODES+NB_XNODES))
281                                fi
282                                echo NB_XNODES=${NB_XNODES} 
283                                echo Total NB_NODES=${NB_NODES}
284                                QUEUE=normal
285                                SELECT="select=$NB_NODES"
286                                module unload cray-snplauncher #Make sure snplauncher module is not loaded
287                                ;;
288                        X64_JEANZAY*) #Setup for Jean-Zay
289                                export GROUP_IDRIS=`echo ${IDRPROJ}`
290                                ;;
291                        openmpi_KARA_MERCATOR*)
292                                NB_PROC_NODE=32
293                                NB_NODES=$( echo $NB_PROC | awk '{print $1 - $1 % $NB_PROC_NODE }' | awk '{print $1 / $NB_PROC_NODE }' )
294                                if [ ${NB_PROC} -le 128 ] ; then
295                                      QUEUE=multi
296                                fi
297                                ;;
298                        ifort_beaufix_sette*)
299                                NB_PROC_NODE=40
300                                NB_NODES=$( echo $NB_PROC | awk '{print $1 - $1 % $NB_PROC_NODE }' | awk '{print $1 / $NB_PROC_NODE }' )
301                                ;;
302         *)
303            NB_NODES=${NB_PROC}
304            ;;
305      esac
306#
307# Pass settings into job file by using sed to edit predefined strings
308#
309        TOTAL_NPROCS=$(( $NB_PROC + $NXIO_PROC ))
310        cat ${SETTE_DIR}/job_batch_template | sed -e"s/\(=\| \)NODES/\1${NB_NODES}/" \
311             -e"s/TOTAL_NPROCS/${TOTAL_NPROCS}/" \
312             -e"s/NPROCS/${NB_PROC}/" \
313             -e"s/NXIOPROCS/${NXIO_PROC}/" \
314             -e"s:DEF_SETTE_DIR:${SETTE_DIR}:" -e"s:DEF_INPUT_DIR:${INPUT_DIR}:" \
315             -e"s:DEF_EXE_DIR:${EXE_DIR}:" \
316             -e"s:DEF_CONFIG_DIR:${CONFIG_DIR}:" \
317             -e"s:DEF_TOOLS_DIR:${TOOLS_DIR}:" \
318             -e"s:MPI_FLAG:${MPI_FLAG}:" \
319             -e"s:DEF_NEMO_VALIDATION:${NEMO_VALID}:" -e"s:DEF_NEW_CONF:${NEW_CONF}:" \
320             -e"s:DEF_CMP_NAM:${CMP_NAM}:" -e"s:DEF_TEST_NAME:${TEST_NAME}:" > run_sette_test.job
321
322        case ${COMPILER} in
323              openmpi_KARA_MERCATOR_XIOS )
324                    cat run_sette_test.job | sed -e"s/NPROC_NODE/${NB_PROC_NODE}/" \
325                                                 -e"s:QUEUE:${QUEUE}:" > run_sette_test1.job
326                    mv run_sette_test1.job run_sette_test.job
327                    ;;
328              XC40_METO*)
329                    cat run_sette_test.job | sed -e"s/SELECT/${SELECT}/" > run_sette_test1.job
330                    mv run_sette_test1.job run_sette_test.job
331                    ;;
332              X64_JEANZAY*)
333                    cat run_sette_test.job | sed -e"s/GROUP_IDRIS/${GROUP_IDRIS}/" > run_sette_test1.job
334                    mv run_sette_test1.job run_sette_test.job
335                    ;;
336   esac
337#
338# create the unique submission job script
339#
340   if [ ! -f $JOB_FILE ] ; then
341      mv run_sette_test.job $JOB_FILE
342   else
343       e=`grep -n "# END_BODY" ${JOB_FILE} | cut -d : -f 1`
344            e=$(($e - 1))
345       head -$e $JOB_FILE > ${JOB_FILE}_new
346       mv ${JOB_FILE}_new ${JOB_FILE}
347       l=`wc -l run_sette_test.job | sed -e "s:run_sette_test.job::"`
348       b=`grep -n "# BODY" run_sette_test.job | cut -d : -f 1`
349       t=$(($l - $b))
350       tail -$t run_sette_test.job >> $JOB_FILE
351   fi
352   
353   chmod a+x $JOB_FILE ; echo "$JOB_FILE is ready"
354
355#fi
Note: See TracBrowser for help on using the repository browser.