source: trunk/NEMOGCM/SETTE/prepare_job.sh @ 6140

Last change on this file since 6140 was 6140, checked in by timgraham, 5 years ago

Merge of branches/2015/dev_merge_2015 back into trunk. Merge excludes NEMOGCM/TOOLS/OBSTOOLS/ for now due to issues with the change of file type. Will sort these manually with further commits.

Branch merged as follows:
In the working copy of branch ran:
svn merge svn+ssh://forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/trunk@HEAD
Small conflicts due to bug fixes applied to trunk since the dev_merge_2015 was copied. Bug fixes were applied to the branch as well so these were easy to resolve.
Branch committed at this stage

In working copy run:
svn switch svn+ssh://forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/trunk
to switch working copy

Run:
svn merge —reintegrate svn+ssh://forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/branches/2015/dev_merge_2015
to merge the branch into the trunk and then commit - no conflicts at this stage.

  • Property svn:executable set to *
File size: 14.3 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_LIM_PISCES.cfg 8 SHORT no/yes $JOB_FILE 0"
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
96
97# export EXE_DIR. This directory is used to execute model
98#
99#
100#
101echo "date: `date`" >> ${SETTE_DIR}/output.sette
102echo "" >> ${SETTE_DIR}/output.sette
103echo "running config: ${NEW_CONF}" >> ${SETTE_DIR}/output.sette
104echo "" >> ${SETTE_DIR}/output.sette
105echo "list of cpp_keys: " >> ${SETTE_DIR}/output.sette
106echo "`more ${SETTE_DIR}/../CONFIG/${NEW_CONF}/cpp_${NEW_CONF}.fcm`" >> ${SETTE_DIR}/output.sette
107echo "" >> ${SETTE_DIR}/output.sette
108echo "compiling with: ${CMP_NAM}" >> ${SETTE_DIR}/output.sette
109echo "" >> ${SETTE_DIR}/output.sette
110echo "executing script : \"fcm_job $@\" " >> ${SETTE_DIR}/output.sette
111echo "            " >> ${SETTE_DIR}/output.sette
112
113################################################################
114# SET INPUT
115# get the input tarfile if needed
116if [ "$(cat ${SETTE_DIR}/$INPUTARFILE | wc -w)" -ne 0 ] ; then
117   echo "looking for input files in ${SETTE_DIR}/$INPUTARFILE " >> ${SETTE_DIR}/output.sette
118# number of tarfiles: NBTAR
119   NBTAR=`cat ${SETTE_DIR}/$INPUTARFILE |wc -l` 
120   echo "NB of tarfiles ${NBTAR} " >> ${SETTE_DIR}/output.sette
121# loop on tarfiles
122# read file name and directory
123while read tar_file dir_conf_forc
124do
125      echo looking for tarfile ${tar_file} and directory ${FORCING_DIR}/${dir_conf_forc} ; echo looking for tarfile ${tar_file} and directory ${FORCING_DIR}/${dir_conf_forc} >> ${SETTE_DIR}/output.sette
126      if [ -f ${FORCING_DIR}/${tar_file} ] && [ -d ${FORCING_DIR}/${dir_conf_forc} ] ; then
127# Tarfile and input dir ar there, only check the links
128         echo "Tarfile and input dir ar there, only check the links" >> ${SETTE_DIR}/output.sette
129# extract tarfile
130      else
131
132if [ ! -f ${FORCING_DIR}/${tar_file} ] ; then 
133     echo "tarfile  ${FORCING_DIR}/${tar_file} cannot be found we stop " ; exit 2 ; fi
134
135echo "mkdir ${FORCING_DIR}/${dir_conf_forc}" >> ${SETTE_DIR}/output.sette
136         mkdir ${FORCING_DIR}/${dir_conf_forc} 
137         cd    ${FORCING_DIR}/${dir_conf_forc}
138echo " extract from tarfile ${FORCING_DIR}/${tar_file} in  ${FORCING_DIR}/${dir_conf_forc}" >> ${SETTE_DIR}/output.sette
139         tar xvof ${FORCING_DIR}/${tar_file} ; gunzip -f `find . -name "*.gz"` 
140      fi
141# Tarfile and input dir ar there, only check the links
142      cd ${FORCING_DIR}/${dir_conf_forc}
143      for fida in *
144         do
145           [ -f ${EXE_DIR}/${fida} ] || ln -s ${FORCING_DIR}/${dir_conf_forc}/${fida} ${EXE_DIR}/${fida}
146         done
147    done < ${SETTE_DIR}/$INPUTARFILE
148
149else
150  echo "no input file to be searched "
151fi
152################################################################
153
154##########################################################################
155# COPY RESTART FILES (if needed; i.e. only for SHORT job in RESTART TESTS)
156# get the input tarfile if needed
157# SF : not ok for the moment because at this point is needed cn_exp variable,
158# SF : here it it not known.
159#\cd ${EXE_DIR}
160#if [ "$(echo ${TEST_NAME} | grep -c "SHORT" )" -ne 0 ] ; then
161#    for (( i=1; i<=${NB_PROC}; ${NB_PROC}++)) ; do
162#        L_NPROC=`printf "%04d\n" $i`
163#        ln -sf ../LONG/${NEW_CONF}_00000060_restart_${L_NPROC-1}.nc .
164#    done
165#fi
166## SF : other way
167##      for file in ../LONG/${NEW_CONF}_*restart_0*.nc ; do
168##              ncpu=`echo $file | awk -F '_' '{print $NF}' | cut -f 1 -d '.'`
169##              ln -sf ${file}  .
170##      done
171##fi
172##########################################################################
173
174################################################################
175# RUN OPA
176cd ${EXE_DIR}
177if [ ! -r ${EXE_DIR}/opa ]
178    then
179    echo "executable opa does not exist"
180    echo "executable opa does not exist, exit"  >> ${SETTE_DIR}/output.sette
181    exit 1
182fi
183
184# example for NOCS ClusterVision system using SLURM batch submission (requires ${SETTE_DIR}/sette_batch_template file)
185#
186  #  if [ ${MPI_FLAG} == "no" ] ; then
187      case ${COMPILER} in
188         X64_MOBILIS)
189                                NB_REM=$( echo $NB_PROC $NXIO_PROC | awk '{print ( $1 + $2 ) % 16}')
190               if [ ${NB_REM} == 0 ] ; then
191               # number of processes required is an integer multiple of 16
192               #
193               NB_NODES=$( echo $NB_PROC $NXIO_PROC | awk '{print ($1 + $2 ) / 16}')
194            else
195               #
196               # number of processes required is not an integer multiple of 16
197               # round up the number of nodes required.
198               #
199               NB_NODES=$( echo $NB_PROC $NXIO_PROC | awk '{printf("%d",($1 + $2 ) / 16 + 1 )}')
200                  fi
201            ;;
202                        XC_ARCHER_INTEL)
203                                # ocean cores are packed 24 to a node
204                                NB_REM=$( echo $NB_PROC | awk '{print ( $1 % 24 ) }')
205                                if [ ${NB_REM} == 0 ] ; then
206                                        # number of processes required is an integer multiple of 24
207                                        #
208                                        NB_NODES=$( echo $NB_PROC $NXIO_PROC | awk '{print ($1) / 24}')
209                                else
210                                        #
211                                        # number of processes required is not an integer multiple of 24
212                                        # round up the number of nodes required.
213                                        #
214                                        NB_NODES=$( echo $NB_PROC | awk '{printf("%d",($1) / 24 + 1 )}')
215                                fi
216                                # xios cores are sparsely packed at 4 to a node
217                                # but can not share nodes with the ocean cores
218                                NB_REM=$( echo $NXIO_PROC | awk '{print ( $2 % 4 ) }')
219                                if [ ${NB_REM} == 0 ] ; then
220                                        # number of processes required is an integer multiple of 4                           
221                                        #
222                                        NB_NODES=$( echo $NB_NODES $NXIO_PROC | awk '{print ($1 + ( $2 / 4 ))}')                   
223                                else
224                                        #
225                                        # number of processes required is not an integer multiple of 4                             
226                                        # round up the number of nodes required.
227                                        #
228                                        NB_NODES=$( echo $NB_NODES $NXIO_PROC | awk '{print ($1 + ( $2 / 4 ) + 1)}') 
229                                fi
230                                ;;
231                        XC40_METO*) #Setup for Met Office XC40 with any compiler
232                                # ocean cores are packed 32 to a node
233                                # If we need more than one node then have to use parallel queue and XIOS must have a node to itself
234                                NB_REM=$( echo $NB_PROC | awk '{print ( $1 % 32 ) }')
235                                if [ ${NB_REM} == 0 ] ; then
236                                        # number of processes required is an integer multiple of 32
237                                        #
238                                        NB_NODES=$( echo $NB_PROC $NXIO_PROC | awk '{print ($1) / 32}')
239                                else
240                                        #
241                                        # number of processes required is not an integer multiple of 32
242                                        # round up the number of nodes required.
243                                        #
244                                        NB_NODES=$( echo $NB_PROC $NXIO_PROC | awk '{printf("%d",($1) / 32 + 1 )}')
245                                fi
246                                # xios cores are sparsely packed at 4 to a node
247                                if [ $NXIO_PROC == 0 ] ; then
248                                    NB_XNODES=0
249                                else
250                                    NB_REM=$( echo $NXIO_PROC | awk '{print ( $1 % 4 ) }')
251                                    if [ ${NB_REM} == 0 ] ; then
252                                            # number of processes required is an integer multiple of 4                           
253                                            #
254                                            NB_XNODES=$( echo $NXIO_PROC | awk '{print (( $1 / 4 ) + 1)}') 
255                                    else
256                                            #
257                                            # number of processes required is not an integer multiple of 4                             
258                                            # round up the number of nodes required.
259                                            #
260                                            NB_XNODES=$( echo $NXIO_PROC | awk '{printf("%d",($1) / 4 + 1) }')                   
261                                    fi
262                                fi
263                                if [ ${NB_XNODES} -ge 1 ] ; then
264                                   NB_NODES=$((NB_NODES+NB_XNODES))
265                                fi
266                                echo NB_XNODES=${NB_XNODES} 
267                                echo Total NB_NODES=${NB_NODES}
268                                QUEUE=normal
269                                SELECT="select=$NB_NODES"
270                                module unload cray-snplauncher #Make sure snplauncher module is not loaded
271                                ;;
272                        openmpi_NAVITI_MERCATOR)
273                                echo NB_PROCS ${NB_PROC}
274                                echo NB_NODES ${NB_NODES}
275                                echo  NB_PROC ${NB_PROC}
276                                if [ ${NB_PROC} -eq 1 ] ; then
277                                   NB_NODES=1
278                                   QUEUE=monoproc
279                                   NB_PROC_NODE=${NB_PROC}
280                                else
281                                   if [ ${NB_PROC} -le 16 ] ; then
282                                      NB_NODES=1
283                                      QUEUE=mono
284                                      NB_PROC_NODE=${NB_PROC}
285                                   else
286                                      NB_NODES=$( echo $NB_PROC | awk '{print $1 - $1 % 16}'  | awk '{print $1 / 16 }')
287                                      QUEUE=multi
288                                      NB_PROC_NODE=16
289                                  fi
290                                fi
291                                echo NB_PROCS     ${NB_PROC}
292                                echo NB_NODES     ${NB_NODES}
293                                echo NB_PROC_NODE ${NB_PROC_NODE}
294                                ;;
295         *)
296            NB_NODES=${NB_PROC}
297            ;;
298
299      esac
300#
301# Pass settings into job file by using sed to edit predefined strings
302#
303        TOTAL_NPROCS=$(( $NB_PROC + $NXIO_PROC ))
304        cat ${SETTE_DIR}/job_batch_template | sed -e"s/NODES/${NB_NODES}/" \
305             -e"s/TOTAL_NPROCS/${TOTAL_NPROCS}/" \
306             -e"s/NPROCS/${NB_PROC}/" \
307             -e"s/NXIOPROCS/${NXIO_PROC}/" \
308             -e"s:DEF_SETTE_DIR:${SETTE_DIR}:" -e"s:DEF_INPUT_DIR:${INPUT_DIR}:" \
309             -e"s:DEF_EXE_DIR:${EXE_DIR}:" \
310             -e"s:DEF_CONFIG_DIR:${CONFIG_DIR}:" \
311             -e"s:MPI_FLAG:${MPI_FLAG}:" \
312             -e"s:DEF_NEMO_VALIDATION:${NEMO_VALIDATION_DIR}:" -e"s:DEF_NEW_CONF:${NEW_CONF}:" \
313             -e"s:DEF_CMP_NAM:${CMP_NAM}:" -e"s:DEF_TEST_NAME:${TEST_NAME}:" > run_sette_test.job
314
315        case ${COMPILER} in
316              openmpi_NAVITI_MERCATOR)
317                    cat run_sette_test.job | sed -e"s/NPROC_NODE/${NB_PROC_NODE}/" \
318                                                 -e"s:QUEUE:${QUEUE}:" > run_sette_test1.job
319                    mv run_sette_test1.job run_sette_test.job
320                    ;;
321              XC40_METO*)
322                    cat run_sette_test.job | sed -e"s/SELECT/${SELECT}/" > run_sette_test1.job
323                    mv run_sette_test1.job run_sette_test.job
324                    ;;
325   esac
326#
327# create the unique submission job script
328#
329   if [ ! -f $JOB_FILE ] ; then
330      mv run_sette_test.job $JOB_FILE
331   else
332       e=`grep -n "# END_BODY" ${JOB_FILE} | cut -d : -f 1`
333            e=$(($e - 1))
334       head -$e $JOB_FILE > ${JOB_FILE}_new
335       mv ${JOB_FILE}_new ${JOB_FILE}
336       l=`wc -l run_sette_test.job | sed -e "s:run_sette_test.job::"`
337       b=`grep -n "# BODY" run_sette_test.job | cut -d : -f 1`
338       t=$(($l - $b))
339       tail -$t run_sette_test.job >> $JOB_FILE
340   fi
341   
342   chmod a+x $JOB_FILE ; echo "$JOB_FILE is ready"
343
344#fi
Note: See TracBrowser for help on using the repository browser.