/[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.166 - (hide annotations) (download)
Fri Aug 19 22:24:26 2011 UTC (12 years, 7 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint63b
Changes since 1.165: +4 -3 lines
adapt compiler version extraction after changes in genmake2

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

  ViewVC Help
Powered by ViewVC 1.1.22