/[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.8 by adcroft, Fri Aug 3 20:18:40 2001 UTC revision 1.23 by adcroft, Mon May 19 19:34:27 2003 UTC
# Line 1  Line 1 
1  #!/bin/sh  #!/bin/sh
2    
 similar()  
 {  
 # similar digits a b  
 #  
 #  compare the floating point number a and b and successively reduced  
 #  truncation until a match is found  
  for digits in 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
  do  
    a=`printf '%22.'$digits'e\n' $1`  
    b=`printf '%22.'$digits'e\n' $2`  
    if [ $a = $b ]; then  
     if [ $verbose -gt 1 ]; then  
      echo $1 $2 $a 1>&2  
     fi  
     break  
    fi  
  done  
  return $digits  
 }  
   
3  compare_lines()  compare_lines()
4  {  {
 # compare_lines digits < file  
 #  
 #  read each line of file and test the 2nd and 3rd column values for  
 #  similarity based on the function similar()  
  worst_so_far=$1  
  while read linenum a b  
  do  
   if [ $debug -gt 0 ]; then  
    echo compare_lines: similar a=$a b=$b 1>&2  
   fi  
   similar $a $b  
   digits=$?  
   if [ $digits -lt $worst_so_far ]; then  
    worst_so_far=$digits  
   fi  
  done  
   if [ $debug -gt 0 ]; then  
    echo compare_lines: worst_so_far=$worst_so_far 1>&2  
   fi  
  return $worst_so_far  
 }  
   
 compare_lines2()  
 {  
5  # use codelet to compare lines  # use codelet to compare lines
6     if [ $verbose -gt 1 ]; then
7      cat tmp3.txt 1>&2
8     fi
9   return `./a.out < tmp3.txt`   return `./a.out < tmp3.txt`
10  }  }
11    
12  testoutput_for_prop()  testoutput_for_prop()
13  {  {
14  # testoutput_for_prop dir s1 label  # testoutput_for_prop dir s1 label subdir
15  #  #
16  #  compares files in $dir/input/output.txt and $dir/results.output.txt  #  compares files in $dir/$subdir/output.txt and $dir/results/output.txt
17  #  using search strings s1 and text label  #  using search strings s1 and text label
18    
19   if [ $debug -gt 0 ]; then   if [ $debug -gt 0 ]; then
20    echo testoutput_for_prop: grep "$2" $1/input/output.txt 1>&2    echo testoutput_for_prop: grep "$2" $1/$4/output.txt 1>&2
21   fi   fi
22   if [ -r $1/input/output.txt ]; then   if [ -r $1/$4/output.txt ]; then
23    grep "$2" $1/input/output.txt | sed 's/.*=//' | nl > tmp1.txt    grep "$2" $1/$4/output.txt | sed 's/.*=//' | nl > tmp1.txt
24      lncnt=`wc -l tmp1.txt | awk '{print $1}' `
25      if [ $lncnt -lt 3 ]; then
26       if [ $verbose -gt 0 ]; then
27        echo Not enough lines of output when searching for "$2" 1>&2
28       fi
29       return 99
30      fi
31   else   else
32    echo testoutput_for_prop: output.txt from model run was not readable 1>&2    echo testoutput_for_prop: output.txt from model run was not readable 1>&2
33    return 99    return 99
# Line 70  testoutput_for_prop() Line 36  testoutput_for_prop()
36    echo testoutput_for_prop: grep "$2" $1/results/output.txt 1>&2    echo testoutput_for_prop: grep "$2" $1/results/output.txt 1>&2
37   fi   fi
38   grep "$2" $1/results/output.txt | sed 's/.*=//' | nl > tmp2.txt   grep "$2" $1/results/output.txt | sed 's/.*=//' | nl > tmp2.txt
39      lncnt=`wc -l tmp2.txt | awk '{print $1}' `
40      if [ $lncnt -lt 3 ]; then
41       if [ $verbose -gt 0 ]; then
42        echo Not enough lines of output when searching for "$2" 1>&2
43       fi
44       return 99
45      fi
46   if [ $debug -gt 0 ]; then   if [ $debug -gt 0 ]; then
47    echo testoutput_for_prop: join tmp1.txt tmp2.txt 1>&2    echo testoutput_for_prop: join tmp1.txt tmp2.txt 1>&2
48   fi   fi
# Line 77  testoutput_for_prop() Line 50  testoutput_for_prop()
50   if [ $debug -gt 0 ]; then   if [ $debug -gt 0 ]; then
51    echo testoutput_for_prop: compare_lines 1>&2    echo testoutput_for_prop: compare_lines 1>&2
52   fi   fi
53   #compare_lines 99 < tmp3.txt   compare_lines
  compare_lines2  
54   digits_of_similarity=$?   digits_of_similarity=$?
55   if [ $digits_of_similarity -eq 99 ]; then   if [ $digits_of_similarity -eq 99 ]; then
56    if [ $verbose -gt 0 ]; then    if [ $verbose -gt 0 ]; then
# Line 112  done Line 84  done
84    
85  testoutput()  testoutput()
86  {  {
87  # testoutput diretory  # testoutput diretory subdir
88  #  #
89  #  test output in "directory"  #  test output in "directory"
90    
91  if [ $debug -gt 0 ]; then  if [ $debug -gt 0 ]; then
92   echo testoutput: testoutput_for_prop $1 cg2d_init_res 1>&2   echo testoutput: testoutput_for_prop $1 cg2d_init_res 1>&2
93  fi  fi
94  testoutput_for_prop $1 "cg2d_init_res" "cg2d init. residual"; cg2dres=$?  testoutput_for_prop $1 "cg2d_init_res" "cg2d init. residual" $2; cg2dres=$?
95  if [ $debug -gt 0 ]; then  if [ $debug -gt 0 ]; then
96   echo testoutput: cg2dres=$cg2dres 1>&2   echo testoutput: cg2dres=$cg2dres 1>&2
97  fi  fi
98    
99  if [ $testmore -gt 0 ]; then  if [ $longtest -gt 0 ]; then
100  testoutput_for_prop $1 "dynstat_theta_min" "theta minimum"; tmin=$?  testoutput_for_prop $1 "dynstat_theta_min" "theta minimum" $2; tmin=$?
101  testoutput_for_prop $1 "dynstat_theta_max" "theta maximum"; tmax=$?  testoutput_for_prop $1 "dynstat_theta_max" "theta maximum" $2; tmax=$?
102  testoutput_for_prop $1 "dynstat_theta_mean" "theta mean"; tmean=$?  testoutput_for_prop $1 "dynstat_theta_mean" "theta mean" $2; tmean=$?
103  testoutput_for_prop $1 "dynstat_theta_sd" "theta s.d."; tsd=$?  testoutput_for_prop $1 "dynstat_theta_sd" "theta s.d." $2; tsd=$?
104  testoutput_for_prop $1 "dynstat_salt_min" "salt minimum"; smin=$?  testoutput_for_prop $1 "dynstat_salt_min" "salt minimum" $2; smin=$?
105  testoutput_for_prop $1 "dynstat_salt_max" "salt maximum"; smax=$?  testoutput_for_prop $1 "dynstat_salt_max" "salt maximum" $2; smax=$?
106  testoutput_for_prop $1 "dynstat_salt_mean" "salt mean"; smean=$?  testoutput_for_prop $1 "dynstat_salt_mean" "salt mean" $2; smean=$?
107  testoutput_for_prop $1 "dynstat_salt_sd" "salt s.d."; ssd=$?  testoutput_for_prop $1 "dynstat_salt_sd" "salt s.d." $2; ssd=$?
108  testoutput_for_prop $1 "dynstat_uvel_min" "U minimum"; umin=$?  testoutput_for_prop $1 "dynstat_uvel_min" "U minimum" $2; umin=$?
109  testoutput_for_prop $1 "dynstat_uvel_max" "U maximum"; umax=$?  testoutput_for_prop $1 "dynstat_uvel_max" "U maximum" $2; umax=$?
110  testoutput_for_prop $1 "dynstat_uvel_mean" "U mean"; umean=$?  testoutput_for_prop $1 "dynstat_uvel_mean" "U mean" $2; umean=$?
111  testoutput_for_prop $1 "dynstat_uvel_sd" "U s.d."; usd=$?  testoutput_for_prop $1 "dynstat_uvel_sd" "U s.d." $2; usd=$?
112  testoutput_for_prop $1 "dynstat_vvel_min" "V minimum"; vmin=$?  testoutput_for_prop $1 "dynstat_vvel_min" "V minimum" $2; vmin=$?
113  testoutput_for_prop $1 "dynstat_vvel_max" "V maximum"; vmax=$?  testoutput_for_prop $1 "dynstat_vvel_max" "V maximum" $2; vmax=$?
114  testoutput_for_prop $1 "dynstat_vvel_mean" "V mean"; vmean=$?  testoutput_for_prop $1 "dynstat_vvel_mean" "V mean" $2; vmean=$?
115  testoutput_for_prop $1 "dynstat_vvel_sd" "V s.d."; vsd=$?  testoutput_for_prop $1 "dynstat_vvel_sd" "V s.d." $2; vsd=$?
116  else  else
117  testoutput_for_prop $1 "dynstat_theta_min" "theta minimum"; tmin=$?  testoutput_for_prop $1 "dynstat_theta_min" "theta minimum" $2; tmin=$?
118  testoutput_for_prop $1 "dynstat_theta_max" "theta maximum"; tmax=$?  testoutput_for_prop $1 "dynstat_theta_max" "theta maximum" $2; tmax=$?
119  testoutput_for_prop $1 "dynstat_salt_min" "salt minimum"; smin=$?  testoutput_for_prop $1 "dynstat_salt_min" "salt minimum" $2; smin=$?
120  testoutput_for_prop $1 "dynstat_salt_max" "salt maximum"; smax=$?  testoutput_for_prop $1 "dynstat_salt_max" "salt maximum" $2; smax=$?
121  testoutput_for_prop $1 "dynstat_uvel_min" "U minimum"; umin=$?  testoutput_for_prop $1 "dynstat_uvel_min" "U minimum" $2; umin=$?
122  testoutput_for_prop $1 "dynstat_uvel_max" "U maximum"; umax=$?  testoutput_for_prop $1 "dynstat_uvel_max" "U maximum" $2; umax=$?
123  testoutput_for_prop $1 "dynstat_vvel_min" "V minimum"; vmin=$?  testoutput_for_prop $1 "dynstat_vvel_min" "V minimum" $2; vmin=$?
124  testoutput_for_prop $1 "dynstat_vvel_max" "V maximum"; vmax=$?  testoutput_for_prop $1 "dynstat_vvel_max" "V maximum" $2; vmax=$?
125  fi  fi
126    
127  dashnum $cg2dres $tmin $tmax $tmean $tsd $smin $smax $smean $ssd \  dashnum $cg2dres $tmin $tmax $tmean $tsd $smin $smax $smean $ssd \
# Line 164  genmakemodel() Line 136  genmakemodel()
136   ( cd $1;   ( cd $1;
137     if [ $quick -eq 0 -o ! -r Makefile ]; then     if [ $quick -eq 0 -o ! -r Makefile ]; then
138      printf 'genmake ... ' 1>&2      printf 'genmake ... ' 1>&2
139      ../../../tools/genmake -mods=../code > make.log 2>&1      if [ $ieee -eq 0 ]; then
140         ../../../tools/genmake -mods=../code > make.log 2>&1
141        else
142         ../../../tools/genmake -ieee -mods=../code > make.log 2>&1
143        fi
144      if [ $? -ne 0 ]; then      if [ $? -ne 0 ]; then
145       tail make.log       tail make.log
146       echo makemodel: genmake failed 1>&2       echo genmakemodel: genmake failed 1>&2
147       return 1       return 1
148      else      else
149        echo succesful 1>&2        echo succesful 1>&2
# Line 176  genmakemodel() Line 152  genmakemodel()
152   )   )
153  }  }
154    
155    makecleancompile()
156    {
157    # makecleancompile directory
158     ( cd $1;
159       if [ $force -gt 0 ]; then
160        rm -f output.txt
161        printf 'make clean ... ' 2>&1
162        make CLEAN >> make.log 2>&1
163        if [ $? -ne 0 ]; then
164          tail make.log
165          echo makecleancompile: make clean failed 1>&2
166          return 1
167        else
168          echo succesful 1>&2
169        fi
170       fi
171     )
172    }
173    
174    makecleanupafter()
175    {
176    # makeupafter directory
177     ( cd $1;
178       if [ $clean -gt 0 ]; then
179        rm -f output.txt
180        printf 'make clean ... ' 2>&1
181        make CLEAN >> make.log 2>&1
182        if [ $? -ne 0 ]; then
183          tail make.log
184          echo makeupafter: make clean failed 1>&2
185          return 1
186        else
187          echo succesful 1>&2
188        fi
189       fi
190     )
191    }
192    
193  makedependmodel()  makedependmodel()
194  {  {
195  # makedependmodel directory  # makedependmodel directory
# Line 213  makemodel() Line 227  makemodel()
227   )   )
228  }  }
229    
230    linkdata()
231    {
232    # linkdata flag
233    # symbolically link data files to run directory
234     if [ $1 -ne 0 ]; then
235    # if [ ! -r $2 ]; then
236    #  mkdir $2
237    # fi
238      ( cd $2; ln -sf ../input/* .)
239     fi
240    }
241    
242  runmodel()  runmodel()
243  {  {
244  # runmodel directory exe  # runmodel directory exe
# Line 221  runmodel() Line 247  runmodel()
247    
248   ( cd $1   ( cd $1
249     if [ -x $2 ]; then     if [ -x $2 ]; then
250      if [ ! -r output.txt -o $quick -eq 0 ]; then      if [ $quick -eq 0 ]; then
251       echo runmodel: running... 1>&2       rm -f output.txt
      ( ./$2 > output.txt 2>&1 ) && return 0  
      return 1  
     else  
      echo runmodel: output.txt is newer than executable 1>&2  
      return 0  
252      fi      fi
253     else      printf 'runmodel: ' 1>&2
254      echo runmodel: executable \"$1/$2\" is missing 1>&2       make output.txt && return 0
255      return 1       return 1
256     fi     fi
257   )   )
258  }  }
# Line 247  cat > tmp_cmpnum.f <<EOFA Line 268  cat > tmp_cmpnum.f <<EOFA
268        best=-16        best=-16
269    99  read(*,*,end=70,err=60) linnum,a,b    99  read(*,*,end=70,err=60) linnum,a,b
270        diff=0.5*(abs(a)+abs(b))        diff=0.5*(abs(a)+abs(b))
271        if (diff.gt.0.) then  c     print *,a,b,diff,abs(a-b)/diff
272          if (diff.gt.1.e-12) then
273          diff=abs(a-b)/diff          diff=abs(a-b)/diff
274          if (diff.gt.0.) then          if (diff.gt.0.) then
275  c         print *,int(log10(diff)),diff  c         print *,int(log10(diff)),diff
276            linnum=int(log10(diff))            linnum=int(log10(diff))
277            best=max(best,linnum)            best=max(best,linnum)
 c       else  
 c         print *,-16  
278          endif          endif
279  c     else        else
280  c       diff=0.          if (best.eq.-16.and.diff.ne.0.) best=-22
 c       print *,-16  
281        endif        endif
282        goto 99        goto 99
283    60  stop 'cmpnum: An error occured reading a,b'    60  stop 'cmpnum: An error occured reading a,b'
# Line 305  $0 [-help] [-quick] [-verbose] dir1 [dir Line 324  $0 [-help] [-quick] [-verbose] dir1 [dir
324   -quick     Skip "genmake" and "make depend" if the Makefile exists   -quick     Skip "genmake" and "make depend" if the Makefile exists
325   -quiet     Reduce the amount of output   -quiet     Reduce the amount of output
326   -verbose   Produce copious amounts of output   -verbose   Produce copious amounts of output
327     -debug     Produce even more output which will mean nothing to most
328     -force     Do "make CLEAN" before compiling. This forces a complete rebuild.
329     -clean     Do "make CLEAN" after compiling and testing.
330     -shorttest Don't compare numeric output for mean and s.d. of variables.
331     -noieee    By default, $0 uses the -ieee option for genmake. This turns it off.
332     -cleanup   Aggresively removes all model output, executables and object files
333                and then exits. Use with care.
334    
335  Normal usage:  Normal usage:
336   $0 *       Configure, compile, run and analyze in all experiment directories   $0 *       Configure, compile, run and analyze in all experiment directories
337  EOF  EOF
338  }  }
339    
340    scandirs()
341    {
342    if [ $# -eq 0 ]; then
343     for arg in *
344      do
345       test -d $arg/input && echo $arg
346     done
347    else
348     echo $*
349    fi
350    }
351    
352    clean_up()
353    {
354    # Find all executables, object files, CPP'd source and model output
355    # and DELETE it.
356    for opt in '-name "mitgcmuv*"' '-name "*.o"' '-name "*.f"' '-name "*.c"' '-name "fort.*"' '-name "make.log"' '-path *results -prune -o -name "*.meta"' '-path *results -prune -o -name "*.data"' '-type l'
357     do
358       echo Cleaning: find . $opt -exec rm {} \;
359       find . $opt -exec rm {} \;
360    done
361    }
362    
363    ###############################################################################
364    ###############################################################################
365  ###############################################################################  ###############################################################################
366    
367  # Main function  # Main function
# Line 319  EOF Line 370  EOF
370  debug=0  debug=0
371  verbose=1  verbose=1
372  quick=0  quick=0
373  testmore=0  force=0
374    clean=0
375    ieee=1
376    longtest=1
377  expts=''  expts=''
378    
379  # Process arguments  # Process arguments
380  for arg in $@  for arg in $@
381  do  do
382   case $arg in   case $arg in
383       -cleanup) clean_up; exit 0;;
384     -quick) quick=1;;     -quick) quick=1;;
385     -verbose) verbose=2;;     -verbose) verbose=2;;
386     -debug) debug=1;;     -debug) debug=1;;
387     -testmore) testmore=1;;     -force) force=1;;
388       -clean) clean=1;;
389       -noieee) ieee=0;;
390       -shorttest) longtest=0;;
391     -quiet) verbose=0;;     -quiet) verbose=0;;
392     -help) show_help; exit 0;;     -help) show_help; exit 0;;
393       -*) echo Unrecognized option:$arg; exit 9;;
394     *) test -d $arg && expts=`echo $expts $arg`;;     *) test -d $arg && expts=`echo $expts $arg`;;
395   esac   esac
396  done  done
397    
398  if [ ${#expts} -eq 0 ]; then  if [ $force -gt 0 -a $quick -gt 0 ]; then
399   echo Scanning all directories   echo You specified -quick and -force together which conflict.
400   for arg in *   echo Please specify either -quick or -force or neither but not both.
401    do   exit 1
    test -d $arg && expts=`echo $expts $arg`  
  done  
402  fi  fi
403    
404    #if [ ${#expts} -eq 0 ]; then
405    # echo Scanning all directories
406    # for arg in *
407    #  do
408    #   test -d $arg && expts=`echo $expts $arg`
409    # done
410    #fi
411    expts=`scandirs $expts`
412    
413  createcodelet  createcodelet
414    
415  if [ $testmore -eq 0 ]; then  if [ $longtest -gt 0 ]; then
416  cat << EOF > summary.txt  cat << EOF > summary.txt
417                  T           S           U           V                  T           S           U           V
418  C D M    c        m  s        m  s        m  s        m  s  C D M    c        m  s        m  s        m  s        m  s
# Line 375  do Line 441  do
441   echo Experiment: $dir   echo Experiment: $dir
442   echo   echo
443   unset genmake makedepend make run   unset genmake makedepend make run
444   results='-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --'   if [ $longtest -gt 0 ]; then
445   results='-- -- -- -- -- -- -- -- --'    results='-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --'
446   genmakemodel $dir/input && genmake=Y \   else
447   && makedependmodel $dir/input && makedepend=Y \    results='-- -- -- -- -- -- -- -- --'
448   && makemodel $dir/input && make=Y \   fi
449   && runmodel $dir/input mitgcmuv && run=Y \   if [ -r $dir/build ]; then
450   && results=`testoutput $dir`    seperatebuilddir=1
451      builddir=build
452      rundir=build
453      (cd $dir/input; rm -f *.{o,f,c,F} work* output.txt Make* make.log; )
454      (cd $dir/build; ln -sf ../input/* .)
455     else
456      seperatebuilddir=0
457      builddir=input
458      rundir=input
459     fi
460     genmakemodel $dir/$builddir && genmake=Y \
461     && makecleancompile $dir/$builddir \
462     && makedependmodel $dir/$builddir && makedepend=Y \
463     && makemodel $dir/$builddir && make=Y \
464     && linkdata $seperatebuilddir $dir/$rundir \
465     && runmodel $dir/$builddir mitgcmuv && run=Y \
466     && results=`testoutput $dir $rundir` \
467     && makecleanupafter $dir/$builddir
468   echo   echo
469   formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results   formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results
470   echo   echo

Legend:
Removed from v.1.8  
changed lines
  Added in v.1.23

  ViewVC Help
Powered by ViewVC 1.1.22