/[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.6 - (show annotations) (download)
Wed Sep 10 02:30:37 2003 UTC (20 years, 6 months ago) by edhill
Branch: MAIN
Changes since 1.5: +41 -35 lines
minor changes for mpi

1 #!/bin/bash
2 #
3 # $Header: /u/u3/gcmpack/MITgcm/verification/testreport,v 1.4 2003/09/03 20:02:47 edhill Exp $
4 #
5
6 usage()
7 {
8 echo
9 echo "Usage: $0 [OPTIONS]"
10 echo
11 echo "where possible OPTIONS are:"
12 echo " (-help|-h) print usage"
13 echo " (-optfile=|-of=)STRING list of optfiles to use"
14 echo " (-a|-addr)STRING list of email recipients"
15 echo " (DEF=\"edhill@mitgcm.org\")"
16 echo " (-t|-tdir)STRING list of test dirs to use"
17 echo " (DEF=\"\" which builds all)"
18 echo " (-b|-bash)STRING location of \"bash\" executable"
19 echo " (DEF=\"\" for \"/bin/bash\")"
20 echo " (-c|-command)STRING command to run"
21 echo " (DEF=\"make output.txt\")"
22 echo
23 echo "and where STRING follows a whitespace-delimited format"
24 echo "such as:"
25 echo " -t 'exp0 exp2 exp3' "
26 echo " -addr='abc@123.com testing@home.org'"
27 echo
28 exit 1
29 }
30
31 # build the mpack utility
32 build_mpack()
33 {
34 echo -n "building the mpack utility... "
35 if test ! -x "$MPACKDIR/mpack" ; then
36 if test ! -d $MPACKDIR ; then
37 echo "Error: can't find \"$MPACKDIR\""
38 echo " are you sure this program is being run in the correct "
39 echo " (that is, \"MITGCM_ROOT\verification\") directory?"
40 exit 1
41 fi
42 echo -n "building mpack... "
43 ( cd $MPACKDIR && ./configure && make ) > build_mpack.out 2>&1
44 RETVAL=$?
45 if test "x$RETVAL" != x0 ; then
46 echo
47 echo "Error building the mpack tools at: $MPACK_DIR"
48 exit 1
49 fi
50 fi
51 echo "OK"
52 }
53
54 compare_lines()
55 {
56 # use codelet to compare lines
57 if [ $verbose -gt 1 ]; then
58 cat tmp3.txt 1>&2
59 fi
60 return `./a.out < tmp3.txt`
61 }
62
63 testoutput_for_prop()
64 {
65 # testoutput_for_prop dir s1 label subdir
66 #
67 # compares files in $dir/$subdir/output.txt and $dir/results/output.txt
68 # using search strings s1 and text label
69
70 if [ $debug -gt 0 ]; then
71 echo testoutput_for_prop: grep "$2" $1/$4/output.txt 1>&2
72 fi
73 if [ -r $1/$4/output.txt ]; then
74 grep "$2" $1/$4/output.txt | sed 's/.*=//' | nl > tmp1.txt
75 lncnt=`wc -l tmp1.txt | awk '{print $1}' `
76 if [ $lncnt -lt 3 ]; then
77 if [ $verbose -gt 0 ]; then
78 echo Not enough lines of output when searching for "$2" 1>&2
79 fi
80 return 99
81 fi
82 else
83 echo testoutput_for_prop: output.txt from model run was not readable 1>&2
84 return 99
85 fi
86 if [ $debug -gt 0 ]; then
87 echo testoutput_for_prop: grep "$2" $1/results/output.txt 1>&2
88 fi
89 grep "$2" $1/results/output.txt | sed 's/.*=//' | nl > tmp2.txt
90 lncnt=`wc -l tmp2.txt | awk '{print $1}' `
91 if [ $lncnt -lt 3 ]; then
92 if [ $verbose -gt 0 ]; then
93 echo Not enough lines of output when searching for "$2" 1>&2
94 fi
95 return 99
96 fi
97 if [ $debug -gt 0 ]; then
98 echo testoutput_for_prop: join tmp1.txt tmp2.txt 1>&2
99 fi
100 join tmp1.txt tmp2.txt | awk '{print $1 " " $2 " " $3}' > tmp3.txt
101 if [ $debug -gt 0 ]; then
102 echo testoutput_for_prop: compare_lines 1>&2
103 fi
104 compare_lines
105 digits_of_similarity=$?
106 if [ $digits_of_similarity -eq 99 ]; then
107 if [ $verbose -gt 0 ]; then
108 echo testoutput_for_prop: No comparison was available for \"$2\" 1>&2
109 fi
110 digits_of_similarity=99
111 else
112 if [ $verbose -gt 0 ]; then
113 echo There were $digits_of_similarity decimal places of similarity for \"$2\" 1>&2
114 fi
115 fi
116 rm tmp1.txt tmp2.txt tmp3.txt
117
118 return $digits_of_similarity
119 }
120
121 dashnum()
122 {
123 # dashnum n1 n2 n3 ...
124 #
125 # print numbers using %3i format or "--" if number = 99
126
127 for num in $@ ; do
128 if [ $num = 99 ]; then
129 printf ' --'
130 else
131 printf '%3i' $num
132 fi
133 done
134 }
135
136 testoutput()
137 {
138 # testoutput diretory subdir
139 #
140 # test output in "directory"
141
142 if [ $debug -gt 0 ]; then
143 echo testoutput: testoutput_for_prop $1 cg2d_init_res 1>&2
144 fi
145 testoutput_for_prop $1 "cg2d_init_res" "cg2d init. residual" $2; cg2dres=$?
146 if [ $debug -gt 0 ]; then
147 echo testoutput: cg2dres=$cg2dres 1>&2
148 fi
149
150 testoutput_for_prop $1 "dynstat_theta_min" "theta minimum" $2; tmin=$?
151 testoutput_for_prop $1 "dynstat_theta_max" "theta maximum" $2; tmax=$?
152 testoutput_for_prop $1 "dynstat_theta_mean" "theta mean" $2; tmean=$?
153 testoutput_for_prop $1 "dynstat_theta_sd" "theta s.d." $2; tsd=$?
154 testoutput_for_prop $1 "dynstat_salt_min" "salt minimum" $2; smin=$?
155 testoutput_for_prop $1 "dynstat_salt_max" "salt maximum" $2; smax=$?
156 testoutput_for_prop $1 "dynstat_salt_mean" "salt mean" $2; smean=$?
157 testoutput_for_prop $1 "dynstat_salt_sd" "salt s.d." $2; ssd=$?
158 testoutput_for_prop $1 "dynstat_uvel_min" "U minimum" $2; umin=$?
159 testoutput_for_prop $1 "dynstat_uvel_max" "U maximum" $2; umax=$?
160 testoutput_for_prop $1 "dynstat_uvel_mean" "U mean" $2; umean=$?
161 testoutput_for_prop $1 "dynstat_uvel_sd" "U s.d." $2; usd=$?
162 testoutput_for_prop $1 "dynstat_vvel_min" "V minimum" $2; vmin=$?
163 testoutput_for_prop $1 "dynstat_vvel_max" "V maximum" $2; vmax=$?
164 testoutput_for_prop $1 "dynstat_vvel_mean" "V mean" $2; vmean=$?
165 testoutput_for_prop $1 "dynstat_vvel_sd" "V s.d." $2; vsd=$?
166
167 dashnum $cg2dres $tmin $tmax $tmean $tsd $smin $smax $smean $ssd \
168 $umin $umax $umean $usd $vmin $vmax $vmean $vsd
169 }
170
171 genmakemodel()
172 {
173 # genmakemodel directory
174 GENMAKE2="$BASH ../../../tools/genmake2"
175 (
176 cd $1;
177 printf 'genmake ... ' 1>&2
178 # ../../../tools/genmake -ieee -mods=../code > make.log 2>&1
179 $GENMAKE2 -ds --mods=../code "--optfile="$OPTFILE > make.log 2>&1
180 RETVAL=$?
181 for i in gm_state gm_optfile gm_local Makefile ; do
182 if test -r $i ; then
183 cp $i $CDIR
184 fi
185 done
186 if test "x$RETVAL" != x0 ; then
187 tail make.log
188 echo "genmakemodel: genmake failed" 1>&2
189 cp make.log $CDIR
190 return 1
191 else
192 echo "succesful" 1>&2
193 fi
194 )
195 }
196
197 makeclean()
198 {
199 # makeclean directory
200 (
201 cd $1;
202 if test -e output.txt ; then
203 rm -f output.txt
204 fi
205 printf 'make CLEAN ... ' 2>&1
206 if test -r Makefile ; then
207 make CLEAN >> make.log 2>&1
208 RETVAL=$?
209 if test "x$RETVAL" != x0 ; then
210 tail make.log
211 echo "makeclean: \"make CLEAN\" failed" 1>&2
212 cp make.log $CDIR"/make.log"
213 return 1
214 fi
215 fi
216 echo succesful 1>&2
217 exit 0
218 )
219 }
220
221 makedependmodel()
222 {
223 # makedependmodel directory
224 (
225 cd $1;
226 printf 'make depend ... ' 1>&2
227 make depend >> make.log 2>&1
228 RETVAL=$?
229 if test "x$RETVAL" != x0 ; then
230 tail make.log
231 echo "makedependmodel: make depend failed" 1>&2
232 cp make.log $CDIR"/make.log"
233 return 1
234 else
235 echo succesful 1>&2
236 fi
237 )
238 }
239
240 makemodel()
241 {
242 # makemodel directory
243 (
244 cd $1;
245 if test -r Makefile ; then
246 printf 'make ... ' 1>&2
247 make >> make.log 2>&1
248 RETVAL=$?
249 if test "x$RETVAL" != x0 ; then
250 tail make.log
251 echo failed 1>&2
252 cp make.log $CDIR"/make.log"
253 return 1
254 else
255 echo succesful 1>&2
256 fi
257 fi
258 )
259 }
260
261 linkdata()
262 {
263 # linkdata flag
264 #
265 # symbolically link data files to run directory
266 if [ $1 -ne 0 ]; then
267 ( cd $2 ; ln -sf ../input/* . )
268 fi
269 }
270
271 runmodel()
272 {
273 # runmodel directory
274 #
275 # runs "$COMMAND" in "directory"
276 # (where "$COMMAND" is relative to "directory")
277 (
278 cd $1
279 printf 'runmodel: ' 1>&2
280 # make output.txt
281 $COMMAND
282 RETVAL=$?
283 if test "x$RETVAL" = x0 ; then
284 cp output.txt $CDIR"/output.txt"
285 return 0
286 else
287 return 1
288 fi
289 )
290 }
291
292 createcodelet()
293 {
294 # create codelet for comparing model output
295
296 echo -n "creating the comparison code... "
297 cat > tmp_cmpnum.f <<EOFA
298 program cmpnum
299 implicit none
300 real*8 a,b,diff
301 integer linnum,best
302 best=-16
303 99 read(*,*,end=70,err=60) linnum,a,b
304 diff=0.5*(abs(a)+abs(b))
305 c print *,a,b,diff,abs(a-b)/diff
306 if (diff.gt.1.e-12) then
307 diff=abs(a-b)/diff
308 if (diff.gt.0.) then
309 c print *,int(log10(diff)),diff
310 linnum=int(log10(diff))
311 best=max(best,linnum)
312 endif
313 else
314 if (best.eq.-16.and.diff.ne.0.) best=-22
315 endif
316 goto 99
317 60 stop 'cmpnum: An error occured reading a,b'
318 70 print *,-best
319 end
320 EOFA
321
322 f77 tmp_cmpnum.f
323 if [ -x ./a.out ]; then
324 echo "OK"
325 return 0
326 else
327 echo
328 echo "createcodelet: failed to compile codelet"
329 exit 1
330 fi
331 }
332
333 formatresults()
334 {
335 # formatresults expt genmake depend make run results*
336
337 nm=$1
338 printf '%s %s %s %s' $2 $3 $4 $5
339 shift; shift; shift; shift; shift;
340 printf '%3s' $@
341
342 if [ $1 = '--' ]; then
343 printf ' N/O '
344 else
345 if [ $1 -gt 12 ]; then
346 printf ' pass'
347 else
348 printf ' FAIL'
349 fi
350 fi
351 printf ' %s' $nm
352 printf '\n'
353
354 }
355
356 show_help()
357 {
358 cat - << EOF
359 $0 [-help] [-quick] [-verbose] dir1 [dir2] [...]
360 -help Show this help message
361 -quick Skip "genmake" and "make depend" if the Makefile exists
362 -quiet Reduce the amount of output
363 -verbose Produce copious amounts of output
364 -debug Produce even more output which will mean nothing to most
365 -force Do "make CLEAN" before compiling. This forces a complete rebuild.
366 -clean Do "make CLEAN" after compiling and testing.
367 -noieee By default, $0 uses the -ieee option for genmake. This turns it off.
368 -cleanup Aggresively removes all model output, executables and object files
369 and then exits. Use with care.
370
371 Normal usage:
372 $0 * Configure, compile, run and analyze in all experiment directories
373 EOF
374 }
375
376 scandirs()
377 {
378 if [ $# -eq 0 ]; then
379 for arg in * ; do
380 test -d $arg/input && echo $arg
381 done
382 else
383 echo $*
384 fi
385 }
386
387
388 ###############################################################################
389 ###############################################################################
390 ###############################################################################
391
392
393 # Default properties
394 debug=0
395 verbose=1
396 clean=0
397 expts=''
398 # ieee=1
399 # quick=0
400
401 BASH=
402 OPTFILES=
403 ADDRESSES=edhill@mitgcm.org
404 TESTDIRS=
405 MPACKDIR="../tools/mpack-1.6"
406 MPACK="$MPACKDIR/mpack"
407 COMMAND="make output.txt"
408
409 echo -n "parsing options... "
410
411 ac_prev=
412 for ac_option ; do
413
414 # If the previous option needs an argument, assign it.
415 if test -n "$ac_prev"; then
416 eval "$ac_prev=\$ac_option"
417 ac_prev=
418 continue
419 fi
420
421 ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
422
423 case $ac_option in
424
425 -help | --help | -h | --h)
426 usage ;;
427
428 -optfile | --optfile | -of | --of)
429 ac_prev=OPTFILES ;;
430 -optfile=* | --optfile=* | -of=* | --of=*)
431 OPTFILES=$ac_optarg ;;
432
433 -addr | --addr | -a | --a)
434 ac_prev=ADDRESSES ;;
435 -addr=* | --addr=*)
436 ADDRESSES=$ac_optarg ;;
437
438 -tdir | --tdir | -t | --t)
439 ac_prev=TESTDIRS ;;
440 -tdir=* | --tdir=*)
441 TESTDIRS=$ac_optarg ;;
442
443 -bash | --bash | -b | --b)
444 ac_prev=BASH ;;
445 -bash=* | --bash=*)
446 BASH=$ac_optarg ;;
447
448 -command | --command | -c | --c)
449 ac_prev=COMMAND ;;
450 -command=* | --command=*)
451 COMMAND=$ac_optarg ;;
452
453 -verbose) verbose=2 ;;
454 -debug) debug=1 ;;
455 -clean) clean=1 ;;
456 -quiet) verbose=0 ;;
457
458 -*)
459 echo "Error: unrecognized option: "$ac_option
460 usage
461 ;;
462
463 *)
464 echo "Error: unrecognized argument: "$ac_option
465 usage
466 ;;
467
468 esac
469
470 done
471
472 if test "x$TESTDIRS" = x ; then
473 TESTDIRS=`scandirs`
474 fi
475
476 echo "OK"
477
478 # create the FORTRAN comparison code
479 createcodelet
480
481 # build the mpack utility
482 build_mpack
483
484 # Create a uniquely named directory to store results
485 MACH=`hostname`
486 UNAMEA=`uname -a`
487 DATE=`date +%Y%m%d`
488 BASE=$MACH"_"$DATE"_"
489 DNUM=0
490 DRESULTS="$BASE$DNUM"
491 while test -e $DRESULTS ; do
492 DNUM=$(( $DNUM + 1 ))
493 DRESULTS="$BASE$DNUM"
494 done
495 mkdir $DRESULTS
496 RETVAL=$?
497 if test "x$RETVAL" != x0 ; then
498 echo "Error: can't create results directory \"./$DRESULTS\""
499 exit 1
500 fi
501 SUMMARY="$DRESULTS/summary.txt"
502 date > $SUMMARY
503 cat << EOF >> $SUMMARY
504 T S U V
505 G D M c m s m s m s m s
506 E p a R g m m e . m m e . m m e . m m e .
507 N n k u 2 i a a d i a a d i a a d i a a d
508 2 d e n d n x n . n x n . n x n . n x n .
509
510 EOF
511
512 NDIR=0
513
514 # For each optfile...
515 for OPTFILE in $OPTFILES ; do
516
517 OPTFILE=`pwd`"/$OPTFILE"
518 if test ! -r $OPTFILE ; then
519 echo "Error: can't read optfile \"$OPTFILE\""
520 exit 1
521 fi
522 echo
523 echo "OPTFILE=$OPTFILE" >> $SUMMARY
524 echo >> $SUMMARY
525
526 # ...and each test directory...
527 for dir in $TESTDIRS ; do
528
529 # Verify that the testdir exists and contains previous
530 # results in the correct location--or skip this directory!
531 if test ! -r $dir"/results/output.txt" ; then
532 echo | tee -a $SUMMARY
533 echo "can't read \"$dir/results/output.txt\" -- skipping $dir" \
534 | tee -a $SUMMARY
535 continue
536 fi
537
538 # Create an output dir for each OPTFILE/tdir combination
539 CDIR=$DRESULTS"/"$DRESULTS"_"$NDIR
540 mkdir $CDIR
541 CDIR=`pwd`"/$CDIR"
542
543 # ...configue, make, run, and compare the output.
544 echo "-------------------------------------------------------------------------------"
545 echo
546 echo "Experiment: $dir"
547 echo
548 unset genmake makedepend make run
549 results='-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --'
550 ( cd $dir/input; rm -f *.{o,f,c,F} *.[f,F]90 work* output.txt Make* make.log; )
551 if [ -r $dir/build ]; then
552 seperatebuilddir=1
553 builddir=build
554 rundir=build
555 ( cd $dir/build; ln -sf ../input/* . )
556 else
557 seperatebuilddir=0
558 builddir=input
559 rundir=input
560 fi
561
562 genmakemodel $dir/$builddir && genmake=Y \
563 && makeclean $dir/$builddir \
564 && makedependmodel $dir/$builddir && makedepend=Y \
565 && makemodel $dir/$builddir && make=Y \
566 && linkdata $seperatebuilddir $dir/$rundir \
567 && runmodel $dir/$builddir && run=Y \
568 && results=`testoutput $dir $rundir`
569 echo
570 formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} \
571 ${run:-N} $results
572 echo
573 formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} \
574 ${run:-N} $results >> $SUMMARY
575 echo "fresults='" > $CDIR"/summary.txt"
576 formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} \
577 ${run:-N} $results >> $CDIR"/summary.txt"
578 echo "'" >> $CDIR"/summary.txt"
579 echo "MACH='$MACH'" >> $CDIR"/summary.txt"
580 echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"
581 echo "DATE='$DATE'" >> $CDIR"/summary.txt"
582 echo "tdir='$dir'" >> $CDIR"/summary.txt"
583
584 (
585 cd $DRESULTS
586 tar -cf $NDIR".tar" $DRESULTS"_"$NDIR > /dev/null 2>&1
587 gzip $NDIR".tar"
588 )
589
590 $MPACK -s MITgcm-test -m 1000000 $DRESULTS"/"$NDIR".tar.gz" $ADDRESSES
591 RETVAL=$?
592 if test "x$RETVAL" != x0 ; then
593 echo "Warning: \"$MPACK\" failed -- please contact <edhill@mitgcm.org>"
594 else
595 rm -f $DRESULTS"/"$NDIR".tar*"
596 fi
597
598 NDIR=$(( $NDIR + 1 ))
599
600 done
601 done
602
603 rm tmp_cmpnum.f a.out
604
605 cat $SUMMARY

  ViewVC Help
Powered by ViewVC 1.1.22