/[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.7 by edhill, Wed Sep 10 04:02:39 2003 UTC revision 1.81 by jmc, Thu Jun 15 20:31:09 2006 UTC
# Line 1  Line 1 
1  #!/bin/bash  #! /usr/bin/env bash
2  #  #
3  #  $Header$  #  $Header$
4    #  $Name$
5  #  #
6    
7  usage()  usage()
# Line 11  usage() Line 12  usage()
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 "  (-mpi)                   use MPI input files"
15        echo "  (-ieee|-noieee)          if possible, use IEEE compiler flags"
16        echo "                             (DEF=\"-ieee\")"
17      echo "  (-optfile=|-of=)STRING   list of optfiles to use"      echo "  (-optfile=|-of=)STRING   list of optfiles to use"
18      echo "  (-a|-addr)STRING         list of email recipients"      echo "  (-a|-addr) STRING        list of email recipients"
19      echo "                             (DEF=\"edhill@mitgcm.org\")"      echo "                             (DEF=\"edhill@mitgcm.org\")"
20      echo "  (-t|-tdir)STRING         list of test dirs to use"      echo "  (-t|-tdir) STRING        list of test dirs to use"
21      echo "                             (DEF=\"\" which builds all)"      echo "                             (DEF=\"\" which builds all)"
22      echo "  (-b|-bash)STRING         location of \"bash\" executable"      echo "  (-b|-bash) STRING        preferred location of a \"bash\" or"
23      echo "                             (DEF=\"\" for \"/bin/bash\")"      echo "                             Bourne-compatible \"sh\" shell"
24      echo "  (-c|-command)STRING      command to run"      echo "                             (DEF=\"\" for \"bash\")"
25        echo "  (-adm|-ad)               perform an adjoint run"
26        echo "  (-command) STRING        command to run"
27      echo "                             (DEF=\"make output.txt\")"      echo "                             (DEF=\"make output.txt\")"
28        echo "  (-m|-make) STRING        command to use for \"make\""
29        echo "                             (DEF=\"make\")"
30        echo "  (-odir) STRING           used to build output directory name"
31        echo "                             (DEF=\"hostname\")"
32        echo "  (-ptracers|-ptr) STRING  specify which ptracers to test"
33        echo "                             (DEF=\"1 2 3 4 5\")"
34        echo "  (-j) JOBS                use \"make -j JOBS\" for parallel builds"
35        echo "  (-clean)                 *ONLY* run \"make CLEAN\""
36        echo "  (-quick|-q)              same as \"-nogenmake -noclean -nodepend\""
37        echo "  (-nogenmake|-ng)         skip the genmake stage"
38        echo "  (-noclean|-nc)           skip the \"make clean\" stage"
39        echo "  (-nodepend|-nd)          skip the \"make depend\" stage"
40        echo "  (-deldir|-dd)            on success, delete the output directory"
41      echo      echo
42      echo "and where STRING follows a whitespace-delimited format"      echo "and where STRING can be a whitespace-delimited list"
43      echo "such as:"      echo "such as:"
44        echo
45      echo "  -t 'exp0 exp2 exp3' "      echo "  -t 'exp0 exp2 exp3' "
46      echo "  -addr='abc@123.com testing@home.org'"      echo "  -addr='abc@123.com testing@home.org'"
47      echo      echo
48        echo "provided that the expression is properly quoted within the current"
49        echo "shell (note the use of single quotes to protect white space)."
50        echo
51      exit 1      exit 1
52  }  }
53    
54  #  build the mpack utility  #  build the mpack utility
55  build_mpack()  build_mpack()
56  {  {
57      echo -n "building the mpack utility...  "      printf "building the mpack utility...  "
58      if test ! -x "$MPACKDIR/mpack" ; then      if test ! -x "$MPACKDIR/mpack" ; then
59          if test ! -d $MPACKDIR ; then          if test ! -d $MPACKDIR ; then
60                echo
61              echo "Error: can't find \"$MPACKDIR\""              echo "Error: can't find \"$MPACKDIR\""
62              echo "  are you sure this program is being run in the correct "              echo "  are you sure this program is being run in the correct "
63              echo "  (that is, \"MITGCM_ROOT\verification\") directory?"              echo "  (that is, \"MITGCM_ROOT\verification\") directory?"
64              exit 1              echo
65                HAVE_MPACK=f
66          fi          fi
67          echo -n "building mpack...  "          printf "building mpack...  "
68          ( cd $MPACKDIR && ./configure && make ) > build_mpack.out 2>&1          if test "x$CC" = x ; then
69                export CC=cc
70            fi
71            ( cd $MPACKDIR && ./configure && $MAKE ) > tr_build_mpack.out 2>&1
72          RETVAL=$?          RETVAL=$?
73          if test "x$RETVAL" != x0 ; then          if test "x$RETVAL" != x0 ; then
74              echo              echo
75              echo "Error building the mpack tools at: $MPACK_DIR"              echo "Error building the mpack tools at: $MPACK_DIR"
76              exit 1              echo
77                HAVE_MPACK=f
78            else
79                rm -f tr_build_mpack.out
80                HAVE_MPACK=t
81          fi          fi
82        else
83            HAVE_MPACK=t
84      fi      fi
85      echo "OK"      echo "OK"
86  }  }
87    
 compare_lines()  
 {  
     # use codelet to compare lines  
     if [ $verbose -gt 1 ]; then  
         cat tmp3.txt 1>&2  
     fi  
     return `./a.out < tmp3.txt`  
 }  
   
88  testoutput_for_prop()  testoutput_for_prop()
89  {  {
90      # testoutput_for_prop dir s1 label subdir      # testoutput_for_prop dir s1 label subdir extension
91      #      #
92      #  compares files in $dir/$subdir/output.txt and $dir/results/output.txt      #  compares files in $dir/$subdir/output.txt and $dir/results/output.txt
93      #  using search strings s1 and text label      #  using search strings s1 and text label
# Line 72  testoutput_for_prop() Line 96  testoutput_for_prop()
96          echo testoutput_for_prop: grep "$2" $1/$4/output.txt 1>&2          echo testoutput_for_prop: grep "$2" $1/$4/output.txt 1>&2
97      fi      fi
98      if [ -r $1/$4/output.txt ]; then      if [ -r $1/$4/output.txt ]; then
99          grep "$2" $1/$4/output.txt | sed 's/.*=//' | nl > tmp1.txt          grep "$2" $1/$4/output.txt | sed 's/.*=//' | cat -n > tmp1.txt
100          lncnt=`wc -l tmp1.txt | awk '{print $1}' `          lncntA=`wc -l tmp1.txt | awk '{print $1}' `
101          if [ $lncnt -lt 3 ]; then          if [ $lncntA -lt 3 ]; then
102              if [ $verbose -gt 0 ]; then              if [ $verbose -gt 0 ]; then
103                  echo Not enough lines of output when searching for "$2" 1>&2                  echo Not enough lines of output when searching for "$2" 1>&2
104              fi              fi
# Line 85  testoutput_for_prop() Line 109  testoutput_for_prop()
109          return 99          return 99
110      fi      fi
111      if [ $debug -gt 0 ]; then      if [ $debug -gt 0 ]; then
112          echo testoutput_for_prop: grep "$2" $1/results/output.txt 1>&2          echo testoutput_for_prop: grep "$2" $1/results/output.txt$5 1>&2
113      fi      fi
114      grep "$2" $1/results/output.txt | sed 's/.*=//' | nl > tmp2.txt      grep "$2" $1/results/output.txt$5 | sed 's/.*=//' | cat -n > tmp2.txt
115      lncnt=`wc -l tmp2.txt | awk '{print $1}' `      lncntB=`wc -l tmp2.txt | awk '{print $1}' `
116      if [ $lncnt -lt 3 ]; then      if [ $lncntB -lt 3 ]; then
117          if [ $verbose -gt 0 ]; then          if [ $verbose -gt 0 ]; then
118              echo Not enough lines of output when searching for "$2" 1>&2              echo Not enough lines of output when searching for "$2" 1>&2
119          fi          fi
120          return 99          return 99
121      fi      fi
122        if [ $lncntA -ne $lncntB ]; then
123            if [ $verbose -gt 0 ]; then
124                echo Not same Nb of lines when searching for "$2" ":" $lncntA $lncntB 1>&2
125            fi
126            return 99
127        fi
128        has_nan=`cat tmp1.txt | grep -i nan | wc -l`
129        if [ $has_nan -gt 0  ] ; then
130            echo testoutput_for_prop: output.txt contains $has_nan NaN values  1>&2
131            return 99
132        fi
133        has_inf=`cat tmp1.txt | grep -i inf | wc -l`
134        if [ $has_inf -gt 0  ] ; then
135            echo testoutput_for_prop: output.txt contains $has_inf Inf values  1>&2
136            return 99
137        fi
138      if [ $debug -gt 0 ]; then      if [ $debug -gt 0 ]; then
139          echo testoutput_for_prop: join tmp1.txt tmp2.txt 1>&2          echo testoutput_for_prop: join tmp1.txt tmp2.txt 1>&2
140      fi      fi
# Line 102  testoutput_for_prop() Line 142  testoutput_for_prop()
142      if [ $debug -gt 0 ]; then      if [ $debug -gt 0 ]; then
143          echo testoutput_for_prop: compare_lines 1>&2          echo testoutput_for_prop: compare_lines 1>&2
144      fi      fi
145      compare_lines      if [ $verbose -gt 1 ]; then
146      digits_of_similarity=$?          cat tmp3.txt 1>&2
147        fi
148        echo "-1" >> tmp3.txt
149        # On the SGI O3K (*not* the O2K), "cat -n" inserts a ":" after the line number
150        cat tmp3.txt | sed -e 's|:||g' > tmp4.txt
151        digits_of_similarity=`./tmp_cmpnum < tmp4.txt`
152      if [ $digits_of_similarity -eq 99 ]; then      if [ $digits_of_similarity -eq 99 ]; then
153          if [ $verbose -gt 0 ]; then          if [ $verbose -gt 0 ]; then
154              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 114  testoutput_for_prop() Line 159  testoutput_for_prop()
159              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
160          fi          fi
161      fi      fi
162      rm tmp1.txt tmp2.txt tmp3.txt      rm -f tmp1.txt tmp2.txt tmp3.txt tmp4.txt
163            
164      return $digits_of_similarity      return $digits_of_similarity
165  }  }
# Line 134  dashnum() Line 179  dashnum()
179      done      done
180  }  }
181    
182    testoutput_ad()
183    {
184        grep $3 $1/results_ad/output_adm.txt | awk '{print NR " " $5}' > t05.txt
185        grep $3 $1/$2/output_adm.txt | awk '{print NR " " $5}' > t15.txt
186        grep $3 $1/results_ad/output_adm.txt | awk '{print NR " " $6}' > t06.txt
187        grep $3 $1/$2/output_adm.txt | awk '{print NR " " $6}' > t16.txt
188        join t05.txt t15.txt > t5.txt
189        join t06.txt t16.txt > t6.txt
190        echo "-1" >> t5.txt
191        echo "-1" >> t6.txt
192        digits_5=`./tmp_cmpnum < t5.txt`
193        digits_6=`./tmp_cmpnum < t6.txt`
194        dashnum $digits_5 $digits_6
195        rm -f t[01][56].txt t[56].txt
196    }
197    
198    check_for_add_mon_output()
199    {
200        # Check for additional types of monitor output
201        if test "x$1" = x ; then
202            return
203        fi
204    
205        for ii in $PTRACERS_NUM ; do
206            eval "HAVE_PTR0"$ii"=f"
207        done
208    
209        ptr_add="trcstat_ptracerXX_min trcstat_ptracerXX_max"
210        ptr_add="$ptr_add trcstat_ptracerXX_mean trcstat_ptracerXX_sd"
211        for ii in $PTRACERS_NUM ; do
212            for jj in $ptr_add ; do
213                name=`eval "echo $jj | sed -e 's|XX|0"$ii"|g'"`
214                tst=`grep $name $1 | wc -l | awk '{print $1}'`
215                if test ! "x$tst" = x0 ; then
216                    eval "HAVE_PTR0"$ii"=t"
217                fi
218            done
219            #  eval 'echo "HAVE_PTR0'$ii' = $HAVE_PTR0'$ii'"'
220        done
221    }
222    
223  testoutput()  testoutput()
224  {  {
225      # testoutput diretory subdir      # testoutput directory subdir extension
226      #      #
227      #  test output in "directory"      #  test output in "directory"
228        if test "x$ADM" = x ; then
229            if [ $debug -gt 0 ]; then
230                echo testoutput: testoutput_for_prop $1 cg2d_init_res 1>&2
231            fi
232            testoutput_for_prop $1 "cg2d_init_res" "cg2d init. residual" $2 $3; cg2dres=$?
233            if [ $debug -gt 0 ]; then
234                echo testoutput: cg2dres=$cg2dres 1>&2
235            fi
236            testoutput_for_prop $1 "dynstat_theta_min" "theta minimum" $2 $3; tmin=$?
237            testoutput_for_prop $1 "dynstat_theta_max" "theta maximum" $2 $3; tmax=$?
238            testoutput_for_prop $1 "dynstat_theta_mean" "theta mean" $2 $3; tmean=$?
239            testoutput_for_prop $1 "dynstat_theta_sd" "theta s.d." $2 $3; tsd=$?
240            testoutput_for_prop $1 "dynstat_salt_min" "salt minimum" $2 $3; smin=$?
241            testoutput_for_prop $1 "dynstat_salt_max" "salt maximum" $2 $3; smax=$?
242            testoutput_for_prop $1 "dynstat_salt_mean" "salt mean" $2 $3; smean=$?
243            testoutput_for_prop $1 "dynstat_salt_sd" "salt s.d." $2 $3; ssd=$?
244            testoutput_for_prop $1 "dynstat_uvel_min" "U minimum" $2 $3; umin=$?
245            testoutput_for_prop $1 "dynstat_uvel_max" "U maximum" $2 $3; umax=$?
246            testoutput_for_prop $1 "dynstat_uvel_mean" "U mean" $2 $3; umean=$?
247            testoutput_for_prop $1 "dynstat_uvel_sd" "U s.d." $2 $3; usd=$?
248            testoutput_for_prop $1 "dynstat_vvel_min" "V minimum" $2 $3; vmin=$?
249            testoutput_for_prop $1 "dynstat_vvel_max" "V maximum" $2 $3; vmax=$?
250            testoutput_for_prop $1 "dynstat_vvel_mean" "V mean" $2 $3; vmean=$?
251            testoutput_for_prop $1 "dynstat_vvel_sd" "V s.d." $2 $3; vsd=$?
252    
253            #  This is for PTRACERS
254            for ii in $PTRACERS_NUM ; do
255                eval `echo "p0"$ii"_min=99"`
256                eval `echo "p0"$ii"_max=99"`
257                eval `echo "p0"$ii"_mean=99"`
258                eval `echo "p0"$ii"_sd=99"`
259                tst=`eval 'echo "$HAVE_PTR0'$ii'"'`
260                #echo 'tst = '$tst
261                if test "x$tst" = xt ; then
262                    a="trcstat_ptracer0"
263                    testoutput_for_prop $1 "$a"$ii"_min"  "p0"$ii"_min"  $2 $3
264                    RETVAL=$? ; eval `echo "p0"$ii"_min="$RETVAL`
265                    testoutput_for_prop $1 "$a"$ii"_max"  "p0"$ii"_max"  $2 $3
266                    RETVAL=$? ; eval `echo "p0"$ii"_max="$RETVAL`
267                    testoutput_for_prop $1 "$a"$ii"_mean" "p0"$ii"_mean" $2 $3
268                    RETVAL=$? ; eval `echo "p0"$ii"_mean="$RETVAL`
269                    testoutput_for_prop $1 "$a"$ii"_sd"   "p0"$ii"_sd"   $2 $3
270                    RETVAL=$? ; eval `echo "p0"$ii"_sd="$RETVAL`
271                fi
272            done
273    
274      if [ $debug -gt 0 ]; then          allargs="$cg2dres $tmin $tmax $tmean $tsd $smin $smax $smean $ssd"
275          echo testoutput: testoutput_for_prop $1 cg2d_init_res 1>&2          allargs="$allargs $umin $umax $umean $usd $vmin $vmax $vmean $vsd"
276      fi          allargs="$allargs $p01_min $p01_max $p01_mean $p01_sd"
277      testoutput_for_prop $1 "cg2d_init_res" "cg2d init. residual" $2; cg2dres=$?          allargs="$allargs $p02_min $p02_max $p02_mean $p02_sd"
278      if [ $debug -gt 0 ]; then          allargs="$allargs $p03_min $p03_max $p03_mean $p03_sd"
279          echo testoutput: cg2dres=$cg2dres 1>&2          allargs="$allargs $p04_min $p04_max $p04_mean $p04_sd"
280            allargs="$allargs $p05_min $p05_max $p05_mean $p05_sd"
281    
282            eval "dashnum $allargs"
283    
284        else
285            testoutput_ad $1 $2 "precision_grdchk_result"
286      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  
287  }  }
288    
289  genmakemodel()  genmakemodel()
290  {  {
291      # genmakemodel directory      # genmakemodel directory
292      GENMAKE2="$BASH ../../../tools/genmake2"      if test "x$NOGENMAKE" = xt ; then
293      (          echo "genmake skipped!"
294          cd $1;      else
295          printf 'genmake ... ' 1>&2          if test "x$BASH" = x ; then
296          # ../../../tools/genmake -ieee -mods=../code > make.log 2>&1              GENMAKE2="../../../tools/genmake2"
         $GENMAKE2  -ds --mods=../code "--optfile="$OPTFILE > make.log 2>&1  
         RETVAL=$?  
         for i in gm_state gm_optfile gm_local Makefile ; do  
             if test -r $i ; then  
                 cp $i $CDIR  
             fi  
         done  
         if test "x$RETVAL" != x0 ; then  
             tail make.log  
             echo "genmakemodel: genmake failed" 1>&2  
             cp make.log $CDIR  
             return 1  
297          else          else
298              echo "succesful" 1>&2              GENMAKE2="$BASH ../../../tools/genmake2 -bash $BASH"
299          fi          fi
300      )          (
301                cd $1;
302                command="$GENMAKE2  -ds -m $MAKE"
303                if test "x$ADM" = x ; then
304                    command="$command --mods=../code"
305                else
306                    command="$command --mods=../code_ad"
307                fi
308                if test "x$OPTFILE" != xNONE ; then
309                    command="$command --optfile=$OPTFILE"
310                fi
311                if test "x$IEEE" != x ; then
312                    command="$command -ieee"
313                fi
314                if test "x$MPI" = xt ; then
315                    command="$command -mpi"
316                fi
317                printf 'genmake ... ' 1>&2
318                $command > make.log 2>&1
319                RETVAL=$?
320                #  Reduce the size of the testing emails!
321                head -100 Makefile > $CDIR/Makefile_head
322                if test "x$RETVAL" != x0 ; then
323                    tail make.log
324                    echo "genmakemodel: genmake failed" 1>&2
325                    cp genmake_* make.log $CDIR
326                    return 1
327                else
328                    echo "successful" 1>&2
329                fi
330            )
331        fi
332  }  }
333    
334  makeclean()  makeclean()
335  {  {
336      # makeclean directory      # makeclean directory
337      (      if test "x$NOCLEAN" = xt ; then
338          cd $1;          echo "make CLEAN skipped!"
339          if test -e output.txt ; then      else
340              rm -f output.txt          (
341          fi              cd $1;
342          printf 'make CLEAN ... ' 2>&1              if test -e output.txt ; then
343          if test -r Makefile ; then                  rm -f output.txt
             make CLEAN >> make.log 2>&1  
             RETVAL=$?  
             if test "x$RETVAL" != x0 ; then  
                 tail make.log  
                 echo "makeclean: \"make CLEAN\" failed" 1>&2  
                 cp make.log $CDIR"/make.log"  
                 return 1  
344              fi              fi
345          fi              printf 'make CLEAN ... ' 2>&1
346          echo succesful 1>&2              if test -r Makefile ; then
347          exit 0                  $MAKE CLEAN >> make.log 2>&1
348      )                  RETVAL=$?
349                    if test "x$RETVAL" != x0 ; then
350                        tail make.log
351                        echo "makeclean: \"make CLEAN\" failed" 1>&2
352                        cp make.log $CDIR"/make.log"
353                        return 1
354                    fi
355                fi
356                echo successful 1>&2
357                exit 0
358            )
359        fi
360    }
361    
362    postclean()
363    {
364        # postclean directory
365        if test "x$POSTCLEAN" = xt ; then
366            (
367                cd $1;
368                if test -r Makefile ; then
369                    $MAKE CLEAN >> /dev/null 2>&1
370                fi
371                exit 0
372            )
373        fi
374  }  }
375    
376  makedependmodel()  makedependmodel()
377  {  {
378      # makedependmodel directory      # makedependmodel directory
379      (      if test "x$NODEPEND" = xt ; then
380          cd $1;          echo "make depend skipped!"
381          printf 'make depend ... ' 1>&2      else
382          make depend >> make.log 2>&1          (
383          RETVAL=$?              cd $1;
384          if test "x$RETVAL" != x0 ; then              printf 'make depend ... ' 1>&2
385              tail make.log              $MAKE depend >> make.log 2>&1
386              echo "makedependmodel: make depend failed" 1>&2              RETVAL=$?
387              cp make.log $CDIR"/make.log"              if test "x$RETVAL" != x0 ; then
388              return 1                  tail make.log
389          else                  echo "makedependmodel: make depend failed" 1>&2
390              echo succesful 1>&2                  cp make.log $CDIR"/make.log"
391          fi                  return 1
392      )              else
393                    echo successful 1>&2
394                fi
395            )
396        fi
397  }  }
398    
399  makemodel()  makemodel()
# Line 245  makemodel() Line 403  makemodel()
403          cd $1;          cd $1;
404          if test -r Makefile ; then          if test -r Makefile ; then
405              printf 'make ... ' 1>&2              printf 'make ... ' 1>&2
406              make >> make.log 2>&1              if test "x$ADM" = x ; then
407                    if test "x$JOBS" = x ; then
408                        $MAKE >> make.log 2>&1
409                    else
410                        $MAKE -j $JOBS >> make.log 2>&1
411                    fi
412                else
413                    $MAKE adall >> make.log 2>&1
414                fi
415              RETVAL=$?              RETVAL=$?
416              if test "x$RETVAL" != x0 ; then              if test "x$RETVAL" != x0 ; then
417                  tail make.log                  tail make.log
# Line 253  makemodel() Line 419  makemodel()
419                  cp make.log $CDIR"/make.log"                  cp make.log $CDIR"/make.log"
420                  return 1                  return 1
421              else              else
422                  echo succesful 1>&2                  echo successful 1>&2
423              fi              fi
424          fi          fi
425      )      )
426  }  }
427    
428    symlink_mpifiles()
429    {
430        # Put special links so that MPI specific files are used
431        # This MUST be invoked between makeclean and makelinks because
432        # the Makefile will link to non-mpi files by default
433    
434        dir=$1
435        code_dir=$2
436        BUILD_DIR=$dir/$3
437        CODE_DIR=$dir/$code_dir
438        
439        # These are files that should replace their counter-part when using -mpi
440        MPI_FILES=`(cd $CODE_DIR; find . -name "*_mpi")`
441    
442        #  Is this an MPI run?
443        if test "x$MPI" = xt ; then
444            # YES: We symbolically link these files to the build
445            # dir so long as there is no real file in place
446            for ii in $MPI_FILES ; do
447                i=`echo $ii | sed 's:^\./::'`
448                name=`echo $i | sed 's:_mpi::' `
449                cmp $CODE_DIR/$i $BUILD_DIR/$name > /dev/null 2>&1
450                RETVAL=$?
451                if test "x$RETVAL" != x0 ; then
452                    if ! test -f $BUILD_DIR/$i ; then
453                        #echo Linking $name to $i
454                        (cd $BUILD_DIR; ln -sf ../$code_dir/$i $name)
455                    fi
456                fi
457            done
458        else
459            # NO: We undo any _mpi symbolically linked files
460            for ii in $MPI_FILES ; do
461                i=`echo $ii | sed 's:^\./::'`
462                name=`echo $i | sed 's:_mpi::' `
463                if test -L $BUILD_DIR/$name ; then
464                    cmp $BUILD_DIR/$name "../$code_dir/$name"_mpi > /dev/null 2>&1
465                    RETVAL=$?
466                    if test "x$RETVAL" = x0 ; then
467                        #echo Un-linking $name from $linktarg
468                        rm -f $BUILD_DIR/$name
469                    fi
470                fi
471            done
472        fi
473        
474    }
475    
476  linkdata()  linkdata()
477  {  {
478      # linkdata flag      # linkdata flag
479      #      #
480      # symbolically link data files to run directory      # symbolically link data files to run directory
481      if [ $1 -ne 0 ]; then      if test "x$1" = x1 ; then
482          ( cd $2 ;  ln -sf ../input/* . )          (
483                cd $2
484                if test "x$ADM" = x ; then
485                    files=`( cd ../input ; ls -1 | grep -v CVS )`
486                    for i in $files ; do
487                        if test ! -d "../input/"$i -a ! -f $i ; then
488                            ln -sf "../input/"$i $i
489                        fi
490                    done
491                else
492                    files=`( cd ../input_ad ; ls -1 | grep -v CVS )`
493                    for i in $files ; do
494                        if test ! -d "../input_ad/"$i ; then
495                            ln -sf "../input_ad/"$i $i
496                        fi
497                    done
498                    files=`( cd ../input ; ls -1 | grep -v CVS )`
499                    for i in $files ; do
500                        if test ! -d "../input/"$i ; then
501                         if test ! -r $i  ; then
502                            ln -sf "../input/"$i $i
503                         fi
504                        fi
505                    done
506                fi
507            )
508      fi      fi
509  }  }
510    
# Line 273  runmodel() Line 512  runmodel()
512  {  {
513      # runmodel directory      # runmodel directory
514      #      #
515      #  runs "$COMMAND" in "directory"      #  runs "$COMMAND in "directory"
516      #  (where "$COMMAND" is relative to "directory")      #  (where "$COMMAND" is relative to "directory")
517      (      (
518          cd $1          cd $1
519          printf 'runmodel: ' 1>&2          printf 'runmodel in %s ...' $1 1>&2
520          # make output.txt          # make output.txt
521          $COMMAND          echo
522          RETVAL=$?          rm -f run.log
523            if test $OUTPUTFILE -ot $EXECUTABLE ; then
524               ( eval $COMMAND ) > run.log 2>&1
525               RETVAL=$?
526            else
527               echo " $OUTPUTFILE is up to date " > run.log 2>&1
528               RETVAL=0
529            fi
530            # echo "COMMAND='$COMMAND'"
531            # echo "pwd='"`pwd`"'"
532          if test "x$RETVAL" = x0 ; then          if test "x$RETVAL" = x0 ; then
533              cp output.txt $CDIR"/output.txt"              tail run.log
534                echo successful 1>&2
535                # === Reduce the size of the testing emails!
536                # if test "x$ADM" = x ; then
537                #   cp output.txt $CDIR"/output.txt"
538                # else
539                #   cp output_adm.txt $CDIR"/output_adm.txt"
540                # fi
541                if test -s STDERR.0000 ; then cp STDERR.0000 $CDIR"/STDERR.0000" ; fi
542              return 0              return 0
543          else          else
544                tail run.log
545                echo failed 1>&2
546                cp run.log $CDIR"/run.log"
547                if test -s STDERR.0000 ; then cp STDERR.0000 $CDIR"/STDERR.0000" ; fi
548              return 1              return 1
549          fi          fi
550      )      )
# Line 294  createcodelet() Line 554  createcodelet()
554  {  {
555      # create codelet for comparing model output      # create codelet for comparing model output
556    
557      echo -n "creating the comparison code...  "      printf "creating the comparison code...  "
558      cat > tmp_cmpnum.f <<EOFA      cat > tmp_cmpnum.c <<EOF
559        program cmpnum  #include <stdio.h>
560        implicit none  #include <math.h>
561        real*8 a,b,diff  int main( int argc, char** argv )  {
562        integer linnum,best    int linnum,best,lncnt;
563        best=-16    double a,b,abave,relerr;
564    99  read(*,*,end=70,err=60) linnum,a,b    best = -22;
565        diff=0.5*(abs(a)+abs(b))    lncnt = 0;
566  c     print *,a,b,diff,abs(a-b)/diff    while( 1 & (lncnt+=1) < 999 )  {
567        if (diff.gt.1.e-12) then      scanf("%d", &linnum);
568          diff=abs(a-b)/diff      if (linnum == -1)  break;
569          if (diff.gt.0.) then      scanf("%lf", &a);  scanf("%lf", &b);
570  c         print *,int(log10(diff)),diff      abave = 0.5*(fabs(a)+fabs(b));
571            linnum=int(log10(diff))      if (abave > 0.0) {
572            best=max(best,linnum)        relerr=fabs(a-b)/abave;
573          endif        if (relerr > 0.0) { linnum = (int)rint(log10(relerr)); }
574        else        else { linnum = -16 ; }
575          if (best.eq.-16.and.diff.ne.0.) best=-22        best = (best > linnum) ? best : linnum;
576        endif      }
577        goto 99    }
578    60  stop 'cmpnum: An error occured reading a,b'    if (lncnt == 999) best=-29;
579    70  print *,-best    printf("%d\n", -best);
580        end    return 0;
581  EOFA  }
582    EOF
583        $CC -o tmp_cmpnum tmp_cmpnum.c -lm
584    
585      f77 tmp_cmpnum.f      if [ -x ./tmp_cmpnum ]; then
     if [ -x ./a.out ]; then  
586          echo "OK"          echo "OK"
587          return 0          return 0
588      else      else
589          echo          echo
590          echo "createcodelet: failed to compile codelet"          echo "ERROR: failed to compile comparison code -- please specify"
591            echo "  a C compiler using the CC environment variable."
592          exit 1          exit 1
593      fi      fi
594  }  }
# Line 358  show_help() Line 620  show_help()
620  {  {
621      cat - << EOF      cat - << EOF
622  $0 [-help] [-quick] [-verbose] dir1 [dir2] [...]  $0 [-help] [-quick] [-verbose] dir1 [dir2] [...]
623   -help      Show this help message  
624   -quick     Skip "genmake" and "make depend" if the Makefile exists   -help|-h      Show this help message
625   -quiet     Reduce the amount of output   -quiet     Reduce the amount of output
626   -verbose   Produce copious amounts of output   -verbose   Produce copious amounts of output
627   -debug     Produce even more output which will mean nothing to most   -debug     Produce even more output which will mean nothing to most
628   -force     Do "make CLEAN" before compiling. This forces a complete rebuild.   -force     Do "make CLEAN" before compiling. This forces a complete rebuild.
629   -clean     Do "make CLEAN" after compiling and testing.   -clean     Do "make CLEAN" after compiling and testing.
  -noieee    By default, $0 uses the -ieee option for genmake. This turns it off.  
630   -cleanup   Aggresively removes all model output, executables and object files   -cleanup   Aggresively removes all model output, executables and object files
631              and then exits. Use with care.              and then exits. Use with care.
632    
# Line 376  EOF Line 637  EOF
637    
638  scandirs()  scandirs()
639  {  {
640      if [ $# -eq 0 ]; then      if [ $# -eq 1 ]; then
641          for arg in * ; do          for arg in * ; do
642              test -d $arg/input && echo $arg              test -d $arg/$1 && echo $arg
643          done          done
644      else      else
645          echo $*          echo $*
646      fi      fi
647  }  }
648    
649    
650  ###############################################################################  ###############################################################################
 ###############################################################################  
 ###############################################################################  
651    
652    
653  #  Default properties  #  Default properties
# Line 397  verbose=1 Line 656  verbose=1
656  clean=0  clean=0
657  expts=''  expts=''
658  # ieee=1  # ieee=1
659  # quick=0  
660    IEEE=true
661    if test "x$MITGCM_IEEE" != x ; then
662        IEEE=$MITGCM_IEEE
663    fi
664    
665    
666    CLEANUP=f
667    QUICK=f
668    NOGENMAKE=f
669    NOCLEAN=f
670    NODEPEND=f
671    POSTCLEAN=f
672    
673  BASH=  BASH=
674  OPTFILES=  OPTFILE=NONE
675  ADDRESSES=edhill@mitgcm.org  ADDRESSES=
676  TESTDIRS=  TESTDIRS=
677  MPACKDIR="../tools/mpack-1.6"  MPACKDIR="../tools/mpack-1.6"
678    HAVE_MPACK=
679  MPACK="$MPACKDIR/mpack"  MPACK="$MPACKDIR/mpack"
680  COMMAND="make output.txt"  COMMAND=
681    if test "x$MAKE" = x ; then
682        MAKE=make
683    fi
684    if test "x$CC" = x ; then
685        CC=cc
686    fi
687    JOBS=
688  MPI=f  MPI=f
689    OUTDIR=
690    DELDIR=
691    
692    ADM=
693    
694  echo -n "parsing options...  "  # Additional monitor types
695    PTRACERS_NUM="1 2 3 4 5"
696    
697    printf "parsing options...  "
698    
699  ac_prev=  ac_prev=
700  for ac_option ; do  for ac_option ; do
# Line 428  for ac_option ; do Line 714  for ac_option ; do
714              usage ;;              usage ;;
715                    
716          -optfile | --optfile | -of | --of)          -optfile | --optfile | -of | --of)
717              ac_prev=OPTFILES ;;              ac_prev=OPTFILE ;;
718          -optfile=* | --optfile=* | -of=* | --of=*)          -optfile=* | --optfile=* | -of=* | --of=*)
719              OPTFILES=$ac_optarg ;;              OPTFILE=$ac_optarg ;;
720                    
721          -addr | --addr | -a | --a)          -addr | --addr | -a | --a)
722              ac_prev=ADDRESSES ;;              ac_prev=ADDRESSES ;;
# Line 452  for ac_option ; do Line 738  for ac_option ; do
738          -command=* | --command=*)          -command=* | --command=*)
739              COMMAND=$ac_optarg ;;              COMMAND=$ac_optarg ;;
740    
741            -make | --make | -m | --m)
742                ac_prev=MAKE ;;
743            -make=* | --make=*)
744                MAKE=$ac_optarg ;;
745    
746            -odir | --odir)
747                ac_prev=OUTDIR ;;
748            -odir=* | --odir=*)
749                OUTDIR=$ac_optarg ;;
750    
751            -ptracers | --ptracers | -ptr | --ptr)
752                ac_prev=PTRACERS_NUM ;;
753            -ptracers=* | --ptracers=* | -ptr=* | --ptr=*)
754                PTRACERS_NUM=$ac_optarg ;;
755    
756            -j) ac_prev=JOBS ;;
757            -j=*) JOBS=$ac_optarg ;;
758    
759            -clean | --clean)
760                CLEANUP=t ; DELDIR=t ;;
761    
762            -quick | --quick | -q | --q)
763                QUICK=t ;;
764            -nogenmake | --nogenmake | -ng | --ng)
765                NOGENMAKE=t ;;
766            -noclean | --noclean | -nc | --nc)
767                NOCLEAN=t ;;
768            -nodepend | --nodepend | -nd | --nd)
769                NODEPEND=t ;;
770    
771            -postclean | --postclean | -pc | --pc)
772                POSTCLEAN=t ;;
773    
774          -mpi) MPI=t ;;          -mpi) MPI=t ;;
775    
776            -adm | -ad) ADM=t ;;
777    
778            -ieee) IEEE=true ;;
779            -noieee) IEEE= ;;
780    
781          -verbose) verbose=2 ;;          -verbose) verbose=2 ;;
782          -debug) debug=1 ;;          -debug) debug=1 ;;
         -clean) clean=1 ;;  
783          -quiet) verbose=0 ;;          -quiet) verbose=0 ;;
784    
785            -deldir | -dd) DELDIR=t ;;
786    
787          -*)          -*)
788              echo "Error: unrecognized option: "$ac_option              echo "Error: unrecognized option: "$ac_option
789              usage              usage
# Line 472  for ac_option ; do Line 798  for ac_option ; do
798            
799  done  done
800    
801    if test "x$QUICK" = xt ; then
802        NOGENMAKE=t
803        NOCLEAN=t
804        NODEPEND=t
805    fi
806    
807  if test "x$TESTDIRS" = x ; then  if test "x$TESTDIRS" = x ; then
808      TESTDIRS=`scandirs`      if test "x$ADM" = xt ; then
809            TESTDIRS=`scandirs results_ad`
810        else
811            TESTDIRS=`scandirs results`
812        fi
813    fi
814    
815    if test "x$OPTFILE" = xNONE -a "x$MITGCM_OF" != x ; then
816        OPTFILE=$MITGCM_OF
817    fi
818    
819    if test "x$ADM" = xt ; then
820        EXECUTABLE="mitgcmuv_ad"
821        OUTPUTFILE="output_adm.txt"
822    else
823        EXECUTABLE="mitgcmuv"
824        OUTPUTFILE="output.txt"
825    fi
826    
827    if test "x$ADM" = xt -a "x$COMMAND" = x ; then
828        COMMAND="./$EXECUTABLE > $OUTPUTFILE"
829    fi
830    
831    if test "x$COMMAND" = x ; then
832        COMMAND="./$EXECUTABLE > $OUTPUTFILE"
833  fi  fi
834    
835  echo "OK"  #echo "OK"
836    echo "OK (COMMAND= $COMMAND )"
837    
838  #  create the FORTRAN comparison code  #  create the FORTRAN comparison code
839  createcodelet  createcodelet
840    
841  #  build the mpack utility  #  build the mpack utility
842  build_mpack  if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then
843        echo "skipping mpack build"
844    else
845        build_mpack
846    fi
847    
848  #  Create a uniquely named directory to store results  #  Create a uniquely named directory to store results
849  MACH=`hostname`  MACH=`hostname`
850  UNAMEA=`uname -a`  UNAMEA=`uname -a`
851  DATE=`date +%Y%m%d`  DATE=`date +%Y%m%d`
852  BASE=$MACH"_"$DATE"_"  BASE="tr_"$MACH"_"$DATE"_"
853    if test "x$OUTDIR" != x ; then
854        BASE="tr_"$OUTDIR"_"$DATE"_"
855    fi
856  DNUM=0  DNUM=0
857  DRESULTS="$BASE$DNUM"  DRESULTS="$BASE$DNUM"
858  while test -e $DRESULTS ; do  while test -e $DRESULTS ; do
# Line 498  done Line 862  done
862  mkdir $DRESULTS  mkdir $DRESULTS
863  RETVAL=$?  RETVAL=$?
864  if test "x$RETVAL" != x0 ; then  if test "x$RETVAL" != x0 ; then
865      echo "Error: can't create results directory \"./$DRESULTS\""      echo "ERROR: Can't create results directory \"./$DRESULTS\""
866      exit 1      exit 1
867  fi  fi
868  SUMMARY="$DRESULTS/summary.txt"  SUMMARY="$DRESULTS/summary.txt"
869  date > $SUMMARY  printf "Start time:  " >> $SUMMARY
870  cat << EOF >> $SUMMARY  start_date=`date`
871                  T           S           U           V  echo $start_date > $SUMMARY
872  G D M    c        m  s        m  s        m  s        m  s  
873  E p a R  g  m  m  e  .  m  m  e  .  m  m  e  .  m  m  e  .  of_path=
874  N n k u  2  i  a  a  d  i  a  a  d  i  a  a  d  i  a  a  d  if test "x$OPTFILE" != xNONE ; then
875  2 d e n  d  n  x  n  .  n  x  n  .  n  x  n  .  n  x  n  .      if test -r $OPTFILE ; then
876            # get the path
877            path=${OPTFILE%/*}
878            if test "x$path" = x ; then
879                of_path=`pwd`
880            else
881                of_path=`( cd $path > /dev/null 2>&1 ; pwd )`
882            fi
883            file=${OPTFILE##*/}
884            OPTFILE=$of_path/$file
885            cp $OPTFILE $DRESULTS
886            echo >> $SUMMARY
887            echo "  OPTFILE=$OPTFILE" >> $SUMMARY
888        else
889            echo | tee $SUMMARY
890            echo "ERROR: can't read OPTFILE=\"$OPTFILE\"" | tee $SUMMARY
891            exit 1
892        fi
893    else
894        echo >> $SUMMARY
895        echo "No \"OPTFILE\" was explicitly specified by testreport," >> $SUMMARY
896        echo "   so the genmake default will be used." >> $SUMMARY
897    fi
898    echo
899    echo >> $SUMMARY
900    if test "x$ADM" = x ; then
901        line_0="            ----T-----  ----S-----  ----U-----  ----V-----"
902        line_1="G D M    c        m  s        m  s        m  s        m  s"
903        line_2="E p a R  g  m  m  e  .  m  m  e  .  m  m  e  .  m  m  e  ."
904        line_3="N n k u  2  i  a  a  d  i  a  a  d  i  a  a  d  i  a  a  d"
905        line_4="2 d e n  d  n  x  n  .  n  x  n  .  n  x  n  .  n  x  n  ."
906        for ii in $PTRACERS_NUM ; do
907            #  tst=`eval 'echo $HAVE_PTR0'$ii`
908            #  if test "x$tst" = xt ; then
909            line_0="$line_0  --PTR 0"$ii"--"
910            line_1="$line_1        m  s"
911            line_2="$line_2  m  m  e  ."
912            line_3="$line_3  i  a  a  d"
913            line_4="$line_4  n  x  n  ."
914            #  fi
915        done
916        echo "$line_0" | tee -a $SUMMARY
917        echo "$line_1" | tee -a $SUMMARY
918        echo "$line_2" | tee -a $SUMMARY
919        echo "$line_3" | tee -a $SUMMARY
920        echo "$line_4" | tee -a $SUMMARY
921        echo " "       | tee -a $SUMMARY
922    else
923        echo "ADJOINT=true" >> $SUMMARY
924        echo >> $SUMMARY
925        cat << EOF | tee -a $SUMMARY
926    G D M    C  G
927    E p a R  o  r
928    N n k u  s  a
929    2 d e n  t  d
930    
931  EOF  EOF
932    fi
933    
934  NDIR=0  #  ...and each test directory...
935    for dir in $TESTDIRS ; do
936        
937        #  Cleanup only!
938        if test "x$CLEANUP" = xt ; then
939            if test -r $dir/build/Makefile ; then
940                ( cd $dir/build ; make CLEAN )
941            fi
942            if test -r $dir/input/Makefile ; then
943                ( cd $dir/input ; make CLEAN )
944            fi
945            (
946                cd $dir
947                rm -rf tr_run.*
948            )
949            continue
950        fi
951    
952  #  For each optfile...      #  Verify that the testdir exists and contains previous
953  for OPTFILE in $OPTFILES ; do      #  results in the correct location--or skip this directory!
954        fout=
955        if test "x$ADM" = x ; then
956            fout=$dir"/results/output.txt"
957        else
958            fout=$dir"/results_ad/output_adm.txt"
959        fi
960        if test ! -r $fout ; then
961            echo "can't read \"$fout\" -- skipping $dir"
962            continue
963        fi
964        if test "x$ADM" = x ; then
965            check_for_add_mon_output  $fout
966        fi
967    
968      OPTFILE=`pwd`"/$OPTFILE"      # Check for additional types of monitor output
969      if test ! -r $OPTFILE ; then  
970          echo "Error: can't read optfile \"$OPTFILE\""      builddir="input"
971          exit 1      rundir="input"
972        use_seperate_build=0
973        if test -d $dir/build -a -r $dir/build ; then
974            builddir="build"
975            rundir="build"
976            use_seperate_build=1
977            linkdata $use_seperate_build $dir/$rundir
978      fi      fi
     echo  
     echo "OPTFILE=$OPTFILE" >> $SUMMARY  
     echo >> $SUMMARY  
979            
980      #  ...and each test directory...      #  Check whether there are "extra runs" for this testdir
981      for dir in $TESTDIRS ; do      extra_runs=
982        if test "x$ADM" = x -a "x$use_seperate_build" = x1 ; then
983          #  Verify that the testdir exists and contains previous          ex_run_dirs=`( cd $dir ; echo input.* )`
984          #  results in the correct location--or skip this directory!          echo "ex_run_dirs='$ex_run_dirs'"
985          if test ! -r $dir"/results/output.txt" ; then          for exd in $ex_run_dirs ; do
986              echo | tee -a $SUMMARY              name=`echo $exd | sed -e 's/input.//g'`
987              echo "can't read \"$dir/results/output.txt\" -- skipping $dir" \              outf="$dir/results/output.txt.$name"
988                  | tee -a $SUMMARY              if test -f $outf -a -r $outf ; then
989              continue                  extra_runs="$extra_runs $name"
         fi  
   
         #  Is this an MPI run?  
         if test "x$MPI" = xt ; then  
             if test ! -r $dir"/code/CPP_EEOPTIONS.h_mpi" -o ! -r $dir"/code/SIZE.h_mpi" ; then  
                 echo | tee -a $SUMMARY  
                 echo "can't read \"$dir/code/CPP_EEOPTIONS.h_mpi\" or \"$dir/code/SIZE.h_mpi\"" \  
                     | tee -a $SUMMARY  
                 continue  
             else  
                 cp $dir"/code/CPP_EEOPTIONS.h_mpi" $dir"/code/CPP_EEOPTIONS.h"  
                 cp $dir"/code/SIZE.h_mpi" $dir"/code/SIZE.h"  
             fi  
         else  
             if test -r $dir"/code/CPP_EEOPTIONS.h_nompi" ; then  
                 cp $dir"/code/CPP_EEOPTIONS.h_nompi" $dir"/code/CPP_EEOPTIONS.h"  
990              fi              fi
991              if test -r $dir"/code/SIZE.h_nompi" ; then          done
992                  cp $dir"/code/SIZE.h_nompi" $dir"/code/SIZE.h"      fi
             fi  
         fi  
993    
994          #  Create an output dir for each OPTFILE/tdir combination      if test "x$ADM" = x ; then
995          CDIR=$DRESULTS"/"$DRESULTS"_"$NDIR          code_dir=code
996          mkdir $CDIR          CODE_DIR=$dir/code
997          CDIR=`pwd`"/$CDIR"      else
998            code_dir=code_ad
999            CODE_DIR=$dir/code_ad
1000        fi
1001        BUILD_DIR=$dir/$builddir
1002    
1003          #  ...configue, make, run, and compare the output.      if test ! -r $CODE_DIR"/SIZE.h_mpi" -a "x$MPI" = "xt" ; then
1004          echo "-------------------------------------------------------------------------------"          echo "can't find \"$CODE_DIR/SIZE.h_mpi\" -- skipping $dir"
1005          echo          continue
1006          echo "Experiment:  $dir"      fi
         echo  
         unset genmake makedepend make run  
         results='-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --'  
         ( cd $dir/input; rm -f *.{o,f,c,F} *.[f,F]90 work* output.txt Make* make.log; )  
         if [ -r $dir/build ]; then  
             seperatebuilddir=1  
             builddir=build  
             rundir=build  
             ( cd $dir/build; ln -sf ../input/* . )  
         else  
             seperatebuilddir=0  
             builddir=input  
             rundir=input  
         fi  
1007    
1008        echo "-------------------------------------------------------------------------------"
1009        echo
1010        echo "Experiment:  $dir"
1011        echo
1012        unset genmake makedepend make run
1013        results='-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --'
1014    
1015        #  Create an output dir for each OPTFILE/tdir combination
1016        rel_CDIR=$DRESULTS"/"$dir
1017        mkdir $rel_CDIR
1018        CDIR=`pwd`"/$rel_CDIR"
1019        
1020        if test "x$CLEANUP" = xt ; then
1021            makeclean $dir/$builddir
1022        else
1023          genmakemodel $dir/$builddir && genmake=Y \          genmakemodel $dir/$builddir && genmake=Y \
1024              && makeclean $dir/$builddir \              && makeclean $dir/$builddir \
1025                && symlink_mpifiles $dir $code_dir $builddir \
1026              && makedependmodel $dir/$builddir && makedepend=Y \              && makedependmodel $dir/$builddir && makedepend=Y \
1027              && makemodel $dir/$builddir && make=Y \              && makemodel $dir/$builddir && make=Y \
1028              && linkdata $seperatebuilddir $dir/$rundir \              && linkdata $use_seperate_build $dir/$rundir \
1029              && runmodel $dir/$builddir && run=Y \              && runmodel $dir/$rundir && run=Y \
1030              && results=`testoutput $dir $rundir`              && results=`testoutput $dir $rundir`
1031        fi
1032        
1033        echo
1034        if test "x$ADM" = x ; then
1035            fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1036          echo          echo
1037          formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} \          echo "$fres" >> $SUMMARY
1038              ${run:-N} $results          echo "fresults='$fres'" > $CDIR"/summary.txt"
1039            echo "MACH='$MACH'" >> $CDIR"/summary.txt"
1040            echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"
1041            echo "DATE='$DATE'" >> $CDIR"/summary.txt"
1042            echo "tdir='$dir'" >> $CDIR"/summary.txt"
1043    
1044            for ex in $extra_runs ; do
1045                unset run
1046                results='-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --'
1047                #  Create an output dir for each OPTFILE/tdir.ex combination
1048                rel_CDIR=$DRESULTS"/"$dir"."$ex
1049                mkdir $rel_CDIR
1050                CDIR=`pwd`"/$rel_CDIR"
1051                test ! -e "$dir/tr_run.$ex" && mkdir "$dir/tr_run.$ex"
1052                for ldir in input.$ex input ; do
1053                    (
1054                        cd "$dir/$ldir" > /dev/null 2>&1
1055                        ls -1 2>/dev/null \
1056                            | sed -e 's|^CVS$||g' | sed -e 's|^output.txt$||g'
1057                    ) > tr_exrun_links
1058                    (
1059                        cd "$dir/tr_run.$ex"
1060                        cat ../../tr_exrun_links | while read i ; do
1061                            if test ! "x$i" = x ; then
1062                                test ! -r $i  &&  ln -s "../"$ldir"/"$i $i
1063                            fi
1064                        done
1065                    )
1066                    test -e tr_exrun_links  &&  rm -f tr_exrun_links
1067                done
1068                ldir=build
1069                (
1070                    cd $dir/tr_run.$ex
1071                    test ! -e mitgcmuv  &&  ln -s "../"$ldir"/"mitgcmuv .
1072                )
1073                runmodel $dir/tr_run.$ex && run=Y \
1074                    && results=`testoutput $dir tr_run.$ex "."$ex`
1075                fres=`printf '%s %s %s %s' ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N}`
1076                fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1077                fres="$fres.$ex"
1078                echo
1079                echo "$fres" >> $SUMMARY
1080                echo "fresults='$fres'" > $CDIR"/summary.txt"
1081                echo "MACH='$MACH'" >> $CDIR"/summary.txt"
1082                echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"
1083                echo "DATE='$DATE'" >> $CDIR"/summary.txt"
1084                echo "tdir='$dir.$ex'" >> $CDIR"/summary.txt"
1085            done
1086        else
1087            fres=`printf '%s %s %s %s' ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N}`
1088            fres=$fres"$results   $dir"
1089          echo          echo
1090          formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} \          echo "$fres" >> $SUMMARY
1091              ${run:-N} $results >> $SUMMARY          echo "fresults='$fres'" > $CDIR"/summary.txt"
         echo "fresults='" > $CDIR"/summary.txt"  
         formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} \  
             ${run:-N} $results >> $CDIR"/summary.txt"  
         echo "'" >> $CDIR"/summary.txt"  
1092          echo "MACH='$MACH'" >> $CDIR"/summary.txt"          echo "MACH='$MACH'" >> $CDIR"/summary.txt"
1093          echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"          echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"
1094          echo "DATE='$DATE'" >> $CDIR"/summary.txt"          echo "DATE='$DATE'" >> $CDIR"/summary.txt"
1095          echo "tdir='$dir'" >> $CDIR"/summary.txt"          echo "tdir='$dir'" >> $CDIR"/summary.txt"
1096            grep -A3 'Seconds in section "ALL' $dir/$rundir/$OUTPUTFILE \
1097                               >> $CDIR"/summary.txt"
1098        fi
1099    
1100          (      postclean $dir/$builddir
1101              cd $DRESULTS      
1102              tar -cf $NDIR".tar" $DRESULTS"_"$NDIR > /dev/null 2>&1      echo "-------------------------------------------------------------------------------"
1103              gzip $NDIR".tar"      
1104          )  done
1105    
1106          $MPACK -s MITgcm-test -m 1000000 $DRESULTS"/"$NDIR".tar.gz" $ADDRESSES  printf "Start time:  " >> $SUMMARY
1107    echo $start_date >> $SUMMARY
1108    printf "End time:    " >> $SUMMARY
1109    date >> $SUMMARY
1110    
1111    #  If addresses were supplied and mpack built successfully, then try
1112    #  to send email using mpack.
1113    if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then
1114        echo "No results email was sent."
1115    else
1116        if test "x$HAVE_MPACK" = xt ; then
1117            tar -cf $DRESULTS".tar" $DRESULTS > /dev/null 2>&1 \
1118                && gzip $DRESULTS".tar" \
1119                && $MPACK -s MITgcm-test -m 3555000 $DRESULTS".tar.gz" $ADDRESSES
1120          RETVAL=$?          RETVAL=$?
1121          if test "x$RETVAL" != x0 ; then          if test "x$RETVAL" != x0 ; then
1122              echo "Warning: \"$MPACK\" failed -- please contact <edhill@mitgcm.org>"              echo
1123                echo "Warning: The tar, gzip, & mpack step failed.  Please send email"
1124                echo "  to <MITgcm-support@mitgcm.org> for help.  You may copy the "
1125                echo "  summary of results from the directory \"$DRESULTS\"."
1126                echo
1127          else          else
1128              rm -f $DRESULTS"/"$NDIR".tar*"              echo
1129                echo "An email containing results was sent to the following addresses:"
1130                echo "  \"$ADDRESSES\""
1131                echo
1132          fi          fi
1133            test -f $DRESULTS".tar"  &&  rm -f $DRESULTS".tar"
1134            test -f $DRESULTS".tar.gz"  &&  rm -f $DRESULTS".tar.gz"
1135        fi
1136    fi
1137    
1138          NDIR=$(( $NDIR + 1 ))  # rm -f tmp_cmpnum.f a.out
1139            rm -f tmp_cmpnum.c tmp_cmpnum
     done  
 done  
1140    
1141  rm tmp_cmpnum.f a.out  if test "x$CLEANUP" != xt ; then
1142        cat $SUMMARY | sed 's/ -- -- -- --//g'
1143        if test -e tr_out.txt ; then
1144            mv tr_out.txt tr_out.txt.old
1145        fi
1146        cat $SUMMARY | sed 's/ -- -- -- --//g' > tr_out.txt
1147    fi
1148    
1149  cat $SUMMARY  if test "x$DELDIR" = xt ; then
1150        rm -rf $DRESULTS
1151    fi
1152    

Legend:
Removed from v.1.7  
changed lines
  Added in v.1.81

  ViewVC Help
Powered by ViewVC 1.1.22