/[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.182 - (hide annotations) (download)
Tue Apr 9 20:51:50 2013 UTC (10 years, 11 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint64h, checkpoint64g
Changes since 1.181: +6 -4 lines
allows to test ice-thickness Maxima in N & S hemisphere (pkg/thsice)

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