/[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.64 - (hide annotations) (download)
Mon Jan 31 19:26:24 2005 UTC (19 years, 1 month ago) by edhill
Branch: MAIN
Changes since 1.63: +2 -2 lines
 o lrint() --> rint() which is more portable  [thanks to Martin!]

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

  ViewVC Help
Powered by ViewVC 1.1.22