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

Legend:
Removed from v.1.9.2.8  
changed lines
  Added in v.1.114

  ViewVC Help
Powered by ViewVC 1.1.22