/[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.135 - (hide annotations) (download)
Thu Mar 4 21:26:27 2010 UTC (14 years ago) by jmc
Branch: MAIN
Changes since 1.134: +40 -35 lines
add option (-use_r4 or -ur4) to switch "_RS" type to "real*4"

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

  ViewVC Help
Powered by ViewVC 1.1.22