/[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.158 - (hide annotations) (download)
Thu Jan 27 18:20:38 2011 UTC (13 years, 2 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint62s, checkpoint62u, checkpoint62t
Changes since 1.157: +36 -39 lines
re-arrange local summary.txt file printing

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

  ViewVC Help
Powered by ViewVC 1.1.22