/[MITgcm]/MITgcm/verification/testreport
ViewVC logotype

Annotation of /MITgcm/verification/testreport

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.122 - (hide annotations) (download)
Wed Apr 15 22:22:36 2009 UTC (15 years ago) by jmc
Branch: MAIN
Changes since 1.121: +6 -2 lines
for now, uses OpenMP for multi-threaded test

1 edhill 1.19 #! /usr/bin/env bash
2 edhill 1.1 #
3 jmc 1.122 # $Header: /u/gcmpack/MITgcm/verification/testreport,v 1.121 2009/01/30 20:08:09 jmc Exp $
4 edhill 1.12 # $Name: $
5 edhill 1.1 #
6    
7     usage()
8     {
9     echo
10     echo "Usage: $0 [OPTIONS]"
11     echo
12     echo "where possible OPTIONS are:"
13     echo " (-help|-h) print usage"
14 jmc 1.122 echo " (-mth) run multi-threaded (using eedata.mth)"
15 jmc 1.83 echo " (-mpi) compile and run using MPI"
16 edhill 1.10 echo " (-ieee|-noieee) if possible, use IEEE compiler flags"
17 edhill 1.41 echo " (DEF=\"-ieee\")"
18 jmc 1.109 echo " (-gsl) compile with \"-gsl\" flag"
19 jmc 1.89 echo " (-of=|-optfile=)STRING list of optfiles to use"
20 edhill 1.20 echo " (-a|-addr) STRING list of email recipients"
21 jmc 1.108 echo " (DEF=\"\" no email is sent)"
22 jmc 1.113 echo " (-mpd|-mpackdir) DIR location of the mpack utility"
23     echo " (DEF=\"../tools/mpack-1.6\")"
24 jmc 1.84 echo " (-t|-tdir) STRING list of group and/or exp. dirs to test"
25     echo " (recognized groups: basic, tutorials)"
26     echo " (DEF=\"\" which test all)"
27 jmc 1.89 echo " (-skd|-skipdir) STRING list of exp. dirs to skip"
28     echo " (DEF=\"\" which test all)"
29 edhill 1.20 echo " (-b|-bash) STRING preferred location of a \"bash\" or"
30     echo " Bourne-compatible \"sh\" shell"
31     echo " (DEF=\"\" for \"bash\")"
32 edhill 1.24 echo " (-adm|-ad) perform an adjoint run"
33 utke 1.120 echo " (-oad) perform an OpenAD adjoint run"
34 edhill 1.20 echo " (-command) STRING command to run"
35 edhill 1.6 echo " (DEF=\"make output.txt\")"
36 edhill 1.20 echo " (-m|-make) STRING command to use for \"make\""
37 edhill 1.8 echo " (DEF=\"make\")"
38 jmc 1.70 echo " (-odir) STRING used to build output directory name"
39     echo " (DEF=\"hostname\")"
40 jmc 1.89 echo " (-ptr|-ptracers) STRING specify which ptracers to test"
41 edhill 1.50 echo " (DEF=\"1 2 3 4 5\")"
42 jmc 1.92 echo " (-match) NUMBER Matching Criteria (number of digits)"
43     echo " (DEF=\"12\")"
44 edhill 1.43 echo " (-j) JOBS use \"make -j JOBS\" for parallel builds"
45 edhill 1.10 echo " (-clean) *ONLY* run \"make CLEAN\""
46 ce107 1.90 echo " (-quick|-q) same as \"-nogenmake -noclean -nodepend\""
47     echo " (-nogenmake|-ng) skip the genmake stage"
48     echo " (-noclean|-nc) skip the \"make clean\" stage"
49     echo " (-nodepend|-nd) skip the \"make depend\" stage"
50     echo " (-deldir|-dd) on success, delete the output directory"
51     echo " (-ts) provide timing information per timestep"
52     echo " (-papis) provide MFlop/s per timestep using PAPI"
53     echo " (-pcls) provide MFlop/s per timestep using PCL"
54 edhill 1.6 echo
55 edhill 1.50 echo "and where STRING can be a whitespace-delimited list"
56 edhill 1.6 echo "such as:"
57 edhill 1.50 echo
58 edhill 1.6 echo " -t 'exp0 exp2 exp3' "
59     echo " -addr='abc@123.com testing@home.org'"
60 edhill 1.1 echo
61 edhill 1.50 echo "provided that the expression is properly quoted within the current"
62     echo "shell (note the use of single quotes to protect white space)."
63     echo
64 edhill 1.1 exit 1
65     }
66    
67     # build the mpack utility
68     build_mpack()
69     {
70 edhill 1.34 printf "building the mpack utility... "
71 jmc 1.113 MPACK="$MPACKDIR/mpack"
72     if test ! -x $MPACK ; then
73 edhill 1.1 if test ! -d $MPACKDIR ; then
74 edhill 1.20 echo
75 edhill 1.1 echo "Error: can't find \"$MPACKDIR\""
76     echo " are you sure this program is being run in the correct "
77     echo " (that is, \"MITGCM_ROOT\verification\") directory?"
78 edhill 1.20 echo
79     HAVE_MPACK=f
80 edhill 1.1 fi
81 edhill 1.26 if test "x$CC" = x ; then
82     export CC=cc
83     fi
84 jmc 1.112 printf "building mpack (using CC=$CC)... "
85 edhill 1.25 ( cd $MPACKDIR && ./configure && $MAKE ) > tr_build_mpack.out 2>&1
86 edhill 1.1 RETVAL=$?
87     if test "x$RETVAL" != x0 ; then
88     echo
89     echo "Error building the mpack tools at: $MPACK_DIR"
90 edhill 1.20 echo
91     HAVE_MPACK=f
92     else
93 edhill 1.25 rm -f tr_build_mpack.out
94 edhill 1.20 HAVE_MPACK=t
95 jmc 1.113 echo "done"
96 edhill 1.1 fi
97 edhill 1.20 else
98     HAVE_MPACK=t
99 jmc 1.113 echo "already exist"
100 edhill 1.1 fi
101     }
102    
103 jmc 1.93 testoutput_var()
104 edhill 1.1 {
105 jmc 1.99 # testoutput_var dir s1 label subdir reference_output
106 edhill 1.1 #
107 jmc 1.93 # compares 1 variable output selected from file $dir/$subdir/$OUTPUTFILE
108 jmc 1.99 # with same output from reference file $dir/results/$reference_output
109 jmc 1.93 # using search strings s1 and text label
110 edhill 1.1
111     if [ $debug -gt 0 ]; then
112 jmc 1.93 echo testoutput_var: grep "$2" $1/$4/$OUTPUTFILE 1>&2
113 edhill 1.1 fi
114 jmc 1.87 if [ -r $1/$4/$OUTPUTFILE ]; then
115     grep "$2" $1/$4/$OUTPUTFILE | sed 's/.*=//' | cat -n > tmp1.txt
116 jmc 1.67 lncntA=`wc -l tmp1.txt | awk '{print $1}' `
117 jmc 1.100 if [ $lncntA -lt 2 ]; then
118 edhill 1.1 if [ $verbose -gt 0 ]; then
119     echo Not enough lines of output when searching for "$2" 1>&2
120     fi
121     return 99
122     fi
123     else
124 jmc 1.93 echo testoutput_var: $OUTPUTFILE from model run was not readable 1>&2
125 edhill 1.1 return 99
126     fi
127     if [ $debug -gt 0 ]; then
128 jmc 1.99 echo testoutput_var: grep "$2" $1/results/$5 1>&2
129 edhill 1.1 fi
130 jmc 1.99 grep "$2" $1/results/$5 | sed 's/.*=//' | cat -n > tmp2.txt
131 jmc 1.67 lncntB=`wc -l tmp2.txt | awk '{print $1}' `
132 jmc 1.100 if [ $lncntB -lt 2 ]; then
133 edhill 1.1 if [ $verbose -gt 0 ]; then
134     echo Not enough lines of output when searching for "$2" 1>&2
135     fi
136     return 99
137     fi
138 jmc 1.67 if [ $lncntA -ne $lncntB ]; then
139     if [ $verbose -gt 0 ]; then
140     echo Not same Nb of lines when searching for "$2" ":" $lncntA $lncntB 1>&2
141     fi
142     return 99
143     fi
144 edhill 1.72 has_nan=`cat tmp1.txt | grep -i nan | wc -l`
145     if [ $has_nan -gt 0 ] ; then
146 jmc 1.93 echo testoutput_var: $OUTPUTFILE contains $has_nan NaN values 1>&2
147 edhill 1.72 return 99
148     fi
149     has_inf=`cat tmp1.txt | grep -i inf | wc -l`
150     if [ $has_inf -gt 0 ] ; then
151 jmc 1.93 echo testoutput_var: $OUTPUTFILE contains $has_inf Inf values 1>&2
152 jmc 1.71 return 99
153     fi
154 edhill 1.1 if [ $debug -gt 0 ]; then
155 jmc 1.93 echo testoutput_var: join tmp1.txt tmp2.txt 1>&2
156 edhill 1.1 fi
157     join tmp1.txt tmp2.txt | awk '{print $1 " " $2 " " $3}' > tmp3.txt
158     if [ $debug -gt 0 ]; then
159 jmc 1.93 echo testoutput_var: compare_lines 1>&2
160 edhill 1.1 fi
161 edhill 1.22 if [ $verbose -gt 1 ]; then
162     cat tmp3.txt 1>&2
163     fi
164     echo "-1" >> tmp3.txt
165 edhill 1.23 # On the SGI O3K (*not* the O2K), "cat -n" inserts a ":" after the line number
166     cat tmp3.txt | sed -e 's|:||g' > tmp4.txt
167 jmc 1.91 digits_of_similarity=`./tr_cmpnum < tmp4.txt`
168 edhill 1.1 if [ $digits_of_similarity -eq 99 ]; then
169     if [ $verbose -gt 0 ]; then
170 jmc 1.99 echo testoutput_var: No comparison was available for \"$3\" 1>&2
171 edhill 1.1 fi
172     digits_of_similarity=99
173     else
174     if [ $verbose -gt 0 ]; then
175 jmc 1.99 echo There were $digits_of_similarity decimal places of similarity for \"$3\" 1>&2
176 edhill 1.1 fi
177     fi
178 edhill 1.23 rm -f tmp1.txt tmp2.txt tmp3.txt tmp4.txt
179 edhill 1.1
180     return $digits_of_similarity
181     }
182    
183 jmc 1.93 testoutput_run()
184 edhill 1.1 {
185 jmc 1.99 # testoutput_run directory subdir reference_output
186 edhill 1.1 #
187 jmc 1.93 # test output from 1 run in "directory"
188 jmc 1.103 # --> same processing for adjoint & forward test
189 jmc 1.94 # default list of output variables to be checked:
190     # 1rst : main variable used to decide if it pass or FAIL
191     # others : number of matching digits to be printed in summary.txt
192     listChk=$DEF_CHECK_LIST
193     # load experiment-specific list from file "tr_checklist" (if it exist)
194     if test -r $1/$2/tr_checklist ; then listChk=`cat $1/$2/tr_checklist` ; fi
195     sVar=`echo $listChk | awk '{print $1}'`
196     # remove 1rst var and expand the list: + => min max mean s.d
197 jmc 1.97 listVar=`echo $listChk | sed 's/ [a-zA-Z0-9]*+/&mn &mx &av &sd/g' \
198     | sed 's/+//g' | sed "s/^$sVar//"`
199 jmc 1.94 if [ $debug -gt 0 ]; then echo "testoutput_run: listVar(I)='$listVar'" 1>&2 ; fi
200 jmc 1.117 # check for ptracer output in reference_output file :
201     outpref=$1/results/$3
202     ptr_mon="trcstat_ptracerXX_min trcstat_ptracerXX_max"
203     ptr_mon="$ptr_mon trcstat_ptracerXX_mean trcstat_ptracerXX_sd"
204     for ii in $PTRACERS_NUM ; do
205     ptrfound=0
206     for jj in $ptr_mon ; do
207     name=`eval "echo $jj | sed -e 's|XX|0"$ii"|g'"`
208     tst=`grep $name $outpref | wc -l | awk '{print $1}'`
209     if test ! "x$tst" = x0 ; then ptrfound=1 ; fi
210     done
211     if test $ptrfound = '1' ; then
212     eval "HAVE_PTR0"$ii"=t"
213     else
214     eval "HAVE_PTR0"$ii"=f"
215 utke 1.120 if test "x$ADM" = x -a "x$OADM" = x; then
216 jmc 1.117 # remove this ptr from the list of output variable to check
217     # echo "-- ptr test=" $tst "number of var=" `echo $listVar | awk '{print NF}'` 1>&2
218     listVar=`echo "$listVar" | sed "s/ pt$ii..//g"`
219     fi
220     fi
221     # eval 'echo "HAVE_PTR0'$ii' = $HAVE_PTR0'$ii'"' 1>&2
222     done
223 mlosch 1.116 tst=`echo $sVar $listVar | awk '{ for(i=2;i<=NF;i++){if($i==$1)t+=1}; print t }'`
224 jmc 1.94 if test $tst != 1 ; then
225     if test $tst = 0 ; then echo "==> WARNING: selected var >$sVar< not found" 1>&2
226     else echo "==> WARNING: found selected var >$sVar< $tst times" 1>&2 ; fi
227     echo "==> WARNING: in checked list:" $listVar 1>&2
228     #- put it back once:
229     listVar=" $sVar "`echo "$listVar " | sed "s/ $sVar / /g"`
230     fi
231     if [ $debug -gt 0 ]; then echo "testoutput_run: listVar(M)='$listVar'" 1>&2 ; fi
232     echo "listVar='$listVar'" > $CDIR"/summary.txt"
233     allargs=""
234     for xx in $listVar
235     do
236     case $xx in
237     'PS') if [ $debug -gt 0 ]
238     then echo testoutput_run: testoutput_var $1 cg2d_init_res 1>&2 ; fi
239 jmc 1.99 testoutput_var $1 "cg2d_init_res" "Press. Solver (cg2d)" $2 $3; yy=$?
240 jmc 1.94 if [ $debug -gt 0 ] ; then echo testoutput_run: cg2dres=$yy 1>&2 ; fi ;;
241 jmc 1.101 'Cost') testoutput_var $1 "ADM precision_derivative_cost" "ADM Cost" $2 $3; yy=$? ;;
242     'Grad') testoutput_var $1 "ADM precision_derivative_grad" "ADM Grad" $2 $3; yy=$? ;;
243 jmc 1.99 'Tmn') testoutput_var $1 "dynstat_theta_min" "Theta minimum" $2 $3; yy=$? ;;
244     'Tmx') testoutput_var $1 "dynstat_theta_max" "Theta maximum" $2 $3; yy=$? ;;
245     'Tav') testoutput_var $1 "dynstat_theta_mean" "Theta mean" $2 $3; yy=$? ;;
246     'Tsd') testoutput_var $1 "dynstat_theta_sd" "Theta Std.Dev" $2 $3; yy=$? ;;
247     'Smn') testoutput_var $1 "dynstat_salt_min" "Salt minimum" $2 $3; yy=$? ;;
248     'Smx') testoutput_var $1 "dynstat_salt_max" "Salt maximum" $2 $3; yy=$? ;;
249     'Sav') testoutput_var $1 "dynstat_salt_mean" "Salt mean" $2 $3; yy=$? ;;
250     'Ssd') testoutput_var $1 "dynstat_salt_sd" "Salt Std.Dev" $2 $3; yy=$? ;;
251 jmc 1.94 'Umn') testoutput_var $1 "dynstat_uvel_min" "U minimum" $2 $3; yy=$? ;;
252     'Umx') testoutput_var $1 "dynstat_uvel_max" "U maximum" $2 $3; yy=$? ;;
253     'Uav') testoutput_var $1 "dynstat_uvel_mean" "U mean" $2 $3; yy=$? ;;
254 jmc 1.99 'Usd') testoutput_var $1 "dynstat_uvel_sd" "U Std.Dev" $2 $3; yy=$? ;;
255 jmc 1.94 'Vmn') testoutput_var $1 "dynstat_vvel_min" "V minimum" $2 $3; yy=$? ;;
256     'Vmx') testoutput_var $1 "dynstat_vvel_max" "V maximum" $2 $3; yy=$? ;;
257     'Vav') testoutput_var $1 "dynstat_vvel_mean" "V mean" $2 $3; yy=$? ;;
258 jmc 1.99 'Vsd') testoutput_var $1 "dynstat_vvel_sd" "V Std.Dev" $2 $3; yy=$? ;;
259 jmc 1.94 'pt1mn'|'pt2mn'|'pt3mn'|'pt4mn'|'pt5mn') ii=`echo $xx | sed 's/pt//' | sed 's/..$//'`
260     testoutput_var $1 "trcstat_ptracer0"$ii"_min" "p0"$ii"_min" $2 $3; yy=$? ;;
261     'pt1mx'|'pt2mx'|'pt3mx'|'pt4mx'|'pt5mx') ii=`echo $xx | sed 's/pt//' | sed 's/..$//'`
262     testoutput_var $1 "trcstat_ptracer0"$ii"_max" "p0"$ii"_max" $2 $3; yy=$? ;;
263     'pt1av'|'pt2av'|'pt3av'|'pt4av'|'pt5av') ii=`echo $xx | sed 's/pt//' | sed 's/..$//'`
264     testoutput_var $1 "trcstat_ptracer0"$ii"_mean" "p0"$ii"_mean" $2 $3; yy=$? ;;
265     'pt1sd'|'pt2sd'|'pt3sd'|'pt4sd'|'pt5sd') ii=`echo $xx | sed 's/pt//' | sed 's/..$//'`
266 jmc 1.99 testoutput_var $1 "trcstat_ptracer0"$ii"_sd" "p0"$ii"_StDv" $2 $3; yy=$? ;;
267 jmc 1.101 'Qntmn') testoutput_var $1 "extforcing_qnet_min" "Qnet minimum" $2 $3; yy=$? ;;
268     'Qntmx') testoutput_var $1 "extforcing_qnet_max" "Qnet maximum" $2 $3; yy=$? ;;
269     'Qntav') testoutput_var $1 "extforcing_qnet_mean" "Qnet mean" $2 $3; yy=$? ;;
270     'Qntsd') testoutput_var $1 "extforcing_qnet_sd" "Qnet Std.Dev" $2 $3; yy=$? ;;
271     'aSImn') testoutput_var $1 "seaice_area_min" "SIce Area min" $2 $3; yy=$? ;;
272     'aSImx') testoutput_var $1 "seaice_area_max" "SIce Area max" $2 $3; yy=$? ;;
273     'aSIav') testoutput_var $1 "seaice_area_mean" "SIce Area mean" $2 $3; yy=$? ;;
274     'aSIsd') testoutput_var $1 "seaice_area_sd" "SIce Area StDv" $2 $3; yy=$? ;;
275     'hSImn') testoutput_var $1 "seaice_heff_min" "SIce Heff min" $2 $3; yy=$? ;;
276     'hSImx') testoutput_var $1 "seaice_heff_max" "SIce Hell max" $2 $3; yy=$? ;;
277     'hSIav') testoutput_var $1 "seaice_heff_mean" "SIce Hell mean" $2 $3; yy=$? ;;
278     'hSIsd') testoutput_var $1 "seaice_heff_sd" "SIce Hell StDv" $2 $3; yy=$? ;;
279     'AthSiG') testoutput_var $1 "thSI_Ice_Area_G" "thSIc Area Global" $2 $3; yy=$? ;;
280     'AthSiS') testoutput_var $1 "thSI_Ice_Area_S" "thSIc Area South" $2 $3; yy=$? ;;
281     'AthSiN') testoutput_var $1 "thSI_Ice_Area_N" "thSIc Area North" $2 $3; yy=$? ;;
282     'HthSiG') testoutput_var $1 "thSI_IceH_ave_G" "thSIc H Global" $2 $3; yy=$? ;;
283     'HthSiS') testoutput_var $1 "thSI_IceH_ave_S" "thSIc H South" $2 $3; yy=$? ;;
284     'HthSiN') testoutput_var $1 "thSI_IceH_ave_N" "thSIc H North" $2 $3; yy=$? ;;
285 jmc 1.94 *) yy=99; echo "WARNING: asking for var=$xx : not recognized !" 1>&2 ;;
286     esac
287     if test $xx = $sVar
288     then allargs="$allargs > $yy <"
289     else allargs="$allargs $yy"
290     fi
291     done
292    
293     nbVar=`echo $listVar | awk '{print NF}'`
294 jmc 1.97 if [ $nbVar -lt $LEN_CHECK_LIST ] ; then
295 jmc 1.94 #-- fill line (up to standard length) with dot:
296 jmc 1.97 adNul=`expr $LEN_CHECK_LIST - $nbVar | awk '{for(i=1;i<=$1;i++){print "."}}'`
297 jmc 1.94 echo $allargs $adNul
298     else
299     echo $allargs
300     fi
301 jmc 1.103 # <-- same processing for adjoint & forward test
302 edhill 1.1 }
303    
304     genmakemodel()
305     {
306     # genmakemodel directory
307 edhill 1.10 if test "x$NOGENMAKE" = xt ; then
308     echo "genmake skipped!"
309     else
310 edhill 1.34 if test "x$BASH" = x ; then
311     GENMAKE2="../../../tools/genmake2"
312     else
313     GENMAKE2="$BASH ../../../tools/genmake2 -bash $BASH"
314     fi
315 edhill 1.10 (
316     cd $1;
317 edhill 1.24 command="$GENMAKE2 -ds -m $MAKE"
318 utke 1.120 if test "x$ADM" = xt ; then
319     command="$command --mods=../code_ad"
320     elif test "x$OADM" = xt ; then
321     command="$command -adof ../../../tools/adjoint_options/adjoint_oad -mods '../code_oad ../../OpenAD/code_oad_all'"
322     else
323 edhill 1.24 command="$command --mods=../code"
324     fi
325 edhill 1.10 if test "x$OPTFILE" != xNONE ; then
326     command="$command --optfile=$OPTFILE"
327     fi
328     if test "x$IEEE" != x ; then
329     command="$command -ieee"
330     fi
331 jmc 1.109 if test "x$GSL" = xt ; then
332     command="$command -gsl"
333     fi
334 edhill 1.66 if test "x$MPI" = xt ; then
335     command="$command -mpi"
336     fi
337 jmc 1.122 if test "x$MULTI_THREAD" = xt ; then
338     #- run multi-threaded using OpenMP:
339     command="$command -omp"
340     fi
341 ce107 1.90 if test "x$TS" = xt ; then
342     command="$command -ts"
343     fi
344     if test "x$PAPIS" = xt ; then
345     command="$command -papis"
346     else
347     if test "x$PCLS" = xt ; then
348     command="$command -pcls"
349     fi
350     fi
351 edhill 1.10 printf 'genmake ... ' 1>&2
352 utke 1.120 # $command > make.log 2>&1
353     eval $command > make.log 2>&1
354 edhill 1.10 RETVAL=$?
355 edhill 1.44 # Reduce the size of the testing emails!
356 edhill 1.47 head -100 Makefile > $CDIR/Makefile_head
357 edhill 1.10 if test "x$RETVAL" != x0 ; then
358     tail make.log
359     echo "genmakemodel: genmake failed" 1>&2
360 edhill 1.21 cp genmake_* make.log $CDIR
361 edhill 1.10 return 1
362     else
363 edhill 1.20 echo "successful" 1>&2
364 edhill 1.1 fi
365 edhill 1.10 )
366     fi
367 edhill 1.1 }
368    
369     makeclean()
370     {
371     # makeclean directory
372 edhill 1.10 if test "x$NOCLEAN" = xt ; then
373 jmc 1.83 echo "make Clean skipped!"
374 edhill 1.10 else
375     (
376     cd $1;
377 jmc 1.87 #if test -e $OUTPUTFILE ; then rm -f $OUTPUTFILE ; fi
378 edhill 1.10 if test -r Makefile ; then
379 jmc 1.83 printf 'clean build-dir: make Clean ... ' 2>&1
380     $MAKE Clean >> make.log 2>&1
381 edhill 1.10 RETVAL=$?
382     if test "x$RETVAL" != x0 ; then
383     tail make.log
384 jmc 1.83 echo "makeclean: \"make Clean\" failed" 1>&2
385 edhill 1.10 cp make.log $CDIR"/make.log"
386     return 1
387     fi
388     fi
389 edhill 1.20 echo successful 1>&2
390 edhill 1.10 exit 0
391     )
392     fi
393     }
394    
395 jmc 1.83 run_clean()
396 edhill 1.68 {
397 jmc 1.83 # run_clean directory
398     if test "x$NOCLEAN" = xt ; then
399     echo "run_clean skipped!"
400     else
401 edhill 1.68 (
402     cd $1;
403 jmc 1.83 printf 'clean run-dir ... ' 2>&1
404     # part of what is done after "make clean" when doing "make CLEAN"
405     find . -name "*.meta" -exec rm {} \;
406     find . -name "*.data" -exec rm {} \;
407     find . -name "fort.*" -exec rm {} \;
408     find . -type l -exec rm {} \;
409     rm -f $EXECUTABLE *.txt STD* *diagnostics.log datetime
410     rm -rf mnc_test_*
411 jmc 1.107 rm -f *_MIT_CE_000.opt0000 costfunction*0000
412 jmc 1.83 echo successful 1>&2
413 edhill 1.68 exit 0
414     )
415     fi
416     }
417    
418 edhill 1.10 makedependmodel()
419     {
420     # makedependmodel directory
421     if test "x$NODEPEND" = xt ; then
422     echo "make depend skipped!"
423     else
424     (
425     cd $1;
426     printf 'make depend ... ' 1>&2
427     $MAKE depend >> make.log 2>&1
428 edhill 1.1 RETVAL=$?
429     if test "x$RETVAL" != x0 ; then
430     tail make.log
431 edhill 1.10 echo "makedependmodel: make depend failed" 1>&2
432 edhill 1.1 cp make.log $CDIR"/make.log"
433     return 1
434 edhill 1.10 else
435 edhill 1.20 echo successful 1>&2
436 edhill 1.1 fi
437 edhill 1.10 )
438     fi
439 edhill 1.1 }
440    
441     makemodel()
442     {
443     # makemodel directory
444     (
445     cd $1;
446     if test -r Makefile ; then
447     printf 'make ... ' 1>&2
448 utke 1.120 if test "x$ADM" = xt ; then
449     $MAKE adall >> make.log 2>&1
450     elif test "x$OADM" = xt ; then
451     $MAKE adAll >> make.log 2>&1
452     else
453 edhill 1.43 if test "x$JOBS" = x ; then
454     $MAKE >> make.log 2>&1
455     else
456     $MAKE -j $JOBS >> make.log 2>&1
457     fi
458 edhill 1.24 fi
459 edhill 1.1 RETVAL=$?
460     if test "x$RETVAL" != x0 ; then
461     tail make.log
462     echo failed 1>&2
463     cp make.log $CDIR"/make.log"
464     return 1
465     else
466 edhill 1.20 echo successful 1>&2
467 edhill 1.1 fi
468     fi
469     )
470     }
471    
472 edhill 1.27 symlink_mpifiles()
473     {
474     # Put special links so that MPI specific files are used
475     # This MUST be invoked between makeclean and makelinks because
476     # the Makefile will link to non-mpi files by default
477    
478     dir=$1
479     code_dir=$2
480     BUILD_DIR=$dir/$3
481     CODE_DIR=$dir/$code_dir
482 edhill 1.45
483 edhill 1.27 # These are files that should replace their counter-part when using -mpi
484 mlosch 1.111 MPI_FILES=`(cd $CODE_DIR; find . -name "*_mpi" -print)`
485 edhill 1.27
486     # Is this an MPI run?
487     if test "x$MPI" = xt ; then
488     # YES: We symbolically link these files to the build
489     # dir so long as there is no real file in place
490     for ii in $MPI_FILES ; do
491     i=`echo $ii | sed 's:^\./::'`
492     name=`echo $i | sed 's:_mpi::' `
493     cmp $CODE_DIR/$i $BUILD_DIR/$name > /dev/null 2>&1
494     RETVAL=$?
495     if test "x$RETVAL" != x0 ; then
496     if ! test -f $BUILD_DIR/$i ; then
497 edhill 1.45 #echo Linking $name to $i
498 edhill 1.27 (cd $BUILD_DIR; ln -sf ../$code_dir/$i $name)
499     fi
500     fi
501     done
502     else
503 edhill 1.45 # NO: We undo any _mpi symbolically linked files
504 edhill 1.27 for ii in $MPI_FILES ; do
505     i=`echo $ii | sed 's:^\./::'`
506     name=`echo $i | sed 's:_mpi::' `
507     if test -L $BUILD_DIR/$name ; then
508 edhill 1.45 cmp $BUILD_DIR/$name "../$code_dir/$name"_mpi > /dev/null 2>&1
509     RETVAL=$?
510     if test "x$RETVAL" = x0 ; then
511     #echo Un-linking $name from $linktarg
512 edhill 1.27 rm -f $BUILD_DIR/$name
513     fi
514     fi
515     done
516     fi
517    
518     }
519    
520 edhill 1.1 linkdata()
521     {
522 jmc 1.83 # linkdata run_dir input_dir_1 input_dir_2 ...
523 edhill 1.1 #
524     # symbolically link data files to run directory
525 jmc 1.83 if test -d $1 ; then
526 edhill 1.12 (
527 jmc 1.83 cd $1 ; shift
528     if test -r "../"$1"/eedata.mth" ; then
529     # found eedata.mth in 1rst input dir and it is readable
530     if test "x$MULTI_THREAD" = "xt" ; then
531     # multi-threaded test: remove symbolic link & link eedata.mth
532     if test -h eedata ; then rm -f eedata ; fi
533     if test ! -r eedata ; then
534     ln -sf "../"$1"/eedata.mth" eedata ;
535     printf 'eedata.mth ' 1>&2
536 edhill 1.24 fi
537 jmc 1.83 else
538     # not multi-threaded test: remove eedata symbolic link
539     if test -h eedata ; then rm -f eedata ; fi
540     fi
541     fi
542 jmc 1.108 prevDir='NONE'
543 jmc 1.83 for ldir in $* ; do
544 jmc 1.108 if test -d "../"$ldir -a $ldir != $prevDir ; then
545 jmc 1.83 printf 'ldir='${ldir} 1>&2
546     files=`( cd "../"$ldir ; ls -1 | grep -v CVS )`
547     for i in $files ; do
548     if test ! -d "../"$ldir/$i ; then
549     if test ! -r $i ; then
550     printf ' '$i 1>&2
551     ln -sf "../"$ldir"/"$i $i
552     fi
553     fi
554     done
555     if test -x "../"$ldir"/"prepare_run ; then
556     "../"$ldir"/"prepare_run
557 edhill 1.24 fi
558 jmc 1.83 printf ' ; ' 1>&2
559 jmc 1.82 fi
560 jmc 1.108 prevDir=$ldir
561 jmc 1.83 done
562 edhill 1.12 )
563 edhill 1.1 fi
564     }
565    
566     runmodel()
567     {
568 edhill 1.6 # runmodel directory
569 edhill 1.1 #
570 edhill 1.24 # runs "$COMMAND in "directory"
571 edhill 1.6 # (where "$COMMAND" is relative to "directory")
572 edhill 1.1 (
573     cd $1
574 jmc 1.75 printf 'runmodel in %s ...' $1 1>&2
575 edhill 1.6 # make output.txt
576 edhill 1.38 echo
577 jmc 1.106 if test -L $EXECUTABLE -a -x "../"$builddir"/"$EXECUTABLE ; then
578     diff -q $EXECUTABLE "../"$builddir"/"$EXECUTABLE > /dev/null 2>&1
579 jmc 1.119 outD=$? ; if test $outD != 0 ; then rm -f $EXECUTABLE ; fi
580 jmc 1.106 fi
581 jmc 1.83 if test ! -x $EXECUTABLE -a -x "../"$builddir"/"$EXECUTABLE ; then
582 jmc 1.119 echo " link" $EXECUTABLE "from dir ../"$builddir > run.log_tmp
583 jmc 1.83 ln -sf "../"$builddir"/"$EXECUTABLE .
584     fi
585     if test ! -x $EXECUTABLE ; then
586 jmc 1.119 rm -f $RUNLOG ; touch $RUNLOG
587     if test -f run.log_tmp ; then cat run.log_tmp >> $RUNLOG ; fi
588     echo " no executable:" $EXECUTABLE >> $RUNLOG
589 jmc 1.83 RETVAL=8
590 jmc 1.88 ENDVAL=-1
591 jmc 1.75 else
592 jmc 1.98 if test ! -f $OUTPUTFILE -o $OUTPUTFILE -ot $EXECUTABLE ; then
593     # output do not exist or is older than executable:
594 jmc 1.119 rm -f $RUNLOG ; touch $RUNLOG
595     if test -f run.log_tmp ; then cat run.log_tmp >> $RUNLOG ; fi
596     ( eval $COMMAND ) >> $RUNLOG 2>&1
597 jmc 1.83 RETVAL=$?
598     else
599     RETVAL=0
600 jmc 1.119 if test -f $RUNLOG ; then
601     if test -f run.log_tmp ; then cat run.log_tmp >> $RUNLOG ; fi
602     echo "---------->> $OUTPUTFILE is up to date " >> $RUNLOG 2>&1
603 jmc 1.88 else
604 jmc 1.119 touch $RUNLOG
605     if test -f run.log_tmp ; then cat run.log_tmp >> $RUNLOG ; fi
606     echo "---------->> $OUTPUTFILE is up to date " >> $RUNLOG 2>&1
607     echo " no previous $RUNLOG: assume NORMAL END" >> $RUNLOG 2>&1
608 jmc 1.88 fi
609 jmc 1.83 fi
610 jmc 1.119 ENDVAL=`cat $RUNLOG | grep -v 'ABNORMAL END' | grep -c 'NORMAL END'`
611 jmc 1.75 fi
612 jmc 1.119 rm -f run.log_tmp
613 jmc 1.88 #if test "x$RETVAL" = x0 ; then
614     if [ $RETVAL -eq 0 -a $ENDVAL -gt 0 ] ; then
615 jmc 1.119 tail $RUNLOG
616 edhill 1.20 echo successful 1>&2
617 edhill 1.44 # === Reduce the size of the testing emails!
618 jmc 1.87 #cp $OUTPUTFILE $CDIR"/"$OUTPUTFILE
619 jmc 1.48 if test -s STDERR.0000 ; then cp STDERR.0000 $CDIR"/STDERR.0000" ; fi
620 edhill 1.6 return 0
621     else
622 jmc 1.119 tail $RUNLOG
623 jmc 1.88 echo failed '(run:' $RETVAL ' end:' $ENDVAL ')' 1>&2
624 jmc 1.119 cp $RUNLOG $CDIR"/"$RUNLOG
625 jmc 1.48 if test -s STDERR.0000 ; then cp STDERR.0000 $CDIR"/STDERR.0000" ; fi
626 edhill 1.6 return 1
627 edhill 1.1 fi
628     )
629     }
630    
631     createcodelet()
632     {
633     # create codelet for comparing model output
634    
635 jmc 1.112 printf "creating the comparison code (using CC=$CC)... "
636 jmc 1.91 cat > tr_cmpnum.c <<EOF
637 edhill 1.22 #include <stdio.h>
638     #include <math.h>
639     int main( int argc, char** argv ) {
640 jmc 1.91 int linnum,cmplin,best,lncnt;
641 edhill 1.52 double a,b,abave,relerr;
642 jmc 1.57 best = -22;
643 adcroft 1.33 lncnt = 0;
644 jmc 1.96 while( 1 & ( (lncnt+=1) < 999 ) ) {
645 edhill 1.22 scanf("%d", &linnum);
646     if (linnum == -1) break;
647     scanf("%lf", &a); scanf("%lf", &b);
648 edhill 1.52 abave = 0.5*(fabs(a)+fabs(b));
649 jmc 1.91 if ( abave == abave ) {
650     if (abave > 0.0) {
651     relerr=fabs(a-b)/abave;
652     if (relerr > 0.0) { cmplin = (int)rint(log10(relerr)); }
653     else { cmplin = -16 ; }
654     best = (best > cmplin) ? best : cmplin; }
655     else { cmplin = -22 ; }
656     /* printf("%d ; %lf ; %lf\n",cmplin,a,b); */
657     }
658     else {
659     /* printf("%lf ; %lf ; %lf\n",abave,a,b); */
660     break; }
661 edhill 1.22 }
662 adcroft 1.33 if (lncnt == 999) best=-29;
663 jmc 1.91 if (linnum != -1) best=-99;
664 edhill 1.22 printf("%d\n", -best);
665     return 0;
666     }
667     EOF
668 jmc 1.91 $CC -o tr_cmpnum tr_cmpnum.c -lm
669 edhill 1.1
670 jmc 1.91 if [ -x ./tr_cmpnum ]; then
671 edhill 1.1 echo "OK"
672     return 0
673     else
674     echo
675 edhill 1.58 echo "ERROR: failed to compile comparison code -- please specify"
676     echo " a C compiler using the CC environment variable."
677 edhill 1.1 exit 1
678     fi
679     }
680    
681     formatresults()
682     {
683     # formatresults expt genmake depend make run results*
684    
685     nm=$1
686     printf '%s %s %s %s' $2 $3 $4 $5
687     shift; shift; shift; shift; shift;
688 jmc 1.94 listPrt=$@
689     listRes=`echo $listPrt | sed 's/>//' | sed 's/<//'`
690     xx=`echo $listPrt | sed 's/.*>//' | sed 's/<.*//' | awk '{print $1}'`
691 jmc 1.97 printf '%3s' $listPrt
692 jmc 1.98 # line below does not work on hp-ux_ia64 : do those substitutions later on
693 jmc 1.95 # printf '%3s' $listPrt | sed 's/ 99/ --/g' | sed 's/ > />/' | sed 's/ < /</'
694 edhill 1.1
695 jmc 1.94 if [ $xx = '..' ]; then
696     printf ' N/O '
697     elif [ $xx = '--' ]; then
698     printf ' N/O '
699     elif [ $xx = 99 ]; then
700 edhill 1.1 printf ' N/O '
701     else
702 jmc 1.94 if [ $xx -ge $MATCH_CRIT ]; then
703 edhill 1.1 printf ' pass'
704     else
705     printf ' FAIL'
706     fi
707     fi
708     printf ' %s' $nm
709     printf '\n'
710    
711     }
712    
713     scandirs()
714     {
715 jmc 1.81 if [ $# -eq 1 ]; then
716     for arg in * ; do
717 jmc 1.99 test -f $arg/$1 && echo $arg
718 jmc 1.81 done
719 edhill 1.1 else
720 jmc 1.81 echo $*
721 edhill 1.1 fi
722     }
723    
724    
725     ###############################################################################
726    
727    
728     # Default properties
729     debug=0
730     verbose=1
731     clean=0
732 edhill 1.10
733 edhill 1.40 IEEE=true
734 edhill 1.10 if test "x$MITGCM_IEEE" != x ; then
735     IEEE=$MITGCM_IEEE
736     fi
737 jmc 1.109 GSL=f
738 edhill 1.10
739     CLEANUP=f
740     QUICK=f
741     NOGENMAKE=f
742     NOCLEAN=f
743     NODEPEND=f
744 edhill 1.68 POSTCLEAN=f
745 edhill 1.1
746 edhill 1.4 BASH=
747 edhill 1.10 OPTFILE=NONE
748     ADDRESSES=
749 edhill 1.1 TESTDIRS=
750 jmc 1.89 SKIPDIRS=
751 edhill 1.1 MPACKDIR="../tools/mpack-1.6"
752 edhill 1.20 HAVE_MPACK=
753 jmc 1.113 MPACK=
754 edhill 1.24 COMMAND=
755 edhill 1.59 if test "x$MAKE" = x ; then
756     MAKE=make
757     fi
758     if test "x$CC" = x ; then
759     CC=cc
760     fi
761 edhill 1.43 JOBS=
762 edhill 1.7 MPI=f
763 jmc 1.83 MULTI_THREAD=f
764 jmc 1.70 OUTDIR=
765 edhill 1.40 DELDIR=
766 edhill 1.1
767 edhill 1.24 ADM=
768 utke 1.120 OADM=
769 edhill 1.24
770 jmc 1.117 # list of pTracers to check for monitor output
771 edhill 1.50 PTRACERS_NUM="1 2 3 4 5"
772 edhill 1.49
773 jmc 1.92 MATCH_CRIT=13
774    
775 edhill 1.34 printf "parsing options... "
776 edhill 1.1
777     ac_prev=
778     for ac_option ; do
779    
780     # If the previous option needs an argument, assign it.
781     if test -n "$ac_prev"; then
782     eval "$ac_prev=\$ac_option"
783     ac_prev=
784     continue
785     fi
786    
787     ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
788    
789     case $ac_option in
790    
791     -help | --help | -h | --h)
792     usage ;;
793    
794 edhill 1.2 -optfile | --optfile | -of | --of)
795 edhill 1.10 ac_prev=OPTFILE ;;
796 edhill 1.2 -optfile=* | --optfile=* | -of=* | --of=*)
797 edhill 1.10 OPTFILE=$ac_optarg ;;
798 edhill 1.1
799     -addr | --addr | -a | --a)
800     ac_prev=ADDRESSES ;;
801     -addr=* | --addr=*)
802     ADDRESSES=$ac_optarg ;;
803 jmc 1.113 -mpackdir | --mpackdir | -mpd | --mpd)
804     ac_prev=MPACKDIR ;;
805     -mpackdir=* | --mpackdir=* | -mpd=* | --mpd=*)
806     MPACKDIR=$ac_optarg ;;
807 edhill 1.1
808     -tdir | --tdir | -t | --t)
809     ac_prev=TESTDIRS ;;
810     -tdir=* | --tdir=*)
811     TESTDIRS=$ac_optarg ;;
812 edhill 1.4
813 jmc 1.89 -skipdir | --skipdir | -skd | --skd)
814     ac_prev=SKIPDIRS ;;
815     -skipdir=* | --skipdir=*)
816     SKIPDIRS=$ac_optarg ;;
817    
818 edhill 1.4 -bash | --bash | -b | --b)
819     ac_prev=BASH ;;
820     -bash=* | --bash=*)
821     BASH=$ac_optarg ;;
822 edhill 1.5
823 edhill 1.6 -command | --command | -c | --c)
824     ac_prev=COMMAND ;;
825     -command=* | --command=*)
826     COMMAND=$ac_optarg ;;
827 edhill 1.8
828     -make | --make | -m | --m)
829     ac_prev=MAKE ;;
830     -make=* | --make=*)
831     MAKE=$ac_optarg ;;
832 edhill 1.1
833 jmc 1.70 -odir | --odir)
834     ac_prev=OUTDIR ;;
835     -odir=* | --odir=*)
836     OUTDIR=$ac_optarg ;;
837    
838 edhill 1.50 -ptracers | --ptracers | -ptr | --ptr)
839     ac_prev=PTRACERS_NUM ;;
840     -ptracers=* | --ptracers=* | -ptr=* | --ptr=*)
841     PTRACERS_NUM=$ac_optarg ;;
842    
843 jmc 1.92 -match | --match ) ac_prev=MATCH_CRIT ;;
844     -match=* | --match=* ) MATCH_CRIT=$ac_optarg ;;
845    
846 edhill 1.43 -j) ac_prev=JOBS ;;
847     -j=*) JOBS=$ac_optarg ;;
848    
849 edhill 1.10 -clean | --clean)
850 jmc 1.69 CLEANUP=t ; DELDIR=t ;;
851 edhill 1.10
852     -quick | --quick | -q | --q)
853     QUICK=t ;;
854     -nogenmake | --nogenmake | -ng | --ng)
855     NOGENMAKE=t ;;
856     -noclean | --noclean | -nc | --nc)
857     NOCLEAN=t ;;
858     -nodepend | --nodepend | -nd | --nd)
859     NODEPEND=t ;;
860    
861 edhill 1.68 -postclean | --postclean | -pc | --pc)
862     POSTCLEAN=t ;;
863    
864 edhill 1.18 -mpi) MPI=t ;;
865 edhill 1.10
866 jmc 1.83 -mth) MULTI_THREAD=t ;;
867    
868 edhill 1.24 -adm | -ad) ADM=t ;;
869    
870 utke 1.120 -oad) OADM=t; NODEPEND=t ;;
871    
872 edhill 1.10 -ieee) IEEE=true ;;
873     -noieee) IEEE= ;;
874 jmc 1.109 -gsl) GSL=t ;;
875 edhill 1.10
876 edhill 1.1 -verbose) verbose=2 ;;
877     -debug) debug=1 ;;
878     -quiet) verbose=0 ;;
879    
880 edhill 1.40 -deldir | -dd) DELDIR=t ;;
881    
882 ce107 1.90 -ts) TS=t;;
883    
884     -papis) PAPIS=t;;
885    
886     -pcls) PCL=t;;
887    
888 edhill 1.1 -*)
889     echo "Error: unrecognized option: "$ac_option
890     usage
891     ;;
892    
893     *)
894     echo "Error: unrecognized argument: "$ac_option
895     usage
896     ;;
897    
898     esac
899    
900     done
901    
902 edhill 1.10 if test "x$QUICK" = xt ; then
903     NOGENMAKE=t
904     NOCLEAN=t
905     NODEPEND=t
906     fi
907    
908 jmc 1.99 #- setting for forward or ADM testing
909     if test "x$ADM" = xt ; then
910     code_dir=code_ad
911 jmc 1.108 inputdir=input_ad
912 jmc 1.99 ref_outp="output_adm.txt"
913     EXECUTABLE="mitgcmuv_ad"
914 utke 1.120 elif test "x$OADM" = xt ; then
915     code_dir=code_oad
916     inputdir=input_oad
917     ref_outp="output_oadm.txt"
918     EXECUTABLE="mitgcmuv_ad"
919 jmc 1.99 else
920     code_dir=code
921 jmc 1.108 inputdir=input
922 jmc 1.99 ref_outp="output.txt"
923     EXECUTABLE="mitgcmuv"
924     fi
925    
926 edhill 1.1 if test "x$TESTDIRS" = x ; then
927 jmc 1.103 LIST=`scandirs results/$ref_outp`
928 jmc 1.84 else
929     #- expand group of experiments:
930     LIST=" "
931     for xx in $TESTDIRS
932     do
933     case $xx in
934 jmc 1.86 'basic') LIST=${LIST}" aim.5l_cs hs94.128x64x5 ideal_2D_oce"
935     LIST=${LIST}" lab_sea tutorial_baroclinic_gyre"
936     LIST=${LIST}" tutorial_global_oce_latlon tutorial_plume_on_slope"
937 jmc 1.84 ;;
938     'tutorials')
939     LIST=${LIST}" "`ls | grep 'tutorial_'` ;;
940     *) LIST=${LIST}" "$xx ;;
941     esac
942     done
943 jmc 1.89 fi
944     #echo 'LIST='${LIST}'<'
945     #- skip dirs, remove duplicate and non-directory:
946     TESTDIRS=" "
947     count=0
948     for xx in $LIST
949     do
950     yy=`echo $SKIPDIRS | grep -c $xx`
951     if test $yy = 0 ; then
952 jmc 1.84 if test -d $xx ; then
953     yy=`echo $TESTDIRS | grep -c $xx`
954     if test $yy = 0 ; then TESTDIRS=${TESTDIRS}" "$xx ; fi
955 jmc 1.89 else count=1 ;
956     echo ""; echo -n " -- skip \"$xx\" (not a directory !)"
957     fi
958     else
959     if test $count = 1 ; then echo -n ", \"$xx\""
960     else count=1 ; echo "" ; echo -n " skip: \"$xx\""
961 jmc 1.84 fi
962 jmc 1.89 fi
963     done
964     if test $count = 1 ; then echo "" ; echo -n " ... " ; fi
965 jmc 1.84 #echo 'TESTDIRS='${TESTDIRS}'<'
966 edhill 1.1
967 edhill 1.10 if test "x$OPTFILE" = xNONE -a "x$MITGCM_OF" != x ; then
968     OPTFILE=$MITGCM_OF
969     fi
970    
971 jmc 1.119 RUNLOG="run.log"
972 jmc 1.99 OUTPUTFILE=$ref_outp
973 jmc 1.87 if test "x$COMMAND" = x ; then
974 jmc 1.77 COMMAND="./$EXECUTABLE > $OUTPUTFILE"
975 edhill 1.24 fi
976 jmc 1.87 if test "x$MPI" = xt ; then
977     OUTPUTFILE="STDOUT.0000"
978 edhill 1.24 fi
979    
980 jmc 1.76 echo "OK (COMMAND= $COMMAND )"
981 edhill 1.1
982 jmc 1.94 # set the Default List of output variables to be checked:
983     # (use default or load experiment-specific list from file "tr_checklist")
984     # content : 1rst = main variable used to decide if it pass or FAIL
985     # others = number of matching digits to be printed in summary.txt
986 utke 1.120 if test "x$ADM" = x -a "x$OADM" = x; then
987 jmc 1.94 DEF_CHECK_LIST='PS PS T+ S+ U+ V+ pt1+ pt2+ pt3+ pt4+ pt5+'
988     EMPTY_RESULTS='.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..'
989 jmc 1.97 LEN_CHECK_LIST=`echo $DEF_CHECK_LIST | sed 's/ [a-zA-Z0-9]*+/&mn &mx &av &sd/g' | awk '{print NF-1}'`
990 jmc 1.94 ii=`echo $EMPTY_RESULTS | awk '{print NF}'`
991 jmc 1.97 EMPTY_RESULTS=$EMPTY_RESULTS`expr $LEN_CHECK_LIST - $ii | awk 'BEGIN{FS=":"}{for(i=1;i<=$1;i++){printf " ."}}'`
992 jmc 1.99 else
993 jmc 1.103 DEF_CHECK_LIST='Grad Cost Grad'
994 jmc 1.99 EMPTY_RESULTS='.. ..'
995     LEN_CHECK_LIST=`echo $DEF_CHECK_LIST | sed 's/ [a-zA-Z0-9]*+/&mn &mx &av &sd/g' | awk '{print NF-1}'`
996 jmc 1.94 fi
997    
998 edhill 1.1 # create the FORTRAN comparison code
999     createcodelet
1000    
1001 jmc 1.112 # build the mpack utility (if ADDRESSES = NONE, do it to test the build)
1002     if test "x$ADDRESSES" = x ; then
1003 edhill 1.32 echo "skipping mpack build"
1004     else
1005 edhill 1.31 build_mpack
1006     fi
1007 edhill 1.1
1008     # Create a uniquely named directory to store results
1009 jmc 1.110 CMDLINE=$0
1010 jmc 1.118 for xx in "$@" ; do nw=`echo $xx | wc -w`
1011     if test $nw = '1' ; then CMDLINE="$CMDLINE $xx"
1012     else CMDLINE="$CMDLINE '$xx'" ; fi
1013     done
1014     #for xx in "$@" ; do CMDLINE="$CMDLINE '$xx'" ; done
1015 edhill 1.1 MACH=`hostname`
1016 edhill 1.2 UNAMEA=`uname -a`
1017 edhill 1.1 DATE=`date +%Y%m%d`
1018 edhill 1.25 BASE="tr_"$MACH"_"$DATE"_"
1019 jmc 1.70 if test "x$OUTDIR" != x ; then
1020     BASE="tr_"$OUTDIR"_"$DATE"_"
1021 jmc 1.121 else
1022     short_name=`hostname | sed 's/\..*$//'`
1023     BASE="tr_"$short_name"_"$DATE"_"
1024 jmc 1.70 fi
1025 edhill 1.1 DNUM=0
1026     DRESULTS="$BASE$DNUM"
1027     while test -e $DRESULTS ; do
1028     DNUM=$(( $DNUM + 1 ))
1029     DRESULTS="$BASE$DNUM"
1030     done
1031     mkdir $DRESULTS
1032     RETVAL=$?
1033     if test "x$RETVAL" != x0 ; then
1034 edhill 1.20 echo "ERROR: Can't create results directory \"./$DRESULTS\""
1035 edhill 1.1 exit 1
1036     fi
1037     SUMMARY="$DRESULTS/summary.txt"
1038 edhill 1.16 start_date=`date`
1039 edhill 1.17 echo $start_date > $SUMMARY
1040 jmc 1.110 echo 'run:' $CMDLINE >> $SUMMARY
1041     echo 'on :' $UNAMEA >> $SUMMARY
1042 edhill 1.1
1043 edhill 1.11 of_path=
1044 edhill 1.10 if test "x$OPTFILE" != xNONE ; then
1045     if test -r $OPTFILE ; then
1046 edhill 1.11 # get the path
1047     path=${OPTFILE%/*}
1048     if test "x$path" = x ; then
1049     of_path=`pwd`
1050     else
1051     of_path=`( cd $path > /dev/null 2>&1 ; pwd )`
1052     fi
1053     file=${OPTFILE##*/}
1054     OPTFILE=$of_path/$file
1055 edhill 1.21 cp $OPTFILE $DRESULTS
1056     echo >> $SUMMARY
1057     echo " OPTFILE=$OPTFILE" >> $SUMMARY
1058 edhill 1.11 else
1059 edhill 1.21 echo | tee $SUMMARY
1060     echo "ERROR: can't read OPTFILE=\"$OPTFILE\"" | tee $SUMMARY
1061     exit 1
1062 edhill 1.10 fi
1063 edhill 1.21 else
1064     echo >> $SUMMARY
1065     echo "No \"OPTFILE\" was explicitly specified by testreport," >> $SUMMARY
1066     echo " so the genmake default will be used." >> $SUMMARY
1067 edhill 1.10 fi
1068     echo
1069     echo >> $SUMMARY
1070 utke 1.120 if test "x$ADM" = x -a "x$OADM" = x; then
1071 jmc 1.92 if [ $MATCH_CRIT -lt 10 ] ;
1072 jmc 1.94 then line_0="default "$MATCH_CRIT ;
1073     else line_0="default "$MATCH_CRIT ; fi
1074     line_0="$line_0 ----T----- ----S----- ----U----- ----V-----"
1075 jmc 1.92 # line_0=" ----T----- ----S----- ----U----- ----V-----"
1076 edhill 1.49 line_1="G D M c m s m s m s m s"
1077     line_2="E p a R g m m e . m m e . m m e . m m e ."
1078     line_3="N n k u 2 i a a d i a a d i a a d i a a d"
1079     line_4="2 d e n d n x n . n x n . n x n . n x n ."
1080 edhill 1.50 for ii in $PTRACERS_NUM ; do
1081 edhill 1.49 line_0="$line_0 --PTR 0"$ii"--"
1082     line_1="$line_1 m s"
1083     line_2="$line_2 m m e ."
1084     line_3="$line_3 i a a d"
1085     line_4="$line_4 n x n ."
1086     done
1087     echo "$line_0" | tee -a $SUMMARY
1088     echo "$line_1" | tee -a $SUMMARY
1089     echo "$line_2" | tee -a $SUMMARY
1090     echo "$line_3" | tee -a $SUMMARY
1091     echo "$line_4" | tee -a $SUMMARY
1092     echo " " | tee -a $SUMMARY
1093 edhill 1.24 else
1094     echo "ADJOINT=true" >> $SUMMARY
1095     echo >> $SUMMARY
1096 jmc 1.100 if [ $MATCH_CRIT -lt 10 ] ;
1097 jmc 1.103 then line_0="default "$MATCH_CRIT ;
1098     else line_0="default "$MATCH_CRIT ; fi
1099 jmc 1.100 echo "$line_0" | tee -a $SUMMARY
1100 edhill 1.24 cat << EOF | tee -a $SUMMARY
1101     G D M C G
1102     E p a R o r
1103     N n k u s a
1104     2 d e n t d
1105    
1106     EOF
1107     fi
1108 edhill 1.1
1109 edhill 1.10 # ...and each test directory...
1110     for dir in $TESTDIRS ; do
1111    
1112 jmc 1.106 # set builddir & rundir:
1113     builddir="build"
1114     if test ! -d $dir/$builddir ; then mkdir $dir/$builddir ; fi
1115     rundir="run"
1116     if test ! -d $dir/$rundir ; then
1117     rundir=$builddir
1118     fi
1119     CODE_DIR=$dir/$code_dir
1120     BUILD_DIR=$dir/$builddir
1121    
1122 edhill 1.10 # Cleanup only!
1123     if test "x$CLEANUP" = xt ; then
1124 jmc 1.106 if test -r $BUILD_DIR/Makefile ; then
1125 jmc 1.115 echo ' ------ clean dir:' $dir/$builddir
1126 jmc 1.106 ( cd $BUILD_DIR ; make CLEAN )
1127 edhill 1.10 fi
1128 jmc 1.106 if test -d $dir/$rundir/CVS ; then
1129     echo ' ------ clean dir:' $dir/$rundir
1130     run_clean $dir/$rundir
1131 edhill 1.10 fi
1132 edhill 1.62 (
1133     cd $dir
1134     rm -rf tr_run.*
1135     )
1136 edhill 1.10 continue
1137 edhill 1.1 fi
1138 edhill 1.3
1139 edhill 1.10 # Verify that the testdir exists and contains previous
1140     # results in the correct location--or skip this directory!
1141 jmc 1.104 fout=$dir"/results/"$ref_outp
1142 edhill 1.24 if test ! -r $fout ; then
1143     echo "can't read \"$fout\" -- skipping $dir"
1144 edhill 1.10 continue
1145     fi
1146 edhill 1.7
1147 jmc 1.117 # Check for specific files for particular type of run
1148 edhill 1.49
1149 edhill 1.30 if test ! -r $CODE_DIR"/SIZE.h_mpi" -a "x$MPI" = "xt" ; then
1150 edhill 1.28 echo "can't find \"$CODE_DIR/SIZE.h_mpi\" -- skipping $dir"
1151     continue
1152     fi
1153 jmc 1.83 if test ! -r $dir"/input/eedata.mth" -a "x$MULTI_THREAD" = "xt" ; then
1154     echo "can't find \"$dir/input/eedata.mth\" -- skipping $dir"
1155     continue
1156     fi
1157    
1158     # Check whether there are "extra runs" for this testdir
1159     extra_runs=
1160 jmc 1.108 ex_run_dirs=`( cd $dir ; echo $inputdir.* )`
1161     #echo "ex_run_dirs='$ex_run_dirs'"
1162     for exd in $ex_run_dirs ; do
1163     name=`echo $exd | sed -e "s/$inputdir\.//"`
1164     refExOut=`echo $ref_outp | sed "s/\./.${name}./"`
1165     outf="$dir/results/$refExOut"
1166     if test -f $outf -a -r $outf ; then
1167     if test "x$MULTI_THREAD" = "xt" ; then
1168     if test -r $dir"/"$exd"/eedata.mth" ; then
1169 jmc 1.83 extra_runs="$extra_runs $name"
1170 jmc 1.108 #else echo $dir"/"$exd"/eedata.mth: not found"
1171 jmc 1.83 fi
1172 jmc 1.108 else
1173     extra_runs="$extra_runs $name"
1174 jmc 1.83 fi
1175 jmc 1.108 fi
1176     done
1177 edhill 1.28
1178     echo "-------------------------------------------------------------------------------"
1179     echo
1180 jmc 1.83 if test "x$extra_runs" = "x" ; then
1181     echo "Experiment: $dir"
1182     else
1183     echo "Experiment: $dir ; extra_runs=$extra_runs"
1184     fi
1185 edhill 1.28 echo
1186     unset genmake makedepend make run
1187 jmc 1.94 results=$EMPTY_RESULTS
1188 edhill 1.10
1189     # Create an output dir for each OPTFILE/tdir combination
1190 edhill 1.20 rel_CDIR=$DRESULTS"/"$dir
1191     mkdir $rel_CDIR
1192     CDIR=`pwd`"/$rel_CDIR"
1193 edhill 1.10
1194     if test "x$CLEANUP" = xt ; then
1195 jmc 1.83 echo '====>>> this is to check that we never go through this part <<< ==='
1196     makeclean $dir/$builddir \
1197     && run_clean $dir/$rundir
1198 edhill 1.10 else
1199 edhill 1.1 genmakemodel $dir/$builddir && genmake=Y \
1200     && makeclean $dir/$builddir \
1201 jmc 1.83 && run_clean $dir/$rundir \
1202 edhill 1.27 && symlink_mpifiles $dir $code_dir $builddir \
1203 edhill 1.1 && makedependmodel $dir/$builddir && makedepend=Y \
1204     && makemodel $dir/$builddir && make=Y \
1205 jmc 1.108 && linkdata $dir/$rundir $inputdir input \
1206 edhill 1.12 && runmodel $dir/$rundir && run=Y \
1207 jmc 1.99 && results=`testoutput_run $dir $rundir $ref_outp`
1208 edhill 1.10 fi
1209    
1210     echo
1211 edhill 1.24 fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1212 edhill 1.34 echo
1213 jmc 1.98 echo "$fres" | sed 's/ 99/ --/g' | sed 's/ > />/' | sed 's/ < /</' >> $SUMMARY
1214 jmc 1.100 touch $CDIR"/summary.txt"
1215 jmc 1.97 echo "fresults='$fres'" | sed 's/ 99/ --/g' >> $CDIR"/summary.txt"
1216 edhill 1.34 echo "MACH='$MACH'" >> $CDIR"/summary.txt"
1217     echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"
1218     echo "DATE='$DATE'" >> $CDIR"/summary.txt"
1219     echo "tdir='$dir'" >> $CDIR"/summary.txt"
1220 jmc 1.108 if test "x$ADM" = xt ; then
1221     head -1 $dir/$builddir/taf_ad.log >> $CDIR"/summary.txt"
1222     grep -A3 'Seconds in section "ALL' $dir/$rundir/$OUTPUTFILE \
1223     >> $CDIR"/summary.txt"
1224     fi
1225 edhill 1.34
1226     for ex in $extra_runs ; do
1227 jmc 1.73 unset run
1228 jmc 1.94 results=$EMPTY_RESULTS
1229 jmc 1.106 # reference output file
1230     refExOut=`echo $ref_outp | sed "s/\./.${ex}./g"`
1231 jmc 1.73 # Create an output dir for each OPTFILE/tdir.ex combination
1232     rel_CDIR=$DRESULTS"/"$dir"."$ex
1233     mkdir $rel_CDIR
1234     CDIR=`pwd`"/$rel_CDIR"
1235 edhill 1.61 test ! -e "$dir/tr_run.$ex" && mkdir "$dir/tr_run.$ex"
1236 jmc 1.106 run_clean $dir/tr_run.$ex
1237 jmc 1.108 linkdata $dir/tr_run.$ex $inputdir.$ex $inputdir input
1238 jmc 1.42 runmodel $dir/tr_run.$ex && run=Y \
1239 jmc 1.106 && results=`testoutput_run $dir tr_run.$ex $refExOut`
1240 edhill 1.34 fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1241     fres="$fres.$ex"
1242     echo
1243 jmc 1.100 echo "$fres" | sed 's/ 99/ --/g' | sed 's/ > />/' | sed 's/ < /</' >> $SUMMARY
1244     touch $CDIR"/summary.txt"
1245 jmc 1.97 echo "fresults='$fres'" | sed 's/ 99/ --/g' >> $CDIR"/summary.txt"
1246 edhill 1.34 echo "MACH='$MACH'" >> $CDIR"/summary.txt"
1247     echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"
1248     echo "DATE='$DATE'" >> $CDIR"/summary.txt"
1249 jmc 1.73 echo "tdir='$dir.$ex'" >> $CDIR"/summary.txt"
1250 jmc 1.108 if test "x$ADM" = xt ; then
1251     head -1 $dir/$builddir/taf_ad.log >> $CDIR"/summary.txt"
1252     grep -A3 'Seconds in section "ALL' $dir/tr_run.$ex/$OUTPUTFILE \
1253     >> $CDIR"/summary.txt"
1254     fi
1255 jmc 1.83 if test "x$POSTCLEAN" = xt ; then
1256 jmc 1.100 run_clean $dir/tr_run.$ex
1257 jmc 1.83 fi
1258 edhill 1.34 done
1259 edhill 1.68
1260 jmc 1.83 #postclean $dir/$builddir
1261     if test "x$POSTCLEAN" = xt ; then
1262     makeclean $dir/$builddir \
1263     && run_clean $dir/$rundir
1264     fi
1265 edhill 1.10
1266     echo "-------------------------------------------------------------------------------"
1267    
1268 edhill 1.1 done
1269    
1270 edhill 1.34 printf "Start time: " >> $SUMMARY
1271 jmc 1.114 echo "$start_date" >> $SUMMARY
1272 edhill 1.34 printf "End time: " >> $SUMMARY
1273 edhill 1.13 date >> $SUMMARY
1274 edhill 1.20
1275     # If addresses were supplied and mpack built successfully, then try
1276     # to send email using mpack.
1277     if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then
1278     echo "No results email was sent."
1279     else
1280     if test "x$HAVE_MPACK" = xt ; then
1281     tar -cf $DRESULTS".tar" $DRESULTS > /dev/null 2>&1 \
1282     && gzip $DRESULTS".tar" \
1283 edhill 1.44 && $MPACK -s MITgcm-test -m 3555000 $DRESULTS".tar.gz" $ADDRESSES
1284 edhill 1.20 RETVAL=$?
1285     if test "x$RETVAL" != x0 ; then
1286     echo
1287     echo "Warning: The tar, gzip, & mpack step failed. Please send email"
1288     echo " to <MITgcm-support@mitgcm.org> for help. You may copy the "
1289     echo " summary of results from the directory \"$DRESULTS\"."
1290     echo
1291     else
1292     echo
1293     echo "An email containing results was sent to the following addresses:"
1294     echo " \"$ADDRESSES\""
1295     echo
1296     fi
1297     test -f $DRESULTS".tar" && rm -f $DRESULTS".tar"
1298     test -f $DRESULTS".tar.gz" && rm -f $DRESULTS".tar.gz"
1299     fi
1300     fi
1301 edhill 1.13
1302 jmc 1.91 rm -f tr_cmpnum.c tr_cmpnum
1303 edhill 1.1
1304 edhill 1.12 if test "x$CLEANUP" != xt ; then
1305 jmc 1.102 cat $SUMMARY | sed 's/ \. \. \. \. \. \. \. \. \. \. \. \. //'
1306 edhill 1.25 if test -e tr_out.txt ; then
1307     mv tr_out.txt tr_out.txt.old
1308 edhill 1.14 fi
1309 jmc 1.103 cat $SUMMARY | sed '/^[YN] [YN] [YN] [YN]/ s/ \. //g' > tr_out.txt
1310 edhill 1.12 fi
1311 edhill 1.1
1312 edhill 1.40 if test "x$DELDIR" = xt ; then
1313     rm -rf $DRESULTS
1314     fi
1315    

  ViewVC Help
Powered by ViewVC 1.1.22