/[MITgcm]/MITgcm/verification/testreport
ViewVC logotype

Diff of /MITgcm/verification/testreport

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph | View Patch Patch

revision 1.9.2.8 by edhill, Sat Oct 4 02:10:52 2003 UTC revision 1.90 by ce107, Wed Jan 31 21:28:34 2007 UTC
# Line 1  Line 1 
1  #!/bin/bash  #! /usr/bin/env bash
2  #  #
3  #  $Header$  #  $Header$
4    #  $Name$
5  #  #
6    
7  usage()  usage()
# Line 10  usage() Line 11  usage()
11      echo      echo
12      echo "where possible OPTIONS are:"      echo "where possible OPTIONS are:"
13      echo "  (-help|-h)               print usage"      echo "  (-help|-h)               print usage"
14      echo "  (-mpi)                   use MPI input files"      echo "  (-mth)                   run multi threaded (using eedata.mth)"
15      echo "  (-optfile=|-of=)STRING   list of optfiles to use"      echo "  (-mpi)                   compile and run using MPI"
16      echo "  (-a|-addr)STRING         list of email recipients"      echo "  (-ieee|-noieee)          if possible, use IEEE compiler flags"
17        echo "                             (DEF=\"-ieee\")"
18        echo "  (-of=|-optfile=)STRING   list of optfiles to use"
19        echo "  (-a|-addr) STRING        list of email recipients"
20      echo "                             (DEF=\"edhill@mitgcm.org\")"      echo "                             (DEF=\"edhill@mitgcm.org\")"
21      echo "  (-t|-tdir)STRING         list of test dirs to use"      echo "  (-t|-tdir) STRING        list of group and/or exp. dirs to test"
22      echo "                             (DEF=\"\" which builds all)"      echo "                             (recognized groups: basic, tutorials)"
23      echo "  (-b|-bash)STRING         location of \"bash\" executable"      echo "                             (DEF=\"\" which test all)"
24      echo "                             (DEF=\"\" for \"/bin/bash\")"      echo "  (-skd|-skipdir) STRING   list of exp. dirs to skip"
25      echo "  (-command)STRING         command to run"      echo "                             (DEF=\"\" which test all)"
26        echo "  (-b|-bash) STRING        preferred location of a \"bash\" or"
27        echo "                             Bourne-compatible \"sh\" shell"
28        echo "                             (DEF=\"\" for \"bash\")"
29        echo "  (-adm|-ad)               perform an adjoint run"
30        echo "  (-command) STRING        command to run"
31      echo "                             (DEF=\"make output.txt\")"      echo "                             (DEF=\"make output.txt\")"
32      echo "  (-m|-make)STRING         command to use for \"make\""      echo "  (-m|-make) STRING        command to use for \"make\""
33      echo "                             (DEF=\"make\")"      echo "                             (DEF=\"make\")"
34        echo "  (-odir) STRING           used to build output directory name"
35        echo "                             (DEF=\"hostname\")"
36        echo "  (-ptr|-ptracers) STRING  specify which ptracers to test"
37        echo "                             (DEF=\"1 2 3 4 5\")"
38        echo "  (-j) JOBS                use \"make -j JOBS\" for parallel builds"
39      echo "  (-clean)                 *ONLY* run \"make CLEAN\""      echo "  (-clean)                 *ONLY* run \"make CLEAN\""
40      echo "  (-quick|-q)              same as \"-nogenmake -noclean -nodepend\""      echo "  (-quick|-q)              same as \"-nogenmake -noclean -nodepend\""
41      echo "  (-nogenmake|-ng)         skip the genmake stage"      echo "  (-nogenmake|-ng)         skip the genmake stage"
42      echo "  (-noclean|-nc)           skip the \"make clean\" stage"      echo "  (-noclean|-nc)           skip the \"make clean\" stage"
43      echo "  (-nodepend|-nd)          skip the \"make depend\" stage"      echo "  (-nodepend|-nd)          skip the \"make depend\" stage"
44        echo "  (-deldir|-dd)            on success, delete the output directory"
45        echo "  (-ts)                    provide timing information per timestep"
46        echo "  (-papis)                 provide MFlop/s per timestep using PAPI"
47        echo "  (-pcls)                  provide MFlop/s per timestep using PCL"
48      echo      echo
49      echo "and where STRING follows a whitespace-delimited format"      echo "and where STRING can be a whitespace-delimited list"
50      echo "such as:"      echo "such as:"
51        echo
52      echo "  -t 'exp0 exp2 exp3' "      echo "  -t 'exp0 exp2 exp3' "
53      echo "  -addr='abc@123.com testing@home.org'"      echo "  -addr='abc@123.com testing@home.org'"
54      echo      echo
55        echo "provided that the expression is properly quoted within the current"
56        echo "shell (note the use of single quotes to protect white space)."
57        echo
58      exit 1      exit 1
59  }  }
60    
61  #  build the mpack utility  #  build the mpack utility
62  build_mpack()  build_mpack()
63  {  {
64      echo -n "building the mpack utility...  "      printf "building the mpack utility...  "
65      if test ! -x "$MPACKDIR/mpack" ; then      if test ! -x "$MPACKDIR/mpack" ; then
66          if test ! -d $MPACKDIR ; then          if test ! -d $MPACKDIR ; then
67                echo
68              echo "Error: can't find \"$MPACKDIR\""              echo "Error: can't find \"$MPACKDIR\""
69              echo "  are you sure this program is being run in the correct "              echo "  are you sure this program is being run in the correct "
70              echo "  (that is, \"MITGCM_ROOT\verification\") directory?"              echo "  (that is, \"MITGCM_ROOT\verification\") directory?"
71              exit 1              echo
72                HAVE_MPACK=f
73          fi          fi
74          echo -n "building mpack...  "          printf "building mpack...  "
75          ( cd $MPACKDIR && ./configure && $MAKE ) > build_mpack.out 2>&1          if test "x$CC" = x ; then
76                export CC=cc
77            fi
78            ( cd $MPACKDIR && ./configure && $MAKE ) > tr_build_mpack.out 2>&1
79          RETVAL=$?          RETVAL=$?
80          if test "x$RETVAL" != x0 ; then          if test "x$RETVAL" != x0 ; then
81              echo              echo
82              echo "Error building the mpack tools at: $MPACK_DIR"              echo "Error building the mpack tools at: $MPACK_DIR"
83              exit 1              echo
84                HAVE_MPACK=f
85            else
86                rm -f tr_build_mpack.out
87                HAVE_MPACK=t
88          fi          fi
89        else
90            HAVE_MPACK=t
91      fi      fi
92      echo "OK"      echo "OK"
93  }  }
94    
 compare_lines()  
 {  
     # use codelet to compare lines  
     if [ $verbose -gt 1 ]; then  
         cat tmp3.txt 1>&2  
     fi  
     return `./a.out < tmp3.txt`  
 }  
   
95  testoutput_for_prop()  testoutput_for_prop()
96  {  {
97      # testoutput_for_prop dir s1 label subdir      # testoutput_for_prop dir s1 label subdir extension
98      #      #
99      #  compares files in $dir/$subdir/output.txt and $dir/results/output.txt      #  compares files $dir/$subdir/$OUTPUTFILE and $dir/results/output.txt
100      #  using search strings s1 and text label      #  using search strings s1 and text label
101    
102      if [ $debug -gt 0 ]; then      if [ $debug -gt 0 ]; then
103          echo testoutput_for_prop: grep "$2" $1/$4/output.txt 1>&2          echo testoutput_for_prop: grep "$2" $1/$4/$OUTPUTFILE 1>&2
104      fi      fi
105      if [ -r $1/$4/output.txt ]; then      if [ -r $1/$4/$OUTPUTFILE ]; then
106          grep "$2" $1/$4/output.txt | sed 's/.*=//' | nl > tmp1.txt          grep "$2" $1/$4/$OUTPUTFILE | sed 's/.*=//' | cat -n > tmp1.txt
107          lncnt=`wc -l tmp1.txt | awk '{print $1}' `          lncntA=`wc -l tmp1.txt | awk '{print $1}' `
108          if [ $lncnt -lt 3 ]; then          if [ $lncntA -lt 3 ]; then
109              if [ $verbose -gt 0 ]; then              if [ $verbose -gt 0 ]; then
110                  echo Not enough lines of output when searching for "$2" 1>&2                  echo Not enough lines of output when searching for "$2" 1>&2
111              fi              fi
112              return 99              return 99
113          fi          fi
114      else      else
115          echo testoutput_for_prop: output.txt from model run was not readable 1>&2          echo testoutput_for_prop: $OUTPUTFILE from model run was not readable 1>&2
116          return 99          return 99
117      fi      fi
118      if [ $debug -gt 0 ]; then      if [ $debug -gt 0 ]; then
119          echo testoutput_for_prop: grep "$2" $1/results/output.txt 1>&2          echo testoutput_for_prop: grep "$2" $1/results/output.$5 1>&2
120      fi      fi
121      grep "$2" $1/results/output.txt | sed 's/.*=//' | nl > tmp2.txt      grep "$2" $1/results/output.$5 | sed 's/.*=//' | cat -n > tmp2.txt
122      lncnt=`wc -l tmp2.txt | awk '{print $1}' `      lncntB=`wc -l tmp2.txt | awk '{print $1}' `
123      if [ $lncnt -lt 3 ]; then      if [ $lncntB -lt 3 ]; then
124          if [ $verbose -gt 0 ]; then          if [ $verbose -gt 0 ]; then
125              echo Not enough lines of output when searching for "$2" 1>&2              echo Not enough lines of output when searching for "$2" 1>&2
126          fi          fi
127          return 99          return 99
128      fi      fi
129        if [ $lncntA -ne $lncntB ]; then
130            if [ $verbose -gt 0 ]; then
131                echo Not same Nb of lines when searching for "$2" ":" $lncntA $lncntB 1>&2
132            fi
133            return 99
134        fi
135        has_nan=`cat tmp1.txt | grep -i nan | wc -l`
136        if [ $has_nan -gt 0  ] ; then
137            echo testoutput_for_prop: $OUTPUTFILE contains $has_nan NaN values  1>&2
138            return 99
139        fi
140        has_inf=`cat tmp1.txt | grep -i inf | wc -l`
141        if [ $has_inf -gt 0  ] ; then
142            echo testoutput_for_prop: $OUTPUTFILE contains $has_inf Inf values  1>&2
143            return 99
144        fi
145      if [ $debug -gt 0 ]; then      if [ $debug -gt 0 ]; then
146          echo testoutput_for_prop: join tmp1.txt tmp2.txt 1>&2          echo testoutput_for_prop: join tmp1.txt tmp2.txt 1>&2
147      fi      fi
# Line 109  testoutput_for_prop() Line 149  testoutput_for_prop()
149      if [ $debug -gt 0 ]; then      if [ $debug -gt 0 ]; then
150          echo testoutput_for_prop: compare_lines 1>&2          echo testoutput_for_prop: compare_lines 1>&2
151      fi      fi
152      compare_lines      if [ $verbose -gt 1 ]; then
153      digits_of_similarity=$?          cat tmp3.txt 1>&2
154        fi
155        echo "-1" >> tmp3.txt
156        # On the SGI O3K (*not* the O2K), "cat -n" inserts a ":" after the line number
157        cat tmp3.txt | sed -e 's|:||g' > tmp4.txt
158        digits_of_similarity=`./tmp_cmpnum < tmp4.txt`
159      if [ $digits_of_similarity -eq 99 ]; then      if [ $digits_of_similarity -eq 99 ]; then
160          if [ $verbose -gt 0 ]; then          if [ $verbose -gt 0 ]; then
161              echo testoutput_for_prop: No comparison was available for \"$2\" 1>&2              echo testoutput_for_prop: No comparison was available for \"$2\" 1>&2
# Line 121  testoutput_for_prop() Line 166  testoutput_for_prop()
166              echo There were $digits_of_similarity decimal places of similarity for \"$2\" 1>&2              echo There were $digits_of_similarity decimal places of similarity for \"$2\" 1>&2
167          fi          fi
168      fi      fi
169      rm tmp1.txt tmp2.txt tmp3.txt      rm -f tmp1.txt tmp2.txt tmp3.txt tmp4.txt
170            
171      return $digits_of_similarity      return $digits_of_similarity
172  }  }
# Line 141  dashnum() Line 186  dashnum()
186      done      done
187  }  }
188    
189    testoutput_ad()
190    {
191        grep $3 $1/results_ad/output_adm.txt | awk '{print NR " " $5}' > t05.txt
192        grep $3 $1/$2/$OUTPUTFILE | awk '{print NR " " $5}' > t15.txt
193        grep $3 $1/results_ad/output_adm.txt | awk '{print NR " " $6}' > t06.txt
194        grep $3 $1/$2/$OUTPUTFILE | awk '{print NR " " $6}' > t16.txt
195        join t05.txt t15.txt > t5.txt
196        join t06.txt t16.txt > t6.txt
197        echo "-1" >> t5.txt
198        echo "-1" >> t6.txt
199        digits_5=`./tmp_cmpnum < t5.txt`
200        digits_6=`./tmp_cmpnum < t6.txt`
201        dashnum $digits_5 $digits_6
202        rm -f t[01][56].txt t[56].txt
203    }
204    
205    check_for_add_mon_output()
206    {
207        # Check for additional types of monitor output
208        if test "x$1" = x ; then
209            return
210        fi
211    
212        for ii in $PTRACERS_NUM ; do
213            eval "HAVE_PTR0"$ii"=f"
214        done
215    
216        ptr_add="trcstat_ptracerXX_min trcstat_ptracerXX_max"
217        ptr_add="$ptr_add trcstat_ptracerXX_mean trcstat_ptracerXX_sd"
218        for ii in $PTRACERS_NUM ; do
219            for jj in $ptr_add ; do
220                name=`eval "echo $jj | sed -e 's|XX|0"$ii"|g'"`
221                tst=`grep $name $1 | wc -l | awk '{print $1}'`
222                if test ! "x$tst" = x0 ; then
223                    eval "HAVE_PTR0"$ii"=t"
224                fi
225            done
226            #  eval 'echo "HAVE_PTR0'$ii' = $HAVE_PTR0'$ii'"'
227        done
228    }
229    
230  testoutput()  testoutput()
231  {  {
232      # testoutput diretory subdir      # testoutput directory subdir extension
233      #      #
234      #  test output in "directory"      #  test output in "directory"
235        if test "x$ADM" = x ; then
236            if [ $debug -gt 0 ]; then
237                echo testoutput: testoutput_for_prop $1 cg2d_init_res 1>&2
238            fi
239            testoutput_for_prop $1 "cg2d_init_res" "cg2d init. residual" $2 $3; cg2dres=$?
240            if [ $debug -gt 0 ]; then
241                echo testoutput: cg2dres=$cg2dres 1>&2
242            fi
243            testoutput_for_prop $1 "dynstat_theta_min" "theta minimum" $2 $3; tmin=$?
244            testoutput_for_prop $1 "dynstat_theta_max" "theta maximum" $2 $3; tmax=$?
245            testoutput_for_prop $1 "dynstat_theta_mean" "theta mean" $2 $3; tmean=$?
246            testoutput_for_prop $1 "dynstat_theta_sd" "theta s.d." $2 $3; tsd=$?
247            testoutput_for_prop $1 "dynstat_salt_min" "salt minimum" $2 $3; smin=$?
248            testoutput_for_prop $1 "dynstat_salt_max" "salt maximum" $2 $3; smax=$?
249            testoutput_for_prop $1 "dynstat_salt_mean" "salt mean" $2 $3; smean=$?
250            testoutput_for_prop $1 "dynstat_salt_sd" "salt s.d." $2 $3; ssd=$?
251            testoutput_for_prop $1 "dynstat_uvel_min" "U minimum" $2 $3; umin=$?
252            testoutput_for_prop $1 "dynstat_uvel_max" "U maximum" $2 $3; umax=$?
253            testoutput_for_prop $1 "dynstat_uvel_mean" "U mean" $2 $3; umean=$?
254            testoutput_for_prop $1 "dynstat_uvel_sd" "U s.d." $2 $3; usd=$?
255            testoutput_for_prop $1 "dynstat_vvel_min" "V minimum" $2 $3; vmin=$?
256            testoutput_for_prop $1 "dynstat_vvel_max" "V maximum" $2 $3; vmax=$?
257            testoutput_for_prop $1 "dynstat_vvel_mean" "V mean" $2 $3; vmean=$?
258            testoutput_for_prop $1 "dynstat_vvel_sd" "V s.d." $2 $3; vsd=$?
259    
260            #  This is for PTRACERS
261            for ii in $PTRACERS_NUM ; do
262                eval `echo "p0"$ii"_min=99"`
263                eval `echo "p0"$ii"_max=99"`
264                eval `echo "p0"$ii"_mean=99"`
265                eval `echo "p0"$ii"_sd=99"`
266                tst=`eval 'echo "$HAVE_PTR0'$ii'"'`
267                #echo 'tst = '$tst
268                if test "x$tst" = xt ; then
269                    a="trcstat_ptracer0"
270                    testoutput_for_prop $1 "$a"$ii"_min"  "p0"$ii"_min"  $2 $3
271                    RETVAL=$? ; eval `echo "p0"$ii"_min="$RETVAL`
272                    testoutput_for_prop $1 "$a"$ii"_max"  "p0"$ii"_max"  $2 $3
273                    RETVAL=$? ; eval `echo "p0"$ii"_max="$RETVAL`
274                    testoutput_for_prop $1 "$a"$ii"_mean" "p0"$ii"_mean" $2 $3
275                    RETVAL=$? ; eval `echo "p0"$ii"_mean="$RETVAL`
276                    testoutput_for_prop $1 "$a"$ii"_sd"   "p0"$ii"_sd"   $2 $3
277                    RETVAL=$? ; eval `echo "p0"$ii"_sd="$RETVAL`
278                fi
279            done
280    
281      if [ $debug -gt 0 ]; then          allargs="$cg2dres $tmin $tmax $tmean $tsd $smin $smax $smean $ssd"
282          echo testoutput: testoutput_for_prop $1 cg2d_init_res 1>&2          allargs="$allargs $umin $umax $umean $usd $vmin $vmax $vmean $vsd"
283      fi          allargs="$allargs $p01_min $p01_max $p01_mean $p01_sd"
284      testoutput_for_prop $1 "cg2d_init_res" "cg2d init. residual" $2; cg2dres=$?          allargs="$allargs $p02_min $p02_max $p02_mean $p02_sd"
285      if [ $debug -gt 0 ]; then          allargs="$allargs $p03_min $p03_max $p03_mean $p03_sd"
286          echo testoutput: cg2dres=$cg2dres 1>&2          allargs="$allargs $p04_min $p04_max $p04_mean $p04_sd"
287            allargs="$allargs $p05_min $p05_max $p05_mean $p05_sd"
288    
289            eval "dashnum $allargs"
290    
291        else
292            testoutput_ad $1 $2 "precision_grdchk_result"
293      fi      fi
       
     testoutput_for_prop $1 "dynstat_theta_min" "theta minimum" $2; tmin=$?  
     testoutput_for_prop $1 "dynstat_theta_max" "theta maximum" $2; tmax=$?  
     testoutput_for_prop $1 "dynstat_theta_mean" "theta mean" $2; tmean=$?  
     testoutput_for_prop $1 "dynstat_theta_sd" "theta s.d." $2; tsd=$?  
     testoutput_for_prop $1 "dynstat_salt_min" "salt minimum" $2; smin=$?  
     testoutput_for_prop $1 "dynstat_salt_max" "salt maximum" $2; smax=$?  
     testoutput_for_prop $1 "dynstat_salt_mean" "salt mean" $2; smean=$?  
     testoutput_for_prop $1 "dynstat_salt_sd" "salt s.d." $2; ssd=$?  
     testoutput_for_prop $1 "dynstat_uvel_min" "U minimum" $2; umin=$?  
     testoutput_for_prop $1 "dynstat_uvel_max" "U maximum" $2; umax=$?  
     testoutput_for_prop $1 "dynstat_uvel_mean" "U mean" $2; umean=$?  
     testoutput_for_prop $1 "dynstat_uvel_sd" "U s.d." $2; usd=$?  
     testoutput_for_prop $1 "dynstat_vvel_min" "V minimum" $2; vmin=$?  
     testoutput_for_prop $1 "dynstat_vvel_max" "V maximum" $2; vmax=$?  
     testoutput_for_prop $1 "dynstat_vvel_mean" "V mean" $2; vmean=$?  
     testoutput_for_prop $1 "dynstat_vvel_sd" "V s.d." $2; vsd=$?  
       
     dashnum $cg2dres $tmin $tmax $tmean $tsd $smin $smax $smean $ssd \  
         $umin $umax $umean $usd $vmin $vmax $vmean $vsd  
294  }  }
295    
296  genmakemodel()  genmakemodel()
# Line 182  genmakemodel() Line 299  genmakemodel()
299      if test "x$NOGENMAKE" = xt ; then      if test "x$NOGENMAKE" = xt ; then
300          echo "genmake skipped!"          echo "genmake skipped!"
301      else      else
302          GENMAKE2="$BASH ../../../tools/genmake2"          if test "x$BASH" = x ; then
303                GENMAKE2="../../../tools/genmake2"
304            else
305                GENMAKE2="$BASH ../../../tools/genmake2 -bash $BASH"
306            fi
307          (          (
308              cd $1;              cd $1;
309              printf 'genmake ... ' 1>&2              command="$GENMAKE2  -ds -m $MAKE"
310              command="$GENMAKE2  -ds -m $MAKE --mods=../code"              if test "x$ADM" = x ; then
311                    command="$command --mods=../code"
312                else
313                    command="$command --mods=../code_ad"
314                fi
315              if test "x$OPTFILE" != xNONE ; then              if test "x$OPTFILE" != xNONE ; then
316                  command="$command --optfile=$OPTFILE"                  command="$command --optfile=$OPTFILE"
                 # echo "  command=\"$command\""  
317              fi              fi
318                if test "x$IEEE" != x ; then
319                    command="$command -ieee"
320                fi
321                if test "x$MPI" = xt ; then
322                    command="$command -mpi"
323                fi
324                if test "x$TS" = xt ; then
325                    command="$command -ts"
326                fi
327                if test "x$PAPIS" = xt ; then
328                    command="$command -papis"
329                else
330                if test "x$PCLS" = xt ; then
331                    command="$command -pcls"
332                fi
333                fi
334                printf 'genmake ... ' 1>&2
335              $command > make.log 2>&1              $command > make.log 2>&1
336              RETVAL=$?              RETVAL=$?
337              for i in genmake_state genmake_optfile genmake_local Makefile ; do              #  Reduce the size of the testing emails!
338                  if test -r $i ; then              head -100 Makefile > $CDIR/Makefile_head
                     cp $i $CDIR  
                 fi  
             done  
339              if test "x$RETVAL" != x0 ; then              if test "x$RETVAL" != x0 ; then
340                  tail make.log                  tail make.log
341                  echo "genmakemodel: genmake failed" 1>&2                  echo "genmakemodel: genmake failed" 1>&2
342                  cp make.log $CDIR                  cp genmake_* make.log $CDIR
343                  return 1                  return 1
344              else              else
345                  echo "succesful" 1>&2                  echo "successful" 1>&2
346              fi              fi
347          )          )
348      fi      fi
# Line 214  makeclean() Line 352  makeclean()
352  {  {
353      # makeclean directory      # makeclean directory
354      if test "x$NOCLEAN" = xt ; then      if test "x$NOCLEAN" = xt ; then
355          echo "make CLEAN skipped!"          echo "make Clean skipped!"
356      else      else
357          (          (
358              cd $1;              cd $1;
359              if test -e output.txt ; then              #if test -e $OUTPUTFILE ; then rm -f $OUTPUTFILE ; fi
                 rm -f output.txt  
             fi  
             printf 'make CLEAN ... ' 2>&1  
360              if test -r Makefile ; then              if test -r Makefile ; then
361                  $MAKE CLEAN >> make.log 2>&1                  printf 'clean build-dir: make Clean ... ' 2>&1
362                    $MAKE Clean >> make.log 2>&1
363                  RETVAL=$?                  RETVAL=$?
364                  if test "x$RETVAL" != x0 ; then                  if test "x$RETVAL" != x0 ; then
365                      tail make.log                      tail make.log
366                      echo "makeclean: \"make CLEAN\" failed" 1>&2                      echo "makeclean: \"make Clean\" failed" 1>&2
367                      cp make.log $CDIR"/make.log"                      cp make.log $CDIR"/make.log"
368                      return 1                      return 1
369                  fi                  fi
370              fi              fi
371              echo succesful 1>&2              echo successful 1>&2
372                exit 0
373            )
374        fi
375    }
376    
377    run_clean()
378    {
379        # run_clean directory
380        if test "x$NOCLEAN" = xt ; then
381            echo "run_clean skipped!"
382        else
383            (
384                cd $1;
385                printf 'clean run-dir ... ' 2>&1
386                # part of what is done after "make clean" when doing "make CLEAN"
387                find . -name "*.meta" -exec rm {} \;
388                find . -name "*.data" -exec rm {} \;
389                find . -name "fort.*" -exec rm {} \;
390                find . -type l -exec rm {} \;
391                rm -f $EXECUTABLE *.txt STD* *diagnostics.log datetime
392                rm -rf mnc_test_*
393                echo successful 1>&2
394              exit 0              exit 0
395          )          )
396      fi      fi
# Line 255  makedependmodel() Line 413  makedependmodel()
413                  cp make.log $CDIR"/make.log"                  cp make.log $CDIR"/make.log"
414                  return 1                  return 1
415              else              else
416                  echo succesful 1>&2                  echo successful 1>&2
417              fi              fi
418          )          )
419      fi      fi
# Line 268  makemodel() Line 426  makemodel()
426          cd $1;          cd $1;
427          if test -r Makefile ; then          if test -r Makefile ; then
428              printf 'make ... ' 1>&2              printf 'make ... ' 1>&2
429              $MAKE >> make.log 2>&1              if test "x$ADM" = x ; then
430                    if test "x$JOBS" = x ; then
431                        $MAKE >> make.log 2>&1
432                    else
433                        $MAKE -j $JOBS >> make.log 2>&1
434                    fi
435                else
436                    $MAKE adall >> make.log 2>&1
437                fi
438              RETVAL=$?              RETVAL=$?
439              if test "x$RETVAL" != x0 ; then              if test "x$RETVAL" != x0 ; then
440                  tail make.log                  tail make.log
# Line 276  makemodel() Line 442  makemodel()
442                  cp make.log $CDIR"/make.log"                  cp make.log $CDIR"/make.log"
443                  return 1                  return 1
444              else              else
445                  echo succesful 1>&2                  echo successful 1>&2
446              fi              fi
447          fi          fi
448      )      )
449  }  }
450    
451    symlink_mpifiles()
452    {
453        # Put special links so that MPI specific files are used
454        # This MUST be invoked between makeclean and makelinks because
455        # the Makefile will link to non-mpi files by default
456    
457        dir=$1
458        code_dir=$2
459        BUILD_DIR=$dir/$3
460        CODE_DIR=$dir/$code_dir
461        
462        # These are files that should replace their counter-part when using -mpi
463        MPI_FILES=`(cd $CODE_DIR; find . -name "*_mpi")`
464    
465        #  Is this an MPI run?
466        if test "x$MPI" = xt ; then
467            # YES: We symbolically link these files to the build
468            # dir so long as there is no real file in place
469            for ii in $MPI_FILES ; do
470                i=`echo $ii | sed 's:^\./::'`
471                name=`echo $i | sed 's:_mpi::' `
472                cmp $CODE_DIR/$i $BUILD_DIR/$name > /dev/null 2>&1
473                RETVAL=$?
474                if test "x$RETVAL" != x0 ; then
475                    if ! test -f $BUILD_DIR/$i ; then
476                        #echo Linking $name to $i
477                        (cd $BUILD_DIR; ln -sf ../$code_dir/$i $name)
478                    fi
479                fi
480            done
481        else
482            # NO: We undo any _mpi symbolically linked files
483            for ii in $MPI_FILES ; do
484                i=`echo $ii | sed 's:^\./::'`
485                name=`echo $i | sed 's:_mpi::' `
486                if test -L $BUILD_DIR/$name ; then
487                    cmp $BUILD_DIR/$name "../$code_dir/$name"_mpi > /dev/null 2>&1
488                    RETVAL=$?
489                    if test "x$RETVAL" = x0 ; then
490                        #echo Un-linking $name from $linktarg
491                        rm -f $BUILD_DIR/$name
492                    fi
493                fi
494            done
495        fi
496        
497    }
498    
499  linkdata()  linkdata()
500  {  {
501      # linkdata flag      # linkdata run_dir input_dir_1 input_dir_2 ...
502      #      #
503      # symbolically link data files to run directory      # symbolically link data files to run directory
504      if [ $1 -ne 0 ]; then      if test -d $1 ; then
505          ( cd $2 ;  ln -sf ../input/* . )          (
506                cd $1 ; shift
507                if test -r "../"$1"/eedata.mth" ; then
508                # found eedata.mth in 1rst input dir and it is readable
509                    if test "x$MULTI_THREAD" = "xt" ; then
510                    # multi-threaded test: remove symbolic link & link eedata.mth
511                        if test -h eedata ; then rm -f eedata ; fi
512                        if test ! -r eedata ; then
513                            ln -sf "../"$1"/eedata.mth" eedata ;
514                            printf 'eedata.mth ' 1>&2
515                        fi
516                    else
517                    # not multi-threaded test: remove eedata symbolic link
518                        if test -h eedata ; then rm -f eedata ; fi
519                    fi
520                fi
521                for ldir in $* ; do
522                    if test -d "../"$ldir ; then
523                        printf 'ldir='${ldir} 1>&2
524                        files=`( cd "../"$ldir ; ls -1 | grep -v CVS )`
525                        for i in $files ; do
526                            if test ! -d "../"$ldir/$i ; then
527                                if test ! -r $i  ; then
528                                    printf ' '$i 1>&2
529                                    ln -sf "../"$ldir"/"$i $i
530                                fi
531                            fi
532                        done
533                        if test -x "../"$ldir"/"prepare_run ; then
534                            "../"$ldir"/"prepare_run
535                        fi
536                        printf ' ; ' 1>&2
537                    fi
538                done
539            )
540      fi      fi
541  }  }
542    
# Line 296  runmodel() Line 544  runmodel()
544  {  {
545      # runmodel directory      # runmodel directory
546      #      #
547      #  runs "$COMMAND" in "directory"      #  runs "$COMMAND in "directory"
548      #  (where "$COMMAND" is relative to "directory")      #  (where "$COMMAND" is relative to "directory")
549      (      (
550          cd $1          cd $1
551          printf 'runmodel: ' 1>&2          printf 'runmodel in %s ...' $1 1>&2
552          # make output.txt          # make output.txt
553          $COMMAND          echo
554          RETVAL=$?          if test ! -x $EXECUTABLE -a -x "../"$builddir"/"$EXECUTABLE ; then
555          if test "x$RETVAL" = x0 ; then              echo " link" $EXECUTABLE "from dir ../"$builddir > run.log_00
556              cp output.txt $CDIR"/output.txt"              ln -sf "../"$builddir"/"$EXECUTABLE .
557            fi
558            if test ! -x $EXECUTABLE ; then
559                    rm -f run.log ; touch run.log
560                    if test -f run.log_00 ; then cat run.log_00 >> run.log ; fi
561                    echo " no executable:" $EXECUTABLE >> run.log
562                    RETVAL=8
563                    ENDVAL=-1
564            else
565                if test $OUTPUTFILE -ot $EXECUTABLE ; then
566                    rm -f run.log ; touch run.log
567                    if test -f run.log_00 ; then cat run.log_00 >> run.log ; fi
568                    ( eval $COMMAND ) >> run.log 2>&1
569                    RETVAL=$?
570                else
571                    RETVAL=0
572                    if test -f run.log ; then
573                        if test -f run.log_00 ; then cat run.log_00 >> run.log ; fi
574                        echo "---------->> $OUTPUTFILE is up to date " >> run.log 2>&1
575                    else
576                        touch run.log
577                        if test -f run.log_00 ; then cat run.log_00 >> run.log ; fi
578                        echo "---------->> $OUTPUTFILE is up to date " >> run.log 2>&1
579                        echo " no previous run.log: assume NORMAL END" >> run.log 2>&1
580                    fi
581                fi
582                ENDVAL=`cat run.log | grep -v 'ABNORMAL END' | grep -c 'NORMAL END'`
583            fi
584            rm -f run.log_00
585            #if test "x$RETVAL" = x0 ; then
586            if [ $RETVAL -eq 0 -a $ENDVAL -gt 0 ] ; then
587                tail run.log
588                echo successful 1>&2
589                # === Reduce the size of the testing emails!
590                #cp $OUTPUTFILE $CDIR"/"$OUTPUTFILE
591                if test -s STDERR.0000 ; then cp STDERR.0000 $CDIR"/STDERR.0000" ; fi
592              return 0              return 0
593          else          else
594                tail run.log
595                echo failed '(run:' $RETVAL ' end:' $ENDVAL ')' 1>&2
596                cp run.log $CDIR"/run.log"
597                if test -s STDERR.0000 ; then cp STDERR.0000 $CDIR"/STDERR.0000" ; fi
598              return 1              return 1
599          fi          fi
600      )      )
# Line 317  createcodelet() Line 604  createcodelet()
604  {  {
605      # create codelet for comparing model output      # create codelet for comparing model output
606    
607      echo -n "creating the comparison code...  "      printf "creating the comparison code...  "
608      cat > tmp_cmpnum.f <<EOFA      cat > tmp_cmpnum.c <<EOF
609        program cmpnum  #include <stdio.h>
610        implicit none  #include <math.h>
611        real*8 a,b,diff  int main( int argc, char** argv )  {
612        integer linnum,best    int linnum,best,lncnt;
613        best=-16    double a,b,abave,relerr;
614    99  read(*,*,end=70,err=60) linnum,a,b    best = -22;
615        diff=0.5*(abs(a)+abs(b))    lncnt = 0;
616  c     print *,a,b,diff,abs(a-b)/diff    while( 1 & (lncnt+=1) < 999 )  {
617        if (diff.gt.1.e-12) then      scanf("%d", &linnum);
618          diff=abs(a-b)/diff      if (linnum == -1)  break;
619          if (diff.gt.0.) then      scanf("%lf", &a);  scanf("%lf", &b);
620  c         print *,int(log10(diff)),diff      abave = 0.5*(fabs(a)+fabs(b));
621            linnum=int(log10(diff))      if (abave > 0.0) {
622            best=max(best,linnum)        relerr=fabs(a-b)/abave;
623          endif        if (relerr > 0.0) { linnum = (int)rint(log10(relerr)); }
624        else        else { linnum = -16 ; }
625          if (best.eq.-16.and.diff.ne.0.) best=-22        best = (best > linnum) ? best : linnum;
626        endif      }
627        goto 99    }
628    60  stop 'cmpnum: An error occured reading a,b'    if (lncnt == 999) best=-29;
629    70  print *,-best    printf("%d\n", -best);
630        end    return 0;
631  EOFA  }
632    EOF
633        $CC -o tmp_cmpnum tmp_cmpnum.c -lm
634    
635      f77 tmp_cmpnum.f      if [ -x ./tmp_cmpnum ]; then
     if [ -x ./a.out ]; then  
636          echo "OK"          echo "OK"
637          return 0          return 0
638      else      else
639          echo          echo
640          echo "createcodelet: failed to compile codelet"          echo "ERROR: failed to compile comparison code -- please specify"
641            echo "  a C compiler using the CC environment variable."
642          exit 1          exit 1
643      fi      fi
644  }  }
# Line 377  formatresults() Line 666  formatresults()
666            
667  }  }
668    
 show_help()  
 {  
     cat - << EOF  
 $0 [-help] [-quick] [-verbose] dir1 [dir2] [...]  
   
  -help|-h      Show this help message  
  -quiet     Reduce the amount of output  
  -verbose   Produce copious amounts of output  
  -debug     Produce even more output which will mean nothing to most  
  -force     Do "make CLEAN" before compiling. This forces a complete rebuild.  
  -clean     Do "make CLEAN" after compiling and testing.  
  -noieee    By default, $0 uses the -ieee option for genmake. This turns it off.  
  -cleanup   Aggresively removes all model output, executables and object files  
             and then exits. Use with care.  
   
 Normal usage:  
  $0 *       Configure, compile, run and analyze in all experiment directories  
 EOF  
 }  
   
669  scandirs()  scandirs()
670  {  {
671      if [ $# -eq 0 ]; then      if [ $# -eq 1 ]; then
672          for arg in * ; do          for arg in * ; do
673              test -d $arg/input && echo $arg              test -d $arg/$1 && echo $arg
674          done          done
675      else      else
676          echo $*          echo $*
677      fi      fi
678  }  }
679    
680    
681  ###############################################################################  ###############################################################################
 ###############################################################################  
 ###############################################################################  
682    
683    
684  #  Default properties  #  Default properties
# Line 421  clean=0 Line 688  clean=0
688  expts=''  expts=''
689  # ieee=1  # ieee=1
690    
691    IEEE=true
692    if test "x$MITGCM_IEEE" != x ; then
693        IEEE=$MITGCM_IEEE
694    fi
695    
696    
697  CLEANUP=f  CLEANUP=f
698  QUICK=f  QUICK=f
699  NOGENMAKE=f  NOGENMAKE=f
700  NOCLEAN=f  NOCLEAN=f
701  NODEPEND=f  NODEPEND=f
702    POSTCLEAN=f
703    
704  BASH=  BASH=
705  OPTFILE=NONE  OPTFILE=NONE
706  ADDRESSES=  ADDRESSES=
707  TESTDIRS=  TESTDIRS=
708    SKIPDIRS=
709  MPACKDIR="../tools/mpack-1.6"  MPACKDIR="../tools/mpack-1.6"
710    HAVE_MPACK=
711  MPACK="$MPACKDIR/mpack"  MPACK="$MPACKDIR/mpack"
712  COMMAND="make output.txt"  COMMAND=
713  MAKE=make  if test "x$MAKE" = x ; then
714        MAKE=make
715    fi
716    if test "x$CC" = x ; then
717        CC=cc
718    fi
719    JOBS=
720  MPI=f  MPI=f
721    MULTI_THREAD=f
722    OUTDIR=
723    DELDIR=
724    
725    ADM=
726    
727    # Additional monitor types
728    PTRACERS_NUM="1 2 3 4 5"
729    
730  echo -n "parsing options...  "  printf "parsing options...  "
731    
732  ac_prev=  ac_prev=
733  for ac_option ; do  for ac_option ; do
# Line 471  for ac_option ; do Line 761  for ac_option ; do
761          -tdir=* | --tdir=*)          -tdir=* | --tdir=*)
762              TESTDIRS=$ac_optarg ;;              TESTDIRS=$ac_optarg ;;
763    
764            -skipdir | --skipdir | -skd | --skd)
765                ac_prev=SKIPDIRS ;;
766            -skipdir=* | --skipdir=*)
767                SKIPDIRS=$ac_optarg ;;
768    
769          -bash | --bash | -b | --b)          -bash | --bash | -b | --b)
770              ac_prev=BASH ;;              ac_prev=BASH ;;
771          -bash=* | --bash=*)          -bash=* | --bash=*)
# Line 486  for ac_option ; do Line 781  for ac_option ; do
781          -make=* | --make=*)          -make=* | --make=*)
782              MAKE=$ac_optarg ;;              MAKE=$ac_optarg ;;
783    
784            -odir | --odir)
785                ac_prev=OUTDIR ;;
786            -odir=* | --odir=*)
787                OUTDIR=$ac_optarg ;;
788    
789            -ptracers | --ptracers | -ptr | --ptr)
790                ac_prev=PTRACERS_NUM ;;
791            -ptracers=* | --ptracers=* | -ptr=* | --ptr=*)
792                PTRACERS_NUM=$ac_optarg ;;
793    
794            -j) ac_prev=JOBS ;;
795            -j=*) JOBS=$ac_optarg ;;
796    
797          -clean | --clean)          -clean | --clean)
798              CLEANUP=t ;;              CLEANUP=t ; DELDIR=t ;;
799    
800          -quick | --quick | -q | --q)          -quick | --quick | -q | --q)
801              QUICK=t ;;              QUICK=t ;;
# Line 498  for ac_option ; do Line 806  for ac_option ; do
806          -nodepend | --nodepend | -nd | --nd)          -nodepend | --nodepend | -nd | --nd)
807              NODEPEND=t ;;              NODEPEND=t ;;
808    
809            -postclean | --postclean | -pc | --pc)
810                POSTCLEAN=t ;;
811    
812          -mpi) MPI=t ;;          -mpi) MPI=t ;;
813    
814            -mth) MULTI_THREAD=t ;;
815    
816            -adm | -ad) ADM=t ;;
817    
818            -ieee) IEEE=true ;;
819            -noieee) IEEE= ;;
820    
821          -verbose) verbose=2 ;;          -verbose) verbose=2 ;;
822          -debug) debug=1 ;;          -debug) debug=1 ;;
823          -quiet) verbose=0 ;;          -quiet) verbose=0 ;;
824    
825            -deldir | -dd) DELDIR=t ;;
826    
827            -ts) TS=t;;
828    
829            -papis) PAPIS=t;;
830    
831            -pcls) PCL=t;;
832    
833          -*)          -*)
834              echo "Error: unrecognized option: "$ac_option              echo "Error: unrecognized option: "$ac_option
835              usage              usage
# Line 524  if test "x$QUICK" = xt ; then Line 851  if test "x$QUICK" = xt ; then
851  fi  fi
852    
853  if test "x$TESTDIRS" = x ; then  if test "x$TESTDIRS" = x ; then
854      TESTDIRS=`scandirs`      if test "x$ADM" = xt ; then
855            LIST=`scandirs results_ad`
856        else
857            LIST=`scandirs results`
858        fi
859    else
860        #- expand group of experiments:
861        LIST=" "
862        for xx in $TESTDIRS
863        do
864          case $xx in
865            'basic') LIST=${LIST}" aim.5l_cs hs94.128x64x5 ideal_2D_oce"
866                     LIST=${LIST}" lab_sea tutorial_baroclinic_gyre"
867                     LIST=${LIST}" tutorial_global_oce_latlon tutorial_plume_on_slope"
868                    ;;
869            'tutorials')
870                     LIST=${LIST}" "`ls | grep 'tutorial_'` ;;
871            *)       LIST=${LIST}" "$xx ;;
872          esac
873        done
874  fi  fi
875    #echo 'LIST='${LIST}'<'
876    #- skip dirs, remove duplicate and non-directory:
877    TESTDIRS=" "
878    count=0
879    for xx in $LIST
880    do
881        yy=`echo $SKIPDIRS | grep -c $xx`
882        if test $yy = 0 ; then
883            if test -d $xx ; then
884                yy=`echo $TESTDIRS | grep -c $xx`
885                if test $yy = 0 ; then TESTDIRS=${TESTDIRS}" "$xx ; fi
886            else count=1 ;
887                echo ""; echo -n " -- skip \"$xx\" (not a directory !)"
888            fi
889        else
890            if test $count = 1 ; then echo -n ", \"$xx\""
891            else count=1 ; echo "" ;  echo -n " skip: \"$xx\""
892            fi
893        fi
894    done
895    if test $count = 1 ; then echo "" ; echo -n " ... " ; fi
896    #echo 'TESTDIRS='${TESTDIRS}'<'
897    
898  if test "x$OPTFILE" = xNONE -a "x$MITGCM_OF" != x ; then  if test "x$OPTFILE" = xNONE -a "x$MITGCM_OF" != x ; then
899      OPTFILE=$MITGCM_OF      OPTFILE=$MITGCM_OF
900  fi  fi
901    
902  echo "OK"  if test "x$ADM" = xt ; then
903        EXECUTABLE="mitgcmuv_ad"
904        OUTPUTFILE="output_adm.txt"
905    else
906        EXECUTABLE="mitgcmuv"
907        OUTPUTFILE="output.txt"
908    fi
909    
910    if test "x$COMMAND" = x ; then
911        COMMAND="./$EXECUTABLE > $OUTPUTFILE"
912    fi
913    if test "x$MPI" = xt ; then
914        OUTPUTFILE="STDOUT.0000"
915    fi
916    
917    #echo "OK"
918    echo "OK (COMMAND= $COMMAND )"
919    
920  #  create the FORTRAN comparison code  #  create the FORTRAN comparison code
921  createcodelet  createcodelet
922    
923  #  build the mpack utility  #  build the mpack utility
924  build_mpack  if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then
925        echo "skipping mpack build"
926    else
927        build_mpack
928    fi
929    
930  #  Create a uniquely named directory to store results  #  Create a uniquely named directory to store results
931  MACH=`hostname`  MACH=`hostname`
932  UNAMEA=`uname -a`  UNAMEA=`uname -a`
933  DATE=`date +%Y%m%d`  DATE=`date +%Y%m%d`
934  BASE=$MACH"_"$DATE"_"  BASE="tr_"$MACH"_"$DATE"_"
935    if test "x$OUTDIR" != x ; then
936        BASE="tr_"$OUTDIR"_"$DATE"_"
937    fi
938  DNUM=0  DNUM=0
939  DRESULTS="$BASE$DNUM"  DRESULTS="$BASE$DNUM"
940  while test -e $DRESULTS ; do  while test -e $DRESULTS ; do
# Line 553  done Line 944  done
944  mkdir $DRESULTS  mkdir $DRESULTS
945  RETVAL=$?  RETVAL=$?
946  if test "x$RETVAL" != x0 ; then  if test "x$RETVAL" != x0 ; then
947      echo "Error: can't create results directory \"./$DRESULTS\""      echo "ERROR: Can't create results directory \"./$DRESULTS\""
948      exit 1      exit 1
949  fi  fi
950  SUMMARY="$DRESULTS/summary.txt"  SUMMARY="$DRESULTS/summary.txt"
951  date > $SUMMARY  printf "Start time:  " >> $SUMMARY
952  cat << EOF >> $SUMMARY  start_date=`date`
953                  T           S           U           V  echo $start_date > $SUMMARY
 G D M    c        m  s        m  s        m  s        m  s  
 E p a R  g  m  m  e  .  m  m  e  .  m  m  e  .  m  m  e  .  
 N n k u  2  i  a  a  d  i  a  a  d  i  a  a  d  i  a  a  d  
 2 d e n  d  n  x  n  .  n  x  n  .  n  x  n  .  n  x  n  .  
   
 EOF  
   
 NDIR=0  
954    
955    of_path=
956  if test "x$OPTFILE" != xNONE ; then  if test "x$OPTFILE" != xNONE ; then
957      if test -r $OPTFILE ; then      if test -r $OPTFILE ; then
958          OPTFILE=`pwd`"/$OPTFILE"          # get the path
959            path=${OPTFILE%/*}
960            if test "x$path" = x ; then
961                of_path=`pwd`
962            else
963                of_path=`( cd $path > /dev/null 2>&1 ; pwd )`
964            fi
965            file=${OPTFILE##*/}
966            OPTFILE=$of_path/$file
967            cp $OPTFILE $DRESULTS
968            echo >> $SUMMARY
969            echo "  OPTFILE=$OPTFILE" >> $SUMMARY
970        else
971            echo | tee $SUMMARY
972            echo "ERROR: can't read OPTFILE=\"$OPTFILE\"" | tee $SUMMARY
973            exit 1
974      fi      fi
975    else
976        echo >> $SUMMARY
977        echo "No \"OPTFILE\" was explicitly specified by testreport," >> $SUMMARY
978        echo "   so the genmake default will be used." >> $SUMMARY
979  fi  fi
980  echo  echo
 echo "OPTFILE=$OPTFILE" >> $SUMMARY  
981  echo >> $SUMMARY  echo >> $SUMMARY
982    if test "x$ADM" = x ; then
983        line_0="            ----T-----  ----S-----  ----U-----  ----V-----"
984        line_1="G D M    c        m  s        m  s        m  s        m  s"
985        line_2="E p a R  g  m  m  e  .  m  m  e  .  m  m  e  .  m  m  e  ."
986        line_3="N n k u  2  i  a  a  d  i  a  a  d  i  a  a  d  i  a  a  d"
987        line_4="2 d e n  d  n  x  n  .  n  x  n  .  n  x  n  .  n  x  n  ."
988        for ii in $PTRACERS_NUM ; do
989            #  tst=`eval 'echo $HAVE_PTR0'$ii`
990            #  if test "x$tst" = xt ; then
991            line_0="$line_0  --PTR 0"$ii"--"
992            line_1="$line_1        m  s"
993            line_2="$line_2  m  m  e  ."
994            line_3="$line_3  i  a  a  d"
995            line_4="$line_4  n  x  n  ."
996            #  fi
997        done
998        echo "$line_0" | tee -a $SUMMARY
999        echo "$line_1" | tee -a $SUMMARY
1000        echo "$line_2" | tee -a $SUMMARY
1001        echo "$line_3" | tee -a $SUMMARY
1002        echo "$line_4" | tee -a $SUMMARY
1003        echo " "       | tee -a $SUMMARY
1004    else
1005        echo "ADJOINT=true" >> $SUMMARY
1006        echo >> $SUMMARY
1007        cat << EOF | tee -a $SUMMARY
1008    G D M    C  G
1009    E p a R  o  r
1010    N n k u  s  a
1011    2 d e n  t  d
1012    
1013    EOF
1014    fi
1015    
1016  #  ...and each test directory...  #  ...and each test directory...
1017  for dir in $TESTDIRS ; do  for dir in $TESTDIRS ; do
# Line 584  for dir in $TESTDIRS ; do Line 1019  for dir in $TESTDIRS ; do
1019      #  Cleanup only!      #  Cleanup only!
1020      if test "x$CLEANUP" = xt ; then      if test "x$CLEANUP" = xt ; then
1021          if test -r $dir/build/Makefile ; then          if test -r $dir/build/Makefile ; then
1022                echo '  ------  clean dir:' $dir/build
1023              ( cd $dir/build ; make CLEAN )              ( cd $dir/build ; make CLEAN )
1024          fi          fi
1025          if test -r $dir/input/Makefile ; then          if test -d $dir/run/CVS ; then
1026              ( cd $dir/input ; make CLEAN )              echo '  ------  clean dir:' $dir/run
1027                run_clean $dir/run
1028          fi          fi
1029            (
1030                cd $dir
1031                rm -rf tr_run.*
1032            )
1033          continue          continue
1034      fi      fi
1035    
1036      #  Verify that the testdir exists and contains previous      #  Verify that the testdir exists and contains previous
1037      #  results in the correct location--or skip this directory!      #  results in the correct location--or skip this directory!
1038      if test ! -r $dir"/results/output.txt" ; then      fout=
1039          echo "can't read \"$dir/results/output.txt\" -- skipping $dir"      if test "x$ADM" = x ; then
1040            fout=$dir"/results/output.txt"
1041        else
1042            fout=$dir"/results_ad/output_adm.txt"
1043        fi
1044        if test ! -r $fout ; then
1045            echo "can't read \"$fout\" -- skipping $dir"
1046          continue          continue
1047      fi      fi
1048        if test "x$ADM" = x ; then
1049            check_for_add_mon_output  $fout
1050        fi
1051    
1052      echo "-------------------------------------------------------------------------------"      # Check for additional types of monitor output
     echo  
     echo "Experiment:  $dir"  
     echo  
     unset genmake makedepend make run  
     results='-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --'  
1053    
1054      if [ -r $dir/build ]; then      builddir="build"
1055          seperatebuilddir=1      if test ! -d $dir/$builddir ; then mkdir $dir/$builddir ; fi
1056          builddir=build      rundir="run"
1057          rundir=build     #rundir=$builddir
1058          ( cd $dir/build; ln -sf ../input/* . )      if test ! -d $dir/$rundir ; then
1059      else          rundir=$builddir
         seperatebuilddir=0  
         builddir=input  
         rundir=input  
1060      fi      fi
1061            
1062      CODE_DIR=$dir/code      if test "x$ADM" = x ; then
1063            code_dir=code
1064            CODE_DIR=$dir/code
1065            input_dirs='input'
1066        else
1067            code_dir=code_ad
1068            CODE_DIR=$dir/code_ad
1069            input_dirs='input_ad input'
1070        fi
1071      BUILD_DIR=$dir/$builddir      BUILD_DIR=$dir/$builddir
     MPI_FILES="CPP_EEOPTIONS.h_mpi SIZE.h_mpi"  
     NOMPI_FILES="CPP_EEOPTIONS.h_nompi SIZE.h_nompi"  
1072    
1073      #  Is this an MPI run?      if test ! -r $CODE_DIR"/SIZE.h_mpi" -a "x$MPI" = "xt" ; then
1074      if test "x$MPI" = xt ; then          echo "can't find \"$CODE_DIR/SIZE.h_mpi\" -- skipping $dir"
1075          FILES=$MPI_FILES          continue
     else  
         FILES=$NOMPI_FILES  
1076      fi      fi
1077            if test ! -r $dir"/input/eedata.mth" -a "x$MULTI_THREAD" = "xt" ; then
1078      #  Check to see that we have the files          echo "can't find \"$dir/input/eedata.mth\" -- skipping $dir"
     have_files=t  
     for i in $FILES ; do  
         if test ! -r $CODE_DIR/$i ; then  
             echo "Warning: can't read file $CODE_DIR/$i"  
             have_files=f  
         fi  
     done  
     if test "x$have_files" != xt -a "x$MPI" = xt ; then  
         echo "Skipping $dir due to lack of input files (see above warning)"  
1079          continue          continue
1080      fi      fi
1081        
1082      #  If we have the $FILES and they differ, copy the $FILES to $BUILD_DIR      #  Check whether there are "extra runs" for this testdir
1083      if test "x$have_files" = xt ; then      extra_runs=
1084          for i in $FILES ; do      if test "x$ADM" = x ; then
1085              cmp $CODE_DIR/$i $BUILD_DIR/$i > /dev/null 2>&1          ex_run_dirs=`( cd $dir ; echo input.* )`
1086              RETVAL=$?          #echo "ex_run_dirs='$ex_run_dirs'"
1087              if test "x$RETVAL" != x0 ; then          for exd in $ex_run_dirs ; do
1088                  cp $CODE_DIR/$i $BUILD_DIR/$i              name=`echo $exd | sed -e 's/input.//g'`
1089                outf="$dir/results/output.$name.txt"
1090                if test -f $outf -a -r $outf ; then
1091                    if test "x$MULTI_THREAD" = "xt" ; then
1092                        if test -r $dir"/"$exd"/eedata.mth" ; then
1093                            extra_runs="$extra_runs $name"
1094                        #else echo $dir"/"$exd"/eedata.mth: not found"
1095                        fi
1096                    else
1097                        extra_runs="$extra_runs $name"
1098                    fi
1099              fi              fi
1100          done          done
1101      fi      fi
1102        
1103        echo "-------------------------------------------------------------------------------"
1104        echo
1105        if test "x$extra_runs" = "x" ; then
1106           echo "Experiment:  $dir"
1107        else
1108           echo "Experiment:  $dir ; extra_runs=$extra_runs"
1109        fi
1110        echo
1111        unset genmake makedepend make run
1112        results='-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --'
1113    
1114      #  Create an output dir for each OPTFILE/tdir combination      #  Create an output dir for each OPTFILE/tdir combination
1115      CDIR=$DRESULTS"/"$DRESULTS"_"$NDIR      rel_CDIR=$DRESULTS"/"$dir
1116      mkdir $CDIR      mkdir $rel_CDIR
1117      CDIR=`pwd`"/$CDIR"      CDIR=`pwd`"/$rel_CDIR"
1118            
1119      if test "x$CLEANUP" = xt ; then      if test "x$CLEANUP" = xt ; then
1120          makeclean $dir/$builddir          echo '====>>> this is to check that we never go through this part <<< ==='
1121            makeclean $dir/$builddir \
1122                && run_clean $dir/$rundir
1123      else      else
1124          genmakemodel $dir/$builddir && genmake=Y \          genmakemodel $dir/$builddir && genmake=Y \
1125              && makeclean $dir/$builddir \              && makeclean $dir/$builddir \
1126                && run_clean $dir/$rundir \
1127                && symlink_mpifiles $dir $code_dir $builddir \
1128              && makedependmodel $dir/$builddir && makedepend=Y \              && makedependmodel $dir/$builddir && makedepend=Y \
1129              && makemodel $dir/$builddir && make=Y \              && makemodel $dir/$builddir && make=Y \
1130              && linkdata $seperatebuilddir $dir/$rundir \              && linkdata $dir/$rundir $input_dirs \
1131              && runmodel $dir/$builddir && run=Y \              && runmodel $dir/$rundir && run=Y \
1132              && results=`testoutput $dir $rundir`              && results=`testoutput $dir $rundir "txt"`
1133      fi      fi
1134            
1135      echo      echo
1136      formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} \      if test "x$ADM" = x ; then
1137          ${run:-N} $results          fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1138      echo          echo
1139      formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} \          echo "$fres" >> $SUMMARY
1140          ${run:-N} $results >> $SUMMARY          echo "fresults='$fres'" > $CDIR"/summary.txt"
1141      echo "fresults='" > $CDIR"/summary.txt"          echo "MACH='$MACH'" >> $CDIR"/summary.txt"
1142      formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} \          echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"
1143          ${run:-N} $results >> $CDIR"/summary.txt"          echo "DATE='$DATE'" >> $CDIR"/summary.txt"
1144      echo "'" >> $CDIR"/summary.txt"          echo "tdir='$dir'" >> $CDIR"/summary.txt"
1145      echo "MACH='$MACH'" >> $CDIR"/summary.txt"  
1146      echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"          for ex in $extra_runs ; do
1147      echo "DATE='$DATE'" >> $CDIR"/summary.txt"              unset run
1148      echo "tdir='$dir'" >> $CDIR"/summary.txt"              results='-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --'
1149                #  Create an output dir for each OPTFILE/tdir.ex combination
1150                rel_CDIR=$DRESULTS"/"$dir"."$ex
1151                mkdir $rel_CDIR
1152                CDIR=`pwd`"/$rel_CDIR"
1153                test ! -e "$dir/tr_run.$ex" && mkdir "$dir/tr_run.$ex"
1154                run_clean $dir/tr_run.$ex
1155                linkdata $dir/tr_run.$ex input.$ex input
1156                runmodel $dir/tr_run.$ex && run=Y \
1157                    && results=`testoutput $dir tr_run.$ex ${ex}".txt"`
1158                fres=`printf '%s %s %s %s' ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N}`
1159                fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1160                fres="$fres.$ex"
1161                echo
1162                echo "$fres" >> $SUMMARY
1163                echo "fresults='$fres'" > $CDIR"/summary.txt"
1164                echo "MACH='$MACH'" >> $CDIR"/summary.txt"
1165                echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"
1166                echo "DATE='$DATE'" >> $CDIR"/summary.txt"
1167                echo "tdir='$dir.$ex'" >> $CDIR"/summary.txt"
1168                if test "x$POSTCLEAN" = xt ; then
1169                    run_clean $dir/tr_run.$ex
1170                fi
1171            done
1172        else
1173            fres=`printf '%s %s %s %s' ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N}`
1174            fres=$fres"$results   $dir"
1175            echo
1176            echo "$fres" >> $SUMMARY
1177            echo "fresults='$fres'" > $CDIR"/summary.txt"
1178            echo "MACH='$MACH'" >> $CDIR"/summary.txt"
1179            echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"
1180            echo "DATE='$DATE'" >> $CDIR"/summary.txt"
1181            echo "tdir='$dir'" >> $CDIR"/summary.txt"
1182            grep -A3 'Seconds in section "ALL' $dir/$rundir/$OUTPUTFILE \
1183                               >> $CDIR"/summary.txt"
1184        fi
1185    
1186        #postclean $dir/$builddir
1187        if test "x$POSTCLEAN" = xt ; then
1188            makeclean $dir/$builddir \
1189                && run_clean $dir/$rundir
1190        fi
1191            
1192      (      echo "-------------------------------------------------------------------------------"
         cd $DRESULTS  
         tar -cf $NDIR".tar" $DRESULTS"_"$NDIR > /dev/null 2>&1  
         gzip $NDIR".tar"  
     )  
1193            
1194      if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then  done
1195          echo "No mail sent"  
1196      else  printf "Start time:  " >> $SUMMARY
1197          $MPACK -s MITgcm-test -m 1000000 $DRESULTS"/"$NDIR".tar.gz" $ADDRESSES  echo $start_date >> $SUMMARY
1198    printf "End time:    " >> $SUMMARY
1199    date >> $SUMMARY
1200    
1201    #  If addresses were supplied and mpack built successfully, then try
1202    #  to send email using mpack.
1203    if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then
1204        echo "No results email was sent."
1205    else
1206        if test "x$HAVE_MPACK" = xt ; then
1207            tar -cf $DRESULTS".tar" $DRESULTS > /dev/null 2>&1 \
1208                && gzip $DRESULTS".tar" \
1209                && $MPACK -s MITgcm-test -m 3555000 $DRESULTS".tar.gz" $ADDRESSES
1210          RETVAL=$?          RETVAL=$?
1211          if test "x$RETVAL" != x0 ; then          if test "x$RETVAL" != x0 ; then
1212              echo "Warning: \"$MPACK\" failed -- please contact <edhill@mitgcm.org>"              echo
1213                echo "Warning: The tar, gzip, & mpack step failed.  Please send email"
1214                echo "  to <MITgcm-support@mitgcm.org> for help.  You may copy the "
1215                echo "  summary of results from the directory \"$DRESULTS\"."
1216                echo
1217          else          else
1218              rm -f $DRESULTS"/"$NDIR".tar*"              echo
1219                echo "An email containing results was sent to the following addresses:"
1220                echo "  \"$ADDRESSES\""
1221                echo
1222          fi          fi
1223            test -f $DRESULTS".tar"  &&  rm -f $DRESULTS".tar"
1224            test -f $DRESULTS".tar.gz"  &&  rm -f $DRESULTS".tar.gz"
1225      fi      fi
1226    fi
1227    
1228      echo "-------------------------------------------------------------------------------"  # rm -f tmp_cmpnum.f a.out
1229        rm -f tmp_cmpnum.c tmp_cmpnum
     NDIR=$(( $NDIR + 1 ))  
       
 done  
1230    
1231  rm tmp_cmpnum.f a.out  if test "x$CLEANUP" != xt ; then
1232        cat $SUMMARY | sed 's/ -- -- -- --//g'
1233        if test -e tr_out.txt ; then
1234            mv tr_out.txt tr_out.txt.old
1235        fi
1236        cat $SUMMARY | sed 's/ -- -- -- --//g' > tr_out.txt
1237    fi
1238    
1239  cat $SUMMARY  if test "x$DELDIR" = xt ; then
1240        rm -rf $DRESULTS
1241    fi
1242    

Legend:
Removed from v.1.9.2.8  
changed lines
  Added in v.1.90

  ViewVC Help
Powered by ViewVC 1.1.22