/[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.168 - (hide annotations) (download)
Fri Sep 30 20:25:50 2011 UTC (12 years, 6 months ago) by jmc
Branch: MAIN
Changes since 1.167: +5 -12 lines
fix "-obj" option with "-adm"

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

  ViewVC Help
Powered by ViewVC 1.1.22