/[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.14 by edhill, Fri Nov 7 21:32:19 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$  #  $Name$
# Line 11  usage() Line 11  usage()
11      echo      echo
12      echo "where possible OPTIONS are:"      echo "where possible OPTIONS are:"
13      echo "  (-help|-h)               print usage"      echo "  (-help|-h)               print usage"
14      echo "  (-mpi)                   use MPI input files"      echo "  (-mth)                   run multi threaded (using eedata.mth)"
15        echo "  (-mpi)                   compile and run using MPI"
16      echo "  (-ieee|-noieee)          if possible, use IEEE compiler flags"      echo "  (-ieee|-noieee)          if possible, use IEEE compiler flags"
17      echo "  (-optfile=|-of=)STRING   list of optfiles to use"      echo "                             (DEF=\"-ieee\")"
18      echo "  (-a|-addr)STRING         list of email recipients"      echo "  (-of=|-optfile=)STRING   list of optfiles to use"
19      echo "                             (DEF=\"edhill@mitgcm.org\")"      echo "  (-a|-addr) STRING        list of email recipients"
20      echo "  (-t|-tdir)STRING         list of test dirs to use"      echo "                             (DEF=\"\" no email is sent)"
21      echo "                             (DEF=\"\" which builds all)"      echo "  (-t|-tdir) STRING        list of group and/or exp. dirs to test"
22      echo "  (-b|-bash)STRING         location of \"bash\" executable"      echo "                             (recognized groups: basic, tutorials)"
23      echo "                             (DEF=\"\" for \"/bin/bash\")"      echo "                             (DEF=\"\" which test all)"
24      echo "  (-command)STRING         command to run"      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\")"      echo "                             (DEF=\"make output.txt\")"
32      echo "  (-m|-make)STRING         command to use for \"make\""      echo "  (-m|-make) STRING        command to use for \"make\""
33      echo "                             (DEF=\"make\")"      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\""      echo "  (-clean)                 *ONLY* run \"make CLEAN\""
42      echo "  (-quick|-q)              same as \"-nogenmake -noclean -nodepend\""      echo "  (-quick|-q)              same as \"-nogenmake -noclean -nodepend\""
43      echo "  (-nogenmake|-ng)         skip the genmake stage"      echo "  (-nogenmake|-ng)         skip the genmake stage"
44      echo "  (-noclean|-nc)           skip the \"make clean\" stage"      echo "  (-noclean|-nc)           skip the \"make clean\" stage"
45      echo "  (-nodepend|-nd)          skip the \"make depend\" stage"      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      echo
51      echo "and where STRING follows a whitespace-delimited format"      echo "and where STRING can be a whitespace-delimited list"
52      echo "such as:"      echo "such as:"
53        echo
54      echo "  -t 'exp0 exp2 exp3' "      echo "  -t 'exp0 exp2 exp3' "
55      echo "  -addr='abc@123.com testing@home.org'"      echo "  -addr='abc@123.com testing@home.org'"
56      echo      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
60      exit 1      exit 1
61  }  }
62    
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          fi
76          echo -n "building mpack...  "          printf "building mpack...  "
77          ( cd $MPACKDIR && ./configure && $MAKE ) > build_mpack.out 2>&1          if test "x$CC" = x ; then
78                export CC=cc
79            fi
80            ( cd $MPACKDIR && ./configure && $MAKE ) > tr_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
155        if [ $verbose -gt 1 ]; then
156            cat tmp3.txt 1>&2
157      fi      fi
158      compare_lines      echo "-1" >> tmp3.txt
159      digits_of_similarity=$?      # 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      testoutput_for_prop $1 "dynstat_theta_min" "theta minimum" $2; tmin=$?          # remove 1rst var and expand the list: + => min max mean s.d
216      testoutput_for_prop $1 "dynstat_theta_max" "theta maximum" $2; tmax=$?          listVar=`echo $listChk | sed 's/ [a-zA-Z0-9]*+/&mn &mx &av &sd/g' \
217      testoutput_for_prop $1 "dynstat_theta_mean" "theta mean" $2; tmean=$?                                 | sed 's/+//g' | sed "s/^$sVar//"`
218      testoutput_for_prop $1 "dynstat_theta_sd" "theta s.d." $2; tsd=$?          if [ $debug -gt 0 ]; then echo "testoutput_run: listVar(I)='$listVar'" 1>&2 ; fi
219      testoutput_for_prop $1 "dynstat_salt_min" "salt minimum" $2; smin=$?          for ii in 1 2 3 4 5 6 7 8 9 ; do
220      testoutput_for_prop $1 "dynstat_salt_max" "salt maximum" $2; smax=$?            tst=`eval 'echo "$HAVE_PTR0'$ii'"'`
221      testoutput_for_prop $1 "dynstat_salt_mean" "salt mean" $2; smean=$?           #echo "-- ptr test=" $tst "number of var=" `echo $listVar | awk '{print NF}'` 1>&2
222      testoutput_for_prop $1 "dynstat_salt_sd" "salt s.d." $2; ssd=$?            if test "x$tst" != xt ; then listVar=`echo "$listVar" | sed "s/ pt$ii..//g"` ; fi
223      testoutput_for_prop $1 "dynstat_uvel_min" "U minimum" $2; umin=$?          done
224      testoutput_for_prop $1 "dynstat_uvel_max" "U maximum" $2; umax=$?          tst=`echo $sVar $listVar | awk '{ for(i=2;i<=NF;i++){t+=($i==$1)}; print t }'`
225      testoutput_for_prop $1 "dynstat_uvel_mean" "U mean" $2; umean=$?          if test $tst != 1 ; then
226      testoutput_for_prop $1 "dynstat_uvel_sd" "U s.d." $2; usd=$?            if test $tst = 0 ; then echo "==> WARNING: selected var >$sVar< not found" 1>&2
227      testoutput_for_prop $1 "dynstat_vvel_min" "V minimum" $2; vmin=$?                   else echo "==> WARNING: found selected var >$sVar< $tst times" 1>&2 ; fi
228      testoutput_for_prop $1 "dynstat_vvel_max" "V maximum" $2; vmax=$?            echo "==> WARNING: in checked list:" $listVar 1>&2
229      testoutput_for_prop $1 "dynstat_vvel_mean" "V mean" $2; vmean=$?          #- put it back once:
230      testoutput_for_prop $1 "dynstat_vvel_sd" "V s.d." $2; vsd=$?            listVar=" $sVar "`echo "$listVar " | sed "s/ $sVar / /g"`
231                fi
232      dashnum $cg2dres $tmin $tmax $tmean $tsd $smin $smax $smean $ssd \          if [ $debug -gt 0 ]; then echo "testoutput_run: listVar(M)='$listVar'" 1>&2 ; fi
233          $umin $umax $umean $usd $vmin $vmax $vmean $vsd          echo "listVar='$listVar'" > $CDIR"/summary.txt"
234            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()
# Line 183  genmakemodel() Line 308  genmakemodel()
308      if test "x$NOGENMAKE" = xt ; then      if test "x$NOGENMAKE" = xt ; then
309          echo "genmake skipped!"          echo "genmake skipped!"
310      else      else
311          GENMAKE2="$BASH ../../../tools/genmake2"          if test "x$BASH" = x ; then
312                GENMAKE2="../../../tools/genmake2"
313            else
314                GENMAKE2="$BASH ../../../tools/genmake2 -bash $BASH"
315            fi
316          (          (
317              cd $1;              cd $1;
318              command="$GENMAKE2  -ds -m $MAKE --mods=../code"              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              if test "x$OPTFILE" != xNONE ; then
325                  command="$command --optfile=$OPTFILE"                  command="$command --optfile=$OPTFILE"
                 # echo "  command=\"$command\""  
326              fi              fi
327              if test "x$IEEE" != x ; then              if test "x$IEEE" != x ; then
328                  command="$command -ieee"                  command="$command -ieee"
329              fi              fi
330              # echo "command: \"$command\""              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              printf 'genmake ... ' 1>&2
344              $command > make.log 2>&1              $command > make.log 2>&1
345              RETVAL=$?              RETVAL=$?
346              for i in genmake_state genmake_optfile genmake_local Makefile ; do              #  Reduce the size of the testing emails!
347                  if test -r $i ; then              head -100 Makefile > $CDIR/Makefile_head
                     cp $i $CDIR  
                 fi  
             done  
348              if test "x$RETVAL" != x0 ; then              if test "x$RETVAL" != x0 ; then
349                  tail make.log                  tail make.log
350                  echo "genmakemodel: genmake failed" 1>&2                  echo "genmakemodel: genmake failed" 1>&2
351                  cp make.log $CDIR                  cp genmake_* make.log $CDIR
352                  return 1                  return 1
353              else              else
354                  echo "succesful" 1>&2                  echo "successful" 1>&2
355              fi              fi
356          )          )
357      fi      fi
# Line 219  makeclean() Line 361  makeclean()
361  {  {
362      # makeclean directory      # makeclean directory
363      if test "x$NOCLEAN" = xt ; then      if test "x$NOCLEAN" = xt ; then
364          echo "make CLEAN skipped!"          echo "make Clean skipped!"
365      else      else
366          (          (
367              cd $1;              cd $1;
368              if test -e output.txt ; then              #if test -e $OUTPUTFILE ; then rm -f $OUTPUTFILE ; fi
                 rm -f output.txt  
             fi  
             printf 'make CLEAN ... ' 2>&1  
369              if test -r Makefile ; then              if test -r Makefile ; then
370                  $MAKE CLEAN >> make.log 2>&1                  printf 'clean build-dir: make Clean ... ' 2>&1
371                    $MAKE Clean >> make.log 2>&1
372                  RETVAL=$?                  RETVAL=$?
373                  if test "x$RETVAL" != x0 ; then                  if test "x$RETVAL" != x0 ; then
374                      tail make.log                      tail make.log
375                      echo "makeclean: \"make CLEAN\" failed" 1>&2                      echo "makeclean: \"make Clean\" failed" 1>&2
376                      cp make.log $CDIR"/make.log"                      cp make.log $CDIR"/make.log"
377                      return 1                      return 1
378                  fi                  fi
379              fi              fi
380              echo succesful 1>&2              echo successful 1>&2
381                exit 0
382            )
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              exit 0
405          )          )
406      fi      fi
# Line 260  makedependmodel() Line 423  makedependmodel()
423                  cp make.log $CDIR"/make.log"                  cp make.log $CDIR"/make.log"
424                  return 1                  return 1
425              else              else
426                  echo succesful 1>&2                  echo successful 1>&2
427              fi              fi
428          )          )
429      fi      fi
# Line 273  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 281  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 test "x$1" = x1 ; then      if test -d $1 ; then
515          (          (
516              cd $2              cd $1 ; shift
517              files=`( cd ../input ; ls -1 | grep -v CVS )`              if test -r "../"$1"/eedata.mth" ; then
518              for i in $files ; do              # found eedata.mth in 1rst input dir and it is readable
519                  if test ! -d "../input/"$i ; then                  if test "x$MULTI_THREAD" = "xt" ; then
520                      ln -sf "../input/"$i $i                  # 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                  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              done
551          )          )
552      fi      fi
# Line 309  runmodel() Line 556  runmodel()
556  {  {
557      # runmodel directory      # runmodel directory
558      #      #
559      #  runs "$COMMAND" in "directory"      #  runs "$COMMAND in "directory"
560      #  (where "$COMMAND" is relative to "directory")      #  (where "$COMMAND" is relative to "directory")
561      (      (
562          cd $1          cd $1
563          printf 'runmodel: ' 1>&2          printf 'runmodel in %s ...' $1 1>&2
564          # make output.txt          # make output.txt
565          $COMMAND          echo
566          RETVAL=$?          if test -L $EXECUTABLE -a -x "../"$builddir"/"$EXECUTABLE ; then
567          if test "x$RETVAL" = x0 ; then              diff -q $EXECUTABLE "../"$builddir"/"$EXECUTABLE > /dev/null 2>&1
568              cp output.txt $CDIR"/output.txt"              outD=$? ; if test $outD != 0 ; then rm -f $EXECUTABLE ; rm -f run.log ; fi
569            fi
570            if test ! -x $EXECUTABLE -a -x "../"$builddir"/"$EXECUTABLE ; then
571                echo " link" $EXECUTABLE "from dir ../"$builddir > run.log_00
572                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
588                    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
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              return 0
610          else          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              return 1
616          fi          fi
617      )      )
# Line 330  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 374  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 390  formatresults() Line 699  formatresults()
699            
700  }  }
701    
 show_help()  
 {  
     cat - << EOF  
 $0 [-help] [-quick] [-verbose] dir1 [dir2] [...]  
   
  -help|-h      Show this help message  
  -quiet     Reduce the amount of output  
  -verbose   Produce copious amounts of output  
  -debug     Produce even more output which will mean nothing to most  
  -force     Do "make CLEAN" before compiling. This forces a complete rebuild.  
  -clean     Do "make CLEAN" after compiling and testing.  
  -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
# Line 433  clean=0 Line 721  clean=0
721  expts=''  expts=''
722  # ieee=1  # ieee=1
723    
724  IEEE=  IEEE=true
725  if test "x$MITGCM_IEEE" != x ; then  if test "x$MITGCM_IEEE" != x ; then
726      IEEE=$MITGCM_IEEE      IEEE=$MITGCM_IEEE
727  fi  fi
# Line 444  QUICK=f Line 732  QUICK=f
732  NOGENMAKE=f  NOGENMAKE=f
733  NOCLEAN=f  NOCLEAN=f
734  NODEPEND=f  NODEPEND=f
735    POSTCLEAN=f
736    
737  BASH=  BASH=
738  OPTFILE=NONE  OPTFILE=NONE
739  ADDRESSES=  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="make output.txt"  COMMAND=
746  MAKE=make  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  MPI=f
754    MULTI_THREAD=f
755    OUTDIR=
756    DELDIR=
757    
758  echo -n "parsing options...  "  ADM=
759    
760    # 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 489  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=*)
# Line 504  for ac_option ; do Line 816  for ac_option ; do
816          -make=* | --make=*)          -make=* | --make=*)
817              MAKE=$ac_optarg ;;              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)          -clean | --clean)
836              CLEANUP=t ;;              CLEANUP=t ; DELDIR=t ;;
837    
838          -quick | --quick | -q | --q)          -quick | --quick | -q | --q)
839              QUICK=t ;;              QUICK=t ;;
# Line 516  for ac_option ; do Line 844  for ac_option ; do
844          -nodepend | --nodepend | -nd | --nd)          -nodepend | --nodepend | -nd | --nd)
845              NODEPEND=t ;;              NODEPEND=t ;;
846    
847          -mpi) MPI=true ;;          -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 ;;          -ieee) IEEE=true ;;
857          -noieee) IEEE= ;;          -noieee) IEEE= ;;
# Line 525  for ac_option ; do Line 860  for ac_option ; do
860          -debug) debug=1 ;;          -debug) debug=1 ;;
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 545  if test "x$QUICK" = xt ; then Line 888  if test "x$QUICK" = xt ; then
888      NODEPEND=t      NODEPEND=t
889  fi  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  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  if test "x$OPTFILE" = xNONE -a "x$MITGCM_OF" != x ; then
946      OPTFILE=$MITGCM_OF      OPTFILE=$MITGCM_OF
947  fi  fi
948    
949  echo "OK"  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
956    
957    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 575  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  echo -n "Start time:  " >> $SUMMARY  printf "Start time:  " >> $SUMMARY
1007  date > $SUMMARY  start_date=`date`
1008  date > dfile  echo $start_date > $SUMMARY
 cat << EOF >> $SUMMARY  
                 T           S           U           V  
 G D M    c        m  s        m  s        m  s        m  s  
 E p a R  g  m  m  e  .  m  m  e  .  m  m  e  .  m  m  e  .  
 N n k u  2  i  a  a  d  i  a  a  d  i  a  a  d  i  a  a  d  
 2 d e n  d  n  x  n  .  n  x  n  .  n  x  n  .  n  x  n  .  
   
 EOF  
   
 NDIR=0  
1009    
1010  of_path=  of_path=
1011  if test "x$OPTFILE" != xNONE ; then  if test "x$OPTFILE" != xNONE ; then
# Line 605  if test "x$OPTFILE" != xNONE ; then Line 1019  if test "x$OPTFILE" != xNONE ; then
1019          fi          fi
1020          file=${OPTFILE##*/}          file=${OPTFILE##*/}
1021          OPTFILE=$of_path/$file          OPTFILE=$of_path/$file
1022            cp $OPTFILE $DRESULTS
1023            echo >> $SUMMARY
1024            echo "  OPTFILE=$OPTFILE" >> $SUMMARY
1025      else      else
1026          echo          echo | tee $SUMMARY
1027          echo "WARNING: can't read OPTFILE=\"$OPTFILE\" but will try to use it..."          echo "ERROR: can't read OPTFILE=\"$OPTFILE\"" | tee $SUMMARY
1028            exit 1
1029      fi      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  fi
1035  echo  echo
 echo "OPTFILE=$OPTFILE" >> $SUMMARY  
1036  echo >> $SUMMARY  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
1077    fi
1078    
1079  #  ...and each test directory...  #  ...and each test directory...
1080  for dir in $TESTDIRS ; do  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      #  Cleanup only!      #  Cleanup only!
1093      if test "x$CLEANUP" = xt ; then      if test "x$CLEANUP" = xt ; then
1094          if test -r $dir/build/Makefile ; then          if test -r $BUILD_DIR/Makefile ; then
1095              ( cd $dir/build ; make CLEAN )              echo '  ------  clean dir:' $dir/build
1096                ( cd $BUILD_DIR ; make CLEAN )
1097          fi          fi
1098          if test -r $dir/input/Makefile ; then          if test -d $dir/$rundir/CVS ; then
1099              ( cd $dir/input ; make CLEAN )              echo '  ------  clean dir:' $dir/$rundir
1100                run_clean $dir/$rundir
1101          fi          fi
1102            (
1103                cd $dir
1104                rm -rf tr_run.*
1105            )
1106          continue          continue
1107      fi      fi
1108    
1109      #  Verify that the testdir exists and contains previous      #  Verify that the testdir exists and contains previous
1110      #  results in the correct location--or skip this directory!      #  results in the correct location--or skip this directory!
1111      if test ! -r $dir"/results/output.txt" ; then      fout=$dir"/results/"$ref_outp
1112          echo "can't read \"$dir/results/output.txt\" -- skipping $dir"      if test ! -r $fout ; then
1113            echo "can't read \"$fout\" -- skipping $dir"
1114          continue          continue
1115      fi      fi
1116        if test "x$ADM" = x ; then
1117      echo "-------------------------------------------------------------------------------"          check_for_add_mon_output  $fout
     echo  
     echo "Experiment:  $dir"  
     echo  
     unset genmake makedepend make run  
     results='-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --'  
   
     builddir="input"  
     rundir="input"  
     use_seperate_build=0  
     if test -d $dir/build -a -r $dir/build ; then  
         builddir="build"  
         rundir="build"  
         use_seperate_build=1  
         linkdata $use_seperate_build $dir/$rundir  
1118      fi      fi
       
     CODE_DIR=$dir/code  
     BUILD_DIR=$dir/$builddir  
     MPI_FILES="CPP_EEOPTIONS.h_mpi SIZE.h_mpi"  
     NOMPI_FILES="CPP_EEOPTIONS.h_nompi SIZE.h_nompi"  
1119    
1120      #  Is this an MPI run?      # Check for additional types of monitor output
1121      if test "x$MPI" = xt ; then  
1122          FILES=$MPI_FILES      if test ! -r $CODE_DIR"/SIZE.h_mpi" -a "x$MPI" = "xt" ; then
1123          endings="_mpi"          echo "can't find \"$CODE_DIR/SIZE.h_mpi\" -- skipping $dir"
1124      else          continue
         FILES=$NOMPI_FILES  
         endings="_nompi"  
1125      fi      fi
1126            if test ! -r $dir"/input/eedata.mth" -a "x$MULTI_THREAD" = "xt" ; then
1127      #  Check to see that we have the files          echo "can't find \"$dir/input/eedata.mth\" -- skipping $dir"
     have_files=t  
     for i in $FILES ; do  
         if test ! -r $CODE_DIR/$i ; then  
             echo "Warning: can't read file $CODE_DIR/$i"  
             have_files=f  
         fi  
     done  
     if test "x$have_files" != xt -a "x$MPI" = xt ; then  
         echo "Skipping $dir due to lack of input files (see above warning)"  
1128          continue          continue
1129      fi      fi
1130        
1131      #  If we have the $FILES and they differ, copy the $FILES to $BUILD_DIR      #  Check whether there are "extra runs" for this testdir
1132      if test "x$have_files" = xt ; then      extra_runs=
1133          for i in $FILES ; do      ex_run_dirs=`( cd $dir ; echo $inputdir.* )`
1134              sstr="s|$endings||"      #echo "ex_run_dirs='$ex_run_dirs'"
1135              name=`echo $i | sed -e $sstr `      for exd in $ex_run_dirs ; do
1136              cmp $CODE_DIR/$i $BUILD_DIR/$name > /dev/null 2>&1          name=`echo $exd | sed -e "s/$inputdir\.//"`
1137              RETVAL=$?          refExOut=`echo $ref_outp | sed "s/\./.${name}./"`
1138              if test "x$RETVAL" != x0 ; then          outf="$dir/results/$refExOut"
1139                  cp $CODE_DIR/$i $BUILD_DIR/$name          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              fi
1148          done          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      fi
1158            echo
1159        unset genmake makedepend make run
1160        results=$EMPTY_RESULTS
1161    
1162      #  Create an output dir for each OPTFILE/tdir combination      #  Create an output dir for each OPTFILE/tdir combination
1163      CDIR=$DRESULTS"/"$DRESULTS"_"$NDIR      rel_CDIR=$DRESULTS"/"$dir
1164      mkdir $CDIR      mkdir $rel_CDIR
1165      CDIR=`pwd`"/$CDIR"      CDIR=`pwd`"/$rel_CDIR"
1166            
1167      if test "x$CLEANUP" = xt ; then      if test "x$CLEANUP" = xt ; then
1168          makeclean $dir/$builddir          echo '====>>> this is to check that we never go through this part <<< ==='
1169            makeclean $dir/$builddir \
1170                && run_clean $dir/$rundir
1171      else      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 $use_seperate_build $dir/$rundir \              && linkdata $dir/$rundir $inputdir input \
1179              && runmodel $dir/$rundir && run=Y \              && runmodel $dir/$rundir && run=Y \
1180              && results=`testoutput $dir $rundir`              && results=`testoutput_run $dir $rundir $ref_outp`
1181      fi      fi
1182            
1183      echo      echo
1184      formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} \          fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1185          ${run:-N} $results          echo
1186      echo          echo "$fres" | sed 's/ 99/ --/g' | sed 's/  > />/' | sed 's/  < /</' >> $SUMMARY
1187      formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} \          touch $CDIR"/summary.txt"
1188          ${run:-N} $results >> $SUMMARY          echo "fresults='$fres'" | sed 's/ 99/ --/g' >> $CDIR"/summary.txt"
1189      echo "fresults='" > $CDIR"/summary.txt"          echo "MACH='$MACH'" >> $CDIR"/summary.txt"
1190      formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} \          echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"
1191          ${run:-N} $results >> $CDIR"/summary.txt"          echo "DATE='$DATE'" >> $CDIR"/summary.txt"
1192      echo "'" >> $CDIR"/summary.txt"          echo "tdir='$dir'" >> $CDIR"/summary.txt"
1193      echo "MACH='$MACH'" >> $CDIR"/summary.txt"          if test "x$ADM" = xt ; then
1194      echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"              head -1 $dir/$builddir/taf_ad.log >> $CDIR"/summary.txt"
1195      echo "DATE='$DATE'" >> $CDIR"/summary.txt"              grep -A3 'Seconds in section "ALL' $dir/$rundir/$OUTPUTFILE \
1196      echo "tdir='$dir'" >> $CDIR"/summary.txt"                                  >> $CDIR"/summary.txt"
       
     (  
         cd $DRESULTS  
         tar -cf $NDIR".tar" $DRESULTS"_"$NDIR > /dev/null 2>&1  
         gzip $NDIR".tar"  
     )  
       
     if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then  
         echo "No mail sent"  
     else  
         $MPACK -s MITgcm-test -m 1000000 $DRESULTS"/"$NDIR".tar.gz" $ADDRESSES  
         RETVAL=$?  
         if test "x$RETVAL" != x0 ; then  
             echo "Warning: \"$MPACK\" failed -- please contact <edhill@mitgcm.org>"  
         else  
             rm -f $DRESULTS"/"$NDIR".tar*"  
1197          fi          fi
     fi  
1198    
1199      echo "-------------------------------------------------------------------------------"          for ex in $extra_runs ; do
1200                unset run
1201                results=$EMPTY_RESULTS
1202                #  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        #postclean $dir/$builddir
1234        if test "x$POSTCLEAN" = xt ; then
1235            makeclean $dir/$builddir \
1236                && run_clean $dir/$rundir
1237        fi
1238            
1239      NDIR=$(( $NDIR + 1 ))      echo "-------------------------------------------------------------------------------"
1240            
1241  done  done
1242    
1243  echo -n "Start time:  " >> $SUMMARY  printf "Start time:  " >> $SUMMARY
1244  date -r dfile >> $SUMMARY  echo $start_date >> $SUMMARY
1245  echo -n "End time:    " >> $SUMMARY  printf "End time:    " >> $SUMMARY
1246  date >> $SUMMARY  date >> $SUMMARY
1247    
1248  rm tmp_cmpnum.f a.out dfile  #  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=$?
1258            if test "x$RETVAL" != x0 ; then
1259                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
1265                echo
1266                echo "An email containing results was sent to the following addresses:"
1267                echo "  \"$ADDRESSES\""
1268                echo
1269            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    rm -f tr_cmpnum.c tr_cmpnum
1276    
1277  if test "x$CLEANUP" != xt ; then  if test "x$CLEANUP" != xt ; then
1278      cat $SUMMARY      cat $SUMMARY | sed 's/ \.  \.  \.  \.  \.  \.  \.  \.  \.  \.  \.  \. //'
1279      if test -e tr.out ; then      if test -e tr_out.txt ; then
1280          mv tr.out tr.out.old          mv tr_out.txt tr_out.txt.old
1281      fi      fi
1282      cat $SUMMARY > tr.out      cat $SUMMARY | sed '/^[YN] [YN] [YN] [YN]/ s/ \. //g' > tr_out.txt
1283    fi
1284    
1285    if test "x$DELDIR" = xt ; then
1286        rm -rf $DRESULTS
1287  fi  fi
1288    

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

  ViewVC Help
Powered by ViewVC 1.1.22