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

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.108

  ViewVC Help
Powered by ViewVC 1.1.22