/[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.71 - (hide annotations) (download)
Tue Aug 16 17:12:46 2005 UTC (18 years, 7 months ago) by jmc
Branch: MAIN
Changes since 1.70: +6 -1 lines
add a test for NAN & INF

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

  ViewVC Help
Powered by ViewVC 1.1.22