/[MITgcm]/MITgcm/verification/testscript
ViewVC logotype

Annotation of /MITgcm/verification/testscript

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


Revision 1.27 - (hide annotations) (download)
Wed Jan 21 20:38:22 2004 UTC (20 years, 3 months ago) by adcroft
Branch: MAIN
CVS Tags: checkpoint52l_pre, checkpoint52j_post, checkpoint52j_pre, checkpoint52l_post, checkpoint52k_post, checkpoint52i_post, checkpoint52i_pre
Changes since 1.26: +54 -10 lines
Missing fix that from testreport for building in build...

1 adcroft 1.8 #!/bin/sh
2 adcroft 1.1
3 adcroft 1.8 compare_lines()
4     {
5     # use codelet to compare lines
6 adcroft 1.9 if [ $verbose -gt 1 ]; then
7     cat tmp3.txt 1>&2
8     fi
9 adcroft 1.8 return `./a.out < tmp3.txt`
10     }
11    
12     testoutput_for_prop()
13     {
14 adcroft 1.23 # testoutput_for_prop dir s1 label subdir
15 adcroft 1.8 #
16 adcroft 1.23 # compares files in $dir/$subdir/output.txt and $dir/results/output.txt
17 adcroft 1.8 # using search strings s1 and text label
18    
19     if [ $debug -gt 0 ]; then
20 adcroft 1.23 echo testoutput_for_prop: grep "$2" $1/$4/output.txt 1>&2
21 adcroft 1.8 fi
22 adcroft 1.23 if [ -r $1/$4/output.txt ]; then
23     grep "$2" $1/$4/output.txt | sed 's/.*=//' | nl > tmp1.txt
24 adcroft 1.22 lncnt=`wc -l tmp1.txt | awk '{print $1}' `
25     if [ $lncnt -lt 3 ]; then
26     if [ $verbose -gt 0 ]; then
27     echo Not enough lines of output when searching for "$2" 1>&2
28     fi
29     return 99
30     fi
31 adcroft 1.1 else
32 adcroft 1.8 echo testoutput_for_prop: output.txt from model run was not readable 1>&2
33     return 99
34     fi
35     if [ $debug -gt 0 ]; then
36     echo testoutput_for_prop: grep "$2" $1/results/output.txt 1>&2
37     fi
38     grep "$2" $1/results/output.txt | sed 's/.*=//' | nl > tmp2.txt
39 adcroft 1.22 lncnt=`wc -l tmp2.txt | awk '{print $1}' `
40     if [ $lncnt -lt 3 ]; then
41     if [ $verbose -gt 0 ]; then
42     echo Not enough lines of output when searching for "$2" 1>&2
43     fi
44     return 99
45     fi
46 adcroft 1.8 if [ $debug -gt 0 ]; then
47     echo testoutput_for_prop: join tmp1.txt tmp2.txt 1>&2
48     fi
49     join tmp1.txt tmp2.txt | awk '{print $1 " " $2 " " $3}' > tmp3.txt
50     if [ $debug -gt 0 ]; then
51     echo testoutput_for_prop: compare_lines 1>&2
52     fi
53 adcroft 1.9 compare_lines
54 adcroft 1.8 digits_of_similarity=$?
55     if [ $digits_of_similarity -eq 99 ]; then
56     if [ $verbose -gt 0 ]; then
57     echo testoutput_for_prop: No comparison was available for \"$2\" 1>&2
58     fi
59     digits_of_similarity=99
60     else
61     if [ $verbose -gt 0 ]; then
62     echo There were $digits_of_similarity decimal places of similarity for \"$2\" 1>&2
63     fi
64     fi
65     rm tmp1.txt tmp2.txt tmp3.txt
66    
67     return $digits_of_similarity
68     }
69    
70     dashnum()
71     {
72     # dashnum n1 n2 n3 ...
73     #
74     # print numbers using %3i format or "--" if number = 99
75     for num in $@
76     do
77     if [ $num = 99 ]; then
78     printf ' --'
79     else
80     printf '%3i' $num
81     fi
82     done
83     }
84    
85     testoutput()
86     {
87 adcroft 1.23 # testoutput diretory subdir
88 adcroft 1.8 #
89     # test output in "directory"
90    
91     if [ $debug -gt 0 ]; then
92     echo testoutput: testoutput_for_prop $1 cg2d_init_res 1>&2
93     fi
94 adcroft 1.23 testoutput_for_prop $1 "cg2d_init_res" "cg2d init. residual" $2; cg2dres=$?
95 adcroft 1.8 if [ $debug -gt 0 ]; then
96     echo testoutput: cg2dres=$cg2dres 1>&2
97     fi
98    
99 adcroft 1.10 if [ $longtest -gt 0 ]; then
100 adcroft 1.23 testoutput_for_prop $1 "dynstat_theta_min" "theta minimum" $2; tmin=$?
101     testoutput_for_prop $1 "dynstat_theta_max" "theta maximum" $2; tmax=$?
102     testoutput_for_prop $1 "dynstat_theta_mean" "theta mean" $2; tmean=$?
103     testoutput_for_prop $1 "dynstat_theta_sd" "theta s.d." $2; tsd=$?
104     testoutput_for_prop $1 "dynstat_salt_min" "salt minimum" $2; smin=$?
105     testoutput_for_prop $1 "dynstat_salt_max" "salt maximum" $2; smax=$?
106     testoutput_for_prop $1 "dynstat_salt_mean" "salt mean" $2; smean=$?
107     testoutput_for_prop $1 "dynstat_salt_sd" "salt s.d." $2; ssd=$?
108     testoutput_for_prop $1 "dynstat_uvel_min" "U minimum" $2; umin=$?
109     testoutput_for_prop $1 "dynstat_uvel_max" "U maximum" $2; umax=$?
110     testoutput_for_prop $1 "dynstat_uvel_mean" "U mean" $2; umean=$?
111     testoutput_for_prop $1 "dynstat_uvel_sd" "U s.d." $2; usd=$?
112     testoutput_for_prop $1 "dynstat_vvel_min" "V minimum" $2; vmin=$?
113     testoutput_for_prop $1 "dynstat_vvel_max" "V maximum" $2; vmax=$?
114     testoutput_for_prop $1 "dynstat_vvel_mean" "V mean" $2; vmean=$?
115     testoutput_for_prop $1 "dynstat_vvel_sd" "V s.d." $2; vsd=$?
116 adcroft 1.8 else
117 adcroft 1.23 testoutput_for_prop $1 "dynstat_theta_min" "theta minimum" $2; tmin=$?
118     testoutput_for_prop $1 "dynstat_theta_max" "theta maximum" $2; tmax=$?
119     testoutput_for_prop $1 "dynstat_salt_min" "salt minimum" $2; smin=$?
120     testoutput_for_prop $1 "dynstat_salt_max" "salt maximum" $2; smax=$?
121     testoutput_for_prop $1 "dynstat_uvel_min" "U minimum" $2; umin=$?
122     testoutput_for_prop $1 "dynstat_uvel_max" "U maximum" $2; umax=$?
123     testoutput_for_prop $1 "dynstat_vvel_min" "V minimum" $2; vmin=$?
124     testoutput_for_prop $1 "dynstat_vvel_max" "V maximum" $2; vmax=$?
125 adcroft 1.8 fi
126    
127     dashnum $cg2dres $tmin $tmax $tmean $tsd $smin $smax $smean $ssd \
128     $umin $umax $umean $usd $vmin $vmax $vmean $vsd
129     #printf '%3i' $cg2dres $tmin $tmax $tmean $tsd $smin $smax $smean $ssd \
130     # $umin $umax $umean $usd $vmin $vmax $vmean $vsd
131     }
132    
133     genmakemodel()
134     {
135     # genmakemodel directory
136     ( cd $1;
137     if [ $quick -eq 0 -o ! -r Makefile ]; then
138     printf 'genmake ... ' 1>&2
139 adcroft 1.13 if [ $ieee -eq 0 ]; then
140 adcroft 1.26 ../../../tools/genmake2 -mods=../code > make.log 2>&1
141 adcroft 1.13 else
142 adcroft 1.26 ../../../tools/genmake2 -ieee -mods=../code > make.log 2>&1
143 adcroft 1.13 fi
144 adcroft 1.8 if [ $? -ne 0 ]; then
145     tail make.log
146 edhill 1.25 echo genmakemodel: $genmake failed 1>&2
147 adcroft 1.8 return 1
148     else
149     echo succesful 1>&2
150     fi
151     fi
152     )
153     }
154    
155 adcroft 1.18 makecleancompile()
156 adcroft 1.10 {
157 adcroft 1.18 # makecleancompile directory
158     ( cd $1;
159     if [ $force -gt 0 ]; then
160     rm -f output.txt
161     printf 'make clean ... ' 2>&1
162     make CLEAN >> make.log 2>&1
163     if [ $? -ne 0 ]; then
164     tail make.log
165     echo makecleancompile: make clean failed 1>&2
166     return 1
167     else
168     echo succesful 1>&2
169     fi
170     fi
171     )
172     }
173    
174     makecleanupafter()
175     {
176     # makeupafter directory
177 adcroft 1.10 ( cd $1;
178     if [ $clean -gt 0 ]; then
179 adcroft 1.15 rm -f output.txt
180 adcroft 1.10 printf 'make clean ... ' 2>&1
181     make CLEAN >> make.log 2>&1
182     if [ $? -ne 0 ]; then
183     tail make.log
184 adcroft 1.18 echo makeupafter: make clean failed 1>&2
185 adcroft 1.10 return 1
186     else
187     echo succesful 1>&2
188     fi
189     fi
190     )
191     }
192    
193 adcroft 1.8 makedependmodel()
194     {
195     # makedependmodel directory
196     ( cd $1;
197     if [ $quick -eq 0 -o ! -r Makefile ]; then
198     printf 'make depend ... ' 1>&2
199     make cleanlinks >> make.log 2>&1
200     make depend >> make.log 2>&1
201     if [ $? -ne 0 ]; then
202     tail make.log
203     echo makemodel: make depend failed 1>&2
204     return 1
205     else
206     echo succesful 1>&2
207     fi
208     fi
209     )
210     }
211    
212     makemodel()
213     {
214     # makemodel directory
215     ( cd $1;
216     if [ -r Makefile ]; then
217     printf 'make ... ' 1>&2
218     make >> make.log 2>&1
219     if [ $? -ne 0 ]; then
220     tail make.log
221     echo failed 1>&2
222     return 1
223     else
224     echo succesful 1>&2
225     fi
226     fi
227     )
228     }
229    
230 adcroft 1.23 linkdata()
231     {
232 adcroft 1.27 # linkdata flag
233     #
234     # symbolically link data files to run directory
235     if test "x$1" = x1 ; then
236     (
237     cd $2
238     if test "x$ADM" = x ; then
239     files=`( cd ../input ; ls -1 | grep -v CVS )`
240     for i in $files ; do
241     if test ! -d "../input/"$i ; then
242     ln -sf "../input/"$i $i
243     fi
244     done
245     else
246     files=`( cd ../input ; ls -1 *.bin | grep -v CVS )`
247     for i in $files ; do
248     if test ! -d "../input/"$i ; then
249     ln -sf "../input/"$i $i
250     fi
251     done
252     files=`( cd ../input_ad ; ls -1 | grep -v CVS )`
253     for i in $files ; do
254     if test ! -d "../input_ad/"$i ; then
255     ln -sf "../input_ad/"$i $i
256     fi
257     done
258     fi
259     )
260     fi
261 adcroft 1.23 }
262    
263 adcroft 1.8 runmodel()
264     {
265     # runmodel directory exe
266     #
267     # runs the model "exe" in "directory" (exe is relative to directory)
268    
269     ( cd $1
270     if [ -x $2 ]; then
271 adcroft 1.16 if [ $quick -eq 0 ]; then
272 adcroft 1.15 rm -f output.txt
273 adcroft 1.8 fi
274 adcroft 1.27 if [ $debug -gt 0 ]; then
275     echo -n runmodel: pwd= 1>&2
276     pwd 1>&2
277     fi
278 adcroft 1.19 printf 'runmodel: ' 1>&2
279 adcroft 1.23 make output.txt && return 0
280     return 1
281 adcroft 1.8 fi
282     )
283     }
284    
285 adcroft 1.27 copynewresults()
286     {
287     # copynewresults directory
288     #
289     # runs the model "exe" in "directory" (exe is relative to directory)
290    
291     ( cd $1
292     if [ $newresults -eq 1 ]; then
293     if [ -r output.txt ]; then
294     cp -f output.txt ../results/
295     return 0
296     fi
297     fi
298     )
299     }
300    
301 adcroft 1.8 createcodelet()
302     {
303     # create codelet for comparing model output
304     cat > tmp_cmpnum.f <<EOFA
305     program cmpnum
306     implicit none
307     real*8 a,b,diff
308     integer linnum,best
309     best=-16
310     99 read(*,*,end=70,err=60) linnum,a,b
311     diff=0.5*(abs(a)+abs(b))
312 adcroft 1.9 c print *,a,b,diff,abs(a-b)/diff
313     if (diff.gt.1.e-12) then
314 adcroft 1.8 diff=abs(a-b)/diff
315     if (diff.gt.0.) then
316     c print *,int(log10(diff)),diff
317     linnum=int(log10(diff))
318     best=max(best,linnum)
319     endif
320 adcroft 1.9 else
321     if (best.eq.-16.and.diff.ne.0.) best=-22
322 adcroft 1.1 endif
323 adcroft 1.8 goto 99
324     60 stop 'cmpnum: An error occured reading a,b'
325     70 print *,-best
326     end
327     EOFA
328     f77 tmp_cmpnum.f
329     if [ -x ./a.out ]; then
330     return 0
331     else
332     echo createcodelet: failed to compile codelet 1>&2
333     exit 1
334     fi
335     }
336    
337     formatresults()
338     {
339     # formatresults expt genmake depend make run results*
340    
341     nm=$1
342     printf '%s %s %s %s' $2 $3 $4 $5
343     shift; shift; shift; shift; shift;
344     printf '%3s' $@
345    
346     if [ $1 = '--' ]; then
347     printf ' N/O '
348     else
349     if [ $1 -gt 12 ]; then
350     printf ' pass'
351 adcroft 1.1 else
352 adcroft 1.8 printf ' FAIL'
353     fi
354     fi
355     printf ' %s' $nm
356     printf '\n'
357    
358     }
359    
360     show_help()
361     {
362     cat - << EOF
363     $0 [-help] [-quick] [-verbose] dir1 [dir2] [...]
364     -help Show this help message
365     -quick Skip "genmake" and "make depend" if the Makefile exists
366 adcroft 1.27 -newresults Copy the output.txt into results/
367 adcroft 1.8 -quiet Reduce the amount of output
368     -verbose Produce copious amounts of output
369 adcroft 1.10 -debug Produce even more output which will mean nothing to most
370 adcroft 1.18 -force Do "make CLEAN" before compiling. This forces a complete rebuild.
371     -clean Do "make CLEAN" after compiling and testing.
372 adcroft 1.20 -shorttest Don't compare numeric output for mean and s.d. of variables.
373 adcroft 1.14 -noieee By default, $0 uses the -ieee option for genmake. This turns it off.
374 adcroft 1.21 -cleanup Aggresively removes all model output, executables and object files
375     and then exits. Use with care.
376 adcroft 1.8
377     Normal usage:
378     $0 * Configure, compile, run and analyze in all experiment directories
379     EOF
380     }
381    
382 adcroft 1.11 scandirs()
383     {
384     if [ $# -eq 0 ]; then
385     for arg in *
386     do
387     test -d $arg/input && echo $arg
388     done
389     else
390     echo $*
391     fi
392     }
393    
394 adcroft 1.21 clean_up()
395     {
396     # Find all executables, object files, CPP'd source and model output
397     # and DELETE it.
398 adcroft 1.23 for opt in '-name "mitgcmuv*"' '-name "*.o"' '-name "*.f"' '-name "*.c"' '-name "fort.*"' '-name "make.log"' '-path *results -prune -o -name "*.meta"' '-path *results -prune -o -name "*.data"' '-type l'
399 adcroft 1.21 do
400     echo Cleaning: find . $opt -exec rm {} \;
401     find . $opt -exec rm {} \;
402     done
403     }
404    
405 adcroft 1.8 ###############################################################################
406 adcroft 1.23 ###############################################################################
407     ###############################################################################
408 adcroft 1.8
409     # Main function
410    
411     # Default properties
412     debug=0
413     verbose=1
414     quick=0
415 adcroft 1.27 newresults=0
416 adcroft 1.18 force=0
417 adcroft 1.10 clean=0
418 adcroft 1.14 ieee=1
419 adcroft 1.20 longtest=1
420 adcroft 1.8 expts=''
421 edhill 1.25 genmake=genmake
422 adcroft 1.8
423     # Process arguments
424     for arg in $@
425     do
426     case $arg in
427 adcroft 1.21 -cleanup) clean_up; exit 0;;
428 adcroft 1.8 -quick) quick=1;;
429 adcroft 1.27 -newresults) newresults=1;;
430 adcroft 1.8 -verbose) verbose=2;;
431     -debug) debug=1;;
432 adcroft 1.18 -force) force=1;;
433 adcroft 1.10 -clean) clean=1;;
434 adcroft 1.14 -noieee) ieee=0;;
435 adcroft 1.20 -shorttest) longtest=0;;
436 adcroft 1.8 -quiet) verbose=0;;
437     -help) show_help; exit 0;;
438 adcroft 1.13 -*) echo Unrecognized option:$arg; exit 9;;
439 adcroft 1.8 *) test -d $arg && expts=`echo $expts $arg`;;
440     esac
441     done
442 adcroft 1.15
443 adcroft 1.18 if [ $force -gt 0 -a $quick -gt 0 ]; then
444     echo You specified -quick and -force together which conflict.
445     echo Please specify either -quick or -force or neither but not both.
446 adcroft 1.15 exit 1
447     fi
448 adcroft 1.8
449 adcroft 1.11 #if [ ${#expts} -eq 0 ]; then
450     # echo Scanning all directories
451     # for arg in *
452     # do
453     # test -d $arg && expts=`echo $expts $arg`
454     # done
455     #fi
456     expts=`scandirs $expts`
457 adcroft 1.8
458     createcodelet
459    
460 jmc 1.24 date > summary.txt
461 adcroft 1.10 if [ $longtest -gt 0 ]; then
462 jmc 1.24 cat << EOF >> summary.txt
463 adcroft 1.8 T S U V
464     C D M c m s m s m s m s
465     n p a R g m m e . m m e . m m e . m m e .
466     f n k u 2 i a a d i a a d i a a d i a a d
467     g d e n d n x n . n x n . n x n . n x n .
468    
469     EOF
470     else
471 jmc 1.24 cat << EOF >> summary.txt
472 adcroft 1.8 T S U V
473     C D M c
474     n p a R g m m m m m m m m
475     f n k u 2 i a i a i a i a
476     g d e n d n x n x n x n x
477    
478     EOF
479     fi
480    
481     # Now configue, make, run and test in each directory
482     for dir in $expts
483     do
484     if [ -r $dir/results/output.txt ]; then
485     echo -------------------------------------------------------------------------------
486     echo
487     echo Experiment: $dir
488     echo
489 edhill 1.25 unset genmakepass makedepend make run
490 adcroft 1.12 if [ $longtest -gt 0 ]; then
491     results='-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --'
492     else
493     results='-- -- -- -- -- -- -- -- --'
494     fi
495 adcroft 1.23 if [ -r $dir/build ]; then
496     seperatebuilddir=1
497     builddir=build
498     rundir=build
499 adcroft 1.27 (cd $dir/input; rm -f *.{o,f,c,F,h} work* output.txt Make* make.log; )
500 adcroft 1.23 else
501     seperatebuilddir=0
502     builddir=input
503     rundir=input
504     fi
505 edhill 1.25 genmakemodel $dir/$builddir && genmakepass=Y \
506 adcroft 1.23 && makecleancompile $dir/$builddir \
507     && makedependmodel $dir/$builddir && makedepend=Y \
508     && makemodel $dir/$builddir && make=Y \
509     && linkdata $seperatebuilddir $dir/$rundir \
510     && runmodel $dir/$builddir mitgcmuv && run=Y \
511     && results=`testoutput $dir $rundir` \
512 adcroft 1.27 && copynewresults $dir/$rundir \
513 adcroft 1.23 && makecleanupafter $dir/$builddir
514 adcroft 1.8 echo
515 edhill 1.25 formatresults $dir ${genmakepass:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results
516 adcroft 1.8 echo
517 edhill 1.25 formatresults $dir ${genmakepass:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results >> summary.txt
518 adcroft 1.8 fi
519     done
520    
521     rm tmp_cmpnum.f a.out
522 adcroft 1.1
523 adcroft 1.8 echo -------------------------------------------------------------------------------
524     echo
525 jmc 1.24 date >> summary.txt
526 adcroft 1.1 cat summary.txt

  ViewVC Help
Powered by ViewVC 1.1.22