/[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.191 - (hide annotations) (download)
Thu Jul 25 00:42:41 2013 UTC (10 years, 8 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint64m, checkpoint64l
Changes since 1.190: +2 -2 lines
adjust previous modif

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

  ViewVC Help
Powered by ViewVC 1.1.22