/[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.2 by edhill, Mon Sep 1 16:50:27 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$
5  #  #
6    
7  usage()  usage()
# Line 10  usage() Line 11  usage()
11      echo      echo
12      echo "where possible OPTIONS are:"      echo "where possible OPTIONS are:"
13      echo "  (-help|-h)               print usage"      echo "  (-help|-h)               print usage"
14      echo "  (-optfile=|-of=)STRING   list of genmake2 \"optfiles\""      echo "  (-mth)                   run multi threaded (using eedata.mth)"
15      echo "  (-a|-addr)STRING         list of email recipients"      echo "  (-mpi)                   compile and run using MPI"
16      echo "  (-t|-tdir)STRING         list of \"test\" dirs"      echo "  (-ieee|-noieee)          if possible, use IEEE compiler flags"
17        echo "                             (DEF=\"-ieee\")"
18        echo "  (-of=|-optfile=)STRING   list of optfiles to use"
19        echo "  (-a|-addr) STRING        list of email recipients"
20        echo "                             (DEF=\"edhill@mitgcm.org\")"
21        echo "  (-t|-tdir) STRING        list of group and/or exp. dirs to test"
22        echo "                             (recognized groups: basic, tutorials)"
23        echo "                             (DEF=\"\" which test all)"
24        echo "  (-skd|-skipdir) STRING   list of exp. dirs to skip"
25        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\")"
32        echo "  (-m|-make) STRING        command to use for \"make\""
33        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\""
40        echo "  (-q|-quick)              same as \"-nogenmake -noclean -nodepend\""
41        echo "  (-ng|-nogenmake)         skip the genmake stage"
42        echo "  (-nc|-noclean)           skip the \"make clean\" stage"
43        echo "  (-nd|-nodepend)          skip the \"make depend\" stage"
44        echo "  (-dd|-deldir)            on success, delete the output directory"
45        echo
46        echo "and where STRING can be a whitespace-delimited list"
47        echo "such as:"
48        echo
49        echo "  -t 'exp0 exp2 exp3' "
50        echo "  -addr='abc@123.com testing@home.org'"
51        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      echo
55      exit 1      exit 1
56  }  }
# Line 20  usage() Line 58  usage()
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
71            printf "building mpack...  "
72            if test "x$CC" = x ; then
73                export CC=cc
74          fi          fi
75          echo -n "building mpack...  "          ( cd $MPACKDIR && ./configure && $MAKE ) > tr_build_mpack.out 2>&1
         ( cd $MPACKDIR && ./configure && make ) > 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 90  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 102  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 122  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()
294  {  {
295      # genmakemodel directory      # genmakemodel directory
296      GENMAKE2="../../../tools/genmake2"      if test "x$NOGENMAKE" = xt ; then
297      (          echo "genmake skipped!"
298          cd $1;      else
299          printf 'genmake ... ' 1>&2          if test "x$BASH" = x ; then
300          # ../../../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  
301          else          else
302              echo "succesful" 1>&2              GENMAKE2="$BASH ../../../tools/genmake2 -bash $BASH"
303          fi          fi
304      )          (
305                cd $1;
306                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
313                    command="$command --optfile=$OPTFILE"
314                fi
315                if test "x$IEEE" != x ; then
316                    command="$command -ieee"
317                fi
318                if test "x$MPI" = xt ; then
319                    command="$command -mpi"
320                fi
321                printf 'genmake ... ' 1>&2
322                $command > make.log 2>&1
323                RETVAL=$?
324                #  Reduce the size of the testing emails!
325                head -100 Makefile > $CDIR/Makefile_head
326                if test "x$RETVAL" != x0 ; then
327                    tail make.log
328                    echo "genmakemodel: genmake failed" 1>&2
329                    cp genmake_* make.log $CDIR
330                    return 1
331                else
332                    echo "successful" 1>&2
333                fi
334            )
335        fi
336  }  }
337    
338  makeclean()  makeclean()
339  {  {
340      # makeclean directory      # makeclean directory
341      (      if test "x$NOCLEAN" = xt ; then
342          cd $1;          echo "make Clean skipped!"
343          rm -f output.txt      else
344          printf 'make CLEAN ... ' 2>&1          (
345          if test -r Makefile ; then              cd $1;
346              make CLEAN >> make.log 2>&1              #if test -e $OUTPUTFILE ; then rm -f $OUTPUTFILE ; fi
347              RETVAL=$?              if test -r Makefile ; then
348              if test "x$RETVAL" != x0 ; then                  printf 'clean build-dir: make Clean ... ' 2>&1
349                  tail make.log                  $MAKE Clean >> make.log 2>&1
350                  echo "makeclean: \"make CLEAN\" failed" 1>&2                  RETVAL=$?
351                  cp make.log $CDIR"/make.log"                  if test "x$RETVAL" != x0 ; then
352                  return 1                      tail make.log
353                        echo "makeclean: \"make Clean\" failed" 1>&2
354                        cp make.log $CDIR"/make.log"
355                        return 1
356                    fi
357              fi              fi
358          fi              echo successful 1>&2
359          echo succesful 1>&2              exit 0
360          exit 0          )
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
382            )
383        fi
384  }  }
385    
386  makedependmodel()  makedependmodel()
387  {  {
388      # makedependmodel directory      # makedependmodel directory
389      (      if test "x$NODEPEND" = xt ; then
390          cd $1;          echo "make depend skipped!"
391          printf 'make depend ... ' 1>&2      else
392          make depend >> make.log 2>&1          (
393          RETVAL=$?              cd $1;
394          if test "x$RETVAL" != x0 ; then              printf 'make depend ... ' 1>&2
395              tail make.log              $MAKE depend >> make.log 2>&1
396              echo "makedependmodel: make depend failed" 1>&2              RETVAL=$?
397              cp make.log $CDIR"/make.log"              if test "x$RETVAL" != x0 ; then
398              return 1                  tail make.log
399          else                  echo "makedependmodel: make depend failed" 1>&2
400              echo succesful 1>&2                  cp make.log $CDIR"/make.log"
401          fi                  return 1
402      )              else
403                    echo successful 1>&2
404                fi
405            )
406        fi
407  }  }
408    
409  makemodel()  makemodel()
# Line 231  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 239  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    
530  runmodel()  runmodel()
531  {  {
532      # runmodel directory exe      # runmodel directory
533      #      #
534      #  runs the model "exe" in "directory" (exe is relative to directory)      #  runs "$COMMAND in "directory"
535        #  (where "$COMMAND" is relative to "directory")
536      (      (
537          cd $1          cd $1
538          if [ -x $2 ]; then          printf 'runmodel in %s ...' $1 1>&2
539              if [ $quick -eq 0 ]; then          # make output.txt
540                  rm -f output.txt          echo
541              fi          if test ! -x $EXECUTABLE -a -x "../"$builddir"/"$EXECUTABLE ; then
542              printf 'runmodel: ' 1>&2              echo " link" $EXECUTABLE "from dir ../"$builddir > run.log_00
543              make output.txt              ln -sf "../"$builddir"/"$EXECUTABLE .
544              RETVAL=$?          fi
545              if test "x$RETVAL" = x0 ; then          if test ! -x $EXECUTABLE ; then
546                  cp output.txt $CDIR"/output.txt"                  rm -f run.log ; touch run.log
547                  return 0                  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              else
558                  return 1                  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              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
580            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
586          fi          fi
587      )      )
588  }  }
# Line 283  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" | tee          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 343  formatresults() Line 653  formatresults()
653            
654  }  }
655    
 show_help()  
 {  
     cat - << EOF  
 $0 [-help] [-quick] [-verbose] dir1 [dir2] [...]  
  -help      Show this help message  
  -quick     Skip "genmake" and "make depend" if the Makefile exists  
  -quiet     Reduce the amount of output  
  -verbose   Produce copious amounts of output  
  -debug     Produce even more output which will mean nothing to most  
  -force     Do "make CLEAN" before compiling. This forces a complete rebuild.  
  -clean     Do "make CLEAN" after compiling and testing.  
  -noieee    By default, $0 uses the -ieee option for genmake. This turns it off.  
  -cleanup   Aggresively removes all model output, executables and object files  
             and then exits. Use with care.  
   
 Normal usage:  
  $0 *       Configure, compile, run and analyze in all experiment directories  
 EOF  
 }  
   
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
672  debug=0  debug=0
673  verbose=1  verbose=1
 quick=0  
674  clean=0  clean=0
 ieee=1  
675  expts=''  expts=''
676    # ieee=1
677    
678    IEEE=true
679    if test "x$MITGCM_IEEE" != x ; then
680        IEEE=$MITGCM_IEEE
681    fi
682    
683  OPTFILES=  
684  ADDRESSES=edhill@mitgcm.org  CLEANUP=f
685    QUICK=f
686    NOGENMAKE=f
687    NOCLEAN=f
688    NODEPEND=f
689    POSTCLEAN=f
690    
691    BASH=
692    OPTFILE=NONE
693    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=
700    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
708    MULTI_THREAD=f
709    OUTDIR=
710    DELDIR=
711    
712    ADM=
713    
714  echo -n "parsing options...  "  # Additional monitor types
715    PTRACERS_NUM="1 2 3 4 5"
716    
717    printf "parsing options...  "
718    
719  ac_prev=  ac_prev=
720  for ac_option ; do  for ac_option ; do
# Line 414  for ac_option ; do Line 734  for ac_option ; do
734              usage ;;              usage ;;
735                    
736          -optfile | --optfile | -of | --of)          -optfile | --optfile | -of | --of)
737              ac_prev=OPTFILES ;;              ac_prev=OPTFILE ;;
738          -optfile=* | --optfile=* | -of=* | --of=*)          -optfile=* | --optfile=* | -of=* | --of=*)
739              OPTFILES=$ac_optarg ;;              OPTFILE=$ac_optarg ;;
740                    
741          -addr | --addr | -a | --a)          -addr | --addr | -a | --a)
742              ac_prev=ADDRESSES ;;              ac_prev=ADDRESSES ;;
# Line 428  for ac_option ; do Line 748  for ac_option ; do
748          -tdir=* | --tdir=*)          -tdir=* | --tdir=*)
749              TESTDIRS=$ac_optarg ;;              TESTDIRS=$ac_optarg ;;
750    
751          -quick) quick=1 ;;          -skipdir | --skipdir | -skd | --skd)
752                ac_prev=SKIPDIRS ;;
753            -skipdir=* | --skipdir=*)
754                SKIPDIRS=$ac_optarg ;;
755    
756            -bash | --bash | -b | --b)
757                ac_prev=BASH ;;
758            -bash=* | --bash=*)
759                BASH=$ac_optarg ;;
760    
761            -command | --command | -c | --c)
762                ac_prev=COMMAND ;;
763            -command=* | --command=*)
764                COMMAND=$ac_optarg ;;
765    
766            -make | --make | -m | --m)
767                ac_prev=MAKE ;;
768            -make=* | --make=*)
769                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)
785                CLEANUP=t ; DELDIR=t ;;
786    
787            -quick | --quick | -q | --q)
788                QUICK=t ;;
789            -nogenmake | --nogenmake | -ng | --ng)
790                NOGENMAKE=t ;;
791            -noclean | --noclean | -nc | --nc)
792                NOCLEAN=t ;;
793            -nodepend | --nodepend | -nd | --nd)
794                NODEPEND=t ;;
795    
796            -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 ;;
806            -noieee) IEEE= ;;
807    
808          -verbose) verbose=2 ;;          -verbose) verbose=2 ;;
809          -debug) debug=1 ;;          -debug) debug=1 ;;
         -clean) clean=1 ;;  
         -noieee) ieee=0 ;;  
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 449  for ac_option ; do Line 825  for ac_option ; do
825            
826  done  done
827    
828    if test "x$QUICK" = xt ; then
829        NOGENMAKE=t
830        NOCLEAN=t
831        NODEPEND=t
832    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
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
880        OPTFILE=$MITGCM_OF
881    fi
882    
883    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  fi
897    
898  echo "OK"  #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 475  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
935  G D M    c        m  s        m  s        m  s        m  s  
936  E p a R  g  m  m  e  .  m  m  e  .  m  m  e  .  m  m  e  .  of_path=
937  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
938  2 d e n  d  n  x  n  .  n  x  n  .  n  x  n  .  n  x  n  .      if test -r $OPTFILE ; then
939            # get the path
940            path=${OPTFILE%/*}
941            if test "x$path" = x ; then
942                of_path=`pwd`
943            else
944                of_path=`( cd $path > /dev/null 2>&1 ; pwd )`
945            fi
946            file=${OPTFILE##*/}
947            OPTFILE=$of_path/$file
948            cp $OPTFILE $DRESULTS
949            echo >> $SUMMARY
950            echo "  OPTFILE=$OPTFILE" >> $SUMMARY
951        else
952            echo | tee $SUMMARY
953            echo "ERROR: can't read OPTFILE=\"$OPTFILE\"" | tee $SUMMARY
954            exit 1
955        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
961    echo
962    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  EOF
995    fi
996    
997  NDIR=0  #  ...and each test directory...
998    for dir in $TESTDIRS ; do
999        
1000        #  Cleanup only!
1001        if test "x$CLEANUP" = xt ; then
1002            if test -r $dir/build/Makefile ; then
1003                echo '  ------  clean dir:' $dir/build
1004                ( cd $dir/build ; make CLEAN )
1005            fi
1006            if test -d $dir/run/CVS ; then
1007                echo '  ------  clean dir:' $dir/run
1008                run_clean $dir/run
1009            fi
1010            (
1011                cd $dir
1012                rm -rf tr_run.*
1013            )
1014            continue
1015        fi
1016    
1017        #  Verify that the testdir exists and contains previous
1018        #  results in the correct location--or skip this directory!
1019        fout=
1020        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
1028        fi
1029        if test "x$ADM" = x ; then
1030            check_for_add_mon_output  $fout
1031        fi
1032    
1033  #  For each optfile...      # Check for additional types of monitor output
 for OPTFILE in $OPTFILES ; do  
1034    
1035      OPTFILE=`pwd`"/$OPTFILE"      builddir="build"
1036      if test ! -r $OPTFILE ; then      if test ! -d $dir/$builddir ; then mkdir $dir/$builddir ; fi
1037          echo "Error: can't read optfile \"$OPTFILE\""      rundir="run"
1038          exit 1     #rundir=$builddir
1039        if test ! -d $dir/$rundir ; then
1040            rundir=$builddir
1041      fi      fi
     echo  
     echo "OPTFILE=$OPTFILE" >> $SUMMARY  
     echo >> $SUMMARY  
1042            
1043      #  ...and each test directory...      if test "x$ADM" = x ; then
1044      for dir in $TESTDIRS ; do          code_dir=code
1045                    CODE_DIR=$dir/code
1046          #  Create an output dir for each OPTFILE/tdir combination          input_dirs='input'
1047          CDIR=$DRESULTS"/"$DRESULTS"_"$NDIR      else
1048          mkdir $CDIR          code_dir=code_ad
1049          CDIR=`pwd`"/$CDIR"          CODE_DIR=$dir/code_ad
1050            input_dirs='input_ad input'
1051        fi
1052        BUILD_DIR=$dir/$builddir
1053    
1054          #  ...configue, make, run, and compare the output.      if test ! -r $CODE_DIR"/SIZE.h_mpi" -a "x$MPI" = "xt" ; then
1055          echo "-------------------------------------------------------------------------------"          echo "can't find \"$CODE_DIR/SIZE.h_mpi\" -- skipping $dir"
1056          echo          continue
1057          echo "Experiment:  $dir"      fi
1058          echo      if test ! -r $dir"/input/eedata.mth" -a "x$MULTI_THREAD" = "xt" ; then
1059          unset genmake makedepend make run          echo "can't find \"$dir/input/eedata.mth\" -- skipping $dir"
1060          results='-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --'          continue
1061          ( cd $dir/input; rm -f *.{o,f,c,F} *.[f,F]90 work* output.txt Make* make.log; )      fi
         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  
1062    
1063          #  Verify that the testdir exists and contains previous      #  Check whether there are "extra runs" for this testdir
1064          #  results in the correct location--or skip this directory!      extra_runs=
1065          if test ! -r $dir"/results/output.txt" ; then      if test "x$ADM" = x ; then
1066              echo | tee $SUMMARY          ex_run_dirs=`( cd $dir ; echo input.* )`
1067              echo "can't read \"$dir/results/output.txt\" -- skipping $dir" \          #echo "ex_run_dirs='$ex_run_dirs'"
1068                  | tee $SUMMARY          for exd in $ex_run_dirs ; do
1069              continue              name=`echo $exd | sed -e 's/input.//g'`
1070          fi              outf="$dir/results/output.$name.txt"
1071                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
1081            done
1082        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
1096        rel_CDIR=$DRESULTS"/"$dir
1097        mkdir $rel_CDIR
1098        CDIR=`pwd`"/$rel_CDIR"
1099        
1100        if test "x$CLEANUP" = xt ; then
1101            echo '====>>> this is to check that we never go through this part <<< ==='
1102            makeclean $dir/$builddir \
1103                && run_clean $dir/$rundir
1104        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 mitgcmuv && run=Y \              && runmodel $dir/$rundir && run=Y \
1113              && results=`testoutput $dir $rundir`              && results=`testoutput $dir $rundir "txt"`
1114        fi
1115        
1116        echo
1117        if test "x$ADM" = x ; then
1118            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          echo "fresults='$fres'" > $CDIR"/summary.txt"
1122            echo "MACH='$MACH'" >> $CDIR"/summary.txt"
1123            echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"
1124            echo "DATE='$DATE'" >> $CDIR"/summary.txt"
1125            echo "tdir='$dir'" >> $CDIR"/summary.txt"
1126    
1127            for ex in $extra_runs ; do
1128                unset run
1129                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          echo
1157          formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} \          echo "$fres" >> $SUMMARY
1158              ${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"  
1159          echo "MACH='$MACH'" >> $CDIR"/summary.txt"          echo "MACH='$MACH'" >> $CDIR"/summary.txt"
1160          echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"          echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"
1161          echo "DATE='$DATE'" >> $CDIR"/summary.txt"          echo "DATE='$DATE'" >> $CDIR"/summary.txt"
1162          echo "tdir='$dir'" >> $CDIR"/summary.txt"          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              cd $DRESULTS      if test "x$POSTCLEAN" = xt ; then
1169              tar -cf $NDIR".tar" $DRESULTS"_"$NDIR > /dev/null 2>&1          makeclean $dir/$builddir \
1170              gzip $NDIR".tar"              && run_clean $dir/$rundir
1171          )      fi
1172        
1173        echo "-------------------------------------------------------------------------------"
1174        
1175    done
1176    
1177          $MPACK -s MITgcm-test -m 1000000 $DRESULTS"/"$NDIR".tar.gz" $ADDRESSES  printf "Start time:  " >> $SUMMARY
1178    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
1207    fi
1208    
1209          NDIR=$(( $NDIR + 1 ))  # rm -f tmp_cmpnum.f a.out
1210            rm -f tmp_cmpnum.c tmp_cmpnum
     done  
 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.2  
changed lines
  Added in v.1.89

  ViewVC Help
Powered by ViewVC 1.1.22