/[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.112 - (hide annotations) (download)
Sat Feb 9 18:30:25 2008 UTC (16 years, 1 month ago) by jmc
Branch: MAIN
CVS Tags: checkpoint59o
Changes since 1.111: +7 -6 lines
minor changes: print which C compiler is used to build mpack and to
 compile the comparison code.

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

  ViewVC Help
Powered by ViewVC 1.1.22