/[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.167 - (hide annotations) (download)
Mon Sep 26 12:58:48 2011 UTC (12 years, 6 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint63c
Changes since 1.166: +11 -10 lines
AD testing: also compare and report Finite-difference gradient.

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

  ViewVC Help
Powered by ViewVC 1.1.22