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.
trusting_func.sh in branches/2015/dev_r5092_CNRS_SETTE/NEMOGCM/TRUST – NEMO

source: branches/2015/dev_r5092_CNRS_SETTE/NEMOGCM/TRUST/trusting_func.sh @ 5665

Last change on this file since 5665 was 5665, checked in by nicolasmartin, 9 years ago

dev_r5092_CNRS_SETTE Few bugfixes & improvments, clarify displayed comments

  • Property eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Rev URL
File size: 9.5 KB
Line 
1#!/bin/bash
2
3
4## Messenger filenames
5FILE_DATE=mesg_01_date_$PATTERNAME.txt    ; FILE_STAT=mesg_02_status_$PATTERNAME.txt
6FILE_RESU=mesg_03_result_$PATTERNAME.txt  ; FILE_NEMO=mesg_04_nemogcm_$PATTERNAME.txt
7FILE_XIOS=mesg_05_xios_$PATTERNAME.txt    ; FILE_COMP=mesg_06_compiler_$PATTERNAME.txt
8FILE_MPIN=mesg_07_mpi_$PATTERNAME.txt     ; FILE_NCDF=mesg_08_netcdf_$PATTERNAME.txt
9FILE_INPT=mesg_09_inputs_$PATTERNAME.txt  ; FILE_CPUT=mesg_10_cputime_$PATTERNAME.txt
10FILE_COMM=mesg_11_comments_$PATTERNAME.txt;
11
12## Trusting summary & archive filenames
13FILE_TRUS=trusting_${DATE}_$PATTERNAME.txt; FILE_ARCH=trusting_${DATE}_$PATTERNAME.tar.gz
14
15print_step() { printf "\nStep.....\n$1\n"; }
16
17init_files() {
18    echo 'Date'          >  ${FILE_DATE}; echo 'Status'           >  ${FILE_STAT}
19    echo 'Result'        >  ${FILE_RESU}; echo 'NEMOGCM rev.'     >  ${FILE_NEMO}
20    echo 'XIOS rev.'     >  ${FILE_XIOS}; echo 'Fortran compiler' >  ${FILE_COMP}
21    echo 'MPI libs'      >  ${FILE_MPIN}; echo 'NetCDF libs'      >  ${FILE_NCDF}
22    echo 'Input files'   >  ${FILE_INPT}; echo 'Real CPU time'    >  ${FILE_CPUT}
23    echo 'Comments'      >  ${FILE_COMM}
24
25    echo $ST             >> ${FILE_STAT}; echo 'Unknown error'    >> ${FILE_RESU}
26}
27
28get_date() {
29    local dat=$( date -ud ${DATE} +"%F %R %Z" )
30
31    echo $dat >> ${FILE_DATE}
32}
33
34get_nemo_rev() {
35    local rev_loc svn_cmd
36    local rev=0 svn_opt='status'
37
38    ## If -v|--version option has been set, modify svn command
39    if   [ $( echo ${NEMO_VERS} | grep  "HEAD\|up\|update"                     ) ]; then
40   svn_cmd='svn update -r HEAD'
41    elif [ $( echo ${NEMO_VERS} | grep -o '{[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}}' ) ]; then
42   svn_cmd='svn update -r '$( echo ${NEMO_VERS} | grep -o '{[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}}' )
43    elif [ $( echo ${NEMO_VERS} | grep -o '[0-9]*'                             ) ]; then
44   svn_cmd='svn update -r '$( echo ${NEMO_VERS} | grep -o '[0-9]*'                             )
45    else
46   svn_cmd='svn '${svn_opt}
47    fi
48
49    for dir in ${NEMO_ARCH} ${NEMO_CONF} ${NEMO_ENGI} \
50               ${NEMO_EIOI} ${NEMO_EFCM}              \
51          ${NEMO_TCMP} ${NEMO_TRBD}              \
52          ${DIR_XIOS}                             ; do
53
54   ## For time being, just get revision number from XIOS
55   if [ "$dir" == "${DIR_XIOS}" ]; then
56       rev_loc=$( svn info $dir | awk '(NR == 9) {print $NF}' )
57       echo 'XIOS '${rev_loc} >> model.log
58       echo "<a href=\"https://forge.ipsl.jussieu.fr/ioserver/changeset/${rev_loc}\" target=\"_blank\">${rev_loc}</a>" \
59      >> ${FILE_XIOS}
60       continue
61   fi
62
63   echo $dir
64   ${svn_cmd} $dir
65   rev_loc=$( svn info $dir | awk '(NR == 9) {print $NF}' )
66   (( ${rev_loc} >= $rev )) && rev=${rev_loc}
67    done
68
69    echo 'NEMOGCM '$rev   >> model.log
70    echo "<a href=\"https://forge.ipsl.jussieu.fr/nemo/changeset/$rev\" target=\"_blank\">$rev</a>" \
71   >> ${FILE_NEMO}
72}
73
74get_soft_rel() {
75    local soft_rel
76
77    for soft in $CDO $COMPILER $MPI $NETCDF; do
78   soft_rel=''
79
80        if (( ${I_MODULE} == 1 )); then
81       soft_rel=$( echo $LOADEDMODULES | sed "s/.*$soft\/\([0-9.a-z_]*\).*/\1/i" )
82   else
83       soft_rel=$( echo $PATH          | sed "s/.*$soft\([0-9.a-z_]*\).*/\1/i"   )
84   fi
85
86   [ "$soft" == "$COMPILER" ] && soft_rel=$( $soft --version | grep -m1 -oe '\<[0-9. ]*\>' )
87   soft=$( echo $soft | sed 's#\\##g; s#[/-]$##' ) ## Cleaning characters string to display proper soft name
88   echo $soft ${soft_rel} >> model.log
89    done
90
91    sed -n 4p model.log >> ${FILE_COMP}; sed -n 5p model.log >> ${FILE_MPIN}; sed -n 6p model.log >> ${FILE_NCDF}
92}
93
94get_inputs() {
95    local cmd_iol="tar -tvf ${NEMO_FORC}/${NEMO_TARF}" cmd_iof="tar -vxf ${NEMO_FORC}/${NEMO_TARF}"
96
97    [ -z "${NEMO_TARF}" ] && cmd_iol="ls ${NEMO_FORC}/*" && cmd_iof="\cp ${NEMO_FORC}/* ."
98    ${cmd_iol} > inputs_list.txt && ${cmd_iof} > /dev/null
99}
100
101diff_inputs() {
102    local dif
103    local files_list='' mesg='Same' 
104
105    for file in inputs_list.txt namelist_* *.xml; do
106   dif=''
107   if [ -e ${REFE_DIR}/$file ]; then dif=$( diff -q $file ${REFE_DIR}/$file ); else dif=0; fi
108
109   if [ -n "$dif" ]; then
110       mesg='Different'
111       [ "$dif" != '0' ] && echo $dif && files_list+=$file' '
112   fi
113
114    done
115
116    [ "$mesg" == 'Same' ] && echo $mesg
117    echo $mesg >> ${FILE_INPT}
118
119    [ -n "${files_list}" ] && echo 'Inputs  : '${files_list}'differ<br>' >> temp_${FILE_COMM}
120}
121
122job_pending() {
123    local time_elapsed=0 time_increment=30
124
125    sleep ${time_increment}
126
127    while [[ $( ${JOB_LIST} | grep ${JOB_ID} ) && ${time_elapsed} -lt ${TIME_LIMI} ]]; do
128   printf "\n####################################################\n" >> computation.log
129   ${JOB_INFO} ${JOB_ID}                                             >> computation.log
130   sleep ${time_increment}
131   time_elapsed=$(( ${time_elapsed} + ${time_increment} ))
132    done
133
134    sleep ${time_increment}
135
136    if [ ${time_elapsed} -eq ${TIME_LIMI} ]; then
137   ${JOB_DELE} ${JOB_ID} &> /dev/null
138   let TIME_LIMIT/=3600
139   get_out 6
140    fi
141}
142
143diff_results() {
144    local files_list=''
145
146    for file in ocean.output *.stat; do
147   [ ! -e ${REFE_DIR}/$file ] && export ST='FAILED' && get_out 7
148   diff -q $file ${REFE_DIR}/$file
149   (( $? != 0 )) && export ST='FAILED' && files_list+=$file' '
150    done
151
152    [ -n "${files_list}" ] && echo 'Results : '${files_list}'differ<br>' >> temp_${FILE_COMM}
153}
154
155diff_restart() {
156    local base_name diff_rcd file nb_dom
157    local dif=0 files_list=''
158
159    [ ! -e  ${REFE_DIR}/time.step ] && export ST='FAILED' && get_out 7
160
161    TIME_STEP=$( cat ${REFE_DIR}/time.step | tr -d [:space:] )
162    echo 'Last time step of standard run: '${TIME_STEP}
163
164    if [ $( find -regex ".*_0+${TIME_STEP}_restart.*\.nc" -print -quit ) ]; then
165   base_name=$( find -regex ".*_0+${TIME_STEP}_restart.*\.nc" -print -quit | awk -F/ '{print $NF}' \
166                | sed "s/^\(.*\)$TIME_STEP\_restart.*/\1$TIME_STEP\_/"                              )
167
168   for comp in restart restart_ice restart_trc; do
169       file=${base_name}${comp}
170
171       nb_dom=$( find -name "${file}_[0-9]*.nc" | wc -l | awk '{print $1}' )
172       if   [ ${nb_dom} -gt 1 ]; then
173      ${NEMO_TRBD}/rebuild_nemo -t $NPROC $file ${nb_dom} > /dev/null
174      [ $? -eq 0 ] && rm -f ${base_name}${comp}_[0-9]*.nc > /dev/null
175       elif [ ${nb_dom} -eq 0 ]; then
176      export ST='FAILED' && get_out 8
177       fi
178
179       if [ -e ${REFE_DIR}/$file.nc ]; then
180       ## UNIX `cmp` not suitable (filename & timestamp in .nc file)
181      diff_rcd=$( $CDO diffn $file.nc ${REFE_DIR}/$file.nc 2> /dev/null               \
182                  | awk '/records/ {print $0}' | sed 's/differ$/differ,/' | tr -d '\n'  )
183
184      if [[ ! -z ${diff_rcd} && $( echo ${diff_rcd} | awk '{print $1}') -ne 0 ]]; then
185          export ST='FAILED'
186          files_list+=$file' '
187          let dif+=$( echo ${diff_rcd} | awk '{print $1}' )
188          echo $file.nc': '${diff_rcd}
189      else
190          echo 'identical'
191      fi
192
193       else
194      export ST='FAILED' && get_out 7
195       fi
196
197   done
198
199   [ -n "${files_list}" ] && echo 'Restarts: '${files_list}$dif' record(s) differ<br>' >> temp_${FILE_COMM}
200    else
201   export ST='FAILED'
202    fi
203
204}
205
206get_cpu_time() {
207    local real_cpu_time=$( eval ${JOB_TIME} )
208
209    echo ${real_cpu_time} | tee -a ${FILE_CPUT}
210}
211
212comments() {
213    local state=$1
214
215    if [ "$state" == 'E R R O R' ]; then
216   [ -e time.step ] && TIME_STEP=$( cat time.step | tr -d ' ' )
217   [ -e ocean.output ] && line=$( grep -m1 -A4 "$state"   ocean.output | tr -d '\n' )
218    else
219   [ -e ocean.output ] && line=$( grep -m1 -A2 "^ $state" ocean.output | tr -d '\n' )
220    fi
221
222    echo   $line
223    printf $line >> temp_${FILE_COMM}
224}
225
226mesg_make() {
227    cat temp_${FILE_COMM} | tr -d '\n' | sed 's/<br>$//' >> ${FILE_COMM} ## Special construct for comments
228    paste -d ';' mesg_*.txt | tee ${FILE_TRUS}
229}
230
231mesg_publish() {
232    local cmd
233
234    if [ $PUBLISH -eq 1 ]; then
235
236   if [ -f ${REFE_DIR}/trusting_$PATTERNAME.txt ]; then cmd='tail -1'; else cmd='cat'; fi
237
238   $cmd ${FILE_TRUS} >> ${REFE_DIR}/trusting_$PATTERNAME.txt
239
240  ## Send mail only when FAILED
241   if [[ ! -z $EMAIL && "$ST" == 'FAILED' ]]; then
242       cat << END_MAIL > trusting.mail
243XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
244
245Dear $USER,
246
247The trusting sequence for ${REFE_CONF} has failed.
248Directory: ${TEST_DIR}
249Archive created: ${FILE_ARCH} in ${REFE_DIR}
250
251XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
252
253END_MAIL
254       [ -e ${TEST_DIR}/${FILE_TRUS} ] && cat ${TEST_DIR}/${FILE_TRUS}     >> trusting.mail
255       mail -s "[NEMO Trusting ${REFE_CONF} ${NEMO_BRAN}] $ST $ERR" $EMAIL <  trusting.mail
256   fi
257
258    fi
259}
260
261get_out() {
262    ERR=$1
263
264    cd ${TEST_DIR}
265
266    if [ "$ST" == 'FAILED' ]; then
267
268        ## Error identification
269   case $ERR in
270       ## Compilation
271       1) ERR='XIOS compilation failed'          ;;  2) ERR='NEMO compilation failed'            ;;
272       ## Submission
273       3) ERR='Missing input files'              ;;  4) ERR='Job submission error'               ;;
274       ## Running
275       5) ERR='Crashed at time step '${TIME_STEP};;  6) ERR='Exceeded time limit '${TIME_LIMI}'h';;
276       ## Results
277       7) ERR='Missing previous outputs'         ;;  8) ERR='New outputs differ'                 ;;
278       ## Undefined
279       *) ERR='Unknown error'                    ;;
280   esac
281
282   export ERR
283    fi
284
285    sed -i "2 s/.*/$ST/"  ${FILE_STAT}
286    sed -i "2 s/.*/$ERR/" ${FILE_RESU}
287
288    ## Save tested configuration if trusting failed
289    if [[ "$ST" == 'FAILED' && $PUBLISH -eq 1 && $DEBUG -eq 0 ]]; then
290   echo 'Creating archive '${FILE_ARCH}' under '${REFE_DIR}
291   tar -czf ${REFE_DIR}/${FILE_ARCH} * ${TEST_DIR}/${NEMO_CONF}/${TEST_CONF}/cpp_*  \
292                                        ${TEST_DIR}/${NEMO_CONF}/${TEST_CONF}/MY_SRC \
293                                       ${TEST_DIR}/${NEMO_CONF}/${TEST_CONF}/WORK
294    fi
295
296    mesg_make
297    mesg_publish
298
299    exit 0
300}
Note: See TracBrowser for help on using the repository browser.