/[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.68 - (hide annotations) (download)
Tue Jun 7 22:21:47 2005 UTC (18 years, 9 months ago) by edhill
Branch: MAIN
CVS Tags: checkpoint57m_post, checkpoint57k_post, checkpoint57i_post, checkpoint57j_post, checkpoint57l_post
Changes since 1.67: +21 -1 lines
 o add a "-postclean" or "-pc" option to testreport for machines that
   cannot handle the >1.5GB required to run a full set of tests

1 edhill 1.19 #! /usr/bin/env bash
2 edhill 1.1 #
3 edhill 1.68 # $Header: /u/gcmpack/MITgcm/verification/testreport,v 1.67 2005/02/06 16:58:08 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 edhill 1.7 echo " (-mpi) use MPI input files"
15 edhill 1.10 echo " (-ieee|-noieee) if possible, use IEEE compiler flags"
16 edhill 1.41 echo " (DEF=\"-ieee\")"
17 edhill 1.6 echo " (-optfile=|-of=)STRING list of optfiles to use"
18 edhill 1.20 echo " (-a|-addr) STRING list of email recipients"
19 edhill 1.6 echo " (DEF=\"edhill@mitgcm.org\")"
20 edhill 1.20 echo " (-t|-tdir) STRING list of test dirs to use"
21 edhill 1.6 echo " (DEF=\"\" which builds all)"
22 edhill 1.20 echo " (-b|-bash) STRING preferred location of a \"bash\" or"
23     echo " Bourne-compatible \"sh\" shell"
24     echo " (DEF=\"\" for \"bash\")"
25 edhill 1.24 echo " (-adm|-ad) perform an adjoint run"
26 edhill 1.20 echo " (-command) STRING command to run"
27 edhill 1.6 echo " (DEF=\"make output.txt\")"
28 edhill 1.20 echo " (-m|-make) STRING command to use for \"make\""
29 edhill 1.8 echo " (DEF=\"make\")"
30 edhill 1.50 echo " (-ptracers|-ptr) STRING specify which ptracers to test"
31     echo " (DEF=\"1 2 3 4 5\")"
32 edhill 1.43 echo " (-j) JOBS use \"make -j JOBS\" for parallel builds"
33 edhill 1.10 echo " (-clean) *ONLY* run \"make CLEAN\""
34     echo " (-quick|-q) same as \"-nogenmake -noclean -nodepend\""
35     echo " (-nogenmake|-ng) skip the genmake stage"
36     echo " (-noclean|-nc) skip the \"make clean\" stage"
37     echo " (-nodepend|-nd) skip the \"make depend\" stage"
38 edhill 1.40 echo " (-deldir|-dd) on success, delete the output directory"
39 edhill 1.6 echo
40 edhill 1.50 echo "and where STRING can be a whitespace-delimited list"
41 edhill 1.6 echo "such as:"
42 edhill 1.50 echo
43 edhill 1.6 echo " -t 'exp0 exp2 exp3' "
44     echo " -addr='abc@123.com testing@home.org'"
45 edhill 1.1 echo
46 edhill 1.50 echo "provided that the expression is properly quoted within the current"
47     echo "shell (note the use of single quotes to protect white space)."
48     echo
49 edhill 1.1 exit 1
50     }
51    
52     # build the mpack utility
53     build_mpack()
54     {
55 edhill 1.34 printf "building the mpack utility... "
56 edhill 1.1 if test ! -x "$MPACKDIR/mpack" ; then
57     if test ! -d $MPACKDIR ; then
58 edhill 1.20 echo
59 edhill 1.1 echo "Error: can't find \"$MPACKDIR\""
60     echo " are you sure this program is being run in the correct "
61     echo " (that is, \"MITGCM_ROOT\verification\") directory?"
62 edhill 1.20 echo
63     HAVE_MPACK=f
64 edhill 1.1 fi
65 edhill 1.34 printf "building mpack... "
66 edhill 1.26 if test "x$CC" = x ; then
67     export CC=cc
68     fi
69 edhill 1.25 ( cd $MPACKDIR && ./configure && $MAKE ) > tr_build_mpack.out 2>&1
70 edhill 1.1 RETVAL=$?
71     if test "x$RETVAL" != x0 ; then
72     echo
73     echo "Error building the mpack tools at: $MPACK_DIR"
74 edhill 1.20 echo
75     HAVE_MPACK=f
76     else
77 edhill 1.25 rm -f tr_build_mpack.out
78 edhill 1.20 HAVE_MPACK=t
79 edhill 1.1 fi
80 edhill 1.20 else
81     HAVE_MPACK=t
82 edhill 1.1 fi
83     echo "OK"
84     }
85    
86     testoutput_for_prop()
87     {
88 edhill 1.34 # testoutput_for_prop dir s1 label subdir extension
89 edhill 1.1 #
90     # compares files in $dir/$subdir/output.txt and $dir/results/output.txt
91     # using search strings s1 and text label
92    
93     if [ $debug -gt 0 ]; then
94     echo testoutput_for_prop: grep "$2" $1/$4/output.txt 1>&2
95     fi
96     if [ -r $1/$4/output.txt ]; then
97 edhill 1.15 grep "$2" $1/$4/output.txt | sed 's/.*=//' | cat -n > tmp1.txt
98 jmc 1.67 lncntA=`wc -l tmp1.txt | awk '{print $1}' `
99     if [ $lncntA -lt 3 ]; then
100 edhill 1.1 if [ $verbose -gt 0 ]; then
101     echo Not enough lines of output when searching for "$2" 1>&2
102     fi
103     return 99
104     fi
105     else
106     echo testoutput_for_prop: output.txt from model run was not readable 1>&2
107     return 99
108     fi
109     if [ $debug -gt 0 ]; then
110 edhill 1.34 echo testoutput_for_prop: grep "$2" $1/results/output.txt$5 1>&2
111 edhill 1.1 fi
112 edhill 1.34 grep "$2" $1/results/output.txt$5 | sed 's/.*=//' | cat -n > tmp2.txt
113 jmc 1.67 lncntB=`wc -l tmp2.txt | awk '{print $1}' `
114     if [ $lncntB -lt 3 ]; then
115 edhill 1.1 if [ $verbose -gt 0 ]; then
116     echo Not enough lines of output when searching for "$2" 1>&2
117     fi
118     return 99
119     fi
120 jmc 1.67 if [ $lncntA -ne $lncntB ]; then
121     if [ $verbose -gt 0 ]; then
122     echo Not same Nb of lines when searching for "$2" ":" $lncntA $lncntB 1>&2
123     fi
124     return 99
125     fi
126 edhill 1.1 if [ $debug -gt 0 ]; then
127     echo testoutput_for_prop: join tmp1.txt tmp2.txt 1>&2
128     fi
129     join tmp1.txt tmp2.txt | awk '{print $1 " " $2 " " $3}' > tmp3.txt
130     if [ $debug -gt 0 ]; then
131     echo testoutput_for_prop: compare_lines 1>&2
132     fi
133 edhill 1.22 if [ $verbose -gt 1 ]; then
134     cat tmp3.txt 1>&2
135     fi
136     echo "-1" >> tmp3.txt
137 edhill 1.23 # On the SGI O3K (*not* the O2K), "cat -n" inserts a ":" after the line number
138     cat tmp3.txt | sed -e 's|:||g' > tmp4.txt
139     digits_of_similarity=`./tmp_cmpnum < tmp4.txt`
140 edhill 1.1 if [ $digits_of_similarity -eq 99 ]; then
141     if [ $verbose -gt 0 ]; then
142     echo testoutput_for_prop: No comparison was available for \"$2\" 1>&2
143     fi
144     digits_of_similarity=99
145     else
146     if [ $verbose -gt 0 ]; then
147     echo There were $digits_of_similarity decimal places of similarity for \"$2\" 1>&2
148     fi
149     fi
150 edhill 1.23 rm -f tmp1.txt tmp2.txt tmp3.txt tmp4.txt
151 edhill 1.1
152     return $digits_of_similarity
153     }
154    
155     dashnum()
156     {
157     # dashnum n1 n2 n3 ...
158     #
159     # print numbers using %3i format or "--" if number = 99
160    
161     for num in $@ ; do
162     if [ $num = 99 ]; then
163     printf ' --'
164     else
165     printf '%3i' $num
166     fi
167     done
168     }
169    
170 edhill 1.24 testoutput_ad()
171     {
172     grep $3 $1/results_ad/output.txt_adm | awk '{print NR " " $5}' > t05.txt
173     grep $3 $1/$2/output.txt_adm | awk '{print NR " " $5}' > t15.txt
174     grep $3 $1/results_ad/output.txt_adm | awk '{print NR " " $6}' > t06.txt
175     grep $3 $1/$2/output.txt_adm | awk '{print NR " " $6}' > t16.txt
176     join t05.txt t15.txt > t5.txt
177     join t06.txt t16.txt > t6.txt
178     echo "-1" >> t5.txt
179     echo "-1" >> t6.txt
180     digits_5=`./tmp_cmpnum < t5.txt`
181     digits_6=`./tmp_cmpnum < t6.txt`
182     dashnum $digits_5 $digits_6
183     rm -f t[01][56].txt t[56].txt
184     }
185    
186 edhill 1.49 check_for_add_mon_output()
187     {
188     # Check for additional types of monitor output
189     if test "x$1" = x ; then
190     return
191     fi
192    
193 edhill 1.50 for ii in $PTRACERS_NUM ; do
194     eval "HAVE_PTR0"$ii"=f"
195     done
196    
197 edhill 1.49 ptr_add="trcstat_ptracerXX_min trcstat_ptracerXX_max"
198     ptr_add="$ptr_add trcstat_ptracerXX_mean trcstat_ptracerXX_sd"
199 edhill 1.50 for ii in $PTRACERS_NUM ; do
200 edhill 1.49 for jj in $ptr_add ; do
201     name=`eval "echo $jj | sed -e 's|XX|0"$ii"|g'"`
202     tst=`grep $name $1 | wc -l | awk '{print $1}'`
203     if test ! "x$tst" = x0 ; then
204     eval "HAVE_PTR0"$ii"=t"
205     fi
206     done
207     # eval 'echo "HAVE_PTR0'$ii' = $HAVE_PTR0'$ii'"'
208     done
209     }
210    
211 edhill 1.1 testoutput()
212     {
213 edhill 1.34 # testoutput directory subdir extension
214 edhill 1.1 #
215     # test output in "directory"
216 edhill 1.24 if test "x$ADM" = x ; then
217     if [ $debug -gt 0 ]; then
218     echo testoutput: testoutput_for_prop $1 cg2d_init_res 1>&2
219     fi
220 edhill 1.34 testoutput_for_prop $1 "cg2d_init_res" "cg2d init. residual" $2 $3; cg2dres=$?
221 edhill 1.24 if [ $debug -gt 0 ]; then
222     echo testoutput: cg2dres=$cg2dres 1>&2
223     fi
224 edhill 1.34 testoutput_for_prop $1 "dynstat_theta_min" "theta minimum" $2 $3; tmin=$?
225     testoutput_for_prop $1 "dynstat_theta_max" "theta maximum" $2 $3; tmax=$?
226     testoutput_for_prop $1 "dynstat_theta_mean" "theta mean" $2 $3; tmean=$?
227     testoutput_for_prop $1 "dynstat_theta_sd" "theta s.d." $2 $3; tsd=$?
228     testoutput_for_prop $1 "dynstat_salt_min" "salt minimum" $2 $3; smin=$?
229     testoutput_for_prop $1 "dynstat_salt_max" "salt maximum" $2 $3; smax=$?
230     testoutput_for_prop $1 "dynstat_salt_mean" "salt mean" $2 $3; smean=$?
231     testoutput_for_prop $1 "dynstat_salt_sd" "salt s.d." $2 $3; ssd=$?
232     testoutput_for_prop $1 "dynstat_uvel_min" "U minimum" $2 $3; umin=$?
233     testoutput_for_prop $1 "dynstat_uvel_max" "U maximum" $2 $3; umax=$?
234     testoutput_for_prop $1 "dynstat_uvel_mean" "U mean" $2 $3; umean=$?
235     testoutput_for_prop $1 "dynstat_uvel_sd" "U s.d." $2 $3; usd=$?
236     testoutput_for_prop $1 "dynstat_vvel_min" "V minimum" $2 $3; vmin=$?
237     testoutput_for_prop $1 "dynstat_vvel_max" "V maximum" $2 $3; vmax=$?
238     testoutput_for_prop $1 "dynstat_vvel_mean" "V mean" $2 $3; vmean=$?
239     testoutput_for_prop $1 "dynstat_vvel_sd" "V s.d." $2 $3; vsd=$?
240 edhill 1.49
241 edhill 1.50 # This is for PTRACERS
242     for ii in $PTRACERS_NUM ; do
243     eval `echo "p0"$ii"_min=99"`
244     eval `echo "p0"$ii"_max=99"`
245     eval `echo "p0"$ii"_mean=99"`
246     eval `echo "p0"$ii"_sd=99"`
247     tst=`eval 'echo "$HAVE_PTR0'$ii'"'`
248     #echo 'tst = '$tst
249     if test "x$tst" = xt ; then
250     a="trcstat_ptracer0"
251     testoutput_for_prop $1 "$a"$ii"_min" "p0"$ii"_min" $2 $3
252     RETVAL=$? ; eval `echo "p0"$ii"_min="$RETVAL`
253     testoutput_for_prop $1 "$a"$ii"_max" "p0"$ii"_max" $2 $3
254     RETVAL=$? ; eval `echo "p0"$ii"_max="$RETVAL`
255     testoutput_for_prop $1 "$a"$ii"_mean" "p0"$ii"_mean" $2 $3
256     RETVAL=$? ; eval `echo "p0"$ii"_mean="$RETVAL`
257     testoutput_for_prop $1 "$a"$ii"_sd" "p0"$ii"_sd" $2 $3
258     RETVAL=$? ; eval `echo "p0"$ii"_sd="$RETVAL`
259     fi
260 edhill 1.49 done
261    
262     allargs="$cg2dres $tmin $tmax $tmean $tsd $smin $smax $smean $ssd"
263     allargs="$allargs $umin $umax $umean $usd $vmin $vmax $vmean $vsd"
264     allargs="$allargs $p01_min $p01_max $p01_mean $p01_sd"
265     allargs="$allargs $p02_min $p02_max $p02_mean $p02_sd"
266     allargs="$allargs $p03_min $p03_max $p03_mean $p03_sd"
267     allargs="$allargs $p04_min $p04_max $p04_mean $p04_sd"
268     allargs="$allargs $p05_min $p05_max $p05_mean $p05_sd"
269    
270     eval "dashnum $allargs"
271    
272 edhill 1.24 else
273     testoutput_ad $1 $2 "precision_grdchk_result"
274 edhill 1.1 fi
275     }
276    
277     genmakemodel()
278     {
279     # genmakemodel directory
280 edhill 1.10 if test "x$NOGENMAKE" = xt ; then
281     echo "genmake skipped!"
282     else
283 edhill 1.34 if test "x$BASH" = x ; then
284     GENMAKE2="../../../tools/genmake2"
285     else
286     GENMAKE2="$BASH ../../../tools/genmake2 -bash $BASH"
287     fi
288 edhill 1.10 (
289     cd $1;
290 edhill 1.24 command="$GENMAKE2 -ds -m $MAKE"
291     if test "x$ADM" = x ; then
292     command="$command --mods=../code"
293     else
294     command="$command --mods=../code_ad"
295     command="$command -adof=../../../tools/adjoint_options/adjoint_staf"
296     fi
297 edhill 1.10 if test "x$OPTFILE" != xNONE ; then
298     command="$command --optfile=$OPTFILE"
299     fi
300     if test "x$IEEE" != x ; then
301     command="$command -ieee"
302     fi
303 edhill 1.66 if test "x$MPI" = xt ; then
304     command="$command -mpi"
305     fi
306 edhill 1.10 printf 'genmake ... ' 1>&2
307     $command > make.log 2>&1
308     RETVAL=$?
309 edhill 1.44 # Reduce the size of the testing emails!
310 edhill 1.47 head -100 Makefile > $CDIR/Makefile_head
311 edhill 1.10 if test "x$RETVAL" != x0 ; then
312     tail make.log
313     echo "genmakemodel: genmake failed" 1>&2
314 edhill 1.21 cp genmake_* make.log $CDIR
315 edhill 1.10 return 1
316     else
317 edhill 1.20 echo "successful" 1>&2
318 edhill 1.1 fi
319 edhill 1.10 )
320     fi
321 edhill 1.1 }
322    
323     makeclean()
324     {
325     # makeclean directory
326 edhill 1.10 if test "x$NOCLEAN" = xt ; then
327     echo "make CLEAN skipped!"
328     else
329     (
330     cd $1;
331     if test -e output.txt ; then
332     rm -f output.txt
333     fi
334     printf 'make CLEAN ... ' 2>&1
335     if test -r Makefile ; then
336     $MAKE CLEAN >> make.log 2>&1
337     RETVAL=$?
338     if test "x$RETVAL" != x0 ; then
339     tail make.log
340     echo "makeclean: \"make CLEAN\" failed" 1>&2
341     cp make.log $CDIR"/make.log"
342     return 1
343     fi
344     fi
345 edhill 1.20 echo successful 1>&2
346 edhill 1.10 exit 0
347     )
348     fi
349     }
350    
351 edhill 1.68 postclean()
352     {
353     # postclean directory
354     if test "x$POSTCLEAN" = xt ; then
355     (
356     cd $1;
357     if test -r Makefile ; then
358     $MAKE CLEAN >> /dev/null 2>&1
359     fi
360     exit 0
361     )
362     fi
363     }
364    
365 edhill 1.10 makedependmodel()
366     {
367     # makedependmodel directory
368     if test "x$NODEPEND" = xt ; then
369     echo "make depend skipped!"
370     else
371     (
372     cd $1;
373     printf 'make depend ... ' 1>&2
374     $MAKE depend >> make.log 2>&1
375 edhill 1.1 RETVAL=$?
376     if test "x$RETVAL" != x0 ; then
377     tail make.log
378 edhill 1.10 echo "makedependmodel: make depend failed" 1>&2
379 edhill 1.1 cp make.log $CDIR"/make.log"
380     return 1
381 edhill 1.10 else
382 edhill 1.20 echo successful 1>&2
383 edhill 1.1 fi
384 edhill 1.10 )
385     fi
386 edhill 1.1 }
387    
388     makemodel()
389     {
390     # makemodel directory
391     (
392     cd $1;
393     if test -r Makefile ; then
394     printf 'make ... ' 1>&2
395 edhill 1.24 if test "x$ADM" = x ; then
396 edhill 1.43 if test "x$JOBS" = x ; then
397     $MAKE >> make.log 2>&1
398     else
399     $MAKE -j $JOBS >> make.log 2>&1
400     fi
401 edhill 1.24 else
402     $MAKE adall >> make.log 2>&1
403     fi
404 edhill 1.1 RETVAL=$?
405     if test "x$RETVAL" != x0 ; then
406     tail make.log
407     echo failed 1>&2
408     cp make.log $CDIR"/make.log"
409     return 1
410     else
411 edhill 1.20 echo successful 1>&2
412 edhill 1.1 fi
413     fi
414     )
415     }
416    
417 edhill 1.27 symlink_mpifiles()
418     {
419     # Put special links so that MPI specific files are used
420     # This MUST be invoked between makeclean and makelinks because
421     # the Makefile will link to non-mpi files by default
422    
423     dir=$1
424     code_dir=$2
425     BUILD_DIR=$dir/$3
426     CODE_DIR=$dir/$code_dir
427 edhill 1.45
428 edhill 1.27 # These are files that should replace their counter-part when using -mpi
429     MPI_FILES=`(cd $CODE_DIR; find . -name "*_mpi")`
430    
431     # Is this an MPI run?
432     if test "x$MPI" = xt ; then
433     # YES: We symbolically link these files to the build
434     # dir so long as there is no real file in place
435     for ii in $MPI_FILES ; do
436     i=`echo $ii | sed 's:^\./::'`
437     name=`echo $i | sed 's:_mpi::' `
438     cmp $CODE_DIR/$i $BUILD_DIR/$name > /dev/null 2>&1
439     RETVAL=$?
440     if test "x$RETVAL" != x0 ; then
441     if ! test -f $BUILD_DIR/$i ; then
442 edhill 1.45 #echo Linking $name to $i
443 edhill 1.27 (cd $BUILD_DIR; ln -sf ../$code_dir/$i $name)
444     fi
445     fi
446     done
447     else
448 edhill 1.45 # NO: We undo any _mpi symbolically linked files
449 edhill 1.27 for ii in $MPI_FILES ; do
450     i=`echo $ii | sed 's:^\./::'`
451     name=`echo $i | sed 's:_mpi::' `
452     if test -L $BUILD_DIR/$name ; then
453 edhill 1.45 cmp $BUILD_DIR/$name "../$code_dir/$name"_mpi > /dev/null 2>&1
454     RETVAL=$?
455     if test "x$RETVAL" = x0 ; then
456     #echo Un-linking $name from $linktarg
457 edhill 1.27 rm -f $BUILD_DIR/$name
458     fi
459     fi
460     done
461     fi
462    
463     }
464    
465 edhill 1.1 linkdata()
466     {
467     # linkdata flag
468     #
469     # symbolically link data files to run directory
470 edhill 1.12 if test "x$1" = x1 ; then
471     (
472     cd $2
473 edhill 1.24 if test "x$ADM" = x ; then
474     files=`( cd ../input ; ls -1 | grep -v CVS )`
475     for i in $files ; do
476 edhill 1.60 if test ! -d "../input/"$i -a ! -f $i ; then
477 edhill 1.24 ln -sf "../input/"$i $i
478     fi
479     done
480     else
481     files=`( cd ../input ; ls -1 *.bin | grep -v CVS )`
482     for i in $files ; do
483     if test ! -d "../input/"$i ; then
484     ln -sf "../input/"$i $i
485     fi
486     done
487     files=`( cd ../input_ad ; ls -1 | grep -v CVS )`
488     for i in $files ; do
489     if test ! -d "../input_ad/"$i ; then
490     ln -sf "../input_ad/"$i $i
491     fi
492     done
493     fi
494 edhill 1.12 )
495 edhill 1.1 fi
496     }
497    
498     runmodel()
499     {
500 edhill 1.6 # runmodel directory
501 edhill 1.1 #
502 edhill 1.24 # runs "$COMMAND in "directory"
503 edhill 1.6 # (where "$COMMAND" is relative to "directory")
504 edhill 1.1 (
505     cd $1
506 edhill 1.20 printf 'runmodel ... ' 1>&2
507 edhill 1.6 # make output.txt
508 edhill 1.38 echo
509 jmc 1.46 rm -f run.log
510 edhill 1.39 # echo "COMMAND='$COMMAND'"
511     # echo "pwd='"`pwd`"'"
512 jmc 1.46 ( eval $COMMAND ) > run.log 2>&1
513 edhill 1.6 RETVAL=$?
514     if test "x$RETVAL" = x0 ; then
515 jmc 1.46 tail run.log
516 edhill 1.20 echo successful 1>&2
517 edhill 1.44 # === Reduce the size of the testing emails!
518     # if test "x$ADM" = x ; then
519     # cp output.txt $CDIR"/output.txt"
520     # else
521     # cp output.txt_adm $CDIR"/output.txt_adm"
522     # fi
523 jmc 1.48 if test -s STDERR.0000 ; then cp STDERR.0000 $CDIR"/STDERR.0000" ; fi
524 edhill 1.6 return 0
525     else
526 edhill 1.20 tail run.log
527     echo failed 1>&2
528     cp run.log $CDIR"/run.log"
529 jmc 1.48 if test -s STDERR.0000 ; then cp STDERR.0000 $CDIR"/STDERR.0000" ; fi
530 edhill 1.6 return 1
531 edhill 1.1 fi
532     )
533     }
534    
535     createcodelet()
536     {
537     # create codelet for comparing model output
538    
539 edhill 1.34 printf "creating the comparison code... "
540 edhill 1.22 cat > tmp_cmpnum.c <<EOF
541     #include <stdio.h>
542     #include <math.h>
543     int main( int argc, char** argv ) {
544 adcroft 1.33 int linnum,best,lncnt;
545 edhill 1.52 double a,b,abave,relerr;
546 jmc 1.57 best = -22;
547 adcroft 1.33 lncnt = 0;
548     while( 1 & (lncnt+=1) < 999 ) {
549 edhill 1.22 scanf("%d", &linnum);
550     if (linnum == -1) break;
551     scanf("%lf", &a); scanf("%lf", &b);
552 edhill 1.52 abave = 0.5*(fabs(a)+fabs(b));
553     if (abave > 0.0) {
554     relerr=fabs(a-b)/abave;
555 edhill 1.64 if (relerr > 0.0) { linnum = (int)rint(log10(relerr)); }
556 jmc 1.57 else { linnum = -16 ; }
557     best = (best > linnum) ? best : linnum;
558 edhill 1.22 }
559     }
560 adcroft 1.33 if (lncnt == 999) best=-29;
561 edhill 1.22 printf("%d\n", -best);
562     return 0;
563     }
564     EOF
565 edhill 1.58 $CC -o tmp_cmpnum tmp_cmpnum.c -lm
566 edhill 1.1
567 edhill 1.22 if [ -x ./tmp_cmpnum ]; then
568 edhill 1.1 echo "OK"
569     return 0
570     else
571     echo
572 edhill 1.58 echo "ERROR: failed to compile comparison code -- please specify"
573     echo " a C compiler using the CC environment variable."
574 edhill 1.1 exit 1
575     fi
576     }
577    
578     formatresults()
579     {
580     # formatresults expt genmake depend make run results*
581    
582     nm=$1
583     printf '%s %s %s %s' $2 $3 $4 $5
584     shift; shift; shift; shift; shift;
585     printf '%3s' $@
586    
587     if [ $1 = '--' ]; then
588     printf ' N/O '
589     else
590     if [ $1 -gt 12 ]; then
591     printf ' pass'
592     else
593     printf ' FAIL'
594     fi
595     fi
596     printf ' %s' $nm
597     printf '\n'
598    
599     }
600    
601     show_help()
602     {
603     cat - << EOF
604     $0 [-help] [-quick] [-verbose] dir1 [dir2] [...]
605 edhill 1.10
606     -help|-h Show this help message
607 edhill 1.1 -quiet Reduce the amount of output
608     -verbose Produce copious amounts of output
609     -debug Produce even more output which will mean nothing to most
610     -force Do "make CLEAN" before compiling. This forces a complete rebuild.
611     -clean Do "make CLEAN" after compiling and testing.
612     -cleanup Aggresively removes all model output, executables and object files
613     and then exits. Use with care.
614    
615     Normal usage:
616     $0 * Configure, compile, run and analyze in all experiment directories
617     EOF
618     }
619    
620     scandirs()
621     {
622     if [ $# -eq 0 ]; then
623     for arg in * ; do
624     test -d $arg/input && echo $arg
625     done
626     else
627     echo $*
628     fi
629     }
630    
631    
632     ###############################################################################
633    
634    
635     # Default properties
636     debug=0
637     verbose=1
638     clean=0
639     expts=''
640 edhill 1.6 # ieee=1
641 edhill 1.10
642 edhill 1.40 IEEE=true
643 edhill 1.10 if test "x$MITGCM_IEEE" != x ; then
644     IEEE=$MITGCM_IEEE
645     fi
646    
647    
648     CLEANUP=f
649     QUICK=f
650     NOGENMAKE=f
651     NOCLEAN=f
652     NODEPEND=f
653 edhill 1.68 POSTCLEAN=f
654 edhill 1.1
655 edhill 1.4 BASH=
656 edhill 1.10 OPTFILE=NONE
657     ADDRESSES=
658 edhill 1.1 TESTDIRS=
659     MPACKDIR="../tools/mpack-1.6"
660 edhill 1.20 HAVE_MPACK=
661 edhill 1.1 MPACK="$MPACKDIR/mpack"
662 edhill 1.24 COMMAND=
663 edhill 1.59 if test "x$MAKE" = x ; then
664     MAKE=make
665     fi
666     if test "x$CC" = x ; then
667     CC=cc
668     fi
669 edhill 1.43 JOBS=
670 edhill 1.7 MPI=f
671 edhill 1.40 DELDIR=
672 edhill 1.1
673 edhill 1.24 ADM=
674    
675 edhill 1.49 # Additional monitor types
676 edhill 1.50 PTRACERS_NUM="1 2 3 4 5"
677 edhill 1.49
678 edhill 1.34 printf "parsing options... "
679 edhill 1.1
680     ac_prev=
681     for ac_option ; do
682    
683     # If the previous option needs an argument, assign it.
684     if test -n "$ac_prev"; then
685     eval "$ac_prev=\$ac_option"
686     ac_prev=
687     continue
688     fi
689    
690     ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
691    
692     case $ac_option in
693    
694     -help | --help | -h | --h)
695     usage ;;
696    
697 edhill 1.2 -optfile | --optfile | -of | --of)
698 edhill 1.10 ac_prev=OPTFILE ;;
699 edhill 1.2 -optfile=* | --optfile=* | -of=* | --of=*)
700 edhill 1.10 OPTFILE=$ac_optarg ;;
701 edhill 1.1
702     -addr | --addr | -a | --a)
703     ac_prev=ADDRESSES ;;
704     -addr=* | --addr=*)
705     ADDRESSES=$ac_optarg ;;
706    
707     -tdir | --tdir | -t | --t)
708     ac_prev=TESTDIRS ;;
709     -tdir=* | --tdir=*)
710     TESTDIRS=$ac_optarg ;;
711 edhill 1.4
712     -bash | --bash | -b | --b)
713     ac_prev=BASH ;;
714     -bash=* | --bash=*)
715     BASH=$ac_optarg ;;
716 edhill 1.5
717 edhill 1.6 -command | --command | -c | --c)
718     ac_prev=COMMAND ;;
719     -command=* | --command=*)
720     COMMAND=$ac_optarg ;;
721 edhill 1.8
722     -make | --make | -m | --m)
723     ac_prev=MAKE ;;
724     -make=* | --make=*)
725     MAKE=$ac_optarg ;;
726 edhill 1.1
727 edhill 1.50 -ptracers | --ptracers | -ptr | --ptr)
728     ac_prev=PTRACERS_NUM ;;
729     -ptracers=* | --ptracers=* | -ptr=* | --ptr=*)
730     PTRACERS_NUM=$ac_optarg ;;
731    
732 edhill 1.43 -j) ac_prev=JOBS ;;
733     -j=*) JOBS=$ac_optarg ;;
734    
735 edhill 1.10 -clean | --clean)
736     CLEANUP=t ;;
737    
738     -quick | --quick | -q | --q)
739     QUICK=t ;;
740     -nogenmake | --nogenmake | -ng | --ng)
741     NOGENMAKE=t ;;
742     -noclean | --noclean | -nc | --nc)
743     NOCLEAN=t ;;
744     -nodepend | --nodepend | -nd | --nd)
745     NODEPEND=t ;;
746    
747 edhill 1.68 -postclean | --postclean | -pc | --pc)
748     POSTCLEAN=t ;;
749    
750 edhill 1.18 -mpi) MPI=t ;;
751 edhill 1.10
752 edhill 1.24 -adm | -ad) ADM=t ;;
753    
754 edhill 1.10 -ieee) IEEE=true ;;
755     -noieee) IEEE= ;;
756    
757 edhill 1.1 -verbose) verbose=2 ;;
758     -debug) debug=1 ;;
759     -quiet) verbose=0 ;;
760    
761 edhill 1.40 -deldir | -dd) DELDIR=t ;;
762    
763 edhill 1.1 -*)
764     echo "Error: unrecognized option: "$ac_option
765     usage
766     ;;
767    
768     *)
769     echo "Error: unrecognized argument: "$ac_option
770     usage
771     ;;
772    
773     esac
774    
775     done
776    
777 edhill 1.10 if test "x$QUICK" = xt ; then
778     NOGENMAKE=t
779     NOCLEAN=t
780     NODEPEND=t
781     fi
782    
783 edhill 1.1 if test "x$TESTDIRS" = x ; then
784     TESTDIRS=`scandirs`
785     fi
786    
787 edhill 1.10 if test "x$OPTFILE" = xNONE -a "x$MITGCM_OF" != x ; then
788     OPTFILE=$MITGCM_OF
789     fi
790    
791 edhill 1.24 if test "x$ADM" = xt -a "x$COMMAND" = x ; then
792     COMMAND="./mitgcmuv_ad > output.txt_adm 2>&1"
793     fi
794    
795     if test "x$COMMAND" = x ; then
796 edhill 1.45 COMMAND="$MAKE output.txt"
797 edhill 1.24 fi
798    
799 edhill 1.1 echo "OK"
800    
801     # create the FORTRAN comparison code
802     createcodelet
803    
804     # build the mpack utility
805 edhill 1.31 if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then
806 edhill 1.32 echo "skipping mpack build"
807     else
808 edhill 1.31 build_mpack
809     fi
810 edhill 1.1
811     # Create a uniquely named directory to store results
812     MACH=`hostname`
813 edhill 1.2 UNAMEA=`uname -a`
814 edhill 1.1 DATE=`date +%Y%m%d`
815 edhill 1.25 BASE="tr_"$MACH"_"$DATE"_"
816 edhill 1.1 DNUM=0
817     DRESULTS="$BASE$DNUM"
818     while test -e $DRESULTS ; do
819     DNUM=$(( $DNUM + 1 ))
820     DRESULTS="$BASE$DNUM"
821     done
822     mkdir $DRESULTS
823     RETVAL=$?
824     if test "x$RETVAL" != x0 ; then
825 edhill 1.20 echo "ERROR: Can't create results directory \"./$DRESULTS\""
826 edhill 1.1 exit 1
827     fi
828     SUMMARY="$DRESULTS/summary.txt"
829 edhill 1.34 printf "Start time: " >> $SUMMARY
830 edhill 1.16 start_date=`date`
831 edhill 1.17 echo $start_date > $SUMMARY
832 edhill 1.1
833 edhill 1.11 of_path=
834 edhill 1.10 if test "x$OPTFILE" != xNONE ; then
835     if test -r $OPTFILE ; then
836 edhill 1.11 # get the path
837     path=${OPTFILE%/*}
838     if test "x$path" = x ; then
839     of_path=`pwd`
840     else
841     of_path=`( cd $path > /dev/null 2>&1 ; pwd )`
842     fi
843     file=${OPTFILE##*/}
844     OPTFILE=$of_path/$file
845 edhill 1.21 cp $OPTFILE $DRESULTS
846     echo >> $SUMMARY
847     echo " OPTFILE=$OPTFILE" >> $SUMMARY
848 edhill 1.11 else
849 edhill 1.21 echo | tee $SUMMARY
850     echo "ERROR: can't read OPTFILE=\"$OPTFILE\"" | tee $SUMMARY
851     exit 1
852 edhill 1.10 fi
853 edhill 1.21 else
854     echo >> $SUMMARY
855     echo "No \"OPTFILE\" was explicitly specified by testreport," >> $SUMMARY
856     echo " so the genmake default will be used." >> $SUMMARY
857 edhill 1.10 fi
858     echo
859     echo >> $SUMMARY
860 edhill 1.24 if test "x$ADM" = x ; then
861 edhill 1.49 line_0=" ----T----- ----S----- ----U----- ----V-----"
862     line_1="G D M c m s m s m s m s"
863     line_2="E p a R g m m e . m m e . m m e . m m e ."
864     line_3="N n k u 2 i a a d i a a d i a a d i a a d"
865     line_4="2 d e n d n x n . n x n . n x n . n x n ."
866 edhill 1.50 for ii in $PTRACERS_NUM ; do
867 edhill 1.49 # tst=`eval 'echo $HAVE_PTR0'$ii`
868     # if test "x$tst" = xt ; then
869     line_0="$line_0 --PTR 0"$ii"--"
870     line_1="$line_1 m s"
871     line_2="$line_2 m m e ."
872     line_3="$line_3 i a a d"
873     line_4="$line_4 n x n ."
874     # fi
875     done
876     echo "$line_0" | tee -a $SUMMARY
877     echo "$line_1" | tee -a $SUMMARY
878     echo "$line_2" | tee -a $SUMMARY
879     echo "$line_3" | tee -a $SUMMARY
880     echo "$line_4" | tee -a $SUMMARY
881     echo " " | tee -a $SUMMARY
882 edhill 1.24 else
883     echo "ADJOINT=true" >> $SUMMARY
884     echo >> $SUMMARY
885     cat << EOF | tee -a $SUMMARY
886     G D M C G
887     E p a R o r
888     N n k u s a
889     2 d e n t d
890    
891     EOF
892     fi
893 edhill 1.1
894 edhill 1.10 # ...and each test directory...
895     for dir in $TESTDIRS ; do
896    
897     # Cleanup only!
898     if test "x$CLEANUP" = xt ; then
899     if test -r $dir/build/Makefile ; then
900     ( cd $dir/build ; make CLEAN )
901     fi
902     if test -r $dir/input/Makefile ; then
903     ( cd $dir/input ; make CLEAN )
904     fi
905 edhill 1.62 (
906     cd $dir
907     rm -rf tr_run.*
908     )
909 edhill 1.10 continue
910 edhill 1.1 fi
911 edhill 1.3
912 edhill 1.10 # Verify that the testdir exists and contains previous
913     # results in the correct location--or skip this directory!
914 edhill 1.24 fout=
915     if test "x$ADM" = x ; then
916     fout=$dir"/results/output.txt"
917     else
918     fout=$dir"/results_ad/output.txt_adm"
919     fi
920     if test ! -r $fout ; then
921     echo "can't read \"$fout\" -- skipping $dir"
922 edhill 1.10 continue
923     fi
924 edhill 1.53 if test "x$ADM" = x ; then
925     check_for_add_mon_output $fout
926     fi
927 edhill 1.7
928 edhill 1.49 # Check for additional types of monitor output
929    
930 edhill 1.12 builddir="input"
931     rundir="input"
932     use_seperate_build=0
933     if test -d $dir/build -a -r $dir/build ; then
934     builddir="build"
935     rundir="build"
936     use_seperate_build=1
937     linkdata $use_seperate_build $dir/$rundir
938 edhill 1.10 fi
939    
940 edhill 1.34 # Check whether there are "extra runs" for this testdir
941     extra_runs=
942     if test "x$ADM" = x -a "x$use_seperate_build" = x1 ; then
943     ex_run_dirs=`( cd $dir ; echo input.* )`
944     echo "ex_run_dirs='$ex_run_dirs'"
945     for exd in $ex_run_dirs ; do
946     name=`echo $exd | sed -e 's/input.//g'`
947     outf="$dir/results/output.txt.$name"
948     if test -f $outf -a -r $outf ; then
949     extra_runs="$extra_runs $name"
950     fi
951     done
952     fi
953    
954 edhill 1.24 if test "x$ADM" = x ; then
955 edhill 1.27 code_dir=code
956 edhill 1.24 CODE_DIR=$dir/code
957     else
958 edhill 1.27 code_dir=code_ad
959 edhill 1.24 CODE_DIR=$dir/code_ad
960     fi
961 edhill 1.10 BUILD_DIR=$dir/$builddir
962 edhill 1.28
963 edhill 1.30 if test ! -r $CODE_DIR"/SIZE.h_mpi" -a "x$MPI" = "xt" ; then
964 edhill 1.28 echo "can't find \"$CODE_DIR/SIZE.h_mpi\" -- skipping $dir"
965     continue
966     fi
967    
968     echo "-------------------------------------------------------------------------------"
969     echo
970     echo "Experiment: $dir"
971     echo
972     unset genmake makedepend make run
973     results='-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --'
974 edhill 1.10
975     # Create an output dir for each OPTFILE/tdir combination
976 edhill 1.20 rel_CDIR=$DRESULTS"/"$dir
977     mkdir $rel_CDIR
978     CDIR=`pwd`"/$rel_CDIR"
979 edhill 1.10
980     if test "x$CLEANUP" = xt ; then
981     makeclean $dir/$builddir
982     else
983 edhill 1.1 genmakemodel $dir/$builddir && genmake=Y \
984     && makeclean $dir/$builddir \
985 edhill 1.27 && symlink_mpifiles $dir $code_dir $builddir \
986 edhill 1.1 && makedependmodel $dir/$builddir && makedepend=Y \
987     && makemodel $dir/$builddir && make=Y \
988 edhill 1.12 && linkdata $use_seperate_build $dir/$rundir \
989     && runmodel $dir/$rundir && run=Y \
990 edhill 1.1 && results=`testoutput $dir $rundir`
991 edhill 1.10 fi
992    
993     echo
994 edhill 1.24 if test "x$ADM" = x ; then
995     fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
996 edhill 1.34 echo
997     echo "$fres" >> $SUMMARY
998     echo "fresults='$fres'" > $CDIR"/summary.txt"
999     echo "MACH='$MACH'" >> $CDIR"/summary.txt"
1000     echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"
1001     echo "DATE='$DATE'" >> $CDIR"/summary.txt"
1002     echo "tdir='$dir'" >> $CDIR"/summary.txt"
1003    
1004     for ex in $extra_runs ; do
1005 edhill 1.61 test ! -e "$dir/tr_run.$ex" && mkdir "$dir/tr_run.$ex"
1006 edhill 1.62 for ldir in input.$ex input ; do
1007 edhill 1.61 (
1008     cd "$dir/$ldir" > /dev/null 2>&1
1009     ls -1 2>/dev/null \
1010     | sed -e 's|^CVS$||g' | sed -e 's|^output.txt$||g'
1011     ) > tr_exrun_links
1012     (
1013     cd "$dir/tr_run.$ex"
1014     cat ../../tr_exrun_links | while read i ; do
1015     if test ! "x$i" = x ; then
1016 edhill 1.62 test ! -r $i && ln -s "../"$ldir"/"$i $i
1017 edhill 1.61 fi
1018     done
1019     )
1020     test -e tr_exrun_links && rm -f tr_exrun_links
1021     done
1022 edhill 1.62 ldir=build
1023     (
1024     cd "$dir/$ldir" > /dev/null 2>&1
1025 jmc 1.63 ls -1 Makefile *.[fFhco] mitgcmuv 2>/dev/null \
1026 edhill 1.62 | sed -e 's|^CVS$||g' | sed -e 's|^output.txt$||g'
1027     ) > tr_exrun_links
1028     (
1029     cd "$dir/tr_run.$ex"
1030     cat ../../tr_exrun_links | while read i ; do
1031     if test ! "x$i" = x ; then
1032     test ! -r $i && ln -s "../"$ldir"/"$i $i
1033     fi
1034     done
1035     )
1036     test -e tr_exrun_links && rm -f tr_exrun_links
1037 jmc 1.42 runmodel $dir/tr_run.$ex && run=Y \
1038     && results=`testoutput $dir tr_run.$ex "."$ex`
1039 edhill 1.34 fres=`printf '%s %s %s %s' ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N}`
1040     fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1041     fres="$fres.$ex"
1042     echo
1043     echo "$fres" >> $SUMMARY
1044     echo "fresults='$fres'" > $CDIR"/summary.txt"
1045     echo "MACH='$MACH'" >> $CDIR"/summary.txt"
1046     echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"
1047     echo "DATE='$DATE'" >> $CDIR"/summary.txt"
1048     echo "tdir='$dir'" >> $CDIR"/summary.txt"
1049     done
1050 edhill 1.24 else
1051     fres=`printf '%s %s %s %s' ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N}`
1052     fres=$fres"$results $dir"
1053 edhill 1.34 echo
1054     echo "$fres" >> $SUMMARY
1055     echo "fresults='$fres'" > $CDIR"/summary.txt"
1056     echo "MACH='$MACH'" >> $CDIR"/summary.txt"
1057     echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"
1058     echo "DATE='$DATE'" >> $CDIR"/summary.txt"
1059     echo "tdir='$dir'" >> $CDIR"/summary.txt"
1060 edhill 1.24 fi
1061 edhill 1.68
1062     postclean $dir/$builddir
1063 edhill 1.10
1064     echo "-------------------------------------------------------------------------------"
1065    
1066 edhill 1.1 done
1067    
1068 edhill 1.34 printf "Start time: " >> $SUMMARY
1069 edhill 1.16 echo $start_date >> $SUMMARY
1070 edhill 1.34 printf "End time: " >> $SUMMARY
1071 edhill 1.13 date >> $SUMMARY
1072 edhill 1.20
1073     # If addresses were supplied and mpack built successfully, then try
1074     # to send email using mpack.
1075     if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then
1076     echo "No results email was sent."
1077     else
1078     if test "x$HAVE_MPACK" = xt ; then
1079     tar -cf $DRESULTS".tar" $DRESULTS > /dev/null 2>&1 \
1080     && gzip $DRESULTS".tar" \
1081 edhill 1.44 && $MPACK -s MITgcm-test -m 3555000 $DRESULTS".tar.gz" $ADDRESSES
1082 edhill 1.20 RETVAL=$?
1083     if test "x$RETVAL" != x0 ; then
1084     echo
1085     echo "Warning: The tar, gzip, & mpack step failed. Please send email"
1086     echo " to <MITgcm-support@mitgcm.org> for help. You may copy the "
1087     echo " summary of results from the directory \"$DRESULTS\"."
1088     echo
1089     else
1090     echo
1091     echo "An email containing results was sent to the following addresses:"
1092     echo " \"$ADDRESSES\""
1093     echo
1094     fi
1095     test -f $DRESULTS".tar" && rm -f $DRESULTS".tar"
1096     test -f $DRESULTS".tar.gz" && rm -f $DRESULTS".tar.gz"
1097     fi
1098     fi
1099 edhill 1.13
1100 edhill 1.22 # rm -f tmp_cmpnum.f a.out
1101     rm -f tmp_cmpnum.c tmp_cmpnum
1102 edhill 1.1
1103 edhill 1.12 if test "x$CLEANUP" != xt ; then
1104 jmc 1.65 cat $SUMMARY | sed 's/ -- -- -- --//g'
1105 edhill 1.25 if test -e tr_out.txt ; then
1106     mv tr_out.txt tr_out.txt.old
1107 edhill 1.14 fi
1108 jmc 1.65 cat $SUMMARY | sed 's/ -- -- -- --//g' > tr_out.txt
1109 edhill 1.12 fi
1110 edhill 1.1
1111 edhill 1.40 if test "x$DELDIR" = xt ; then
1112     rm -rf $DRESULTS
1113     fi
1114    

  ViewVC Help
Powered by ViewVC 1.1.22