/[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.189 - (hide annotations) (download)
Sat Jul 20 20:32:17 2013 UTC (10 years, 9 months ago) by jmc
Branch: MAIN
Changes since 1.188: +3 -2 lines
refine error counting in TAF log files

1 edhill 1.19 #! /usr/bin/env bash
2 edhill 1.1 #
3 jmc 1.189 # $Header: /u/gcmpack/MITgcm/verification/testreport,v 1.188 2013/07/19 18:49:33 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.122 echo " (-mth) run multi-threaded (using eedata.mth)"
15 jmc 1.154 echo " (-mpi) use MPI to compile and run on 2 processors"
16     echo " (-MPI) NUMBER use MPI to compile and run on max NUMBER procs"
17 jmc 1.156 echo " (-mfile|-mf) STRING MPI: file with list of possible machines to run on"
18 jmc 1.164 echo " (-fast) use optfile default for compiler flags (no '-ieee')"
19     echo " DEF=off => use IEEE numerics option (if available)"
20     echo " (-devel) use optfile developement flags (if available)"
21 jmc 1.109 echo " (-gsl) compile with \"-gsl\" flag"
22 jmc 1.136 echo " (-use_r4|-ur4) if allowed, use real*4 type for '_RS' variable"
23     echo " (-optfile|-of) STRING list of optfiles to use"
24     echo " (-addr|-a) STRING list of email recipients"
25 jmc 1.108 echo " (DEF=\"\" no email is sent)"
26 jmc 1.136 echo " (-mpackdir|-mpd) DIR location of the mpack utility"
27 jmc 1.113 echo " (DEF=\"../tools/mpack-1.6\")"
28 jmc 1.136 echo " (-tdir|-t) STRING list of group and/or exp. dirs to test"
29 jmc 1.84 echo " (recognized groups: basic, tutorials)"
30     echo " (DEF=\"\" which test all)"
31 jmc 1.149 echo " (if list= 'start_from THIS_EXP' then"
32     echo " test THIS_EXP + all the following)"
33 jmc 1.136 echo " (-skipdir|-skd) STRING list of exp. dirs to skip"
34 jmc 1.89 echo " (DEF=\"\" which test all)"
35 jmc 1.136 echo " (-bash|-b) STRING preferred location of a \"bash\" or"
36 edhill 1.20 echo " Bourne-compatible \"sh\" shell"
37     echo " (DEF=\"\" for \"bash\")"
38 jmc 1.175 echo " (-tlm) perform a Tangent Linear run"
39 edhill 1.24 echo " (-adm|-ad) perform an adjoint run"
40 utke 1.120 echo " (-oad) perform an OpenAD adjoint run"
41 jmc 1.136 echo " (-command|-c) STRING command to run"
42 jmc 1.141 echo " (-makedepend|-md) STRING command to use for \"makedepend\""
43 jmc 1.136 echo " (-make|-m) STRING command to use for \"make\""
44 edhill 1.8 echo " (DEF=\"make\")"
45 jmc 1.70 echo " (-odir) STRING used to build output directory name"
46     echo " (DEF=\"hostname\")"
47 jmc 1.156 # echo " (-ptracers|-ptr) STRING specify which ptracers to test"
48     # echo " (DEF=\"1 2 3 4 5\")"
49 jmc 1.92 echo " (-match) NUMBER Matching Criteria (number of digits)"
50 jmc 1.141 echo " (DEF=\"$MATCH_CRIT\")"
51 edhill 1.43 echo " (-j) JOBS use \"make -j JOBS\" for parallel builds"
52 jmc 1.165 echo " (-ef) STRING used as genmake2 \"-extra_flag\" argument"
53 jmc 1.156 echo " (-clean) *ONLY* run \"make CLEAN\" & clean run-dir"
54 jmc 1.133 echo " (-norun|-nr) skip the \"runmodel\" stage (stop after make)"
55 jmc 1.165 echo " (-obj) only produces objects (=norun & no executable)"
56 jmc 1.136 echo " (-runonly|-ro) *ONLY* run stage (=\"-quick\" without make)"
57 ce107 1.90 echo " (-quick|-q) same as \"-nogenmake -noclean -nodepend\""
58     echo " (-nogenmake|-ng) skip the genmake stage"
59     echo " (-noclean|-nc) skip the \"make clean\" stage"
60     echo " (-nodepend|-nd) skip the \"make depend\" stage"
61 jmc 1.156 echo " (-postclean|-pc) after each exp. test, clean build-dir & run-dir"
62     echo " (-deloutp|-do) delete output files after successful run"
63 ce107 1.90 echo " (-deldir|-dd) on success, delete the output directory"
64     echo " (-ts) provide timing information per timestep"
65     echo " (-papis) provide MFlop/s per timestep using PAPI"
66     echo " (-pcls) provide MFlop/s per timestep using PCL"
67 edhill 1.6 echo
68 edhill 1.50 echo "and where STRING can be a whitespace-delimited list"
69 edhill 1.6 echo "such as:"
70 edhill 1.50 echo
71 edhill 1.6 echo " -t 'exp0 exp2 exp3' "
72     echo " -addr='abc@123.com testing@home.org'"
73 edhill 1.1 echo
74 edhill 1.50 echo "provided that the expression is properly quoted within the current"
75     echo "shell (note the use of single quotes to protect white space)."
76     echo
77 edhill 1.1 exit 1
78     }
79    
80     # build the mpack utility
81     build_mpack()
82     {
83 edhill 1.34 printf "building the mpack utility... "
84 jmc 1.113 MPACK="$MPACKDIR/mpack"
85     if test ! -x $MPACK ; then
86 edhill 1.1 if test ! -d $MPACKDIR ; then
87 edhill 1.20 echo
88 edhill 1.1 echo "Error: can't find \"$MPACKDIR\""
89     echo " are you sure this program is being run in the correct "
90     echo " (that is, \"MITGCM_ROOT\verification\") directory?"
91 edhill 1.20 echo
92     HAVE_MPACK=f
93 edhill 1.1 fi
94 edhill 1.26 if test "x$CC" = x ; then
95     export CC=cc
96     fi
97 jmc 1.112 printf "building mpack (using CC=$CC)... "
98 edhill 1.25 ( cd $MPACKDIR && ./configure && $MAKE ) > tr_build_mpack.out 2>&1
99 edhill 1.1 RETVAL=$?
100     if test "x$RETVAL" != x0 ; then
101     echo
102     echo "Error building the mpack tools at: $MPACK_DIR"
103 edhill 1.20 echo
104     HAVE_MPACK=f
105     else
106 edhill 1.25 rm -f tr_build_mpack.out
107 edhill 1.20 HAVE_MPACK=t
108 jmc 1.113 echo "done"
109 edhill 1.1 fi
110 edhill 1.20 else
111     HAVE_MPACK=t
112 jmc 1.113 echo "already exist"
113 edhill 1.1 fi
114     }
115    
116 jmc 1.93 testoutput_var()
117 edhill 1.1 {
118 jmc 1.99 # testoutput_var dir s1 label subdir reference_output
119 edhill 1.1 #
120 jmc 1.135 # compares 1 variable output selected from file $dir/$subdir/$OUTPUTFILE
121 jmc 1.175 # with same output from reference file $dir/$reference_output
122 jmc 1.93 # using search strings s1 and text label
123 edhill 1.1
124     if [ $debug -gt 0 ]; then
125 jmc 1.93 echo testoutput_var: grep "$2" $1/$4/$OUTPUTFILE 1>&2
126 edhill 1.1 fi
127 jmc 1.87 if [ -r $1/$4/$OUTPUTFILE ]; then
128     grep "$2" $1/$4/$OUTPUTFILE | sed 's/.*=//' | cat -n > tmp1.txt
129 jmc 1.67 lncntA=`wc -l tmp1.txt | awk '{print $1}' `
130 jmc 1.100 if [ $lncntA -lt 2 ]; then
131 edhill 1.1 if [ $verbose -gt 0 ]; then
132     echo Not enough lines of output when searching for "$2" 1>&2
133     fi
134 jmc 1.175 rm -f tmp1.txt ; return 99
135 edhill 1.1 fi
136     else
137 jmc 1.93 echo testoutput_var: $OUTPUTFILE from model run was not readable 1>&2
138 edhill 1.1 return 99
139     fi
140     if [ $debug -gt 0 ]; then
141 jmc 1.175 echo testoutput_var: grep "$2" $1/$5 1>&2
142 edhill 1.1 fi
143 jmc 1.175 grep "$2" $1/$5 | sed 's/.*=//' | cat -n > tmp2.txt
144 jmc 1.67 lncntB=`wc -l tmp2.txt | awk '{print $1}' `
145 jmc 1.100 if [ $lncntB -lt 2 ]; then
146 edhill 1.1 if [ $verbose -gt 0 ]; then
147     echo Not enough lines of output when searching for "$2" 1>&2
148     fi
149 jmc 1.175 rm -f tmp1.txt tmp2.txt ; return 99
150 edhill 1.1 fi
151 jmc 1.67 if [ $lncntA -ne $lncntB ]; then
152 jmc 1.175 if [ $verbose -gt 0 ]; then
153     echo Not same Nb of lines when searching for "$2" ":" $lncntA $lncntB 1>&2
154     fi
155     rm -f tmp1.txt tmp2.txt ; return 99
156 jmc 1.67 fi
157 edhill 1.72 has_nan=`cat tmp1.txt | grep -i nan | wc -l`
158     if [ $has_nan -gt 0 ] ; then
159 jmc 1.93 echo testoutput_var: $OUTPUTFILE contains $has_nan NaN values 1>&2
160 jmc 1.175 rm -f tmp1.txt tmp2.txt ; return 99
161 edhill 1.72 fi
162     has_inf=`cat tmp1.txt | grep -i inf | wc -l`
163     if [ $has_inf -gt 0 ] ; then
164 jmc 1.93 echo testoutput_var: $OUTPUTFILE contains $has_inf Inf values 1>&2
165 jmc 1.175 rm -f tmp1.txt tmp2.txt ; return 99
166 jmc 1.71 fi
167 edhill 1.1 if [ $debug -gt 0 ]; then
168 jmc 1.93 echo testoutput_var: join tmp1.txt tmp2.txt 1>&2
169 edhill 1.1 fi
170     join tmp1.txt tmp2.txt | awk '{print $1 " " $2 " " $3}' > tmp3.txt
171     if [ $debug -gt 0 ]; then
172 jmc 1.93 echo testoutput_var: compare_lines 1>&2
173 edhill 1.1 fi
174 edhill 1.22 if [ $verbose -gt 1 ]; then
175     cat tmp3.txt 1>&2
176     fi
177     echo "-1" >> tmp3.txt
178 edhill 1.23 # On the SGI O3K (*not* the O2K), "cat -n" inserts a ":" after the line number
179     cat tmp3.txt | sed -e 's|:||g' > tmp4.txt
180 jmc 1.91 digits_of_similarity=`./tr_cmpnum < tmp4.txt`
181 edhill 1.1 if [ $digits_of_similarity -eq 99 ]; then
182     if [ $verbose -gt 0 ]; then
183 jmc 1.99 echo testoutput_var: No comparison was available for \"$3\" 1>&2
184 edhill 1.1 fi
185     digits_of_similarity=99
186     else
187     if [ $verbose -gt 0 ]; then
188 jmc 1.99 echo There were $digits_of_similarity decimal places of similarity for \"$3\" 1>&2
189 edhill 1.1 fi
190     fi
191 edhill 1.23 rm -f tmp1.txt tmp2.txt tmp3.txt tmp4.txt
192 jmc 1.135
193 edhill 1.1 return $digits_of_similarity
194     }
195    
196 jmc 1.93 testoutput_run()
197 edhill 1.1 {
198 jmc 1.99 # testoutput_run directory subdir reference_output
199 edhill 1.1 #
200 jmc 1.93 # test output from 1 run in "directory"
201 jmc 1.103 # --> same processing for adjoint & forward test
202 jmc 1.175 # default list of output variables to be checked:
203     # 1rst : main variable used to decide if it pass or FAIL
204     # others : number of matching digits to be printed in summary.txt
205     listChk=$DEF_CHECK_LIST
206 jmc 1.94 # load experiment-specific list from file "tr_checklist" (if it exist)
207 jmc 1.175 if test -r $1/$2/tr_checklist ; then listChk=`cat $1/$2/tr_checklist` ; fi
208     sVar=`echo $listChk | awk '{print $1}'`
209     # remove 1rst var and expand the list: + => min max mean s.d
210     listVar=`echo $listChk | sed 's/ [a-zA-Z0-9]*+/&mn &mx &av &sd/g' \
211     | sed 's/+//g' | sed "s/^$sVar//"`
212 jmc 1.94 if [ $debug -gt 0 ]; then echo "testoutput_run: listVar(I)='$listVar'" 1>&2 ; fi
213 jmc 1.175 # set ref.outp file-name and, if compressed, uncompress it into subdir
214     refoutp=results/$3
215     if test ! -r $1/results/$3 ; then
216     if test -r $1/results/${3}.gz ; then
217     tmpNam1=$3
218     tmpNam2=`echo $tmpNam1 | sed 's/\..*\././'`
219     if test "x$tmpNam1" = "x$tmpNam2" ; then
220     tmpNam1=`echo $tmpNam2 | sed 's/\./.std./'`
221     fi
222     refoutp=$2/$tmpNam1
223     if [ $debug -gt 0 ]; then
224     echo "testoutput_run: gunzip 'results/$3.gz' into '$refoutp'" 1>&2
225     fi
226     gzip -cd $1/results/${3}.gz > $1/$refoutp
227     else
228     echo "missing reference output file '$3' (.gz) in '$1/results/'"
229     fi
230     fi
231     # check for ptracer output in reference_output file :
232     if test $KIND = 0 ; then
233     ptr_mon="trcstat_ptracerXX_min trcstat_ptracerXX_max"
234     ptr_mon="$ptr_mon trcstat_ptracerXX_mean trcstat_ptracerXX_sd"
235     for ii in $PTRACERS_NUM ; do
236 jmc 1.117 ptrfound=0
237     for jj in $ptr_mon ; do
238     name=`eval "echo $jj | sed -e 's|XX|0"$ii"|g'"`
239 jmc 1.175 tst=`grep $name $1/$refoutp | wc -l | awk '{print $1}'`
240 jmc 1.117 if test ! "x$tst" = x0 ; then ptrfound=1 ; fi
241     done
242     if test $ptrfound = '1' ; then
243     eval "HAVE_PTR0"$ii"=t"
244     else
245     eval "HAVE_PTR0"$ii"=f"
246     # remove this ptr from the list of output variable to check
247     # echo "-- ptr test=" $tst "number of var=" `echo $listVar | awk '{print NF}'` 1>&2
248     listVar=`echo "$listVar" | sed "s/ pt$ii..//g"`
249     fi
250 jmc 1.175 # eval 'echo "HAVE_PTR0'$ii' = $HAVE_PTR0'$ii'"' 1>&2
251     done
252     fi
253     tst=`echo $sVar $listVar | awk '{ for(i=2;i<=NF;i++){if($i==$1)t+=1}; print t }'`
254     if test $tst != 1 ; then
255     if test $tst = 0 ; then echo "==> WARNING: selected var >$sVar< not found" 1>&2
256     else echo "==> WARNING: found selected var >$sVar< $tst times" 1>&2 ; fi
257     echo "==> WARNING: in checked list:" $listVar 1>&2
258     #- put it back once:
259     listVar=" $sVar "`echo "$listVar " | sed "s/ $sVar / /g"`
260     fi
261 jmc 1.94 if [ $debug -gt 0 ]; then echo "testoutput_run: listVar(M)='$listVar'" 1>&2 ; fi
262 jmc 1.154 echo "listVar='$listVar'" >> $locDIR"/summary.txt"
263 jmc 1.175 #---
264     allargs=""
265     for xx in $listVar
266     do
267     case $xx in
268 jmc 1.94 'PS') if [ $debug -gt 0 ]
269     then echo testoutput_run: testoutput_var $1 cg2d_init_res 1>&2 ; fi
270 jmc 1.175 testoutput_var $1 "cg2d_init_res" "Press. Solver (cg2d)" $2 $refoutp ; yy=$?
271 jmc 1.94 if [ $debug -gt 0 ] ; then echo testoutput_run: cg2dres=$yy 1>&2 ; fi ;;
272 jmc 1.175 'Cost') testoutput_var $1 "ADM ref_cost_function" "ADM CostFct" $2 $refoutp ; yy=$? ;;
273     'AdGrd') testoutput_var $1 "ADM adjoint_gradient" "ADM Ad Grad" $2 $refoutp ; yy=$? ;;
274     'FDGrd') testoutput_var $1 "ADM finite-diff_grad" "ADM FD Grad" $2 $refoutp ; yy=$? ;;
275     'tlmCst') testoutput_var $1 "TLM ref_cost_function" "TLM CostFct" $2 $refoutp ; yy=$? ;;
276     'tlmGrd') testoutput_var $1 "TLM tangent-lin_grad" "TLM TL Grad" $2 $refoutp ; yy=$? ;;
277     'fwdGrd') testoutput_var $1 "TLM finite-diff_grad" "TLM FD Grad" $2 $refoutp ; yy=$? ;;
278     'Tmn') testoutput_var $1 "dynstat_theta_min" "Theta minimum" $2 $refoutp ; yy=$? ;;
279     'Tmx') testoutput_var $1 "dynstat_theta_max" "Theta maximum" $2 $refoutp ; yy=$? ;;
280     'Tav') testoutput_var $1 "dynstat_theta_mean" "Theta mean" $2 $refoutp ; yy=$? ;;
281     'Tsd') testoutput_var $1 "dynstat_theta_sd" "Theta Std.Dev" $2 $refoutp ; yy=$? ;;
282     'Smn') testoutput_var $1 "dynstat_salt_min" "Salt minimum" $2 $refoutp ; yy=$? ;;
283     'Smx') testoutput_var $1 "dynstat_salt_max" "Salt maximum" $2 $refoutp ; yy=$? ;;
284     'Sav') testoutput_var $1 "dynstat_salt_mean" "Salt mean" $2 $refoutp ; yy=$? ;;
285     'Ssd') testoutput_var $1 "dynstat_salt_sd" "Salt Std.Dev" $2 $refoutp ; yy=$? ;;
286     'Umn') testoutput_var $1 "dynstat_uvel_min" "U minimum" $2 $refoutp ; yy=$? ;;
287     'Umx') testoutput_var $1 "dynstat_uvel_max" "U maximum" $2 $refoutp ; yy=$? ;;
288     'Uav') testoutput_var $1 "dynstat_uvel_mean" "U mean" $2 $refoutp ; yy=$? ;;
289     'Usd') testoutput_var $1 "dynstat_uvel_sd" "U Std.Dev" $2 $refoutp ; yy=$? ;;
290     'Vmn') testoutput_var $1 "dynstat_vvel_min" "V minimum" $2 $refoutp ; yy=$? ;;
291     'Vmx') testoutput_var $1 "dynstat_vvel_max" "V maximum" $2 $refoutp ; yy=$? ;;
292     'Vav') testoutput_var $1 "dynstat_vvel_mean" "V mean" $2 $refoutp ; yy=$? ;;
293     'Vsd') testoutput_var $1 "dynstat_vvel_sd" "V Std.Dev" $2 $refoutp ; yy=$? ;;
294 jmc 1.94 'pt1mn'|'pt2mn'|'pt3mn'|'pt4mn'|'pt5mn') ii=`echo $xx | sed 's/pt//' | sed 's/..$//'`
295 jmc 1.175 testoutput_var $1 "trcstat_ptracer0"$ii"_min" "p0"$ii"_min" $2 $refoutp ; yy=$? ;;
296 jmc 1.94 'pt1mx'|'pt2mx'|'pt3mx'|'pt4mx'|'pt5mx') ii=`echo $xx | sed 's/pt//' | sed 's/..$//'`
297 jmc 1.175 testoutput_var $1 "trcstat_ptracer0"$ii"_max" "p0"$ii"_max" $2 $refoutp ; yy=$? ;;
298 jmc 1.94 'pt1av'|'pt2av'|'pt3av'|'pt4av'|'pt5av') ii=`echo $xx | sed 's/pt//' | sed 's/..$//'`
299 jmc 1.175 testoutput_var $1 "trcstat_ptracer0"$ii"_mean" "p0"$ii"_mean" $2 $refoutp ; yy=$? ;;
300 jmc 1.94 'pt1sd'|'pt2sd'|'pt3sd'|'pt4sd'|'pt5sd') ii=`echo $xx | sed 's/pt//' | sed 's/..$//'`
301 jmc 1.175 testoutput_var $1 "trcstat_ptracer0"$ii"_sd" "p0"$ii"_StDv" $2 $refoutp ; yy=$? ;;
302     'Qntmn') testoutput_var $1 "forcing_qnet_min" "Qnet minimum" $2 $refoutp ; yy=$? ;;
303     'Qntmx') testoutput_var $1 "forcing_qnet_max" "Qnet maximum" $2 $refoutp ; yy=$? ;;
304     'Qntav') testoutput_var $1 "forcing_qnet_mean" "Qnet mean" $2 $refoutp ; yy=$? ;;
305     'Qntsd') testoutput_var $1 "forcing_qnet_sd" "Qnet Std.Dev" $2 $refoutp ; yy=$? ;;
306     'aSImn') testoutput_var $1 "seaice_area_min" "SIce Area min" $2 $refoutp ; yy=$? ;;
307     'aSImx') testoutput_var $1 "seaice_area_max" "SIce Area max" $2 $refoutp ; yy=$? ;;
308     'aSIav') testoutput_var $1 "seaice_area_mean" "SIce Area mean" $2 $refoutp ; yy=$? ;;
309     'aSIsd') testoutput_var $1 "seaice_area_sd" "SIce Area StDv" $2 $refoutp ; yy=$? ;;
310     'hSImn') testoutput_var $1 "seaice_heff_min" "SIce Heff min" $2 $refoutp ; yy=$? ;;
311     'hSImx') testoutput_var $1 "seaice_heff_max" "SIce Heff max" $2 $refoutp ; yy=$? ;;
312     'hSIav') testoutput_var $1 "seaice_heff_mean" "SIce Heff mean" $2 $refoutp ; yy=$? ;;
313     'hSIsd') testoutput_var $1 "seaice_heff_sd" "SIce Heff StDv" $2 $refoutp ; yy=$? ;;
314     'uSImn') testoutput_var $1 "seaice_uice_min" "SIce Uice min" $2 $refoutp ; yy=$? ;;
315     'uSImx') testoutput_var $1 "seaice_uice_max" "SIce Uice max" $2 $refoutp ; yy=$? ;;
316     'uSIav') testoutput_var $1 "seaice_uice_mean" "SIce Uice mean" $2 $refoutp ; yy=$? ;;
317     'uSIsd') testoutput_var $1 "seaice_uice_sd" "SIce Uice StDv" $2 $refoutp ; yy=$? ;;
318     'vSImn') testoutput_var $1 "seaice_vice_min" "SIce Vice min" $2 $refoutp ; yy=$? ;;
319     'vSImx') testoutput_var $1 "seaice_vice_max" "SIce Vice max" $2 $refoutp ; yy=$? ;;
320     'vSIav') testoutput_var $1 "seaice_vice_mean" "SIce Vice mean" $2 $refoutp ; yy=$? ;;
321     'vSIsd') testoutput_var $1 "seaice_vice_sd" "SIce Vice StDv" $2 $refoutp ; yy=$? ;;
322     'AthSiG') testoutput_var $1 "thSI_Ice_Area_G" "thSIc Area Global" $2 $refoutp ; yy=$? ;;
323     'AthSiS') testoutput_var $1 "thSI_Ice_Area_S" "thSIc Area South" $2 $refoutp ; yy=$? ;;
324     'AthSiN') testoutput_var $1 "thSI_Ice_Area_N" "thSIc Area North" $2 $refoutp ; yy=$? ;;
325 jmc 1.182 'HthSiG') testoutput_var $1 "thSI_IceH_ave_G" "thSIc H Glob-ave" $2 $refoutp ; yy=$? ;;
326     'HthSiS') testoutput_var $1 "thSI_IceH_ave_S" "thSIc H South-av" $2 $refoutp ; yy=$? ;;
327     'HthSiN') testoutput_var $1 "thSI_IceH_ave_N" "thSIc H North-av" $2 $refoutp ; yy=$? ;;
328     'HthMxS') testoutput_var $1 "thSI_IceH_max_S" "thSIc H South-max" $2 $refoutp ; yy=$? ;;
329     'HthMxN') testoutput_var $1 "thSI_IceH_max_N" "thSIc H North-max" $2 $refoutp ; yy=$? ;;
330 jmc 1.184 'StrmIc') testoutput_var $1 "STREAMICE_FP_ERR" "StreamIce Solver" $2 $refoutp ; yy=$? ;;
331 jmc 1.175 *) yy=99; echo "WARNING: asking for var=$xx : not recognized !" 1>&2 ;;
332     esac
333     if test $xx = $sVar
334     then allargs="$allargs > $yy <"
335     else allargs="$allargs $yy"
336     fi
337     done
338 jmc 1.94
339     nbVar=`echo $listVar | awk '{print NF}'`
340 jmc 1.175 if [ $nbVar -lt $LEN_CHECK_LIST ] ; then
341     #-- fill line (up to standard length) with dot:
342     adNul=`expr $LEN_CHECK_LIST - $nbVar | awk '{for(i=1;i<=$1;i++){print "."}}'`
343 jmc 1.94 echo $allargs $adNul
344 jmc 1.175 else
345 jmc 1.94 echo $allargs
346 jmc 1.135 fi
347 jmc 1.103 # <-- same processing for adjoint & forward test
348 edhill 1.1 }
349    
350     genmakemodel()
351     {
352     # genmakemodel directory
353 edhill 1.10 if test "x$NOGENMAKE" = xt ; then
354     echo "genmake skipped!"
355     else
356 edhill 1.34 if test "x$BASH" = x ; then
357     GENMAKE2="../../../tools/genmake2"
358     else
359     GENMAKE2="$BASH ../../../tools/genmake2 -bash $BASH"
360     fi
361 edhill 1.10 (
362     cd $1;
363 edhill 1.24 command="$GENMAKE2 -ds -m $MAKE"
364 jmc 1.141 if test "x$MKDEPEND" != x ; then
365     command="$command -makedepend=$MKDEPEND"
366     fi
367 jmc 1.175 if test $KIND = 1 -o $KIND = 2 ; then
368 utke 1.120 command="$command --mods=../code_ad"
369 jmc 1.175 elif test $KIND = 4 ; then
370 utke 1.120 command="$command -adof ../../../tools/adjoint_options/adjoint_oad -mods '../code_oad ../../OpenAD/code_oad_all'"
371     else
372 jmc 1.124 command="$command -mods=../code"
373 edhill 1.24 fi
374 edhill 1.10 if test "x$OPTFILE" != xNONE ; then
375 jmc 1.124 command="$command -optfile=$OPTFILE"
376 edhill 1.10 fi
377 jmc 1.164 if test $OptLev = 1 ; then
378 jmc 1.175 command="$command -ieee"
379     fi
380 jmc 1.164 if test $OptLev = 0 ; then
381     command="$command -devel"
382 edhill 1.10 fi
383 jmc 1.109 if test "x$GSL" = xt ; then
384     command="$command -gsl"
385     fi
386 jmc 1.154 if test "x$MPI" != x0 ; then
387 edhill 1.66 command="$command -mpi"
388     fi
389 jmc 1.122 if test "x$MULTI_THREAD" = xt ; then
390     #- run multi-threaded using OpenMP:
391     command="$command -omp"
392     fi
393 jmc 1.135 if test "x$USE_R4" = xt ; then
394     command="$command -use_r4"
395     fi
396 jmc 1.165 if test "x$EXTRFLG" != x ; then
397     command="$command -extra_flag $EXTRFLG"
398     fi
399 ce107 1.90 if test "x$TS" = xt ; then
400     command="$command -ts"
401     fi
402     if test "x$PAPIS" = xt ; then
403     command="$command -papis"
404 jmc 1.135 else
405 ce107 1.90 if test "x$PCLS" = xt ; then
406     command="$command -pcls"
407     fi
408     fi
409 jmc 1.139 printf 'genmake ... '
410 jmc 1.146 eval $command > genmake.tr_log 2>&1
411 edhill 1.10 RETVAL=$?
412 edhill 1.44 # Reduce the size of the testing emails!
413 edhill 1.47 head -100 Makefile > $CDIR/Makefile_head
414 edhill 1.10 if test "x$RETVAL" != x0 ; then
415 jmc 1.146 tail genmake.tr_log
416 jmc 1.139 echo "genmakemodel: genmake failed"
417 jmc 1.148 cp genmake.log genmake_* genmake.tr_log $CDIR
418 edhill 1.10 return 1
419     else
420 jmc 1.139 echo "successful"
421 edhill 1.1 fi
422 edhill 1.10 )
423     fi
424 edhill 1.1 }
425    
426     makeclean()
427     {
428     # makeclean directory
429 jmc 1.146 if test "x$NODEPEND" = xf ; then rm -f $1/make.tr_log ; fi
430 edhill 1.10 if test "x$NOCLEAN" = xt ; then
431 jmc 1.83 echo "make Clean skipped!"
432 edhill 1.10 else
433     (
434     cd $1;
435 jmc 1.87 #if test -e $OUTPUTFILE ; then rm -f $OUTPUTFILE ; fi
436 edhill 1.10 if test -r Makefile ; then
437 jmc 1.139 printf 'clean build-dir: make Clean ... '
438 jmc 1.146 $MAKE Clean >> make.tr_log 2>&1
439 edhill 1.10 RETVAL=$?
440     if test "x$RETVAL" != x0 ; then
441 jmc 1.146 tail make.tr_log
442 jmc 1.139 echo "makeclean: \"make Clean\" failed"
443 jmc 1.148 cp make.tr_log genmake.log genmake.tr_log $CDIR
444 edhill 1.10 return 1
445     fi
446 jmc 1.139 echo successful
447 jmc 1.127 else
448     echo ''
449 edhill 1.10 fi
450     exit 0
451     )
452     fi
453     }
454    
455 jmc 1.83 run_clean()
456 edhill 1.68 {
457 jmc 1.83 # run_clean directory
458     if test "x$NOCLEAN" = xt ; then
459     echo "run_clean skipped!"
460     else
461 edhill 1.68 (
462     cd $1;
463 jmc 1.139 printf 'clean run-dir ... '
464 jmc 1.83 # part of what is done after "make clean" when doing "make CLEAN"
465     find . -name "*.meta" -exec rm {} \;
466     find . -name "*.data" -exec rm {} \;
467     find . -name "fort.*" -exec rm {} \;
468     find . -type l -exec rm {} \;
469 jmc 1.161 #- should remove executable only if sym-link (alredy done above)
470 jmc 1.172 rm -f $RUNLOG *.txt STD* w2_tile_topology.????.log *diagnostics.log datetime
471 jmc 1.83 rm -rf mnc_test_*
472 jmc 1.175 rm -f *_MIT_CE_000.opt0000 costfunction*0000
473 jmc 1.185 rm -f oad_cp.000.[0-9][0-9][0-9][0-9][0-9]
474 jmc 1.139 echo successful
475 edhill 1.68 exit 0
476     )
477     fi
478     }
479    
480 edhill 1.10 makedependmodel()
481     {
482     # makedependmodel directory
483     if test "x$NODEPEND" = xt ; then
484     echo "make depend skipped!"
485     else
486     (
487     cd $1;
488 jmc 1.139 printf 'make depend ... '
489 jmc 1.146 $MAKE depend >> make.tr_log 2>&1
490 edhill 1.1 RETVAL=$?
491     if test "x$RETVAL" != x0 ; then
492 jmc 1.146 tail make.tr_log
493 jmc 1.139 echo "makedependmodel: make depend failed"
494 jmc 1.148 cp make.tr_log genmake.log genmake.tr_log $CDIR
495 edhill 1.1 return 1
496 edhill 1.10 else
497 jmc 1.139 echo successful
498 edhill 1.1 fi
499 edhill 1.10 )
500     fi
501 edhill 1.1 }
502    
503     makemodel()
504     {
505     # makemodel directory
506     (
507 jmc 1.159 mk_fail=0
508 jmc 1.136 if test "x$NOMAKE" = xt ; then
509     cd $1;
510     if test -x $EXECUTABLE ; then
511     echo "make skipped!"
512     else
513     echo "no executable!"
514 jmc 1.159 mk_fail=3
515 jmc 1.136 fi
516     else
517 edhill 1.1 cd $1;
518     if test -r Makefile ; then
519 jmc 1.139 printf 'make ... '
520 jmc 1.171 if test "x$REPLMAKE" = x ; then
521     $MAKE $TARG >> make.tr_log 2>&1
522     else
523     $REPLMAKE $TARG >> make.tr_log 2>&1
524     fi
525 edhill 1.1 RETVAL=$?
526     if test "x$RETVAL" != x0 ; then
527 jmc 1.146 tail make.tr_log
528 jmc 1.139 echo failed
529 jmc 1.163 cp genmake.log genmake.tr_log $CDIR
530     tail -$NBLINES_MKLOG make.tr_log > $CDIR"/make.tr_log_tail"
531 jmc 1.131 rm -f $EXECUTABLE
532 jmc 1.159 mk_fail=1
533 edhill 1.1 else
534 jmc 1.139 echo successful
535 edhill 1.1 fi
536 jmc 1.159 else
537     echo "no Makefile !"
538     mk_fail=2
539 edhill 1.1 fi
540 jmc 1.136 fi
541 jmc 1.177 if test $KIND = 1 -a -f taf_ftl.log ; then
542 jmc 1.186 head -1 taf_ftl.log >> $CDIR"/summary.txt"
543 jmc 1.177 fi
544 jmc 1.175 if test $KIND = 2 -a -f taf_ad.log ; then
545 jmc 1.186 head -1 taf_ad.log >> $CDIR"/summary.txt"
546     nerr=`grep -c 'TAF *.* ERROR ' taf_ad.log`
547     nwar=`grep -c 'TAF RECOMPUTATION *.* WARNING ' taf_ad.log`
548     if test -f taf_output ; then
549     n2er=`grep -c 'TAF *.* ERROR ' taf_output`
550 jmc 1.189 n3er=`grep -c '\*ERROR\* ' taf_output`
551     nerr=`expr $nerr + $n2er + $n3er`
552 jmc 1.186 fi
553     echo " TAF reports $nerr Errors and $nwar Recomputation Warnings" \
554 jmc 1.158 >> $CDIR"/summary.txt"
555     fi
556 jmc 1.159 if test $mk_fail != 0 ; then return $mk_fail ; fi
557 edhill 1.1 )
558     }
559    
560 jmc 1.154 mk_mpi_size()
561     {
562 jmc 1.173 # mk_mpi_size input_file output_file proc_Nb threads_Nb_X threads_Nb_Y
563 jmc 1.154 #
564 jmc 1.173 # make new SIZE.h (=output_file) from SIZE.h_mpi (=input_file)
565 jmc 1.154 # for an MPI build with no more than proc_Nb processors ;
566 jmc 1.173 # ensure that enough tiles per proc (nSx,nSy) remain for the given
567     # number of threads (nTx,nTy) ;
568     # return the effective number of processors.
569 jmc 1.154
570     inp=$1
571     out=$2
572     np=$3
573 jmc 1.173 tx=$4
574     ty=$5
575 jmc 1.154 tmp=TTT.$$
576    
577 jmc 1.173 # dirX : select with direction to favor in MPI process repartition
578     # dirX=1 : prefer to put more proc in X direction
579     # dirX=0 : prefer to put more proc in Y direction
580     dirX=0
581    
582 jmc 1.154 px=`grep "^ & *nPx *=" $inp | sed "s/^ & *nPx *= *//" | sed 's/, *$//'`
583     py=`grep "^ & *nPy *=" $inp | sed "s/^ & *nPy *= *//" | sed 's/, *$//'`
584     sx=`grep "^ & *nSx *=" $inp | sed "s/^ & *nSx *= *//" | sed 's/, *$//'`
585     sy=`grep "^ & *nSy *=" $inp | sed "s/^ & *nSy *= *//" | sed 's/, *$//'`
586    
587 jmc 1.173 #- for each direction, assume # of threads is a multiple of total number of tiles
588     nx=$px
589     if [ `expr $sx % $tx` -ne 0 -a `expr $sx \* $px % $tx` -eq 0 ] ; then
590     nx=`expr $sx \* $px / $tx`
591     if [ $verbose -gt 1 ]; then
592     echo " change px from $px to $nx to accommodate $tx threads"
593     fi
594     fi
595     ny=$py
596     if [ `expr $sy % $ty` -ne 0 -a `expr $sy \* $py % $ty` -eq 0 ] ; then
597     ny=`expr $sy \* $py / $ty`
598     if [ $verbose -gt 1 ]; then
599     echo " change py from $py to $ny to accommodate $ty threads"
600     fi
601     fi
602 jmc 1.154 #- find the largest divisor of input_file proc Nb, but not larger than $np
603     pp=0
604 jmc 1.155 i=1
605 jmc 1.173 while [ $i -le $nx ] ; do
606     if [ `expr $nx % $i` -eq 0 ] ; then
607 jmc 1.155 j=1
608 jmc 1.173 while [ $j -le $ny ] ; do
609     if [ `expr $ny % $j` -eq 0 ] ; then
610 jmc 1.155 ij=`expr $i \* $j`
611     if [ $ij -gt $pp ] ; then
612 jmc 1.161 flag=1
613     elif [ $ij -eq $pp ] ; then
614     flag=$dirX
615     else
616     flag=0
617     fi
618     if test $flag = 1 ; then
619 jmc 1.155 if [ $ij -le $np ] ; then
620     ix=$i ; jy=$j ; pp=$ij
621     #echo " ix,jy= $ix,$jy"
622     fi
623     fi
624     fi
625     j=`expr $j + 1`
626     done
627 jmc 1.154 fi
628 jmc 1.155 i=`expr $i + 1`
629 jmc 1.154 done
630    
631     #- create new SIZE.h type file:
632     sx=`expr $sx \* $px / $ix`
633     sy=`expr $sy \* $py / $jy`
634     if [ $verbose -gt 1 ]; then
635     echo " px,py,np= $px,$py,$np : New MPI size: px,py= $ix,$jy : sx,sy= $sx,$sy"
636     fi
637     sed "/^ \& *nPx *=/s/[0-9]*,/$ix,/" $inp > $tmp
638     sed "/^ \& *nPy *=/s/[0-9]*,/$jy,/" $tmp > $out
639     sed "/^ \& *nSx *=/s/[0-9]*,/$sx,/" $out > $tmp
640     sed "/^ \& *nSy *=/s/[0-9]*,/$sy,/" $tmp > $out
641     rm -f $tmp
642     return $pp
643     }
644    
645 edhill 1.27 symlink_mpifiles()
646     {
647     # Put special links so that MPI specific files are used
648     # This MUST be invoked between makeclean and makelinks because
649     # the Makefile will link to non-mpi files by default
650    
651     dir=$1
652     code_dir=$2
653 jmc 1.154 build_dir=$dir/$3
654 jmc 1.135
655 edhill 1.27 # These are files that should replace their counter-part when using -mpi
656 jmc 1.154 MPI_FILES=`(cd $dir/$code_dir; find . -name "*_mpi" -print)`
657 edhill 1.27
658 jmc 1.154 for ii in $MPI_FILES ; do
659     i=`echo $ii | sed 's:^\./::'`
660     name=`echo $i | sed 's:_mpi::'`
661     file="../$code_dir/$i"
662     if test $name = 'SIZE.h' ; then file="SIZE.h.mpi" ; fi
663    
664     # Is this an MPI run?
665     if test "x$MPI" = x0 ; then
666     # NO: We undo any _mpi symbolically linked files
667     if test -L $build_dir/$name ; then
668     ( cd $build_dir ; cmp $name $file > /dev/null 2>&1 )
669     RETVAL=$?
670     if test "x$RETVAL" = x0 ; then
671     if [ $verbose -gt 1 ]; then
672     echo " Un-linking $name from ../$code_dir" ; fi
673     rm -f $build_dir/$name
674     fi
675     fi
676     else
677     # YES: We symbolically link these files to the build
678     # dir so long as there is no real file in place
679     ( cd $build_dir ; cmp $name $file > /dev/null 2>&1 )
680 edhill 1.27 RETVAL=$?
681 jmc 1.154 if [ $verbose -gt 1 ]; then echo " cmp $name $file returns: $RETVAL" ; fi
682 edhill 1.27 if test "x$RETVAL" != x0 ; then
683 jmc 1.154 if test -h $build_dir/$name ; then rm -f $build_dir/$name ; fi
684     if test ! -r $build_dir/$name ; then
685     if [ $verbose -gt 1 ]; then echo " Linking $name to $file" ; fi
686     (cd $build_dir; ln -sf $file $name)
687 edhill 1.27 fi
688     fi
689 jmc 1.154 fi
690     done
691 edhill 1.27 }
692    
693 edhill 1.1 linkdata()
694     {
695 jmc 1.83 # linkdata run_dir input_dir_1 input_dir_2 ...
696 edhill 1.1 #
697     # symbolically link data files to run directory
698 jmc 1.83 if test -d $1 ; then
699 edhill 1.12 (
700 jmc 1.83 cd $1 ; shift
701 jmc 1.139 echo 'linkdata from dirs:' $*
702 jmc 1.175 inpMPI=`(cd ../$1 ; find . -name "*.mpi" -print | sed 's:^\./::')`
703 jmc 1.125 for xx in $inpMPI ; do
704     if test -r "../"$1"/"$xx ; then
705 jmc 1.175 # found 1 _mpi sfx file in 1rst input dir and it is readable
706 jmc 1.125 yy=`echo $xx | sed 's:\.mpi$::'`
707 jmc 1.154 if test "x$MPI" = "x0" ; then
708     # not mpi test: remove symbolic link
709     if test -h $yy ; then rm -f $yy ; fi
710     else
711     # mpi test: remove symbolic link & link .mpi sfx file
712 jmc 1.125 if test -h $yy ; then rm -f $yy ; fi
713 jmc 1.135 if test ! -r $yy ; then
714 jmc 1.125 ln -sf "../"$1"/"$xx $yy ;
715 jmc 1.139 printf " $xx" 1>&2
716 jmc 1.125 fi
717     fi
718     fi
719     done
720 jmc 1.83 if test -r "../"$1"/eedata.mth" ; then
721     # found eedata.mth in 1rst input dir and it is readable
722     if test "x$MULTI_THREAD" = "xt" ; then
723     # multi-threaded test: remove symbolic link & link eedata.mth
724     if test -h eedata ; then rm -f eedata ; fi
725 jmc 1.135 if test ! -r eedata ; then
726 jmc 1.83 ln -sf "../"$1"/eedata.mth" eedata ;
727 jmc 1.139 printf ' eedata.mth' 1>&2
728 edhill 1.24 fi
729 jmc 1.83 else
730     # not multi-threaded test: remove eedata symbolic link
731     if test -h eedata ; then rm -f eedata ; fi
732     fi
733     fi
734 jmc 1.108 prevDir='NONE'
735 jmc 1.83 for ldir in $* ; do
736 jmc 1.108 if test -d "../"$ldir -a $ldir != $prevDir ; then
737 jmc 1.175 printf " ldir=${ldir}:" 1>&2
738 jmc 1.83 files=`( cd "../"$ldir ; ls -1 | grep -v CVS )`
739     for i in $files ; do
740     if test ! -d "../"$ldir/$i ; then
741     if test ! -r $i ; then
742     printf ' '$i 1>&2
743     ln -sf "../"$ldir"/"$i $i
744     fi
745     fi
746     done
747 jmc 1.139 printf ' ;' 1>&2
748 jmc 1.83 if test -x "../"$ldir"/"prepare_run ; then
749 jmc 1.139 "../"$ldir"/"prepare_run 1>&2
750     else
751     echo '' 1>&2
752 edhill 1.24 fi
753 jmc 1.82 fi
754 jmc 1.108 prevDir=$ldir
755 jmc 1.83 done
756 edhill 1.12 )
757 edhill 1.1 fi
758     }
759    
760     runmodel()
761     {
762 edhill 1.6 # runmodel directory
763 edhill 1.1 #
764 jmc 1.154 # runs $COMMAND in "directory"
765 edhill 1.6 # (where "$COMMAND" is relative to "directory")
766 edhill 1.1 (
767     cd $1
768 jmc 1.139 printf 'runmodel in %s ... ' $1
769 jmc 1.158 if test "x$MPI" != x0 ; then
770     #- adjust the MPI run command with the right number of Procs
771     #echo '' ; echo " COMMAND='$COMMAND'"
772     COMMAND=`echo $COMMAND | sed "s/ TR_NPROC / $LOC_NPROC /"`
773     if test "x$MPI_MFILE" != x ; then
774     COMMAND=`echo $COMMAND | sed "s/ TR_MFILE / ..\/..\/$LOC_MFILE /"`
775     fi
776     #echo " COMMAND='$COMMAND'"
777     fi
778 jmc 1.134 if test -L $EXECUTABLE ; then
779     if test -x "../"$builddir"/"$EXECUTABLE ; then
780 jmc 1.154 cmp $EXECUTABLE "../"$builddir"/"$EXECUTABLE > /dev/null 2>&1
781     outD=$? ; if test "x$outD" != x0 ; then rm -f $EXECUTABLE ; fi
782 jmc 1.134 else rm -f $EXECUTABLE
783     fi
784 jmc 1.106 fi
785 jmc 1.175 if test ! -x $EXECUTABLE -a -x "../"$builddir"/"$EXECUTABLE ; then
786 jmc 1.119 echo " link" $EXECUTABLE "from dir ../"$builddir > run.log_tmp
787 jmc 1.83 ln -sf "../"$builddir"/"$EXECUTABLE .
788     fi
789 jmc 1.175 if test ! -x $EXECUTABLE ; then
790 jmc 1.156 rm -f $RUNLOG ; touch $RUNLOG
791     if test -f run.log_tmp ; then cat run.log_tmp >> $RUNLOG ; fi
792     echo " no executable:" $EXECUTABLE >> $RUNLOG
793     RETVAL=8
794     ENDVAL=-1
795 jmc 1.75 else
796 jmc 1.175 if test ! -f $OUTPUTFILE -o $OUTPUTFILE -ot $EXECUTABLE ; then
797     # output do not exist or is older than executable:
798 jmc 1.162 rm -f $OUTPUTFILE $RUNLOG ; touch $RUNLOG
799 jmc 1.156 if test -f run.log_tmp ; then cat run.log_tmp >> $RUNLOG ; fi
800 jmc 1.188 #- Divided Adjoint Run:
801     # get the number of additional runs (add_DIVA_runs) from file "run_ADM_DIVA"
802     if test $KIND = 2 -a -f run_ADM_DIVA ; then
803     adm_diva_nb=`sed -n '/^ *add_DIVA_runs\>.*=/p' run_ADM_DIVA | sed 's/ //g'`
804     echo " Divided Adjoint Run: $adm_diva_nb" >> $RUNLOG
805     eval "let $adm_diva_nb"
806     if [ $add_DIVA_runs -ge 1 ] ; then
807     rm -f costf* divided.ctrl snapshot*
808     echo -n "(add_DIVA_runs=$add_DIVA_runs) ... "
809     for ii in `seq 1 $add_DIVA_runs` ; do
810     ( eval $COMMAND ) >> $RUNLOG 2>&1
811     echo " additional DIVA run # $ii : done" >> $RUNLOG
812     mv -f $OUTPUTFILE ${OUTPUTFILE}.diva_${ii}
813     done
814     fi
815     fi
816     #- special DIVA processing ends here
817 jmc 1.156 ( eval $COMMAND ) >> $RUNLOG 2>&1
818     RETVAL=$?
819     ENDVAL=`tail $OUTPUTFILE | grep -c 'PROGRAM MAIN: Execution ended Normally'`
820     if [ $POSTCLEAN -eq 1 -a $ENDVAL -gt 0 ] ; then
821     find . -name "*.meta" -exec rm {} \;
822     find . -name "*.data" -exec rm {} \;
823     rm -rf mnc_test_*
824 jmc 1.83 fi
825 jmc 1.156 else
826     RETVAL=0
827 jmc 1.153 ENDVAL=`tail $OUTPUTFILE | grep -c 'PROGRAM MAIN: Execution ended Normally'`
828 jmc 1.156 touch $RUNLOG
829     if test -f run.log_tmp ; then cat run.log_tmp >> $RUNLOG ; fi
830 jmc 1.175 echo "---------->> $OUTPUTFILE is up to date " >> $RUNLOG 2>&1
831 jmc 1.156 fi
832 jmc 1.75 fi
833 jmc 1.119 rm -f run.log_tmp
834 jmc 1.177 #- in all cases where OutputFile exists, report SIZE and time
835 jmc 1.158 if test -f $OUTPUTFILE ; then
836     grep '(PID\.TID 0000\.0001) n.. =' $OUTPUTFILE \
837 jmc 1.177 | sed 's/(PID.TID 0000.0001) //' >> $CDIR"/summary.txt"
838     grep -A3 'Seconds in section "ALL' $OUTPUTFILE \
839     | sed 's/(PID.TID 0000.0001) //' >> $CDIR"/summary.txt"
840 jmc 1.158 fi
841     if test -s STDERR.0000 ; then cp STDERR.0000 $CDIR"/STDERR.0000" ; fi
842 jmc 1.88 if [ $RETVAL -eq 0 -a $ENDVAL -gt 0 ] ; then
843 jmc 1.139 echo successful
844     printf '=> output from running in %s :\n' $1 1>&2
845     tail $RUNLOG | sed 's/^.*/> &/g' 1>&2
846 edhill 1.6 return 0
847 jmc 1.132 elif [ $RETVAL -ne 0 -a $ENDVAL -gt 0 ] ; then
848     #-- for some weird cases (run is finihed but with error code)
849 jmc 1.139 echo 'finished with error (run:' $RETVAL ' end:' $ENDVAL ')'
850     printf '=> output from running in %s :\n' $1 1>&2
851     tail $RUNLOG | sed 's/^.*/> &/g' 1>&2
852 jmc 1.132 return 0
853 edhill 1.6 else
854 jmc 1.139 echo 'failed (run:' $RETVAL ' end:' $ENDVAL ')'
855     printf '=> output from running in %s :\n' $1 1>&2
856     tail $RUNLOG | sed 's/^.*/> &/g' 1>&2
857 jmc 1.119 cp $RUNLOG $CDIR"/"$RUNLOG
858 edhill 1.6 return 1
859 edhill 1.1 fi
860     )
861     }
862    
863     createcodelet()
864     {
865     # create codelet for comparing model output
866    
867 jmc 1.112 printf "creating the comparison code (using CC=$CC)... "
868 jmc 1.91 cat > tr_cmpnum.c <<EOF
869 edhill 1.22 #include <stdio.h>
870     #include <math.h>
871     int main( int argc, char** argv ) {
872 jmc 1.91 int linnum,cmplin,best,lncnt;
873 edhill 1.52 double a,b,abave,relerr;
874 jmc 1.57 best = -22;
875 adcroft 1.33 lncnt = 0;
876 jmc 1.96 while( 1 & ( (lncnt+=1) < 999 ) ) {
877 edhill 1.22 scanf("%d", &linnum);
878     if (linnum == -1) break;
879     scanf("%lf", &a); scanf("%lf", &b);
880 edhill 1.52 abave = 0.5*(fabs(a)+fabs(b));
881 jmc 1.91 if ( abave == abave ) {
882     if (abave > 0.0) {
883     relerr=fabs(a-b)/abave;
884     if (relerr > 0.0) { cmplin = (int)rint(log10(relerr)); }
885     else { cmplin = -16 ; }
886     best = (best > cmplin) ? best : cmplin; }
887     else { cmplin = -22 ; }
888     /* printf("%d ; %lf ; %lf\n",cmplin,a,b); */
889     }
890     else {
891     /* printf("%lf ; %lf ; %lf\n",abave,a,b); */
892     break; }
893 edhill 1.22 }
894 adcroft 1.33 if (lncnt == 999) best=-29;
895 jmc 1.91 if (linnum != -1) best=-99;
896 edhill 1.22 printf("%d\n", -best);
897     return 0;
898     }
899     EOF
900 jmc 1.91 $CC -o tr_cmpnum tr_cmpnum.c -lm
901 edhill 1.1
902 jmc 1.91 if [ -x ./tr_cmpnum ]; then
903 edhill 1.1 echo "OK"
904     return 0
905     else
906     echo
907 jmc 1.135 echo "ERROR: failed to compile comparison code -- please specify"
908 edhill 1.58 echo " a C compiler using the CC environment variable."
909 edhill 1.1 exit 1
910     fi
911     }
912    
913     formatresults()
914     {
915     # formatresults expt genmake depend make run results*
916    
917     nm=$1
918     printf '%s %s %s %s' $2 $3 $4 $5
919     shift; shift; shift; shift; shift;
920 jmc 1.94 listPrt=$@
921     listRes=`echo $listPrt | sed 's/>//' | sed 's/<//'`
922     xx=`echo $listPrt | sed 's/.*>//' | sed 's/<.*//' | awk '{print $1}'`
923 jmc 1.97 printf '%3s' $listPrt
924 jmc 1.98 # line below does not work on hp-ux_ia64 : do those substitutions later on
925 jmc 1.95 # printf '%3s' $listPrt | sed 's/ 99/ --/g' | sed 's/ > />/' | sed 's/ < /</'
926 jmc 1.135
927 jmc 1.94 if [ $xx = '..' ]; then
928     printf ' N/O '
929     elif [ $xx = '--' ]; then
930     printf ' N/O '
931     elif [ $xx = 99 ]; then
932 edhill 1.1 printf ' N/O '
933     else
934 jmc 1.94 if [ $xx -ge $MATCH_CRIT ]; then
935 edhill 1.1 printf ' pass'
936     else
937     printf ' FAIL'
938     fi
939     fi
940     printf ' %s' $nm
941 jmc 1.186 if test $KIND = 2 ; then
942     #-- apppend taf repport summary:
943     tafrep=`grep -c '^ TAF reports ' $CDIR/summary.txt`
944     if test $tafrep = 1 ; then
945     grep '^ TAF reports ' $CDIR/summary.txt | awk '{printf " (e=%i, w=%i)",$3,$6}'
946     fi
947     fi
948 edhill 1.1 printf '\n'
949 jmc 1.135
950 edhill 1.1 }
951    
952     scandirs()
953     {
954 jmc 1.81 if [ $# -eq 1 ]; then
955     for arg in * ; do
956 jmc 1.175 #test -f $arg/$1 && echo $arg
957     test -f $arg/$1 -o -f $arg/$1.gz && echo $arg
958 jmc 1.81 done
959 edhill 1.1 else
960 jmc 1.81 echo $*
961 edhill 1.1 fi
962     }
963    
964    
965 jmc 1.123 check_eedata()
966     {
967 jmc 1.161 # check_eedata eedata size.h
968 jmc 1.123 if [ $# -eq 2 ] ; then
969 jmc 1.161 if test -f $1 -a -f $2 ; then
970     nx=`grep "^ *nTx *=" $1 | tail -1 | sed 's/^ *nTx *= *//' | sed "s/, *$//"`
971     sx=`grep "^ & *nSx *=" $2 | sed "s/^ & *nSx *=//" | sed 's/, *$//'`
972 jmc 1.123 if test "x$nx" = x ; then
973     rx=10
974     else
975     rx=`expr $sx % $nx`
976     fi
977 jmc 1.161 ny=`grep "^ *nTy *=" $1 | tail -1 | sed 's/^ *nTy *= *//' | sed "s/, *$//"`
978     sy=`grep "^ & *nSy *=" $2 | sed "s/^ & *nSy *=//" | sed 's/, *$//'`
979 jmc 1.123 if test "x$ny" = x ; then
980     ry=20
981     else
982     ry=`expr $sy % $ny`
983     fi
984     echo `expr $rx + $ry`
985 jmc 1.161 else
986     echo '-1'
987     fi
988     elif [ $# -eq 1 ] ; then
989     if test -f $1 ; then
990     nx=`grep "^ *nTx *=" $1 | tail -1 | sed 's/^ *nTx *= *//' | sed "s/, *$//"`
991     if test "x$nx" = x ; then nx=1 ; fi
992     ny=`grep "^ *nTy *=" $1 | tail -1 | sed 's/^ *nTy *= *//' | sed "s/, *$//"`
993     if test "x$ny" = x ; then ny=1 ; fi
994     #echo $nx $ny
995     echo $nx
996     else
997 jmc 1.123 echo '-1'
998 jmc 1.161 fi
999 jmc 1.123 else
1000     echo '-2'
1001     fi
1002    
1003     }
1004    
1005 edhill 1.1 ###############################################################################
1006    
1007    
1008     # Default properties
1009     debug=0
1010     verbose=1
1011 jmc 1.163 NBLINES_MKLOG=16000
1012 edhill 1.10
1013 jmc 1.164 OptLev=1
1014 jmc 1.109 GSL=f
1015 edhill 1.10
1016     CLEANUP=f
1017 jmc 1.133 NORUN=f
1018 edhill 1.10 QUICK=f
1019 jmc 1.136 NOMAKE=f
1020 edhill 1.10 NOGENMAKE=f
1021     NOCLEAN=f
1022     NODEPEND=f
1023 jmc 1.156 POSTCLEAN=0
1024 edhill 1.1
1025 edhill 1.4 BASH=
1026 edhill 1.10 OPTFILE=NONE
1027     ADDRESSES=
1028 edhill 1.1 TESTDIRS=
1029 jmc 1.89 SKIPDIRS=
1030 edhill 1.1 MPACKDIR="../tools/mpack-1.6"
1031 edhill 1.20 HAVE_MPACK=
1032 jmc 1.113 MPACK=
1033 edhill 1.24 COMMAND=
1034 jmc 1.141 MKDEPEND=
1035 edhill 1.59 if test "x$MAKE" = x ; then
1036     MAKE=make
1037     fi
1038 jmc 1.171 REPLMAKE=
1039 edhill 1.59 if test "x$CC" = x ; then
1040     CC=cc
1041     fi
1042 edhill 1.43 JOBS=
1043 jmc 1.165 TARG=
1044 jmc 1.154 MPI=0
1045 jmc 1.156 MPI_MFILE=
1046 jmc 1.83 MULTI_THREAD=f
1047 jmc 1.70 OUTDIR=
1048 edhill 1.40 DELDIR=
1049 jmc 1.135 USE_R4=
1050 jmc 1.165 EXTRFLG=
1051 edhill 1.1
1052 jmc 1.175 #- type of testing (KIND):
1053     # KIND=0 : forward (= default) ; KIND=1 : Tangent Linear with TAF ;
1054     # KIND=2 : Adjoint with TAF ; KIND=4 : Adjoint with OpenAD
1055     KIND=0
1056 edhill 1.24
1057 jmc 1.117 # list of pTracers to check for monitor output
1058 edhill 1.50 PTRACERS_NUM="1 2 3 4 5"
1059 edhill 1.49
1060 jmc 1.147 MATCH_CRIT=10
1061 jmc 1.92
1062 edhill 1.34 printf "parsing options... "
1063 edhill 1.1
1064     ac_prev=
1065     for ac_option ; do
1066    
1067     # If the previous option needs an argument, assign it.
1068     if test -n "$ac_prev"; then
1069     eval "$ac_prev=\$ac_option"
1070     ac_prev=
1071     continue
1072     fi
1073    
1074     ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
1075 jmc 1.135
1076 edhill 1.1 case $ac_option in
1077    
1078 jmc 1.156 -help | --help | -h | --h) usage ;;
1079    
1080     -optfile | --optfile | -of | --of) ac_prev=OPTFILE ;;
1081     -optfile=* | --optfile=* | -of=* | --of=*) OPTFILE=$ac_optarg ;;
1082    
1083     -addr | --addr | -a | --a) ac_prev=ADDRESSES ;;
1084     -addr=* | --addr=* | -a=* | --a=*) ADDRESSES=$ac_optarg ;;
1085     -mpackdir | --mpackdir | -mpd | --mpd) ac_prev=MPACKDIR ;;
1086     -mpackdir=* | --mpackdir=* | -mpd=* | --mpd=*) MPACKDIR=$ac_optarg ;;
1087    
1088     -tdir | --tdir | -t | --t) ac_prev=TESTDIRS ;;
1089     -tdir=* | --tdir=* | -t=* | --t=*) TESTDIRS=$ac_optarg ;;
1090     -skipdir | --skipdir | -skd | --skd) ac_prev=SKIPDIRS ;;
1091     -skipdir=* | --skipdir=* | -skd=* | --skd=*) SKIPDIRS=$ac_optarg ;;
1092    
1093     -bash | --bash | -b | --b) ac_prev=BASH ;;
1094     -bash=* | --bash=* | -b=* | --b=*) BASH=$ac_optarg ;;
1095    
1096     -command | --command | -c | --c) ac_prev=COMMAND ;;
1097     -command=* | --command=* | -c=* | --c=*) COMMAND=$ac_optarg ;;
1098    
1099     -makedepend | --makedepend | -md | --md) ac_prev=MKDEPEND ;;
1100     -makedepend=* | --makedepend=* | -md=* | --md=*) MKDEPEND=$ac_optarg ;;
1101    
1102     -make | --make | -m | --m) ac_prev=MAKE ;;
1103     -make=* | --make=* | -m=* | --m=*) MAKE=$ac_optarg ;;
1104    
1105 jmc 1.171 -repl_mk | --repl_mk ) ac_prev=REPLMAKE ;;
1106     -repl_mk=* | --repl_mk=*) REPLMAKE=$ac_optarg ;;
1107    
1108 jmc 1.156 -odir | --odir) ac_prev=OUTDIR ;;
1109     -odir=* | --odir=*) OUTDIR=$ac_optarg ;;
1110    
1111     -ptracers | --ptracers | -ptr | --ptr) ac_prev=PTRACERS_NUM ;;
1112     -ptracers=* | --ptracers=* | -ptr=* | --ptr=*) PTRACERS_NUM=$ac_optarg ;;
1113 edhill 1.50
1114 jmc 1.92 -match | --match ) ac_prev=MATCH_CRIT ;;
1115     -match=* | --match=* ) MATCH_CRIT=$ac_optarg ;;
1116    
1117 jmc 1.136 -j | --j) ac_prev=JOBS ;;
1118     -j=* | --j=*) JOBS=$ac_optarg ;;
1119 edhill 1.43
1120 jmc 1.165 -ef | --ef) ac_prev=EXTRFLG ;;
1121     -ef=* | --ef=*) EXTRFLG=$ac_optarg ;;
1122    
1123 jmc 1.156 -clean | --clean) CLEANUP=t ; DELDIR=t ;;
1124 edhill 1.10
1125 jmc 1.156 -norun | --norun | -nr | --nr) NORUN=t ;;
1126 jmc 1.165 -obj | --obj ) TARG='obj' ; NORUN=t ;;
1127 jmc 1.156 -runonly | --runonly | -ro | --ro) QUICK=t ; NOMAKE=t ;;
1128     -quick | --quick | -q | --q) QUICK=t ;;
1129     -nogenmake | --nogenmake | -ng | --ng) NOGENMAKE=t ;;
1130     -noclean | --noclean | -nc | --nc) NOCLEAN=t ;;
1131     -nodepend | --nodepend | -nd | --nd) NODEPEND=t ;;
1132 edhill 1.10
1133 jmc 1.156 -postclean | --postclean | -pc | --pc) POSTCLEAN=2 ;;
1134     -deloutp | --deloutp | -do | --do) POSTCLEAN=1 ;;
1135 edhill 1.68
1136 jmc 1.154 -mpi | --mpi) MPI=2 ;;
1137     -MPI | --MPI) ac_prev=MPI ;;
1138     -MPI=* | --MPI=*) MPI=$ac_optarg ;;
1139 edhill 1.10
1140 jmc 1.156 -mfile | --mfile | -mf | --mf) ac_prev=MPI_MFILE ;;
1141     -mfile=* | --mfile=* | -mf=* | --mf=*) MPI_MFILE=$ac_optarg ;;
1142    
1143 jmc 1.83 -mth) MULTI_THREAD=t ;;
1144    
1145 jmc 1.175 -tlm) if test $KIND = 0 ; then KIND=1 ; else
1146     echo "Error: '-tlm', '-adm' and '-oad' are exclusive" ; usage
1147     fi ;;
1148     -adm | -ad) if test $KIND = 0 ; then KIND=2 ; else
1149     echo "Error: '-tlm', '-adm' and '-oad' are exclusive" ; usage
1150     fi ;;
1151     -oad) if test $KIND = 0 ; then KIND=4 ; NODEPEND=t ; else
1152     echo "Error: '-tlm', '-adm' and '-oad' are exclusive" ; usage
1153     fi ;;
1154 utke 1.120
1155 jmc 1.164 -ieee) echo "Warning: ignore option '-ieee' (already the default)"
1156 jmc 1.175 printf " ... " ;;
1157 jmc 1.164 -noieee) echo "Warning: will use option '-fast' instead of '-noieee' (obsolete)"
1158 jmc 1.175 printf " ... " ; OptLev=`expr $OptLev \* 2` ;;
1159 jmc 1.164 -fast) OptLev=`expr $OptLev \* 2` ;;
1160     -devel) OptLev=0 ;;
1161 jmc 1.156 -gsl) GSL=t ;;
1162 edhill 1.10
1163 edhill 1.1 -verbose) verbose=2 ;;
1164     -debug) debug=1 ;;
1165     -quiet) verbose=0 ;;
1166    
1167 edhill 1.40 -deldir | -dd) DELDIR=t ;;
1168    
1169 jmc 1.136 -use_r4|-ur4) USE_R4=t ;;
1170 jmc 1.135
1171 ce107 1.90 -ts) TS=t;;
1172     -papis) PAPIS=t;;
1173     -pcls) PCL=t;;
1174    
1175 jmc 1.156 -*) echo "Error: unrecognized option: "$ac_option
1176     usage ;;
1177     *) echo "Error: unrecognized argument: "$ac_option
1178     usage ;;
1179 jmc 1.135
1180 edhill 1.1 esac
1181 jmc 1.135
1182 edhill 1.1 done
1183    
1184 edhill 1.10 if test "x$QUICK" = xt ; then
1185     NOGENMAKE=t
1186     NOCLEAN=t
1187     NODEPEND=t
1188     fi
1189    
1190 jmc 1.156 #- check length of MPI machine file:
1191     if test "x$MPI" != x0 -a "x$MPI_MFILE" != x ; then
1192     if test -r $MPI_MFILE ; then
1193     nl=`wc -l $MPI_MFILE | awk '{print $1}'`
1194     if [ $nl -lt $MPI ] ; then
1195 jmc 1.175 echo "Error: need at least $MPI nodes (currently only $nl) in MPI_MFILE=$MPI_FILE"
1196     usage
1197 jmc 1.156 fi
1198     if [ $verbose -gt 1 ]; then
1199     echo " MPI_MFILE=$MPI_MFILE : $nl procs for MPI=$MPI run"
1200     fi
1201     else
1202 jmc 1.175 echo "Error: cannot access MPI_MFILE=$MPI_FILE"
1203     usage
1204 jmc 1.156 fi
1205     fi
1206    
1207 jmc 1.99 #- setting for forward or ADM testing
1208 jmc 1.175 if test $KIND = 1 ; then
1209     TARG=ftlall
1210     code_dir=code_ad
1211     inputdir=input_ad
1212     ref_outp="output_tlm.txt"
1213     EXECUTABLE="mitgcmuv_ftl"
1214     elif test $KIND = 2 ; then
1215 jmc 1.168 if test "x$TARG" = xobj ; then TARG=adobj ; else TARG=adall ; fi
1216 jmc 1.99 code_dir=code_ad
1217 jmc 1.108 inputdir=input_ad
1218 jmc 1.99 ref_outp="output_adm.txt"
1219     EXECUTABLE="mitgcmuv_ad"
1220 jmc 1.175 elif test $KIND = 4 ; then
1221 jmc 1.168 TARG=adAll
1222 utke 1.120 code_dir=code_oad
1223     inputdir=input_oad
1224     ref_outp="output_oadm.txt"
1225     EXECUTABLE="mitgcmuv_ad"
1226 jmc 1.99 else
1227 jmc 1.168 if test "x$JOBS" != x ; then TARG="-j $JOBS $TARG" ; fi
1228 jmc 1.99 code_dir=code
1229 jmc 1.108 inputdir=input
1230 jmc 1.99 ref_outp="output.txt"
1231     EXECUTABLE="mitgcmuv"
1232     fi
1233    
1234 jmc 1.142 xx=`echo $TESTDIRS | awk '{print $1}'`
1235 edhill 1.1 if test "x$TESTDIRS" = x ; then
1236 jmc 1.103 LIST=`scandirs results/$ref_outp`
1237 jmc 1.142 elif test $xx = 'start_from' ; then
1238     xx=`echo $TESTDIRS | awk '{print $2}'`
1239     LIST=`scandirs results/$ref_outp | sed -n "/$xx/,$ p"`
1240 jmc 1.84 else
1241     #- expand group of experiments:
1242     LIST=" "
1243     for xx in $TESTDIRS
1244     do
1245     case $xx in
1246 jmc 1.86 'basic') LIST=${LIST}" aim.5l_cs hs94.128x64x5 ideal_2D_oce"
1247     LIST=${LIST}" lab_sea tutorial_baroclinic_gyre"
1248     LIST=${LIST}" tutorial_global_oce_latlon tutorial_plume_on_slope"
1249 jmc 1.84 ;;
1250     'tutorials')
1251     LIST=${LIST}" "`ls | grep 'tutorial_'` ;;
1252     *) LIST=${LIST}" "$xx ;;
1253     esac
1254 jmc 1.135 done
1255 jmc 1.89 fi
1256     #echo 'LIST='${LIST}'<'
1257     #- skip dirs, remove duplicate and non-directory:
1258     TESTDIRS=" "
1259     count=0
1260     for xx in $LIST
1261     do
1262     yy=`echo $SKIPDIRS | grep -c $xx`
1263     if test $yy = 0 ; then
1264 jmc 1.84 if test -d $xx ; then
1265     yy=`echo $TESTDIRS | grep -c $xx`
1266     if test $yy = 0 ; then TESTDIRS=${TESTDIRS}" "$xx ; fi
1267 jmc 1.89 else count=1 ;
1268     echo ""; echo -n " -- skip \"$xx\" (not a directory !)"
1269     fi
1270     else
1271 jmc 1.175 if test $count = 1 ; then echo -n ", \"$xx\""
1272 jmc 1.89 else count=1 ; echo "" ; echo -n " skip: \"$xx\""
1273 jmc 1.84 fi
1274 jmc 1.89 fi
1275 jmc 1.135 done
1276 jmc 1.89 if test $count = 1 ; then echo "" ; echo -n " ... " ; fi
1277 jmc 1.84 #echo 'TESTDIRS='${TESTDIRS}'<'
1278 edhill 1.1
1279 edhill 1.10 if test "x$OPTFILE" = xNONE -a "x$MITGCM_OF" != x ; then
1280     OPTFILE=$MITGCM_OF
1281     fi
1282    
1283 jmc 1.156 LOC_MFILE='tr_mpi_mfile'
1284 jmc 1.146 RUNLOG="run.tr_log"
1285 jmc 1.99 OUTPUTFILE=$ref_outp
1286 jmc 1.87 if test "x$COMMAND" = x ; then
1287 jmc 1.77 COMMAND="./$EXECUTABLE > $OUTPUTFILE"
1288 edhill 1.24 fi
1289 jmc 1.154 if test "x$MPI" != x0 ; then
1290 jmc 1.87 OUTPUTFILE="STDOUT.0000"
1291 edhill 1.24 fi
1292    
1293 jmc 1.76 echo "OK (COMMAND= $COMMAND )"
1294 edhill 1.1
1295 jmc 1.94 # set the Default List of output variables to be checked:
1296     # (use default or load experiment-specific list from file "tr_checklist")
1297     # content : 1rst = main variable used to decide if it pass or FAIL
1298     # others = number of matching digits to be printed in summary.txt
1299 jmc 1.175 if test $KIND = 1 ; then
1300     DEF_CHECK_LIST='tlmGrd tlmCst tlmGrd fwdGrd'
1301     EMPTY_RESULTS='.. .. ..'
1302     LEN_CHECK_LIST=`echo $DEF_CHECK_LIST | sed 's/ [a-zA-Z0-9]*+/&mn &mx &av &sd/g' | awk '{print NF-1}'`
1303     elif test $KIND = 2 -o $KIND = 4 ; then
1304     DEF_CHECK_LIST='AdGrd Cost AdGrd FDGrd'
1305     EMPTY_RESULTS='.. .. ..'
1306     LEN_CHECK_LIST=`echo $DEF_CHECK_LIST | sed 's/ [a-zA-Z0-9]*+/&mn &mx &av &sd/g' | awk '{print NF-1}'`
1307     else
1308 jmc 1.94 DEF_CHECK_LIST='PS PS T+ S+ U+ V+ pt1+ pt2+ pt3+ pt4+ pt5+'
1309     EMPTY_RESULTS='.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..'
1310 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}'`
1311 jmc 1.94 ii=`echo $EMPTY_RESULTS | awk '{print NF}'`
1312 jmc 1.97 EMPTY_RESULTS=$EMPTY_RESULTS`expr $LEN_CHECK_LIST - $ii | awk 'BEGIN{FS=":"}{for(i=1;i<=$1;i++){printf " ."}}'`
1313 jmc 1.94 fi
1314    
1315 edhill 1.1 # create the FORTRAN comparison code
1316 jmc 1.178 if test "x$CLEANUP" = xt -o -x tr_cmpnum ; then
1317 jmc 1.133 echo "skipping comparison code build"
1318     else
1319     createcodelet
1320     fi
1321 edhill 1.1
1322 jmc 1.112 # build the mpack utility (if ADDRESSES = NONE, do it to test the build)
1323     if test "x$ADDRESSES" = x ; then
1324 edhill 1.32 echo "skipping mpack build"
1325     else
1326 edhill 1.31 build_mpack
1327     fi
1328 edhill 1.1
1329     # Create a uniquely named directory to store results
1330 jmc 1.110 CMDLINE=$0
1331 jmc 1.118 for xx in "$@" ; do nw=`echo $xx | wc -w`
1332 jmc 1.180 if test $nw = '1' ; then CMDLINE="$CMDLINE $xx" ; else
1333     nb=`echo $xx | grep -c '='`
1334     if test $nb = 0 ; then CMDLINE="$CMDLINE '$xx'"
1335     else yy=`echo "$xx'" | sed "s/=/='/"` ;
1336     CMDLINE="$CMDLINE $yy" ; fi
1337     fi
1338 jmc 1.118 done
1339     #for xx in "$@" ; do CMDLINE="$CMDLINE '$xx'" ; done
1340 edhill 1.1 MACH=`hostname`
1341 edhill 1.2 UNAMEA=`uname -a`
1342 edhill 1.1 DATE=`date +%Y%m%d`
1343 edhill 1.25 BASE="tr_"$MACH"_"$DATE"_"
1344 jmc 1.70 if test "x$OUTDIR" != x ; then
1345     BASE="tr_"$OUTDIR"_"$DATE"_"
1346 jmc 1.121 else
1347     short_name=`hostname | sed 's/\..*$//'`
1348     BASE="tr_"$short_name"_"$DATE"_"
1349 jmc 1.70 fi
1350 edhill 1.1 DNUM=0
1351     DRESULTS="$BASE$DNUM"
1352     while test -e $DRESULTS ; do
1353     DNUM=$(( $DNUM + 1 ))
1354     DRESULTS="$BASE$DNUM"
1355     done
1356     mkdir $DRESULTS
1357     RETVAL=$?
1358     if test "x$RETVAL" != x0 ; then
1359 edhill 1.20 echo "ERROR: Can't create results directory \"./$DRESULTS\""
1360 edhill 1.1 exit 1
1361     fi
1362     SUMMARY="$DRESULTS/summary.txt"
1363 edhill 1.16 start_date=`date`
1364 edhill 1.17 echo $start_date > $SUMMARY
1365 jmc 1.110 echo 'run:' $CMDLINE >> $SUMMARY
1366     echo 'on :' $UNAMEA >> $SUMMARY
1367 edhill 1.1
1368 edhill 1.11 of_path=
1369 edhill 1.10 if test "x$OPTFILE" != xNONE ; then
1370     if test -r $OPTFILE ; then
1371 edhill 1.11 # get the path
1372     path=${OPTFILE%/*}
1373     if test "x$path" = x ; then
1374     of_path=`pwd`
1375     else
1376     of_path=`( cd $path > /dev/null 2>&1 ; pwd )`
1377     fi
1378     file=${OPTFILE##*/}
1379     OPTFILE=$of_path/$file
1380 edhill 1.21 cp $OPTFILE $DRESULTS
1381     echo >> $SUMMARY
1382     echo " OPTFILE=$OPTFILE" >> $SUMMARY
1383 edhill 1.11 else
1384 jmc 1.179 echo | tee -a $SUMMARY
1385     echo "ERROR: can't read OPTFILE=\"$OPTFILE\"" | tee -a $SUMMARY
1386 edhill 1.21 exit 1
1387 edhill 1.10 fi
1388 edhill 1.21 else
1389     echo >> $SUMMARY
1390 jmc 1.152 echo "No \"OPTFILE\" was specified ; genmake2 found and uses:" >> $SUMMARY
1391     #-note: to be filled later after 1rst run
1392 edhill 1.10 fi
1393     echo
1394     echo >> $SUMMARY
1395 jmc 1.175 if test $KIND = 0 ; then
1396     line_0=`printf '%s %2i' 'default' $MATCH_CRIT`
1397 jmc 1.94 line_0="$line_0 ----T----- ----S----- ----U----- ----V-----"
1398 edhill 1.49 line_1="G D M c m s m s m s m s"
1399 jmc 1.167 line_2="e p a R g m m e . m m e . m m e . m m e ."
1400     line_3="n n k u 2 i a a d i a a d i a a d i a a d"
1401 edhill 1.49 line_4="2 d e n d n x n . n x n . n x n . n x n ."
1402 edhill 1.50 for ii in $PTRACERS_NUM ; do
1403 edhill 1.49 line_0="$line_0 --PTR 0"$ii"--"
1404     line_1="$line_1 m s"
1405     line_2="$line_2 m m e ."
1406     line_3="$line_3 i a a d"
1407     line_4="$line_4 n x n ."
1408     done
1409 jmc 1.175 else
1410     line_0=`printf '%s %2i' 'default ' $MATCH_CRIT`
1411     if test $KIND = 1 ; then
1412 jmc 1.181 #echo "TANGLIN=true" >> $SUMMARY
1413     echo "TangLin generated by TAF" >> $SUMMARY
1414     elif test $KIND = 3 ; then
1415     echo "TangLin generated by OpenAD" >> $SUMMARY
1416     elif test $KIND = 2 ; then
1417     #echo "ADJOINT=true" >> $SUMMARY
1418     echo "Adjoint generated by TAF" >> $SUMMARY
1419     else
1420     echo "Adjoint generated by OpenAD" >> $SUMMARY
1421     fi
1422     if test $KIND = 1 -o $KIND = 3 ; then
1423 jmc 1.175 line_1="G D M C T F"
1424     line_2="e p a R o L D"
1425     else
1426     line_1="G D M C A F"
1427     line_2="e p a R o d D"
1428     fi
1429     line_3="n n k u s G G"
1430     line_4="2 d e n t r r"
1431     echo >> $SUMMARY
1432     fi
1433 jmc 1.178 if test "x$CLEANUP" != xt ; then
1434 edhill 1.49 echo "$line_0" | tee -a $SUMMARY
1435     echo "$line_1" | tee -a $SUMMARY
1436     echo "$line_2" | tee -a $SUMMARY
1437     echo "$line_3" | tee -a $SUMMARY
1438     echo "$line_4" | tee -a $SUMMARY
1439 jmc 1.175 echo "" | tee -a $SUMMARY
1440 jmc 1.178 fi
1441 jmc 1.139 echo "-------------------------------------------------------------------------------"
1442 edhill 1.1
1443 edhill 1.10 # ...and each test directory...
1444     for dir in $TESTDIRS ; do
1445 jmc 1.135
1446 jmc 1.106 # set builddir & rundir:
1447     builddir="build"
1448     if test ! -d $dir/$builddir ; then mkdir $dir/$builddir ; fi
1449     rundir="run"
1450 jmc 1.143 pfxdir="tr_$rundir"
1451 jmc 1.106 if test ! -d $dir/$rundir ; then
1452     rundir=$builddir
1453     fi
1454     CODE_DIR=$dir/$code_dir
1455     BUILD_DIR=$dir/$builddir
1456    
1457 edhill 1.10 # Cleanup only!
1458     if test "x$CLEANUP" = xt ; then
1459 jmc 1.127 echo -n ' --- dir:' $BUILD_DIR ': '
1460     makeclean $BUILD_DIR
1461 jmc 1.145 ( cd $BUILD_DIR
1462     rm -f $EXECUTABLE *.bak
1463 jmc 1.146 rm -f genmake_state genmake_*optfile genmake.log
1464 jmc 1.154 rm -f SIZE.h.mpi genmake.tr_log make.tr_log
1465 jmc 1.145 )
1466 jmc 1.106 if test -d $dir/$rundir/CVS ; then
1467 jmc 1.175 echo -n ' --- dir:' $dir/$rundir ': '
1468 jmc 1.106 run_clean $dir/$rundir
1469 edhill 1.10 fi
1470 jmc 1.143 trdir=`( cd $dir ; find . -type d -name "$pfxdir.*" -print | sed 's/^.\///')`
1471 jmc 1.127 ttd=`echo $trdir | wc -w`
1472     if test $ttd != 0 ; then
1473     echo ' --- rm dir:' $trdir
1474     ( cd $dir ; rm -rf $trdir )
1475     fi
1476 edhill 1.10 continue
1477 edhill 1.1 fi
1478 edhill 1.3
1479 jmc 1.135 # Verify that the testdir exists and contains previous
1480 edhill 1.10 # results in the correct location--or skip this directory!
1481 jmc 1.104 fout=$dir"/results/"$ref_outp
1482 jmc 1.175 #if test ! -r $fout ; then
1483     if test ! -r $fout -a ! -r ${fout}.gz ; then
1484 edhill 1.24 echo "can't read \"$fout\" -- skipping $dir"
1485 edhill 1.10 continue
1486     fi
1487 edhill 1.7
1488 jmc 1.117 # Check for specific files for particular type of run
1489 edhill 1.49
1490 jmc 1.161 if test ! -r $CODE_DIR"/SIZE.h_mpi" -a "x$MPI" != "x0" ; then
1491     echo "can't find \"$CODE_DIR/SIZE.h_mpi\" -- skipping $dir"
1492     continue
1493     fi
1494     if test ! -r $dir"/input/eedata.mth" -a "x$MULTI_THREAD" = "xt" ; then
1495     echo "can't find \"$dir/input/eedata.mth\" -- skipping $dir"
1496     continue
1497     fi
1498    
1499 jmc 1.154 if test "x$MPI" != "x0" ; then
1500 jmc 1.173 ntx=1 ; nty=1
1501 jmc 1.161 if test "x$MULTI_THREAD" = "xt" ; then
1502 jmc 1.174 ff=$dir"/input/eedata.mth"
1503     ntx=`grep "^ *nTx *=" $ff | tail -1 | sed 's/^ *nTx *= *//' | sed "s/, *$//"`
1504     nty=`grep "^ *nTy *=" $ff | tail -1 | sed 's/^ *nTy *= *//' | sed "s/, *$//"`
1505     if test "x$ntx" = x ; then ntx=1 ; fi
1506     if test "x$nty" = x ; then nty=1 ; fi
1507 jmc 1.161 fi
1508     #- create new SIZE.h with no more than '$MPI' Procs
1509 jmc 1.173 mk_mpi_size $CODE_DIR"/SIZE.h_mpi" $BUILD_DIR"/tr_size.mpi" $MPI $ntx $nty
1510 jmc 1.161 LOC_NPROC=$?
1511     ( cd $BUILD_DIR
1512     if test -r SIZE.h.mpi ; then
1513     cmp tr_size.mpi SIZE.h.mpi > /dev/null 2>&1 ; RETVAL=$?
1514     else RETVAL=1
1515     fi
1516     if test "x$RETVAL" = x0 ; then
1517     rm -f tr_size.mpi
1518     else
1519     rm -f SIZE.h.mpi ; mv tr_size.mpi SIZE.h.mpi
1520     fi
1521     )
1522 jmc 1.156 if test "x$MPI_MFILE" != x ; then
1523     #- create new MPI machine-file with the right number of Procs
1524     rm -f $LOC_MFILE
1525     cat $MPI_MFILE | sort | uniq | head -$LOC_NPROC > $LOC_MFILE
1526     nl=`wc -l $LOC_MFILE | awk '{print $1}'`
1527     if [ $nl -lt $LOC_NPROC ] ; then
1528     rm -f $LOC_MFILE
1529     cat $MPI_MFILE | head -$LOC_NPROC > $LOC_MFILE
1530     #sed -n "1,$LOC_NPROC p" $MPI_MFILE > $LOC_MFILE
1531     fi
1532     if [ $verbose -gt 1 ]; then
1533     nl=`wc -l $LOC_MFILE | awk '{print $1}'`
1534     echo " new LOC_MFILE=$LOC_MFILE : $nl procs for LOC_NPROC=$LOC_NPROC"
1535     fi
1536     fi
1537 jmc 1.161 if test "x$MULTI_THREAD" = "xt" ; then
1538     retv=`check_eedata $dir"/input/eedata.mth" $BUILD_DIR"/SIZE.h.mpi"`
1539     if test $retv != 0 ; then
1540     echo "input/eedata.mth tiling misfit -- skipping $dir"
1541     continue
1542     fi
1543 jmc 1.154 fi
1544 jmc 1.123 fi
1545 jmc 1.83
1546     # Check whether there are "extra runs" for this testdir
1547     extra_runs=
1548 jmc 1.133 if test "x$NORUN" = xf ; then
1549 jmc 1.183 ex_run_dirs=`( cd $dir ; ls -d $inputdir.* 2> /dev/null )`
1550 jmc 1.133 fi
1551 jmc 1.108 #echo "ex_run_dirs='$ex_run_dirs'"
1552     for exd in $ex_run_dirs ; do
1553     name=`echo $exd | sed -e "s/$inputdir\.//"`
1554     refExOut=`echo $ref_outp | sed "s/\./.${name}./"`
1555     outf="$dir/results/$refExOut"
1556 jmc 1.175 if test -r $outf -o -r ${outf}.gz ; then
1557 jmc 1.135 if test "x$MULTI_THREAD" = "xt" ; then
1558 jmc 1.123 if test -r $dir"/"$exd"/eedata.mth" ; then
1559 jmc 1.154 if test "x$MPI" = "x0" ; then
1560     extra_runs="$extra_runs $name"
1561     else
1562 jmc 1.161 retv=`check_eedata $dir"/"$exd"/eedata.mth" $BUILD_DIR"/SIZE.h.mpi"`
1563 jmc 1.123 if test $retv = 0 ; then
1564 jmc 1.83 extra_runs="$extra_runs $name"
1565 jmc 1.123 else
1566     echo $exd"/eedata.mth tiling misfit -- skipping $dir"
1567 jmc 1.83 fi
1568 jmc 1.123 fi
1569     #else echo $dir"/"$exd"/eedata.mth: not found"
1570 jmc 1.83 fi
1571 jmc 1.123 else
1572     extra_runs="$extra_runs $name"
1573     fi
1574 jmc 1.108 fi
1575     done
1576 edhill 1.28
1577     echo
1578 jmc 1.135 if test "x$extra_runs" = "x" ; then
1579 jmc 1.175 echo "Experiment: $dir"
1580 jmc 1.83 else
1581 jmc 1.175 echo "Experiment: $dir ; extra_runs=$extra_runs"
1582 jmc 1.83 fi
1583 edhill 1.28 echo
1584     unset genmake makedepend make run
1585 jmc 1.94 results=$EMPTY_RESULTS
1586 edhill 1.10
1587 jmc 1.158 # Create an output dir & summary.txt file for each tested experiment (tdir)
1588 jmc 1.138 locDIR=$DRESULTS"/"$dir
1589     mkdir $locDIR
1590 jmc 1.158 #- report to this experiment local summary file ---
1591     echo "DATE='$DATE' ; tdir='$dir'" > $locDIR"/summary.txt"
1592     echo "MACH='$MACH'" >> $locDIR"/summary.txt"
1593     echo "UNAMEA='$UNAMEA'" >> $locDIR"/summary.txt"
1594 jmc 1.138 CDIR=`pwd`"/$locDIR"
1595 jmc 1.135
1596 jmc 1.133 if test "x$NORUN" = xt ; then
1597     run=N
1598     genmakemodel $dir/$builddir && genmake=Y \
1599     && makeclean $dir/$builddir \
1600 jmc 1.175 && symlink_mpifiles $dir $code_dir $builddir \
1601 jmc 1.133 && makedependmodel $dir/$builddir && makedepend=Y \
1602     && makemodel $dir/$builddir && make=Y
1603 edhill 1.10 else
1604 edhill 1.1 genmakemodel $dir/$builddir && genmake=Y \
1605     && makeclean $dir/$builddir \
1606 jmc 1.175 && symlink_mpifiles $dir $code_dir $builddir \
1607 edhill 1.1 && makedependmodel $dir/$builddir && makedepend=Y \
1608     && makemodel $dir/$builddir && make=Y \
1609 jmc 1.139 && run_clean $dir/$rundir \
1610 jmc 1.140 && linkdata $dir/$rundir $inputdir \
1611 edhill 1.12 && runmodel $dir/$rundir && run=Y \
1612 jmc 1.99 && results=`testoutput_run $dir $rundir $ref_outp`
1613 edhill 1.10 fi
1614 jmc 1.139 #echo "results='$results'"
1615 jmc 1.135
1616 edhill 1.24 fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1617 jmc 1.139 echo 1>&2
1618 jmc 1.175 echo "$fres" | sed 's/ 99/ --/g' | sed 's/ > />/' | sed 's/ < /</' >> $SUMMARY
1619 jmc 1.138 echo "fresults='$fres'" | sed 's/ 99/ --/g' >> $locDIR"/summary.txt"
1620 edhill 1.34
1621     for ex in $extra_runs ; do
1622 jmc 1.73 unset run
1623 jmc 1.175 results=$EMPTY_RESULTS
1624 jmc 1.106 # reference output file
1625     refExOut=`echo $ref_outp | sed "s/\./.${ex}./g"`
1626 jmc 1.158 # Create an output dir & summary.txt file for each extra run (tdir.ex)
1627 jmc 1.138 locDIR=$DRESULTS"/"$dir"."$ex
1628     mkdir $locDIR
1629 jmc 1.158 #- report to this experiment local summary file ---
1630     echo "DATE='$DATE' ; tdir='$dir.$ex'" > $locDIR"/summary.txt"
1631     #echo "MACH='$MACH'" >> $locDIR"/summary.txt"
1632     #echo "UNAMEA='$UNAMEA'" >> $locDIR"/summary.txt"
1633 jmc 1.138 CDIR=`pwd`"/$locDIR"
1634 jmc 1.143 test ! -e "$dir/$pfxdir.$ex" && mkdir "$dir/$pfxdir.$ex"
1635     run_clean $dir/$pfxdir.$ex
1636     linkdata $dir/$pfxdir.$ex $inputdir.$ex $inputdir
1637     runmodel $dir/$pfxdir.$ex && run=Y \
1638     && results=`testoutput_run $dir $pfxdir.$ex $refExOut`
1639 jmc 1.186 fres=`formatresults $dir.$ex ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1640 jmc 1.139 echo 1>&2
1641 jmc 1.100 echo "$fres" | sed 's/ 99/ --/g' | sed 's/ > />/' | sed 's/ < /</' >> $SUMMARY
1642 jmc 1.138 echo "fresults='$fres'" | sed 's/ 99/ --/g' >> $locDIR"/summary.txt"
1643 jmc 1.156 if test "x$POSTCLEAN" = x2 ; then
1644 jmc 1.143 run_clean $dir/$pfxdir.$ex
1645 jmc 1.83 fi
1646 edhill 1.34 done
1647 edhill 1.68
1648 jmc 1.176 if test ! -f $DRESULTS"/"genmake_state ; then
1649 jmc 1.137 if test -f $dir/$builddir/Makefile ; then
1650     mkOpt=`grep '^# OPTFILE=' $dir/$builddir/Makefile 2>/dev/null | head -1 | sed 's/^# //'`
1651     echo "from '$dir/$builddir/Makefile', extract:" > $DRESULTS/genmake_state
1652     sed -n '/^# executed by:/,+1 p' $dir/$builddir/Makefile >> $DRESULTS/genmake_state
1653 jmc 1.151 echo " $mkOpt" >> $DRESULTS/genmake_state
1654 jmc 1.152 if test "x$OPTFILE" = xNONE ; then
1655     eval $mkOpt
1656     sed "/^No \"OPTFILE\" was specified ; genmake2/a\ OPTFILE=${OPTFILE}"\
1657 jmc 1.176 $SUMMARY > tmp.tr_log
1658 jmc 1.152 RETVAL=$?
1659     if test "x$RETVAL" = x0 ; then rm -f $SUMMARY
1660 jmc 1.176 cp tmp.tr_log $SUMMARY
1661     else rm -f tmp.tr_log
1662 jmc 1.152 fi
1663     fi
1664 jmc 1.150 gmkLog=$dir/$builddir/genmake.log
1665 jmc 1.176 if test -r $gmkLog ; then
1666     grep '^Get compiler version using:' $gmkLog > /dev/null 2>&1
1667     RETVAL=$?
1668     if test "x$RETVAL" = x0 ; then
1669     echo -n "from '$gmkLog', " >> $DRESULTS/genmake_state
1670     echo "extract compiler version:" >> $DRESULTS/genmake_state
1671     sed -n '/Get compiler version/,/<-- compiler version/p' \
1672     $gmkLog | grep -v '^... compiler version ' > tmp.tr_log
1673     sed -n '1p' tmp.tr_log >> $DRESULTS/genmake_state
1674     sed -n '2,/^$/p' tmp.tr_log | sed '/^$/d' | sed 's/^./ &/' \
1675     >> $DRESULTS/genmake_state
1676     rm -f tmp.tr_log
1677     fi
1678     echo -n "from '$gmkLog', " >> $DRESULTS/genmake_state
1679     echo "get NETCDF & LAPACK settings:" >> $DRESULTS/genmake_state
1680     sed -n '/set HAVE_NETCDF=/p' $gmkLog >> $DRESULTS/genmake_state
1681     sed -n '/set HAVE_LAPACK=/p' $gmkLog >> $DRESULTS/genmake_state
1682 jmc 1.150 fi
1683 jmc 1.137 fi
1684     fi
1685 jmc 1.83 #postclean $dir/$builddir
1686 jmc 1.156 if test "x$POSTCLEAN" = x2 ; then
1687 jmc 1.175 makeclean $dir/$builddir \
1688     && run_clean $dir/$rundir
1689 jmc 1.83 fi
1690 jmc 1.156 if test "x$MPI" != x0 -a "x$MPI_MFILE" != x ; then rm -f $LOC_MFILE ; fi
1691 jmc 1.135
1692 edhill 1.10 echo "-------------------------------------------------------------------------------"
1693 jmc 1.135
1694 edhill 1.1 done
1695    
1696 edhill 1.34 printf "Start time: " >> $SUMMARY
1697 jmc 1.114 echo "$start_date" >> $SUMMARY
1698 edhill 1.34 printf "End time: " >> $SUMMARY
1699 edhill 1.13 date >> $SUMMARY
1700 edhill 1.20
1701     # If addresses were supplied and mpack built successfully, then try
1702     # to send email using mpack.
1703     if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then
1704     echo "No results email was sent."
1705     else
1706     if test "x$HAVE_MPACK" = xt ; then
1707     tar -cf $DRESULTS".tar" $DRESULTS > /dev/null 2>&1 \
1708     && gzip $DRESULTS".tar" \
1709 edhill 1.44 && $MPACK -s MITgcm-test -m 3555000 $DRESULTS".tar.gz" $ADDRESSES
1710 edhill 1.20 RETVAL=$?
1711     if test "x$RETVAL" != x0 ; then
1712     echo
1713     echo "Warning: The tar, gzip, & mpack step failed. Please send email"
1714     echo " to <MITgcm-support@mitgcm.org> for help. You may copy the "
1715     echo " summary of results from the directory \"$DRESULTS\"."
1716     echo
1717     else
1718     echo
1719     echo "An email containing results was sent to the following addresses:"
1720     echo " \"$ADDRESSES\""
1721     echo
1722 jmc 1.129 test -f $DRESULTS".tar" && rm -f $DRESULTS".tar"
1723     test -f $DRESULTS".tar.gz" && rm -f $DRESULTS".tar.gz"
1724 edhill 1.20 fi
1725     fi
1726     fi
1727 edhill 1.13
1728 jmc 1.133 if test "x$QUICK" = xf -a "x$NORUN" = xf ; then
1729     rm -f tr_cmpnum.c tr_cmpnum
1730     fi
1731 edhill 1.1
1732 edhill 1.12 if test "x$CLEANUP" != xt ; then
1733 jmc 1.102 cat $SUMMARY | sed 's/ \. \. \. \. \. \. \. \. \. \. \. \. //'
1734 edhill 1.25 if test -e tr_out.txt ; then
1735 jmc 1.175 mv tr_out.txt tr_out.txt.old
1736 edhill 1.14 fi
1737 jmc 1.103 cat $SUMMARY | sed '/^[YN] [YN] [YN] [YN]/ s/ \. //g' > tr_out.txt
1738 edhill 1.12 fi
1739 edhill 1.1
1740 edhill 1.40 if test "x$DELDIR" = xt ; then
1741     rm -rf $DRESULTS
1742     fi
1743 jmc 1.178 echo "======== End of testreport execution ========"

  ViewVC Help
Powered by ViewVC 1.1.22