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

Contents of /MITgcm/verification/testscript

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


Revision 1.21 - (show annotations) (download)
Mon Mar 4 16:48:08 2002 UTC (19 years, 3 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 #!/bin/sh
2
3 compare_lines()
4 {
5 # use codelet to compare lines
6 if [ $verbose -gt 1 ]; then
7 cat tmp3.txt 1>&2
8 fi
9 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 else
25 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 compare_lines
40 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 if [ $longtest -gt 0 ]; then
86 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 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 if [ $? -ne 0 ]; then
131 tail make.log
132 echo genmakemodel: genmake failed 1>&2
133 return 1
134 else
135 echo succesful 1>&2
136 fi
137 fi
138 )
139 }
140
141 makecleancompile()
142 {
143 # 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 ( cd $1;
164 if [ $clean -gt 0 ]; then
165 rm -f output.txt
166 printf 'make clean ... ' 2>&1
167 make CLEAN >> make.log 2>&1
168 if [ $? -ne 0 ]; then
169 tail make.log
170 echo makeupafter: make clean failed 1>&2
171 return 1
172 else
173 echo succesful 1>&2
174 fi
175 fi
176 )
177 }
178
179 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 if [ $quick -eq 0 ]; then
225 rm -f output.txt
226 fi
227 printf 'runmodel: ' 1>&2
228 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 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 c print *,a,b,diff,abs(a-b)/diff
259 if (diff.gt.1.e-12) then
260 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 else
267 if (best.eq.-16.and.diff.ne.0.) best=-22
268 endif
269 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 else
298 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 -debug Produce even more output which will mean nothing to most
315 -force Do "make CLEAN" before compiling. This forces a complete rebuild.
316 -clean Do "make CLEAN" after compiling and testing.
317 -shorttest Don't compare numeric output for mean and s.d. of variables.
318 -noieee By default, $0 uses the -ieee option for genmake. This turns it off.
319 -cleanup Aggresively removes all model output, executables and object files
320 and then exits. Use with care.
321
322 Normal usage:
323 $0 * Configure, compile, run and analyze in all experiment directories
324 EOF
325 }
326
327 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 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 ###############################################################################
351
352 # Main function
353
354 # Default properties
355 debug=0
356 verbose=1
357 quick=0
358 force=0
359 clean=0
360 ieee=1
361 longtest=1
362 expts=''
363
364 # Process arguments
365 for arg in $@
366 do
367 case $arg in
368 -cleanup) clean_up; exit 0;;
369 -quick) quick=1;;
370 -verbose) verbose=2;;
371 -debug) debug=1;;
372 -force) force=1;;
373 -clean) clean=1;;
374 -noieee) ieee=0;;
375 -shorttest) longtest=0;;
376 -quiet) verbose=0;;
377 -help) show_help; exit 0;;
378 -*) echo Unrecognized option:$arg; exit 9;;
379 *) test -d $arg && expts=`echo $expts $arg`;;
380 esac
381 done
382
383 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 exit 1
387 fi
388
389 #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
398 createcodelet
399
400 if [ $longtest -gt 0 ]; then
401 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 if [ $longtest -gt 0 ]; then
430 results='-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --'
431 else
432 results='-- -- -- -- -- -- -- -- --'
433 fi
434 genmakemodel $dir/input && genmake=Y \
435 && makecleancompile $dir/input \
436 && makedependmodel $dir/input && makedepend=Y \
437 && makemodel $dir/input && make=Y \
438 && runmodel $dir/input mitgcmuv && run=Y \
439 && results=`testoutput $dir` \
440 && makecleanupafter $dir/input
441 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
450 echo -------------------------------------------------------------------------------
451 echo
452 cat summary.txt

  ViewVC Help
Powered by ViewVC 1.1.22