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

Legend:
Removed from v.1.11  
changed lines
  Added in v.1.89

  ViewVC Help
Powered by ViewVC 1.1.22