/[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.66 - (hide annotations) (download)
Fri Feb 4 16:41:42 2005 UTC (19 years, 1 month ago) by edhill
Branch: MAIN
Changes since 1.65: +4 -1 lines
 o make sure the "-mpi" flag gets passed on to genmake2

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

  ViewVC Help
Powered by ViewVC 1.1.22