/[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.181 - (hide annotations) (download)
Thu Apr 4 14:32:31 2013 UTC (11 years ago) by jmc
Branch: MAIN
Changes since 1.180: +12 -3 lines
distinguish in the summary between OpenAD and TAF generated code

1 edhill 1.19 #! /usr/bin/env bash
2 edhill 1.1 #
3 jmc 1.181 # $Header: /u/gcmpack/MITgcm/verification/testreport,v 1.180 2012/09/04 19:27:52 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.178 if test "x$CLEANUP" = xt -o -x tr_cmpnum ; then
1284 jmc 1.133 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 jmc 1.180 if test $nw = '1' ; then CMDLINE="$CMDLINE $xx" ; else
1300     nb=`echo $xx | grep -c '='`
1301     if test $nb = 0 ; then CMDLINE="$CMDLINE '$xx'"
1302     else yy=`echo "$xx'" | sed "s/=/='/"` ;
1303     CMDLINE="$CMDLINE $yy" ; fi
1304     fi
1305 jmc 1.118 done
1306     #for xx in "$@" ; do CMDLINE="$CMDLINE '$xx'" ; done
1307 edhill 1.1 MACH=`hostname`
1308 edhill 1.2 UNAMEA=`uname -a`
1309 edhill 1.1 DATE=`date +%Y%m%d`
1310 edhill 1.25 BASE="tr_"$MACH"_"$DATE"_"
1311 jmc 1.70 if test "x$OUTDIR" != x ; then
1312     BASE="tr_"$OUTDIR"_"$DATE"_"
1313 jmc 1.121 else
1314     short_name=`hostname | sed 's/\..*$//'`
1315     BASE="tr_"$short_name"_"$DATE"_"
1316 jmc 1.70 fi
1317 edhill 1.1 DNUM=0
1318     DRESULTS="$BASE$DNUM"
1319     while test -e $DRESULTS ; do
1320     DNUM=$(( $DNUM + 1 ))
1321     DRESULTS="$BASE$DNUM"
1322     done
1323     mkdir $DRESULTS
1324     RETVAL=$?
1325     if test "x$RETVAL" != x0 ; then
1326 edhill 1.20 echo "ERROR: Can't create results directory \"./$DRESULTS\""
1327 edhill 1.1 exit 1
1328     fi
1329     SUMMARY="$DRESULTS/summary.txt"
1330 edhill 1.16 start_date=`date`
1331 edhill 1.17 echo $start_date > $SUMMARY
1332 jmc 1.110 echo 'run:' $CMDLINE >> $SUMMARY
1333     echo 'on :' $UNAMEA >> $SUMMARY
1334 edhill 1.1
1335 edhill 1.11 of_path=
1336 edhill 1.10 if test "x$OPTFILE" != xNONE ; then
1337     if test -r $OPTFILE ; then
1338 edhill 1.11 # get the path
1339     path=${OPTFILE%/*}
1340     if test "x$path" = x ; then
1341     of_path=`pwd`
1342     else
1343     of_path=`( cd $path > /dev/null 2>&1 ; pwd )`
1344     fi
1345     file=${OPTFILE##*/}
1346     OPTFILE=$of_path/$file
1347 edhill 1.21 cp $OPTFILE $DRESULTS
1348     echo >> $SUMMARY
1349     echo " OPTFILE=$OPTFILE" >> $SUMMARY
1350 edhill 1.11 else
1351 jmc 1.179 echo | tee -a $SUMMARY
1352     echo "ERROR: can't read OPTFILE=\"$OPTFILE\"" | tee -a $SUMMARY
1353 edhill 1.21 exit 1
1354 edhill 1.10 fi
1355 edhill 1.21 else
1356     echo >> $SUMMARY
1357 jmc 1.152 echo "No \"OPTFILE\" was specified ; genmake2 found and uses:" >> $SUMMARY
1358     #-note: to be filled later after 1rst run
1359 edhill 1.10 fi
1360     echo
1361     echo >> $SUMMARY
1362 jmc 1.175 if test $KIND = 0 ; then
1363     line_0=`printf '%s %2i' 'default' $MATCH_CRIT`
1364 jmc 1.94 line_0="$line_0 ----T----- ----S----- ----U----- ----V-----"
1365 edhill 1.49 line_1="G D M c m s m s m s m s"
1366 jmc 1.167 line_2="e p a R g m m e . m m e . m m e . m m e ."
1367     line_3="n n k u 2 i a a d i a a d i a a d i a a d"
1368 edhill 1.49 line_4="2 d e n d n x n . n x n . n x n . n x n ."
1369 edhill 1.50 for ii in $PTRACERS_NUM ; do
1370 edhill 1.49 line_0="$line_0 --PTR 0"$ii"--"
1371     line_1="$line_1 m s"
1372     line_2="$line_2 m m e ."
1373     line_3="$line_3 i a a d"
1374     line_4="$line_4 n x n ."
1375     done
1376 jmc 1.175 else
1377     line_0=`printf '%s %2i' 'default ' $MATCH_CRIT`
1378     if test $KIND = 1 ; then
1379 jmc 1.181 #echo "TANGLIN=true" >> $SUMMARY
1380     echo "TangLin generated by TAF" >> $SUMMARY
1381     elif test $KIND = 3 ; then
1382     echo "TangLin generated by OpenAD" >> $SUMMARY
1383     elif test $KIND = 2 ; then
1384     #echo "ADJOINT=true" >> $SUMMARY
1385     echo "Adjoint generated by TAF" >> $SUMMARY
1386     else
1387     echo "Adjoint generated by OpenAD" >> $SUMMARY
1388     fi
1389     if test $KIND = 1 -o $KIND = 3 ; then
1390 jmc 1.175 line_1="G D M C T F"
1391     line_2="e p a R o L D"
1392     else
1393     line_1="G D M C A F"
1394     line_2="e p a R o d D"
1395     fi
1396     line_3="n n k u s G G"
1397     line_4="2 d e n t r r"
1398     echo >> $SUMMARY
1399     fi
1400 jmc 1.178 if test "x$CLEANUP" != xt ; then
1401 edhill 1.49 echo "$line_0" | tee -a $SUMMARY
1402     echo "$line_1" | tee -a $SUMMARY
1403     echo "$line_2" | tee -a $SUMMARY
1404     echo "$line_3" | tee -a $SUMMARY
1405     echo "$line_4" | tee -a $SUMMARY
1406 jmc 1.175 echo "" | tee -a $SUMMARY
1407 jmc 1.178 fi
1408 jmc 1.139 echo "-------------------------------------------------------------------------------"
1409 edhill 1.1
1410 edhill 1.10 # ...and each test directory...
1411     for dir in $TESTDIRS ; do
1412 jmc 1.135
1413 jmc 1.106 # set builddir & rundir:
1414     builddir="build"
1415     if test ! -d $dir/$builddir ; then mkdir $dir/$builddir ; fi
1416     rundir="run"
1417 jmc 1.143 pfxdir="tr_$rundir"
1418 jmc 1.106 if test ! -d $dir/$rundir ; then
1419     rundir=$builddir
1420     fi
1421     CODE_DIR=$dir/$code_dir
1422     BUILD_DIR=$dir/$builddir
1423    
1424 edhill 1.10 # Cleanup only!
1425     if test "x$CLEANUP" = xt ; then
1426 jmc 1.127 echo -n ' --- dir:' $BUILD_DIR ': '
1427     makeclean $BUILD_DIR
1428 jmc 1.145 ( cd $BUILD_DIR
1429     rm -f $EXECUTABLE *.bak
1430 jmc 1.146 rm -f genmake_state genmake_*optfile genmake.log
1431 jmc 1.154 rm -f SIZE.h.mpi genmake.tr_log make.tr_log
1432 jmc 1.145 )
1433 jmc 1.106 if test -d $dir/$rundir/CVS ; then
1434 jmc 1.175 echo -n ' --- dir:' $dir/$rundir ': '
1435 jmc 1.106 run_clean $dir/$rundir
1436 edhill 1.10 fi
1437 jmc 1.143 trdir=`( cd $dir ; find . -type d -name "$pfxdir.*" -print | sed 's/^.\///')`
1438 jmc 1.127 ttd=`echo $trdir | wc -w`
1439     if test $ttd != 0 ; then
1440     echo ' --- rm dir:' $trdir
1441     ( cd $dir ; rm -rf $trdir )
1442     fi
1443 edhill 1.10 continue
1444 edhill 1.1 fi
1445 edhill 1.3
1446 jmc 1.135 # Verify that the testdir exists and contains previous
1447 edhill 1.10 # results in the correct location--or skip this directory!
1448 jmc 1.104 fout=$dir"/results/"$ref_outp
1449 jmc 1.175 #if test ! -r $fout ; then
1450     if test ! -r $fout -a ! -r ${fout}.gz ; then
1451 edhill 1.24 echo "can't read \"$fout\" -- skipping $dir"
1452 edhill 1.10 continue
1453     fi
1454 edhill 1.7
1455 jmc 1.117 # Check for specific files for particular type of run
1456 edhill 1.49
1457 jmc 1.161 if test ! -r $CODE_DIR"/SIZE.h_mpi" -a "x$MPI" != "x0" ; then
1458     echo "can't find \"$CODE_DIR/SIZE.h_mpi\" -- skipping $dir"
1459     continue
1460     fi
1461     if test ! -r $dir"/input/eedata.mth" -a "x$MULTI_THREAD" = "xt" ; then
1462     echo "can't find \"$dir/input/eedata.mth\" -- skipping $dir"
1463     continue
1464     fi
1465    
1466 jmc 1.154 if test "x$MPI" != "x0" ; then
1467 jmc 1.173 ntx=1 ; nty=1
1468 jmc 1.161 if test "x$MULTI_THREAD" = "xt" ; then
1469 jmc 1.174 ff=$dir"/input/eedata.mth"
1470     ntx=`grep "^ *nTx *=" $ff | tail -1 | sed 's/^ *nTx *= *//' | sed "s/, *$//"`
1471     nty=`grep "^ *nTy *=" $ff | tail -1 | sed 's/^ *nTy *= *//' | sed "s/, *$//"`
1472     if test "x$ntx" = x ; then ntx=1 ; fi
1473     if test "x$nty" = x ; then nty=1 ; fi
1474 jmc 1.161 fi
1475     #- create new SIZE.h with no more than '$MPI' Procs
1476 jmc 1.173 mk_mpi_size $CODE_DIR"/SIZE.h_mpi" $BUILD_DIR"/tr_size.mpi" $MPI $ntx $nty
1477 jmc 1.161 LOC_NPROC=$?
1478     ( cd $BUILD_DIR
1479     if test -r SIZE.h.mpi ; then
1480     cmp tr_size.mpi SIZE.h.mpi > /dev/null 2>&1 ; RETVAL=$?
1481     else RETVAL=1
1482     fi
1483     if test "x$RETVAL" = x0 ; then
1484     rm -f tr_size.mpi
1485     else
1486     rm -f SIZE.h.mpi ; mv tr_size.mpi SIZE.h.mpi
1487     fi
1488     )
1489 jmc 1.156 if test "x$MPI_MFILE" != x ; then
1490     #- create new MPI machine-file with the right number of Procs
1491     rm -f $LOC_MFILE
1492     cat $MPI_MFILE | sort | uniq | head -$LOC_NPROC > $LOC_MFILE
1493     nl=`wc -l $LOC_MFILE | awk '{print $1}'`
1494     if [ $nl -lt $LOC_NPROC ] ; then
1495     rm -f $LOC_MFILE
1496     cat $MPI_MFILE | head -$LOC_NPROC > $LOC_MFILE
1497     #sed -n "1,$LOC_NPROC p" $MPI_MFILE > $LOC_MFILE
1498     fi
1499     if [ $verbose -gt 1 ]; then
1500     nl=`wc -l $LOC_MFILE | awk '{print $1}'`
1501     echo " new LOC_MFILE=$LOC_MFILE : $nl procs for LOC_NPROC=$LOC_NPROC"
1502     fi
1503     fi
1504 jmc 1.161 if test "x$MULTI_THREAD" = "xt" ; then
1505     retv=`check_eedata $dir"/input/eedata.mth" $BUILD_DIR"/SIZE.h.mpi"`
1506     if test $retv != 0 ; then
1507     echo "input/eedata.mth tiling misfit -- skipping $dir"
1508     continue
1509     fi
1510 jmc 1.154 fi
1511 jmc 1.123 fi
1512 jmc 1.83
1513     # Check whether there are "extra runs" for this testdir
1514     extra_runs=
1515 jmc 1.133 if test "x$NORUN" = xf ; then
1516     ex_run_dirs=`( cd $dir ; echo $inputdir.* )`
1517     fi
1518 jmc 1.108 #echo "ex_run_dirs='$ex_run_dirs'"
1519     for exd in $ex_run_dirs ; do
1520     name=`echo $exd | sed -e "s/$inputdir\.//"`
1521     refExOut=`echo $ref_outp | sed "s/\./.${name}./"`
1522     outf="$dir/results/$refExOut"
1523 jmc 1.175 #if test -f $outf -a -r $outf ; then
1524     if test -r $outf -o -r ${outf}.gz ; then
1525 jmc 1.135 if test "x$MULTI_THREAD" = "xt" ; then
1526 jmc 1.123 if test -r $dir"/"$exd"/eedata.mth" ; then
1527 jmc 1.154 if test "x$MPI" = "x0" ; then
1528     extra_runs="$extra_runs $name"
1529     else
1530 jmc 1.161 retv=`check_eedata $dir"/"$exd"/eedata.mth" $BUILD_DIR"/SIZE.h.mpi"`
1531 jmc 1.123 if test $retv = 0 ; then
1532 jmc 1.83 extra_runs="$extra_runs $name"
1533 jmc 1.123 else
1534     echo $exd"/eedata.mth tiling misfit -- skipping $dir"
1535 jmc 1.83 fi
1536 jmc 1.123 fi
1537     #else echo $dir"/"$exd"/eedata.mth: not found"
1538 jmc 1.83 fi
1539 jmc 1.123 else
1540     extra_runs="$extra_runs $name"
1541     fi
1542 jmc 1.108 fi
1543     done
1544 edhill 1.28
1545     echo
1546 jmc 1.135 if test "x$extra_runs" = "x" ; then
1547 jmc 1.175 echo "Experiment: $dir"
1548 jmc 1.83 else
1549 jmc 1.175 echo "Experiment: $dir ; extra_runs=$extra_runs"
1550 jmc 1.83 fi
1551 edhill 1.28 echo
1552     unset genmake makedepend make run
1553 jmc 1.94 results=$EMPTY_RESULTS
1554 edhill 1.10
1555 jmc 1.158 # Create an output dir & summary.txt file for each tested experiment (tdir)
1556 jmc 1.138 locDIR=$DRESULTS"/"$dir
1557     mkdir $locDIR
1558 jmc 1.158 #- report to this experiment local summary file ---
1559     echo "DATE='$DATE' ; tdir='$dir'" > $locDIR"/summary.txt"
1560     echo "MACH='$MACH'" >> $locDIR"/summary.txt"
1561     echo "UNAMEA='$UNAMEA'" >> $locDIR"/summary.txt"
1562 jmc 1.138 CDIR=`pwd`"/$locDIR"
1563 jmc 1.135
1564 jmc 1.133 if test "x$NORUN" = xt ; then
1565     run=N
1566     genmakemodel $dir/$builddir && genmake=Y \
1567     && makeclean $dir/$builddir \
1568 jmc 1.175 && symlink_mpifiles $dir $code_dir $builddir \
1569 jmc 1.133 && makedependmodel $dir/$builddir && makedepend=Y \
1570     && makemodel $dir/$builddir && make=Y
1571 edhill 1.10 else
1572 edhill 1.1 genmakemodel $dir/$builddir && genmake=Y \
1573     && makeclean $dir/$builddir \
1574 jmc 1.175 && symlink_mpifiles $dir $code_dir $builddir \
1575 edhill 1.1 && makedependmodel $dir/$builddir && makedepend=Y \
1576     && makemodel $dir/$builddir && make=Y \
1577 jmc 1.139 && run_clean $dir/$rundir \
1578 jmc 1.140 && linkdata $dir/$rundir $inputdir \
1579 edhill 1.12 && runmodel $dir/$rundir && run=Y \
1580 jmc 1.99 && results=`testoutput_run $dir $rundir $ref_outp`
1581 edhill 1.10 fi
1582 jmc 1.139 #echo "results='$results'"
1583 jmc 1.135
1584 edhill 1.24 fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1585 jmc 1.139 echo 1>&2
1586 jmc 1.175 echo "$fres" | sed 's/ 99/ --/g' | sed 's/ > />/' | sed 's/ < /</' >> $SUMMARY
1587 jmc 1.138 echo "fresults='$fres'" | sed 's/ 99/ --/g' >> $locDIR"/summary.txt"
1588 edhill 1.34
1589     for ex in $extra_runs ; do
1590 jmc 1.73 unset run
1591 jmc 1.175 results=$EMPTY_RESULTS
1592 jmc 1.106 # reference output file
1593     refExOut=`echo $ref_outp | sed "s/\./.${ex}./g"`
1594 jmc 1.158 # Create an output dir & summary.txt file for each extra run (tdir.ex)
1595 jmc 1.138 locDIR=$DRESULTS"/"$dir"."$ex
1596     mkdir $locDIR
1597 jmc 1.158 #- report to this experiment local summary file ---
1598     echo "DATE='$DATE' ; tdir='$dir.$ex'" > $locDIR"/summary.txt"
1599     #echo "MACH='$MACH'" >> $locDIR"/summary.txt"
1600     #echo "UNAMEA='$UNAMEA'" >> $locDIR"/summary.txt"
1601 jmc 1.138 CDIR=`pwd`"/$locDIR"
1602 jmc 1.143 test ! -e "$dir/$pfxdir.$ex" && mkdir "$dir/$pfxdir.$ex"
1603     run_clean $dir/$pfxdir.$ex
1604     linkdata $dir/$pfxdir.$ex $inputdir.$ex $inputdir
1605     runmodel $dir/$pfxdir.$ex && run=Y \
1606     && results=`testoutput_run $dir $pfxdir.$ex $refExOut`
1607 edhill 1.34 fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1608     fres="$fres.$ex"
1609 jmc 1.139 echo 1>&2
1610 jmc 1.100 echo "$fres" | sed 's/ 99/ --/g' | sed 's/ > />/' | sed 's/ < /</' >> $SUMMARY
1611 jmc 1.138 echo "fresults='$fres'" | sed 's/ 99/ --/g' >> $locDIR"/summary.txt"
1612 jmc 1.156 if test "x$POSTCLEAN" = x2 ; then
1613 jmc 1.143 run_clean $dir/$pfxdir.$ex
1614 jmc 1.83 fi
1615 edhill 1.34 done
1616 edhill 1.68
1617 jmc 1.176 if test ! -f $DRESULTS"/"genmake_state ; then
1618 jmc 1.137 if test -f $dir/$builddir/Makefile ; then
1619     mkOpt=`grep '^# OPTFILE=' $dir/$builddir/Makefile 2>/dev/null | head -1 | sed 's/^# //'`
1620     echo "from '$dir/$builddir/Makefile', extract:" > $DRESULTS/genmake_state
1621     sed -n '/^# executed by:/,+1 p' $dir/$builddir/Makefile >> $DRESULTS/genmake_state
1622 jmc 1.151 echo " $mkOpt" >> $DRESULTS/genmake_state
1623 jmc 1.152 if test "x$OPTFILE" = xNONE ; then
1624     eval $mkOpt
1625     sed "/^No \"OPTFILE\" was specified ; genmake2/a\ OPTFILE=${OPTFILE}"\
1626 jmc 1.176 $SUMMARY > tmp.tr_log
1627 jmc 1.152 RETVAL=$?
1628     if test "x$RETVAL" = x0 ; then rm -f $SUMMARY
1629 jmc 1.176 cp tmp.tr_log $SUMMARY
1630     else rm -f tmp.tr_log
1631 jmc 1.152 fi
1632     fi
1633 jmc 1.150 gmkLog=$dir/$builddir/genmake.log
1634 jmc 1.176 if test -r $gmkLog ; then
1635     grep '^Get compiler version using:' $gmkLog > /dev/null 2>&1
1636     RETVAL=$?
1637     if test "x$RETVAL" = x0 ; then
1638     echo -n "from '$gmkLog', " >> $DRESULTS/genmake_state
1639     echo "extract compiler version:" >> $DRESULTS/genmake_state
1640     sed -n '/Get compiler version/,/<-- compiler version/p' \
1641     $gmkLog | grep -v '^... compiler version ' > tmp.tr_log
1642     sed -n '1p' tmp.tr_log >> $DRESULTS/genmake_state
1643     sed -n '2,/^$/p' tmp.tr_log | sed '/^$/d' | sed 's/^./ &/' \
1644     >> $DRESULTS/genmake_state
1645     rm -f tmp.tr_log
1646     fi
1647     echo -n "from '$gmkLog', " >> $DRESULTS/genmake_state
1648     echo "get NETCDF & LAPACK settings:" >> $DRESULTS/genmake_state
1649     sed -n '/set HAVE_NETCDF=/p' $gmkLog >> $DRESULTS/genmake_state
1650     sed -n '/set HAVE_LAPACK=/p' $gmkLog >> $DRESULTS/genmake_state
1651 jmc 1.150 fi
1652 jmc 1.137 fi
1653     fi
1654 jmc 1.83 #postclean $dir/$builddir
1655 jmc 1.156 if test "x$POSTCLEAN" = x2 ; then
1656 jmc 1.175 makeclean $dir/$builddir \
1657     && run_clean $dir/$rundir
1658 jmc 1.83 fi
1659 jmc 1.156 if test "x$MPI" != x0 -a "x$MPI_MFILE" != x ; then rm -f $LOC_MFILE ; fi
1660 jmc 1.135
1661 edhill 1.10 echo "-------------------------------------------------------------------------------"
1662 jmc 1.135
1663 edhill 1.1 done
1664    
1665 edhill 1.34 printf "Start time: " >> $SUMMARY
1666 jmc 1.114 echo "$start_date" >> $SUMMARY
1667 edhill 1.34 printf "End time: " >> $SUMMARY
1668 edhill 1.13 date >> $SUMMARY
1669 edhill 1.20
1670     # If addresses were supplied and mpack built successfully, then try
1671     # to send email using mpack.
1672     if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then
1673     echo "No results email was sent."
1674     else
1675     if test "x$HAVE_MPACK" = xt ; then
1676     tar -cf $DRESULTS".tar" $DRESULTS > /dev/null 2>&1 \
1677     && gzip $DRESULTS".tar" \
1678 edhill 1.44 && $MPACK -s MITgcm-test -m 3555000 $DRESULTS".tar.gz" $ADDRESSES
1679 edhill 1.20 RETVAL=$?
1680     if test "x$RETVAL" != x0 ; then
1681     echo
1682     echo "Warning: The tar, gzip, & mpack step failed. Please send email"
1683     echo " to <MITgcm-support@mitgcm.org> for help. You may copy the "
1684     echo " summary of results from the directory \"$DRESULTS\"."
1685     echo
1686     else
1687     echo
1688     echo "An email containing results was sent to the following addresses:"
1689     echo " \"$ADDRESSES\""
1690     echo
1691 jmc 1.129 test -f $DRESULTS".tar" && rm -f $DRESULTS".tar"
1692     test -f $DRESULTS".tar.gz" && rm -f $DRESULTS".tar.gz"
1693 edhill 1.20 fi
1694     fi
1695     fi
1696 edhill 1.13
1697 jmc 1.133 if test "x$QUICK" = xf -a "x$NORUN" = xf ; then
1698     rm -f tr_cmpnum.c tr_cmpnum
1699     fi
1700 edhill 1.1
1701 edhill 1.12 if test "x$CLEANUP" != xt ; then
1702 jmc 1.102 cat $SUMMARY | sed 's/ \. \. \. \. \. \. \. \. \. \. \. \. //'
1703 edhill 1.25 if test -e tr_out.txt ; then
1704 jmc 1.175 mv tr_out.txt tr_out.txt.old
1705 edhill 1.14 fi
1706 jmc 1.103 cat $SUMMARY | sed '/^[YN] [YN] [YN] [YN]/ s/ \. //g' > tr_out.txt
1707 edhill 1.12 fi
1708 edhill 1.1
1709 edhill 1.40 if test "x$DELDIR" = xt ; then
1710     rm -rf $DRESULTS
1711     fi
1712 jmc 1.178 echo "======== End of testreport execution ========"

  ViewVC Help
Powered by ViewVC 1.1.22