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

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.91

  ViewVC Help
Powered by ViewVC 1.1.22