/[MITgcm]/MITgcm/verification/testreport
ViewVC logotype

Contents of /MITgcm/verification/testreport

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.91 - (show annotations) (download)
Wed Sep 5 00:07:25 2007 UTC (16 years, 6 months ago) by jmc
Branch: MAIN
Changes since 1.90: +22 -16 lines
change comparison code to handle NAN when used for AD testing.

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

  ViewVC Help
Powered by ViewVC 1.1.22