/[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.21 - (hide annotations) (download)
Mon Mar 4 16:48:08 2002 UTC (19 years, 5 months ago) by adcroft
Branch: MAIN
CVS Tags: checkpoint46b_post, checkpoint46k_post, checkpoint45d_post, checkpoint44h_pre, checkpoint46j_post, checkpoint44f_pre, checkpoint46c_post, checkpoint46f_post, checkpoint46l_pre, checkpoint46a_post, checkpoint46d_pre, checkpoint46e_post, checkpoint45b_post, checkpoint44g_post, checkpoint46h_pre, checkpoint45c_post, checkpoint44h_post, checkpoint46l_post, checkpoint46e_pre, checkpoint46j_pre, checkpoint46b_pre, checkpoint46, checkpoint44f_post, checkpoint46g_pre, checkpoint46a_pre, checkpoint46d_post, checkpoint46g_post, checkpoint45a_post, checkpoint46c_pre, checkpoint46i_post, checkpoint45, checkpoint46h_post
Changes since 1.20: +14 -0 lines
Added option "-cleanup" which recursively deletes all compiler/model
generated files (*.o, *.f, *.c, *.meta, *.data, mitgcmuv*) in sub-directories.
It does not call "make" and operates differently from "-clean".

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

  ViewVC Help
Powered by ViewVC 1.1.22