/[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.22 - (hide annotations) (download)
Thu Nov 7 21:53:34 2002 UTC (21 years, 5 months ago) by adcroft
Branch: MAIN
CVS Tags: checkpoint48f_post, checkpoint47j_post, checkpoint48d_pre, branch-exfmods-tag, checkpoint47e_post, checkpoint47i_post, checkpoint48i_post, checkpoint47, checkpoint47f_post, checkpoint48d_post, checkpoint47c_post, checkpoint50e_post, checkpoint50c_post, checkpoint47d_post, checkpoint47a_post, checkpoint48a_post, checkpoint46n_post, checkpoint48e_post, checkpoint48h_post, checkpoint50c_pre, checkpoint50d_pre, checkpoint47h_post, checkpoint48c_post, checkpoint48, checkpoint49, checkpoint47b_post, checkpoint48g_post, checkpoint50, checkpoint50d_post, checkpoint46m_post, checkpoint47g_post, checkpoint48b_post, checkpoint50b_post, checkpoint47d_pre, checkpoint48c_pre, checkpoint50a_post, checkpoint50e_pre, checkpoint50b_pre
Branch point for: branch-exfmods-curt
Changes since 1.21: +14 -0 lines
Added catch for cases when experiments are checked in with insufficient
monitor output for testscript to use. Instead of a 16 d.p. match
testscript now returns "--" and N/O instead of "pass".

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     # testoutput_for_prop dir s1 label
15     #
16     # compares files in $dir/input/output.txt and $dir/results.output.txt
17     # using search strings s1 and text label
18    
19     if [ $debug -gt 0 ]; then
20     echo testoutput_for_prop: grep "$2" $1/input/output.txt 1>&2
21     fi
22     if [ -r $1/input/output.txt ]; then
23     grep "$2" $1/input/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     # testoutput diretory
88     #
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     testoutput_for_prop $1 "cg2d_init_res" "cg2d init. residual"; cg2dres=$?
95     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.8 testoutput_for_prop $1 "dynstat_theta_min" "theta minimum"; tmin=$?
101     testoutput_for_prop $1 "dynstat_theta_max" "theta maximum"; tmax=$?
102     testoutput_for_prop $1 "dynstat_theta_mean" "theta mean"; tmean=$?
103     testoutput_for_prop $1 "dynstat_theta_sd" "theta s.d."; tsd=$?
104     testoutput_for_prop $1 "dynstat_salt_min" "salt minimum"; smin=$?
105     testoutput_for_prop $1 "dynstat_salt_max" "salt maximum"; smax=$?
106     testoutput_for_prop $1 "dynstat_salt_mean" "salt mean"; smean=$?
107     testoutput_for_prop $1 "dynstat_salt_sd" "salt s.d."; ssd=$?
108     testoutput_for_prop $1 "dynstat_uvel_min" "U minimum"; umin=$?
109     testoutput_for_prop $1 "dynstat_uvel_max" "U maximum"; umax=$?
110     testoutput_for_prop $1 "dynstat_uvel_mean" "U mean"; umean=$?
111     testoutput_for_prop $1 "dynstat_uvel_sd" "U s.d."; usd=$?
112     testoutput_for_prop $1 "dynstat_vvel_min" "V minimum"; vmin=$?
113     testoutput_for_prop $1 "dynstat_vvel_max" "V maximum"; vmax=$?
114     testoutput_for_prop $1 "dynstat_vvel_mean" "V mean"; vmean=$?
115     testoutput_for_prop $1 "dynstat_vvel_sd" "V s.d."; vsd=$?
116     else
117     testoutput_for_prop $1 "dynstat_theta_min" "theta minimum"; tmin=$?
118     testoutput_for_prop $1 "dynstat_theta_max" "theta maximum"; tmax=$?
119     testoutput_for_prop $1 "dynstat_salt_min" "salt minimum"; smin=$?
120     testoutput_for_prop $1 "dynstat_salt_max" "salt maximum"; smax=$?
121     testoutput_for_prop $1 "dynstat_uvel_min" "U minimum"; umin=$?
122     testoutput_for_prop $1 "dynstat_uvel_max" "U maximum"; umax=$?
123     testoutput_for_prop $1 "dynstat_vvel_min" "V minimum"; vmin=$?
124     testoutput_for_prop $1 "dynstat_vvel_max" "V maximum"; vmax=$?
125     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     ../../../tools/genmake -mods=../code > make.log 2>&1
141     else
142     ../../../tools/genmake -ieee -mods=../code > make.log 2>&1
143     fi
144 adcroft 1.8 if [ $? -ne 0 ]; then
145     tail make.log
146 adcroft 1.10 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     runmodel()
231     {
232     # runmodel directory exe
233     #
234     # runs the model "exe" in "directory" (exe is relative to directory)
235    
236     ( cd $1
237     if [ -x $2 ]; then
238 adcroft 1.16 if [ $quick -eq 0 ]; then
239 adcroft 1.15 rm -f output.txt
240 adcroft 1.8 fi
241 adcroft 1.19 printf 'runmodel: ' 1>&2
242 adcroft 1.16 make output.txt && return 0
243     # if [ ! -r output.txt -o $quick -eq 0 ]; then
244     # echo runmodel: running... 1>&2
245     # ( ./$2 > output.txt 2>&1 ) && return 0
246     # rm -f output.txt
247     # ( make output.txt ) && return 0
248     # return 1
249     # else
250     # echo runmodel: output.txt is newer than executable 1>&2
251     # ( make output.txt ) && return 0
252     # return 0
253     # fi
254     # else
255     # echo runmodel: executable \"$1/$2\" is missing 1>&2
256     # return 1
257 adcroft 1.8 fi
258     )
259     }
260    
261     createcodelet()
262     {
263     # create codelet for comparing model output
264     cat > tmp_cmpnum.f <<EOFA
265     program cmpnum
266     implicit none
267     real*8 a,b,diff
268     integer linnum,best
269     best=-16
270     99 read(*,*,end=70,err=60) linnum,a,b
271     diff=0.5*(abs(a)+abs(b))
272 adcroft 1.9 c print *,a,b,diff,abs(a-b)/diff
273     if (diff.gt.1.e-12) then
274 adcroft 1.8 diff=abs(a-b)/diff
275     if (diff.gt.0.) then
276     c print *,int(log10(diff)),diff
277     linnum=int(log10(diff))
278     best=max(best,linnum)
279     endif
280 adcroft 1.9 else
281     if (best.eq.-16.and.diff.ne.0.) best=-22
282 adcroft 1.1 endif
283 adcroft 1.8 goto 99
284     60 stop 'cmpnum: An error occured reading a,b'
285     70 print *,-best
286     end
287     EOFA
288     f77 tmp_cmpnum.f
289     if [ -x ./a.out ]; then
290     return 0
291     else
292     echo createcodelet: failed to compile codelet 1>&2
293     exit 1
294     fi
295     }
296    
297     formatresults()
298     {
299     # formatresults expt genmake depend make run results*
300    
301     nm=$1
302     printf '%s %s %s %s' $2 $3 $4 $5
303     shift; shift; shift; shift; shift;
304     printf '%3s' $@
305    
306     if [ $1 = '--' ]; then
307     printf ' N/O '
308     else
309     if [ $1 -gt 12 ]; then
310     printf ' pass'
311 adcroft 1.1 else
312 adcroft 1.8 printf ' FAIL'
313     fi
314     fi
315     printf ' %s' $nm
316     printf '\n'
317    
318     }
319    
320     show_help()
321     {
322     cat - << EOF
323     $0 [-help] [-quick] [-verbose] dir1 [dir2] [...]
324     -help Show this help message
325     -quick Skip "genmake" and "make depend" if the Makefile exists
326     -quiet Reduce the amount of output
327     -verbose Produce copious amounts of output
328 adcroft 1.10 -debug Produce even more output which will mean nothing to most
329 adcroft 1.18 -force Do "make CLEAN" before compiling. This forces a complete rebuild.
330     -clean Do "make CLEAN" after compiling and testing.
331 adcroft 1.20 -shorttest Don't compare numeric output for mean and s.d. of variables.
332 adcroft 1.14 -noieee By default, $0 uses the -ieee option for genmake. This turns it off.
333 adcroft 1.21 -cleanup Aggresively removes all model output, executables and object files
334     and then exits. Use with care.
335 adcroft 1.8
336     Normal usage:
337     $0 * Configure, compile, run and analyze in all experiment directories
338     EOF
339     }
340    
341 adcroft 1.11 scandirs()
342     {
343     if [ $# -eq 0 ]; then
344     for arg in *
345     do
346     test -d $arg/input && echo $arg
347     done
348     else
349     echo $*
350     fi
351     }
352    
353 adcroft 1.21 clean_up()
354     {
355     # Find all executables, object files, CPP'd source and model output
356     # and DELETE it.
357     for opt in '-name mitgcmuv*' '-name *.o' '-name *.f' '-name *.c' '-path *results -prune -o -name *.meta' '-path *results -prune -o -name *.data' '-type l'
358     do
359     echo Cleaning: find . $opt -exec rm {} \;
360     find . $opt -exec rm {} \;
361     done
362     }
363    
364 adcroft 1.8 ###############################################################################
365    
366     # Main function
367    
368     # Default properties
369     debug=0
370     verbose=1
371     quick=0
372 adcroft 1.18 force=0
373 adcroft 1.10 clean=0
374 adcroft 1.14 ieee=1
375 adcroft 1.20 longtest=1
376 adcroft 1.8 expts=''
377    
378     # Process arguments
379     for arg in $@
380     do
381     case $arg in
382 adcroft 1.21 -cleanup) clean_up; exit 0;;
383 adcroft 1.8 -quick) quick=1;;
384     -verbose) verbose=2;;
385     -debug) debug=1;;
386 adcroft 1.18 -force) force=1;;
387 adcroft 1.10 -clean) clean=1;;
388 adcroft 1.14 -noieee) ieee=0;;
389 adcroft 1.20 -shorttest) longtest=0;;
390 adcroft 1.8 -quiet) verbose=0;;
391     -help) show_help; exit 0;;
392 adcroft 1.13 -*) echo Unrecognized option:$arg; exit 9;;
393 adcroft 1.8 *) test -d $arg && expts=`echo $expts $arg`;;
394     esac
395     done
396 adcroft 1.15
397 adcroft 1.18 if [ $force -gt 0 -a $quick -gt 0 ]; then
398     echo You specified -quick and -force together which conflict.
399     echo Please specify either -quick or -force or neither but not both.
400 adcroft 1.15 exit 1
401     fi
402 adcroft 1.8
403 adcroft 1.11 #if [ ${#expts} -eq 0 ]; then
404     # echo Scanning all directories
405     # for arg in *
406     # do
407     # test -d $arg && expts=`echo $expts $arg`
408     # done
409     #fi
410     expts=`scandirs $expts`
411 adcroft 1.8
412     createcodelet
413    
414 adcroft 1.10 if [ $longtest -gt 0 ]; then
415 adcroft 1.8 cat << EOF > summary.txt
416     T S U V
417     C D M c m s m s m s m s
418     n p a R g m m e . m m e . m m e . m m e .
419     f n k u 2 i a a d i a a d i a a d i a a d
420     g d e n d n x n . n x n . n x n . n x n .
421    
422     EOF
423     else
424     cat << EOF > summary.txt
425     T S U V
426     C D M c
427     n p a R g m m m m m m m m
428     f n k u 2 i a i a i a i a
429     g d e n d n x n x n x n x
430    
431     EOF
432     fi
433    
434     # Now configue, make, run and test in each directory
435     for dir in $expts
436     do
437     if [ -r $dir/results/output.txt ]; then
438     echo -------------------------------------------------------------------------------
439     echo
440     echo Experiment: $dir
441     echo
442     unset genmake makedepend make run
443 adcroft 1.12 if [ $longtest -gt 0 ]; then
444     results='-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --'
445     else
446     results='-- -- -- -- -- -- -- -- --'
447     fi
448 adcroft 1.8 genmakemodel $dir/input && genmake=Y \
449 adcroft 1.18 && makecleancompile $dir/input \
450 adcroft 1.8 && makedependmodel $dir/input && makedepend=Y \
451     && makemodel $dir/input && make=Y \
452     && runmodel $dir/input mitgcmuv && run=Y \
453 heimbach 1.17 && results=`testoutput $dir` \
454 adcroft 1.18 && makecleanupafter $dir/input
455 adcroft 1.8 echo
456     formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results
457     echo
458     formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results >> summary.txt
459     fi
460     done
461    
462     rm tmp_cmpnum.f a.out
463 adcroft 1.1
464 adcroft 1.8 echo -------------------------------------------------------------------------------
465     echo
466 adcroft 1.1 cat summary.txt

  ViewVC Help
Powered by ViewVC 1.1.22