/[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.184 - (hide annotations) (download)
Thu Jun 13 19:05:32 2013 UTC (10 years, 10 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint64i, checkpoint64j
Changes since 1.183: +2 -1 lines
add ability to test for StreamIce Solver Error output

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

  ViewVC Help
Powered by ViewVC 1.1.22