/[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.175 - (hide annotations) (download)
Wed Aug 15 23:19:21 2012 UTC (11 years, 7 months ago) by jmc
Branch: MAIN
Changes since 1.174: +212 -172 lines
- add option '-tlm' for Tangent-Linear test (-adm,-oad,-tlm are all exclusive);
- can also use compressed (gzip) reference output file;

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

  ViewVC Help
Powered by ViewVC 1.1.22