/[MITgcm]/MITgcm/verification/testreport
ViewVC logotype

Annotation of /MITgcm/verification/testreport

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


Revision 1.106 - (hide annotations) (download)
Tue Oct 23 19:36:15 2007 UTC (16 years, 5 months ago) by jmc
Branch: MAIN
Changes since 1.105: +25 -18 lines
clean-up the -clean option

1 edhill 1.19 #! /usr/bin/env bash
2 edhill 1.1 #
3 jmc 1.106 # $Header: /u/gcmpack/MITgcm/verification/testreport,v 1.105 2007/10/12 21:39:37 jmc Exp $
4 edhill 1.12 # $Name: $
5 edhill 1.1 #
6    
7     usage()
8     {
9     echo
10     echo "Usage: $0 [OPTIONS]"
11     echo
12     echo "where possible OPTIONS are:"
13     echo " (-help|-h) print usage"
14 jmc 1.83 echo " (-mth) run multi threaded (using eedata.mth)"
15     echo " (-mpi) compile and run using MPI"
16 edhill 1.10 echo " (-ieee|-noieee) if possible, use IEEE compiler flags"
17 edhill 1.41 echo " (DEF=\"-ieee\")"
18 jmc 1.89 echo " (-of=|-optfile=)STRING list of optfiles to use"
19 edhill 1.20 echo " (-a|-addr) STRING list of email recipients"
20 edhill 1.6 echo " (DEF=\"edhill@mitgcm.org\")"
21 jmc 1.84 echo " (-t|-tdir) STRING list of group and/or exp. dirs to test"
22     echo " (recognized groups: basic, tutorials)"
23     echo " (DEF=\"\" which test all)"
24 jmc 1.89 echo " (-skd|-skipdir) STRING list of exp. dirs to skip"
25     echo " (DEF=\"\" which test all)"
26 edhill 1.20 echo " (-b|-bash) STRING preferred location of a \"bash\" or"
27     echo " Bourne-compatible \"sh\" shell"
28     echo " (DEF=\"\" for \"bash\")"
29 edhill 1.24 echo " (-adm|-ad) perform an adjoint run"
30 edhill 1.20 echo " (-command) STRING command to run"
31 edhill 1.6 echo " (DEF=\"make output.txt\")"
32 edhill 1.20 echo " (-m|-make) STRING command to use for \"make\""
33 edhill 1.8 echo " (DEF=\"make\")"
34 jmc 1.70 echo " (-odir) STRING used to build output directory name"
35     echo " (DEF=\"hostname\")"
36 jmc 1.89 echo " (-ptr|-ptracers) STRING specify which ptracers to test"
37 edhill 1.50 echo " (DEF=\"1 2 3 4 5\")"
38 jmc 1.92 echo " (-match) NUMBER Matching Criteria (number of digits)"
39     echo " (DEF=\"12\")"
40 edhill 1.43 echo " (-j) JOBS use \"make -j JOBS\" for parallel builds"
41 edhill 1.10 echo " (-clean) *ONLY* run \"make CLEAN\""
42 ce107 1.90 echo " (-quick|-q) same as \"-nogenmake -noclean -nodepend\""
43     echo " (-nogenmake|-ng) skip the genmake stage"
44     echo " (-noclean|-nc) skip the \"make clean\" stage"
45     echo " (-nodepend|-nd) skip the \"make depend\" stage"
46     echo " (-deldir|-dd) on success, delete the output directory"
47     echo " (-ts) provide timing information per timestep"
48     echo " (-papis) provide MFlop/s per timestep using PAPI"
49     echo " (-pcls) provide MFlop/s per timestep using PCL"
50 edhill 1.6 echo
51 edhill 1.50 echo "and where STRING can be a whitespace-delimited list"
52 edhill 1.6 echo "such as:"
53 edhill 1.50 echo
54 edhill 1.6 echo " -t 'exp0 exp2 exp3' "
55     echo " -addr='abc@123.com testing@home.org'"
56 edhill 1.1 echo
57 edhill 1.50 echo "provided that the expression is properly quoted within the current"
58     echo "shell (note the use of single quotes to protect white space)."
59     echo
60 edhill 1.1 exit 1
61     }
62    
63     # build the mpack utility
64     build_mpack()
65     {
66 edhill 1.34 printf "building the mpack utility... "
67 edhill 1.1 if test ! -x "$MPACKDIR/mpack" ; then
68     if test ! -d $MPACKDIR ; then
69 edhill 1.20 echo
70 edhill 1.1 echo "Error: can't find \"$MPACKDIR\""
71     echo " are you sure this program is being run in the correct "
72     echo " (that is, \"MITGCM_ROOT\verification\") directory?"
73 edhill 1.20 echo
74     HAVE_MPACK=f
75 edhill 1.1 fi
76 edhill 1.34 printf "building mpack... "
77 edhill 1.26 if test "x$CC" = x ; then
78     export CC=cc
79     fi
80 edhill 1.25 ( cd $MPACKDIR && ./configure && $MAKE ) > tr_build_mpack.out 2>&1
81 edhill 1.1 RETVAL=$?
82     if test "x$RETVAL" != x0 ; then
83     echo
84     echo "Error building the mpack tools at: $MPACK_DIR"
85 edhill 1.20 echo
86     HAVE_MPACK=f
87     else
88 edhill 1.25 rm -f tr_build_mpack.out
89 edhill 1.20 HAVE_MPACK=t
90 edhill 1.1 fi
91 edhill 1.20 else
92     HAVE_MPACK=t
93 edhill 1.1 fi
94     echo "OK"
95     }
96    
97 jmc 1.93 testoutput_var()
98 edhill 1.1 {
99 jmc 1.99 # testoutput_var dir s1 label subdir reference_output
100 edhill 1.1 #
101 jmc 1.93 # compares 1 variable output selected from file $dir/$subdir/$OUTPUTFILE
102 jmc 1.99 # with same output from reference file $dir/results/$reference_output
103 jmc 1.93 # using search strings s1 and text label
104 edhill 1.1
105     if [ $debug -gt 0 ]; then
106 jmc 1.93 echo testoutput_var: grep "$2" $1/$4/$OUTPUTFILE 1>&2
107 edhill 1.1 fi
108 jmc 1.87 if [ -r $1/$4/$OUTPUTFILE ]; then
109     grep "$2" $1/$4/$OUTPUTFILE | sed 's/.*=//' | cat -n > tmp1.txt
110 jmc 1.67 lncntA=`wc -l tmp1.txt | awk '{print $1}' `
111 jmc 1.100 if [ $lncntA -lt 2 ]; then
112 edhill 1.1 if [ $verbose -gt 0 ]; then
113     echo Not enough lines of output when searching for "$2" 1>&2
114     fi
115     return 99
116     fi
117     else
118 jmc 1.93 echo testoutput_var: $OUTPUTFILE from model run was not readable 1>&2
119 edhill 1.1 return 99
120     fi
121     if [ $debug -gt 0 ]; then
122 jmc 1.99 echo testoutput_var: grep "$2" $1/results/$5 1>&2
123 edhill 1.1 fi
124 jmc 1.99 grep "$2" $1/results/$5 | sed 's/.*=//' | cat -n > tmp2.txt
125 jmc 1.67 lncntB=`wc -l tmp2.txt | awk '{print $1}' `
126 jmc 1.100 if [ $lncntB -lt 2 ]; then
127 edhill 1.1 if [ $verbose -gt 0 ]; then
128     echo Not enough lines of output when searching for "$2" 1>&2
129     fi
130     return 99
131     fi
132 jmc 1.67 if [ $lncntA -ne $lncntB ]; then
133     if [ $verbose -gt 0 ]; then
134     echo Not same Nb of lines when searching for "$2" ":" $lncntA $lncntB 1>&2
135     fi
136     return 99
137     fi
138 edhill 1.72 has_nan=`cat tmp1.txt | grep -i nan | wc -l`
139     if [ $has_nan -gt 0 ] ; then
140 jmc 1.93 echo testoutput_var: $OUTPUTFILE contains $has_nan NaN values 1>&2
141 edhill 1.72 return 99
142     fi
143     has_inf=`cat tmp1.txt | grep -i inf | wc -l`
144     if [ $has_inf -gt 0 ] ; then
145 jmc 1.93 echo testoutput_var: $OUTPUTFILE contains $has_inf Inf values 1>&2
146 jmc 1.71 return 99
147     fi
148 edhill 1.1 if [ $debug -gt 0 ]; then
149 jmc 1.93 echo testoutput_var: join tmp1.txt tmp2.txt 1>&2
150 edhill 1.1 fi
151     join tmp1.txt tmp2.txt | awk '{print $1 " " $2 " " $3}' > tmp3.txt
152     if [ $debug -gt 0 ]; then
153 jmc 1.93 echo testoutput_var: compare_lines 1>&2
154 edhill 1.1 fi
155 edhill 1.22 if [ $verbose -gt 1 ]; then
156     cat tmp3.txt 1>&2
157     fi
158     echo "-1" >> tmp3.txt
159 edhill 1.23 # On the SGI O3K (*not* the O2K), "cat -n" inserts a ":" after the line number
160     cat tmp3.txt | sed -e 's|:||g' > tmp4.txt
161 jmc 1.91 digits_of_similarity=`./tr_cmpnum < tmp4.txt`
162 edhill 1.1 if [ $digits_of_similarity -eq 99 ]; then
163     if [ $verbose -gt 0 ]; then
164 jmc 1.99 echo testoutput_var: No comparison was available for \"$3\" 1>&2
165 edhill 1.1 fi
166     digits_of_similarity=99
167     else
168     if [ $verbose -gt 0 ]; then
169 jmc 1.99 echo There were $digits_of_similarity decimal places of similarity for \"$3\" 1>&2
170 edhill 1.1 fi
171     fi
172 edhill 1.23 rm -f tmp1.txt tmp2.txt tmp3.txt tmp4.txt
173 edhill 1.1
174     return $digits_of_similarity
175     }
176    
177     dashnum()
178     {
179     # dashnum n1 n2 n3 ...
180     #
181     # print numbers using %3i format or "--" if number = 99
182    
183     for num in $@ ; do
184     if [ $num = 99 ]; then
185     printf ' --'
186     else
187     printf '%3i' $num
188     fi
189     done
190     }
191    
192 edhill 1.49 check_for_add_mon_output()
193     {
194     # Check for additional types of monitor output
195     if test "x$1" = x ; then
196     return
197     fi
198    
199 edhill 1.50 for ii in $PTRACERS_NUM ; do
200     eval "HAVE_PTR0"$ii"=f"
201     done
202    
203 edhill 1.49 ptr_add="trcstat_ptracerXX_min trcstat_ptracerXX_max"
204     ptr_add="$ptr_add trcstat_ptracerXX_mean trcstat_ptracerXX_sd"
205 edhill 1.50 for ii in $PTRACERS_NUM ; do
206 edhill 1.49 for jj in $ptr_add ; do
207     name=`eval "echo $jj | sed -e 's|XX|0"$ii"|g'"`
208     tst=`grep $name $1 | wc -l | awk '{print $1}'`
209     if test ! "x$tst" = x0 ; then
210     eval "HAVE_PTR0"$ii"=t"
211     fi
212     done
213     # eval 'echo "HAVE_PTR0'$ii' = $HAVE_PTR0'$ii'"'
214     done
215     }
216    
217 jmc 1.93 testoutput_run()
218 edhill 1.1 {
219 jmc 1.99 # testoutput_run directory subdir reference_output
220 edhill 1.1 #
221 jmc 1.93 # test output from 1 run in "directory"
222 jmc 1.103 # --> same processing for adjoint & forward test
223 jmc 1.94 # default list of output variables to be checked:
224     # 1rst : main variable used to decide if it pass or FAIL
225     # others : number of matching digits to be printed in summary.txt
226     listChk=$DEF_CHECK_LIST
227     # load experiment-specific list from file "tr_checklist" (if it exist)
228     if test -r $1/$2/tr_checklist ; then listChk=`cat $1/$2/tr_checklist` ; fi
229     sVar=`echo $listChk | awk '{print $1}'`
230     # remove 1rst var and expand the list: + => min max mean s.d
231 jmc 1.97 listVar=`echo $listChk | sed 's/ [a-zA-Z0-9]*+/&mn &mx &av &sd/g' \
232     | sed 's/+//g' | sed "s/^$sVar//"`
233 jmc 1.94 if [ $debug -gt 0 ]; then echo "testoutput_run: listVar(I)='$listVar'" 1>&2 ; fi
234     for ii in 1 2 3 4 5 6 7 8 9 ; do
235     tst=`eval 'echo "$HAVE_PTR0'$ii'"'`
236     #echo "-- ptr test=" $tst "number of var=" `echo $listVar | awk '{print NF}'` 1>&2
237     if test "x$tst" != xt ; then listVar=`echo "$listVar" | sed "s/ pt$ii..//g"` ; fi
238     done
239     tst=`echo $sVar $listVar | awk '{ for(i=2;i<=NF;i++){t+=($i==$1)}; print t }'`
240     if test $tst != 1 ; then
241     if test $tst = 0 ; then echo "==> WARNING: selected var >$sVar< not found" 1>&2
242     else echo "==> WARNING: found selected var >$sVar< $tst times" 1>&2 ; fi
243     echo "==> WARNING: in checked list:" $listVar 1>&2
244     #- put it back once:
245     listVar=" $sVar "`echo "$listVar " | sed "s/ $sVar / /g"`
246     fi
247     if [ $debug -gt 0 ]; then echo "testoutput_run: listVar(M)='$listVar'" 1>&2 ; fi
248     echo "listVar='$listVar'" > $CDIR"/summary.txt"
249     allargs=""
250     for xx in $listVar
251     do
252     case $xx in
253     'PS') if [ $debug -gt 0 ]
254     then echo testoutput_run: testoutput_var $1 cg2d_init_res 1>&2 ; fi
255 jmc 1.99 testoutput_var $1 "cg2d_init_res" "Press. Solver (cg2d)" $2 $3; yy=$?
256 jmc 1.94 if [ $debug -gt 0 ] ; then echo testoutput_run: cg2dres=$yy 1>&2 ; fi ;;
257 jmc 1.101 'Cost') testoutput_var $1 "ADM precision_derivative_cost" "ADM Cost" $2 $3; yy=$? ;;
258     'Grad') testoutput_var $1 "ADM precision_derivative_grad" "ADM Grad" $2 $3; yy=$? ;;
259 jmc 1.99 'Tmn') testoutput_var $1 "dynstat_theta_min" "Theta minimum" $2 $3; yy=$? ;;
260     'Tmx') testoutput_var $1 "dynstat_theta_max" "Theta maximum" $2 $3; yy=$? ;;
261     'Tav') testoutput_var $1 "dynstat_theta_mean" "Theta mean" $2 $3; yy=$? ;;
262     'Tsd') testoutput_var $1 "dynstat_theta_sd" "Theta Std.Dev" $2 $3; yy=$? ;;
263     'Smn') testoutput_var $1 "dynstat_salt_min" "Salt minimum" $2 $3; yy=$? ;;
264     'Smx') testoutput_var $1 "dynstat_salt_max" "Salt maximum" $2 $3; yy=$? ;;
265     'Sav') testoutput_var $1 "dynstat_salt_mean" "Salt mean" $2 $3; yy=$? ;;
266     'Ssd') testoutput_var $1 "dynstat_salt_sd" "Salt Std.Dev" $2 $3; yy=$? ;;
267 jmc 1.94 'Umn') testoutput_var $1 "dynstat_uvel_min" "U minimum" $2 $3; yy=$? ;;
268     'Umx') testoutput_var $1 "dynstat_uvel_max" "U maximum" $2 $3; yy=$? ;;
269     'Uav') testoutput_var $1 "dynstat_uvel_mean" "U mean" $2 $3; yy=$? ;;
270 jmc 1.99 'Usd') testoutput_var $1 "dynstat_uvel_sd" "U Std.Dev" $2 $3; yy=$? ;;
271 jmc 1.94 'Vmn') testoutput_var $1 "dynstat_vvel_min" "V minimum" $2 $3; yy=$? ;;
272     'Vmx') testoutput_var $1 "dynstat_vvel_max" "V maximum" $2 $3; yy=$? ;;
273     'Vav') testoutput_var $1 "dynstat_vvel_mean" "V mean" $2 $3; yy=$? ;;
274 jmc 1.99 'Vsd') testoutput_var $1 "dynstat_vvel_sd" "V Std.Dev" $2 $3; yy=$? ;;
275 jmc 1.94 'pt1mn'|'pt2mn'|'pt3mn'|'pt4mn'|'pt5mn') ii=`echo $xx | sed 's/pt//' | sed 's/..$//'`
276     testoutput_var $1 "trcstat_ptracer0"$ii"_min" "p0"$ii"_min" $2 $3; yy=$? ;;
277     'pt1mx'|'pt2mx'|'pt3mx'|'pt4mx'|'pt5mx') ii=`echo $xx | sed 's/pt//' | sed 's/..$//'`
278     testoutput_var $1 "trcstat_ptracer0"$ii"_max" "p0"$ii"_max" $2 $3; yy=$? ;;
279     'pt1av'|'pt2av'|'pt3av'|'pt4av'|'pt5av') ii=`echo $xx | sed 's/pt//' | sed 's/..$//'`
280     testoutput_var $1 "trcstat_ptracer0"$ii"_mean" "p0"$ii"_mean" $2 $3; yy=$? ;;
281     'pt1sd'|'pt2sd'|'pt3sd'|'pt4sd'|'pt5sd') ii=`echo $xx | sed 's/pt//' | sed 's/..$//'`
282 jmc 1.99 testoutput_var $1 "trcstat_ptracer0"$ii"_sd" "p0"$ii"_StDv" $2 $3; yy=$? ;;
283 jmc 1.101 'Qntmn') testoutput_var $1 "extforcing_qnet_min" "Qnet minimum" $2 $3; yy=$? ;;
284     'Qntmx') testoutput_var $1 "extforcing_qnet_max" "Qnet maximum" $2 $3; yy=$? ;;
285     'Qntav') testoutput_var $1 "extforcing_qnet_mean" "Qnet mean" $2 $3; yy=$? ;;
286     'Qntsd') testoutput_var $1 "extforcing_qnet_sd" "Qnet Std.Dev" $2 $3; yy=$? ;;
287     'aSImn') testoutput_var $1 "seaice_area_min" "SIce Area min" $2 $3; yy=$? ;;
288     'aSImx') testoutput_var $1 "seaice_area_max" "SIce Area max" $2 $3; yy=$? ;;
289     'aSIav') testoutput_var $1 "seaice_area_mean" "SIce Area mean" $2 $3; yy=$? ;;
290     'aSIsd') testoutput_var $1 "seaice_area_sd" "SIce Area StDv" $2 $3; yy=$? ;;
291     'hSImn') testoutput_var $1 "seaice_heff_min" "SIce Heff min" $2 $3; yy=$? ;;
292     'hSImx') testoutput_var $1 "seaice_heff_max" "SIce Hell max" $2 $3; yy=$? ;;
293     'hSIav') testoutput_var $1 "seaice_heff_mean" "SIce Hell mean" $2 $3; yy=$? ;;
294     'hSIsd') testoutput_var $1 "seaice_heff_sd" "SIce Hell StDv" $2 $3; yy=$? ;;
295     'AthSiG') testoutput_var $1 "thSI_Ice_Area_G" "thSIc Area Global" $2 $3; yy=$? ;;
296     'AthSiS') testoutput_var $1 "thSI_Ice_Area_S" "thSIc Area South" $2 $3; yy=$? ;;
297     'AthSiN') testoutput_var $1 "thSI_Ice_Area_N" "thSIc Area North" $2 $3; yy=$? ;;
298     'HthSiG') testoutput_var $1 "thSI_IceH_ave_G" "thSIc H Global" $2 $3; yy=$? ;;
299     'HthSiS') testoutput_var $1 "thSI_IceH_ave_S" "thSIc H South" $2 $3; yy=$? ;;
300     'HthSiN') testoutput_var $1 "thSI_IceH_ave_N" "thSIc H North" $2 $3; yy=$? ;;
301 jmc 1.94 *) yy=99; echo "WARNING: asking for var=$xx : not recognized !" 1>&2 ;;
302     esac
303     if test $xx = $sVar
304     then allargs="$allargs > $yy <"
305     else allargs="$allargs $yy"
306     fi
307     done
308    
309     nbVar=`echo $listVar | awk '{print NF}'`
310 jmc 1.97 if [ $nbVar -lt $LEN_CHECK_LIST ] ; then
311 jmc 1.94 #-- fill line (up to standard length) with dot:
312 jmc 1.97 adNul=`expr $LEN_CHECK_LIST - $nbVar | awk '{for(i=1;i<=$1;i++){print "."}}'`
313 jmc 1.94 echo $allargs $adNul
314     else
315     echo $allargs
316     fi
317 jmc 1.103 # <-- same processing for adjoint & forward test
318 edhill 1.1 }
319    
320     genmakemodel()
321     {
322     # genmakemodel directory
323 edhill 1.10 if test "x$NOGENMAKE" = xt ; then
324     echo "genmake skipped!"
325     else
326 edhill 1.34 if test "x$BASH" = x ; then
327     GENMAKE2="../../../tools/genmake2"
328     else
329     GENMAKE2="$BASH ../../../tools/genmake2 -bash $BASH"
330     fi
331 edhill 1.10 (
332     cd $1;
333 edhill 1.24 command="$GENMAKE2 -ds -m $MAKE"
334     if test "x$ADM" = x ; then
335     command="$command --mods=../code"
336     else
337     command="$command --mods=../code_ad"
338     fi
339 edhill 1.10 if test "x$OPTFILE" != xNONE ; then
340     command="$command --optfile=$OPTFILE"
341     fi
342     if test "x$IEEE" != x ; then
343     command="$command -ieee"
344     fi
345 edhill 1.66 if test "x$MPI" = xt ; then
346     command="$command -mpi"
347     fi
348 ce107 1.90 if test "x$TS" = xt ; then
349     command="$command -ts"
350     fi
351     if test "x$PAPIS" = xt ; then
352     command="$command -papis"
353     else
354     if test "x$PCLS" = xt ; then
355     command="$command -pcls"
356     fi
357     fi
358 edhill 1.10 printf 'genmake ... ' 1>&2
359     $command > make.log 2>&1
360     RETVAL=$?
361 edhill 1.44 # Reduce the size of the testing emails!
362 edhill 1.47 head -100 Makefile > $CDIR/Makefile_head
363 edhill 1.10 if test "x$RETVAL" != x0 ; then
364     tail make.log
365     echo "genmakemodel: genmake failed" 1>&2
366 edhill 1.21 cp genmake_* make.log $CDIR
367 edhill 1.10 return 1
368     else
369 edhill 1.20 echo "successful" 1>&2
370 edhill 1.1 fi
371 edhill 1.10 )
372     fi
373 edhill 1.1 }
374    
375     makeclean()
376     {
377     # makeclean directory
378 edhill 1.10 if test "x$NOCLEAN" = xt ; then
379 jmc 1.83 echo "make Clean skipped!"
380 edhill 1.10 else
381     (
382     cd $1;
383 jmc 1.87 #if test -e $OUTPUTFILE ; then rm -f $OUTPUTFILE ; fi
384 edhill 1.10 if test -r Makefile ; then
385 jmc 1.83 printf 'clean build-dir: make Clean ... ' 2>&1
386     $MAKE Clean >> make.log 2>&1
387 edhill 1.10 RETVAL=$?
388     if test "x$RETVAL" != x0 ; then
389     tail make.log
390 jmc 1.83 echo "makeclean: \"make Clean\" failed" 1>&2
391 edhill 1.10 cp make.log $CDIR"/make.log"
392     return 1
393     fi
394     fi
395 edhill 1.20 echo successful 1>&2
396 edhill 1.10 exit 0
397     )
398     fi
399     }
400    
401 jmc 1.83 run_clean()
402 edhill 1.68 {
403 jmc 1.83 # run_clean directory
404     if test "x$NOCLEAN" = xt ; then
405     echo "run_clean skipped!"
406     else
407 edhill 1.68 (
408     cd $1;
409 jmc 1.83 printf 'clean run-dir ... ' 2>&1
410     # part of what is done after "make clean" when doing "make CLEAN"
411     find . -name "*.meta" -exec rm {} \;
412     find . -name "*.data" -exec rm {} \;
413     find . -name "fort.*" -exec rm {} \;
414     find . -type l -exec rm {} \;
415     rm -f $EXECUTABLE *.txt STD* *diagnostics.log datetime
416     rm -rf mnc_test_*
417     echo successful 1>&2
418 edhill 1.68 exit 0
419     )
420     fi
421     }
422    
423 edhill 1.10 makedependmodel()
424     {
425     # makedependmodel directory
426     if test "x$NODEPEND" = xt ; then
427     echo "make depend skipped!"
428     else
429     (
430     cd $1;
431     printf 'make depend ... ' 1>&2
432     $MAKE depend >> make.log 2>&1
433 edhill 1.1 RETVAL=$?
434     if test "x$RETVAL" != x0 ; then
435     tail make.log
436 edhill 1.10 echo "makedependmodel: make depend failed" 1>&2
437 edhill 1.1 cp make.log $CDIR"/make.log"
438     return 1
439 edhill 1.10 else
440 edhill 1.20 echo successful 1>&2
441 edhill 1.1 fi
442 edhill 1.10 )
443     fi
444 edhill 1.1 }
445    
446     makemodel()
447     {
448     # makemodel directory
449     (
450     cd $1;
451     if test -r Makefile ; then
452     printf 'make ... ' 1>&2
453 edhill 1.24 if test "x$ADM" = x ; then
454 edhill 1.43 if test "x$JOBS" = x ; then
455     $MAKE >> make.log 2>&1
456     else
457     $MAKE -j $JOBS >> make.log 2>&1
458     fi
459 edhill 1.24 else
460     $MAKE adall >> make.log 2>&1
461     fi
462 edhill 1.1 RETVAL=$?
463     if test "x$RETVAL" != x0 ; then
464     tail make.log
465     echo failed 1>&2
466     cp make.log $CDIR"/make.log"
467     return 1
468     else
469 edhill 1.20 echo successful 1>&2
470 edhill 1.1 fi
471     fi
472     )
473     }
474    
475 edhill 1.27 symlink_mpifiles()
476     {
477     # Put special links so that MPI specific files are used
478     # This MUST be invoked between makeclean and makelinks because
479     # the Makefile will link to non-mpi files by default
480    
481     dir=$1
482     code_dir=$2
483     BUILD_DIR=$dir/$3
484     CODE_DIR=$dir/$code_dir
485 edhill 1.45
486 edhill 1.27 # These are files that should replace their counter-part when using -mpi
487     MPI_FILES=`(cd $CODE_DIR; find . -name "*_mpi")`
488    
489     # Is this an MPI run?
490     if test "x$MPI" = xt ; then
491     # YES: We symbolically link these files to the build
492     # dir so long as there is no real file in place
493     for ii in $MPI_FILES ; do
494     i=`echo $ii | sed 's:^\./::'`
495     name=`echo $i | sed 's:_mpi::' `
496     cmp $CODE_DIR/$i $BUILD_DIR/$name > /dev/null 2>&1
497     RETVAL=$?
498     if test "x$RETVAL" != x0 ; then
499     if ! test -f $BUILD_DIR/$i ; then
500 edhill 1.45 #echo Linking $name to $i
501 edhill 1.27 (cd $BUILD_DIR; ln -sf ../$code_dir/$i $name)
502     fi
503     fi
504     done
505     else
506 edhill 1.45 # NO: We undo any _mpi symbolically linked files
507 edhill 1.27 for ii in $MPI_FILES ; do
508     i=`echo $ii | sed 's:^\./::'`
509     name=`echo $i | sed 's:_mpi::' `
510     if test -L $BUILD_DIR/$name ; then
511 edhill 1.45 cmp $BUILD_DIR/$name "../$code_dir/$name"_mpi > /dev/null 2>&1
512     RETVAL=$?
513     if test "x$RETVAL" = x0 ; then
514     #echo Un-linking $name from $linktarg
515 edhill 1.27 rm -f $BUILD_DIR/$name
516     fi
517     fi
518     done
519     fi
520    
521     }
522    
523 edhill 1.1 linkdata()
524     {
525 jmc 1.83 # linkdata run_dir input_dir_1 input_dir_2 ...
526 edhill 1.1 #
527     # symbolically link data files to run directory
528 jmc 1.83 if test -d $1 ; then
529 edhill 1.12 (
530 jmc 1.83 cd $1 ; shift
531     if test -r "../"$1"/eedata.mth" ; then
532     # found eedata.mth in 1rst input dir and it is readable
533     if test "x$MULTI_THREAD" = "xt" ; then
534     # multi-threaded test: remove symbolic link & link eedata.mth
535     if test -h eedata ; then rm -f eedata ; fi
536     if test ! -r eedata ; then
537     ln -sf "../"$1"/eedata.mth" eedata ;
538     printf 'eedata.mth ' 1>&2
539 edhill 1.24 fi
540 jmc 1.83 else
541     # not multi-threaded test: remove eedata symbolic link
542     if test -h eedata ; then rm -f eedata ; fi
543     fi
544     fi
545     for ldir in $* ; do
546     if test -d "../"$ldir ; then
547     printf 'ldir='${ldir} 1>&2
548     files=`( cd "../"$ldir ; ls -1 | grep -v CVS )`
549     for i in $files ; do
550     if test ! -d "../"$ldir/$i ; then
551     if test ! -r $i ; then
552     printf ' '$i 1>&2
553     ln -sf "../"$ldir"/"$i $i
554     fi
555     fi
556     done
557     if test -x "../"$ldir"/"prepare_run ; then
558     "../"$ldir"/"prepare_run
559 edhill 1.24 fi
560 jmc 1.83 printf ' ; ' 1>&2
561 jmc 1.82 fi
562 jmc 1.83 done
563 edhill 1.12 )
564 edhill 1.1 fi
565     }
566    
567     runmodel()
568     {
569 edhill 1.6 # runmodel directory
570 edhill 1.1 #
571 edhill 1.24 # runs "$COMMAND in "directory"
572 edhill 1.6 # (where "$COMMAND" is relative to "directory")
573 edhill 1.1 (
574     cd $1
575 jmc 1.75 printf 'runmodel in %s ...' $1 1>&2
576 edhill 1.6 # make output.txt
577 edhill 1.38 echo
578 jmc 1.106 if test -L $EXECUTABLE -a -x "../"$builddir"/"$EXECUTABLE ; then
579     diff -q $EXECUTABLE "../"$builddir"/"$EXECUTABLE > /dev/null 2>&1
580     outD=$? ; if test $outD != 0 ; then rm -f $EXECUTABLE ; rm -f run.log ; fi
581     fi
582 jmc 1.83 if test ! -x $EXECUTABLE -a -x "../"$builddir"/"$EXECUTABLE ; then
583 jmc 1.88 echo " link" $EXECUTABLE "from dir ../"$builddir > run.log_00
584 jmc 1.83 ln -sf "../"$builddir"/"$EXECUTABLE .
585     fi
586     if test ! -x $EXECUTABLE ; then
587 jmc 1.88 rm -f run.log ; touch run.log
588     if test -f run.log_00 ; then cat run.log_00 >> run.log ; fi
589 jmc 1.83 echo " no executable:" $EXECUTABLE >> run.log
590     RETVAL=8
591 jmc 1.88 ENDVAL=-1
592 jmc 1.75 else
593 jmc 1.98 if test ! -f $OUTPUTFILE -o $OUTPUTFILE -ot $EXECUTABLE ; then
594     # output do not exist or is older than executable:
595 jmc 1.88 rm -f run.log ; touch run.log
596     if test -f run.log_00 ; then cat run.log_00 >> run.log ; fi
597 jmc 1.83 ( eval $COMMAND ) >> run.log 2>&1
598     RETVAL=$?
599     else
600     RETVAL=0
601 jmc 1.88 if test -f run.log ; then
602     if test -f run.log_00 ; then cat run.log_00 >> run.log ; fi
603     echo "---------->> $OUTPUTFILE is up to date " >> run.log 2>&1
604     else
605     touch run.log
606     if test -f run.log_00 ; then cat run.log_00 >> run.log ; fi
607     echo "---------->> $OUTPUTFILE is up to date " >> run.log 2>&1
608     echo " no previous run.log: assume NORMAL END" >> run.log 2>&1
609     fi
610 jmc 1.83 fi
611 jmc 1.88 ENDVAL=`cat run.log | grep -v 'ABNORMAL END' | grep -c 'NORMAL END'`
612 jmc 1.75 fi
613 jmc 1.88 rm -f run.log_00
614     #if test "x$RETVAL" = x0 ; then
615     if [ $RETVAL -eq 0 -a $ENDVAL -gt 0 ] ; then
616 jmc 1.46 tail run.log
617 edhill 1.20 echo successful 1>&2
618 edhill 1.44 # === Reduce the size of the testing emails!
619 jmc 1.87 #cp $OUTPUTFILE $CDIR"/"$OUTPUTFILE
620 jmc 1.48 if test -s STDERR.0000 ; then cp STDERR.0000 $CDIR"/STDERR.0000" ; fi
621 edhill 1.6 return 0
622     else
623 edhill 1.20 tail run.log
624 jmc 1.88 echo failed '(run:' $RETVAL ' end:' $ENDVAL ')' 1>&2
625 edhill 1.20 cp run.log $CDIR"/run.log"
626 jmc 1.48 if test -s STDERR.0000 ; then cp STDERR.0000 $CDIR"/STDERR.0000" ; fi
627 edhill 1.6 return 1
628 edhill 1.1 fi
629     )
630     }
631    
632     createcodelet()
633     {
634     # create codelet for comparing model output
635    
636 edhill 1.34 printf "creating the comparison code... "
637 jmc 1.91 cat > tr_cmpnum.c <<EOF
638 edhill 1.22 #include <stdio.h>
639     #include <math.h>
640     int main( int argc, char** argv ) {
641 jmc 1.91 int linnum,cmplin,best,lncnt;
642 edhill 1.52 double a,b,abave,relerr;
643 jmc 1.57 best = -22;
644 adcroft 1.33 lncnt = 0;
645 jmc 1.96 while( 1 & ( (lncnt+=1) < 999 ) ) {
646 edhill 1.22 scanf("%d", &linnum);
647     if (linnum == -1) break;
648     scanf("%lf", &a); scanf("%lf", &b);
649 edhill 1.52 abave = 0.5*(fabs(a)+fabs(b));
650 jmc 1.91 if ( abave == abave ) {
651     if (abave > 0.0) {
652     relerr=fabs(a-b)/abave;
653     if (relerr > 0.0) { cmplin = (int)rint(log10(relerr)); }
654     else { cmplin = -16 ; }
655     best = (best > cmplin) ? best : cmplin; }
656     else { cmplin = -22 ; }
657     /* printf("%d ; %lf ; %lf\n",cmplin,a,b); */
658     }
659     else {
660     /* printf("%lf ; %lf ; %lf\n",abave,a,b); */
661     break; }
662 edhill 1.22 }
663 adcroft 1.33 if (lncnt == 999) best=-29;
664 jmc 1.91 if (linnum != -1) best=-99;
665 edhill 1.22 printf("%d\n", -best);
666     return 0;
667     }
668     EOF
669 jmc 1.91 $CC -o tr_cmpnum tr_cmpnum.c -lm
670 edhill 1.1
671 jmc 1.91 if [ -x ./tr_cmpnum ]; then
672 edhill 1.1 echo "OK"
673     return 0
674     else
675     echo
676 edhill 1.58 echo "ERROR: failed to compile comparison code -- please specify"
677     echo " a C compiler using the CC environment variable."
678 edhill 1.1 exit 1
679     fi
680     }
681    
682     formatresults()
683     {
684     # formatresults expt genmake depend make run results*
685    
686     nm=$1
687     printf '%s %s %s %s' $2 $3 $4 $5
688     shift; shift; shift; shift; shift;
689 jmc 1.94 listPrt=$@
690     listRes=`echo $listPrt | sed 's/>//' | sed 's/<//'`
691     xx=`echo $listPrt | sed 's/.*>//' | sed 's/<.*//' | awk '{print $1}'`
692 jmc 1.97 printf '%3s' $listPrt
693 jmc 1.98 # line below does not work on hp-ux_ia64 : do those substitutions later on
694 jmc 1.95 # printf '%3s' $listPrt | sed 's/ 99/ --/g' | sed 's/ > />/' | sed 's/ < /</'
695 edhill 1.1
696 jmc 1.94 if [ $xx = '..' ]; then
697     printf ' N/O '
698     elif [ $xx = '--' ]; then
699     printf ' N/O '
700     elif [ $xx = 99 ]; then
701 edhill 1.1 printf ' N/O '
702     else
703 jmc 1.94 if [ $xx -ge $MATCH_CRIT ]; then
704 edhill 1.1 printf ' pass'
705     else
706     printf ' FAIL'
707     fi
708     fi
709     printf ' %s' $nm
710     printf '\n'
711    
712     }
713    
714     scandirs()
715     {
716 jmc 1.81 if [ $# -eq 1 ]; then
717     for arg in * ; do
718 jmc 1.99 test -f $arg/$1 && echo $arg
719 jmc 1.81 done
720 edhill 1.1 else
721 jmc 1.81 echo $*
722 edhill 1.1 fi
723     }
724    
725    
726     ###############################################################################
727    
728    
729     # Default properties
730     debug=0
731     verbose=1
732     clean=0
733     expts=''
734 edhill 1.6 # ieee=1
735 edhill 1.10
736 edhill 1.40 IEEE=true
737 edhill 1.10 if test "x$MITGCM_IEEE" != x ; then
738     IEEE=$MITGCM_IEEE
739     fi
740    
741    
742     CLEANUP=f
743     QUICK=f
744     NOGENMAKE=f
745     NOCLEAN=f
746     NODEPEND=f
747 edhill 1.68 POSTCLEAN=f
748 edhill 1.1
749 edhill 1.4 BASH=
750 edhill 1.10 OPTFILE=NONE
751     ADDRESSES=
752 edhill 1.1 TESTDIRS=
753 jmc 1.89 SKIPDIRS=
754 edhill 1.1 MPACKDIR="../tools/mpack-1.6"
755 edhill 1.20 HAVE_MPACK=
756 edhill 1.1 MPACK="$MPACKDIR/mpack"
757 edhill 1.24 COMMAND=
758 edhill 1.59 if test "x$MAKE" = x ; then
759     MAKE=make
760     fi
761     if test "x$CC" = x ; then
762     CC=cc
763     fi
764 edhill 1.43 JOBS=
765 edhill 1.7 MPI=f
766 jmc 1.83 MULTI_THREAD=f
767 jmc 1.70 OUTDIR=
768 edhill 1.40 DELDIR=
769 edhill 1.1
770 edhill 1.24 ADM=
771    
772 edhill 1.49 # Additional monitor types
773 edhill 1.50 PTRACERS_NUM="1 2 3 4 5"
774 edhill 1.49
775 jmc 1.92 MATCH_CRIT=13
776    
777 edhill 1.34 printf "parsing options... "
778 edhill 1.1
779     ac_prev=
780     for ac_option ; do
781    
782     # If the previous option needs an argument, assign it.
783     if test -n "$ac_prev"; then
784     eval "$ac_prev=\$ac_option"
785     ac_prev=
786     continue
787     fi
788    
789     ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
790    
791     case $ac_option in
792    
793     -help | --help | -h | --h)
794     usage ;;
795    
796 edhill 1.2 -optfile | --optfile | -of | --of)
797 edhill 1.10 ac_prev=OPTFILE ;;
798 edhill 1.2 -optfile=* | --optfile=* | -of=* | --of=*)
799 edhill 1.10 OPTFILE=$ac_optarg ;;
800 edhill 1.1
801     -addr | --addr | -a | --a)
802     ac_prev=ADDRESSES ;;
803     -addr=* | --addr=*)
804     ADDRESSES=$ac_optarg ;;
805    
806     -tdir | --tdir | -t | --t)
807     ac_prev=TESTDIRS ;;
808     -tdir=* | --tdir=*)
809     TESTDIRS=$ac_optarg ;;
810 edhill 1.4
811 jmc 1.89 -skipdir | --skipdir | -skd | --skd)
812     ac_prev=SKIPDIRS ;;
813     -skipdir=* | --skipdir=*)
814     SKIPDIRS=$ac_optarg ;;
815    
816 edhill 1.4 -bash | --bash | -b | --b)
817     ac_prev=BASH ;;
818     -bash=* | --bash=*)
819     BASH=$ac_optarg ;;
820 edhill 1.5
821 edhill 1.6 -command | --command | -c | --c)
822     ac_prev=COMMAND ;;
823     -command=* | --command=*)
824     COMMAND=$ac_optarg ;;
825 edhill 1.8
826     -make | --make | -m | --m)
827     ac_prev=MAKE ;;
828     -make=* | --make=*)
829     MAKE=$ac_optarg ;;
830 edhill 1.1
831 jmc 1.70 -odir | --odir)
832     ac_prev=OUTDIR ;;
833     -odir=* | --odir=*)
834     OUTDIR=$ac_optarg ;;
835    
836 edhill 1.50 -ptracers | --ptracers | -ptr | --ptr)
837     ac_prev=PTRACERS_NUM ;;
838     -ptracers=* | --ptracers=* | -ptr=* | --ptr=*)
839     PTRACERS_NUM=$ac_optarg ;;
840    
841 jmc 1.92 -match | --match ) ac_prev=MATCH_CRIT ;;
842     -match=* | --match=* ) MATCH_CRIT=$ac_optarg ;;
843    
844 edhill 1.43 -j) ac_prev=JOBS ;;
845     -j=*) JOBS=$ac_optarg ;;
846    
847 edhill 1.10 -clean | --clean)
848 jmc 1.69 CLEANUP=t ; DELDIR=t ;;
849 edhill 1.10
850     -quick | --quick | -q | --q)
851     QUICK=t ;;
852     -nogenmake | --nogenmake | -ng | --ng)
853     NOGENMAKE=t ;;
854     -noclean | --noclean | -nc | --nc)
855     NOCLEAN=t ;;
856     -nodepend | --nodepend | -nd | --nd)
857     NODEPEND=t ;;
858    
859 edhill 1.68 -postclean | --postclean | -pc | --pc)
860     POSTCLEAN=t ;;
861    
862 edhill 1.18 -mpi) MPI=t ;;
863 edhill 1.10
864 jmc 1.83 -mth) MULTI_THREAD=t ;;
865    
866 edhill 1.24 -adm | -ad) ADM=t ;;
867    
868 edhill 1.10 -ieee) IEEE=true ;;
869     -noieee) IEEE= ;;
870    
871 edhill 1.1 -verbose) verbose=2 ;;
872     -debug) debug=1 ;;
873     -quiet) verbose=0 ;;
874    
875 edhill 1.40 -deldir | -dd) DELDIR=t ;;
876    
877 ce107 1.90 -ts) TS=t;;
878    
879     -papis) PAPIS=t;;
880    
881     -pcls) PCL=t;;
882    
883 edhill 1.1 -*)
884     echo "Error: unrecognized option: "$ac_option
885     usage
886     ;;
887    
888     *)
889     echo "Error: unrecognized argument: "$ac_option
890     usage
891     ;;
892    
893     esac
894    
895     done
896    
897 edhill 1.10 if test "x$QUICK" = xt ; then
898     NOGENMAKE=t
899     NOCLEAN=t
900     NODEPEND=t
901     fi
902    
903 jmc 1.99 #- setting for forward or ADM testing
904     if test "x$ADM" = xt ; then
905     code_dir=code_ad
906     input_dirs='input_ad input'
907     ref_outp="output_adm.txt"
908     EXECUTABLE="mitgcmuv_ad"
909     else
910     code_dir=code
911     input_dirs='input'
912     ref_outp="output.txt"
913     EXECUTABLE="mitgcmuv"
914     fi
915    
916 edhill 1.1 if test "x$TESTDIRS" = x ; then
917 jmc 1.103 LIST=`scandirs results/$ref_outp`
918 jmc 1.84 else
919     #- expand group of experiments:
920     LIST=" "
921     for xx in $TESTDIRS
922     do
923     case $xx in
924 jmc 1.86 'basic') LIST=${LIST}" aim.5l_cs hs94.128x64x5 ideal_2D_oce"
925     LIST=${LIST}" lab_sea tutorial_baroclinic_gyre"
926     LIST=${LIST}" tutorial_global_oce_latlon tutorial_plume_on_slope"
927 jmc 1.84 ;;
928     'tutorials')
929     LIST=${LIST}" "`ls | grep 'tutorial_'` ;;
930     *) LIST=${LIST}" "$xx ;;
931     esac
932     done
933 jmc 1.89 fi
934     #echo 'LIST='${LIST}'<'
935     #- skip dirs, remove duplicate and non-directory:
936     TESTDIRS=" "
937     count=0
938     for xx in $LIST
939     do
940     yy=`echo $SKIPDIRS | grep -c $xx`
941     if test $yy = 0 ; then
942 jmc 1.84 if test -d $xx ; then
943     yy=`echo $TESTDIRS | grep -c $xx`
944     if test $yy = 0 ; then TESTDIRS=${TESTDIRS}" "$xx ; fi
945 jmc 1.89 else count=1 ;
946     echo ""; echo -n " -- skip \"$xx\" (not a directory !)"
947     fi
948     else
949     if test $count = 1 ; then echo -n ", \"$xx\""
950     else count=1 ; echo "" ; echo -n " skip: \"$xx\""
951 jmc 1.84 fi
952 jmc 1.89 fi
953     done
954     if test $count = 1 ; then echo "" ; echo -n " ... " ; fi
955 jmc 1.84 #echo 'TESTDIRS='${TESTDIRS}'<'
956 edhill 1.1
957 edhill 1.10 if test "x$OPTFILE" = xNONE -a "x$MITGCM_OF" != x ; then
958     OPTFILE=$MITGCM_OF
959     fi
960    
961 jmc 1.99 OUTPUTFILE=$ref_outp
962 jmc 1.87 if test "x$COMMAND" = x ; then
963 jmc 1.77 COMMAND="./$EXECUTABLE > $OUTPUTFILE"
964 edhill 1.24 fi
965 jmc 1.87 if test "x$MPI" = xt ; then
966     OUTPUTFILE="STDOUT.0000"
967 edhill 1.24 fi
968    
969 jmc 1.76 echo "OK (COMMAND= $COMMAND )"
970 edhill 1.1
971 jmc 1.94 # set the Default List of output variables to be checked:
972     # (use default or load experiment-specific list from file "tr_checklist")
973     # content : 1rst = main variable used to decide if it pass or FAIL
974     # others = number of matching digits to be printed in summary.txt
975 jmc 1.99 if test "x$ADM" = x ; then
976 jmc 1.94 DEF_CHECK_LIST='PS PS T+ S+ U+ V+ pt1+ pt2+ pt3+ pt4+ pt5+'
977     EMPTY_RESULTS='.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..'
978 jmc 1.97 LEN_CHECK_LIST=`echo $DEF_CHECK_LIST | sed 's/ [a-zA-Z0-9]*+/&mn &mx &av &sd/g' | awk '{print NF-1}'`
979 jmc 1.94 ii=`echo $EMPTY_RESULTS | awk '{print NF}'`
980 jmc 1.97 EMPTY_RESULTS=$EMPTY_RESULTS`expr $LEN_CHECK_LIST - $ii | awk 'BEGIN{FS=":"}{for(i=1;i<=$1;i++){printf " ."}}'`
981 jmc 1.99 else
982 jmc 1.103 DEF_CHECK_LIST='Grad Cost Grad'
983 jmc 1.99 EMPTY_RESULTS='.. ..'
984     LEN_CHECK_LIST=`echo $DEF_CHECK_LIST | sed 's/ [a-zA-Z0-9]*+/&mn &mx &av &sd/g' | awk '{print NF-1}'`
985 jmc 1.94 fi
986    
987 edhill 1.1 # create the FORTRAN comparison code
988     createcodelet
989    
990     # build the mpack utility
991 edhill 1.31 if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then
992 edhill 1.32 echo "skipping mpack build"
993     else
994 edhill 1.31 build_mpack
995     fi
996 edhill 1.1
997     # Create a uniquely named directory to store results
998     MACH=`hostname`
999 edhill 1.2 UNAMEA=`uname -a`
1000 edhill 1.1 DATE=`date +%Y%m%d`
1001 edhill 1.25 BASE="tr_"$MACH"_"$DATE"_"
1002 jmc 1.70 if test "x$OUTDIR" != x ; then
1003     BASE="tr_"$OUTDIR"_"$DATE"_"
1004     fi
1005 edhill 1.1 DNUM=0
1006     DRESULTS="$BASE$DNUM"
1007     while test -e $DRESULTS ; do
1008     DNUM=$(( $DNUM + 1 ))
1009     DRESULTS="$BASE$DNUM"
1010     done
1011     mkdir $DRESULTS
1012     RETVAL=$?
1013     if test "x$RETVAL" != x0 ; then
1014 edhill 1.20 echo "ERROR: Can't create results directory \"./$DRESULTS\""
1015 edhill 1.1 exit 1
1016     fi
1017     SUMMARY="$DRESULTS/summary.txt"
1018 edhill 1.34 printf "Start time: " >> $SUMMARY
1019 edhill 1.16 start_date=`date`
1020 edhill 1.17 echo $start_date > $SUMMARY
1021 edhill 1.1
1022 edhill 1.11 of_path=
1023 edhill 1.10 if test "x$OPTFILE" != xNONE ; then
1024     if test -r $OPTFILE ; then
1025 edhill 1.11 # get the path
1026     path=${OPTFILE%/*}
1027     if test "x$path" = x ; then
1028     of_path=`pwd`
1029     else
1030     of_path=`( cd $path > /dev/null 2>&1 ; pwd )`
1031     fi
1032     file=${OPTFILE##*/}
1033     OPTFILE=$of_path/$file
1034 edhill 1.21 cp $OPTFILE $DRESULTS
1035     echo >> $SUMMARY
1036     echo " OPTFILE=$OPTFILE" >> $SUMMARY
1037 edhill 1.11 else
1038 edhill 1.21 echo | tee $SUMMARY
1039     echo "ERROR: can't read OPTFILE=\"$OPTFILE\"" | tee $SUMMARY
1040     exit 1
1041 edhill 1.10 fi
1042 edhill 1.21 else
1043     echo >> $SUMMARY
1044     echo "No \"OPTFILE\" was explicitly specified by testreport," >> $SUMMARY
1045     echo " so the genmake default will be used." >> $SUMMARY
1046 edhill 1.10 fi
1047     echo
1048     echo >> $SUMMARY
1049 edhill 1.24 if test "x$ADM" = x ; then
1050 jmc 1.92 if [ $MATCH_CRIT -lt 10 ] ;
1051 jmc 1.94 then line_0="default "$MATCH_CRIT ;
1052     else line_0="default "$MATCH_CRIT ; fi
1053     line_0="$line_0 ----T----- ----S----- ----U----- ----V-----"
1054 jmc 1.92 # line_0=" ----T----- ----S----- ----U----- ----V-----"
1055 edhill 1.49 line_1="G D M c m s m s m s m s"
1056     line_2="E p a R g m m e . m m e . m m e . m m e ."
1057     line_3="N n k u 2 i a a d i a a d i a a d i a a d"
1058     line_4="2 d e n d n x n . n x n . n x n . n x n ."
1059 edhill 1.50 for ii in $PTRACERS_NUM ; do
1060 edhill 1.49 # tst=`eval 'echo $HAVE_PTR0'$ii`
1061     # if test "x$tst" = xt ; then
1062     line_0="$line_0 --PTR 0"$ii"--"
1063     line_1="$line_1 m s"
1064     line_2="$line_2 m m e ."
1065     line_3="$line_3 i a a d"
1066     line_4="$line_4 n x n ."
1067     # fi
1068     done
1069     echo "$line_0" | tee -a $SUMMARY
1070     echo "$line_1" | tee -a $SUMMARY
1071     echo "$line_2" | tee -a $SUMMARY
1072     echo "$line_3" | tee -a $SUMMARY
1073     echo "$line_4" | tee -a $SUMMARY
1074     echo " " | tee -a $SUMMARY
1075 edhill 1.24 else
1076     echo "ADJOINT=true" >> $SUMMARY
1077     echo >> $SUMMARY
1078 jmc 1.100 if [ $MATCH_CRIT -lt 10 ] ;
1079 jmc 1.103 then line_0="default "$MATCH_CRIT ;
1080     else line_0="default "$MATCH_CRIT ; fi
1081 jmc 1.100 echo "$line_0" | tee -a $SUMMARY
1082 edhill 1.24 cat << EOF | tee -a $SUMMARY
1083     G D M C G
1084     E p a R o r
1085     N n k u s a
1086     2 d e n t d
1087    
1088     EOF
1089     fi
1090 edhill 1.1
1091 edhill 1.10 # ...and each test directory...
1092     for dir in $TESTDIRS ; do
1093    
1094 jmc 1.106 # set builddir & rundir:
1095     builddir="build"
1096     if test ! -d $dir/$builddir ; then mkdir $dir/$builddir ; fi
1097     rundir="run"
1098     if test ! -d $dir/$rundir ; then
1099     rundir=$builddir
1100     fi
1101     CODE_DIR=$dir/$code_dir
1102     BUILD_DIR=$dir/$builddir
1103    
1104 edhill 1.10 # Cleanup only!
1105     if test "x$CLEANUP" = xt ; then
1106 jmc 1.106 if test -r $BUILD_DIR/Makefile ; then
1107 jmc 1.83 echo ' ------ clean dir:' $dir/build
1108 jmc 1.106 ( cd $BUILD_DIR ; make CLEAN )
1109 edhill 1.10 fi
1110 jmc 1.106 if test -d $dir/$rundir/CVS ; then
1111     echo ' ------ clean dir:' $dir/$rundir
1112     run_clean $dir/$rundir
1113 edhill 1.10 fi
1114 edhill 1.62 (
1115     cd $dir
1116     rm -rf tr_run.*
1117     )
1118 edhill 1.10 continue
1119 edhill 1.1 fi
1120 edhill 1.3
1121 edhill 1.10 # Verify that the testdir exists and contains previous
1122     # results in the correct location--or skip this directory!
1123 jmc 1.104 fout=$dir"/results/"$ref_outp
1124 edhill 1.24 if test ! -r $fout ; then
1125     echo "can't read \"$fout\" -- skipping $dir"
1126 edhill 1.10 continue
1127     fi
1128 edhill 1.53 if test "x$ADM" = x ; then
1129     check_for_add_mon_output $fout
1130     fi
1131 edhill 1.7
1132 edhill 1.49 # Check for additional types of monitor output
1133    
1134 edhill 1.30 if test ! -r $CODE_DIR"/SIZE.h_mpi" -a "x$MPI" = "xt" ; then
1135 edhill 1.28 echo "can't find \"$CODE_DIR/SIZE.h_mpi\" -- skipping $dir"
1136     continue
1137     fi
1138 jmc 1.83 if test ! -r $dir"/input/eedata.mth" -a "x$MULTI_THREAD" = "xt" ; then
1139     echo "can't find \"$dir/input/eedata.mth\" -- skipping $dir"
1140     continue
1141     fi
1142    
1143     # Check whether there are "extra runs" for this testdir
1144     extra_runs=
1145     if test "x$ADM" = x ; then
1146     ex_run_dirs=`( cd $dir ; echo input.* )`
1147     #echo "ex_run_dirs='$ex_run_dirs'"
1148     for exd in $ex_run_dirs ; do
1149     name=`echo $exd | sed -e 's/input.//g'`
1150 jmc 1.85 outf="$dir/results/output.$name.txt"
1151 jmc 1.83 if test -f $outf -a -r $outf ; then
1152     if test "x$MULTI_THREAD" = "xt" ; then
1153     if test -r $dir"/"$exd"/eedata.mth" ; then
1154     extra_runs="$extra_runs $name"
1155     #else echo $dir"/"$exd"/eedata.mth: not found"
1156     fi
1157     else
1158     extra_runs="$extra_runs $name"
1159     fi
1160     fi
1161     done
1162     fi
1163 edhill 1.28
1164     echo "-------------------------------------------------------------------------------"
1165     echo
1166 jmc 1.83 if test "x$extra_runs" = "x" ; then
1167     echo "Experiment: $dir"
1168     else
1169     echo "Experiment: $dir ; extra_runs=$extra_runs"
1170     fi
1171 edhill 1.28 echo
1172     unset genmake makedepend make run
1173 jmc 1.94 results=$EMPTY_RESULTS
1174 edhill 1.10
1175     # Create an output dir for each OPTFILE/tdir combination
1176 edhill 1.20 rel_CDIR=$DRESULTS"/"$dir
1177     mkdir $rel_CDIR
1178     CDIR=`pwd`"/$rel_CDIR"
1179 edhill 1.10
1180     if test "x$CLEANUP" = xt ; then
1181 jmc 1.83 echo '====>>> this is to check that we never go through this part <<< ==='
1182     makeclean $dir/$builddir \
1183     && run_clean $dir/$rundir
1184 edhill 1.10 else
1185 edhill 1.1 genmakemodel $dir/$builddir && genmake=Y \
1186     && makeclean $dir/$builddir \
1187 jmc 1.83 && run_clean $dir/$rundir \
1188 edhill 1.27 && symlink_mpifiles $dir $code_dir $builddir \
1189 edhill 1.1 && makedependmodel $dir/$builddir && makedepend=Y \
1190     && makemodel $dir/$builddir && make=Y \
1191 jmc 1.83 && linkdata $dir/$rundir $input_dirs \
1192 edhill 1.12 && runmodel $dir/$rundir && run=Y \
1193 jmc 1.99 && results=`testoutput_run $dir $rundir $ref_outp`
1194 edhill 1.10 fi
1195    
1196     echo
1197 jmc 1.103 # --> same processing for adjoint & forward test
1198 edhill 1.24 fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1199 edhill 1.34 echo
1200 jmc 1.98 echo "$fres" | sed 's/ 99/ --/g' | sed 's/ > />/' | sed 's/ < /</' >> $SUMMARY
1201 jmc 1.100 touch $CDIR"/summary.txt"
1202 jmc 1.97 echo "fresults='$fres'" | sed 's/ 99/ --/g' >> $CDIR"/summary.txt"
1203 edhill 1.34 echo "MACH='$MACH'" >> $CDIR"/summary.txt"
1204     echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"
1205     echo "DATE='$DATE'" >> $CDIR"/summary.txt"
1206     echo "tdir='$dir'" >> $CDIR"/summary.txt"
1207    
1208     for ex in $extra_runs ; do
1209 jmc 1.73 unset run
1210 jmc 1.94 results=$EMPTY_RESULTS
1211 jmc 1.106 # reference output file
1212     refExOut=`echo $ref_outp | sed "s/\./.${ex}./g"`
1213 jmc 1.73 # Create an output dir for each OPTFILE/tdir.ex combination
1214     rel_CDIR=$DRESULTS"/"$dir"."$ex
1215     mkdir $rel_CDIR
1216     CDIR=`pwd`"/$rel_CDIR"
1217 edhill 1.61 test ! -e "$dir/tr_run.$ex" && mkdir "$dir/tr_run.$ex"
1218 jmc 1.106 run_clean $dir/tr_run.$ex
1219     linkdata $dir/tr_run.$ex input.$ex input
1220 jmc 1.42 runmodel $dir/tr_run.$ex && run=Y \
1221 jmc 1.106 && results=`testoutput_run $dir tr_run.$ex $refExOut`
1222 edhill 1.34 fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1223     fres="$fres.$ex"
1224     echo
1225 jmc 1.100 echo "$fres" | sed 's/ 99/ --/g' | sed 's/ > />/' | sed 's/ < /</' >> $SUMMARY
1226     touch $CDIR"/summary.txt"
1227 jmc 1.97 echo "fresults='$fres'" | sed 's/ 99/ --/g' >> $CDIR"/summary.txt"
1228 edhill 1.34 echo "MACH='$MACH'" >> $CDIR"/summary.txt"
1229     echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"
1230     echo "DATE='$DATE'" >> $CDIR"/summary.txt"
1231 jmc 1.73 echo "tdir='$dir.$ex'" >> $CDIR"/summary.txt"
1232 jmc 1.83 if test "x$POSTCLEAN" = xt ; then
1233 jmc 1.100 run_clean $dir/tr_run.$ex
1234 jmc 1.83 fi
1235 edhill 1.34 done
1236 jmc 1.103 # <-- same processing for adjoint & forward test
1237 jmc 1.99 if test "x$ADM" = xt ; then
1238 jmc 1.105 head -1 $dir/$builddir/taf_ad.log >> $CDIR"/summary.txt"
1239 jmc 1.100 grep -A3 'Seconds in section "ALL' $dir/$rundir/$OUTPUTFILE \
1240 jmc 1.77 >> $CDIR"/summary.txt"
1241 edhill 1.24 fi
1242 edhill 1.68
1243 jmc 1.83 #postclean $dir/$builddir
1244     if test "x$POSTCLEAN" = xt ; then
1245     makeclean $dir/$builddir \
1246     && run_clean $dir/$rundir
1247     fi
1248 edhill 1.10
1249     echo "-------------------------------------------------------------------------------"
1250    
1251 edhill 1.1 done
1252    
1253 edhill 1.34 printf "Start time: " >> $SUMMARY
1254 edhill 1.16 echo $start_date >> $SUMMARY
1255 edhill 1.34 printf "End time: " >> $SUMMARY
1256 edhill 1.13 date >> $SUMMARY
1257 edhill 1.20
1258     # If addresses were supplied and mpack built successfully, then try
1259     # to send email using mpack.
1260     if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then
1261     echo "No results email was sent."
1262     else
1263     if test "x$HAVE_MPACK" = xt ; then
1264     tar -cf $DRESULTS".tar" $DRESULTS > /dev/null 2>&1 \
1265     && gzip $DRESULTS".tar" \
1266 edhill 1.44 && $MPACK -s MITgcm-test -m 3555000 $DRESULTS".tar.gz" $ADDRESSES
1267 edhill 1.20 RETVAL=$?
1268     if test "x$RETVAL" != x0 ; then
1269     echo
1270     echo "Warning: The tar, gzip, & mpack step failed. Please send email"
1271     echo " to <MITgcm-support@mitgcm.org> for help. You may copy the "
1272     echo " summary of results from the directory \"$DRESULTS\"."
1273     echo
1274     else
1275     echo
1276     echo "An email containing results was sent to the following addresses:"
1277     echo " \"$ADDRESSES\""
1278     echo
1279     fi
1280     test -f $DRESULTS".tar" && rm -f $DRESULTS".tar"
1281     test -f $DRESULTS".tar.gz" && rm -f $DRESULTS".tar.gz"
1282     fi
1283     fi
1284 edhill 1.13
1285 jmc 1.91 rm -f tr_cmpnum.c tr_cmpnum
1286 edhill 1.1
1287 edhill 1.12 if test "x$CLEANUP" != xt ; then
1288 jmc 1.102 cat $SUMMARY | sed 's/ \. \. \. \. \. \. \. \. \. \. \. \. //'
1289 edhill 1.25 if test -e tr_out.txt ; then
1290     mv tr_out.txt tr_out.txt.old
1291 edhill 1.14 fi
1292 jmc 1.103 cat $SUMMARY | sed '/^[YN] [YN] [YN] [YN]/ s/ \. //g' > tr_out.txt
1293 edhill 1.12 fi
1294 edhill 1.1
1295 edhill 1.40 if test "x$DELDIR" = xt ; then
1296     rm -rf $DRESULTS
1297     fi
1298    

  ViewVC Help
Powered by ViewVC 1.1.22