/[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.58 - (hide annotations) (download)
Fri Dec 10 17:36:43 2004 UTC (19 years, 3 months ago) by edhill
Branch: MAIN
Changes since 1.57: +4 -3 lines
 o use '$CC' and report error if the 'cc' default does not work

1 edhill 1.19 #! /usr/bin/env bash
2 edhill 1.1 #
3 edhill 1.58 # $Header: /u/gcmpack/MITgcm/verification/testreport,v 1.57 2004/12/09 16:52:08 jmc Exp $
4 edhill 1.12 # $Name: $
5 edhill 1.1 #
6    
7     usage()
8     {
9     echo
10     echo "Usage: $0 [OPTIONS]"
11     echo
12     echo "where possible OPTIONS are:"
13     echo " (-help|-h) print usage"
14 edhill 1.7 echo " (-mpi) use MPI input files"
15 edhill 1.10 echo " (-ieee|-noieee) if possible, use IEEE compiler flags"
16 edhill 1.41 echo " (DEF=\"-ieee\")"
17 edhill 1.6 echo " (-optfile=|-of=)STRING list of optfiles to use"
18 edhill 1.20 echo " (-a|-addr) STRING list of email recipients"
19 edhill 1.6 echo " (DEF=\"edhill@mitgcm.org\")"
20 edhill 1.20 echo " (-t|-tdir) STRING list of test dirs to use"
21 edhill 1.6 echo " (DEF=\"\" which builds all)"
22 edhill 1.20 echo " (-b|-bash) STRING preferred location of a \"bash\" or"
23     echo " Bourne-compatible \"sh\" shell"
24     echo " (DEF=\"\" for \"bash\")"
25 edhill 1.24 echo " (-adm|-ad) perform an adjoint run"
26 edhill 1.20 echo " (-command) STRING command to run"
27 edhill 1.6 echo " (DEF=\"make output.txt\")"
28 edhill 1.20 echo " (-m|-make) STRING command to use for \"make\""
29 edhill 1.8 echo " (DEF=\"make\")"
30 edhill 1.50 echo " (-ptracers|-ptr) STRING specify which ptracers to test"
31     echo " (DEF=\"1 2 3 4 5\")"
32 edhill 1.43 echo " (-j) JOBS use \"make -j JOBS\" for parallel builds"
33 edhill 1.10 echo " (-clean) *ONLY* run \"make CLEAN\""
34     echo " (-quick|-q) same as \"-nogenmake -noclean -nodepend\""
35     echo " (-nogenmake|-ng) skip the genmake stage"
36     echo " (-noclean|-nc) skip the \"make clean\" stage"
37     echo " (-nodepend|-nd) skip the \"make depend\" stage"
38 edhill 1.40 echo " (-deldir|-dd) on success, delete the output directory"
39 edhill 1.6 echo
40 edhill 1.50 echo "and where STRING can be a whitespace-delimited list"
41 edhill 1.6 echo "such as:"
42 edhill 1.50 echo
43 edhill 1.6 echo " -t 'exp0 exp2 exp3' "
44     echo " -addr='abc@123.com testing@home.org'"
45 edhill 1.1 echo
46 edhill 1.50 echo "provided that the expression is properly quoted within the current"
47     echo "shell (note the use of single quotes to protect white space)."
48     echo
49 edhill 1.1 exit 1
50     }
51    
52     # build the mpack utility
53     build_mpack()
54     {
55 edhill 1.34 printf "building the mpack utility... "
56 edhill 1.1 if test ! -x "$MPACKDIR/mpack" ; then
57     if test ! -d $MPACKDIR ; then
58 edhill 1.20 echo
59 edhill 1.1 echo "Error: can't find \"$MPACKDIR\""
60     echo " are you sure this program is being run in the correct "
61     echo " (that is, \"MITGCM_ROOT\verification\") directory?"
62 edhill 1.20 echo
63     HAVE_MPACK=f
64 edhill 1.1 fi
65 edhill 1.34 printf "building mpack... "
66 edhill 1.26 if test "x$CC" = x ; then
67     export CC=cc
68     fi
69 edhill 1.25 ( cd $MPACKDIR && ./configure && $MAKE ) > tr_build_mpack.out 2>&1
70 edhill 1.1 RETVAL=$?
71     if test "x$RETVAL" != x0 ; then
72     echo
73     echo "Error building the mpack tools at: $MPACK_DIR"
74 edhill 1.20 echo
75     HAVE_MPACK=f
76     else
77 edhill 1.25 rm -f tr_build_mpack.out
78 edhill 1.20 HAVE_MPACK=t
79 edhill 1.1 fi
80 edhill 1.20 else
81     HAVE_MPACK=t
82 edhill 1.1 fi
83     echo "OK"
84     }
85    
86     testoutput_for_prop()
87     {
88 edhill 1.34 # testoutput_for_prop dir s1 label subdir extension
89 edhill 1.1 #
90     # compares files in $dir/$subdir/output.txt and $dir/results/output.txt
91     # using search strings s1 and text label
92    
93     if [ $debug -gt 0 ]; then
94     echo testoutput_for_prop: grep "$2" $1/$4/output.txt 1>&2
95     fi
96     if [ -r $1/$4/output.txt ]; then
97 edhill 1.15 grep "$2" $1/$4/output.txt | sed 's/.*=//' | cat -n > tmp1.txt
98 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     if test ! -d "../input/"$i ; then
454     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 jmc 1.57 if (relerr > 0.0) { linnum = (int)log10(relerr); }
533     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.8 MAKE=make
640 edhill 1.43 JOBS=
641 edhill 1.7 MPI=f
642 edhill 1.40 DELDIR=
643 edhill 1.1
644 edhill 1.24 ADM=
645    
646 edhill 1.49 # Additional monitor types
647 edhill 1.50 PTRACERS_NUM="1 2 3 4 5"
648 edhill 1.49
649 edhill 1.34 printf "parsing options... "
650 edhill 1.1
651     ac_prev=
652     for ac_option ; do
653    
654     # If the previous option needs an argument, assign it.
655     if test -n "$ac_prev"; then
656     eval "$ac_prev=\$ac_option"
657     ac_prev=
658     continue
659     fi
660    
661     ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
662    
663     case $ac_option in
664    
665     -help | --help | -h | --h)
666     usage ;;
667    
668 edhill 1.2 -optfile | --optfile | -of | --of)
669 edhill 1.10 ac_prev=OPTFILE ;;
670 edhill 1.2 -optfile=* | --optfile=* | -of=* | --of=*)
671 edhill 1.10 OPTFILE=$ac_optarg ;;
672 edhill 1.1
673     -addr | --addr | -a | --a)
674     ac_prev=ADDRESSES ;;
675     -addr=* | --addr=*)
676     ADDRESSES=$ac_optarg ;;
677    
678     -tdir | --tdir | -t | --t)
679     ac_prev=TESTDIRS ;;
680     -tdir=* | --tdir=*)
681     TESTDIRS=$ac_optarg ;;
682 edhill 1.4
683     -bash | --bash | -b | --b)
684     ac_prev=BASH ;;
685     -bash=* | --bash=*)
686     BASH=$ac_optarg ;;
687 edhill 1.5
688 edhill 1.6 -command | --command | -c | --c)
689     ac_prev=COMMAND ;;
690     -command=* | --command=*)
691     COMMAND=$ac_optarg ;;
692 edhill 1.8
693     -make | --make | -m | --m)
694     ac_prev=MAKE ;;
695     -make=* | --make=*)
696     MAKE=$ac_optarg ;;
697 edhill 1.1
698 edhill 1.50 -ptracers | --ptracers | -ptr | --ptr)
699     ac_prev=PTRACERS_NUM ;;
700     -ptracers=* | --ptracers=* | -ptr=* | --ptr=*)
701     PTRACERS_NUM=$ac_optarg ;;
702    
703 edhill 1.43 -j) ac_prev=JOBS ;;
704     -j=*) JOBS=$ac_optarg ;;
705    
706 edhill 1.10 -clean | --clean)
707     CLEANUP=t ;;
708    
709     -quick | --quick | -q | --q)
710     QUICK=t ;;
711     -nogenmake | --nogenmake | -ng | --ng)
712     NOGENMAKE=t ;;
713     -noclean | --noclean | -nc | --nc)
714     NOCLEAN=t ;;
715     -nodepend | --nodepend | -nd | --nd)
716     NODEPEND=t ;;
717    
718 edhill 1.18 -mpi) MPI=t ;;
719 edhill 1.10
720 edhill 1.24 -adm | -ad) ADM=t ;;
721    
722 edhill 1.10 -ieee) IEEE=true ;;
723     -noieee) IEEE= ;;
724    
725 edhill 1.1 -verbose) verbose=2 ;;
726     -debug) debug=1 ;;
727     -quiet) verbose=0 ;;
728    
729 edhill 1.40 -deldir | -dd) DELDIR=t ;;
730    
731 edhill 1.1 -*)
732     echo "Error: unrecognized option: "$ac_option
733     usage
734     ;;
735    
736     *)
737     echo "Error: unrecognized argument: "$ac_option
738     usage
739     ;;
740    
741     esac
742    
743     done
744    
745 edhill 1.10 if test "x$QUICK" = xt ; then
746     NOGENMAKE=t
747     NOCLEAN=t
748     NODEPEND=t
749     fi
750    
751 edhill 1.1 if test "x$TESTDIRS" = x ; then
752     TESTDIRS=`scandirs`
753     fi
754    
755 edhill 1.10 if test "x$OPTFILE" = xNONE -a "x$MITGCM_OF" != x ; then
756     OPTFILE=$MITGCM_OF
757     fi
758    
759 edhill 1.24 if test "x$ADM" = xt -a "x$COMMAND" = x ; then
760     COMMAND="./mitgcmuv_ad > output.txt_adm 2>&1"
761     fi
762    
763     if test "x$COMMAND" = x ; then
764 edhill 1.45 COMMAND="$MAKE output.txt"
765 edhill 1.24 fi
766    
767 edhill 1.1 echo "OK"
768    
769     # create the FORTRAN comparison code
770     createcodelet
771    
772     # build the mpack utility
773 edhill 1.31 if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then
774 edhill 1.32 echo "skipping mpack build"
775     else
776 edhill 1.31 build_mpack
777     fi
778 edhill 1.1
779     # Create a uniquely named directory to store results
780     MACH=`hostname`
781 edhill 1.2 UNAMEA=`uname -a`
782 edhill 1.1 DATE=`date +%Y%m%d`
783 edhill 1.25 BASE="tr_"$MACH"_"$DATE"_"
784 edhill 1.1 DNUM=0
785     DRESULTS="$BASE$DNUM"
786     while test -e $DRESULTS ; do
787     DNUM=$(( $DNUM + 1 ))
788     DRESULTS="$BASE$DNUM"
789     done
790     mkdir $DRESULTS
791     RETVAL=$?
792     if test "x$RETVAL" != x0 ; then
793 edhill 1.20 echo "ERROR: Can't create results directory \"./$DRESULTS\""
794 edhill 1.1 exit 1
795     fi
796     SUMMARY="$DRESULTS/summary.txt"
797 edhill 1.34 printf "Start time: " >> $SUMMARY
798 edhill 1.16 start_date=`date`
799 edhill 1.17 echo $start_date > $SUMMARY
800 edhill 1.1
801 edhill 1.11 of_path=
802 edhill 1.10 if test "x$OPTFILE" != xNONE ; then
803     if test -r $OPTFILE ; then
804 edhill 1.11 # get the path
805     path=${OPTFILE%/*}
806     if test "x$path" = x ; then
807     of_path=`pwd`
808     else
809     of_path=`( cd $path > /dev/null 2>&1 ; pwd )`
810     fi
811     file=${OPTFILE##*/}
812     OPTFILE=$of_path/$file
813 edhill 1.21 cp $OPTFILE $DRESULTS
814     echo >> $SUMMARY
815     echo " OPTFILE=$OPTFILE" >> $SUMMARY
816 edhill 1.11 else
817 edhill 1.21 echo | tee $SUMMARY
818     echo "ERROR: can't read OPTFILE=\"$OPTFILE\"" | tee $SUMMARY
819     exit 1
820 edhill 1.10 fi
821 edhill 1.21 else
822     echo >> $SUMMARY
823     echo "No \"OPTFILE\" was explicitly specified by testreport," >> $SUMMARY
824     echo " so the genmake default will be used." >> $SUMMARY
825 edhill 1.10 fi
826     echo
827     echo >> $SUMMARY
828 edhill 1.24 if test "x$ADM" = x ; then
829 edhill 1.49 line_0=" ----T----- ----S----- ----U----- ----V-----"
830     line_1="G D M c m s m s m s m s"
831     line_2="E p a R g m m e . m m e . m m e . m m e ."
832     line_3="N n k u 2 i a a d i a a d i a a d i a a d"
833     line_4="2 d e n d n x n . n x n . n x n . n x n ."
834 edhill 1.50 for ii in $PTRACERS_NUM ; do
835 edhill 1.49 # tst=`eval 'echo $HAVE_PTR0'$ii`
836     # if test "x$tst" = xt ; then
837     line_0="$line_0 --PTR 0"$ii"--"
838     line_1="$line_1 m s"
839     line_2="$line_2 m m e ."
840     line_3="$line_3 i a a d"
841     line_4="$line_4 n x n ."
842     # fi
843     done
844     echo "$line_0" | tee -a $SUMMARY
845     echo "$line_1" | tee -a $SUMMARY
846     echo "$line_2" | tee -a $SUMMARY
847     echo "$line_3" | tee -a $SUMMARY
848     echo "$line_4" | tee -a $SUMMARY
849     echo " " | tee -a $SUMMARY
850 edhill 1.24 else
851     echo "ADJOINT=true" >> $SUMMARY
852     echo >> $SUMMARY
853     cat << EOF | tee -a $SUMMARY
854     G D M C G
855     E p a R o r
856     N n k u s a
857     2 d e n t d
858    
859     EOF
860     fi
861 edhill 1.1
862 edhill 1.10 # ...and each test directory...
863     for dir in $TESTDIRS ; do
864    
865     # Cleanup only!
866     if test "x$CLEANUP" = xt ; then
867     if test -r $dir/build/Makefile ; then
868     ( cd $dir/build ; make CLEAN )
869     fi
870     if test -r $dir/input/Makefile ; then
871     ( cd $dir/input ; make CLEAN )
872     fi
873     continue
874 edhill 1.1 fi
875 edhill 1.3
876 edhill 1.10 # Verify that the testdir exists and contains previous
877     # results in the correct location--or skip this directory!
878 edhill 1.24 fout=
879     if test "x$ADM" = x ; then
880     fout=$dir"/results/output.txt"
881     else
882     fout=$dir"/results_ad/output.txt_adm"
883     fi
884     if test ! -r $fout ; then
885     echo "can't read \"$fout\" -- skipping $dir"
886 edhill 1.10 continue
887     fi
888 edhill 1.53 if test "x$ADM" = x ; then
889     check_for_add_mon_output $fout
890     fi
891 edhill 1.7
892 edhill 1.49 # Check for additional types of monitor output
893    
894 edhill 1.12 builddir="input"
895     rundir="input"
896     use_seperate_build=0
897     if test -d $dir/build -a -r $dir/build ; then
898     builddir="build"
899     rundir="build"
900     use_seperate_build=1
901     linkdata $use_seperate_build $dir/$rundir
902 edhill 1.10 fi
903    
904 edhill 1.34 # Check whether there are "extra runs" for this testdir
905     extra_runs=
906     if test "x$ADM" = x -a "x$use_seperate_build" = x1 ; then
907     ex_run_dirs=`( cd $dir ; echo input.* )`
908     echo "ex_run_dirs='$ex_run_dirs'"
909     for exd in $ex_run_dirs ; do
910     name=`echo $exd | sed -e 's/input.//g'`
911     outf="$dir/results/output.txt.$name"
912     if test -f $outf -a -r $outf ; then
913     extra_runs="$extra_runs $name"
914     fi
915     done
916     fi
917    
918 edhill 1.24 if test "x$ADM" = x ; then
919 edhill 1.27 code_dir=code
920 edhill 1.24 CODE_DIR=$dir/code
921     else
922 edhill 1.27 code_dir=code_ad
923 edhill 1.24 CODE_DIR=$dir/code_ad
924     fi
925 edhill 1.10 BUILD_DIR=$dir/$builddir
926 edhill 1.28
927 edhill 1.30 if test ! -r $CODE_DIR"/SIZE.h_mpi" -a "x$MPI" = "xt" ; then
928 edhill 1.28 echo "can't find \"$CODE_DIR/SIZE.h_mpi\" -- skipping $dir"
929     continue
930     fi
931    
932     echo "-------------------------------------------------------------------------------"
933     echo
934     echo "Experiment: $dir"
935     echo
936     unset genmake makedepend make run
937     results='-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --'
938 edhill 1.10
939     # Create an output dir for each OPTFILE/tdir combination
940 edhill 1.20 rel_CDIR=$DRESULTS"/"$dir
941     mkdir $rel_CDIR
942     CDIR=`pwd`"/$rel_CDIR"
943 edhill 1.10
944     if test "x$CLEANUP" = xt ; then
945     makeclean $dir/$builddir
946     else
947 edhill 1.1 genmakemodel $dir/$builddir && genmake=Y \
948     && makeclean $dir/$builddir \
949 edhill 1.27 && symlink_mpifiles $dir $code_dir $builddir \
950 edhill 1.1 && makedependmodel $dir/$builddir && makedepend=Y \
951     && makemodel $dir/$builddir && make=Y \
952 edhill 1.12 && linkdata $use_seperate_build $dir/$rundir \
953     && runmodel $dir/$rundir && run=Y \
954 edhill 1.1 && results=`testoutput $dir $rundir`
955 edhill 1.10 fi
956    
957     echo
958 edhill 1.24 if test "x$ADM" = x ; then
959     fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
960 edhill 1.34 echo
961     echo "$fres" >> $SUMMARY
962     echo "fresults='$fres'" > $CDIR"/summary.txt"
963     echo "MACH='$MACH'" >> $CDIR"/summary.txt"
964     echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"
965     echo "DATE='$DATE'" >> $CDIR"/summary.txt"
966     echo "tdir='$dir'" >> $CDIR"/summary.txt"
967    
968     for ex in $extra_runs ; do
969 jmc 1.42 test -e "$dir/tr_run.$ex" && rm -rf "$dir/tr_run.$ex"
970     mkdir "$dir/tr_run.$ex"
971 edhill 1.36 links=`( cd "$dir/input" > /dev/null 2>&1 ; ls -1 | grep -v CVS )`
972 edhill 1.34 (
973 jmc 1.42 cd "$dir/tr_run.$ex"
974 edhill 1.34 for i in $links; do
975     ln -s ../input/$i $i
976     done
977     )
978 edhill 1.36 links=`( cd "$dir/input.$ex" > /dev/null 2>&1 ; ls -1 | grep -v CVS )`
979 edhill 1.34 (
980 jmc 1.42 cd "$dir/tr_run.$ex"
981 edhill 1.34 for i in $links; do
982     test -e $i && rm -f $i
983     ln -s ../input.$ex/$i $i
984     done
985     ln -s ../$builddir/mitgcmuv mitgcmuv
986     )
987 jmc 1.42 runmodel $dir/tr_run.$ex && run=Y \
988     && results=`testoutput $dir tr_run.$ex "."$ex`
989 edhill 1.34 fres=`printf '%s %s %s %s' ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N}`
990     fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
991     fres="$fres.$ex"
992     echo
993     echo "$fres" >> $SUMMARY
994     echo "fresults='$fres'" > $CDIR"/summary.txt"
995     echo "MACH='$MACH'" >> $CDIR"/summary.txt"
996     echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"
997     echo "DATE='$DATE'" >> $CDIR"/summary.txt"
998     echo "tdir='$dir'" >> $CDIR"/summary.txt"
999     done
1000 edhill 1.24 else
1001     fres=`printf '%s %s %s %s' ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N}`
1002     fres=$fres"$results $dir"
1003 edhill 1.34 echo
1004     echo "$fres" >> $SUMMARY
1005     echo "fresults='$fres'" > $CDIR"/summary.txt"
1006     echo "MACH='$MACH'" >> $CDIR"/summary.txt"
1007     echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"
1008     echo "DATE='$DATE'" >> $CDIR"/summary.txt"
1009     echo "tdir='$dir'" >> $CDIR"/summary.txt"
1010 edhill 1.24 fi
1011 edhill 1.10
1012     echo "-------------------------------------------------------------------------------"
1013    
1014 edhill 1.1 done
1015    
1016 edhill 1.34 printf "Start time: " >> $SUMMARY
1017 edhill 1.16 echo $start_date >> $SUMMARY
1018 edhill 1.34 printf "End time: " >> $SUMMARY
1019 edhill 1.13 date >> $SUMMARY
1020 edhill 1.20
1021     # If addresses were supplied and mpack built successfully, then try
1022     # to send email using mpack.
1023     if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then
1024     echo "No results email was sent."
1025     else
1026     if test "x$HAVE_MPACK" = xt ; then
1027     tar -cf $DRESULTS".tar" $DRESULTS > /dev/null 2>&1 \
1028     && gzip $DRESULTS".tar" \
1029 edhill 1.44 && $MPACK -s MITgcm-test -m 3555000 $DRESULTS".tar.gz" $ADDRESSES
1030 edhill 1.20 RETVAL=$?
1031     if test "x$RETVAL" != x0 ; then
1032     echo
1033     echo "Warning: The tar, gzip, & mpack step failed. Please send email"
1034     echo " to <MITgcm-support@mitgcm.org> for help. You may copy the "
1035     echo " summary of results from the directory \"$DRESULTS\"."
1036     echo
1037     else
1038     echo
1039     echo "An email containing results was sent to the following addresses:"
1040     echo " \"$ADDRESSES\""
1041     echo
1042     fi
1043     test -f $DRESULTS".tar" && rm -f $DRESULTS".tar"
1044     test -f $DRESULTS".tar.gz" && rm -f $DRESULTS".tar.gz"
1045     fi
1046     fi
1047 edhill 1.13
1048 edhill 1.22 # rm -f tmp_cmpnum.f a.out
1049     rm -f tmp_cmpnum.c tmp_cmpnum
1050 edhill 1.1
1051 edhill 1.12 if test "x$CLEANUP" != xt ; then
1052     cat $SUMMARY
1053 edhill 1.25 if test -e tr_out.txt ; then
1054     mv tr_out.txt tr_out.txt.old
1055 edhill 1.14 fi
1056 edhill 1.25 cat $SUMMARY > tr_out.txt
1057 edhill 1.12 fi
1058 edhill 1.1
1059 edhill 1.40 if test "x$DELDIR" = xt ; then
1060     rm -rf $DRESULTS
1061     fi
1062    

  ViewVC Help
Powered by ViewVC 1.1.22