/[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.28 - (show annotations) (download)
Thu Mar 25 15:20:33 2004 UTC (20 years, 1 month ago) by adcroft
Branch: MAIN
CVS Tags: checkpoint53b_pre, checkpoint52n_post, checkpoint53c_post, checkpoint52m_post, checkpoint53a_post, checkpoint53b_post, checkpoint53, checkpoint53d_pre
Changes since 1.27: +1 -0 lines
Switching over to using package groups
 - groups were defined but not being used
 - most packages.conf now use the package groups
 - all but two experiments pass: advect_cs and lab_sea which, as far as I
   can determine, were broken already
 - activated ptracers in global_ocean.90x40x15; there was a place holder
   for this but it wasn't being tested and infact was broken

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 subdir
15 #
16 # compares files in $dir/$subdir/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/$4/output.txt 1>&2
21 fi
22 if [ -r $1/$4/output.txt ]; then
23 grep "$2" $1/$4/output.txt | sed 's/.*=//' | nl > tmp1.txt
24 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 else
32 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 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 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 compare_lines
54 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 subdir
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" $2; cg2dres=$?
95 if [ $debug -gt 0 ]; then
96 echo testoutput: cg2dres=$cg2dres 1>&2
97 fi
98
99 if [ $longtest -gt 0 ]; then
100 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 else
117 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 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 find . -type l -exec rm {} \;
140 if [ $ieee -eq 0 ]; then
141 ../../../tools/genmake2 -mods=../code > make.log 2>&1
142 else
143 ../../../tools/genmake2 -ieee -mods=../code > make.log 2>&1
144 fi
145 if [ $? -ne 0 ]; then
146 tail make.log
147 echo genmakemodel: $genmake failed 1>&2
148 return 1
149 else
150 echo succesful 1>&2
151 fi
152 fi
153 )
154 }
155
156 makecleancompile()
157 {
158 # makecleancompile directory
159 ( cd $1;
160 if [ $force -gt 0 ]; then
161 rm -f output.txt
162 printf 'make clean ... ' 2>&1
163 make CLEAN >> make.log 2>&1
164 if [ $? -ne 0 ]; then
165 tail make.log
166 echo makecleancompile: make clean failed 1>&2
167 return 1
168 else
169 echo succesful 1>&2
170 fi
171 fi
172 )
173 }
174
175 makecleanupafter()
176 {
177 # makeupafter directory
178 ( cd $1;
179 if [ $clean -gt 0 ]; then
180 rm -f output.txt
181 printf 'make clean ... ' 2>&1
182 make CLEAN >> make.log 2>&1
183 if [ $? -ne 0 ]; then
184 tail make.log
185 echo makeupafter: make clean failed 1>&2
186 return 1
187 else
188 echo succesful 1>&2
189 fi
190 fi
191 )
192 }
193
194 makedependmodel()
195 {
196 # makedependmodel directory
197 ( cd $1;
198 if [ $quick -eq 0 -o ! -r Makefile ]; then
199 printf 'make depend ... ' 1>&2
200 make cleanlinks >> make.log 2>&1
201 make depend >> make.log 2>&1
202 if [ $? -ne 0 ]; then
203 tail make.log
204 echo makemodel: make depend failed 1>&2
205 return 1
206 else
207 echo succesful 1>&2
208 fi
209 fi
210 )
211 }
212
213 makemodel()
214 {
215 # makemodel directory
216 ( cd $1;
217 if [ -r Makefile ]; then
218 printf 'make ... ' 1>&2
219 make >> make.log 2>&1
220 if [ $? -ne 0 ]; then
221 tail make.log
222 echo failed 1>&2
223 return 1
224 else
225 echo succesful 1>&2
226 fi
227 fi
228 )
229 }
230
231 linkdata()
232 {
233 # linkdata flag
234 #
235 # symbolically link data files to run directory
236 if test "x$1" = x1 ; then
237 (
238 cd $2
239 if test "x$ADM" = x ; then
240 files=`( cd ../input ; ls -1 | grep -v CVS )`
241 for i in $files ; do
242 if test ! -d "../input/"$i ; then
243 ln -sf "../input/"$i $i
244 fi
245 done
246 else
247 files=`( cd ../input ; ls -1 *.bin | grep -v CVS )`
248 for i in $files ; do
249 if test ! -d "../input/"$i ; then
250 ln -sf "../input/"$i $i
251 fi
252 done
253 files=`( cd ../input_ad ; ls -1 | grep -v CVS )`
254 for i in $files ; do
255 if test ! -d "../input_ad/"$i ; then
256 ln -sf "../input_ad/"$i $i
257 fi
258 done
259 fi
260 )
261 fi
262 }
263
264 runmodel()
265 {
266 # runmodel directory exe
267 #
268 # runs the model "exe" in "directory" (exe is relative to directory)
269
270 ( cd $1
271 if [ -x $2 ]; then
272 if [ $quick -eq 0 ]; then
273 rm -f output.txt
274 fi
275 if [ $debug -gt 0 ]; then
276 echo -n runmodel: pwd= 1>&2
277 pwd 1>&2
278 fi
279 printf 'runmodel: ' 1>&2
280 make output.txt && return 0
281 return 1
282 fi
283 )
284 }
285
286 copynewresults()
287 {
288 # copynewresults directory
289 #
290 # runs the model "exe" in "directory" (exe is relative to directory)
291
292 ( cd $1
293 if [ $newresults -eq 1 ]; then
294 if [ -r output.txt ]; then
295 cp -f output.txt ../results/
296 return 0
297 fi
298 fi
299 )
300 }
301
302 createcodelet()
303 {
304 # create codelet for comparing model output
305 cat > tmp_cmpnum.f <<EOFA
306 program cmpnum
307 implicit none
308 real*8 a,b,diff
309 integer linnum,best
310 best=-16
311 99 read(*,*,end=70,err=60) linnum,a,b
312 diff=0.5*(abs(a)+abs(b))
313 c print *,a,b,diff,abs(a-b)/diff
314 if (diff.gt.1.e-12) then
315 diff=abs(a-b)/diff
316 if (diff.gt.0.) then
317 c print *,int(log10(diff)),diff
318 linnum=int(log10(diff))
319 best=max(best,linnum)
320 endif
321 else
322 if (best.eq.-16.and.diff.ne.0.) best=-22
323 endif
324 goto 99
325 60 stop 'cmpnum: An error occured reading a,b'
326 70 print *,-best
327 end
328 EOFA
329 f77 tmp_cmpnum.f
330 if [ -x ./a.out ]; then
331 return 0
332 else
333 echo createcodelet: failed to compile codelet 1>&2
334 exit 1
335 fi
336 }
337
338 formatresults()
339 {
340 # formatresults expt genmake depend make run results*
341
342 nm=$1
343 printf '%s %s %s %s' $2 $3 $4 $5
344 shift; shift; shift; shift; shift;
345 printf '%3s' $@
346
347 if [ $1 = '--' ]; then
348 printf ' N/O '
349 else
350 if [ $1 -gt 12 ]; then
351 printf ' pass'
352 else
353 printf ' FAIL'
354 fi
355 fi
356 printf ' %s' $nm
357 printf '\n'
358
359 }
360
361 show_help()
362 {
363 cat - << EOF
364 $0 [-help] [-quick] [-verbose] dir1 [dir2] [...]
365 -help Show this help message
366 -quick Skip "genmake" and "make depend" if the Makefile exists
367 -newresults Copy the output.txt into results/
368 -quiet Reduce the amount of output
369 -verbose Produce copious amounts of output
370 -debug Produce even more output which will mean nothing to most
371 -force Do "make CLEAN" before compiling. This forces a complete rebuild.
372 -clean Do "make CLEAN" after compiling and testing.
373 -shorttest Don't compare numeric output for mean and s.d. of variables.
374 -noieee By default, $0 uses the -ieee option for genmake. This turns it off.
375 -cleanup Aggresively removes all model output, executables and object files
376 and then exits. Use with care.
377
378 Normal usage:
379 $0 * Configure, compile, run and analyze in all experiment directories
380 EOF
381 }
382
383 scandirs()
384 {
385 if [ $# -eq 0 ]; then
386 for arg in *
387 do
388 test -d $arg/input && echo $arg
389 done
390 else
391 echo $*
392 fi
393 }
394
395 clean_up()
396 {
397 # Find all executables, object files, CPP'd source and model output
398 # and DELETE it.
399 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'
400 do
401 echo Cleaning: find . $opt -exec rm {} \;
402 find . $opt -exec rm {} \;
403 done
404 }
405
406 ###############################################################################
407 ###############################################################################
408 ###############################################################################
409
410 # Main function
411
412 # Default properties
413 debug=0
414 verbose=1
415 quick=0
416 newresults=0
417 force=0
418 clean=0
419 ieee=1
420 longtest=1
421 expts=''
422 genmake=genmake
423
424 # Process arguments
425 for arg in $@
426 do
427 case $arg in
428 -cleanup) clean_up; exit 0;;
429 -quick) quick=1;;
430 -newresults) newresults=1;;
431 -verbose) verbose=2;;
432 -debug) debug=1;;
433 -force) force=1;;
434 -clean) clean=1;;
435 -noieee) ieee=0;;
436 -shorttest) longtest=0;;
437 -quiet) verbose=0;;
438 -help) show_help; exit 0;;
439 -*) echo Unrecognized option:$arg; exit 9;;
440 *) test -d $arg && expts=`echo $expts $arg`;;
441 esac
442 done
443
444 if [ $force -gt 0 -a $quick -gt 0 ]; then
445 echo You specified -quick and -force together which conflict.
446 echo Please specify either -quick or -force or neither but not both.
447 exit 1
448 fi
449
450 #if [ ${#expts} -eq 0 ]; then
451 # echo Scanning all directories
452 # for arg in *
453 # do
454 # test -d $arg && expts=`echo $expts $arg`
455 # done
456 #fi
457 expts=`scandirs $expts`
458
459 createcodelet
460
461 date > summary.txt
462 if [ $longtest -gt 0 ]; then
463 cat << EOF >> summary.txt
464 T S U V
465 C D M c m s m s m s m s
466 n p a R g m m e . m m e . m m e . m m e .
467 f n k u 2 i a a d i a a d i a a d i a a d
468 g d e n d n x n . n x n . n x n . n x n .
469
470 EOF
471 else
472 cat << EOF >> summary.txt
473 T S U V
474 C D M c
475 n p a R g m m m m m m m m
476 f n k u 2 i a i a i a i a
477 g d e n d n x n x n x n x
478
479 EOF
480 fi
481
482 # Now configue, make, run and test in each directory
483 for dir in $expts
484 do
485 if [ -r $dir/results/output.txt ]; then
486 echo -------------------------------------------------------------------------------
487 echo
488 echo Experiment: $dir
489 echo
490 unset genmakepass makedepend make run
491 if [ $longtest -gt 0 ]; then
492 results='-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --'
493 else
494 results='-- -- -- -- -- -- -- -- --'
495 fi
496 if [ -r $dir/build ]; then
497 seperatebuilddir=1
498 builddir=build
499 rundir=build
500 (cd $dir/input; rm -f *.{o,f,c,F,h} work* output.txt Make* make.log; )
501 else
502 seperatebuilddir=0
503 builddir=input
504 rundir=input
505 fi
506 genmakemodel $dir/$builddir && genmakepass=Y \
507 && makecleancompile $dir/$builddir \
508 && makedependmodel $dir/$builddir && makedepend=Y \
509 && makemodel $dir/$builddir && make=Y \
510 && linkdata $seperatebuilddir $dir/$rundir \
511 && runmodel $dir/$builddir mitgcmuv && run=Y \
512 && results=`testoutput $dir $rundir` \
513 && copynewresults $dir/$rundir \
514 && makecleanupafter $dir/$builddir
515 echo
516 formatresults $dir ${genmakepass:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results
517 echo
518 formatresults $dir ${genmakepass:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results >> summary.txt
519 fi
520 done
521
522 rm tmp_cmpnum.f a.out
523
524 echo -------------------------------------------------------------------------------
525 echo
526 date >> summary.txt
527 cat summary.txt

  ViewVC Help
Powered by ViewVC 1.1.22