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

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.110

  ViewVC Help
Powered by ViewVC 1.1.22