/[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.174 - (hide annotations) (download)
Wed Jun 27 15:20:51 2012 UTC (11 years, 9 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint63p, checkpoint63q, checkpoint63r, checkpoint63o
Changes since 1.173: +6 -4 lines
refine previous modif

1 edhill 1.19 #! /usr/bin/env bash
2 edhill 1.1 #
3 jmc 1.174 # $Header: /u/gcmpack/MITgcm/verification/testreport,v 1.173 2012/06/26 22:30:54 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 edhill 1.24 echo " (-adm|-ad) perform an adjoint run"
39 utke 1.120 echo " (-oad) perform an OpenAD adjoint run"
40 jmc 1.136 echo " (-command|-c) STRING command to run"
41 jmc 1.141 echo " (-makedepend|-md) STRING command to use for \"makedepend\""
42 jmc 1.136 echo " (-make|-m) STRING command to use for \"make\""
43 edhill 1.8 echo " (DEF=\"make\")"
44 jmc 1.70 echo " (-odir) STRING used to build output directory name"
45     echo " (DEF=\"hostname\")"
46 jmc 1.156 # echo " (-ptracers|-ptr) STRING specify which ptracers to test"
47     # echo " (DEF=\"1 2 3 4 5\")"
48 jmc 1.92 echo " (-match) NUMBER Matching Criteria (number of digits)"
49 jmc 1.141 echo " (DEF=\"$MATCH_CRIT\")"
50 edhill 1.43 echo " (-j) JOBS use \"make -j JOBS\" for parallel builds"
51 jmc 1.165 echo " (-ef) STRING used as genmake2 \"-extra_flag\" argument"
52 jmc 1.156 echo " (-clean) *ONLY* run \"make CLEAN\" & clean run-dir"
53 jmc 1.133 echo " (-norun|-nr) skip the \"runmodel\" stage (stop after make)"
54 jmc 1.165 echo " (-obj) only produces objects (=norun & no executable)"
55 jmc 1.136 echo " (-runonly|-ro) *ONLY* run stage (=\"-quick\" without make)"
56 ce107 1.90 echo " (-quick|-q) same as \"-nogenmake -noclean -nodepend\""
57     echo " (-nogenmake|-ng) skip the genmake stage"
58     echo " (-noclean|-nc) skip the \"make clean\" stage"
59     echo " (-nodepend|-nd) skip the \"make depend\" stage"
60 jmc 1.156 echo " (-postclean|-pc) after each exp. test, clean build-dir & run-dir"
61     echo " (-deloutp|-do) delete output files after successful run"
62 ce107 1.90 echo " (-deldir|-dd) on success, delete the output directory"
63     echo " (-ts) provide timing information per timestep"
64     echo " (-papis) provide MFlop/s per timestep using PAPI"
65     echo " (-pcls) provide MFlop/s per timestep using PCL"
66 edhill 1.6 echo
67 edhill 1.50 echo "and where STRING can be a whitespace-delimited list"
68 edhill 1.6 echo "such as:"
69 edhill 1.50 echo
70 edhill 1.6 echo " -t 'exp0 exp2 exp3' "
71     echo " -addr='abc@123.com testing@home.org'"
72 edhill 1.1 echo
73 edhill 1.50 echo "provided that the expression is properly quoted within the current"
74     echo "shell (note the use of single quotes to protect white space)."
75     echo
76 edhill 1.1 exit 1
77     }
78    
79     # build the mpack utility
80     build_mpack()
81     {
82 edhill 1.34 printf "building the mpack utility... "
83 jmc 1.113 MPACK="$MPACKDIR/mpack"
84     if test ! -x $MPACK ; then
85 edhill 1.1 if test ! -d $MPACKDIR ; then
86 edhill 1.20 echo
87 edhill 1.1 echo "Error: can't find \"$MPACKDIR\""
88     echo " are you sure this program is being run in the correct "
89     echo " (that is, \"MITGCM_ROOT\verification\") directory?"
90 edhill 1.20 echo
91     HAVE_MPACK=f
92 edhill 1.1 fi
93 edhill 1.26 if test "x$CC" = x ; then
94     export CC=cc
95     fi
96 jmc 1.112 printf "building mpack (using CC=$CC)... "
97 edhill 1.25 ( cd $MPACKDIR && ./configure && $MAKE ) > tr_build_mpack.out 2>&1
98 edhill 1.1 RETVAL=$?
99     if test "x$RETVAL" != x0 ; then
100     echo
101     echo "Error building the mpack tools at: $MPACK_DIR"
102 edhill 1.20 echo
103     HAVE_MPACK=f
104     else
105 edhill 1.25 rm -f tr_build_mpack.out
106 edhill 1.20 HAVE_MPACK=t
107 jmc 1.113 echo "done"
108 edhill 1.1 fi
109 edhill 1.20 else
110     HAVE_MPACK=t
111 jmc 1.113 echo "already exist"
112 edhill 1.1 fi
113     }
114    
115 jmc 1.93 testoutput_var()
116 edhill 1.1 {
117 jmc 1.99 # testoutput_var dir s1 label subdir reference_output
118 edhill 1.1 #
119 jmc 1.135 # compares 1 variable output selected from file $dir/$subdir/$OUTPUTFILE
120 jmc 1.99 # with same output from reference file $dir/results/$reference_output
121 jmc 1.93 # using search strings s1 and text label
122 edhill 1.1
123     if [ $debug -gt 0 ]; then
124 jmc 1.93 echo testoutput_var: grep "$2" $1/$4/$OUTPUTFILE 1>&2
125 edhill 1.1 fi
126 jmc 1.87 if [ -r $1/$4/$OUTPUTFILE ]; then
127     grep "$2" $1/$4/$OUTPUTFILE | sed 's/.*=//' | cat -n > tmp1.txt
128 jmc 1.67 lncntA=`wc -l tmp1.txt | awk '{print $1}' `
129 jmc 1.100 if [ $lncntA -lt 2 ]; then
130 edhill 1.1 if [ $verbose -gt 0 ]; then
131     echo Not enough lines of output when searching for "$2" 1>&2
132     fi
133     return 99
134     fi
135     else
136 jmc 1.93 echo testoutput_var: $OUTPUTFILE from model run was not readable 1>&2
137 edhill 1.1 return 99
138     fi
139     if [ $debug -gt 0 ]; then
140 jmc 1.99 echo testoutput_var: grep "$2" $1/results/$5 1>&2
141 edhill 1.1 fi
142 jmc 1.99 grep "$2" $1/results/$5 | sed 's/.*=//' | cat -n > tmp2.txt
143 jmc 1.67 lncntB=`wc -l tmp2.txt | awk '{print $1}' `
144 jmc 1.100 if [ $lncntB -lt 2 ]; then
145 edhill 1.1 if [ $verbose -gt 0 ]; then
146     echo Not enough lines of output when searching for "$2" 1>&2
147     fi
148     return 99
149     fi
150 jmc 1.67 if [ $lncntA -ne $lncntB ]; then
151     if [ $verbose -gt 0 ]; then
152     echo Not same Nb of lines when searching for "$2" ":" $lncntA $lncntB 1>&2
153     fi
154     return 99
155     fi
156 edhill 1.72 has_nan=`cat tmp1.txt | grep -i nan | wc -l`
157     if [ $has_nan -gt 0 ] ; then
158 jmc 1.93 echo testoutput_var: $OUTPUTFILE contains $has_nan NaN values 1>&2
159 edhill 1.72 return 99
160     fi
161     has_inf=`cat tmp1.txt | grep -i inf | wc -l`
162     if [ $has_inf -gt 0 ] ; then
163 jmc 1.93 echo testoutput_var: $OUTPUTFILE contains $has_inf Inf values 1>&2
164 jmc 1.71 return 99
165     fi
166 edhill 1.1 if [ $debug -gt 0 ]; then
167 jmc 1.93 echo testoutput_var: join tmp1.txt tmp2.txt 1>&2
168 edhill 1.1 fi
169     join tmp1.txt tmp2.txt | awk '{print $1 " " $2 " " $3}' > tmp3.txt
170     if [ $debug -gt 0 ]; then
171 jmc 1.93 echo testoutput_var: compare_lines 1>&2
172 edhill 1.1 fi
173 edhill 1.22 if [ $verbose -gt 1 ]; then
174     cat tmp3.txt 1>&2
175     fi
176     echo "-1" >> tmp3.txt
177 edhill 1.23 # On the SGI O3K (*not* the O2K), "cat -n" inserts a ":" after the line number
178     cat tmp3.txt | sed -e 's|:||g' > tmp4.txt
179 jmc 1.91 digits_of_similarity=`./tr_cmpnum < tmp4.txt`
180 edhill 1.1 if [ $digits_of_similarity -eq 99 ]; then
181     if [ $verbose -gt 0 ]; then
182 jmc 1.99 echo testoutput_var: No comparison was available for \"$3\" 1>&2
183 edhill 1.1 fi
184     digits_of_similarity=99
185     else
186     if [ $verbose -gt 0 ]; then
187 jmc 1.99 echo There were $digits_of_similarity decimal places of similarity for \"$3\" 1>&2
188 edhill 1.1 fi
189     fi
190 edhill 1.23 rm -f tmp1.txt tmp2.txt tmp3.txt tmp4.txt
191 jmc 1.135
192 edhill 1.1 return $digits_of_similarity
193     }
194    
195 jmc 1.93 testoutput_run()
196 edhill 1.1 {
197 jmc 1.99 # testoutput_run directory subdir reference_output
198 edhill 1.1 #
199 jmc 1.93 # test output from 1 run in "directory"
200 jmc 1.103 # --> same processing for adjoint & forward test
201 jmc 1.94 # default list of output variables to be checked:
202     # 1rst : main variable used to decide if it pass or FAIL
203     # others : number of matching digits to be printed in summary.txt
204     listChk=$DEF_CHECK_LIST
205     # load experiment-specific list from file "tr_checklist" (if it exist)
206     if test -r $1/$2/tr_checklist ; then listChk=`cat $1/$2/tr_checklist` ; fi
207     sVar=`echo $listChk | awk '{print $1}'`
208     # remove 1rst var and expand the list: + => min max mean s.d
209 jmc 1.97 listVar=`echo $listChk | sed 's/ [a-zA-Z0-9]*+/&mn &mx &av &sd/g' \
210     | sed 's/+//g' | sed "s/^$sVar//"`
211 jmc 1.94 if [ $debug -gt 0 ]; then echo "testoutput_run: listVar(I)='$listVar'" 1>&2 ; fi
212 jmc 1.117 # check for ptracer output in reference_output file :
213     outpref=$1/results/$3
214     ptr_mon="trcstat_ptracerXX_min trcstat_ptracerXX_max"
215     ptr_mon="$ptr_mon trcstat_ptracerXX_mean trcstat_ptracerXX_sd"
216     for ii in $PTRACERS_NUM ; do
217     ptrfound=0
218     for jj in $ptr_mon ; do
219     name=`eval "echo $jj | sed -e 's|XX|0"$ii"|g'"`
220     tst=`grep $name $outpref | wc -l | awk '{print $1}'`
221     if test ! "x$tst" = x0 ; then ptrfound=1 ; fi
222     done
223     if test $ptrfound = '1' ; then
224     eval "HAVE_PTR0"$ii"=t"
225     else
226     eval "HAVE_PTR0"$ii"=f"
227 utke 1.120 if test "x$ADM" = x -a "x$OADM" = x; then
228 jmc 1.117 # remove this ptr from the list of output variable to check
229     # echo "-- ptr test=" $tst "number of var=" `echo $listVar | awk '{print NF}'` 1>&2
230     listVar=`echo "$listVar" | sed "s/ pt$ii..//g"`
231     fi
232     fi
233     # eval 'echo "HAVE_PTR0'$ii' = $HAVE_PTR0'$ii'"' 1>&2
234     done
235 mlosch 1.116 tst=`echo $sVar $listVar | awk '{ for(i=2;i<=NF;i++){if($i==$1)t+=1}; print t }'`
236 jmc 1.94 if test $tst != 1 ; then
237     if test $tst = 0 ; then echo "==> WARNING: selected var >$sVar< not found" 1>&2
238     else echo "==> WARNING: found selected var >$sVar< $tst times" 1>&2 ; fi
239     echo "==> WARNING: in checked list:" $listVar 1>&2
240     #- put it back once:
241     listVar=" $sVar "`echo "$listVar " | sed "s/ $sVar / /g"`
242     fi
243     if [ $debug -gt 0 ]; then echo "testoutput_run: listVar(M)='$listVar'" 1>&2 ; fi
244 jmc 1.154 echo "listVar='$listVar'" >> $locDIR"/summary.txt"
245     #---
246 jmc 1.94 allargs=""
247     for xx in $listVar
248     do
249     case $xx in
250     'PS') if [ $debug -gt 0 ]
251     then echo testoutput_run: testoutput_var $1 cg2d_init_res 1>&2 ; fi
252 jmc 1.99 testoutput_var $1 "cg2d_init_res" "Press. Solver (cg2d)" $2 $3; yy=$?
253 jmc 1.94 if [ $debug -gt 0 ] ; then echo testoutput_run: cg2dres=$yy 1>&2 ; fi ;;
254 jmc 1.167 'Cost') testoutput_var $1 "ADM ref_cost_function" "ADM CostFct" $2 $3; yy=$? ;;
255     'AdGrd') testoutput_var $1 "ADM adjoint_gradient" "ADM Ad Grad" $2 $3; yy=$? ;;
256     'FDGrd') testoutput_var $1 "ADM finite-diff_grad" "ADM FD Grad" $2 $3; yy=$? ;;
257 jmc 1.99 'Tmn') testoutput_var $1 "dynstat_theta_min" "Theta minimum" $2 $3; yy=$? ;;
258     'Tmx') testoutput_var $1 "dynstat_theta_max" "Theta maximum" $2 $3; yy=$? ;;
259     'Tav') testoutput_var $1 "dynstat_theta_mean" "Theta mean" $2 $3; yy=$? ;;
260     'Tsd') testoutput_var $1 "dynstat_theta_sd" "Theta Std.Dev" $2 $3; yy=$? ;;
261     'Smn') testoutput_var $1 "dynstat_salt_min" "Salt minimum" $2 $3; yy=$? ;;
262     'Smx') testoutput_var $1 "dynstat_salt_max" "Salt maximum" $2 $3; yy=$? ;;
263     'Sav') testoutput_var $1 "dynstat_salt_mean" "Salt mean" $2 $3; yy=$? ;;
264     'Ssd') testoutput_var $1 "dynstat_salt_sd" "Salt Std.Dev" $2 $3; yy=$? ;;
265 jmc 1.94 'Umn') testoutput_var $1 "dynstat_uvel_min" "U minimum" $2 $3; yy=$? ;;
266     'Umx') testoutput_var $1 "dynstat_uvel_max" "U maximum" $2 $3; yy=$? ;;
267     'Uav') testoutput_var $1 "dynstat_uvel_mean" "U mean" $2 $3; yy=$? ;;
268 jmc 1.99 'Usd') testoutput_var $1 "dynstat_uvel_sd" "U Std.Dev" $2 $3; yy=$? ;;
269 jmc 1.94 'Vmn') testoutput_var $1 "dynstat_vvel_min" "V minimum" $2 $3; yy=$? ;;
270     'Vmx') testoutput_var $1 "dynstat_vvel_max" "V maximum" $2 $3; yy=$? ;;
271     'Vav') testoutput_var $1 "dynstat_vvel_mean" "V mean" $2 $3; yy=$? ;;
272 jmc 1.99 'Vsd') testoutput_var $1 "dynstat_vvel_sd" "V Std.Dev" $2 $3; yy=$? ;;
273 jmc 1.94 'pt1mn'|'pt2mn'|'pt3mn'|'pt4mn'|'pt5mn') ii=`echo $xx | sed 's/pt//' | sed 's/..$//'`
274     testoutput_var $1 "trcstat_ptracer0"$ii"_min" "p0"$ii"_min" $2 $3; yy=$? ;;
275     'pt1mx'|'pt2mx'|'pt3mx'|'pt4mx'|'pt5mx') ii=`echo $xx | sed 's/pt//' | sed 's/..$//'`
276     testoutput_var $1 "trcstat_ptracer0"$ii"_max" "p0"$ii"_max" $2 $3; yy=$? ;;
277     'pt1av'|'pt2av'|'pt3av'|'pt4av'|'pt5av') ii=`echo $xx | sed 's/pt//' | sed 's/..$//'`
278     testoutput_var $1 "trcstat_ptracer0"$ii"_mean" "p0"$ii"_mean" $2 $3; yy=$? ;;
279     'pt1sd'|'pt2sd'|'pt3sd'|'pt4sd'|'pt5sd') ii=`echo $xx | sed 's/pt//' | sed 's/..$//'`
280 jmc 1.99 testoutput_var $1 "trcstat_ptracer0"$ii"_sd" "p0"$ii"_StDv" $2 $3; yy=$? ;;
281 jmc 1.130 'Qntmn') testoutput_var $1 "forcing_qnet_min" "Qnet minimum" $2 $3; yy=$? ;;
282     'Qntmx') testoutput_var $1 "forcing_qnet_max" "Qnet maximum" $2 $3; yy=$? ;;
283     'Qntav') testoutput_var $1 "forcing_qnet_mean" "Qnet mean" $2 $3; yy=$? ;;
284     'Qntsd') testoutput_var $1 "forcing_qnet_sd" "Qnet Std.Dev" $2 $3; yy=$? ;;
285 jmc 1.101 'aSImn') testoutput_var $1 "seaice_area_min" "SIce Area min" $2 $3; yy=$? ;;
286     'aSImx') testoutput_var $1 "seaice_area_max" "SIce Area max" $2 $3; yy=$? ;;
287     'aSIav') testoutput_var $1 "seaice_area_mean" "SIce Area mean" $2 $3; yy=$? ;;
288     'aSIsd') testoutput_var $1 "seaice_area_sd" "SIce Area StDv" $2 $3; yy=$? ;;
289     'hSImn') testoutput_var $1 "seaice_heff_min" "SIce Heff min" $2 $3; yy=$? ;;
290 jmc 1.126 'hSImx') testoutput_var $1 "seaice_heff_max" "SIce Heff max" $2 $3; yy=$? ;;
291     'hSIav') testoutput_var $1 "seaice_heff_mean" "SIce Heff mean" $2 $3; yy=$? ;;
292     'hSIsd') testoutput_var $1 "seaice_heff_sd" "SIce Heff StDv" $2 $3; yy=$? ;;
293 mlosch 1.170 'uSImn') testoutput_var $1 "seaice_uice_min" "SIce Uice min" $2 $3; yy=$? ;;
294     'uSImx') testoutput_var $1 "seaice_uice_max" "SIce Uice max" $2 $3; yy=$? ;;
295     'uSIav') testoutput_var $1 "seaice_uice_mean" "SIce Uice mean" $2 $3; yy=$? ;;
296     'uSIsd') testoutput_var $1 "seaice_uice_sd" "SIce Uice StDv" $2 $3; yy=$? ;;
297     'vSImn') testoutput_var $1 "seaice_vice_min" "SIce Vice min" $2 $3; yy=$? ;;
298     'vSImx') testoutput_var $1 "seaice_vice_max" "SIce Vice max" $2 $3; yy=$? ;;
299     'vSIav') testoutput_var $1 "seaice_vice_mean" "SIce Vice mean" $2 $3; yy=$? ;;
300     'vSIsd') testoutput_var $1 "seaice_vice_sd" "SIce Vice StDv" $2 $3; yy=$? ;;
301 jmc 1.101 'AthSiG') testoutput_var $1 "thSI_Ice_Area_G" "thSIc Area Global" $2 $3; yy=$? ;;
302     'AthSiS') testoutput_var $1 "thSI_Ice_Area_S" "thSIc Area South" $2 $3; yy=$? ;;
303     'AthSiN') testoutput_var $1 "thSI_Ice_Area_N" "thSIc Area North" $2 $3; yy=$? ;;
304     'HthSiG') testoutput_var $1 "thSI_IceH_ave_G" "thSIc H Global" $2 $3; yy=$? ;;
305     'HthSiS') testoutput_var $1 "thSI_IceH_ave_S" "thSIc H South" $2 $3; yy=$? ;;
306     'HthSiN') testoutput_var $1 "thSI_IceH_ave_N" "thSIc H North" $2 $3; yy=$? ;;
307 jmc 1.94 *) yy=99; echo "WARNING: asking for var=$xx : not recognized !" 1>&2 ;;
308     esac
309     if test $xx = $sVar
310     then allargs="$allargs > $yy <"
311     else allargs="$allargs $yy"
312     fi
313     done
314    
315     nbVar=`echo $listVar | awk '{print NF}'`
316 jmc 1.135 if [ $nbVar -lt $LEN_CHECK_LIST ] ; then
317 jmc 1.94 #-- fill line (up to standard length) with dot:
318 jmc 1.97 adNul=`expr $LEN_CHECK_LIST - $nbVar | awk '{for(i=1;i<=$1;i++){print "."}}'`
319 jmc 1.94 echo $allargs $adNul
320     else
321     echo $allargs
322 jmc 1.135 fi
323 jmc 1.103 # <-- same processing for adjoint & forward test
324 edhill 1.1 }
325    
326     genmakemodel()
327     {
328     # genmakemodel directory
329 edhill 1.10 if test "x$NOGENMAKE" = xt ; then
330     echo "genmake skipped!"
331     else
332 edhill 1.34 if test "x$BASH" = x ; then
333     GENMAKE2="../../../tools/genmake2"
334     else
335     GENMAKE2="$BASH ../../../tools/genmake2 -bash $BASH"
336     fi
337 edhill 1.10 (
338     cd $1;
339 edhill 1.24 command="$GENMAKE2 -ds -m $MAKE"
340 jmc 1.141 if test "x$MKDEPEND" != x ; then
341     command="$command -makedepend=$MKDEPEND"
342     fi
343 utke 1.120 if test "x$ADM" = xt ; then
344     command="$command --mods=../code_ad"
345     elif test "x$OADM" = xt ; then
346     command="$command -adof ../../../tools/adjoint_options/adjoint_oad -mods '../code_oad ../../OpenAD/code_oad_all'"
347     else
348 jmc 1.124 command="$command -mods=../code"
349 edhill 1.24 fi
350 edhill 1.10 if test "x$OPTFILE" != xNONE ; then
351 jmc 1.124 command="$command -optfile=$OPTFILE"
352 edhill 1.10 fi
353 jmc 1.164 if test $OptLev = 1 ; then
354     command="$command -ieee"
355     fi
356     if test $OptLev = 0 ; then
357     command="$command -devel"
358 edhill 1.10 fi
359 jmc 1.109 if test "x$GSL" = xt ; then
360     command="$command -gsl"
361     fi
362 jmc 1.154 if test "x$MPI" != x0 ; then
363 edhill 1.66 command="$command -mpi"
364     fi
365 jmc 1.122 if test "x$MULTI_THREAD" = xt ; then
366     #- run multi-threaded using OpenMP:
367     command="$command -omp"
368     fi
369 jmc 1.135 if test "x$USE_R4" = xt ; then
370     command="$command -use_r4"
371     fi
372 jmc 1.165 if test "x$EXTRFLG" != x ; then
373     command="$command -extra_flag $EXTRFLG"
374     fi
375 ce107 1.90 if test "x$TS" = xt ; then
376     command="$command -ts"
377     fi
378     if test "x$PAPIS" = xt ; then
379     command="$command -papis"
380 jmc 1.135 else
381 ce107 1.90 if test "x$PCLS" = xt ; then
382     command="$command -pcls"
383     fi
384     fi
385 jmc 1.139 printf 'genmake ... '
386 jmc 1.146 eval $command > genmake.tr_log 2>&1
387 edhill 1.10 RETVAL=$?
388 edhill 1.44 # Reduce the size of the testing emails!
389 edhill 1.47 head -100 Makefile > $CDIR/Makefile_head
390 edhill 1.10 if test "x$RETVAL" != x0 ; then
391 jmc 1.146 tail genmake.tr_log
392 jmc 1.139 echo "genmakemodel: genmake failed"
393 jmc 1.148 cp genmake.log genmake_* genmake.tr_log $CDIR
394 edhill 1.10 return 1
395     else
396 jmc 1.139 echo "successful"
397 edhill 1.1 fi
398 edhill 1.10 )
399     fi
400 edhill 1.1 }
401    
402     makeclean()
403     {
404     # makeclean directory
405 jmc 1.146 if test "x$NODEPEND" = xf ; then rm -f $1/make.tr_log ; fi
406 edhill 1.10 if test "x$NOCLEAN" = xt ; then
407 jmc 1.83 echo "make Clean skipped!"
408 edhill 1.10 else
409     (
410     cd $1;
411 jmc 1.87 #if test -e $OUTPUTFILE ; then rm -f $OUTPUTFILE ; fi
412 edhill 1.10 if test -r Makefile ; then
413 jmc 1.139 printf 'clean build-dir: make Clean ... '
414 jmc 1.146 $MAKE Clean >> make.tr_log 2>&1
415 edhill 1.10 RETVAL=$?
416     if test "x$RETVAL" != x0 ; then
417 jmc 1.146 tail make.tr_log
418 jmc 1.139 echo "makeclean: \"make Clean\" failed"
419 jmc 1.148 cp make.tr_log genmake.log genmake.tr_log $CDIR
420 edhill 1.10 return 1
421     fi
422 jmc 1.139 echo successful
423 jmc 1.127 else
424     echo ''
425 edhill 1.10 fi
426     exit 0
427     )
428     fi
429     }
430    
431 jmc 1.83 run_clean()
432 edhill 1.68 {
433 jmc 1.83 # run_clean directory
434     if test "x$NOCLEAN" = xt ; then
435     echo "run_clean skipped!"
436     else
437 edhill 1.68 (
438     cd $1;
439 jmc 1.139 printf 'clean run-dir ... '
440 jmc 1.83 # part of what is done after "make clean" when doing "make CLEAN"
441     find . -name "*.meta" -exec rm {} \;
442     find . -name "*.data" -exec rm {} \;
443     find . -name "fort.*" -exec rm {} \;
444     find . -type l -exec rm {} \;
445 jmc 1.161 #- should remove executable only if sym-link (alredy done above)
446 jmc 1.172 rm -f $RUNLOG *.txt STD* w2_tile_topology.????.log *diagnostics.log datetime
447 jmc 1.83 rm -rf mnc_test_*
448 jmc 1.107 rm -f *_MIT_CE_000.opt0000 costfunction*0000
449 jmc 1.139 echo successful
450 edhill 1.68 exit 0
451     )
452     fi
453     }
454    
455 edhill 1.10 makedependmodel()
456     {
457     # makedependmodel directory
458     if test "x$NODEPEND" = xt ; then
459     echo "make depend skipped!"
460     else
461     (
462     cd $1;
463 jmc 1.139 printf 'make depend ... '
464 jmc 1.146 $MAKE depend >> make.tr_log 2>&1
465 edhill 1.1 RETVAL=$?
466     if test "x$RETVAL" != x0 ; then
467 jmc 1.146 tail make.tr_log
468 jmc 1.139 echo "makedependmodel: make depend failed"
469 jmc 1.148 cp make.tr_log genmake.log genmake.tr_log $CDIR
470 edhill 1.1 return 1
471 edhill 1.10 else
472 jmc 1.139 echo successful
473 edhill 1.1 fi
474 edhill 1.10 )
475     fi
476 edhill 1.1 }
477    
478     makemodel()
479     {
480     # makemodel directory
481     (
482 jmc 1.159 mk_fail=0
483 jmc 1.136 if test "x$NOMAKE" = xt ; then
484     cd $1;
485     if test -x $EXECUTABLE ; then
486     echo "make skipped!"
487     else
488     echo "no executable!"
489 jmc 1.159 mk_fail=3
490 jmc 1.136 fi
491     else
492 edhill 1.1 cd $1;
493     if test -r Makefile ; then
494 jmc 1.139 printf 'make ... '
495 jmc 1.171 if test "x$REPLMAKE" = x ; then
496     $MAKE $TARG >> make.tr_log 2>&1
497     else
498     $REPLMAKE $TARG >> make.tr_log 2>&1
499     fi
500 edhill 1.1 RETVAL=$?
501     if test "x$RETVAL" != x0 ; then
502 jmc 1.146 tail make.tr_log
503 jmc 1.139 echo failed
504 jmc 1.163 cp genmake.log genmake.tr_log $CDIR
505     tail -$NBLINES_MKLOG make.tr_log > $CDIR"/make.tr_log_tail"
506 jmc 1.131 rm -f $EXECUTABLE
507 jmc 1.159 mk_fail=1
508 edhill 1.1 else
509 jmc 1.139 echo successful
510 edhill 1.1 fi
511 jmc 1.159 else
512     echo "no Makefile !"
513     mk_fail=2
514 edhill 1.1 fi
515 jmc 1.136 fi
516 jmc 1.158 if test "x$ADM" = xt -a -f taf_ad.log ; then
517     head -1 taf_ad.log >> $CDIR"/summary.txt"
518     nerr=`grep -c 'TAF *.* ERROR ' taf_ad.log`
519     nwar=`grep -c 'TAF RECOMPUTATION *.* WARNING ' taf_ad.log`
520     echo " TAF reports $nerr Errors and $nwar Recomputation Warnings" \
521     >> $CDIR"/summary.txt"
522     fi
523 jmc 1.159 if test $mk_fail != 0 ; then return $mk_fail ; fi
524 edhill 1.1 )
525     }
526    
527 jmc 1.154 mk_mpi_size()
528     {
529 jmc 1.173 # mk_mpi_size input_file output_file proc_Nb threads_Nb_X threads_Nb_Y
530 jmc 1.154 #
531 jmc 1.173 # make new SIZE.h (=output_file) from SIZE.h_mpi (=input_file)
532 jmc 1.154 # for an MPI build with no more than proc_Nb processors ;
533 jmc 1.173 # ensure that enough tiles per proc (nSx,nSy) remain for the given
534     # number of threads (nTx,nTy) ;
535     # return the effective number of processors.
536 jmc 1.154
537     inp=$1
538     out=$2
539     np=$3
540 jmc 1.173 tx=$4
541     ty=$5
542 jmc 1.154 tmp=TTT.$$
543    
544 jmc 1.173 # dirX : select with direction to favor in MPI process repartition
545     # dirX=1 : prefer to put more proc in X direction
546     # dirX=0 : prefer to put more proc in Y direction
547     dirX=0
548    
549 jmc 1.154 px=`grep "^ & *nPx *=" $inp | sed "s/^ & *nPx *= *//" | sed 's/, *$//'`
550     py=`grep "^ & *nPy *=" $inp | sed "s/^ & *nPy *= *//" | sed 's/, *$//'`
551     sx=`grep "^ & *nSx *=" $inp | sed "s/^ & *nSx *= *//" | sed 's/, *$//'`
552     sy=`grep "^ & *nSy *=" $inp | sed "s/^ & *nSy *= *//" | sed 's/, *$//'`
553    
554 jmc 1.173 #- for each direction, assume # of threads is a multiple of total number of tiles
555     nx=$px
556     if [ `expr $sx % $tx` -ne 0 -a `expr $sx \* $px % $tx` -eq 0 ] ; then
557     nx=`expr $sx \* $px / $tx`
558     if [ $verbose -gt 1 ]; then
559     echo " change px from $px to $nx to accommodate $tx threads"
560     fi
561     fi
562     ny=$py
563     if [ `expr $sy % $ty` -ne 0 -a `expr $sy \* $py % $ty` -eq 0 ] ; then
564     ny=`expr $sy \* $py / $ty`
565     if [ $verbose -gt 1 ]; then
566     echo " change py from $py to $ny to accommodate $ty threads"
567     fi
568     fi
569 jmc 1.154 #- find the largest divisor of input_file proc Nb, but not larger than $np
570     pp=0
571 jmc 1.155 i=1
572 jmc 1.173 while [ $i -le $nx ] ; do
573     if [ `expr $nx % $i` -eq 0 ] ; then
574 jmc 1.155 j=1
575 jmc 1.173 while [ $j -le $ny ] ; do
576     if [ `expr $ny % $j` -eq 0 ] ; then
577 jmc 1.155 ij=`expr $i \* $j`
578     if [ $ij -gt $pp ] ; then
579 jmc 1.161 flag=1
580     elif [ $ij -eq $pp ] ; then
581     flag=$dirX
582     else
583     flag=0
584     fi
585     if test $flag = 1 ; then
586 jmc 1.155 if [ $ij -le $np ] ; then
587     ix=$i ; jy=$j ; pp=$ij
588     #echo " ix,jy= $ix,$jy"
589     fi
590     fi
591     fi
592     j=`expr $j + 1`
593     done
594 jmc 1.154 fi
595 jmc 1.155 i=`expr $i + 1`
596 jmc 1.154 done
597    
598     #- create new SIZE.h type file:
599     sx=`expr $sx \* $px / $ix`
600     sy=`expr $sy \* $py / $jy`
601     if [ $verbose -gt 1 ]; then
602     echo " px,py,np= $px,$py,$np : New MPI size: px,py= $ix,$jy : sx,sy= $sx,$sy"
603     fi
604     sed "/^ \& *nPx *=/s/[0-9]*,/$ix,/" $inp > $tmp
605     sed "/^ \& *nPy *=/s/[0-9]*,/$jy,/" $tmp > $out
606     sed "/^ \& *nSx *=/s/[0-9]*,/$sx,/" $out > $tmp
607     sed "/^ \& *nSy *=/s/[0-9]*,/$sy,/" $tmp > $out
608     rm -f $tmp
609     return $pp
610     }
611    
612 edhill 1.27 symlink_mpifiles()
613     {
614     # Put special links so that MPI specific files are used
615     # This MUST be invoked between makeclean and makelinks because
616     # the Makefile will link to non-mpi files by default
617    
618     dir=$1
619     code_dir=$2
620 jmc 1.154 build_dir=$dir/$3
621 jmc 1.135
622 edhill 1.27 # These are files that should replace their counter-part when using -mpi
623 jmc 1.154 MPI_FILES=`(cd $dir/$code_dir; find . -name "*_mpi" -print)`
624 edhill 1.27
625 jmc 1.154 for ii in $MPI_FILES ; do
626     i=`echo $ii | sed 's:^\./::'`
627     name=`echo $i | sed 's:_mpi::'`
628     file="../$code_dir/$i"
629     if test $name = 'SIZE.h' ; then file="SIZE.h.mpi" ; fi
630    
631     # Is this an MPI run?
632     if test "x$MPI" = x0 ; then
633     # NO: We undo any _mpi symbolically linked files
634     if test -L $build_dir/$name ; then
635     ( cd $build_dir ; cmp $name $file > /dev/null 2>&1 )
636     RETVAL=$?
637     if test "x$RETVAL" = x0 ; then
638     if [ $verbose -gt 1 ]; then
639     echo " Un-linking $name from ../$code_dir" ; fi
640     rm -f $build_dir/$name
641     fi
642     fi
643     else
644     # YES: We symbolically link these files to the build
645     # dir so long as there is no real file in place
646     ( cd $build_dir ; cmp $name $file > /dev/null 2>&1 )
647 edhill 1.27 RETVAL=$?
648 jmc 1.154 if [ $verbose -gt 1 ]; then echo " cmp $name $file returns: $RETVAL" ; fi
649 edhill 1.27 if test "x$RETVAL" != x0 ; then
650 jmc 1.154 if test -h $build_dir/$name ; then rm -f $build_dir/$name ; fi
651     if test ! -r $build_dir/$name ; then
652     if [ $verbose -gt 1 ]; then echo " Linking $name to $file" ; fi
653     (cd $build_dir; ln -sf $file $name)
654 edhill 1.27 fi
655     fi
656 jmc 1.154 fi
657     done
658 edhill 1.27 }
659    
660 edhill 1.1 linkdata()
661     {
662 jmc 1.83 # linkdata run_dir input_dir_1 input_dir_2 ...
663 edhill 1.1 #
664     # symbolically link data files to run directory
665 jmc 1.83 if test -d $1 ; then
666 edhill 1.12 (
667 jmc 1.83 cd $1 ; shift
668 jmc 1.139 echo 'linkdata from dirs:' $*
669 jmc 1.125 inpMPI=`(cd ../$1 ; find . -name "*.mpi" -print | sed 's:^\./::')`
670     for xx in $inpMPI ; do
671     if test -r "../"$1"/"$xx ; then
672     # found 1 _mpi sfx file in 1rst input dir and it is readable
673     yy=`echo $xx | sed 's:\.mpi$::'`
674 jmc 1.154 if test "x$MPI" = "x0" ; then
675     # not mpi test: remove symbolic link
676     if test -h $yy ; then rm -f $yy ; fi
677     else
678     # mpi test: remove symbolic link & link .mpi sfx file
679 jmc 1.125 if test -h $yy ; then rm -f $yy ; fi
680 jmc 1.135 if test ! -r $yy ; then
681 jmc 1.125 ln -sf "../"$1"/"$xx $yy ;
682 jmc 1.139 printf " $xx" 1>&2
683 jmc 1.125 fi
684     fi
685     fi
686     done
687 jmc 1.83 if test -r "../"$1"/eedata.mth" ; then
688     # found eedata.mth in 1rst input dir and it is readable
689     if test "x$MULTI_THREAD" = "xt" ; then
690     # multi-threaded test: remove symbolic link & link eedata.mth
691     if test -h eedata ; then rm -f eedata ; fi
692 jmc 1.135 if test ! -r eedata ; then
693 jmc 1.83 ln -sf "../"$1"/eedata.mth" eedata ;
694 jmc 1.139 printf ' eedata.mth' 1>&2
695 edhill 1.24 fi
696 jmc 1.83 else
697     # not multi-threaded test: remove eedata symbolic link
698     if test -h eedata ; then rm -f eedata ; fi
699     fi
700     fi
701 jmc 1.108 prevDir='NONE'
702 jmc 1.83 for ldir in $* ; do
703 jmc 1.108 if test -d "../"$ldir -a $ldir != $prevDir ; then
704 jmc 1.139 printf " ldir=${ldir}:" 1>&2
705 jmc 1.83 files=`( cd "../"$ldir ; ls -1 | grep -v CVS )`
706     for i in $files ; do
707     if test ! -d "../"$ldir/$i ; then
708     if test ! -r $i ; then
709     printf ' '$i 1>&2
710     ln -sf "../"$ldir"/"$i $i
711     fi
712     fi
713     done
714 jmc 1.139 printf ' ;' 1>&2
715 jmc 1.83 if test -x "../"$ldir"/"prepare_run ; then
716 jmc 1.139 "../"$ldir"/"prepare_run 1>&2
717     else
718     echo '' 1>&2
719 edhill 1.24 fi
720 jmc 1.82 fi
721 jmc 1.108 prevDir=$ldir
722 jmc 1.83 done
723 edhill 1.12 )
724 edhill 1.1 fi
725     }
726    
727     runmodel()
728     {
729 edhill 1.6 # runmodel directory
730 edhill 1.1 #
731 jmc 1.154 # runs $COMMAND in "directory"
732 edhill 1.6 # (where "$COMMAND" is relative to "directory")
733 edhill 1.1 (
734     cd $1
735 jmc 1.139 printf 'runmodel in %s ... ' $1
736 jmc 1.158 if test "x$MPI" != x0 ; then
737     #- adjust the MPI run command with the right number of Procs
738     #echo '' ; echo " COMMAND='$COMMAND'"
739     COMMAND=`echo $COMMAND | sed "s/ TR_NPROC / $LOC_NPROC /"`
740     if test "x$MPI_MFILE" != x ; then
741     COMMAND=`echo $COMMAND | sed "s/ TR_MFILE / ..\/..\/$LOC_MFILE /"`
742     fi
743     #echo " COMMAND='$COMMAND'"
744     fi
745 jmc 1.134 if test -L $EXECUTABLE ; then
746     if test -x "../"$builddir"/"$EXECUTABLE ; then
747 jmc 1.154 cmp $EXECUTABLE "../"$builddir"/"$EXECUTABLE > /dev/null 2>&1
748     outD=$? ; if test "x$outD" != x0 ; then rm -f $EXECUTABLE ; fi
749 jmc 1.134 else rm -f $EXECUTABLE
750     fi
751 jmc 1.106 fi
752 jmc 1.83 if test ! -x $EXECUTABLE -a -x "../"$builddir"/"$EXECUTABLE ; then
753 jmc 1.119 echo " link" $EXECUTABLE "from dir ../"$builddir > run.log_tmp
754 jmc 1.83 ln -sf "../"$builddir"/"$EXECUTABLE .
755     fi
756     if test ! -x $EXECUTABLE ; then
757 jmc 1.156 rm -f $RUNLOG ; touch $RUNLOG
758     if test -f run.log_tmp ; then cat run.log_tmp >> $RUNLOG ; fi
759     echo " no executable:" $EXECUTABLE >> $RUNLOG
760     RETVAL=8
761     ENDVAL=-1
762 jmc 1.75 else
763 jmc 1.156 if test ! -f $OUTPUTFILE -o $OUTPUTFILE -ot $EXECUTABLE ; then
764     # output do not exist or is older than executable:
765 jmc 1.162 rm -f $OUTPUTFILE $RUNLOG ; touch $RUNLOG
766 jmc 1.156 if test -f run.log_tmp ; then cat run.log_tmp >> $RUNLOG ; fi
767     ( eval $COMMAND ) >> $RUNLOG 2>&1
768     RETVAL=$?
769     ENDVAL=`tail $OUTPUTFILE | grep -c 'PROGRAM MAIN: Execution ended Normally'`
770     if [ $POSTCLEAN -eq 1 -a $ENDVAL -gt 0 ] ; then
771     find . -name "*.meta" -exec rm {} \;
772     find . -name "*.data" -exec rm {} \;
773     rm -rf mnc_test_*
774 jmc 1.83 fi
775 jmc 1.156 else
776     RETVAL=0
777 jmc 1.153 ENDVAL=`tail $OUTPUTFILE | grep -c 'PROGRAM MAIN: Execution ended Normally'`
778 jmc 1.156 touch $RUNLOG
779     if test -f run.log_tmp ; then cat run.log_tmp >> $RUNLOG ; fi
780     echo "---------->> $OUTPUTFILE is up to date " >> $RUNLOG 2>&1
781     fi
782 jmc 1.75 fi
783 jmc 1.119 rm -f run.log_tmp
784 jmc 1.158 #- in all cases where OutputFile exists, report SIZE (and AD time)
785     if test -f $OUTPUTFILE ; then
786     grep '(PID\.TID 0000\.0001) n.. =' $OUTPUTFILE \
787     | sed 's/(PID.TID 0000.0001) //' >> $CDIR"/summary.txt"
788     if test "x$ADM" = xt ; then
789     grep -A3 'Seconds in section "ALL' $OUTPUTFILE >> $CDIR"/summary.txt"
790     fi
791     fi
792     if test -s STDERR.0000 ; then cp STDERR.0000 $CDIR"/STDERR.0000" ; fi
793 jmc 1.88 if [ $RETVAL -eq 0 -a $ENDVAL -gt 0 ] ; then
794 jmc 1.139 echo successful
795     printf '=> output from running in %s :\n' $1 1>&2
796     tail $RUNLOG | sed 's/^.*/> &/g' 1>&2
797 edhill 1.6 return 0
798 jmc 1.132 elif [ $RETVAL -ne 0 -a $ENDVAL -gt 0 ] ; then
799     #-- for some weird cases (run is finihed but with error code)
800 jmc 1.139 echo 'finished with error (run:' $RETVAL ' end:' $ENDVAL ')'
801     printf '=> output from running in %s :\n' $1 1>&2
802     tail $RUNLOG | sed 's/^.*/> &/g' 1>&2
803 jmc 1.132 return 0
804 edhill 1.6 else
805 jmc 1.139 echo 'failed (run:' $RETVAL ' end:' $ENDVAL ')'
806     printf '=> output from running in %s :\n' $1 1>&2
807     tail $RUNLOG | sed 's/^.*/> &/g' 1>&2
808 jmc 1.119 cp $RUNLOG $CDIR"/"$RUNLOG
809 edhill 1.6 return 1
810 edhill 1.1 fi
811     )
812     }
813    
814     createcodelet()
815     {
816     # create codelet for comparing model output
817    
818 jmc 1.112 printf "creating the comparison code (using CC=$CC)... "
819 jmc 1.91 cat > tr_cmpnum.c <<EOF
820 edhill 1.22 #include <stdio.h>
821     #include <math.h>
822     int main( int argc, char** argv ) {
823 jmc 1.91 int linnum,cmplin,best,lncnt;
824 edhill 1.52 double a,b,abave,relerr;
825 jmc 1.57 best = -22;
826 adcroft 1.33 lncnt = 0;
827 jmc 1.96 while( 1 & ( (lncnt+=1) < 999 ) ) {
828 edhill 1.22 scanf("%d", &linnum);
829     if (linnum == -1) break;
830     scanf("%lf", &a); scanf("%lf", &b);
831 edhill 1.52 abave = 0.5*(fabs(a)+fabs(b));
832 jmc 1.91 if ( abave == abave ) {
833     if (abave > 0.0) {
834     relerr=fabs(a-b)/abave;
835     if (relerr > 0.0) { cmplin = (int)rint(log10(relerr)); }
836     else { cmplin = -16 ; }
837     best = (best > cmplin) ? best : cmplin; }
838     else { cmplin = -22 ; }
839     /* printf("%d ; %lf ; %lf\n",cmplin,a,b); */
840     }
841     else {
842     /* printf("%lf ; %lf ; %lf\n",abave,a,b); */
843     break; }
844 edhill 1.22 }
845 adcroft 1.33 if (lncnt == 999) best=-29;
846 jmc 1.91 if (linnum != -1) best=-99;
847 edhill 1.22 printf("%d\n", -best);
848     return 0;
849     }
850     EOF
851 jmc 1.91 $CC -o tr_cmpnum tr_cmpnum.c -lm
852 edhill 1.1
853 jmc 1.91 if [ -x ./tr_cmpnum ]; then
854 edhill 1.1 echo "OK"
855     return 0
856     else
857     echo
858 jmc 1.135 echo "ERROR: failed to compile comparison code -- please specify"
859 edhill 1.58 echo " a C compiler using the CC environment variable."
860 edhill 1.1 exit 1
861     fi
862     }
863    
864     formatresults()
865     {
866     # formatresults expt genmake depend make run results*
867    
868     nm=$1
869     printf '%s %s %s %s' $2 $3 $4 $5
870     shift; shift; shift; shift; shift;
871 jmc 1.94 listPrt=$@
872     listRes=`echo $listPrt | sed 's/>//' | sed 's/<//'`
873     xx=`echo $listPrt | sed 's/.*>//' | sed 's/<.*//' | awk '{print $1}'`
874 jmc 1.97 printf '%3s' $listPrt
875 jmc 1.98 # line below does not work on hp-ux_ia64 : do those substitutions later on
876 jmc 1.95 # printf '%3s' $listPrt | sed 's/ 99/ --/g' | sed 's/ > />/' | sed 's/ < /</'
877 jmc 1.135
878 jmc 1.94 if [ $xx = '..' ]; then
879     printf ' N/O '
880     elif [ $xx = '--' ]; then
881     printf ' N/O '
882     elif [ $xx = 99 ]; then
883 edhill 1.1 printf ' N/O '
884     else
885 jmc 1.94 if [ $xx -ge $MATCH_CRIT ]; then
886 edhill 1.1 printf ' pass'
887     else
888     printf ' FAIL'
889     fi
890     fi
891     printf ' %s' $nm
892     printf '\n'
893 jmc 1.135
894 edhill 1.1 }
895    
896     scandirs()
897     {
898 jmc 1.81 if [ $# -eq 1 ]; then
899     for arg in * ; do
900 jmc 1.99 test -f $arg/$1 && echo $arg
901 jmc 1.81 done
902 edhill 1.1 else
903 jmc 1.81 echo $*
904 edhill 1.1 fi
905     }
906    
907    
908 jmc 1.123 check_eedata()
909     {
910 jmc 1.161 # check_eedata eedata size.h
911 jmc 1.123 if [ $# -eq 2 ] ; then
912 jmc 1.161 if test -f $1 -a -f $2 ; then
913     nx=`grep "^ *nTx *=" $1 | tail -1 | sed 's/^ *nTx *= *//' | sed "s/, *$//"`
914     sx=`grep "^ & *nSx *=" $2 | sed "s/^ & *nSx *=//" | sed 's/, *$//'`
915 jmc 1.123 if test "x$nx" = x ; then
916     rx=10
917     else
918     rx=`expr $sx % $nx`
919     fi
920 jmc 1.161 ny=`grep "^ *nTy *=" $1 | tail -1 | sed 's/^ *nTy *= *//' | sed "s/, *$//"`
921     sy=`grep "^ & *nSy *=" $2 | sed "s/^ & *nSy *=//" | sed 's/, *$//'`
922 jmc 1.123 if test "x$ny" = x ; then
923     ry=20
924     else
925     ry=`expr $sy % $ny`
926     fi
927     echo `expr $rx + $ry`
928 jmc 1.161 else
929     echo '-1'
930     fi
931     elif [ $# -eq 1 ] ; then
932     if test -f $1 ; then
933     nx=`grep "^ *nTx *=" $1 | tail -1 | sed 's/^ *nTx *= *//' | sed "s/, *$//"`
934     if test "x$nx" = x ; then nx=1 ; fi
935     ny=`grep "^ *nTy *=" $1 | tail -1 | sed 's/^ *nTy *= *//' | sed "s/, *$//"`
936     if test "x$ny" = x ; then ny=1 ; fi
937     #echo $nx $ny
938     echo $nx
939     else
940 jmc 1.123 echo '-1'
941 jmc 1.161 fi
942 jmc 1.123 else
943     echo '-2'
944     fi
945    
946     }
947    
948 edhill 1.1 ###############################################################################
949    
950    
951     # Default properties
952     debug=0
953     verbose=1
954 jmc 1.163 NBLINES_MKLOG=16000
955 edhill 1.10
956 jmc 1.164 OptLev=1
957 jmc 1.109 GSL=f
958 edhill 1.10
959     CLEANUP=f
960 jmc 1.133 NORUN=f
961 edhill 1.10 QUICK=f
962 jmc 1.136 NOMAKE=f
963 edhill 1.10 NOGENMAKE=f
964     NOCLEAN=f
965     NODEPEND=f
966 jmc 1.156 POSTCLEAN=0
967 edhill 1.1
968 edhill 1.4 BASH=
969 edhill 1.10 OPTFILE=NONE
970     ADDRESSES=
971 edhill 1.1 TESTDIRS=
972 jmc 1.89 SKIPDIRS=
973 edhill 1.1 MPACKDIR="../tools/mpack-1.6"
974 edhill 1.20 HAVE_MPACK=
975 jmc 1.113 MPACK=
976 edhill 1.24 COMMAND=
977 jmc 1.141 MKDEPEND=
978 edhill 1.59 if test "x$MAKE" = x ; then
979     MAKE=make
980     fi
981 jmc 1.171 REPLMAKE=
982 edhill 1.59 if test "x$CC" = x ; then
983     CC=cc
984     fi
985 edhill 1.43 JOBS=
986 jmc 1.165 TARG=
987 jmc 1.154 MPI=0
988 jmc 1.156 MPI_MFILE=
989 jmc 1.83 MULTI_THREAD=f
990 jmc 1.70 OUTDIR=
991 edhill 1.40 DELDIR=
992 jmc 1.135 USE_R4=
993 jmc 1.165 EXTRFLG=
994 edhill 1.1
995 edhill 1.24 ADM=
996 utke 1.120 OADM=
997 edhill 1.24
998 jmc 1.117 # list of pTracers to check for monitor output
999 edhill 1.50 PTRACERS_NUM="1 2 3 4 5"
1000 edhill 1.49
1001 jmc 1.147 MATCH_CRIT=10
1002 jmc 1.92
1003 edhill 1.34 printf "parsing options... "
1004 edhill 1.1
1005     ac_prev=
1006     for ac_option ; do
1007    
1008     # If the previous option needs an argument, assign it.
1009     if test -n "$ac_prev"; then
1010     eval "$ac_prev=\$ac_option"
1011     ac_prev=
1012     continue
1013     fi
1014    
1015     ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
1016 jmc 1.135
1017 edhill 1.1 case $ac_option in
1018    
1019 jmc 1.156 -help | --help | -h | --h) usage ;;
1020    
1021     -optfile | --optfile | -of | --of) ac_prev=OPTFILE ;;
1022     -optfile=* | --optfile=* | -of=* | --of=*) OPTFILE=$ac_optarg ;;
1023    
1024     -addr | --addr | -a | --a) ac_prev=ADDRESSES ;;
1025     -addr=* | --addr=* | -a=* | --a=*) ADDRESSES=$ac_optarg ;;
1026     -mpackdir | --mpackdir | -mpd | --mpd) ac_prev=MPACKDIR ;;
1027     -mpackdir=* | --mpackdir=* | -mpd=* | --mpd=*) MPACKDIR=$ac_optarg ;;
1028    
1029     -tdir | --tdir | -t | --t) ac_prev=TESTDIRS ;;
1030     -tdir=* | --tdir=* | -t=* | --t=*) TESTDIRS=$ac_optarg ;;
1031     -skipdir | --skipdir | -skd | --skd) ac_prev=SKIPDIRS ;;
1032     -skipdir=* | --skipdir=* | -skd=* | --skd=*) SKIPDIRS=$ac_optarg ;;
1033    
1034     -bash | --bash | -b | --b) ac_prev=BASH ;;
1035     -bash=* | --bash=* | -b=* | --b=*) BASH=$ac_optarg ;;
1036    
1037     -command | --command | -c | --c) ac_prev=COMMAND ;;
1038     -command=* | --command=* | -c=* | --c=*) COMMAND=$ac_optarg ;;
1039    
1040     -makedepend | --makedepend | -md | --md) ac_prev=MKDEPEND ;;
1041     -makedepend=* | --makedepend=* | -md=* | --md=*) MKDEPEND=$ac_optarg ;;
1042    
1043     -make | --make | -m | --m) ac_prev=MAKE ;;
1044     -make=* | --make=* | -m=* | --m=*) MAKE=$ac_optarg ;;
1045    
1046 jmc 1.171 -repl_mk | --repl_mk ) ac_prev=REPLMAKE ;;
1047     -repl_mk=* | --repl_mk=*) REPLMAKE=$ac_optarg ;;
1048    
1049 jmc 1.156 -odir | --odir) ac_prev=OUTDIR ;;
1050     -odir=* | --odir=*) OUTDIR=$ac_optarg ;;
1051    
1052     -ptracers | --ptracers | -ptr | --ptr) ac_prev=PTRACERS_NUM ;;
1053     -ptracers=* | --ptracers=* | -ptr=* | --ptr=*) PTRACERS_NUM=$ac_optarg ;;
1054 edhill 1.50
1055 jmc 1.92 -match | --match ) ac_prev=MATCH_CRIT ;;
1056     -match=* | --match=* ) MATCH_CRIT=$ac_optarg ;;
1057    
1058 jmc 1.136 -j | --j) ac_prev=JOBS ;;
1059     -j=* | --j=*) JOBS=$ac_optarg ;;
1060 edhill 1.43
1061 jmc 1.165 -ef | --ef) ac_prev=EXTRFLG ;;
1062     -ef=* | --ef=*) EXTRFLG=$ac_optarg ;;
1063    
1064 jmc 1.156 -clean | --clean) CLEANUP=t ; DELDIR=t ;;
1065 edhill 1.10
1066 jmc 1.156 -norun | --norun | -nr | --nr) NORUN=t ;;
1067 jmc 1.165 -obj | --obj ) TARG='obj' ; NORUN=t ;;
1068 jmc 1.156 -runonly | --runonly | -ro | --ro) QUICK=t ; NOMAKE=t ;;
1069     -quick | --quick | -q | --q) QUICK=t ;;
1070     -nogenmake | --nogenmake | -ng | --ng) NOGENMAKE=t ;;
1071     -noclean | --noclean | -nc | --nc) NOCLEAN=t ;;
1072     -nodepend | --nodepend | -nd | --nd) NODEPEND=t ;;
1073 edhill 1.10
1074 jmc 1.156 -postclean | --postclean | -pc | --pc) POSTCLEAN=2 ;;
1075     -deloutp | --deloutp | -do | --do) POSTCLEAN=1 ;;
1076 edhill 1.68
1077 jmc 1.154 -mpi | --mpi) MPI=2 ;;
1078     -MPI | --MPI) ac_prev=MPI ;;
1079     -MPI=* | --MPI=*) MPI=$ac_optarg ;;
1080 edhill 1.10
1081 jmc 1.156 -mfile | --mfile | -mf | --mf) ac_prev=MPI_MFILE ;;
1082     -mfile=* | --mfile=* | -mf=* | --mf=*) MPI_MFILE=$ac_optarg ;;
1083    
1084 jmc 1.83 -mth) MULTI_THREAD=t ;;
1085    
1086 edhill 1.24 -adm | -ad) ADM=t ;;
1087 utke 1.120 -oad) OADM=t; NODEPEND=t ;;
1088    
1089 jmc 1.164 -ieee) echo "Warning: ignore option '-ieee' (already the default)"
1090     printf " ... " ;;
1091     -noieee) echo "Warning: will use option '-fast' instead of '-noieee' (obsolete)"
1092     printf " ... " ; OptLev=`expr $OptLev \* 2` ;;
1093     -fast) OptLev=`expr $OptLev \* 2` ;;
1094     -devel) OptLev=0 ;;
1095 jmc 1.156 -gsl) GSL=t ;;
1096 edhill 1.10
1097 edhill 1.1 -verbose) verbose=2 ;;
1098     -debug) debug=1 ;;
1099     -quiet) verbose=0 ;;
1100    
1101 edhill 1.40 -deldir | -dd) DELDIR=t ;;
1102    
1103 jmc 1.136 -use_r4|-ur4) USE_R4=t ;;
1104 jmc 1.135
1105 ce107 1.90 -ts) TS=t;;
1106     -papis) PAPIS=t;;
1107     -pcls) PCL=t;;
1108    
1109 jmc 1.156 -*) echo "Error: unrecognized option: "$ac_option
1110     usage ;;
1111     *) echo "Error: unrecognized argument: "$ac_option
1112     usage ;;
1113 jmc 1.135
1114 edhill 1.1 esac
1115 jmc 1.135
1116 edhill 1.1 done
1117    
1118 edhill 1.10 if test "x$QUICK" = xt ; then
1119     NOGENMAKE=t
1120     NOCLEAN=t
1121     NODEPEND=t
1122     fi
1123    
1124 jmc 1.156 #- check length of MPI machine file:
1125     if test "x$MPI" != x0 -a "x$MPI_MFILE" != x ; then
1126     if test -r $MPI_MFILE ; then
1127     nl=`wc -l $MPI_MFILE | awk '{print $1}'`
1128     if [ $nl -lt $MPI ] ; then
1129     echo "Error: need at least $MPI nodes (currently only $nl) in MPI_MFILE=$MPI_FILE"
1130     usage
1131     fi
1132     if [ $verbose -gt 1 ]; then
1133     echo " MPI_MFILE=$MPI_MFILE : $nl procs for MPI=$MPI run"
1134     fi
1135     else
1136     echo "Error: cannot access MPI_MFILE=$MPI_FILE"
1137     usage
1138     fi
1139     fi
1140    
1141 jmc 1.99 #- setting for forward or ADM testing
1142     if test "x$ADM" = xt ; then
1143 jmc 1.168 if test "x$TARG" = xobj ; then TARG=adobj ; else TARG=adall ; fi
1144 jmc 1.99 code_dir=code_ad
1145 jmc 1.108 inputdir=input_ad
1146 jmc 1.99 ref_outp="output_adm.txt"
1147     EXECUTABLE="mitgcmuv_ad"
1148 utke 1.120 elif test "x$OADM" = xt ; then
1149 jmc 1.168 TARG=adAll
1150 utke 1.120 code_dir=code_oad
1151     inputdir=input_oad
1152     ref_outp="output_oadm.txt"
1153     EXECUTABLE="mitgcmuv_ad"
1154 jmc 1.99 else
1155 jmc 1.168 if test "x$JOBS" != x ; then TARG="-j $JOBS $TARG" ; fi
1156 jmc 1.99 code_dir=code
1157 jmc 1.108 inputdir=input
1158 jmc 1.99 ref_outp="output.txt"
1159     EXECUTABLE="mitgcmuv"
1160     fi
1161    
1162 jmc 1.142 xx=`echo $TESTDIRS | awk '{print $1}'`
1163 edhill 1.1 if test "x$TESTDIRS" = x ; then
1164 jmc 1.103 LIST=`scandirs results/$ref_outp`
1165 jmc 1.142 elif test $xx = 'start_from' ; then
1166     xx=`echo $TESTDIRS | awk '{print $2}'`
1167     LIST=`scandirs results/$ref_outp | sed -n "/$xx/,$ p"`
1168 jmc 1.84 else
1169     #- expand group of experiments:
1170     LIST=" "
1171     for xx in $TESTDIRS
1172     do
1173     case $xx in
1174 jmc 1.86 'basic') LIST=${LIST}" aim.5l_cs hs94.128x64x5 ideal_2D_oce"
1175     LIST=${LIST}" lab_sea tutorial_baroclinic_gyre"
1176     LIST=${LIST}" tutorial_global_oce_latlon tutorial_plume_on_slope"
1177 jmc 1.84 ;;
1178     'tutorials')
1179     LIST=${LIST}" "`ls | grep 'tutorial_'` ;;
1180     *) LIST=${LIST}" "$xx ;;
1181     esac
1182 jmc 1.135 done
1183 jmc 1.89 fi
1184     #echo 'LIST='${LIST}'<'
1185     #- skip dirs, remove duplicate and non-directory:
1186     TESTDIRS=" "
1187     count=0
1188     for xx in $LIST
1189     do
1190     yy=`echo $SKIPDIRS | grep -c $xx`
1191     if test $yy = 0 ; then
1192 jmc 1.84 if test -d $xx ; then
1193     yy=`echo $TESTDIRS | grep -c $xx`
1194     if test $yy = 0 ; then TESTDIRS=${TESTDIRS}" "$xx ; fi
1195 jmc 1.89 else count=1 ;
1196     echo ""; echo -n " -- skip \"$xx\" (not a directory !)"
1197     fi
1198     else
1199     if test $count = 1 ; then echo -n ", \"$xx\""
1200     else count=1 ; echo "" ; echo -n " skip: \"$xx\""
1201 jmc 1.84 fi
1202 jmc 1.89 fi
1203 jmc 1.135 done
1204 jmc 1.89 if test $count = 1 ; then echo "" ; echo -n " ... " ; fi
1205 jmc 1.84 #echo 'TESTDIRS='${TESTDIRS}'<'
1206 edhill 1.1
1207 edhill 1.10 if test "x$OPTFILE" = xNONE -a "x$MITGCM_OF" != x ; then
1208     OPTFILE=$MITGCM_OF
1209     fi
1210    
1211 jmc 1.156 LOC_MFILE='tr_mpi_mfile'
1212 jmc 1.146 RUNLOG="run.tr_log"
1213 jmc 1.99 OUTPUTFILE=$ref_outp
1214 jmc 1.87 if test "x$COMMAND" = x ; then
1215 jmc 1.77 COMMAND="./$EXECUTABLE > $OUTPUTFILE"
1216 edhill 1.24 fi
1217 jmc 1.154 if test "x$MPI" != x0 ; then
1218 jmc 1.87 OUTPUTFILE="STDOUT.0000"
1219 edhill 1.24 fi
1220    
1221 jmc 1.76 echo "OK (COMMAND= $COMMAND )"
1222 edhill 1.1
1223 jmc 1.94 # set the Default List of output variables to be checked:
1224     # (use default or load experiment-specific list from file "tr_checklist")
1225     # content : 1rst = main variable used to decide if it pass or FAIL
1226     # others = number of matching digits to be printed in summary.txt
1227 utke 1.120 if test "x$ADM" = x -a "x$OADM" = x; then
1228 jmc 1.94 DEF_CHECK_LIST='PS PS T+ S+ U+ V+ pt1+ pt2+ pt3+ pt4+ pt5+'
1229     EMPTY_RESULTS='.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..'
1230 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}'`
1231 jmc 1.94 ii=`echo $EMPTY_RESULTS | awk '{print NF}'`
1232 jmc 1.97 EMPTY_RESULTS=$EMPTY_RESULTS`expr $LEN_CHECK_LIST - $ii | awk 'BEGIN{FS=":"}{for(i=1;i<=$1;i++){printf " ."}}'`
1233 jmc 1.99 else
1234 jmc 1.167 DEF_CHECK_LIST='AdGrd Cost AdGrd FDGrd'
1235 jmc 1.169 EMPTY_RESULTS='.. .. ..'
1236 jmc 1.99 LEN_CHECK_LIST=`echo $DEF_CHECK_LIST | sed 's/ [a-zA-Z0-9]*+/&mn &mx &av &sd/g' | awk '{print NF-1}'`
1237 jmc 1.94 fi
1238    
1239 edhill 1.1 # create the FORTRAN comparison code
1240 jmc 1.133 if test -x tr_cmpnum ; then
1241     echo "skipping comparison code build"
1242     else
1243     createcodelet
1244     fi
1245 edhill 1.1
1246 jmc 1.112 # build the mpack utility (if ADDRESSES = NONE, do it to test the build)
1247     if test "x$ADDRESSES" = x ; then
1248 edhill 1.32 echo "skipping mpack build"
1249     else
1250 edhill 1.31 build_mpack
1251     fi
1252 edhill 1.1
1253     # Create a uniquely named directory to store results
1254 jmc 1.110 CMDLINE=$0
1255 jmc 1.118 for xx in "$@" ; do nw=`echo $xx | wc -w`
1256     if test $nw = '1' ; then CMDLINE="$CMDLINE $xx"
1257     else CMDLINE="$CMDLINE '$xx'" ; fi
1258     done
1259     #for xx in "$@" ; do CMDLINE="$CMDLINE '$xx'" ; done
1260 edhill 1.1 MACH=`hostname`
1261 edhill 1.2 UNAMEA=`uname -a`
1262 edhill 1.1 DATE=`date +%Y%m%d`
1263 edhill 1.25 BASE="tr_"$MACH"_"$DATE"_"
1264 jmc 1.70 if test "x$OUTDIR" != x ; then
1265     BASE="tr_"$OUTDIR"_"$DATE"_"
1266 jmc 1.121 else
1267     short_name=`hostname | sed 's/\..*$//'`
1268     BASE="tr_"$short_name"_"$DATE"_"
1269 jmc 1.70 fi
1270 edhill 1.1 DNUM=0
1271     DRESULTS="$BASE$DNUM"
1272     while test -e $DRESULTS ; do
1273     DNUM=$(( $DNUM + 1 ))
1274     DRESULTS="$BASE$DNUM"
1275     done
1276     mkdir $DRESULTS
1277     RETVAL=$?
1278     if test "x$RETVAL" != x0 ; then
1279 edhill 1.20 echo "ERROR: Can't create results directory \"./$DRESULTS\""
1280 edhill 1.1 exit 1
1281     fi
1282     SUMMARY="$DRESULTS/summary.txt"
1283 edhill 1.16 start_date=`date`
1284 edhill 1.17 echo $start_date > $SUMMARY
1285 jmc 1.110 echo 'run:' $CMDLINE >> $SUMMARY
1286     echo 'on :' $UNAMEA >> $SUMMARY
1287 edhill 1.1
1288 edhill 1.11 of_path=
1289 edhill 1.10 if test "x$OPTFILE" != xNONE ; then
1290     if test -r $OPTFILE ; then
1291 edhill 1.11 # get the path
1292     path=${OPTFILE%/*}
1293     if test "x$path" = x ; then
1294     of_path=`pwd`
1295     else
1296     of_path=`( cd $path > /dev/null 2>&1 ; pwd )`
1297     fi
1298     file=${OPTFILE##*/}
1299     OPTFILE=$of_path/$file
1300 edhill 1.21 cp $OPTFILE $DRESULTS
1301     echo >> $SUMMARY
1302     echo " OPTFILE=$OPTFILE" >> $SUMMARY
1303 edhill 1.11 else
1304 edhill 1.21 echo | tee $SUMMARY
1305     echo "ERROR: can't read OPTFILE=\"$OPTFILE\"" | tee $SUMMARY
1306     exit 1
1307 edhill 1.10 fi
1308 edhill 1.21 else
1309     echo >> $SUMMARY
1310 jmc 1.152 echo "No \"OPTFILE\" was specified ; genmake2 found and uses:" >> $SUMMARY
1311     #-note: to be filled later after 1rst run
1312 edhill 1.10 fi
1313     echo
1314     echo >> $SUMMARY
1315 utke 1.120 if test "x$ADM" = x -a "x$OADM" = x; then
1316 jmc 1.135 if [ $MATCH_CRIT -lt 10 ] ;
1317     then line_0="default "$MATCH_CRIT ;
1318 jmc 1.94 else line_0="default "$MATCH_CRIT ; fi
1319     line_0="$line_0 ----T----- ----S----- ----U----- ----V-----"
1320 edhill 1.49 line_1="G D M c m s m s m s m s"
1321 jmc 1.167 line_2="e p a R g m m e . m m e . m m e . m m e ."
1322     line_3="n n k u 2 i a a d i a a d i a a d i a a d"
1323 edhill 1.49 line_4="2 d e n d n x n . n x n . n x n . n x n ."
1324 edhill 1.50 for ii in $PTRACERS_NUM ; do
1325 edhill 1.49 line_0="$line_0 --PTR 0"$ii"--"
1326     line_1="$line_1 m s"
1327     line_2="$line_2 m m e ."
1328     line_3="$line_3 i a a d"
1329     line_4="$line_4 n x n ."
1330     done
1331     echo "$line_0" | tee -a $SUMMARY
1332     echo "$line_1" | tee -a $SUMMARY
1333     echo "$line_2" | tee -a $SUMMARY
1334     echo "$line_3" | tee -a $SUMMARY
1335     echo "$line_4" | tee -a $SUMMARY
1336     echo " " | tee -a $SUMMARY
1337 edhill 1.24 else
1338     echo "ADJOINT=true" >> $SUMMARY
1339     echo >> $SUMMARY
1340 jmc 1.135 if [ $MATCH_CRIT -lt 10 ] ;
1341     then line_0="default "$MATCH_CRIT ;
1342 jmc 1.103 else line_0="default "$MATCH_CRIT ; fi
1343 jmc 1.100 echo "$line_0" | tee -a $SUMMARY
1344 edhill 1.24 cat << EOF | tee -a $SUMMARY
1345 jmc 1.167 G D M C A F
1346     e p a R o d D
1347     n n k u s G G
1348     2 d e n t r r
1349 edhill 1.24
1350     EOF
1351     fi
1352 jmc 1.139 echo "-------------------------------------------------------------------------------"
1353 edhill 1.1
1354 edhill 1.10 # ...and each test directory...
1355     for dir in $TESTDIRS ; do
1356 jmc 1.135
1357 jmc 1.106 # set builddir & rundir:
1358     builddir="build"
1359     if test ! -d $dir/$builddir ; then mkdir $dir/$builddir ; fi
1360     rundir="run"
1361 jmc 1.143 pfxdir="tr_$rundir"
1362 jmc 1.106 if test ! -d $dir/$rundir ; then
1363     rundir=$builddir
1364     fi
1365     CODE_DIR=$dir/$code_dir
1366     BUILD_DIR=$dir/$builddir
1367    
1368 edhill 1.10 # Cleanup only!
1369     if test "x$CLEANUP" = xt ; then
1370 jmc 1.127 echo -n ' --- dir:' $BUILD_DIR ': '
1371     makeclean $BUILD_DIR
1372 jmc 1.145 ( cd $BUILD_DIR
1373     rm -f $EXECUTABLE *.bak
1374 jmc 1.146 rm -f genmake_state genmake_*optfile genmake.log
1375 jmc 1.154 rm -f SIZE.h.mpi genmake.tr_log make.tr_log
1376 jmc 1.145 )
1377 jmc 1.106 if test -d $dir/$rundir/CVS ; then
1378 jmc 1.127 echo -n ' --- dir:' $dir/$rundir ': '
1379 jmc 1.106 run_clean $dir/$rundir
1380 edhill 1.10 fi
1381 jmc 1.143 trdir=`( cd $dir ; find . -type d -name "$pfxdir.*" -print | sed 's/^.\///')`
1382 jmc 1.127 ttd=`echo $trdir | wc -w`
1383     if test $ttd != 0 ; then
1384     echo ' --- rm dir:' $trdir
1385     ( cd $dir ; rm -rf $trdir )
1386     fi
1387 edhill 1.10 continue
1388 edhill 1.1 fi
1389 edhill 1.3
1390 jmc 1.135 # Verify that the testdir exists and contains previous
1391 edhill 1.10 # results in the correct location--or skip this directory!
1392 jmc 1.104 fout=$dir"/results/"$ref_outp
1393 edhill 1.24 if test ! -r $fout ; then
1394     echo "can't read \"$fout\" -- skipping $dir"
1395 edhill 1.10 continue
1396     fi
1397 edhill 1.7
1398 jmc 1.117 # Check for specific files for particular type of run
1399 edhill 1.49
1400 jmc 1.161 if test ! -r $CODE_DIR"/SIZE.h_mpi" -a "x$MPI" != "x0" ; then
1401     echo "can't find \"$CODE_DIR/SIZE.h_mpi\" -- skipping $dir"
1402     continue
1403     fi
1404     if test ! -r $dir"/input/eedata.mth" -a "x$MULTI_THREAD" = "xt" ; then
1405     echo "can't find \"$dir/input/eedata.mth\" -- skipping $dir"
1406     continue
1407     fi
1408    
1409 jmc 1.154 if test "x$MPI" != "x0" ; then
1410 jmc 1.173 ntx=1 ; nty=1
1411 jmc 1.161 if test "x$MULTI_THREAD" = "xt" ; then
1412 jmc 1.174 ff=$dir"/input/eedata.mth"
1413     ntx=`grep "^ *nTx *=" $ff | tail -1 | sed 's/^ *nTx *= *//' | sed "s/, *$//"`
1414     nty=`grep "^ *nTy *=" $ff | tail -1 | sed 's/^ *nTy *= *//' | sed "s/, *$//"`
1415     if test "x$ntx" = x ; then ntx=1 ; fi
1416     if test "x$nty" = x ; then nty=1 ; fi
1417 jmc 1.161 fi
1418     #- create new SIZE.h with no more than '$MPI' Procs
1419 jmc 1.173 mk_mpi_size $CODE_DIR"/SIZE.h_mpi" $BUILD_DIR"/tr_size.mpi" $MPI $ntx $nty
1420 jmc 1.161 LOC_NPROC=$?
1421     ( cd $BUILD_DIR
1422     if test -r SIZE.h.mpi ; then
1423     cmp tr_size.mpi SIZE.h.mpi > /dev/null 2>&1 ; RETVAL=$?
1424     else RETVAL=1
1425     fi
1426     if test "x$RETVAL" = x0 ; then
1427     rm -f tr_size.mpi
1428     else
1429     rm -f SIZE.h.mpi ; mv tr_size.mpi SIZE.h.mpi
1430     fi
1431     )
1432 jmc 1.156 if test "x$MPI_MFILE" != x ; then
1433     #- create new MPI machine-file with the right number of Procs
1434     rm -f $LOC_MFILE
1435     cat $MPI_MFILE | sort | uniq | head -$LOC_NPROC > $LOC_MFILE
1436     nl=`wc -l $LOC_MFILE | awk '{print $1}'`
1437     if [ $nl -lt $LOC_NPROC ] ; then
1438     rm -f $LOC_MFILE
1439     cat $MPI_MFILE | head -$LOC_NPROC > $LOC_MFILE
1440     #sed -n "1,$LOC_NPROC p" $MPI_MFILE > $LOC_MFILE
1441     fi
1442     if [ $verbose -gt 1 ]; then
1443     nl=`wc -l $LOC_MFILE | awk '{print $1}'`
1444     echo " new LOC_MFILE=$LOC_MFILE : $nl procs for LOC_NPROC=$LOC_NPROC"
1445     fi
1446     fi
1447 jmc 1.161 if test "x$MULTI_THREAD" = "xt" ; then
1448     retv=`check_eedata $dir"/input/eedata.mth" $BUILD_DIR"/SIZE.h.mpi"`
1449     if test $retv != 0 ; then
1450     echo "input/eedata.mth tiling misfit -- skipping $dir"
1451     continue
1452     fi
1453 jmc 1.154 fi
1454 jmc 1.123 fi
1455 jmc 1.83
1456     # Check whether there are "extra runs" for this testdir
1457     extra_runs=
1458 jmc 1.133 if test "x$NORUN" = xf ; then
1459     ex_run_dirs=`( cd $dir ; echo $inputdir.* )`
1460     fi
1461 jmc 1.108 #echo "ex_run_dirs='$ex_run_dirs'"
1462     for exd in $ex_run_dirs ; do
1463     name=`echo $exd | sed -e "s/$inputdir\.//"`
1464     refExOut=`echo $ref_outp | sed "s/\./.${name}./"`
1465     outf="$dir/results/$refExOut"
1466     if test -f $outf -a -r $outf ; then
1467 jmc 1.135 if test "x$MULTI_THREAD" = "xt" ; then
1468 jmc 1.123 if test -r $dir"/"$exd"/eedata.mth" ; then
1469 jmc 1.154 if test "x$MPI" = "x0" ; then
1470     extra_runs="$extra_runs $name"
1471     else
1472 jmc 1.161 retv=`check_eedata $dir"/"$exd"/eedata.mth" $BUILD_DIR"/SIZE.h.mpi"`
1473 jmc 1.123 if test $retv = 0 ; then
1474 jmc 1.83 extra_runs="$extra_runs $name"
1475 jmc 1.123 else
1476     echo $exd"/eedata.mth tiling misfit -- skipping $dir"
1477 jmc 1.83 fi
1478 jmc 1.123 fi
1479     #else echo $dir"/"$exd"/eedata.mth: not found"
1480 jmc 1.83 fi
1481 jmc 1.123 else
1482     extra_runs="$extra_runs $name"
1483     fi
1484 jmc 1.108 fi
1485     done
1486 edhill 1.28
1487     echo
1488 jmc 1.135 if test "x$extra_runs" = "x" ; then
1489 jmc 1.83 echo "Experiment: $dir"
1490     else
1491     echo "Experiment: $dir ; extra_runs=$extra_runs"
1492     fi
1493 edhill 1.28 echo
1494     unset genmake makedepend make run
1495 jmc 1.94 results=$EMPTY_RESULTS
1496 edhill 1.10
1497 jmc 1.158 # Create an output dir & summary.txt file for each tested experiment (tdir)
1498 jmc 1.138 locDIR=$DRESULTS"/"$dir
1499     mkdir $locDIR
1500 jmc 1.158 #- report to this experiment local summary file ---
1501     echo "DATE='$DATE' ; tdir='$dir'" > $locDIR"/summary.txt"
1502     echo "MACH='$MACH'" >> $locDIR"/summary.txt"
1503     echo "UNAMEA='$UNAMEA'" >> $locDIR"/summary.txt"
1504 jmc 1.138 CDIR=`pwd`"/$locDIR"
1505 jmc 1.135
1506 jmc 1.133 if test "x$NORUN" = xt ; then
1507     run=N
1508     genmakemodel $dir/$builddir && genmake=Y \
1509     && makeclean $dir/$builddir \
1510     && symlink_mpifiles $dir $code_dir $builddir \
1511     && makedependmodel $dir/$builddir && makedepend=Y \
1512     && makemodel $dir/$builddir && make=Y
1513 edhill 1.10 else
1514 edhill 1.1 genmakemodel $dir/$builddir && genmake=Y \
1515     && makeclean $dir/$builddir \
1516 edhill 1.27 && symlink_mpifiles $dir $code_dir $builddir \
1517 edhill 1.1 && makedependmodel $dir/$builddir && makedepend=Y \
1518     && makemodel $dir/$builddir && make=Y \
1519 jmc 1.139 && run_clean $dir/$rundir \
1520 jmc 1.140 && linkdata $dir/$rundir $inputdir \
1521 edhill 1.12 && runmodel $dir/$rundir && run=Y \
1522 jmc 1.99 && results=`testoutput_run $dir $rundir $ref_outp`
1523 edhill 1.10 fi
1524 jmc 1.139 #echo "results='$results'"
1525 jmc 1.135
1526 edhill 1.24 fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1527 jmc 1.139 echo 1>&2
1528 jmc 1.98 echo "$fres" | sed 's/ 99/ --/g' | sed 's/ > />/' | sed 's/ < /</' >> $SUMMARY
1529 jmc 1.138 echo "fresults='$fres'" | sed 's/ 99/ --/g' >> $locDIR"/summary.txt"
1530 edhill 1.34
1531     for ex in $extra_runs ; do
1532 jmc 1.73 unset run
1533 jmc 1.94 results=$EMPTY_RESULTS
1534 jmc 1.106 # reference output file
1535     refExOut=`echo $ref_outp | sed "s/\./.${ex}./g"`
1536 jmc 1.158 # Create an output dir & summary.txt file for each extra run (tdir.ex)
1537 jmc 1.138 locDIR=$DRESULTS"/"$dir"."$ex
1538     mkdir $locDIR
1539 jmc 1.158 #- report to this experiment local summary file ---
1540     echo "DATE='$DATE' ; tdir='$dir.$ex'" > $locDIR"/summary.txt"
1541     #echo "MACH='$MACH'" >> $locDIR"/summary.txt"
1542     #echo "UNAMEA='$UNAMEA'" >> $locDIR"/summary.txt"
1543 jmc 1.138 CDIR=`pwd`"/$locDIR"
1544 jmc 1.143 test ! -e "$dir/$pfxdir.$ex" && mkdir "$dir/$pfxdir.$ex"
1545     run_clean $dir/$pfxdir.$ex
1546     linkdata $dir/$pfxdir.$ex $inputdir.$ex $inputdir
1547     runmodel $dir/$pfxdir.$ex && run=Y \
1548     && results=`testoutput_run $dir $pfxdir.$ex $refExOut`
1549 edhill 1.34 fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1550     fres="$fres.$ex"
1551 jmc 1.139 echo 1>&2
1552 jmc 1.100 echo "$fres" | sed 's/ 99/ --/g' | sed 's/ > />/' | sed 's/ < /</' >> $SUMMARY
1553 jmc 1.138 echo "fresults='$fres'" | sed 's/ 99/ --/g' >> $locDIR"/summary.txt"
1554 jmc 1.156 if test "x$POSTCLEAN" = x2 ; then
1555 jmc 1.143 run_clean $dir/$pfxdir.$ex
1556 jmc 1.83 fi
1557 edhill 1.34 done
1558 edhill 1.68
1559 jmc 1.139 if test -f $DRESULTS"/"genmake_state ; then : ; else
1560 jmc 1.137 if test -f $dir/$builddir/Makefile ; then
1561     mkOpt=`grep '^# OPTFILE=' $dir/$builddir/Makefile 2>/dev/null | head -1 | sed 's/^# //'`
1562     echo "from '$dir/$builddir/Makefile', extract:" > $DRESULTS/genmake_state
1563     sed -n '/^# executed by:/,+1 p' $dir/$builddir/Makefile >> $DRESULTS/genmake_state
1564 jmc 1.151 echo " $mkOpt" >> $DRESULTS/genmake_state
1565 jmc 1.152 if test "x$OPTFILE" = xNONE ; then
1566     eval $mkOpt
1567     sed "/^No \"OPTFILE\" was specified ; genmake2/a\ OPTFILE=${OPTFILE}"\
1568     $SUMMARY > tr_0.tmp_log
1569     RETVAL=$?
1570     if test "x$RETVAL" = x0 ; then rm -f $SUMMARY
1571     cp tr_0.tmp_log $SUMMARY
1572     else rm -f tr_0.tmp_log
1573     fi
1574     fi
1575 jmc 1.150 gmkLog=$dir/$builddir/genmake.log
1576     grep '^Get compiler version using:' $gmkLog > /dev/null 2>&1
1577     RETVAL=$?
1578     if test "x$RETVAL" = x0 ; then
1579     echo "from '$gmkLog', extract compiler version:" >> $DRESULTS/genmake_state
1580 jmc 1.151 sed -n '/Get compiler version/,/<-- compiler version/p' $gmkLog \
1581 jmc 1.166 | grep -v '^... compiler version ' > tr_1.tmp_log
1582     sed -n '1p' tr_1.tmp_log >> $DRESULTS/genmake_state
1583     sed -n '2,/^$/p' tr_1.tmp_log | sed '/^$/d' | sed 's/^./ &/' \
1584 jmc 1.151 >> $DRESULTS/genmake_state
1585 jmc 1.152 rm -f tr_1.tmp_log
1586 jmc 1.150 fi
1587 jmc 1.137 fi
1588     fi
1589 jmc 1.83 #postclean $dir/$builddir
1590 jmc 1.156 if test "x$POSTCLEAN" = x2 ; then
1591 jmc 1.83 makeclean $dir/$builddir \
1592     && run_clean $dir/$rundir
1593     fi
1594 jmc 1.156 if test "x$MPI" != x0 -a "x$MPI_MFILE" != x ; then rm -f $LOC_MFILE ; fi
1595 jmc 1.135
1596 edhill 1.10 echo "-------------------------------------------------------------------------------"
1597 jmc 1.135
1598 edhill 1.1 done
1599    
1600 edhill 1.34 printf "Start time: " >> $SUMMARY
1601 jmc 1.114 echo "$start_date" >> $SUMMARY
1602 edhill 1.34 printf "End time: " >> $SUMMARY
1603 edhill 1.13 date >> $SUMMARY
1604 edhill 1.20
1605     # If addresses were supplied and mpack built successfully, then try
1606     # to send email using mpack.
1607     if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then
1608     echo "No results email was sent."
1609     else
1610     if test "x$HAVE_MPACK" = xt ; then
1611     tar -cf $DRESULTS".tar" $DRESULTS > /dev/null 2>&1 \
1612     && gzip $DRESULTS".tar" \
1613 edhill 1.44 && $MPACK -s MITgcm-test -m 3555000 $DRESULTS".tar.gz" $ADDRESSES
1614 edhill 1.20 RETVAL=$?
1615     if test "x$RETVAL" != x0 ; then
1616     echo
1617     echo "Warning: The tar, gzip, & mpack step failed. Please send email"
1618     echo " to <MITgcm-support@mitgcm.org> for help. You may copy the "
1619     echo " summary of results from the directory \"$DRESULTS\"."
1620     echo
1621     else
1622     echo
1623     echo "An email containing results was sent to the following addresses:"
1624     echo " \"$ADDRESSES\""
1625     echo
1626 jmc 1.129 test -f $DRESULTS".tar" && rm -f $DRESULTS".tar"
1627     test -f $DRESULTS".tar.gz" && rm -f $DRESULTS".tar.gz"
1628 edhill 1.20 fi
1629     fi
1630     fi
1631 edhill 1.13
1632 jmc 1.133 if test "x$QUICK" = xf -a "x$NORUN" = xf ; then
1633     rm -f tr_cmpnum.c tr_cmpnum
1634     fi
1635 edhill 1.1
1636 edhill 1.12 if test "x$CLEANUP" != xt ; then
1637 jmc 1.102 cat $SUMMARY | sed 's/ \. \. \. \. \. \. \. \. \. \. \. \. //'
1638 edhill 1.25 if test -e tr_out.txt ; then
1639     mv tr_out.txt tr_out.txt.old
1640 edhill 1.14 fi
1641 jmc 1.103 cat $SUMMARY | sed '/^[YN] [YN] [YN] [YN]/ s/ \. //g' > tr_out.txt
1642 edhill 1.12 fi
1643 edhill 1.1
1644 edhill 1.40 if test "x$DELDIR" = xt ; then
1645     rm -rf $DRESULTS
1646     fi
1647    

  ViewVC Help
Powered by ViewVC 1.1.22