/[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.177 - (hide annotations) (download)
Fri Aug 17 21:29:51 2012 UTC (11 years, 7 months ago) by jmc
Branch: MAIN
Changes since 1.176: +8 -6 lines
- report run-time in each individual summary (previously only for AD test);
- for TLM test, add also TAF version.

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

  ViewVC Help
Powered by ViewVC 1.1.22