/[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.160 - (hide annotations) (download)
Tue Mar 29 11:51:20 2011 UTC (13 years ago) by jmc
Branch: MAIN
CVS Tags: checkpoint62w, checkpoint62v
Changes since 1.159: +4 -2 lines
change run_clean to remove executable only if sym-link (a fix for the case
 where rundir = build)

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

  ViewVC Help
Powered by ViewVC 1.1.22