/[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.185 - (hide annotations) (download)
Sun Jul 7 00:33:19 2013 UTC (10 years, 9 months ago) by jmc
Branch: MAIN
Changes since 1.184: +2 -1 lines
improve cleaning for OpenAD test

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

  ViewVC Help
Powered by ViewVC 1.1.22