/[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.188 - (hide annotations) (download)
Fri Jul 19 18:49:33 2013 UTC (10 years, 8 months ago) by jmc
Branch: MAIN
Changes since 1.187: +18 -7 lines
changes for Divided Adjoint Run: when file "run_ADM_DIVA" is present,
 perform additional runs (number of additional runs is "add_DIVA_runs" taken
 from file run_ADM_DIVA ; should match "nchklev_3" in file "code_ad/tamc.h")

1 edhill 1.19 #! /usr/bin/env bash
2 edhill 1.1 #
3 jmc 1.188 # $Header: /u/gcmpack/MITgcm/verification/testreport,v 1.187 2013/07/18 22:11:58 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     nerr=`expr $nerr + $n2er`
551     fi
552     echo " TAF reports $nerr Errors and $nwar Recomputation Warnings" \
553 jmc 1.158 >> $CDIR"/summary.txt"
554     fi
555 jmc 1.159 if test $mk_fail != 0 ; then return $mk_fail ; fi
556 edhill 1.1 )
557     }
558    
559 jmc 1.154 mk_mpi_size()
560     {
561 jmc 1.173 # mk_mpi_size input_file output_file proc_Nb threads_Nb_X threads_Nb_Y
562 jmc 1.154 #
563 jmc 1.173 # make new SIZE.h (=output_file) from SIZE.h_mpi (=input_file)
564 jmc 1.154 # for an MPI build with no more than proc_Nb processors ;
565 jmc 1.173 # ensure that enough tiles per proc (nSx,nSy) remain for the given
566     # number of threads (nTx,nTy) ;
567     # return the effective number of processors.
568 jmc 1.154
569     inp=$1
570     out=$2
571     np=$3
572 jmc 1.173 tx=$4
573     ty=$5
574 jmc 1.154 tmp=TTT.$$
575    
576 jmc 1.173 # dirX : select with direction to favor in MPI process repartition
577     # dirX=1 : prefer to put more proc in X direction
578     # dirX=0 : prefer to put more proc in Y direction
579     dirX=0
580    
581 jmc 1.154 px=`grep "^ & *nPx *=" $inp | sed "s/^ & *nPx *= *//" | sed 's/, *$//'`
582     py=`grep "^ & *nPy *=" $inp | sed "s/^ & *nPy *= *//" | sed 's/, *$//'`
583     sx=`grep "^ & *nSx *=" $inp | sed "s/^ & *nSx *= *//" | sed 's/, *$//'`
584     sy=`grep "^ & *nSy *=" $inp | sed "s/^ & *nSy *= *//" | sed 's/, *$//'`
585    
586 jmc 1.173 #- for each direction, assume # of threads is a multiple of total number of tiles
587     nx=$px
588     if [ `expr $sx % $tx` -ne 0 -a `expr $sx \* $px % $tx` -eq 0 ] ; then
589     nx=`expr $sx \* $px / $tx`
590     if [ $verbose -gt 1 ]; then
591     echo " change px from $px to $nx to accommodate $tx threads"
592     fi
593     fi
594     ny=$py
595     if [ `expr $sy % $ty` -ne 0 -a `expr $sy \* $py % $ty` -eq 0 ] ; then
596     ny=`expr $sy \* $py / $ty`
597     if [ $verbose -gt 1 ]; then
598     echo " change py from $py to $ny to accommodate $ty threads"
599     fi
600     fi
601 jmc 1.154 #- find the largest divisor of input_file proc Nb, but not larger than $np
602     pp=0
603 jmc 1.155 i=1
604 jmc 1.173 while [ $i -le $nx ] ; do
605     if [ `expr $nx % $i` -eq 0 ] ; then
606 jmc 1.155 j=1
607 jmc 1.173 while [ $j -le $ny ] ; do
608     if [ `expr $ny % $j` -eq 0 ] ; then
609 jmc 1.155 ij=`expr $i \* $j`
610     if [ $ij -gt $pp ] ; then
611 jmc 1.161 flag=1
612     elif [ $ij -eq $pp ] ; then
613     flag=$dirX
614     else
615     flag=0
616     fi
617     if test $flag = 1 ; then
618 jmc 1.155 if [ $ij -le $np ] ; then
619     ix=$i ; jy=$j ; pp=$ij
620     #echo " ix,jy= $ix,$jy"
621     fi
622     fi
623     fi
624     j=`expr $j + 1`
625     done
626 jmc 1.154 fi
627 jmc 1.155 i=`expr $i + 1`
628 jmc 1.154 done
629    
630     #- create new SIZE.h type file:
631     sx=`expr $sx \* $px / $ix`
632     sy=`expr $sy \* $py / $jy`
633     if [ $verbose -gt 1 ]; then
634     echo " px,py,np= $px,$py,$np : New MPI size: px,py= $ix,$jy : sx,sy= $sx,$sy"
635     fi
636     sed "/^ \& *nPx *=/s/[0-9]*,/$ix,/" $inp > $tmp
637     sed "/^ \& *nPy *=/s/[0-9]*,/$jy,/" $tmp > $out
638     sed "/^ \& *nSx *=/s/[0-9]*,/$sx,/" $out > $tmp
639     sed "/^ \& *nSy *=/s/[0-9]*,/$sy,/" $tmp > $out
640     rm -f $tmp
641     return $pp
642     }
643    
644 edhill 1.27 symlink_mpifiles()
645     {
646     # Put special links so that MPI specific files are used
647     # This MUST be invoked between makeclean and makelinks because
648     # the Makefile will link to non-mpi files by default
649    
650     dir=$1
651     code_dir=$2
652 jmc 1.154 build_dir=$dir/$3
653 jmc 1.135
654 edhill 1.27 # These are files that should replace their counter-part when using -mpi
655 jmc 1.154 MPI_FILES=`(cd $dir/$code_dir; find . -name "*_mpi" -print)`
656 edhill 1.27
657 jmc 1.154 for ii in $MPI_FILES ; do
658     i=`echo $ii | sed 's:^\./::'`
659     name=`echo $i | sed 's:_mpi::'`
660     file="../$code_dir/$i"
661     if test $name = 'SIZE.h' ; then file="SIZE.h.mpi" ; fi
662    
663     # Is this an MPI run?
664     if test "x$MPI" = x0 ; then
665     # NO: We undo any _mpi symbolically linked files
666     if test -L $build_dir/$name ; then
667     ( cd $build_dir ; cmp $name $file > /dev/null 2>&1 )
668     RETVAL=$?
669     if test "x$RETVAL" = x0 ; then
670     if [ $verbose -gt 1 ]; then
671     echo " Un-linking $name from ../$code_dir" ; fi
672     rm -f $build_dir/$name
673     fi
674     fi
675     else
676     # YES: We symbolically link these files to the build
677     # dir so long as there is no real file in place
678     ( cd $build_dir ; cmp $name $file > /dev/null 2>&1 )
679 edhill 1.27 RETVAL=$?
680 jmc 1.154 if [ $verbose -gt 1 ]; then echo " cmp $name $file returns: $RETVAL" ; fi
681 edhill 1.27 if test "x$RETVAL" != x0 ; then
682 jmc 1.154 if test -h $build_dir/$name ; then rm -f $build_dir/$name ; fi
683     if test ! -r $build_dir/$name ; then
684     if [ $verbose -gt 1 ]; then echo " Linking $name to $file" ; fi
685     (cd $build_dir; ln -sf $file $name)
686 edhill 1.27 fi
687     fi
688 jmc 1.154 fi
689     done
690 edhill 1.27 }
691    
692 edhill 1.1 linkdata()
693     {
694 jmc 1.83 # linkdata run_dir input_dir_1 input_dir_2 ...
695 edhill 1.1 #
696     # symbolically link data files to run directory
697 jmc 1.83 if test -d $1 ; then
698 edhill 1.12 (
699 jmc 1.83 cd $1 ; shift
700 jmc 1.139 echo 'linkdata from dirs:' $*
701 jmc 1.175 inpMPI=`(cd ../$1 ; find . -name "*.mpi" -print | sed 's:^\./::')`
702 jmc 1.125 for xx in $inpMPI ; do
703     if test -r "../"$1"/"$xx ; then
704 jmc 1.175 # found 1 _mpi sfx file in 1rst input dir and it is readable
705 jmc 1.125 yy=`echo $xx | sed 's:\.mpi$::'`
706 jmc 1.154 if test "x$MPI" = "x0" ; then
707     # not mpi test: remove symbolic link
708     if test -h $yy ; then rm -f $yy ; fi
709     else
710     # mpi test: remove symbolic link & link .mpi sfx file
711 jmc 1.125 if test -h $yy ; then rm -f $yy ; fi
712 jmc 1.135 if test ! -r $yy ; then
713 jmc 1.125 ln -sf "../"$1"/"$xx $yy ;
714 jmc 1.139 printf " $xx" 1>&2
715 jmc 1.125 fi
716     fi
717     fi
718     done
719 jmc 1.83 if test -r "../"$1"/eedata.mth" ; then
720     # found eedata.mth in 1rst input dir and it is readable
721     if test "x$MULTI_THREAD" = "xt" ; then
722     # multi-threaded test: remove symbolic link & link eedata.mth
723     if test -h eedata ; then rm -f eedata ; fi
724 jmc 1.135 if test ! -r eedata ; then
725 jmc 1.83 ln -sf "../"$1"/eedata.mth" eedata ;
726 jmc 1.139 printf ' eedata.mth' 1>&2
727 edhill 1.24 fi
728 jmc 1.83 else
729     # not multi-threaded test: remove eedata symbolic link
730     if test -h eedata ; then rm -f eedata ; fi
731     fi
732     fi
733 jmc 1.108 prevDir='NONE'
734 jmc 1.83 for ldir in $* ; do
735 jmc 1.108 if test -d "../"$ldir -a $ldir != $prevDir ; then
736 jmc 1.175 printf " ldir=${ldir}:" 1>&2
737 jmc 1.83 files=`( cd "../"$ldir ; ls -1 | grep -v CVS )`
738     for i in $files ; do
739     if test ! -d "../"$ldir/$i ; then
740     if test ! -r $i ; then
741     printf ' '$i 1>&2
742     ln -sf "../"$ldir"/"$i $i
743     fi
744     fi
745     done
746 jmc 1.139 printf ' ;' 1>&2
747 jmc 1.83 if test -x "../"$ldir"/"prepare_run ; then
748 jmc 1.139 "../"$ldir"/"prepare_run 1>&2
749     else
750     echo '' 1>&2
751 edhill 1.24 fi
752 jmc 1.82 fi
753 jmc 1.108 prevDir=$ldir
754 jmc 1.83 done
755 edhill 1.12 )
756 edhill 1.1 fi
757     }
758    
759     runmodel()
760     {
761 edhill 1.6 # runmodel directory
762 edhill 1.1 #
763 jmc 1.154 # runs $COMMAND in "directory"
764 edhill 1.6 # (where "$COMMAND" is relative to "directory")
765 edhill 1.1 (
766     cd $1
767 jmc 1.139 printf 'runmodel in %s ... ' $1
768 jmc 1.158 if test "x$MPI" != x0 ; then
769     #- adjust the MPI run command with the right number of Procs
770     #echo '' ; echo " COMMAND='$COMMAND'"
771     COMMAND=`echo $COMMAND | sed "s/ TR_NPROC / $LOC_NPROC /"`
772     if test "x$MPI_MFILE" != x ; then
773     COMMAND=`echo $COMMAND | sed "s/ TR_MFILE / ..\/..\/$LOC_MFILE /"`
774     fi
775     #echo " COMMAND='$COMMAND'"
776     fi
777 jmc 1.134 if test -L $EXECUTABLE ; then
778     if test -x "../"$builddir"/"$EXECUTABLE ; then
779 jmc 1.154 cmp $EXECUTABLE "../"$builddir"/"$EXECUTABLE > /dev/null 2>&1
780     outD=$? ; if test "x$outD" != x0 ; then rm -f $EXECUTABLE ; fi
781 jmc 1.134 else rm -f $EXECUTABLE
782     fi
783 jmc 1.106 fi
784 jmc 1.175 if test ! -x $EXECUTABLE -a -x "../"$builddir"/"$EXECUTABLE ; then
785 jmc 1.119 echo " link" $EXECUTABLE "from dir ../"$builddir > run.log_tmp
786 jmc 1.83 ln -sf "../"$builddir"/"$EXECUTABLE .
787     fi
788 jmc 1.175 if test ! -x $EXECUTABLE ; then
789 jmc 1.156 rm -f $RUNLOG ; touch $RUNLOG
790     if test -f run.log_tmp ; then cat run.log_tmp >> $RUNLOG ; fi
791     echo " no executable:" $EXECUTABLE >> $RUNLOG
792     RETVAL=8
793     ENDVAL=-1
794 jmc 1.75 else
795 jmc 1.175 if test ! -f $OUTPUTFILE -o $OUTPUTFILE -ot $EXECUTABLE ; then
796     # output do not exist or is older than executable:
797 jmc 1.162 rm -f $OUTPUTFILE $RUNLOG ; touch $RUNLOG
798 jmc 1.156 if test -f run.log_tmp ; then cat run.log_tmp >> $RUNLOG ; fi
799 jmc 1.188 #- Divided Adjoint Run:
800     # get the number of additional runs (add_DIVA_runs) from file "run_ADM_DIVA"
801     if test $KIND = 2 -a -f run_ADM_DIVA ; then
802     adm_diva_nb=`sed -n '/^ *add_DIVA_runs\>.*=/p' run_ADM_DIVA | sed 's/ //g'`
803     echo " Divided Adjoint Run: $adm_diva_nb" >> $RUNLOG
804     eval "let $adm_diva_nb"
805     if [ $add_DIVA_runs -ge 1 ] ; then
806     rm -f costf* divided.ctrl snapshot*
807     echo -n "(add_DIVA_runs=$add_DIVA_runs) ... "
808     for ii in `seq 1 $add_DIVA_runs` ; do
809     ( eval $COMMAND ) >> $RUNLOG 2>&1
810     echo " additional DIVA run # $ii : done" >> $RUNLOG
811     mv -f $OUTPUTFILE ${OUTPUTFILE}.diva_${ii}
812     done
813     fi
814     fi
815     #- special DIVA processing ends here
816 jmc 1.156 ( eval $COMMAND ) >> $RUNLOG 2>&1
817     RETVAL=$?
818     ENDVAL=`tail $OUTPUTFILE | grep -c 'PROGRAM MAIN: Execution ended Normally'`
819     if [ $POSTCLEAN -eq 1 -a $ENDVAL -gt 0 ] ; then
820     find . -name "*.meta" -exec rm {} \;
821     find . -name "*.data" -exec rm {} \;
822     rm -rf mnc_test_*
823 jmc 1.83 fi
824 jmc 1.156 else
825     RETVAL=0
826 jmc 1.153 ENDVAL=`tail $OUTPUTFILE | grep -c 'PROGRAM MAIN: Execution ended Normally'`
827 jmc 1.156 touch $RUNLOG
828     if test -f run.log_tmp ; then cat run.log_tmp >> $RUNLOG ; fi
829 jmc 1.175 echo "---------->> $OUTPUTFILE is up to date " >> $RUNLOG 2>&1
830 jmc 1.156 fi
831 jmc 1.75 fi
832 jmc 1.119 rm -f run.log_tmp
833 jmc 1.177 #- in all cases where OutputFile exists, report SIZE and time
834 jmc 1.158 if test -f $OUTPUTFILE ; then
835     grep '(PID\.TID 0000\.0001) n.. =' $OUTPUTFILE \
836 jmc 1.177 | sed 's/(PID.TID 0000.0001) //' >> $CDIR"/summary.txt"
837     grep -A3 'Seconds in section "ALL' $OUTPUTFILE \
838     | sed 's/(PID.TID 0000.0001) //' >> $CDIR"/summary.txt"
839 jmc 1.158 fi
840     if test -s STDERR.0000 ; then cp STDERR.0000 $CDIR"/STDERR.0000" ; fi
841 jmc 1.88 if [ $RETVAL -eq 0 -a $ENDVAL -gt 0 ] ; then
842 jmc 1.139 echo successful
843     printf '=> output from running in %s :\n' $1 1>&2
844     tail $RUNLOG | sed 's/^.*/> &/g' 1>&2
845 edhill 1.6 return 0
846 jmc 1.132 elif [ $RETVAL -ne 0 -a $ENDVAL -gt 0 ] ; then
847     #-- for some weird cases (run is finihed but with error code)
848 jmc 1.139 echo 'finished with error (run:' $RETVAL ' end:' $ENDVAL ')'
849     printf '=> output from running in %s :\n' $1 1>&2
850     tail $RUNLOG | sed 's/^.*/> &/g' 1>&2
851 jmc 1.132 return 0
852 edhill 1.6 else
853 jmc 1.139 echo 'failed (run:' $RETVAL ' end:' $ENDVAL ')'
854     printf '=> output from running in %s :\n' $1 1>&2
855     tail $RUNLOG | sed 's/^.*/> &/g' 1>&2
856 jmc 1.119 cp $RUNLOG $CDIR"/"$RUNLOG
857 edhill 1.6 return 1
858 edhill 1.1 fi
859     )
860     }
861    
862     createcodelet()
863     {
864     # create codelet for comparing model output
865    
866 jmc 1.112 printf "creating the comparison code (using CC=$CC)... "
867 jmc 1.91 cat > tr_cmpnum.c <<EOF
868 edhill 1.22 #include <stdio.h>
869     #include <math.h>
870     int main( int argc, char** argv ) {
871 jmc 1.91 int linnum,cmplin,best,lncnt;
872 edhill 1.52 double a,b,abave,relerr;
873 jmc 1.57 best = -22;
874 adcroft 1.33 lncnt = 0;
875 jmc 1.96 while( 1 & ( (lncnt+=1) < 999 ) ) {
876 edhill 1.22 scanf("%d", &linnum);
877     if (linnum == -1) break;
878     scanf("%lf", &a); scanf("%lf", &b);
879 edhill 1.52 abave = 0.5*(fabs(a)+fabs(b));
880 jmc 1.91 if ( abave == abave ) {
881     if (abave > 0.0) {
882     relerr=fabs(a-b)/abave;
883     if (relerr > 0.0) { cmplin = (int)rint(log10(relerr)); }
884     else { cmplin = -16 ; }
885     best = (best > cmplin) ? best : cmplin; }
886     else { cmplin = -22 ; }
887     /* printf("%d ; %lf ; %lf\n",cmplin,a,b); */
888     }
889     else {
890     /* printf("%lf ; %lf ; %lf\n",abave,a,b); */
891     break; }
892 edhill 1.22 }
893 adcroft 1.33 if (lncnt == 999) best=-29;
894 jmc 1.91 if (linnum != -1) best=-99;
895 edhill 1.22 printf("%d\n", -best);
896     return 0;
897     }
898     EOF
899 jmc 1.91 $CC -o tr_cmpnum tr_cmpnum.c -lm
900 edhill 1.1
901 jmc 1.91 if [ -x ./tr_cmpnum ]; then
902 edhill 1.1 echo "OK"
903     return 0
904     else
905     echo
906 jmc 1.135 echo "ERROR: failed to compile comparison code -- please specify"
907 edhill 1.58 echo " a C compiler using the CC environment variable."
908 edhill 1.1 exit 1
909     fi
910     }
911    
912     formatresults()
913     {
914     # formatresults expt genmake depend make run results*
915    
916     nm=$1
917     printf '%s %s %s %s' $2 $3 $4 $5
918     shift; shift; shift; shift; shift;
919 jmc 1.94 listPrt=$@
920     listRes=`echo $listPrt | sed 's/>//' | sed 's/<//'`
921     xx=`echo $listPrt | sed 's/.*>//' | sed 's/<.*//' | awk '{print $1}'`
922 jmc 1.97 printf '%3s' $listPrt
923 jmc 1.98 # line below does not work on hp-ux_ia64 : do those substitutions later on
924 jmc 1.95 # printf '%3s' $listPrt | sed 's/ 99/ --/g' | sed 's/ > />/' | sed 's/ < /</'
925 jmc 1.135
926 jmc 1.94 if [ $xx = '..' ]; then
927     printf ' N/O '
928     elif [ $xx = '--' ]; then
929     printf ' N/O '
930     elif [ $xx = 99 ]; then
931 edhill 1.1 printf ' N/O '
932     else
933 jmc 1.94 if [ $xx -ge $MATCH_CRIT ]; then
934 edhill 1.1 printf ' pass'
935     else
936     printf ' FAIL'
937     fi
938     fi
939     printf ' %s' $nm
940 jmc 1.186 if test $KIND = 2 ; then
941     #-- apppend taf repport summary:
942     tafrep=`grep -c '^ TAF reports ' $CDIR/summary.txt`
943     if test $tafrep = 1 ; then
944     grep '^ TAF reports ' $CDIR/summary.txt | awk '{printf " (e=%i, w=%i)",$3,$6}'
945     fi
946     fi
947 edhill 1.1 printf '\n'
948 jmc 1.135
949 edhill 1.1 }
950    
951     scandirs()
952     {
953 jmc 1.81 if [ $# -eq 1 ]; then
954     for arg in * ; do
955 jmc 1.175 #test -f $arg/$1 && echo $arg
956     test -f $arg/$1 -o -f $arg/$1.gz && echo $arg
957 jmc 1.81 done
958 edhill 1.1 else
959 jmc 1.81 echo $*
960 edhill 1.1 fi
961     }
962    
963    
964 jmc 1.123 check_eedata()
965     {
966 jmc 1.161 # check_eedata eedata size.h
967 jmc 1.123 if [ $# -eq 2 ] ; then
968 jmc 1.161 if test -f $1 -a -f $2 ; then
969     nx=`grep "^ *nTx *=" $1 | tail -1 | sed 's/^ *nTx *= *//' | sed "s/, *$//"`
970     sx=`grep "^ & *nSx *=" $2 | sed "s/^ & *nSx *=//" | sed 's/, *$//'`
971 jmc 1.123 if test "x$nx" = x ; then
972     rx=10
973     else
974     rx=`expr $sx % $nx`
975     fi
976 jmc 1.161 ny=`grep "^ *nTy *=" $1 | tail -1 | sed 's/^ *nTy *= *//' | sed "s/, *$//"`
977     sy=`grep "^ & *nSy *=" $2 | sed "s/^ & *nSy *=//" | sed 's/, *$//'`
978 jmc 1.123 if test "x$ny" = x ; then
979     ry=20
980     else
981     ry=`expr $sy % $ny`
982     fi
983     echo `expr $rx + $ry`
984 jmc 1.161 else
985     echo '-1'
986     fi
987     elif [ $# -eq 1 ] ; then
988     if test -f $1 ; then
989     nx=`grep "^ *nTx *=" $1 | tail -1 | sed 's/^ *nTx *= *//' | sed "s/, *$//"`
990     if test "x$nx" = x ; then nx=1 ; fi
991     ny=`grep "^ *nTy *=" $1 | tail -1 | sed 's/^ *nTy *= *//' | sed "s/, *$//"`
992     if test "x$ny" = x ; then ny=1 ; fi
993     #echo $nx $ny
994     echo $nx
995     else
996 jmc 1.123 echo '-1'
997 jmc 1.161 fi
998 jmc 1.123 else
999     echo '-2'
1000     fi
1001    
1002     }
1003    
1004 edhill 1.1 ###############################################################################
1005    
1006    
1007     # Default properties
1008     debug=0
1009     verbose=1
1010 jmc 1.163 NBLINES_MKLOG=16000
1011 edhill 1.10
1012 jmc 1.164 OptLev=1
1013 jmc 1.109 GSL=f
1014 edhill 1.10
1015     CLEANUP=f
1016 jmc 1.133 NORUN=f
1017 edhill 1.10 QUICK=f
1018 jmc 1.136 NOMAKE=f
1019 edhill 1.10 NOGENMAKE=f
1020     NOCLEAN=f
1021     NODEPEND=f
1022 jmc 1.156 POSTCLEAN=0
1023 edhill 1.1
1024 edhill 1.4 BASH=
1025 edhill 1.10 OPTFILE=NONE
1026     ADDRESSES=
1027 edhill 1.1 TESTDIRS=
1028 jmc 1.89 SKIPDIRS=
1029 edhill 1.1 MPACKDIR="../tools/mpack-1.6"
1030 edhill 1.20 HAVE_MPACK=
1031 jmc 1.113 MPACK=
1032 edhill 1.24 COMMAND=
1033 jmc 1.141 MKDEPEND=
1034 edhill 1.59 if test "x$MAKE" = x ; then
1035     MAKE=make
1036     fi
1037 jmc 1.171 REPLMAKE=
1038 edhill 1.59 if test "x$CC" = x ; then
1039     CC=cc
1040     fi
1041 edhill 1.43 JOBS=
1042 jmc 1.165 TARG=
1043 jmc 1.154 MPI=0
1044 jmc 1.156 MPI_MFILE=
1045 jmc 1.83 MULTI_THREAD=f
1046 jmc 1.70 OUTDIR=
1047 edhill 1.40 DELDIR=
1048 jmc 1.135 USE_R4=
1049 jmc 1.165 EXTRFLG=
1050 edhill 1.1
1051 jmc 1.175 #- type of testing (KIND):
1052     # KIND=0 : forward (= default) ; KIND=1 : Tangent Linear with TAF ;
1053     # KIND=2 : Adjoint with TAF ; KIND=4 : Adjoint with OpenAD
1054     KIND=0
1055 edhill 1.24
1056 jmc 1.117 # list of pTracers to check for monitor output
1057 edhill 1.50 PTRACERS_NUM="1 2 3 4 5"
1058 edhill 1.49
1059 jmc 1.147 MATCH_CRIT=10
1060 jmc 1.92
1061 edhill 1.34 printf "parsing options... "
1062 edhill 1.1
1063     ac_prev=
1064     for ac_option ; do
1065    
1066     # If the previous option needs an argument, assign it.
1067     if test -n "$ac_prev"; then
1068     eval "$ac_prev=\$ac_option"
1069     ac_prev=
1070     continue
1071     fi
1072    
1073     ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
1074 jmc 1.135
1075 edhill 1.1 case $ac_option in
1076    
1077 jmc 1.156 -help | --help | -h | --h) usage ;;
1078    
1079     -optfile | --optfile | -of | --of) ac_prev=OPTFILE ;;
1080     -optfile=* | --optfile=* | -of=* | --of=*) OPTFILE=$ac_optarg ;;
1081    
1082     -addr | --addr | -a | --a) ac_prev=ADDRESSES ;;
1083     -addr=* | --addr=* | -a=* | --a=*) ADDRESSES=$ac_optarg ;;
1084     -mpackdir | --mpackdir | -mpd | --mpd) ac_prev=MPACKDIR ;;
1085     -mpackdir=* | --mpackdir=* | -mpd=* | --mpd=*) MPACKDIR=$ac_optarg ;;
1086    
1087     -tdir | --tdir | -t | --t) ac_prev=TESTDIRS ;;
1088     -tdir=* | --tdir=* | -t=* | --t=*) TESTDIRS=$ac_optarg ;;
1089     -skipdir | --skipdir | -skd | --skd) ac_prev=SKIPDIRS ;;
1090     -skipdir=* | --skipdir=* | -skd=* | --skd=*) SKIPDIRS=$ac_optarg ;;
1091    
1092     -bash | --bash | -b | --b) ac_prev=BASH ;;
1093     -bash=* | --bash=* | -b=* | --b=*) BASH=$ac_optarg ;;
1094    
1095     -command | --command | -c | --c) ac_prev=COMMAND ;;
1096     -command=* | --command=* | -c=* | --c=*) COMMAND=$ac_optarg ;;
1097    
1098     -makedepend | --makedepend | -md | --md) ac_prev=MKDEPEND ;;
1099     -makedepend=* | --makedepend=* | -md=* | --md=*) MKDEPEND=$ac_optarg ;;
1100    
1101     -make | --make | -m | --m) ac_prev=MAKE ;;
1102     -make=* | --make=* | -m=* | --m=*) MAKE=$ac_optarg ;;
1103    
1104 jmc 1.171 -repl_mk | --repl_mk ) ac_prev=REPLMAKE ;;
1105     -repl_mk=* | --repl_mk=*) REPLMAKE=$ac_optarg ;;
1106    
1107 jmc 1.156 -odir | --odir) ac_prev=OUTDIR ;;
1108     -odir=* | --odir=*) OUTDIR=$ac_optarg ;;
1109    
1110     -ptracers | --ptracers | -ptr | --ptr) ac_prev=PTRACERS_NUM ;;
1111     -ptracers=* | --ptracers=* | -ptr=* | --ptr=*) PTRACERS_NUM=$ac_optarg ;;
1112 edhill 1.50
1113 jmc 1.92 -match | --match ) ac_prev=MATCH_CRIT ;;
1114     -match=* | --match=* ) MATCH_CRIT=$ac_optarg ;;
1115    
1116 jmc 1.136 -j | --j) ac_prev=JOBS ;;
1117     -j=* | --j=*) JOBS=$ac_optarg ;;
1118 edhill 1.43
1119 jmc 1.165 -ef | --ef) ac_prev=EXTRFLG ;;
1120     -ef=* | --ef=*) EXTRFLG=$ac_optarg ;;
1121    
1122 jmc 1.156 -clean | --clean) CLEANUP=t ; DELDIR=t ;;
1123 edhill 1.10
1124 jmc 1.156 -norun | --norun | -nr | --nr) NORUN=t ;;
1125 jmc 1.165 -obj | --obj ) TARG='obj' ; NORUN=t ;;
1126 jmc 1.156 -runonly | --runonly | -ro | --ro) QUICK=t ; NOMAKE=t ;;
1127     -quick | --quick | -q | --q) QUICK=t ;;
1128     -nogenmake | --nogenmake | -ng | --ng) NOGENMAKE=t ;;
1129     -noclean | --noclean | -nc | --nc) NOCLEAN=t ;;
1130     -nodepend | --nodepend | -nd | --nd) NODEPEND=t ;;
1131 edhill 1.10
1132 jmc 1.156 -postclean | --postclean | -pc | --pc) POSTCLEAN=2 ;;
1133     -deloutp | --deloutp | -do | --do) POSTCLEAN=1 ;;
1134 edhill 1.68
1135 jmc 1.154 -mpi | --mpi) MPI=2 ;;
1136     -MPI | --MPI) ac_prev=MPI ;;
1137     -MPI=* | --MPI=*) MPI=$ac_optarg ;;
1138 edhill 1.10
1139 jmc 1.156 -mfile | --mfile | -mf | --mf) ac_prev=MPI_MFILE ;;
1140     -mfile=* | --mfile=* | -mf=* | --mf=*) MPI_MFILE=$ac_optarg ;;
1141    
1142 jmc 1.83 -mth) MULTI_THREAD=t ;;
1143    
1144 jmc 1.175 -tlm) if test $KIND = 0 ; then KIND=1 ; else
1145     echo "Error: '-tlm', '-adm' and '-oad' are exclusive" ; usage
1146     fi ;;
1147     -adm | -ad) if test $KIND = 0 ; then KIND=2 ; else
1148     echo "Error: '-tlm', '-adm' and '-oad' are exclusive" ; usage
1149     fi ;;
1150     -oad) if test $KIND = 0 ; then KIND=4 ; NODEPEND=t ; else
1151     echo "Error: '-tlm', '-adm' and '-oad' are exclusive" ; usage
1152     fi ;;
1153 utke 1.120
1154 jmc 1.164 -ieee) echo "Warning: ignore option '-ieee' (already the default)"
1155 jmc 1.175 printf " ... " ;;
1156 jmc 1.164 -noieee) echo "Warning: will use option '-fast' instead of '-noieee' (obsolete)"
1157 jmc 1.175 printf " ... " ; OptLev=`expr $OptLev \* 2` ;;
1158 jmc 1.164 -fast) OptLev=`expr $OptLev \* 2` ;;
1159     -devel) OptLev=0 ;;
1160 jmc 1.156 -gsl) GSL=t ;;
1161 edhill 1.10
1162 edhill 1.1 -verbose) verbose=2 ;;
1163     -debug) debug=1 ;;
1164     -quiet) verbose=0 ;;
1165    
1166 edhill 1.40 -deldir | -dd) DELDIR=t ;;
1167    
1168 jmc 1.136 -use_r4|-ur4) USE_R4=t ;;
1169 jmc 1.135
1170 ce107 1.90 -ts) TS=t;;
1171     -papis) PAPIS=t;;
1172     -pcls) PCL=t;;
1173    
1174 jmc 1.156 -*) echo "Error: unrecognized option: "$ac_option
1175     usage ;;
1176     *) echo "Error: unrecognized argument: "$ac_option
1177     usage ;;
1178 jmc 1.135
1179 edhill 1.1 esac
1180 jmc 1.135
1181 edhill 1.1 done
1182    
1183 edhill 1.10 if test "x$QUICK" = xt ; then
1184     NOGENMAKE=t
1185     NOCLEAN=t
1186     NODEPEND=t
1187     fi
1188    
1189 jmc 1.156 #- check length of MPI machine file:
1190     if test "x$MPI" != x0 -a "x$MPI_MFILE" != x ; then
1191     if test -r $MPI_MFILE ; then
1192     nl=`wc -l $MPI_MFILE | awk '{print $1}'`
1193     if [ $nl -lt $MPI ] ; then
1194 jmc 1.175 echo "Error: need at least $MPI nodes (currently only $nl) in MPI_MFILE=$MPI_FILE"
1195     usage
1196 jmc 1.156 fi
1197     if [ $verbose -gt 1 ]; then
1198     echo " MPI_MFILE=$MPI_MFILE : $nl procs for MPI=$MPI run"
1199     fi
1200     else
1201 jmc 1.175 echo "Error: cannot access MPI_MFILE=$MPI_FILE"
1202     usage
1203 jmc 1.156 fi
1204     fi
1205    
1206 jmc 1.99 #- setting for forward or ADM testing
1207 jmc 1.175 if test $KIND = 1 ; then
1208     TARG=ftlall
1209     code_dir=code_ad
1210     inputdir=input_ad
1211     ref_outp="output_tlm.txt"
1212     EXECUTABLE="mitgcmuv_ftl"
1213     elif test $KIND = 2 ; then
1214 jmc 1.168 if test "x$TARG" = xobj ; then TARG=adobj ; else TARG=adall ; fi
1215 jmc 1.99 code_dir=code_ad
1216 jmc 1.108 inputdir=input_ad
1217 jmc 1.99 ref_outp="output_adm.txt"
1218     EXECUTABLE="mitgcmuv_ad"
1219 jmc 1.175 elif test $KIND = 4 ; then
1220 jmc 1.168 TARG=adAll
1221 utke 1.120 code_dir=code_oad
1222     inputdir=input_oad
1223     ref_outp="output_oadm.txt"
1224     EXECUTABLE="mitgcmuv_ad"
1225 jmc 1.99 else
1226 jmc 1.168 if test "x$JOBS" != x ; then TARG="-j $JOBS $TARG" ; fi
1227 jmc 1.99 code_dir=code
1228 jmc 1.108 inputdir=input
1229 jmc 1.99 ref_outp="output.txt"
1230     EXECUTABLE="mitgcmuv"
1231     fi
1232    
1233 jmc 1.142 xx=`echo $TESTDIRS | awk '{print $1}'`
1234 edhill 1.1 if test "x$TESTDIRS" = x ; then
1235 jmc 1.103 LIST=`scandirs results/$ref_outp`
1236 jmc 1.142 elif test $xx = 'start_from' ; then
1237     xx=`echo $TESTDIRS | awk '{print $2}'`
1238     LIST=`scandirs results/$ref_outp | sed -n "/$xx/,$ p"`
1239 jmc 1.84 else
1240     #- expand group of experiments:
1241     LIST=" "
1242     for xx in $TESTDIRS
1243     do
1244     case $xx in
1245 jmc 1.86 'basic') LIST=${LIST}" aim.5l_cs hs94.128x64x5 ideal_2D_oce"
1246     LIST=${LIST}" lab_sea tutorial_baroclinic_gyre"
1247     LIST=${LIST}" tutorial_global_oce_latlon tutorial_plume_on_slope"
1248 jmc 1.84 ;;
1249     'tutorials')
1250     LIST=${LIST}" "`ls | grep 'tutorial_'` ;;
1251     *) LIST=${LIST}" "$xx ;;
1252     esac
1253 jmc 1.135 done
1254 jmc 1.89 fi
1255     #echo 'LIST='${LIST}'<'
1256     #- skip dirs, remove duplicate and non-directory:
1257     TESTDIRS=" "
1258     count=0
1259     for xx in $LIST
1260     do
1261     yy=`echo $SKIPDIRS | grep -c $xx`
1262     if test $yy = 0 ; then
1263 jmc 1.84 if test -d $xx ; then
1264     yy=`echo $TESTDIRS | grep -c $xx`
1265     if test $yy = 0 ; then TESTDIRS=${TESTDIRS}" "$xx ; fi
1266 jmc 1.89 else count=1 ;
1267     echo ""; echo -n " -- skip \"$xx\" (not a directory !)"
1268     fi
1269     else
1270 jmc 1.175 if test $count = 1 ; then echo -n ", \"$xx\""
1271 jmc 1.89 else count=1 ; echo "" ; echo -n " skip: \"$xx\""
1272 jmc 1.84 fi
1273 jmc 1.89 fi
1274 jmc 1.135 done
1275 jmc 1.89 if test $count = 1 ; then echo "" ; echo -n " ... " ; fi
1276 jmc 1.84 #echo 'TESTDIRS='${TESTDIRS}'<'
1277 edhill 1.1
1278 edhill 1.10 if test "x$OPTFILE" = xNONE -a "x$MITGCM_OF" != x ; then
1279     OPTFILE=$MITGCM_OF
1280     fi
1281    
1282 jmc 1.156 LOC_MFILE='tr_mpi_mfile'
1283 jmc 1.146 RUNLOG="run.tr_log"
1284 jmc 1.99 OUTPUTFILE=$ref_outp
1285 jmc 1.87 if test "x$COMMAND" = x ; then
1286 jmc 1.77 COMMAND="./$EXECUTABLE > $OUTPUTFILE"
1287 edhill 1.24 fi
1288 jmc 1.154 if test "x$MPI" != x0 ; then
1289 jmc 1.87 OUTPUTFILE="STDOUT.0000"
1290 edhill 1.24 fi
1291    
1292 jmc 1.76 echo "OK (COMMAND= $COMMAND )"
1293 edhill 1.1
1294 jmc 1.94 # set the Default List of output variables to be checked:
1295     # (use default or load experiment-specific list from file "tr_checklist")
1296     # content : 1rst = main variable used to decide if it pass or FAIL
1297     # others = number of matching digits to be printed in summary.txt
1298 jmc 1.175 if test $KIND = 1 ; then
1299     DEF_CHECK_LIST='tlmGrd tlmCst tlmGrd fwdGrd'
1300     EMPTY_RESULTS='.. .. ..'
1301     LEN_CHECK_LIST=`echo $DEF_CHECK_LIST | sed 's/ [a-zA-Z0-9]*+/&mn &mx &av &sd/g' | awk '{print NF-1}'`
1302     elif test $KIND = 2 -o $KIND = 4 ; then
1303     DEF_CHECK_LIST='AdGrd Cost AdGrd FDGrd'
1304     EMPTY_RESULTS='.. .. ..'
1305     LEN_CHECK_LIST=`echo $DEF_CHECK_LIST | sed 's/ [a-zA-Z0-9]*+/&mn &mx &av &sd/g' | awk '{print NF-1}'`
1306     else
1307 jmc 1.94 DEF_CHECK_LIST='PS PS T+ S+ U+ V+ pt1+ pt2+ pt3+ pt4+ pt5+'
1308     EMPTY_RESULTS='.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..'
1309 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}'`
1310 jmc 1.94 ii=`echo $EMPTY_RESULTS | awk '{print NF}'`
1311 jmc 1.97 EMPTY_RESULTS=$EMPTY_RESULTS`expr $LEN_CHECK_LIST - $ii | awk 'BEGIN{FS=":"}{for(i=1;i<=$1;i++){printf " ."}}'`
1312 jmc 1.94 fi
1313    
1314 edhill 1.1 # create the FORTRAN comparison code
1315 jmc 1.178 if test "x$CLEANUP" = xt -o -x tr_cmpnum ; then
1316 jmc 1.133 echo "skipping comparison code build"
1317     else
1318     createcodelet
1319     fi
1320 edhill 1.1
1321 jmc 1.112 # build the mpack utility (if ADDRESSES = NONE, do it to test the build)
1322     if test "x$ADDRESSES" = x ; then
1323 edhill 1.32 echo "skipping mpack build"
1324     else
1325 edhill 1.31 build_mpack
1326     fi
1327 edhill 1.1
1328     # Create a uniquely named directory to store results
1329 jmc 1.110 CMDLINE=$0
1330 jmc 1.118 for xx in "$@" ; do nw=`echo $xx | wc -w`
1331 jmc 1.180 if test $nw = '1' ; then CMDLINE="$CMDLINE $xx" ; else
1332     nb=`echo $xx | grep -c '='`
1333     if test $nb = 0 ; then CMDLINE="$CMDLINE '$xx'"
1334     else yy=`echo "$xx'" | sed "s/=/='/"` ;
1335     CMDLINE="$CMDLINE $yy" ; fi
1336     fi
1337 jmc 1.118 done
1338     #for xx in "$@" ; do CMDLINE="$CMDLINE '$xx'" ; done
1339 edhill 1.1 MACH=`hostname`
1340 edhill 1.2 UNAMEA=`uname -a`
1341 edhill 1.1 DATE=`date +%Y%m%d`
1342 edhill 1.25 BASE="tr_"$MACH"_"$DATE"_"
1343 jmc 1.70 if test "x$OUTDIR" != x ; then
1344     BASE="tr_"$OUTDIR"_"$DATE"_"
1345 jmc 1.121 else
1346     short_name=`hostname | sed 's/\..*$//'`
1347     BASE="tr_"$short_name"_"$DATE"_"
1348 jmc 1.70 fi
1349 edhill 1.1 DNUM=0
1350     DRESULTS="$BASE$DNUM"
1351     while test -e $DRESULTS ; do
1352     DNUM=$(( $DNUM + 1 ))
1353     DRESULTS="$BASE$DNUM"
1354     done
1355     mkdir $DRESULTS
1356     RETVAL=$?
1357     if test "x$RETVAL" != x0 ; then
1358 edhill 1.20 echo "ERROR: Can't create results directory \"./$DRESULTS\""
1359 edhill 1.1 exit 1
1360     fi
1361     SUMMARY="$DRESULTS/summary.txt"
1362 edhill 1.16 start_date=`date`
1363 edhill 1.17 echo $start_date > $SUMMARY
1364 jmc 1.110 echo 'run:' $CMDLINE >> $SUMMARY
1365     echo 'on :' $UNAMEA >> $SUMMARY
1366 edhill 1.1
1367 edhill 1.11 of_path=
1368 edhill 1.10 if test "x$OPTFILE" != xNONE ; then
1369     if test -r $OPTFILE ; then
1370 edhill 1.11 # get the path
1371     path=${OPTFILE%/*}
1372     if test "x$path" = x ; then
1373     of_path=`pwd`
1374     else
1375     of_path=`( cd $path > /dev/null 2>&1 ; pwd )`
1376     fi
1377     file=${OPTFILE##*/}
1378     OPTFILE=$of_path/$file
1379 edhill 1.21 cp $OPTFILE $DRESULTS
1380     echo >> $SUMMARY
1381     echo " OPTFILE=$OPTFILE" >> $SUMMARY
1382 edhill 1.11 else
1383 jmc 1.179 echo | tee -a $SUMMARY
1384     echo "ERROR: can't read OPTFILE=\"$OPTFILE\"" | tee -a $SUMMARY
1385 edhill 1.21 exit 1
1386 edhill 1.10 fi
1387 edhill 1.21 else
1388     echo >> $SUMMARY
1389 jmc 1.152 echo "No \"OPTFILE\" was specified ; genmake2 found and uses:" >> $SUMMARY
1390     #-note: to be filled later after 1rst run
1391 edhill 1.10 fi
1392     echo
1393     echo >> $SUMMARY
1394 jmc 1.175 if test $KIND = 0 ; then
1395     line_0=`printf '%s %2i' 'default' $MATCH_CRIT`
1396 jmc 1.94 line_0="$line_0 ----T----- ----S----- ----U----- ----V-----"
1397 edhill 1.49 line_1="G D M c m s m s m s m s"
1398 jmc 1.167 line_2="e p a R g m m e . m m e . m m e . m m e ."
1399     line_3="n n k u 2 i a a d i a a d i a a d i a a d"
1400 edhill 1.49 line_4="2 d e n d n x n . n x n . n x n . n x n ."
1401 edhill 1.50 for ii in $PTRACERS_NUM ; do
1402 edhill 1.49 line_0="$line_0 --PTR 0"$ii"--"
1403     line_1="$line_1 m s"
1404     line_2="$line_2 m m e ."
1405     line_3="$line_3 i a a d"
1406     line_4="$line_4 n x n ."
1407     done
1408 jmc 1.175 else
1409     line_0=`printf '%s %2i' 'default ' $MATCH_CRIT`
1410     if test $KIND = 1 ; then
1411 jmc 1.181 #echo "TANGLIN=true" >> $SUMMARY
1412     echo "TangLin generated by TAF" >> $SUMMARY
1413     elif test $KIND = 3 ; then
1414     echo "TangLin generated by OpenAD" >> $SUMMARY
1415     elif test $KIND = 2 ; then
1416     #echo "ADJOINT=true" >> $SUMMARY
1417     echo "Adjoint generated by TAF" >> $SUMMARY
1418     else
1419     echo "Adjoint generated by OpenAD" >> $SUMMARY
1420     fi
1421     if test $KIND = 1 -o $KIND = 3 ; then
1422 jmc 1.175 line_1="G D M C T F"
1423     line_2="e p a R o L D"
1424     else
1425     line_1="G D M C A F"
1426     line_2="e p a R o d D"
1427     fi
1428     line_3="n n k u s G G"
1429     line_4="2 d e n t r r"
1430     echo >> $SUMMARY
1431     fi
1432 jmc 1.178 if test "x$CLEANUP" != xt ; then
1433 edhill 1.49 echo "$line_0" | tee -a $SUMMARY
1434     echo "$line_1" | tee -a $SUMMARY
1435     echo "$line_2" | tee -a $SUMMARY
1436     echo "$line_3" | tee -a $SUMMARY
1437     echo "$line_4" | tee -a $SUMMARY
1438 jmc 1.175 echo "" | tee -a $SUMMARY
1439 jmc 1.178 fi
1440 jmc 1.139 echo "-------------------------------------------------------------------------------"
1441 edhill 1.1
1442 edhill 1.10 # ...and each test directory...
1443     for dir in $TESTDIRS ; do
1444 jmc 1.135
1445 jmc 1.106 # set builddir & rundir:
1446     builddir="build"
1447     if test ! -d $dir/$builddir ; then mkdir $dir/$builddir ; fi
1448     rundir="run"
1449 jmc 1.143 pfxdir="tr_$rundir"
1450 jmc 1.106 if test ! -d $dir/$rundir ; then
1451     rundir=$builddir
1452     fi
1453     CODE_DIR=$dir/$code_dir
1454     BUILD_DIR=$dir/$builddir
1455    
1456 edhill 1.10 # Cleanup only!
1457     if test "x$CLEANUP" = xt ; then
1458 jmc 1.127 echo -n ' --- dir:' $BUILD_DIR ': '
1459     makeclean $BUILD_DIR
1460 jmc 1.145 ( cd $BUILD_DIR
1461     rm -f $EXECUTABLE *.bak
1462 jmc 1.146 rm -f genmake_state genmake_*optfile genmake.log
1463 jmc 1.154 rm -f SIZE.h.mpi genmake.tr_log make.tr_log
1464 jmc 1.145 )
1465 jmc 1.106 if test -d $dir/$rundir/CVS ; then
1466 jmc 1.175 echo -n ' --- dir:' $dir/$rundir ': '
1467 jmc 1.106 run_clean $dir/$rundir
1468 edhill 1.10 fi
1469 jmc 1.143 trdir=`( cd $dir ; find . -type d -name "$pfxdir.*" -print | sed 's/^.\///')`
1470 jmc 1.127 ttd=`echo $trdir | wc -w`
1471     if test $ttd != 0 ; then
1472     echo ' --- rm dir:' $trdir
1473     ( cd $dir ; rm -rf $trdir )
1474     fi
1475 edhill 1.10 continue
1476 edhill 1.1 fi
1477 edhill 1.3
1478 jmc 1.135 # Verify that the testdir exists and contains previous
1479 edhill 1.10 # results in the correct location--or skip this directory!
1480 jmc 1.104 fout=$dir"/results/"$ref_outp
1481 jmc 1.175 #if test ! -r $fout ; then
1482     if test ! -r $fout -a ! -r ${fout}.gz ; then
1483 edhill 1.24 echo "can't read \"$fout\" -- skipping $dir"
1484 edhill 1.10 continue
1485     fi
1486 edhill 1.7
1487 jmc 1.117 # Check for specific files for particular type of run
1488 edhill 1.49
1489 jmc 1.161 if test ! -r $CODE_DIR"/SIZE.h_mpi" -a "x$MPI" != "x0" ; then
1490     echo "can't find \"$CODE_DIR/SIZE.h_mpi\" -- skipping $dir"
1491     continue
1492     fi
1493     if test ! -r $dir"/input/eedata.mth" -a "x$MULTI_THREAD" = "xt" ; then
1494     echo "can't find \"$dir/input/eedata.mth\" -- skipping $dir"
1495     continue
1496     fi
1497    
1498 jmc 1.154 if test "x$MPI" != "x0" ; then
1499 jmc 1.173 ntx=1 ; nty=1
1500 jmc 1.161 if test "x$MULTI_THREAD" = "xt" ; then
1501 jmc 1.174 ff=$dir"/input/eedata.mth"
1502     ntx=`grep "^ *nTx *=" $ff | tail -1 | sed 's/^ *nTx *= *//' | sed "s/, *$//"`
1503     nty=`grep "^ *nTy *=" $ff | tail -1 | sed 's/^ *nTy *= *//' | sed "s/, *$//"`
1504     if test "x$ntx" = x ; then ntx=1 ; fi
1505     if test "x$nty" = x ; then nty=1 ; fi
1506 jmc 1.161 fi
1507     #- create new SIZE.h with no more than '$MPI' Procs
1508 jmc 1.173 mk_mpi_size $CODE_DIR"/SIZE.h_mpi" $BUILD_DIR"/tr_size.mpi" $MPI $ntx $nty
1509 jmc 1.161 LOC_NPROC=$?
1510     ( cd $BUILD_DIR
1511     if test -r SIZE.h.mpi ; then
1512     cmp tr_size.mpi SIZE.h.mpi > /dev/null 2>&1 ; RETVAL=$?
1513     else RETVAL=1
1514     fi
1515     if test "x$RETVAL" = x0 ; then
1516     rm -f tr_size.mpi
1517     else
1518     rm -f SIZE.h.mpi ; mv tr_size.mpi SIZE.h.mpi
1519     fi
1520     )
1521 jmc 1.156 if test "x$MPI_MFILE" != x ; then
1522     #- create new MPI machine-file with the right number of Procs
1523     rm -f $LOC_MFILE
1524     cat $MPI_MFILE | sort | uniq | head -$LOC_NPROC > $LOC_MFILE
1525     nl=`wc -l $LOC_MFILE | awk '{print $1}'`
1526     if [ $nl -lt $LOC_NPROC ] ; then
1527     rm -f $LOC_MFILE
1528     cat $MPI_MFILE | head -$LOC_NPROC > $LOC_MFILE
1529     #sed -n "1,$LOC_NPROC p" $MPI_MFILE > $LOC_MFILE
1530     fi
1531     if [ $verbose -gt 1 ]; then
1532     nl=`wc -l $LOC_MFILE | awk '{print $1}'`
1533     echo " new LOC_MFILE=$LOC_MFILE : $nl procs for LOC_NPROC=$LOC_NPROC"
1534     fi
1535     fi
1536 jmc 1.161 if test "x$MULTI_THREAD" = "xt" ; then
1537     retv=`check_eedata $dir"/input/eedata.mth" $BUILD_DIR"/SIZE.h.mpi"`
1538     if test $retv != 0 ; then
1539     echo "input/eedata.mth tiling misfit -- skipping $dir"
1540     continue
1541     fi
1542 jmc 1.154 fi
1543 jmc 1.123 fi
1544 jmc 1.83
1545     # Check whether there are "extra runs" for this testdir
1546     extra_runs=
1547 jmc 1.133 if test "x$NORUN" = xf ; then
1548 jmc 1.183 ex_run_dirs=`( cd $dir ; ls -d $inputdir.* 2> /dev/null )`
1549 jmc 1.133 fi
1550 jmc 1.108 #echo "ex_run_dirs='$ex_run_dirs'"
1551     for exd in $ex_run_dirs ; do
1552     name=`echo $exd | sed -e "s/$inputdir\.//"`
1553     refExOut=`echo $ref_outp | sed "s/\./.${name}./"`
1554     outf="$dir/results/$refExOut"
1555 jmc 1.175 if test -r $outf -o -r ${outf}.gz ; then
1556 jmc 1.135 if test "x$MULTI_THREAD" = "xt" ; then
1557 jmc 1.123 if test -r $dir"/"$exd"/eedata.mth" ; then
1558 jmc 1.154 if test "x$MPI" = "x0" ; then
1559     extra_runs="$extra_runs $name"
1560     else
1561 jmc 1.161 retv=`check_eedata $dir"/"$exd"/eedata.mth" $BUILD_DIR"/SIZE.h.mpi"`
1562 jmc 1.123 if test $retv = 0 ; then
1563 jmc 1.83 extra_runs="$extra_runs $name"
1564 jmc 1.123 else
1565     echo $exd"/eedata.mth tiling misfit -- skipping $dir"
1566 jmc 1.83 fi
1567 jmc 1.123 fi
1568     #else echo $dir"/"$exd"/eedata.mth: not found"
1569 jmc 1.83 fi
1570 jmc 1.123 else
1571     extra_runs="$extra_runs $name"
1572     fi
1573 jmc 1.108 fi
1574     done
1575 edhill 1.28
1576     echo
1577 jmc 1.135 if test "x$extra_runs" = "x" ; then
1578 jmc 1.175 echo "Experiment: $dir"
1579 jmc 1.83 else
1580 jmc 1.175 echo "Experiment: $dir ; extra_runs=$extra_runs"
1581 jmc 1.83 fi
1582 edhill 1.28 echo
1583     unset genmake makedepend make run
1584 jmc 1.94 results=$EMPTY_RESULTS
1585 edhill 1.10
1586 jmc 1.158 # Create an output dir & summary.txt file for each tested experiment (tdir)
1587 jmc 1.138 locDIR=$DRESULTS"/"$dir
1588     mkdir $locDIR
1589 jmc 1.158 #- report to this experiment local summary file ---
1590     echo "DATE='$DATE' ; tdir='$dir'" > $locDIR"/summary.txt"
1591     echo "MACH='$MACH'" >> $locDIR"/summary.txt"
1592     echo "UNAMEA='$UNAMEA'" >> $locDIR"/summary.txt"
1593 jmc 1.138 CDIR=`pwd`"/$locDIR"
1594 jmc 1.135
1595 jmc 1.133 if test "x$NORUN" = xt ; then
1596     run=N
1597     genmakemodel $dir/$builddir && genmake=Y \
1598     && makeclean $dir/$builddir \
1599 jmc 1.175 && symlink_mpifiles $dir $code_dir $builddir \
1600 jmc 1.133 && makedependmodel $dir/$builddir && makedepend=Y \
1601     && makemodel $dir/$builddir && make=Y
1602 edhill 1.10 else
1603 edhill 1.1 genmakemodel $dir/$builddir && genmake=Y \
1604     && makeclean $dir/$builddir \
1605 jmc 1.175 && symlink_mpifiles $dir $code_dir $builddir \
1606 edhill 1.1 && makedependmodel $dir/$builddir && makedepend=Y \
1607     && makemodel $dir/$builddir && make=Y \
1608 jmc 1.139 && run_clean $dir/$rundir \
1609 jmc 1.140 && linkdata $dir/$rundir $inputdir \
1610 edhill 1.12 && runmodel $dir/$rundir && run=Y \
1611 jmc 1.99 && results=`testoutput_run $dir $rundir $ref_outp`
1612 edhill 1.10 fi
1613 jmc 1.139 #echo "results='$results'"
1614 jmc 1.135
1615 edhill 1.24 fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1616 jmc 1.139 echo 1>&2
1617 jmc 1.175 echo "$fres" | sed 's/ 99/ --/g' | sed 's/ > />/' | sed 's/ < /</' >> $SUMMARY
1618 jmc 1.138 echo "fresults='$fres'" | sed 's/ 99/ --/g' >> $locDIR"/summary.txt"
1619 edhill 1.34
1620     for ex in $extra_runs ; do
1621 jmc 1.73 unset run
1622 jmc 1.175 results=$EMPTY_RESULTS
1623 jmc 1.106 # reference output file
1624     refExOut=`echo $ref_outp | sed "s/\./.${ex}./g"`
1625 jmc 1.158 # Create an output dir & summary.txt file for each extra run (tdir.ex)
1626 jmc 1.138 locDIR=$DRESULTS"/"$dir"."$ex
1627     mkdir $locDIR
1628 jmc 1.158 #- report to this experiment local summary file ---
1629     echo "DATE='$DATE' ; tdir='$dir.$ex'" > $locDIR"/summary.txt"
1630     #echo "MACH='$MACH'" >> $locDIR"/summary.txt"
1631     #echo "UNAMEA='$UNAMEA'" >> $locDIR"/summary.txt"
1632 jmc 1.138 CDIR=`pwd`"/$locDIR"
1633 jmc 1.143 test ! -e "$dir/$pfxdir.$ex" && mkdir "$dir/$pfxdir.$ex"
1634     run_clean $dir/$pfxdir.$ex
1635     linkdata $dir/$pfxdir.$ex $inputdir.$ex $inputdir
1636     runmodel $dir/$pfxdir.$ex && run=Y \
1637     && results=`testoutput_run $dir $pfxdir.$ex $refExOut`
1638 jmc 1.186 fres=`formatresults $dir.$ex ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1639 jmc 1.139 echo 1>&2
1640 jmc 1.100 echo "$fres" | sed 's/ 99/ --/g' | sed 's/ > />/' | sed 's/ < /</' >> $SUMMARY
1641 jmc 1.138 echo "fresults='$fres'" | sed 's/ 99/ --/g' >> $locDIR"/summary.txt"
1642 jmc 1.156 if test "x$POSTCLEAN" = x2 ; then
1643 jmc 1.143 run_clean $dir/$pfxdir.$ex
1644 jmc 1.83 fi
1645 edhill 1.34 done
1646 edhill 1.68
1647 jmc 1.176 if test ! -f $DRESULTS"/"genmake_state ; then
1648 jmc 1.137 if test -f $dir/$builddir/Makefile ; then
1649     mkOpt=`grep '^# OPTFILE=' $dir/$builddir/Makefile 2>/dev/null | head -1 | sed 's/^# //'`
1650     echo "from '$dir/$builddir/Makefile', extract:" > $DRESULTS/genmake_state
1651     sed -n '/^# executed by:/,+1 p' $dir/$builddir/Makefile >> $DRESULTS/genmake_state
1652 jmc 1.151 echo " $mkOpt" >> $DRESULTS/genmake_state
1653 jmc 1.152 if test "x$OPTFILE" = xNONE ; then
1654     eval $mkOpt
1655     sed "/^No \"OPTFILE\" was specified ; genmake2/a\ OPTFILE=${OPTFILE}"\
1656 jmc 1.176 $SUMMARY > tmp.tr_log
1657 jmc 1.152 RETVAL=$?
1658     if test "x$RETVAL" = x0 ; then rm -f $SUMMARY
1659 jmc 1.176 cp tmp.tr_log $SUMMARY
1660     else rm -f tmp.tr_log
1661 jmc 1.152 fi
1662     fi
1663 jmc 1.150 gmkLog=$dir/$builddir/genmake.log
1664 jmc 1.176 if test -r $gmkLog ; then
1665     grep '^Get compiler version using:' $gmkLog > /dev/null 2>&1
1666     RETVAL=$?
1667     if test "x$RETVAL" = x0 ; then
1668     echo -n "from '$gmkLog', " >> $DRESULTS/genmake_state
1669     echo "extract compiler version:" >> $DRESULTS/genmake_state
1670     sed -n '/Get compiler version/,/<-- compiler version/p' \
1671     $gmkLog | grep -v '^... compiler version ' > tmp.tr_log
1672     sed -n '1p' tmp.tr_log >> $DRESULTS/genmake_state
1673     sed -n '2,/^$/p' tmp.tr_log | sed '/^$/d' | sed 's/^./ &/' \
1674     >> $DRESULTS/genmake_state
1675     rm -f tmp.tr_log
1676     fi
1677     echo -n "from '$gmkLog', " >> $DRESULTS/genmake_state
1678     echo "get NETCDF & LAPACK settings:" >> $DRESULTS/genmake_state
1679     sed -n '/set HAVE_NETCDF=/p' $gmkLog >> $DRESULTS/genmake_state
1680     sed -n '/set HAVE_LAPACK=/p' $gmkLog >> $DRESULTS/genmake_state
1681 jmc 1.150 fi
1682 jmc 1.137 fi
1683     fi
1684 jmc 1.83 #postclean $dir/$builddir
1685 jmc 1.156 if test "x$POSTCLEAN" = x2 ; then
1686 jmc 1.175 makeclean $dir/$builddir \
1687     && run_clean $dir/$rundir
1688 jmc 1.83 fi
1689 jmc 1.156 if test "x$MPI" != x0 -a "x$MPI_MFILE" != x ; then rm -f $LOC_MFILE ; fi
1690 jmc 1.135
1691 edhill 1.10 echo "-------------------------------------------------------------------------------"
1692 jmc 1.135
1693 edhill 1.1 done
1694    
1695 edhill 1.34 printf "Start time: " >> $SUMMARY
1696 jmc 1.114 echo "$start_date" >> $SUMMARY
1697 edhill 1.34 printf "End time: " >> $SUMMARY
1698 edhill 1.13 date >> $SUMMARY
1699 edhill 1.20
1700     # If addresses were supplied and mpack built successfully, then try
1701     # to send email using mpack.
1702     if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then
1703     echo "No results email was sent."
1704     else
1705     if test "x$HAVE_MPACK" = xt ; then
1706     tar -cf $DRESULTS".tar" $DRESULTS > /dev/null 2>&1 \
1707     && gzip $DRESULTS".tar" \
1708 edhill 1.44 && $MPACK -s MITgcm-test -m 3555000 $DRESULTS".tar.gz" $ADDRESSES
1709 edhill 1.20 RETVAL=$?
1710     if test "x$RETVAL" != x0 ; then
1711     echo
1712     echo "Warning: The tar, gzip, & mpack step failed. Please send email"
1713     echo " to <MITgcm-support@mitgcm.org> for help. You may copy the "
1714     echo " summary of results from the directory \"$DRESULTS\"."
1715     echo
1716     else
1717     echo
1718     echo "An email containing results was sent to the following addresses:"
1719     echo " \"$ADDRESSES\""
1720     echo
1721 jmc 1.129 test -f $DRESULTS".tar" && rm -f $DRESULTS".tar"
1722     test -f $DRESULTS".tar.gz" && rm -f $DRESULTS".tar.gz"
1723 edhill 1.20 fi
1724     fi
1725     fi
1726 edhill 1.13
1727 jmc 1.133 if test "x$QUICK" = xf -a "x$NORUN" = xf ; then
1728     rm -f tr_cmpnum.c tr_cmpnum
1729     fi
1730 edhill 1.1
1731 edhill 1.12 if test "x$CLEANUP" != xt ; then
1732 jmc 1.102 cat $SUMMARY | sed 's/ \. \. \. \. \. \. \. \. \. \. \. \. //'
1733 edhill 1.25 if test -e tr_out.txt ; then
1734 jmc 1.175 mv tr_out.txt tr_out.txt.old
1735 edhill 1.14 fi
1736 jmc 1.103 cat $SUMMARY | sed '/^[YN] [YN] [YN] [YN]/ s/ \. //g' > tr_out.txt
1737 edhill 1.12 fi
1738 edhill 1.1
1739 edhill 1.40 if test "x$DELDIR" = xt ; then
1740     rm -rf $DRESULTS
1741     fi
1742 jmc 1.178 echo "======== End of testreport execution ========"

  ViewVC Help
Powered by ViewVC 1.1.22