/[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.170 - (hide annotations) (download)
Thu Dec 22 12:55:05 2011 UTC (12 years, 4 months ago) by mlosch
Branch: MAIN
CVS Tags: checkpoint63h, checkpoint63i, checkpoint63j
Changes since 1.169: +9 -1 lines
add uice and vice to the list of testable variables

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

  ViewVC Help
Powered by ViewVC 1.1.22