/[MITgcm]/MITgcm/verification/testscript
ViewVC logotype

Diff of /MITgcm/verification/testscript

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph | View Patch Patch

revision 1.1 by adcroft, Fri Mar 9 17:56:37 2001 UTC revision 1.12 by adcroft, Mon Aug 13 19:35:20 2001 UTC
# Line 1  Line 1 
1  #!/bin/csh  #!/bin/sh
2    
3  # Run this script from the verification directory  compare_lines()
4  # It will automatically configure, compile, run and verify all experiments  {
5  # in the verification directory for whcih there is an results/output.txt  # use codelet to compare lines
6  # file.   if [ $verbose -gt 1 ]; then
7      cat tmp3.txt 1>&2
8  # This is the number of least-significant digits allows to be   fi
9  # in error before the test is classified as a "fail".   return `./a.out < tmp3.txt`
10    }
11  set passaccuracy=7  
12  printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\n' " " Make " " " " Exact "# of" " " > summary.txt  testoutput_for_prop()
13  printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\n' Config Depend Compile Execute Match Digits experiment >> summary.txt  {
14    # testoutput_for_prop dir s1 label
15  # Pass any arguments  #
16  foreach arg ($argv)  #  compares files in $dir/input/output.txt and $dir/results.output.txt
17   switch ($arg)  #  using search strings s1 and text label
18    case -clean:  
19     echo Cleaning ...   if [ $debug -gt 0 ]; then
20     foreach dr ([a-zA-Z01-9]*)    echo testoutput_for_prop: grep "$2" $1/input/output.txt 1>&2
21      if (-d $dr/input) then   fi
22        echo Entering $dr   if [ -r $1/input/output.txt ]; then
23        cd $dr/input    grep "$2" $1/input/output.txt | sed 's/.*=//' | nl > tmp1.txt
       echo ""  
       make CLEAN  
       \rm -f {*output,*high,*low}.txt *.log  
       \rm -f ?ake*  
       cd ../..  
     endif  
    end  
    rm -f summary.txt  
    exit 0  
   default:  
    echo Unknown argument given to $0  
    exit 1  
  endsw  
 end  
   
 foreach dr ([a-zA-Z01-9]*)  
  if (! -d $dr/input ) continue  
  set config=-  
  set makedepend=-  
  set compile=-  
  set execute=-  
  set exactmatch=-  
  set accuracy=-  
  echo ==============================================================================  
  echo Entering $dr  
  cd $dr  
  echo ""  
  if (! -r results/output.txt) then  
   echo "                ***** No results to compare with *****"  
   if (! $?untested) set untested  
   set untested=($untested $dr)  
24   else   else
25    set config=NO    echo testoutput_for_prop: output.txt from model run was not readable 1>&2
26    set makedepend=NO    return 99
27    set compile=NO   fi
28    set execute=NO   if [ $debug -gt 0 ]; then
29    set exactmatch=NO    echo testoutput_for_prop: grep "$2" $1/results/output.txt 1>&2
30    set accuracy=-   fi
31    cd input   grep "$2" $1/results/output.txt | sed 's/.*=//' | nl > tmp2.txt
32    echo -n "  generating Makefile ..."   if [ $debug -gt 0 ]; then
33    ../../../tools/genmake -mods=../code >&! make.log    echo testoutput_for_prop: join tmp1.txt tmp2.txt 1>&2
34    if ($status == 0) set config=Yes   fi
35    echo " done."   join tmp1.txt tmp2.txt | awk '{print $1 " " $2 " " $3}' > tmp3.txt
36    echo -n "  make depend ..."   if [ $debug -gt 0 ]; then
37    make cleanlinks depend >>& make.log    echo testoutput_for_prop: compare_lines 1>&2
38    if ($status == 0) set makedepend=Yes   fi
39    echo " done."   compare_lines
40    echo -n "  make ..."   digits_of_similarity=$?
41    make >>& make.log   if [ $digits_of_similarity -eq 99 ]; then
42    if ($status) then    if [ $verbose -gt 0 ]; then
43     echo "               ***** An error occurred during make *****"     echo testoutput_for_prop: No comparison was available for \"$2\" 1>&2
44     cat make.log    fi
45     exit 1    digits_of_similarity=99
46    else   else
47     set compile=Yes    if [ $verbose -gt 0 ]; then
48    endif     echo There were $digits_of_similarity decimal places of similarity for \"$2\" 1>&2
49    echo " done."    fi
50    echo -n "  running model ..."   fi
51    ./mitgcmuv | & grep "D iters" > output.txt   rm tmp1.txt tmp2.txt tmp3.txt
52    if ($status == 0) then  
53      set execute=Yes   return $digits_of_similarity
54      echo " done."  }
55      sed 's/.*D iters, err =//' output.txt \  
56      | grep "   0    " \  dashnum()
57      > high.txt  {
58      grep "D iters" ../results/output.txt \  # dashnum n1 n2 n3 ...
59       | sed 's/.*D iters, err =//' \  #
60       | grep "   0    " \  #  print numbers using %3i format or "--" if number = 99
61       > oldhigh.txt  for num in $@
62      diff oldhigh.txt high.txt > /dev/null  do
63      if ($status) then   if [ $num = 99 ]; then
64        echo "  output differs:"    printf ' --'
65        diff oldhigh.txt high.txt   else
66        echo ""    printf '%3i' $num
67        @ lvl=0   fi
68        set accuracy='.'  done
69        set fail  }
70        echo -n Trying reduced accuracy  
71        while ($lvl <= $passaccuracy)  testoutput()
72          @ lvl+=1  {
73          echo -n " " $lvl  # testoutput diretory
74          sed s/{$accuracy}E/E/ high.txt > low.txt  #
75          sed s/{$accuracy}E/E/ oldhigh.txt > oldlow.txt  #  test output in "directory"
76          diff oldlow.txt low.txt > /dev/null  
77          if ($status == 0) then  if [ $debug -gt 0 ]; then
78            unset fail   echo testoutput: testoutput_for_prop $1 cg2d_init_res 1>&2
79            break  fi
80    testoutput_for_prop $1 "cg2d_init_res" "cg2d init. residual"; cg2dres=$?
81    if [ $debug -gt 0 ]; then
82     echo testoutput: cg2dres=$cg2dres 1>&2
83    fi
84    
85    if [ $longtest -gt 0 ]; then
86    testoutput_for_prop $1 "dynstat_theta_min" "theta minimum"; tmin=$?
87    testoutput_for_prop $1 "dynstat_theta_max" "theta maximum"; tmax=$?
88    testoutput_for_prop $1 "dynstat_theta_mean" "theta mean"; tmean=$?
89    testoutput_for_prop $1 "dynstat_theta_sd" "theta s.d."; tsd=$?
90    testoutput_for_prop $1 "dynstat_salt_min" "salt minimum"; smin=$?
91    testoutput_for_prop $1 "dynstat_salt_max" "salt maximum"; smax=$?
92    testoutput_for_prop $1 "dynstat_salt_mean" "salt mean"; smean=$?
93    testoutput_for_prop $1 "dynstat_salt_sd" "salt s.d."; ssd=$?
94    testoutput_for_prop $1 "dynstat_uvel_min" "U minimum"; umin=$?
95    testoutput_for_prop $1 "dynstat_uvel_max" "U maximum"; umax=$?
96    testoutput_for_prop $1 "dynstat_uvel_mean" "U mean"; umean=$?
97    testoutput_for_prop $1 "dynstat_uvel_sd" "U s.d."; usd=$?
98    testoutput_for_prop $1 "dynstat_vvel_min" "V minimum"; vmin=$?
99    testoutput_for_prop $1 "dynstat_vvel_max" "V maximum"; vmax=$?
100    testoutput_for_prop $1 "dynstat_vvel_mean" "V mean"; vmean=$?
101    testoutput_for_prop $1 "dynstat_vvel_sd" "V s.d."; vsd=$?
102    else
103    testoutput_for_prop $1 "dynstat_theta_min" "theta minimum"; tmin=$?
104    testoutput_for_prop $1 "dynstat_theta_max" "theta maximum"; tmax=$?
105    testoutput_for_prop $1 "dynstat_salt_min" "salt minimum"; smin=$?
106    testoutput_for_prop $1 "dynstat_salt_max" "salt maximum"; smax=$?
107    testoutput_for_prop $1 "dynstat_uvel_min" "U minimum"; umin=$?
108    testoutput_for_prop $1 "dynstat_uvel_max" "U maximum"; umax=$?
109    testoutput_for_prop $1 "dynstat_vvel_min" "V minimum"; vmin=$?
110    testoutput_for_prop $1 "dynstat_vvel_max" "V maximum"; vmax=$?
111    fi
112    
113    dashnum $cg2dres $tmin $tmax $tmean $tsd $smin $smax $smean $ssd \
114            $umin $umax $umean $usd $vmin $vmax $vmean $vsd
115    #printf '%3i' $cg2dres $tmin $tmax $tmean $tsd $smin $smax $smean $ssd \
116    #       $umin $umax $umean $usd $vmin $vmax $vmean $vsd
117    }
118    
119    genmakemodel()
120    {
121    # genmakemodel directory
122     ( cd $1;
123       if [ $quick -eq 0 -o ! -r Makefile ]; then
124        printf 'genmake ... ' 1>&2
125        ../../../tools/genmake -ieee -mods=../code > make.log 2>&1
126        if [ $? -ne 0 ]; then
127         tail make.log
128         echo genmakemodel: genmake failed 1>&2
129         return 1
130        else
131          echo succesful 1>&2
132        fi
133       fi
134     )
135    }
136    
137    makeclean()
138    {
139    # makedependmodel directory
140     ( cd $1;
141       if [ $clean -gt 0 ]; then
142        printf 'make clean ... ' 2>&1
143        make CLEAN >> make.log 2>&1
144        if [ $? -ne 0 ]; then
145          tail make.log
146          echo makeclean: make clean failed 1>&2
147          return 1
148        else
149          echo succesful 1>&2
150        fi
151       fi
152     )
153    }
154    
155    makedependmodel()
156    {
157    # makedependmodel directory
158     ( cd $1;
159       if [ $quick -eq 0 -o ! -r Makefile ]; then
160        printf 'make depend ... ' 1>&2
161        make cleanlinks >> make.log 2>&1
162        make depend >> make.log 2>&1
163        if [ $? -ne 0 ]; then
164          tail make.log
165          echo makemodel: make depend failed 1>&2
166          return 1
167        else
168          echo succesful 1>&2
169        fi
170       fi
171     )
172    }
173    
174    makemodel()
175    {
176    # makemodel directory
177     ( cd $1;
178       if [ -r Makefile ]; then
179        printf 'make ... ' 1>&2
180        make >> make.log 2>&1
181        if [ $? -ne 0 ]; then
182         tail make.log
183         echo failed 1>&2
184         return 1
185        else
186         echo succesful 1>&2
187        fi
188       fi
189     )
190    }
191    
192    runmodel()
193    {
194    # runmodel directory exe
195    #
196    #  runs the model "exe" in "directory" (exe is relative to directory)
197    
198     ( cd $1
199       if [ -x $2 ]; then
200        if [ ! -r output.txt -o $quick -eq 0 ]; then
201         echo runmodel: running... 1>&2
202         ( ./$2 > output.txt 2>&1 ) && return 0
203         return 1
204        else
205         echo runmodel: output.txt is newer than executable 1>&2
206         return 0
207        fi
208       else
209        echo runmodel: executable \"$1/$2\" is missing 1>&2
210        return 1
211       fi
212     )
213    }
214    
215    createcodelet()
216    {
217    # create codelet for comparing model output
218    cat > tmp_cmpnum.f <<EOFA
219          program cmpnum
220          implicit none
221          real*8 a,b,diff
222          integer linnum,best
223          best=-16
224      99  read(*,*,end=70,err=60) linnum,a,b
225          diff=0.5*(abs(a)+abs(b))
226    c     print *,a,b,diff,abs(a-b)/diff
227          if (diff.gt.1.e-12) then
228            diff=abs(a-b)/diff
229            if (diff.gt.0.) then
230    c         print *,int(log10(diff)),diff
231              linnum=int(log10(diff))
232              best=max(best,linnum)
233          endif          endif
         set accuracy=`echo $accuracy | sed 's/\./../'`  
       end  
       echo ""  
       if ($?fail ) then  
         if (! $?fails) set fails  
         set fails=($fails $dr)  
         echo "                        ***** FAIL *****"  
234        else        else
235          if (! $?passes) set passes          if (best.eq.-16.and.diff.ne.0.) best=-22
         set passes=($passes $dr)  
         echo ""  
         echo "                   ***** PASS (grade $lvl) *****"  
236        endif        endif
237        set accuracy=$lvl        goto 99
238      else    60  stop 'cmpnum: An error occured reading a,b'
239        set exactmatch=Yes    70  print *,-best
240        echo ""        end
241        echo Model passed at highest accuracy.  EOFA
242        echo ""  f77 tmp_cmpnum.f
243        echo "                        ***** PASS *****"  if [ -x ./a.out ]; then
244        if (! $?passes) set passes   return 0
245        set passes=($passes $dr)  else
246      endif   echo createcodelet: failed to compile codelet 1>&2
247     exit 1
248    fi
249    }
250    
251    formatresults()
252    {
253    # formatresults expt genmake depend make run results*
254    
255     nm=$1
256     printf '%s %s %s %s' $2 $3 $4 $5
257     shift; shift; shift; shift; shift;
258     printf '%3s' $@
259    
260     if [ $1 = '--' ]; then
261      printf ' N/O '
262     else
263      if [ $1 -gt 12 ]; then
264       printf ' pass'
265    else    else
266      echo " error"     printf ' FAIL'
267      echo "               ***** An error occured running the mode *****"    fi
268      tail output.txt   fi
269      exit 1   printf '  %s' $nm
270    endif   printf '\n'
271    cd ..  
272   endif  }
273   echo ""  
274   cd ..  show_help()
275  # Pretty summary  {
276   printf '  %s\t  %s\t  %s\t  %s\t  %s\t  %s\t%s\n' $config $makedepend $compile $execute $exactmatch $accuracy $dr >> summary.txt  cat - << EOF
277  end  $0 [-help] [-quick] [-verbose] dir1 [dir2] [...]
278  echo ==============================================================================   -help      Show this help message
279  echo ""   -quick     Skip "genmake" and "make depend" if the Makefile exists
280     -quiet     Reduce the amount of output
281     -verbose   Produce copious amounts of output
282     -debug     Produce even more output which will mean nothing to most
283     -clean     Do "make CLEAN" before compiling. This forces a complete rebuild.
284     -longtest  Compare numeric output for mean and s.d. of variables.
285    
286    Normal usage:
287     $0 *       Configure, compile, run and analyze in all experiment directories
288    EOF
289    }
290    
291    scandirs()
292    {
293    if [ $# -eq 0 ]; then
294     for arg in *
295      do
296       test -d $arg/input && echo $arg
297     done
298    else
299     echo $*
300    fi
301    }
302    
303    ###############################################################################
304    
305    # Main function
306    
307    # Default properties
308    debug=0
309    verbose=1
310    quick=0
311    clean=0
312    longtest=0
313    expts=''
314    
315    # Process arguments
316    for arg in $@
317    do
318     case $arg in
319       -quick) quick=1;;
320       -verbose) verbose=2;;
321       -debug) debug=1;;
322       -clean) clean=1;;
323       -longtest) longtest=1;;
324       -quiet) verbose=0;;
325       -help) show_help; exit 0;;
326       *) test -d $arg && expts=`echo $expts $arg`;;
327     esac
328    done
329    
330    #if [ ${#expts} -eq 0 ]; then
331    # echo Scanning all directories
332    # for arg in *
333    #  do
334    #   test -d $arg && expts=`echo $expts $arg`
335    # done
336    #fi
337    expts=`scandirs $expts`
338    
339    createcodelet
340    
341    if [ $longtest -gt 0 ]; then
342    cat << EOF > summary.txt
343                    T           S           U           V
344    C D M    c        m  s        m  s        m  s        m  s
345    n p a R  g  m  m  e  .  m  m  e  .  m  m  e  .  m  m  e  .
346    f n k u  2  i  a  a  d  i  a  a  d  i  a  a  d  i  a  a  d
347    g d e n  d  n  x  n  .  n  x  n  .  n  x  n  .  n  x  n  .
348    
349    EOF
350    else
351    cat << EOF > summary.txt
352                  T     S     U     V
353    C D M    c                        
354    n p a R  g  m  m  m  m  m  m  m  m
355    f n k u  2  i  a  i  a  i  a  i  a
356    g d e n  d  n  x  n  x  n  x  n  x
357    
358    EOF
359    fi
360    
361    # Now configue, make, run and test in each directory
362    for dir in $expts
363    do
364     if [ -r $dir/results/output.txt ]; then
365     echo -------------------------------------------------------------------------------
366     echo
367     echo Experiment: $dir
368     echo
369     unset genmake makedepend make run
370     if [ $longtest -gt 0 ]; then
371      results='-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --'
372     else
373      results='-- -- -- -- -- -- -- -- --'
374     fi
375     genmakemodel $dir/input && genmake=Y \
376     && makeclean $dir/input \
377     && makedependmodel $dir/input && makedepend=Y \
378     && makemodel $dir/input && make=Y \
379     && runmodel $dir/input mitgcmuv && run=Y \
380     && results=`testoutput $dir`
381     echo
382     formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results
383     echo
384     formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results >> summary.txt
385     fi
386    done
387    
388    rm tmp_cmpnum.f a.out
389    
390  echo "Summary:"  echo -------------------------------------------------------------------------------
391  echo ""  echo
392  cat summary.txt  cat summary.txt

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.12

  ViewVC Help
Powered by ViewVC 1.1.22