/[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.14 by edhill, Fri Nov 7 21:32:19 2003 UTC revision 1.102 by jmc, Thu Sep 20 03:17:32 2007 UTC
# Line 1  Line 1 
1  #!/bin/bash  #! /usr/bin/env bash
2  #  #
3  #  $Header$  #  $Header$
4  #  $Name$  #  $Name$
# Line 11  usage() Line 11  usage()
11      echo      echo
12      echo "where possible OPTIONS are:"      echo "where possible OPTIONS are:"
13      echo "  (-help|-h)               print usage"      echo "  (-help|-h)               print usage"
14      echo "  (-mpi)                   use MPI input files"      echo "  (-mth)                   run multi threaded (using eedata.mth)"
15        echo "  (-mpi)                   compile and run using MPI"
16      echo "  (-ieee|-noieee)          if possible, use IEEE compiler flags"      echo "  (-ieee|-noieee)          if possible, use IEEE compiler flags"
17      echo "  (-optfile=|-of=)STRING   list of optfiles to use"      echo "                             (DEF=\"-ieee\")"
18      echo "  (-a|-addr)STRING         list of email recipients"      echo "  (-of=|-optfile=)STRING   list of optfiles to use"
19        echo "  (-a|-addr) STRING        list of email recipients"
20      echo "                             (DEF=\"edhill@mitgcm.org\")"      echo "                             (DEF=\"edhill@mitgcm.org\")"
21      echo "  (-t|-tdir)STRING         list of test dirs to use"      echo "  (-t|-tdir) STRING        list of group and/or exp. dirs to test"
22      echo "                             (DEF=\"\" which builds all)"      echo "                             (recognized groups: basic, tutorials)"
23      echo "  (-b|-bash)STRING         location of \"bash\" executable"      echo "                             (DEF=\"\" which test all)"
24      echo "                             (DEF=\"\" for \"/bin/bash\")"      echo "  (-skd|-skipdir) STRING   list of exp. dirs to skip"
25      echo "  (-command)STRING         command to run"      echo "                             (DEF=\"\" which test all)"
26        echo "  (-b|-bash) STRING        preferred location of a \"bash\" or"
27        echo "                             Bourne-compatible \"sh\" shell"
28        echo "                             (DEF=\"\" for \"bash\")"
29        echo "  (-adm|-ad)               perform an adjoint run"
30        echo "  (-command) STRING        command to run"
31      echo "                             (DEF=\"make output.txt\")"      echo "                             (DEF=\"make output.txt\")"
32      echo "  (-m|-make)STRING         command to use for \"make\""      echo "  (-m|-make) STRING        command to use for \"make\""
33      echo "                             (DEF=\"make\")"      echo "                             (DEF=\"make\")"
34        echo "  (-odir) STRING           used to build output directory name"
35        echo "                             (DEF=\"hostname\")"
36        echo "  (-ptr|-ptracers) STRING  specify which ptracers to test"
37        echo "                             (DEF=\"1 2 3 4 5\")"
38        echo "  (-match) NUMBER          Matching Criteria (number of digits)"
39        echo "                             (DEF=\"12\")"
40        echo "  (-j) JOBS                use \"make -j JOBS\" for parallel builds"
41      echo "  (-clean)                 *ONLY* run \"make CLEAN\""      echo "  (-clean)                 *ONLY* run \"make CLEAN\""
42      echo "  (-quick|-q)              same as \"-nogenmake -noclean -nodepend\""      echo "  (-quick|-q)              same as \"-nogenmake -noclean -nodepend\""
43      echo "  (-nogenmake|-ng)         skip the genmake stage"      echo "  (-nogenmake|-ng)         skip the genmake stage"
44      echo "  (-noclean|-nc)           skip the \"make clean\" stage"      echo "  (-noclean|-nc)           skip the \"make clean\" stage"
45      echo "  (-nodepend|-nd)          skip the \"make depend\" stage"      echo "  (-nodepend|-nd)          skip the \"make depend\" stage"
46        echo "  (-deldir|-dd)            on success, delete the output directory"
47        echo "  (-ts)                    provide timing information per timestep"
48        echo "  (-papis)                 provide MFlop/s per timestep using PAPI"
49        echo "  (-pcls)                  provide MFlop/s per timestep using PCL"
50      echo      echo
51      echo "and where STRING follows a whitespace-delimited format"      echo "and where STRING can be a whitespace-delimited list"
52      echo "such as:"      echo "such as:"
53        echo
54      echo "  -t 'exp0 exp2 exp3' "      echo "  -t 'exp0 exp2 exp3' "
55      echo "  -addr='abc@123.com testing@home.org'"      echo "  -addr='abc@123.com testing@home.org'"
56      echo      echo
57        echo "provided that the expression is properly quoted within the current"
58        echo "shell (note the use of single quotes to protect white space)."
59        echo
60      exit 1      exit 1
61  }  }
62    
63  #  build the mpack utility  #  build the mpack utility
64  build_mpack()  build_mpack()
65  {  {
66      echo -n "building the mpack utility...  "      printf "building the mpack utility...  "
67      if test ! -x "$MPACKDIR/mpack" ; then      if test ! -x "$MPACKDIR/mpack" ; then
68          if test ! -d $MPACKDIR ; then          if test ! -d $MPACKDIR ; then
69                echo
70              echo "Error: can't find \"$MPACKDIR\""              echo "Error: can't find \"$MPACKDIR\""
71              echo "  are you sure this program is being run in the correct "              echo "  are you sure this program is being run in the correct "
72              echo "  (that is, \"MITGCM_ROOT\verification\") directory?"              echo "  (that is, \"MITGCM_ROOT\verification\") directory?"
73              exit 1              echo
74                HAVE_MPACK=f
75          fi          fi
76          echo -n "building mpack...  "          printf "building mpack...  "
77          ( cd $MPACKDIR && ./configure && $MAKE ) > build_mpack.out 2>&1          if test "x$CC" = x ; then
78                export CC=cc
79            fi
80            ( cd $MPACKDIR && ./configure && $MAKE ) > tr_build_mpack.out 2>&1
81          RETVAL=$?          RETVAL=$?
82          if test "x$RETVAL" != x0 ; then          if test "x$RETVAL" != x0 ; then
83              echo              echo
84              echo "Error building the mpack tools at: $MPACK_DIR"              echo "Error building the mpack tools at: $MPACK_DIR"
85              exit 1              echo
86                HAVE_MPACK=f
87            else
88                rm -f tr_build_mpack.out
89                HAVE_MPACK=t
90          fi          fi
91        else
92            HAVE_MPACK=t
93      fi      fi
94      echo "OK"      echo "OK"
95  }  }
96    
97  compare_lines()  testoutput_var()
 {  
     # use codelet to compare lines  
     if [ $verbose -gt 1 ]; then  
         cat tmp3.txt 1>&2  
     fi  
     return `./a.out < tmp3.txt`  
 }  
   
 testoutput_for_prop()  
98  {  {
99      # testoutput_for_prop dir s1 label subdir      # testoutput_var dir s1 label subdir reference_output
100      #      #
101      #  compares files in $dir/$subdir/output.txt and $dir/results/output.txt      #  compares 1 variable output selected from file $dir/$subdir/$OUTPUTFILE
102      #  using search strings s1 and text label      #     with same output from reference file $dir/results/$reference_output
103        #  using search strings s1 and text label
104    
105      if [ $debug -gt 0 ]; then      if [ $debug -gt 0 ]; then
106          echo testoutput_for_prop: grep "$2" $1/$4/output.txt 1>&2          echo testoutput_var: grep "$2" $1/$4/$OUTPUTFILE 1>&2
107      fi      fi
108      if [ -r $1/$4/output.txt ]; then      if [ -r $1/$4/$OUTPUTFILE ]; then
109          grep "$2" $1/$4/output.txt | sed 's/.*=//' | nl > tmp1.txt          grep "$2" $1/$4/$OUTPUTFILE | sed 's/.*=//' | cat -n > tmp1.txt
110          lncnt=`wc -l tmp1.txt | awk '{print $1}' `          lncntA=`wc -l tmp1.txt | awk '{print $1}' `
111          if [ $lncnt -lt 3 ]; then          if [ $lncntA -lt 2 ]; then
112              if [ $verbose -gt 0 ]; then              if [ $verbose -gt 0 ]; then
113                  echo Not enough lines of output when searching for "$2" 1>&2                  echo Not enough lines of output when searching for "$2" 1>&2
114              fi              fi
115              return 99              return 99
116          fi          fi
117      else      else
118          echo testoutput_for_prop: output.txt from model run was not readable 1>&2          echo testoutput_var: $OUTPUTFILE from model run was not readable 1>&2
119          return 99          return 99
120      fi      fi
121      if [ $debug -gt 0 ]; then      if [ $debug -gt 0 ]; then
122          echo testoutput_for_prop: grep "$2" $1/results/output.txt 1>&2          echo testoutput_var: grep "$2" $1/results/$5 1>&2
123      fi      fi
124      grep "$2" $1/results/output.txt | sed 's/.*=//' | nl > tmp2.txt      grep "$2" $1/results/$5 | sed 's/.*=//' | cat -n > tmp2.txt
125      lncnt=`wc -l tmp2.txt | awk '{print $1}' `      lncntB=`wc -l tmp2.txt | awk '{print $1}' `
126      if [ $lncnt -lt 3 ]; then      if [ $lncntB -lt 2 ]; then
127          if [ $verbose -gt 0 ]; then          if [ $verbose -gt 0 ]; then
128              echo Not enough lines of output when searching for "$2" 1>&2              echo Not enough lines of output when searching for "$2" 1>&2
129          fi          fi
130          return 99          return 99
131      fi      fi
132        if [ $lncntA -ne $lncntB ]; then
133            if [ $verbose -gt 0 ]; then
134                echo Not same Nb of lines when searching for "$2" ":" $lncntA $lncntB 1>&2
135            fi
136            return 99
137        fi
138        has_nan=`cat tmp1.txt | grep -i nan | wc -l`
139        if [ $has_nan -gt 0  ] ; then
140            echo testoutput_var: $OUTPUTFILE contains $has_nan NaN values  1>&2
141            return 99
142        fi
143        has_inf=`cat tmp1.txt | grep -i inf | wc -l`
144        if [ $has_inf -gt 0  ] ; then
145            echo testoutput_var: $OUTPUTFILE contains $has_inf Inf values  1>&2
146            return 99
147        fi
148      if [ $debug -gt 0 ]; then      if [ $debug -gt 0 ]; then
149          echo testoutput_for_prop: join tmp1.txt tmp2.txt 1>&2          echo testoutput_var: join tmp1.txt tmp2.txt 1>&2
150      fi      fi
151      join tmp1.txt tmp2.txt | awk '{print $1 " " $2 " " $3}' > tmp3.txt      join tmp1.txt tmp2.txt | awk '{print $1 " " $2 " " $3}' > tmp3.txt
152      if [ $debug -gt 0 ]; then      if [ $debug -gt 0 ]; then
153          echo testoutput_for_prop: compare_lines 1>&2          echo testoutput_var: compare_lines 1>&2
154      fi      fi
155      compare_lines      if [ $verbose -gt 1 ]; then
156      digits_of_similarity=$?          cat tmp3.txt 1>&2
157        fi
158        echo "-1" >> tmp3.txt
159        # On the SGI O3K (*not* the O2K), "cat -n" inserts a ":" after the line number
160        cat tmp3.txt | sed -e 's|:||g' > tmp4.txt
161        digits_of_similarity=`./tr_cmpnum < tmp4.txt`
162      if [ $digits_of_similarity -eq 99 ]; then      if [ $digits_of_similarity -eq 99 ]; then
163          if [ $verbose -gt 0 ]; then          if [ $verbose -gt 0 ]; then
164              echo testoutput_for_prop: No comparison was available for \"$2\" 1>&2              echo testoutput_var: No comparison was available for \"$3\" 1>&2
165          fi          fi
166          digits_of_similarity=99          digits_of_similarity=99
167      else      else
168          if [ $verbose -gt 0 ]; then          if [ $verbose -gt 0 ]; then
169              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 \"$3\" 1>&2
170          fi          fi
171      fi      fi
172      rm tmp1.txt tmp2.txt tmp3.txt      rm -f tmp1.txt tmp2.txt tmp3.txt tmp4.txt
173            
174      return $digits_of_similarity      return $digits_of_similarity
175  }  }
# Line 143  dashnum() Line 189  dashnum()
189      done      done
190  }  }
191    
192  testoutput()  testoutput_ad()
193  {  {
194      # testoutput diretory subdir      grep $3 $1/results_ad/output_adm.txt | awk '{print NR " " $5}' > t05.txt
195      #      grep $3 $1/$2/$OUTPUTFILE | awk '{print NR " " $5}' > t15.txt
196      #  test output in "directory"      grep $3 $1/results_ad/output_adm.txt | awk '{print NR " " $6}' > t06.txt
197        grep $3 $1/$2/$OUTPUTFILE | awk '{print NR " " $6}' > t16.txt
198        join t05.txt t15.txt > t5.txt
199        join t06.txt t16.txt > t6.txt
200        echo "-1" >> t5.txt
201        echo "-1" >> t6.txt
202        digits_5=`./tr_cmpnum < t5.txt`
203        digits_6=`./tr_cmpnum < t6.txt`
204        dashnum $digits_5 $digits_6
205        rm -f t[01][56].txt t[56].txt
206    }
207    
208      if [ $debug -gt 0 ]; then  check_for_add_mon_output()
209          echo testoutput: testoutput_for_prop $1 cg2d_init_res 1>&2  {
210      fi      # Check for additional types of monitor output
211      testoutput_for_prop $1 "cg2d_init_res" "cg2d init. residual" $2; cg2dres=$?      if test "x$1" = x ; then
212      if [ $debug -gt 0 ]; then          return
         echo testoutput: cg2dres=$cg2dres 1>&2  
213      fi      fi
214      testoutput_for_prop $1 "dynstat_theta_min" "theta minimum" $2; tmin=$?  
215      testoutput_for_prop $1 "dynstat_theta_max" "theta maximum" $2; tmax=$?      for ii in $PTRACERS_NUM ; do
216      testoutput_for_prop $1 "dynstat_theta_mean" "theta mean" $2; tmean=$?          eval "HAVE_PTR0"$ii"=f"
217      testoutput_for_prop $1 "dynstat_theta_sd" "theta s.d." $2; tsd=$?      done
218      testoutput_for_prop $1 "dynstat_salt_min" "salt minimum" $2; smin=$?  
219      testoutput_for_prop $1 "dynstat_salt_max" "salt maximum" $2; smax=$?      ptr_add="trcstat_ptracerXX_min trcstat_ptracerXX_max"
220      testoutput_for_prop $1 "dynstat_salt_mean" "salt mean" $2; smean=$?      ptr_add="$ptr_add trcstat_ptracerXX_mean trcstat_ptracerXX_sd"
221      testoutput_for_prop $1 "dynstat_salt_sd" "salt s.d." $2; ssd=$?      for ii in $PTRACERS_NUM ; do
222      testoutput_for_prop $1 "dynstat_uvel_min" "U minimum" $2; umin=$?          for jj in $ptr_add ; do
223      testoutput_for_prop $1 "dynstat_uvel_max" "U maximum" $2; umax=$?              name=`eval "echo $jj | sed -e 's|XX|0"$ii"|g'"`
224      testoutput_for_prop $1 "dynstat_uvel_mean" "U mean" $2; umean=$?              tst=`grep $name $1 | wc -l | awk '{print $1}'`
225      testoutput_for_prop $1 "dynstat_uvel_sd" "U s.d." $2; usd=$?              if test ! "x$tst" = x0 ; then
226      testoutput_for_prop $1 "dynstat_vvel_min" "V minimum" $2; vmin=$?                  eval "HAVE_PTR0"$ii"=t"
227      testoutput_for_prop $1 "dynstat_vvel_max" "V maximum" $2; vmax=$?              fi
228      testoutput_for_prop $1 "dynstat_vvel_mean" "V mean" $2; vmean=$?          done
229      testoutput_for_prop $1 "dynstat_vvel_sd" "V s.d." $2; vsd=$?          #  eval 'echo "HAVE_PTR0'$ii' = $HAVE_PTR0'$ii'"'
230            done
231      dashnum $cg2dres $tmin $tmax $tmean $tsd $smin $smax $smean $ssd \  }
232          $umin $umax $umean $usd $vmin $vmax $vmean $vsd  
233    testoutput_run()
234    {
235        # testoutput_run directory subdir reference_output
236        #
237        #  test output from 1 run in "directory"
238    #   if test "x$ADM" = x ; then
239            # default list of output variables to be checked:
240            #  1rst : main variable used to decide if it pass or FAIL
241            #  others : number of matching digits to be printed in summary.txt
242            listChk=$DEF_CHECK_LIST
243            #  load experiment-specific list from file "tr_checklist" (if it exist)
244            if test -r $1/$2/tr_checklist ; then listChk=`cat $1/$2/tr_checklist` ; fi
245            sVar=`echo $listChk | awk '{print $1}'`
246            # remove 1rst var and expand the list: + => min max mean s.d
247            listVar=`echo $listChk | sed 's/ [a-zA-Z0-9]*+/&mn &mx &av &sd/g' \
248                                   | sed 's/+//g' | sed "s/^$sVar//"`
249            if [ $debug -gt 0 ]; then echo "testoutput_run: listVar(I)='$listVar'" 1>&2 ; fi
250            for ii in 1 2 3 4 5 6 7 8 9 ; do
251              tst=`eval 'echo "$HAVE_PTR0'$ii'"'`
252             #echo "-- ptr test=" $tst "number of var=" `echo $listVar | awk '{print NF}'` 1>&2
253              if test "x$tst" != xt ; then listVar=`echo "$listVar" | sed "s/ pt$ii..//g"` ; fi
254            done
255            tst=`echo $sVar $listVar | awk '{ for(i=2;i<=NF;i++){t+=($i==$1)}; print t }'`
256            if test $tst != 1 ; then
257              if test $tst = 0 ; then echo "==> WARNING: selected var >$sVar< not found" 1>&2
258                     else echo "==> WARNING: found selected var >$sVar< $tst times" 1>&2 ; fi
259              echo "==> WARNING: in checked list:" $listVar 1>&2
260            #- put it back once:
261              listVar=" $sVar "`echo "$listVar " | sed "s/ $sVar / /g"`
262            fi
263            if [ $debug -gt 0 ]; then echo "testoutput_run: listVar(M)='$listVar'" 1>&2 ; fi
264            echo "listVar='$listVar'" > $CDIR"/summary.txt"
265            allargs=""
266            for xx in $listVar
267            do
268              case $xx in
269               'PS')  if [ $debug -gt 0 ]
270                      then echo testoutput_run: testoutput_var $1 cg2d_init_res 1>&2 ; fi
271                      testoutput_var $1 "cg2d_init_res" "Press. Solver (cg2d)" $2 $3; yy=$?
272                      if [ $debug -gt 0 ] ; then echo testoutput_run: cg2dres=$yy 1>&2 ; fi ;;
273              'Cost') testoutput_var $1 "ADM  precision_derivative_cost" "ADM Cost" $2 $3; yy=$? ;;
274              'Grad') testoutput_var $1 "ADM  precision_derivative_grad" "ADM Grad" $2 $3; yy=$? ;;
275               'Tmn') testoutput_var $1 "dynstat_theta_min"  "Theta minimum"  $2 $3; yy=$? ;;
276               'Tmx') testoutput_var $1 "dynstat_theta_max"  "Theta maximum"  $2 $3; yy=$? ;;
277               'Tav') testoutput_var $1 "dynstat_theta_mean" "Theta mean"     $2 $3; yy=$? ;;
278               'Tsd') testoutput_var $1 "dynstat_theta_sd"   "Theta Std.Dev"  $2 $3; yy=$? ;;
279               'Smn') testoutput_var $1 "dynstat_salt_min"  "Salt minimum"    $2 $3; yy=$? ;;
280               'Smx') testoutput_var $1 "dynstat_salt_max"  "Salt maximum"    $2 $3; yy=$? ;;
281               'Sav') testoutput_var $1 "dynstat_salt_mean" "Salt mean"       $2 $3; yy=$? ;;
282               'Ssd') testoutput_var $1 "dynstat_salt_sd"   "Salt Std.Dev"    $2 $3; yy=$? ;;
283               'Umn') testoutput_var $1 "dynstat_uvel_min"  "U minimum"       $2 $3; yy=$? ;;
284               'Umx') testoutput_var $1 "dynstat_uvel_max"  "U maximum"       $2 $3; yy=$? ;;
285               'Uav') testoutput_var $1 "dynstat_uvel_mean" "U mean"          $2 $3; yy=$? ;;
286               'Usd') testoutput_var $1 "dynstat_uvel_sd"   "U Std.Dev"       $2 $3; yy=$? ;;
287               'Vmn') testoutput_var $1 "dynstat_vvel_min"  "V minimum"       $2 $3; yy=$? ;;
288               'Vmx') testoutput_var $1 "dynstat_vvel_max"  "V maximum"       $2 $3; yy=$? ;;
289               'Vav') testoutput_var $1 "dynstat_vvel_mean" "V mean"          $2 $3; yy=$? ;;
290               'Vsd') testoutput_var $1 "dynstat_vvel_sd"   "V Std.Dev"       $2 $3; yy=$? ;;
291            'pt1mn'|'pt2mn'|'pt3mn'|'pt4mn'|'pt5mn') ii=`echo $xx | sed 's/pt//' | sed 's/..$//'`
292               testoutput_var $1 "trcstat_ptracer0"$ii"_min"  "p0"$ii"_min"   $2 $3; yy=$? ;;
293            'pt1mx'|'pt2mx'|'pt3mx'|'pt4mx'|'pt5mx') ii=`echo $xx | sed 's/pt//' | sed 's/..$//'`
294               testoutput_var $1 "trcstat_ptracer0"$ii"_max"  "p0"$ii"_max"   $2 $3; yy=$? ;;
295            'pt1av'|'pt2av'|'pt3av'|'pt4av'|'pt5av') ii=`echo $xx | sed 's/pt//' | sed 's/..$//'`
296               testoutput_var $1 "trcstat_ptracer0"$ii"_mean" "p0"$ii"_mean" $2 $3; yy=$? ;;
297            'pt1sd'|'pt2sd'|'pt3sd'|'pt4sd'|'pt5sd') ii=`echo $xx | sed 's/pt//' | sed 's/..$//'`
298               testoutput_var $1 "trcstat_ptracer0"$ii"_sd"   "p0"$ii"_StDv"  $2 $3; yy=$? ;;
299             'Qntmn') testoutput_var $1 "extforcing_qnet_min" "Qnet minimum"  $2 $3; yy=$? ;;
300             'Qntmx') testoutput_var $1 "extforcing_qnet_max" "Qnet maximum"  $2 $3; yy=$? ;;
301             'Qntav') testoutput_var $1 "extforcing_qnet_mean" "Qnet mean"    $2 $3; yy=$? ;;
302             'Qntsd') testoutput_var $1 "extforcing_qnet_sd"  "Qnet Std.Dev"  $2 $3; yy=$? ;;
303             'aSImn') testoutput_var $1 "seaice_area_min"   "SIce Area min"   $2 $3; yy=$? ;;
304             'aSImx') testoutput_var $1 "seaice_area_max"   "SIce Area max"   $2 $3; yy=$? ;;
305             'aSIav') testoutput_var $1 "seaice_area_mean"  "SIce Area mean"  $2 $3; yy=$? ;;
306             'aSIsd') testoutput_var $1 "seaice_area_sd"    "SIce Area StDv"  $2 $3; yy=$? ;;
307             'hSImn') testoutput_var $1 "seaice_heff_min"   "SIce Heff min"   $2 $3; yy=$? ;;
308             'hSImx') testoutput_var $1 "seaice_heff_max"   "SIce Hell max"   $2 $3; yy=$? ;;
309             'hSIav') testoutput_var $1 "seaice_heff_mean"  "SIce Hell mean"  $2 $3; yy=$? ;;
310             'hSIsd') testoutput_var $1 "seaice_heff_sd"    "SIce Hell StDv"  $2 $3; yy=$? ;;
311            'AthSiG') testoutput_var $1 "thSI_Ice_Area_G" "thSIc Area Global" $2 $3; yy=$? ;;
312            'AthSiS') testoutput_var $1 "thSI_Ice_Area_S" "thSIc Area South"  $2 $3; yy=$? ;;
313            'AthSiN') testoutput_var $1 "thSI_Ice_Area_N" "thSIc Area North"  $2 $3; yy=$? ;;
314            'HthSiG') testoutput_var $1 "thSI_IceH_ave_G" "thSIc H Global"    $2 $3; yy=$? ;;
315            'HthSiS') testoutput_var $1 "thSI_IceH_ave_S" "thSIc H South"     $2 $3; yy=$? ;;
316            'HthSiN') testoutput_var $1 "thSI_IceH_ave_N" "thSIc H North"     $2 $3; yy=$? ;;
317                  *) yy=99; echo "WARNING: asking for var=$xx : not recognized !" 1>&2 ;;
318              esac
319              if test $xx = $sVar
320              then allargs="$allargs > $yy <"
321              else allargs="$allargs $yy"
322              fi
323            done
324    
325            nbVar=`echo $listVar | awk '{print NF}'`
326            if [ $nbVar -lt $LEN_CHECK_LIST ] ; then
327            #-- fill line (up to standard length) with dot:
328              adNul=`expr $LEN_CHECK_LIST - $nbVar | awk '{for(i=1;i<=$1;i++){print "."}}'`
329              echo $allargs $adNul
330            else
331              echo $allargs
332            fi
333    
334    #   else
335    #       testoutput_ad $1 $2 "precision_grdchk_result"
336    #   fi
337  }  }
338    
339  genmakemodel()  genmakemodel()
# Line 183  genmakemodel() Line 342  genmakemodel()
342      if test "x$NOGENMAKE" = xt ; then      if test "x$NOGENMAKE" = xt ; then
343          echo "genmake skipped!"          echo "genmake skipped!"
344      else      else
345          GENMAKE2="$BASH ../../../tools/genmake2"          if test "x$BASH" = x ; then
346                GENMAKE2="../../../tools/genmake2"
347            else
348                GENMAKE2="$BASH ../../../tools/genmake2 -bash $BASH"
349            fi
350          (          (
351              cd $1;              cd $1;
352              command="$GENMAKE2  -ds -m $MAKE --mods=../code"              command="$GENMAKE2  -ds -m $MAKE"
353                if test "x$ADM" = x ; then
354                    command="$command --mods=../code"
355                else
356                    command="$command --mods=../code_ad"
357                fi
358              if test "x$OPTFILE" != xNONE ; then              if test "x$OPTFILE" != xNONE ; then
359                  command="$command --optfile=$OPTFILE"                  command="$command --optfile=$OPTFILE"
                 # echo "  command=\"$command\""  
360              fi              fi
361              if test "x$IEEE" != x ; then              if test "x$IEEE" != x ; then
362                  command="$command -ieee"                  command="$command -ieee"
363              fi              fi
364              # echo "command: \"$command\""              if test "x$MPI" = xt ; then
365                    command="$command -mpi"
366                fi
367                if test "x$TS" = xt ; then
368                    command="$command -ts"
369                fi
370                if test "x$PAPIS" = xt ; then
371                    command="$command -papis"
372                else
373                if test "x$PCLS" = xt ; then
374                    command="$command -pcls"
375                fi
376                fi
377              printf 'genmake ... ' 1>&2              printf 'genmake ... ' 1>&2
378              $command > make.log 2>&1              $command > make.log 2>&1
379              RETVAL=$?              RETVAL=$?
380              for i in genmake_state genmake_optfile genmake_local Makefile ; do              #  Reduce the size of the testing emails!
381                  if test -r $i ; then              head -100 Makefile > $CDIR/Makefile_head
                     cp $i $CDIR  
                 fi  
             done  
382              if test "x$RETVAL" != x0 ; then              if test "x$RETVAL" != x0 ; then
383                  tail make.log                  tail make.log
384                  echo "genmakemodel: genmake failed" 1>&2                  echo "genmakemodel: genmake failed" 1>&2
385                  cp make.log $CDIR                  cp genmake_* make.log $CDIR
386                  return 1                  return 1
387              else              else
388                  echo "succesful" 1>&2                  echo "successful" 1>&2
389              fi              fi
390          )          )
391      fi      fi
# Line 219  makeclean() Line 395  makeclean()
395  {  {
396      # makeclean directory      # makeclean directory
397      if test "x$NOCLEAN" = xt ; then      if test "x$NOCLEAN" = xt ; then
398          echo "make CLEAN skipped!"          echo "make Clean skipped!"
399      else      else
400          (          (
401              cd $1;              cd $1;
402              if test -e output.txt ; then              #if test -e $OUTPUTFILE ; then rm -f $OUTPUTFILE ; fi
                 rm -f output.txt  
             fi  
             printf 'make CLEAN ... ' 2>&1  
403              if test -r Makefile ; then              if test -r Makefile ; then
404                  $MAKE CLEAN >> make.log 2>&1                  printf 'clean build-dir: make Clean ... ' 2>&1
405                    $MAKE Clean >> make.log 2>&1
406                  RETVAL=$?                  RETVAL=$?
407                  if test "x$RETVAL" != x0 ; then                  if test "x$RETVAL" != x0 ; then
408                      tail make.log                      tail make.log
409                      echo "makeclean: \"make CLEAN\" failed" 1>&2                      echo "makeclean: \"make Clean\" failed" 1>&2
410                      cp make.log $CDIR"/make.log"                      cp make.log $CDIR"/make.log"
411                      return 1                      return 1
412                  fi                  fi
413              fi              fi
414              echo succesful 1>&2              echo successful 1>&2
415                exit 0
416            )
417        fi
418    }
419    
420    run_clean()
421    {
422        # run_clean directory
423        if test "x$NOCLEAN" = xt ; then
424            echo "run_clean skipped!"
425        else
426            (
427                cd $1;
428                printf 'clean run-dir ... ' 2>&1
429                # part of what is done after "make clean" when doing "make CLEAN"
430                find . -name "*.meta" -exec rm {} \;
431                find . -name "*.data" -exec rm {} \;
432                find . -name "fort.*" -exec rm {} \;
433                find . -type l -exec rm {} \;
434                rm -f $EXECUTABLE *.txt STD* *diagnostics.log datetime
435                rm -rf mnc_test_*
436                echo successful 1>&2
437              exit 0              exit 0
438          )          )
439      fi      fi
# Line 260  makedependmodel() Line 456  makedependmodel()
456                  cp make.log $CDIR"/make.log"                  cp make.log $CDIR"/make.log"
457                  return 1                  return 1
458              else              else
459                  echo succesful 1>&2                  echo successful 1>&2
460              fi              fi
461          )          )
462      fi      fi
# Line 273  makemodel() Line 469  makemodel()
469          cd $1;          cd $1;
470          if test -r Makefile ; then          if test -r Makefile ; then
471              printf 'make ... ' 1>&2              printf 'make ... ' 1>&2
472              $MAKE >> make.log 2>&1              if test "x$ADM" = x ; then
473                    if test "x$JOBS" = x ; then
474                        $MAKE >> make.log 2>&1
475                    else
476                        $MAKE -j $JOBS >> make.log 2>&1
477                    fi
478                else
479                    $MAKE adall >> make.log 2>&1
480                fi
481              RETVAL=$?              RETVAL=$?
482              if test "x$RETVAL" != x0 ; then              if test "x$RETVAL" != x0 ; then
483                  tail make.log                  tail make.log
# Line 281  makemodel() Line 485  makemodel()
485                  cp make.log $CDIR"/make.log"                  cp make.log $CDIR"/make.log"
486                  return 1                  return 1
487              else              else
488                  echo succesful 1>&2                  echo successful 1>&2
489              fi              fi
490          fi          fi
491      )      )
492  }  }
493    
494    symlink_mpifiles()
495    {
496        # Put special links so that MPI specific files are used
497        # This MUST be invoked between makeclean and makelinks because
498        # the Makefile will link to non-mpi files by default
499    
500        dir=$1
501        code_dir=$2
502        BUILD_DIR=$dir/$3
503        CODE_DIR=$dir/$code_dir
504        
505        # These are files that should replace their counter-part when using -mpi
506        MPI_FILES=`(cd $CODE_DIR; find . -name "*_mpi")`
507    
508        #  Is this an MPI run?
509        if test "x$MPI" = xt ; then
510            # YES: We symbolically link these files to the build
511            # dir so long as there is no real file in place
512            for ii in $MPI_FILES ; do
513                i=`echo $ii | sed 's:^\./::'`
514                name=`echo $i | sed 's:_mpi::' `
515                cmp $CODE_DIR/$i $BUILD_DIR/$name > /dev/null 2>&1
516                RETVAL=$?
517                if test "x$RETVAL" != x0 ; then
518                    if ! test -f $BUILD_DIR/$i ; then
519                        #echo Linking $name to $i
520                        (cd $BUILD_DIR; ln -sf ../$code_dir/$i $name)
521                    fi
522                fi
523            done
524        else
525            # NO: We undo any _mpi symbolically linked files
526            for ii in $MPI_FILES ; do
527                i=`echo $ii | sed 's:^\./::'`
528                name=`echo $i | sed 's:_mpi::' `
529                if test -L $BUILD_DIR/$name ; then
530                    cmp $BUILD_DIR/$name "../$code_dir/$name"_mpi > /dev/null 2>&1
531                    RETVAL=$?
532                    if test "x$RETVAL" = x0 ; then
533                        #echo Un-linking $name from $linktarg
534                        rm -f $BUILD_DIR/$name
535                    fi
536                fi
537            done
538        fi
539        
540    }
541    
542  linkdata()  linkdata()
543  {  {
544      # linkdata flag      # linkdata run_dir input_dir_1 input_dir_2 ...
545      #      #
546      # symbolically link data files to run directory      # symbolically link data files to run directory
547      if test "x$1" = x1 ; then      if test -d $1 ; then
548          (          (
549              cd $2              cd $1 ; shift
550              files=`( cd ../input ; ls -1 | grep -v CVS )`              if test -r "../"$1"/eedata.mth" ; then
551              for i in $files ; do              # found eedata.mth in 1rst input dir and it is readable
552                  if test ! -d "../input/"$i ; then                  if test "x$MULTI_THREAD" = "xt" ; then
553                      ln -sf "../input/"$i $i                  # multi-threaded test: remove symbolic link & link eedata.mth
554                        if test -h eedata ; then rm -f eedata ; fi
555                        if test ! -r eedata ; then
556                            ln -sf "../"$1"/eedata.mth" eedata ;
557                            printf 'eedata.mth ' 1>&2
558                        fi
559                    else
560                    # not multi-threaded test: remove eedata symbolic link
561                        if test -h eedata ; then rm -f eedata ; fi
562                    fi
563                fi
564                for ldir in $* ; do
565                    if test -d "../"$ldir ; then
566                        printf 'ldir='${ldir} 1>&2
567                        files=`( cd "../"$ldir ; ls -1 | grep -v CVS )`
568                        for i in $files ; do
569                            if test ! -d "../"$ldir/$i ; then
570                                if test ! -r $i  ; then
571                                    printf ' '$i 1>&2
572                                    ln -sf "../"$ldir"/"$i $i
573                                fi
574                            fi
575                        done
576                        if test -x "../"$ldir"/"prepare_run ; then
577                            "../"$ldir"/"prepare_run
578                        fi
579                        printf ' ; ' 1>&2
580                  fi                  fi
581              done              done
582          )          )
# Line 309  runmodel() Line 587  runmodel()
587  {  {
588      # runmodel directory      # runmodel directory
589      #      #
590      #  runs "$COMMAND" in "directory"      #  runs "$COMMAND in "directory"
591      #  (where "$COMMAND" is relative to "directory")      #  (where "$COMMAND" is relative to "directory")
592      (      (
593          cd $1          cd $1
594          printf 'runmodel: ' 1>&2          printf 'runmodel in %s ...' $1 1>&2
595          # make output.txt          # make output.txt
596          $COMMAND          echo
597          RETVAL=$?          if test ! -x $EXECUTABLE -a -x "../"$builddir"/"$EXECUTABLE ; then
598          if test "x$RETVAL" = x0 ; then              echo " link" $EXECUTABLE "from dir ../"$builddir > run.log_00
599              cp output.txt $CDIR"/output.txt"              ln -sf "../"$builddir"/"$EXECUTABLE .
600            fi
601            if test ! -x $EXECUTABLE ; then
602                    rm -f run.log ; touch run.log
603                    if test -f run.log_00 ; then cat run.log_00 >> run.log ; fi
604                    echo " no executable:" $EXECUTABLE >> run.log
605                    RETVAL=8
606                    ENDVAL=-1
607            else
608                if test ! -f $OUTPUTFILE -o $OUTPUTFILE -ot $EXECUTABLE ; then
609                  # output do not exist or is older than executable:
610                    rm -f run.log ; touch run.log
611                    if test -f run.log_00 ; then cat run.log_00 >> run.log ; fi
612                    ( eval $COMMAND ) >> run.log 2>&1
613                    RETVAL=$?
614                else
615                    RETVAL=0
616                    if test -f run.log ; then
617                        if test -f run.log_00 ; then cat run.log_00 >> run.log ; fi
618                        echo "---------->> $OUTPUTFILE is up to date " >> run.log 2>&1
619                    else
620                        touch run.log
621                        if test -f run.log_00 ; then cat run.log_00 >> run.log ; fi
622                        echo "---------->> $OUTPUTFILE is up to date " >> run.log 2>&1
623                        echo " no previous run.log: assume NORMAL END" >> run.log 2>&1
624                    fi
625                fi
626                ENDVAL=`cat run.log | grep -v 'ABNORMAL END' | grep -c 'NORMAL END'`
627            fi
628            rm -f run.log_00
629            #if test "x$RETVAL" = x0 ; then
630            if [ $RETVAL -eq 0 -a $ENDVAL -gt 0 ] ; then
631                tail run.log
632                echo successful 1>&2
633                # === Reduce the size of the testing emails!
634                #cp $OUTPUTFILE $CDIR"/"$OUTPUTFILE
635                if test -s STDERR.0000 ; then cp STDERR.0000 $CDIR"/STDERR.0000" ; fi
636              return 0              return 0
637          else          else
638                tail run.log
639                echo failed '(run:' $RETVAL ' end:' $ENDVAL ')' 1>&2
640                cp run.log $CDIR"/run.log"
641                if test -s STDERR.0000 ; then cp STDERR.0000 $CDIR"/STDERR.0000" ; fi
642              return 1              return 1
643          fi          fi
644      )      )
# Line 330  createcodelet() Line 648  createcodelet()
648  {  {
649      # create codelet for comparing model output      # create codelet for comparing model output
650    
651      echo -n "creating the comparison code...  "      printf "creating the comparison code...  "
652      cat > tmp_cmpnum.f <<EOFA      cat > tr_cmpnum.c <<EOF
653        program cmpnum  #include <stdio.h>
654        implicit none  #include <math.h>
655        real*8 a,b,diff  int main( int argc, char** argv )  {
656        integer linnum,best    int linnum,cmplin,best,lncnt;
657        best=-16    double a,b,abave,relerr;
658    99  read(*,*,end=70,err=60) linnum,a,b    best = -22;
659        diff=0.5*(abs(a)+abs(b))    lncnt = 0;
660  c     print *,a,b,diff,abs(a-b)/diff    while( 1 & ( (lncnt+=1) < 999 ) )  {
661        if (diff.gt.1.e-12) then      scanf("%d", &linnum);
662          diff=abs(a-b)/diff      if (linnum == -1)  break;
663          if (diff.gt.0.) then      scanf("%lf", &a);  scanf("%lf", &b);
664  c         print *,int(log10(diff)),diff      abave = 0.5*(fabs(a)+fabs(b));
665            linnum=int(log10(diff))      if ( abave == abave ) {
666            best=max(best,linnum)        if (abave > 0.0) {
667          endif          relerr=fabs(a-b)/abave;
668        else          if (relerr > 0.0) { cmplin = (int)rint(log10(relerr)); }
669          if (best.eq.-16.and.diff.ne.0.) best=-22          else { cmplin = -16 ; }
670        endif          best = (best > cmplin) ? best : cmplin; }
671        goto 99        else { cmplin = -22 ; }
672    60  stop 'cmpnum: An error occured reading a,b'     /* printf("%d ; %lf ; %lf\n",cmplin,a,b); */
673    70  print *,-best        }
674        end     else {
675  EOFA     /* printf("%lf ; %lf ; %lf\n",abave,a,b); */
676          break; }
677      }
678      if (lncnt == 999) best=-29;
679      if (linnum != -1) best=-99;
680      printf("%d\n", -best);
681      return 0;
682    }
683    EOF
684        $CC -o tr_cmpnum tr_cmpnum.c -lm
685    
686      f77 tmp_cmpnum.f      if [ -x ./tr_cmpnum ]; then
     if [ -x ./a.out ]; then  
687          echo "OK"          echo "OK"
688          return 0          return 0
689      else      else
690          echo          echo
691          echo "createcodelet: failed to compile codelet"          echo "ERROR: failed to compile comparison code -- please specify"
692            echo "  a C compiler using the CC environment variable."
693          exit 1          exit 1
694      fi      fi
695  }  }
# Line 374  formatresults() Line 701  formatresults()
701      nm=$1      nm=$1
702      printf '%s %s %s %s' $2 $3 $4 $5      printf '%s %s %s %s' $2 $3 $4 $5
703      shift; shift; shift; shift; shift;      shift; shift; shift; shift; shift;
704      printf '%3s' $@      listPrt=$@
705        listRes=`echo $listPrt | sed 's/>//' | sed 's/<//'`
706        xx=`echo $listPrt | sed 's/.*>//' | sed 's/<.*//' | awk '{print $1}'`
707        printf '%3s' $listPrt
708    #   line below does not work on hp-ux_ia64 : do those substitutions later on
709    #   printf '%3s' $listPrt | sed 's/ 99/ --/g' | sed 's/  > />/' | sed 's/  < /</'
710            
711      if [ $1 = '--' ]; then      if [ $xx = '..' ]; then
712            printf ' N/O '
713        elif [ $xx = '--' ]; then
714            printf ' N/O '
715        elif [ $xx = 99 ]; then
716          printf ' N/O '          printf ' N/O '
717      else      else
718          if [ $1 -gt 12 ]; then          if [ $xx -ge $MATCH_CRIT ]; then
719              printf ' pass'              printf ' pass'
720          else          else
721              printf ' FAIL'              printf ' FAIL'
# Line 390  formatresults() Line 726  formatresults()
726            
727  }  }
728    
 show_help()  
 {  
     cat - << EOF  
 $0 [-help] [-quick] [-verbose] dir1 [dir2] [...]  
   
  -help|-h      Show this help message  
  -quiet     Reduce the amount of output  
  -verbose   Produce copious amounts of output  
  -debug     Produce even more output which will mean nothing to most  
  -force     Do "make CLEAN" before compiling. This forces a complete rebuild.  
  -clean     Do "make CLEAN" after compiling and testing.  
  -cleanup   Aggresively removes all model output, executables and object files  
             and then exits. Use with care.  
   
 Normal usage:  
  $0 *       Configure, compile, run and analyze in all experiment directories  
 EOF  
 }  
   
729  scandirs()  scandirs()
730  {  {
731      if [ $# -eq 0 ]; then      if [ $# -eq 1 ]; then
732          for arg in * ; do          for arg in * ; do
733              test -d $arg/input && echo $arg              test -f $arg/$1 && echo $arg
734          done          done
735      else      else
736          echo $*          echo $*
737      fi      fi
738  }  }
739    
740    
741  ###############################################################################  ###############################################################################
 ###############################################################################  
 ###############################################################################  
742    
743    
744  #  Default properties  #  Default properties
# Line 433  clean=0 Line 748  clean=0
748  expts=''  expts=''
749  # ieee=1  # ieee=1
750    
751  IEEE=  IEEE=true
752  if test "x$MITGCM_IEEE" != x ; then  if test "x$MITGCM_IEEE" != x ; then
753      IEEE=$MITGCM_IEEE      IEEE=$MITGCM_IEEE
754  fi  fi
# Line 444  QUICK=f Line 759  QUICK=f
759  NOGENMAKE=f  NOGENMAKE=f
760  NOCLEAN=f  NOCLEAN=f
761  NODEPEND=f  NODEPEND=f
762    POSTCLEAN=f
763    
764  BASH=  BASH=
765  OPTFILE=NONE  OPTFILE=NONE
766  ADDRESSES=  ADDRESSES=
767  TESTDIRS=  TESTDIRS=
768    SKIPDIRS=
769  MPACKDIR="../tools/mpack-1.6"  MPACKDIR="../tools/mpack-1.6"
770    HAVE_MPACK=
771  MPACK="$MPACKDIR/mpack"  MPACK="$MPACKDIR/mpack"
772  COMMAND="make output.txt"  COMMAND=
773  MAKE=make  if test "x$MAKE" = x ; then
774        MAKE=make
775    fi
776    if test "x$CC" = x ; then
777        CC=cc
778    fi
779    JOBS=
780  MPI=f  MPI=f
781    MULTI_THREAD=f
782    OUTDIR=
783    DELDIR=
784    
785    ADM=
786    
787  echo -n "parsing options...  "  # Additional monitor types
788    PTRACERS_NUM="1 2 3 4 5"
789    
790    MATCH_CRIT=13
791    
792    printf "parsing options...  "
793    
794  ac_prev=  ac_prev=
795  for ac_option ; do  for ac_option ; do
# Line 489  for ac_option ; do Line 823  for ac_option ; do
823          -tdir=* | --tdir=*)          -tdir=* | --tdir=*)
824              TESTDIRS=$ac_optarg ;;              TESTDIRS=$ac_optarg ;;
825    
826            -skipdir | --skipdir | -skd | --skd)
827                ac_prev=SKIPDIRS ;;
828            -skipdir=* | --skipdir=*)
829                SKIPDIRS=$ac_optarg ;;
830    
831          -bash | --bash | -b | --b)          -bash | --bash | -b | --b)
832              ac_prev=BASH ;;              ac_prev=BASH ;;
833          -bash=* | --bash=*)          -bash=* | --bash=*)
# Line 504  for ac_option ; do Line 843  for ac_option ; do
843          -make=* | --make=*)          -make=* | --make=*)
844              MAKE=$ac_optarg ;;              MAKE=$ac_optarg ;;
845    
846            -odir | --odir)
847                ac_prev=OUTDIR ;;
848            -odir=* | --odir=*)
849                OUTDIR=$ac_optarg ;;
850    
851            -ptracers | --ptracers | -ptr | --ptr)
852                ac_prev=PTRACERS_NUM ;;
853            -ptracers=* | --ptracers=* | -ptr=* | --ptr=*)
854                PTRACERS_NUM=$ac_optarg ;;
855    
856            -match | --match ) ac_prev=MATCH_CRIT ;;
857            -match=* | --match=* ) MATCH_CRIT=$ac_optarg ;;
858    
859            -j) ac_prev=JOBS ;;
860            -j=*) JOBS=$ac_optarg ;;
861    
862          -clean | --clean)          -clean | --clean)
863              CLEANUP=t ;;              CLEANUP=t ; DELDIR=t ;;
864    
865          -quick | --quick | -q | --q)          -quick | --quick | -q | --q)
866              QUICK=t ;;              QUICK=t ;;
# Line 516  for ac_option ; do Line 871  for ac_option ; do
871          -nodepend | --nodepend | -nd | --nd)          -nodepend | --nodepend | -nd | --nd)
872              NODEPEND=t ;;              NODEPEND=t ;;
873    
874          -mpi) MPI=true ;;          -postclean | --postclean | -pc | --pc)
875                POSTCLEAN=t ;;
876    
877            -mpi) MPI=t ;;
878    
879            -mth) MULTI_THREAD=t ;;
880    
881            -adm | -ad) ADM=t ;;
882    
883          -ieee) IEEE=true ;;          -ieee) IEEE=true ;;
884          -noieee) IEEE= ;;          -noieee) IEEE= ;;
# Line 525  for ac_option ; do Line 887  for ac_option ; do
887          -debug) debug=1 ;;          -debug) debug=1 ;;
888          -quiet) verbose=0 ;;          -quiet) verbose=0 ;;
889    
890            -deldir | -dd) DELDIR=t ;;
891    
892            -ts) TS=t;;
893    
894            -papis) PAPIS=t;;
895    
896            -pcls) PCL=t;;
897    
898          -*)          -*)
899              echo "Error: unrecognized option: "$ac_option              echo "Error: unrecognized option: "$ac_option
900              usage              usage
# Line 545  if test "x$QUICK" = xt ; then Line 915  if test "x$QUICK" = xt ; then
915      NODEPEND=t      NODEPEND=t
916  fi  fi
917    
918    #- setting for forward or ADM testing
919    if test "x$ADM" = xt ; then
920        code_dir=code_ad
921        input_dirs='input_ad input'
922        ref_outp="output_adm.txt"
923        EXECUTABLE="mitgcmuv_ad"
924    else
925        code_dir=code
926        input_dirs='input'
927        ref_outp="output.txt"
928        EXECUTABLE="mitgcmuv"
929    fi
930    
931  if test "x$TESTDIRS" = x ; then  if test "x$TESTDIRS" = x ; then
932      TESTDIRS=`scandirs`  #   if test "x$ADM" = xt ; then
933    #       LIST=`scandirs results_ad/$ref_outp`
934    #   else
935            LIST=`scandirs results/$ref_outp`
936    #   fi
937    else
938        #- expand group of experiments:
939        LIST=" "
940        for xx in $TESTDIRS
941        do
942          case $xx in
943            'basic') LIST=${LIST}" aim.5l_cs hs94.128x64x5 ideal_2D_oce"
944                     LIST=${LIST}" lab_sea tutorial_baroclinic_gyre"
945                     LIST=${LIST}" tutorial_global_oce_latlon tutorial_plume_on_slope"
946                    ;;
947            'tutorials')
948                     LIST=${LIST}" "`ls | grep 'tutorial_'` ;;
949            *)       LIST=${LIST}" "$xx ;;
950          esac
951        done
952  fi  fi
953    #echo 'LIST='${LIST}'<'
954    #- skip dirs, remove duplicate and non-directory:
955    TESTDIRS=" "
956    count=0
957    for xx in $LIST
958    do
959        yy=`echo $SKIPDIRS | grep -c $xx`
960        if test $yy = 0 ; then
961            if test -d $xx ; then
962                yy=`echo $TESTDIRS | grep -c $xx`
963                if test $yy = 0 ; then TESTDIRS=${TESTDIRS}" "$xx ; fi
964            else count=1 ;
965                echo ""; echo -n " -- skip \"$xx\" (not a directory !)"
966            fi
967        else
968            if test $count = 1 ; then echo -n ", \"$xx\""
969            else count=1 ; echo "" ;  echo -n " skip: \"$xx\""
970            fi
971        fi
972    done
973    if test $count = 1 ; then echo "" ; echo -n " ... " ; fi
974    #echo 'TESTDIRS='${TESTDIRS}'<'
975    
976  if test "x$OPTFILE" = xNONE -a "x$MITGCM_OF" != x ; then  if test "x$OPTFILE" = xNONE -a "x$MITGCM_OF" != x ; then
977      OPTFILE=$MITGCM_OF      OPTFILE=$MITGCM_OF
978  fi  fi
979    
980  echo "OK"  OUTPUTFILE=$ref_outp
981    if test "x$COMMAND" = x ; then
982        COMMAND="./$EXECUTABLE > $OUTPUTFILE"
983    fi
984    if test "x$MPI" = xt ; then
985        OUTPUTFILE="STDOUT.0000"
986    fi
987    
988    #echo "OK"
989    echo "OK (COMMAND= $COMMAND )"
990    
991    # set the Default List of output variables to be checked:
992    #  (use default or load experiment-specific list from file "tr_checklist")
993    # content : 1rst = main variable used to decide if it pass or FAIL
994    #         others = number of matching digits to be printed in summary.txt
995    if test "x$ADM" = x ; then
996        DEF_CHECK_LIST='PS PS T+ S+ U+ V+ pt1+ pt2+ pt3+ pt4+ pt5+'
997        EMPTY_RESULTS='.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..'
998        LEN_CHECK_LIST=`echo $DEF_CHECK_LIST | sed 's/ [a-zA-Z0-9]*+/&mn &mx &av &sd/g' | awk '{print NF-1}'`
999        ii=`echo $EMPTY_RESULTS | awk '{print NF}'`
1000        EMPTY_RESULTS=$EMPTY_RESULTS`expr $LEN_CHECK_LIST - $ii | awk 'BEGIN{FS=":"}{for(i=1;i<=$1;i++){printf "  ."}}'`
1001    else
1002        DEF_CHECK_LIST='Cost Cost Grad'
1003        EMPTY_RESULTS='.. ..'
1004        LEN_CHECK_LIST=`echo $DEF_CHECK_LIST | sed 's/ [a-zA-Z0-9]*+/&mn &mx &av &sd/g' | awk '{print NF-1}'`
1005    fi
1006    
1007  #  create the FORTRAN comparison code  #  create the FORTRAN comparison code
1008  createcodelet  createcodelet
1009    
1010  #  build the mpack utility  #  build the mpack utility
1011  build_mpack  if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then
1012        echo "skipping mpack build"
1013    else
1014        build_mpack
1015    fi
1016    
1017  #  Create a uniquely named directory to store results  #  Create a uniquely named directory to store results
1018  MACH=`hostname`  MACH=`hostname`
1019  UNAMEA=`uname -a`  UNAMEA=`uname -a`
1020  DATE=`date +%Y%m%d`  DATE=`date +%Y%m%d`
1021  BASE=$MACH"_"$DATE"_"  BASE="tr_"$MACH"_"$DATE"_"
1022    if test "x$OUTDIR" != x ; then
1023        BASE="tr_"$OUTDIR"_"$DATE"_"
1024    fi
1025  DNUM=0  DNUM=0
1026  DRESULTS="$BASE$DNUM"  DRESULTS="$BASE$DNUM"
1027  while test -e $DRESULTS ; do  while test -e $DRESULTS ; do
# Line 575  done Line 1031  done
1031  mkdir $DRESULTS  mkdir $DRESULTS
1032  RETVAL=$?  RETVAL=$?
1033  if test "x$RETVAL" != x0 ; then  if test "x$RETVAL" != x0 ; then
1034      echo "Error: can't create results directory \"./$DRESULTS\""      echo "ERROR: Can't create results directory \"./$DRESULTS\""
1035      exit 1      exit 1
1036  fi  fi
1037  SUMMARY="$DRESULTS/summary.txt"  SUMMARY="$DRESULTS/summary.txt"
1038  echo -n "Start time:  " >> $SUMMARY  printf "Start time:  " >> $SUMMARY
1039  date > $SUMMARY  start_date=`date`
1040  date > dfile  echo $start_date > $SUMMARY
 cat << EOF >> $SUMMARY  
                 T           S           U           V  
 G D M    c        m  s        m  s        m  s        m  s  
 E p a R  g  m  m  e  .  m  m  e  .  m  m  e  .  m  m  e  .  
 N n k u  2  i  a  a  d  i  a  a  d  i  a  a  d  i  a  a  d  
 2 d e n  d  n  x  n  .  n  x  n  .  n  x  n  .  n  x  n  .  
   
 EOF  
   
 NDIR=0  
1041    
1042  of_path=  of_path=
1043  if test "x$OPTFILE" != xNONE ; then  if test "x$OPTFILE" != xNONE ; then
# Line 605  if test "x$OPTFILE" != xNONE ; then Line 1051  if test "x$OPTFILE" != xNONE ; then
1051          fi          fi
1052          file=${OPTFILE##*/}          file=${OPTFILE##*/}
1053          OPTFILE=$of_path/$file          OPTFILE=$of_path/$file
1054            cp $OPTFILE $DRESULTS
1055            echo >> $SUMMARY
1056            echo "  OPTFILE=$OPTFILE" >> $SUMMARY
1057      else      else
1058          echo          echo | tee $SUMMARY
1059          echo "WARNING: can't read OPTFILE=\"$OPTFILE\" but will try to use it..."          echo "ERROR: can't read OPTFILE=\"$OPTFILE\"" | tee $SUMMARY
1060            exit 1
1061      fi      fi
1062    else
1063        echo >> $SUMMARY
1064        echo "No \"OPTFILE\" was explicitly specified by testreport," >> $SUMMARY
1065        echo "   so the genmake default will be used." >> $SUMMARY
1066  fi  fi
1067  echo  echo
 echo "OPTFILE=$OPTFILE" >> $SUMMARY  
1068  echo >> $SUMMARY  echo >> $SUMMARY
1069    if test "x$ADM" = x ; then
1070        if [ $MATCH_CRIT -lt 10 ] ;
1071        then line_0="default  "$MATCH_CRIT ;
1072        else line_0="default "$MATCH_CRIT ; fi
1073           line_0="$line_0  ----T-----  ----S-----  ----U-----  ----V-----"
1074    #   line_0="            ----T-----  ----S-----  ----U-----  ----V-----"
1075        line_1="G D M    c        m  s        m  s        m  s        m  s"
1076        line_2="E p a R  g  m  m  e  .  m  m  e  .  m  m  e  .  m  m  e  ."
1077        line_3="N n k u  2  i  a  a  d  i  a  a  d  i  a  a  d  i  a  a  d"
1078        line_4="2 d e n  d  n  x  n  .  n  x  n  .  n  x  n  .  n  x  n  ."
1079        for ii in $PTRACERS_NUM ; do
1080            #  tst=`eval 'echo $HAVE_PTR0'$ii`
1081            #  if test "x$tst" = xt ; then
1082            line_0="$line_0  --PTR 0"$ii"--"
1083            line_1="$line_1        m  s"
1084            line_2="$line_2  m  m  e  ."
1085            line_3="$line_3  i  a  a  d"
1086            line_4="$line_4  n  x  n  ."
1087            #  fi
1088        done
1089        echo "$line_0" | tee -a $SUMMARY
1090        echo "$line_1" | tee -a $SUMMARY
1091        echo "$line_2" | tee -a $SUMMARY
1092        echo "$line_3" | tee -a $SUMMARY
1093        echo "$line_4" | tee -a $SUMMARY
1094        echo " "       | tee -a $SUMMARY
1095    else
1096        echo "ADJOINT=true" >> $SUMMARY
1097        echo >> $SUMMARY
1098        if [ $MATCH_CRIT -lt 10 ] ;
1099        then line_0="default  "$MATCH_CRIT ;
1100        else line_0="default "$MATCH_CRIT ; fi
1101        echo "$line_0" | tee -a $SUMMARY
1102        cat << EOF | tee -a $SUMMARY
1103    G D M    C  G
1104    E p a R  o  r
1105    N n k u  s  a
1106    2 d e n  t  d
1107    
1108    EOF
1109    fi
1110    
1111  #  ...and each test directory...  #  ...and each test directory...
1112  for dir in $TESTDIRS ; do  for dir in $TESTDIRS ; do
# Line 620  for dir in $TESTDIRS ; do Line 1114  for dir in $TESTDIRS ; do
1114      #  Cleanup only!      #  Cleanup only!
1115      if test "x$CLEANUP" = xt ; then      if test "x$CLEANUP" = xt ; then
1116          if test -r $dir/build/Makefile ; then          if test -r $dir/build/Makefile ; then
1117                echo '  ------  clean dir:' $dir/build
1118              ( cd $dir/build ; make CLEAN )              ( cd $dir/build ; make CLEAN )
1119          fi          fi
1120          if test -r $dir/input/Makefile ; then          if test -d $dir/run/CVS ; then
1121              ( cd $dir/input ; make CLEAN )              echo '  ------  clean dir:' $dir/run
1122                run_clean $dir/run
1123          fi          fi
1124            (
1125                cd $dir
1126                rm -rf tr_run.*
1127            )
1128          continue          continue
1129      fi      fi
1130    
1131      #  Verify that the testdir exists and contains previous      #  Verify that the testdir exists and contains previous
1132      #  results in the correct location--or skip this directory!      #  results in the correct location--or skip this directory!
1133      if test ! -r $dir"/results/output.txt" ; then      fout=
1134          echo "can't read \"$dir/results/output.txt\" -- skipping $dir"      if test "x$ADM" = x ; then
1135            fout=$dir"/results/"$ref_outp
1136        else
1137            fout=$dir"/results_ad/"$ref_outp
1138        fi
1139        if test ! -r $fout ; then
1140            echo "can't read \"$fout\" -- skipping $dir"
1141          continue          continue
1142      fi      fi
1143        if test "x$ADM" = x ; then
1144            check_for_add_mon_output  $fout
1145        fi
1146    
1147      echo "-------------------------------------------------------------------------------"      # Check for additional types of monitor output
     echo  
     echo "Experiment:  $dir"  
     echo  
     unset genmake makedepend make run  
     results='-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --'  
1148    
1149      builddir="input"      builddir="build"
1150      rundir="input"      if test ! -d $dir/$builddir ; then mkdir $dir/$builddir ; fi
1151      use_seperate_build=0      rundir="run"
1152      if test -d $dir/build -a -r $dir/build ; then      if test ! -d $dir/$rundir ; then
1153          builddir="build"          rundir=$builddir
         rundir="build"  
         use_seperate_build=1  
         linkdata $use_seperate_build $dir/$rundir  
1154      fi      fi
1155            CODE_DIR=$dir/$code_dir
     CODE_DIR=$dir/code  
1156      BUILD_DIR=$dir/$builddir      BUILD_DIR=$dir/$builddir
     MPI_FILES="CPP_EEOPTIONS.h_mpi SIZE.h_mpi"  
     NOMPI_FILES="CPP_EEOPTIONS.h_nompi SIZE.h_nompi"  
1157    
1158      #  Is this an MPI run?      if test ! -r $CODE_DIR"/SIZE.h_mpi" -a "x$MPI" = "xt" ; then
1159      if test "x$MPI" = xt ; then          echo "can't find \"$CODE_DIR/SIZE.h_mpi\" -- skipping $dir"
1160          FILES=$MPI_FILES          continue
         endings="_mpi"  
     else  
         FILES=$NOMPI_FILES  
         endings="_nompi"  
1161      fi      fi
1162            if test ! -r $dir"/input/eedata.mth" -a "x$MULTI_THREAD" = "xt" ; then
1163      #  Check to see that we have the files          echo "can't find \"$dir/input/eedata.mth\" -- skipping $dir"
     have_files=t  
     for i in $FILES ; do  
         if test ! -r $CODE_DIR/$i ; then  
             echo "Warning: can't read file $CODE_DIR/$i"  
             have_files=f  
         fi  
     done  
     if test "x$have_files" != xt -a "x$MPI" = xt ; then  
         echo "Skipping $dir due to lack of input files (see above warning)"  
1164          continue          continue
1165      fi      fi
1166        
1167      #  If we have the $FILES and they differ, copy the $FILES to $BUILD_DIR      #  Check whether there are "extra runs" for this testdir
1168      if test "x$have_files" = xt ; then      extra_runs=
1169          for i in $FILES ; do      if test "x$ADM" = x ; then
1170              sstr="s|$endings||"          ex_run_dirs=`( cd $dir ; echo input.* )`
1171              name=`echo $i | sed -e $sstr `          #echo "ex_run_dirs='$ex_run_dirs'"
1172              cmp $CODE_DIR/$i $BUILD_DIR/$name > /dev/null 2>&1          for exd in $ex_run_dirs ; do
1173              RETVAL=$?              name=`echo $exd | sed -e 's/input.//g'`
1174              if test "x$RETVAL" != x0 ; then              outf="$dir/results/output.$name.txt"
1175                  cp $CODE_DIR/$i $BUILD_DIR/$name              if test -f $outf -a -r $outf ; then
1176                    if test "x$MULTI_THREAD" = "xt" ; then
1177                        if test -r $dir"/"$exd"/eedata.mth" ; then
1178                            extra_runs="$extra_runs $name"
1179                        #else echo $dir"/"$exd"/eedata.mth: not found"
1180                        fi
1181                    else
1182                        extra_runs="$extra_runs $name"
1183                    fi
1184              fi              fi
1185          done          done
1186      fi      fi
1187        
1188        echo "-------------------------------------------------------------------------------"
1189        echo
1190        if test "x$extra_runs" = "x" ; then
1191           echo "Experiment:  $dir"
1192        else
1193           echo "Experiment:  $dir ; extra_runs=$extra_runs"
1194        fi
1195        echo
1196        unset genmake makedepend make run
1197        results=$EMPTY_RESULTS
1198    
1199      #  Create an output dir for each OPTFILE/tdir combination      #  Create an output dir for each OPTFILE/tdir combination
1200      CDIR=$DRESULTS"/"$DRESULTS"_"$NDIR      rel_CDIR=$DRESULTS"/"$dir
1201      mkdir $CDIR      mkdir $rel_CDIR
1202      CDIR=`pwd`"/$CDIR"      CDIR=`pwd`"/$rel_CDIR"
1203            
1204      if test "x$CLEANUP" = xt ; then      if test "x$CLEANUP" = xt ; then
1205          makeclean $dir/$builddir          echo '====>>> this is to check that we never go through this part <<< ==='
1206            makeclean $dir/$builddir \
1207                && run_clean $dir/$rundir
1208      else      else
1209          genmakemodel $dir/$builddir && genmake=Y \          genmakemodel $dir/$builddir && genmake=Y \
1210              && makeclean $dir/$builddir \              && makeclean $dir/$builddir \
1211                && run_clean $dir/$rundir \
1212                && symlink_mpifiles $dir $code_dir $builddir \
1213              && makedependmodel $dir/$builddir && makedepend=Y \              && makedependmodel $dir/$builddir && makedepend=Y \
1214              && makemodel $dir/$builddir && make=Y \              && makemodel $dir/$builddir && make=Y \
1215              && linkdata $use_seperate_build $dir/$rundir \              && linkdata $dir/$rundir $input_dirs \
1216              && runmodel $dir/$rundir && run=Y \              && runmodel $dir/$rundir && run=Y \
1217              && results=`testoutput $dir $rundir`              && results=`testoutput_run $dir $rundir $ref_outp`
1218      fi      fi
1219            
1220      echo      echo
1221      formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} \  #   if test "x$ADM" = x ; then
1222          ${run:-N} $results          fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1223      echo          echo
1224      formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} \          echo "$fres" | sed 's/ 99/ --/g' | sed 's/  > />/' | sed 's/  < /</' >> $SUMMARY
1225          ${run:-N} $results >> $SUMMARY          touch $CDIR"/summary.txt"
1226      echo "fresults='" > $CDIR"/summary.txt"          echo "fresults='$fres'" | sed 's/ 99/ --/g' >> $CDIR"/summary.txt"
1227      formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} \          echo "MACH='$MACH'" >> $CDIR"/summary.txt"
1228          ${run:-N} $results >> $CDIR"/summary.txt"          echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"
1229      echo "'" >> $CDIR"/summary.txt"          echo "DATE='$DATE'" >> $CDIR"/summary.txt"
1230      echo "MACH='$MACH'" >> $CDIR"/summary.txt"          echo "tdir='$dir'" >> $CDIR"/summary.txt"
1231      echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"  
1232      echo "DATE='$DATE'" >> $CDIR"/summary.txt"          for ex in $extra_runs ; do
1233      echo "tdir='$dir'" >> $CDIR"/summary.txt"              unset run
1234                results=$EMPTY_RESULTS
1235                #  Create an output dir for each OPTFILE/tdir.ex combination
1236                rel_CDIR=$DRESULTS"/"$dir"."$ex
1237                mkdir $rel_CDIR
1238                CDIR=`pwd`"/$rel_CDIR"
1239                test ! -e "$dir/tr_run.$ex" && mkdir "$dir/tr_run.$ex"
1240                run_clean $dir/tr_run.$ex
1241                linkdata $dir/tr_run.$ex input.$ex input
1242                runmodel $dir/tr_run.$ex && run=Y \
1243                    && results=`testoutput_run $dir tr_run.$ex "output.${ex}.txt"`
1244                fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1245                fres="$fres.$ex"
1246                echo
1247                echo "$fres" | sed 's/ 99/ --/g' | sed 's/  > />/' | sed 's/  < /</' >> $SUMMARY
1248                touch $CDIR"/summary.txt"
1249                echo "fresults='$fres'" | sed 's/ 99/ --/g' >> $CDIR"/summary.txt"
1250                echo "MACH='$MACH'" >> $CDIR"/summary.txt"
1251                echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"
1252                echo "DATE='$DATE'" >> $CDIR"/summary.txt"
1253                echo "tdir='$dir.$ex'" >> $CDIR"/summary.txt"
1254                if test "x$POSTCLEAN" = xt ; then
1255                    run_clean $dir/tr_run.$ex
1256                fi
1257            done
1258    #   else
1259    #       fres=`printf '%s %s %s %s' ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N}`
1260    #       fres=$fres"$results   $dir"
1261    #       echo
1262    #       echo "$fres" >> $SUMMARY
1263    #       touch $CDIR"/summary.txt"
1264    #       echo "fresults='$fres'" >> $CDIR"/summary.txt"
1265    #       echo "MACH='$MACH'" >> $CDIR"/summary.txt"
1266    #       echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"
1267    #       echo "DATE='$DATE'" >> $CDIR"/summary.txt"
1268    #       echo "tdir='$dir'" >> $CDIR"/summary.txt"
1269    #   fi
1270        if test "x$ADM" = xt ; then
1271            grep -A3 'Seconds in section "ALL' $dir/$rundir/$OUTPUTFILE \
1272                               >> $CDIR"/summary.txt"
1273        fi
1274    
1275        #postclean $dir/$builddir
1276        if test "x$POSTCLEAN" = xt ; then
1277            makeclean $dir/$builddir \
1278                && run_clean $dir/$rundir
1279        fi
1280            
1281      (      echo "-------------------------------------------------------------------------------"
         cd $DRESULTS  
         tar -cf $NDIR".tar" $DRESULTS"_"$NDIR > /dev/null 2>&1  
         gzip $NDIR".tar"  
     )  
1282            
1283      if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then  done
1284          echo "No mail sent"  
1285      else  printf "Start time:  " >> $SUMMARY
1286          $MPACK -s MITgcm-test -m 1000000 $DRESULTS"/"$NDIR".tar.gz" $ADDRESSES  echo $start_date >> $SUMMARY
1287    printf "End time:    " >> $SUMMARY
1288    date >> $SUMMARY
1289    
1290    #  If addresses were supplied and mpack built successfully, then try
1291    #  to send email using mpack.
1292    if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then
1293        echo "No results email was sent."
1294    else
1295        if test "x$HAVE_MPACK" = xt ; then
1296            tar -cf $DRESULTS".tar" $DRESULTS > /dev/null 2>&1 \
1297                && gzip $DRESULTS".tar" \
1298                && $MPACK -s MITgcm-test -m 3555000 $DRESULTS".tar.gz" $ADDRESSES
1299          RETVAL=$?          RETVAL=$?
1300          if test "x$RETVAL" != x0 ; then          if test "x$RETVAL" != x0 ; then
1301              echo "Warning: \"$MPACK\" failed -- please contact <edhill@mitgcm.org>"              echo
1302                echo "Warning: The tar, gzip, & mpack step failed.  Please send email"
1303                echo "  to <MITgcm-support@mitgcm.org> for help.  You may copy the "
1304                echo "  summary of results from the directory \"$DRESULTS\"."
1305                echo
1306          else          else
1307              rm -f $DRESULTS"/"$NDIR".tar*"              echo
1308                echo "An email containing results was sent to the following addresses:"
1309                echo "  \"$ADDRESSES\""
1310                echo
1311          fi          fi
1312            test -f $DRESULTS".tar"  &&  rm -f $DRESULTS".tar"
1313            test -f $DRESULTS".tar.gz"  &&  rm -f $DRESULTS".tar.gz"
1314      fi      fi
1315    fi
1316    
1317      echo "-------------------------------------------------------------------------------"  rm -f tr_cmpnum.c tr_cmpnum
       
     NDIR=$(( $NDIR + 1 ))  
       
 done  
   
 echo -n "Start time:  " >> $SUMMARY  
 date -r dfile >> $SUMMARY  
 echo -n "End time:    " >> $SUMMARY  
 date >> $SUMMARY  
   
 rm tmp_cmpnum.f a.out dfile  
1318    
1319  if test "x$CLEANUP" != xt ; then  if test "x$CLEANUP" != xt ; then
1320      cat $SUMMARY      cat $SUMMARY | sed 's/ \.  \.  \.  \.  \.  \.  \.  \.  \.  \.  \.  \. //'
1321      if test -e tr.out ; then      if test -e tr_out.txt ; then
1322          mv tr.out tr.out.old          mv tr_out.txt tr_out.txt.old
1323      fi      fi
1324      cat $SUMMARY > tr.out      cat $SUMMARY | sed '/^[YN] [YN] [YN] [YN]/ s/  \.//g' > tr_out.txt
1325    fi
1326    
1327    if test "x$DELDIR" = xt ; then
1328        rm -rf $DRESULTS
1329  fi  fi
1330    

Legend:
Removed from v.1.14  
changed lines
  Added in v.1.102

  ViewVC Help
Powered by ViewVC 1.1.22