/[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.133 - (hide annotations) (download)
Sat Jan 16 22:08:27 2010 UTC (14 years, 2 months ago) by jmc
Branch: MAIN
Changes since 1.132: +25 -8 lines
add option "-norun" (in short: -nr) to skip the runmodel step

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

  ViewVC Help
Powered by ViewVC 1.1.22