/[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.109 by jmc, Thu Dec 13 18:28:41 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 "  (-gsl)                   compile with \"-gsl\" flag"
19      echo "                             (DEF=\"edhill@mitgcm.org\")"      echo "  (-of=|-optfile=)STRING   list of optfiles to use"
20      echo "  (-t|-tdir)STRING         list of test dirs to use"      echo "  (-a|-addr) STRING        list of email recipients"
21      echo "                             (DEF=\"\" which builds all)"      echo "                             (DEF=\"\" no email is sent)"
22      echo "  (-b|-bash)STRING         location of \"bash\" executable"      echo "  (-t|-tdir) STRING        list of group and/or exp. dirs to test"
23      echo "                             (DEF=\"\" for \"/bin/bash\")"      echo "                             (recognized groups: basic, tutorials)"
24      echo "  (-command)STRING         command to run"      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\")"      echo "                             (DEF=\"make output.txt\")"
33      echo "  (-m|-make)STRING         command to use for \"make\""      echo "  (-m|-make) STRING        command to use for \"make\""
34      echo "                             (DEF=\"make\")"      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\""      echo "  (-clean)                 *ONLY* run \"make CLEAN\""
43      echo "  (-quick|-q)              same as \"-nogenmake -noclean -nodepend\""      echo "  (-quick|-q)              same as \"-nogenmake -noclean -nodepend\""
44      echo "  (-nogenmake|-ng)         skip the genmake stage"      echo "  (-nogenmake|-ng)         skip the genmake stage"
45      echo "  (-noclean|-nc)           skip the \"make clean\" stage"      echo "  (-noclean|-nc)           skip the \"make clean\" stage"
46      echo "  (-nodepend|-nd)          skip the \"make depend\" stage"      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      echo
52      echo "and where STRING follows a whitespace-delimited format"      echo "and where STRING can be a whitespace-delimited list"
53      echo "such as:"      echo "such as:"
54        echo
55      echo "  -t 'exp0 exp2 exp3' "      echo "  -t 'exp0 exp2 exp3' "
56      echo "  -addr='abc@123.com testing@home.org'"      echo "  -addr='abc@123.com testing@home.org'"
57      echo      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
61      exit 1      exit 1
62  }  }
63    
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          fi
77          echo -n "building mpack...  "          printf "building mpack...  "
78          ( cd $MPACKDIR && ./configure && $MAKE ) > build_mpack.out 2>&1          if test "x$CC" = x ; then
79                export CC=cc
80            fi
81            ( cd $MPACKDIR && ./configure && $MAKE ) > tr_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
156        if [ $verbose -gt 1 ]; then
157            cat tmp3.txt 1>&2
158      fi      fi
159      compare_lines      echo "-1" >> tmp3.txt
160      digits_of_similarity=$?      # 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      testoutput_for_prop $1 "dynstat_theta_min" "theta minimum" $2; tmin=$?          # remove 1rst var and expand the list: + => min max mean s.d
217      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' \
218      testoutput_for_prop $1 "dynstat_theta_mean" "theta mean" $2; tmean=$?                                 | sed 's/+//g' | sed "s/^$sVar//"`
219      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
220      testoutput_for_prop $1 "dynstat_salt_min" "salt minimum" $2; smin=$?          for ii in 1 2 3 4 5 6 7 8 9 ; do
221      testoutput_for_prop $1 "dynstat_salt_max" "salt maximum" $2; smax=$?            tst=`eval 'echo "$HAVE_PTR0'$ii'"'`
222      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
223      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
224      testoutput_for_prop $1 "dynstat_uvel_min" "U minimum" $2; umin=$?          done
225      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 }'`
226      testoutput_for_prop $1 "dynstat_uvel_mean" "U mean" $2; umean=$?          if test $tst != 1 ; then
227      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
228      testoutput_for_prop $1 "dynstat_vvel_min" "V minimum" $2; vmin=$?                   else echo "==> WARNING: found selected var >$sVar< $tst times" 1>&2 ; fi
229      testoutput_for_prop $1 "dynstat_vvel_max" "V maximum" $2; vmax=$?            echo "==> WARNING: in checked list:" $listVar 1>&2
230      testoutput_for_prop $1 "dynstat_vvel_mean" "V mean" $2; vmean=$?          #- put it back once:
231      testoutput_for_prop $1 "dynstat_vvel_sd" "V s.d." $2; vsd=$?            listVar=" $sVar "`echo "$listVar " | sed "s/ $sVar / /g"`
232                fi
233      dashnum $cg2dres $tmin $tmax $tmean $tsd $smin $smax $smean $ssd \          if [ $debug -gt 0 ]; then echo "testoutput_run: listVar(M)='$listVar'" 1>&2 ; fi
234          $umin $umax $umean $usd $vmin $vmax $vmean $vsd          echo "listVar='$listVar'" > $CDIR"/summary.txt"
235            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()
# Line 183  genmakemodel() Line 309  genmakemodel()
309      if test "x$NOGENMAKE" = xt ; then      if test "x$NOGENMAKE" = xt ; then
310          echo "genmake skipped!"          echo "genmake skipped!"
311      else      else
312          GENMAKE2="$BASH ../../../tools/genmake2"          if test "x$BASH" = x ; then
313                GENMAKE2="../../../tools/genmake2"
314            else
315                GENMAKE2="$BASH ../../../tools/genmake2 -bash $BASH"
316            fi
317          (          (
318              cd $1;              cd $1;
319              command="$GENMAKE2  -ds -m $MAKE --mods=../code"              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              if test "x$OPTFILE" != xNONE ; then
326                  command="$command --optfile=$OPTFILE"                  command="$command --optfile=$OPTFILE"
                 # echo "  command=\"$command\""  
327              fi              fi
328              if test "x$IEEE" != x ; then              if test "x$IEEE" != x ; then
329                  command="$command -ieee"                  command="$command -ieee"
330              fi              fi
331              # echo "command: \"$command\""              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              printf 'genmake ... ' 1>&2
348              $command > make.log 2>&1              $command > make.log 2>&1
349              RETVAL=$?              RETVAL=$?
350              for i in genmake_state genmake_optfile genmake_local Makefile ; do              #  Reduce the size of the testing emails!
351                  if test -r $i ; then              head -100 Makefile > $CDIR/Makefile_head
                     cp $i $CDIR  
                 fi  
             done  
352              if test "x$RETVAL" != x0 ; then              if test "x$RETVAL" != x0 ; then
353                  tail make.log                  tail make.log
354                  echo "genmakemodel: genmake failed" 1>&2                  echo "genmakemodel: genmake failed" 1>&2
355                  cp make.log $CDIR                  cp genmake_* make.log $CDIR
356                  return 1                  return 1
357              else              else
358                  echo "succesful" 1>&2                  echo "successful" 1>&2
359              fi              fi
360          )          )
361      fi      fi
# Line 219  makeclean() Line 365  makeclean()
365  {  {
366      # makeclean directory      # makeclean directory
367      if test "x$NOCLEAN" = xt ; then      if test "x$NOCLEAN" = xt ; then
368          echo "make CLEAN skipped!"          echo "make Clean skipped!"
369      else      else
370          (          (
371              cd $1;              cd $1;
372              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  
373              if test -r Makefile ; then              if test -r Makefile ; then
374                  $MAKE CLEAN >> make.log 2>&1                  printf 'clean build-dir: make Clean ... ' 2>&1
375                    $MAKE Clean >> make.log 2>&1
376                  RETVAL=$?                  RETVAL=$?
377                  if test "x$RETVAL" != x0 ; then                  if test "x$RETVAL" != x0 ; then
378                      tail make.log                      tail make.log
379                      echo "makeclean: \"make CLEAN\" failed" 1>&2                      echo "makeclean: \"make Clean\" failed" 1>&2
380                      cp make.log $CDIR"/make.log"                      cp make.log $CDIR"/make.log"
381                      return 1                      return 1
382                  fi                  fi
383              fi              fi
384              echo succesful 1>&2              echo successful 1>&2
385                exit 0
386            )
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              exit 0
409          )          )
410      fi      fi
# Line 260  makedependmodel() Line 427  makedependmodel()
427                  cp make.log $CDIR"/make.log"                  cp make.log $CDIR"/make.log"
428                  return 1                  return 1
429              else              else
430                  echo succesful 1>&2                  echo successful 1>&2
431              fi              fi
432          )          )
433      fi      fi
# Line 273  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 281  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 test "x$1" = x1 ; then      if test -d $1 ; then
519          (          (
520              cd $2              cd $1 ; shift
521              files=`( cd ../input ; ls -1 | grep -v CVS )`              if test -r "../"$1"/eedata.mth" ; then
522              for i in $files ; do              # found eedata.mth in 1rst input dir and it is readable
523                  if test ! -d "../input/"$i ; then                  if test "x$MULTI_THREAD" = "xt" ; then
524                      ln -sf "../input/"$i $i                  # 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                  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              done
555          )          )
556      fi      fi
# Line 309  runmodel() Line 560  runmodel()
560  {  {
561      # runmodel directory      # runmodel directory
562      #      #
563      #  runs "$COMMAND" in "directory"      #  runs "$COMMAND in "directory"
564      #  (where "$COMMAND" is relative to "directory")      #  (where "$COMMAND" is relative to "directory")
565      (      (
566          cd $1          cd $1
567          printf 'runmodel: ' 1>&2          printf 'runmodel in %s ...' $1 1>&2
568          # make output.txt          # make output.txt
569          $COMMAND          echo
570          RETVAL=$?          if test -L $EXECUTABLE -a -x "../"$builddir"/"$EXECUTABLE ; then
571          if test "x$RETVAL" = x0 ; then              diff -q $EXECUTABLE "../"$builddir"/"$EXECUTABLE > /dev/null 2>&1
572              cp output.txt $CDIR"/output.txt"              outD=$? ; if test $outD != 0 ; then rm -f $EXECUTABLE ; rm -f run.log ; fi
573            fi
574            if test ! -x $EXECUTABLE -a -x "../"$builddir"/"$EXECUTABLE ; then
575                echo " link" $EXECUTABLE "from dir ../"$builddir > run.log_00
576                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
592                    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
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              return 0
614          else          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              return 1
620          fi          fi
621      )      )
# Line 330  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"          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 374  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 390  formatresults() Line 703  formatresults()
703            
704  }  }
705    
 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  
 }  
   
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
724  clean=0  clean=0
 expts=''  
 # ieee=1  
725    
726  IEEE=  IEEE=true
727  if test "x$MITGCM_IEEE" != x ; then  if test "x$MITGCM_IEEE" != x ; then
728      IEEE=$MITGCM_IEEE      IEEE=$MITGCM_IEEE
729  fi  fi
730    GSL=f
731    
732  CLEANUP=f  CLEANUP=f
733  QUICK=f  QUICK=f
734  NOGENMAKE=f  NOGENMAKE=f
735  NOCLEAN=f  NOCLEAN=f
736  NODEPEND=f  NODEPEND=f
737    POSTCLEAN=f
738    
739  BASH=  BASH=
740  OPTFILE=NONE  OPTFILE=NONE
741  ADDRESSES=  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="make output.txt"  COMMAND=
748  MAKE=make  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  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    MATCH_CRIT=13
766    
767  echo -n "parsing options...  "  printf "parsing options...  "
768    
769  ac_prev=  ac_prev=
770  for ac_option ; do  for ac_option ; do
# Line 489  for ac_option ; do Line 798  for ac_option ; do
798          -tdir=* | --tdir=*)          -tdir=* | --tdir=*)
799              TESTDIRS=$ac_optarg ;;              TESTDIRS=$ac_optarg ;;
800    
801            -skipdir | --skipdir | -skd | --skd)
802                ac_prev=SKIPDIRS ;;
803            -skipdir=* | --skipdir=*)
804                SKIPDIRS=$ac_optarg ;;
805    
806          -bash | --bash | -b | --b)          -bash | --bash | -b | --b)
807              ac_prev=BASH ;;              ac_prev=BASH ;;
808          -bash=* | --bash=*)          -bash=* | --bash=*)
# Line 504  for ac_option ; do Line 818  for ac_option ; do
818          -make=* | --make=*)          -make=* | --make=*)
819              MAKE=$ac_optarg ;;              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)          -clean | --clean)
838              CLEANUP=t ;;              CLEANUP=t ; DELDIR=t ;;
839    
840          -quick | --quick | -q | --q)          -quick | --quick | -q | --q)
841              QUICK=t ;;              QUICK=t ;;
# Line 516  for ac_option ; do Line 846  for ac_option ; do
846          -nodepend | --nodepend | -nd | --nd)          -nodepend | --nodepend | -nd | --nd)
847              NODEPEND=t ;;              NODEPEND=t ;;
848    
849          -mpi) MPI=true ;;          -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 ;;          -ieee) IEEE=true ;;
859          -noieee) IEEE= ;;          -noieee) IEEE= ;;
860            -gsl) GSL=t ;;
861    
862          -verbose) verbose=2 ;;          -verbose) verbose=2 ;;
863          -debug) debug=1 ;;          -debug) debug=1 ;;
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 545  if test "x$QUICK" = xt ; then Line 891  if test "x$QUICK" = xt ; then
891      NODEPEND=t      NODEPEND=t
892  fi  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  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  if test "x$OPTFILE" = xNONE -a "x$MITGCM_OF" != x ; then
949      OPTFILE=$MITGCM_OF      OPTFILE=$MITGCM_OF
950  fi  fi
951    
952  echo "OK"  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
959    
960    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  MACH=`hostname`  MACH=`hostname`
990  UNAMEA=`uname -a`  UNAMEA=`uname -a`
991  DATE=`date +%Y%m%d`  DATE=`date +%Y%m%d`
992  BASE=$MACH"_"$DATE"_"  BASE="tr_"$MACH"_"$DATE"_"
993    if test "x$OUTDIR" != x ; then
994        BASE="tr_"$OUTDIR"_"$DATE"_"
995    fi
996  DNUM=0  DNUM=0
997  DRESULTS="$BASE$DNUM"  DRESULTS="$BASE$DNUM"
998  while test -e $DRESULTS ; do  while test -e $DRESULTS ; do
# Line 575  done Line 1002  done
1002  mkdir $DRESULTS  mkdir $DRESULTS
1003  RETVAL=$?  RETVAL=$?
1004  if test "x$RETVAL" != x0 ; then  if test "x$RETVAL" != x0 ; then
1005      echo "Error: can't create results directory \"./$DRESULTS\""      echo "ERROR: Can't create results directory \"./$DRESULTS\""
1006      exit 1      exit 1
1007  fi  fi
1008  SUMMARY="$DRESULTS/summary.txt"  SUMMARY="$DRESULTS/summary.txt"
1009  echo -n "Start time:  " >> $SUMMARY  printf "Start time:  " >> $SUMMARY
1010  date > $SUMMARY  start_date=`date`
1011  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  
1012    
1013  of_path=  of_path=
1014  if test "x$OPTFILE" != xNONE ; then  if test "x$OPTFILE" != xNONE ; then
# Line 605  if test "x$OPTFILE" != xNONE ; then Line 1022  if test "x$OPTFILE" != xNONE ; then
1022          fi          fi
1023          file=${OPTFILE##*/}          file=${OPTFILE##*/}
1024          OPTFILE=$of_path/$file          OPTFILE=$of_path/$file
1025            cp $OPTFILE $DRESULTS
1026            echo >> $SUMMARY
1027            echo "  OPTFILE=$OPTFILE" >> $SUMMARY
1028      else      else
1029          echo          echo | tee $SUMMARY
1030          echo "WARNING: can't read OPTFILE=\"$OPTFILE\" but will try to use it..."          echo "ERROR: can't read OPTFILE=\"$OPTFILE\"" | tee $SUMMARY
1031            exit 1
1032      fi      fi
1033    else
1034        echo >> $SUMMARY
1035        echo "No \"OPTFILE\" was explicitly specified by testreport," >> $SUMMARY
1036        echo "   so the genmake default will be used." >> $SUMMARY
1037  fi  fi
1038  echo  echo
 echo "OPTFILE=$OPTFILE" >> $SUMMARY  
1039  echo >> $SUMMARY  echo >> $SUMMARY
1040    if test "x$ADM" = x ; then
1041        if [ $MATCH_CRIT -lt 10 ] ;
1042        then line_0="default  "$MATCH_CRIT ;
1043        else line_0="default "$MATCH_CRIT ; fi
1044           line_0="$line_0  ----T-----  ----S-----  ----U-----  ----V-----"
1045    #   line_0="            ----T-----  ----S-----  ----U-----  ----V-----"
1046        line_1="G D M    c        m  s        m  s        m  s        m  s"
1047        line_2="E p a R  g  m  m  e  .  m  m  e  .  m  m  e  .  m  m  e  ."
1048        line_3="N n k u  2  i  a  a  d  i  a  a  d  i  a  a  d  i  a  a  d"
1049        line_4="2 d e n  d  n  x  n  .  n  x  n  .  n  x  n  .  n  x  n  ."
1050        for ii in $PTRACERS_NUM ; do
1051            #  tst=`eval 'echo $HAVE_PTR0'$ii`
1052            #  if test "x$tst" = xt ; then
1053            line_0="$line_0  --PTR 0"$ii"--"
1054            line_1="$line_1        m  s"
1055            line_2="$line_2  m  m  e  ."
1056            line_3="$line_3  i  a  a  d"
1057            line_4="$line_4  n  x  n  ."
1058            #  fi
1059        done
1060        echo "$line_0" | tee -a $SUMMARY
1061        echo "$line_1" | tee -a $SUMMARY
1062        echo "$line_2" | tee -a $SUMMARY
1063        echo "$line_3" | tee -a $SUMMARY
1064        echo "$line_4" | tee -a $SUMMARY
1065        echo " "       | tee -a $SUMMARY
1066    else
1067        echo "ADJOINT=true" >> $SUMMARY
1068        echo >> $SUMMARY
1069        if [ $MATCH_CRIT -lt 10 ] ;
1070        then line_0="default     "$MATCH_CRIT ;
1071        else line_0="default    "$MATCH_CRIT ; fi
1072        echo "$line_0" | tee -a $SUMMARY
1073        cat << EOF | tee -a $SUMMARY
1074    G D M    C  G
1075    E p a R  o  r
1076    N n k u  s  a
1077    2 d e n  t  d
1078    
1079    EOF
1080    fi
1081    
1082  #  ...and each test directory...  #  ...and each test directory...
1083  for dir in $TESTDIRS ; do  for dir in $TESTDIRS ; do
1084            
1085        # set builddir & rundir:
1086        builddir="build"
1087        if test ! -d $dir/$builddir ; then mkdir $dir/$builddir ; fi
1088        rundir="run"
1089        if test ! -d $dir/$rundir ; then
1090            rundir=$builddir
1091        fi
1092        CODE_DIR=$dir/$code_dir
1093        BUILD_DIR=$dir/$builddir
1094    
1095      #  Cleanup only!      #  Cleanup only!
1096      if test "x$CLEANUP" = xt ; then      if test "x$CLEANUP" = xt ; then
1097          if test -r $dir/build/Makefile ; then          if test -r $BUILD_DIR/Makefile ; then
1098              ( cd $dir/build ; make CLEAN )              echo '  ------  clean dir:' $dir/build
1099                ( cd $BUILD_DIR ; make CLEAN )
1100          fi          fi
1101          if test -r $dir/input/Makefile ; then          if test -d $dir/$rundir/CVS ; then
1102              ( cd $dir/input ; make CLEAN )              echo '  ------  clean dir:' $dir/$rundir
1103                run_clean $dir/$rundir
1104          fi          fi
1105            (
1106                cd $dir
1107                rm -rf tr_run.*
1108            )
1109          continue          continue
1110      fi      fi
1111    
1112      #  Verify that the testdir exists and contains previous      #  Verify that the testdir exists and contains previous
1113      #  results in the correct location--or skip this directory!      #  results in the correct location--or skip this directory!
1114      if test ! -r $dir"/results/output.txt" ; then      fout=$dir"/results/"$ref_outp
1115          echo "can't read \"$dir/results/output.txt\" -- skipping $dir"      if test ! -r $fout ; then
1116            echo "can't read \"$fout\" -- skipping $dir"
1117          continue          continue
1118      fi      fi
1119        if test "x$ADM" = x ; then
1120      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  
1121      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"  
1122    
1123      #  Is this an MPI run?      # Check for additional types of monitor output
1124      if test "x$MPI" = xt ; then  
1125          FILES=$MPI_FILES      if test ! -r $CODE_DIR"/SIZE.h_mpi" -a "x$MPI" = "xt" ; then
1126          endings="_mpi"          echo "can't find \"$CODE_DIR/SIZE.h_mpi\" -- skipping $dir"
1127      else          continue
         FILES=$NOMPI_FILES  
         endings="_nompi"  
1128      fi      fi
1129            if test ! -r $dir"/input/eedata.mth" -a "x$MULTI_THREAD" = "xt" ; then
1130      #  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)"  
1131          continue          continue
1132      fi      fi
1133        
1134      #  If we have the $FILES and they differ, copy the $FILES to $BUILD_DIR      #  Check whether there are "extra runs" for this testdir
1135      if test "x$have_files" = xt ; then      extra_runs=
1136          for i in $FILES ; do      ex_run_dirs=`( cd $dir ; echo $inputdir.* )`
1137              sstr="s|$endings||"      #echo "ex_run_dirs='$ex_run_dirs'"
1138              name=`echo $i | sed -e $sstr `      for exd in $ex_run_dirs ; do
1139              cmp $CODE_DIR/$i $BUILD_DIR/$name > /dev/null 2>&1          name=`echo $exd | sed -e "s/$inputdir\.//"`
1140              RETVAL=$?          refExOut=`echo $ref_outp | sed "s/\./.${name}./"`
1141              if test "x$RETVAL" != x0 ; then          outf="$dir/results/$refExOut"
1142                  cp $CODE_DIR/$i $BUILD_DIR/$name          if test -f $outf -a -r $outf ; then
1143                if test "x$MULTI_THREAD" = "xt" ; then
1144                    if test -r $dir"/"$exd"/eedata.mth" ; then
1145                        extra_runs="$extra_runs $name"
1146                    #else echo $dir"/"$exd"/eedata.mth: not found"
1147                    fi
1148                else
1149                    extra_runs="$extra_runs $name"
1150              fi              fi
1151          done          fi
1152        done
1153    
1154        echo "-------------------------------------------------------------------------------"
1155        echo
1156        if test "x$extra_runs" = "x" ; then
1157           echo "Experiment:  $dir"
1158        else
1159           echo "Experiment:  $dir ; extra_runs=$extra_runs"
1160      fi      fi
1161            echo
1162        unset genmake makedepend make run
1163        results=$EMPTY_RESULTS
1164    
1165      #  Create an output dir for each OPTFILE/tdir combination      #  Create an output dir for each OPTFILE/tdir combination
1166      CDIR=$DRESULTS"/"$DRESULTS"_"$NDIR      rel_CDIR=$DRESULTS"/"$dir
1167      mkdir $CDIR      mkdir $rel_CDIR
1168      CDIR=`pwd`"/$CDIR"      CDIR=`pwd`"/$rel_CDIR"
1169            
1170      if test "x$CLEANUP" = xt ; then      if test "x$CLEANUP" = xt ; then
1171          makeclean $dir/$builddir          echo '====>>> this is to check that we never go through this part <<< ==='
1172            makeclean $dir/$builddir \
1173                && run_clean $dir/$rundir
1174      else      else
1175          genmakemodel $dir/$builddir && genmake=Y \          genmakemodel $dir/$builddir && genmake=Y \
1176              && makeclean $dir/$builddir \              && makeclean $dir/$builddir \
1177                && run_clean $dir/$rundir \
1178                && symlink_mpifiles $dir $code_dir $builddir \
1179              && makedependmodel $dir/$builddir && makedepend=Y \              && makedependmodel $dir/$builddir && makedepend=Y \
1180              && makemodel $dir/$builddir && make=Y \              && makemodel $dir/$builddir && make=Y \
1181              && linkdata $use_seperate_build $dir/$rundir \              && linkdata $dir/$rundir $inputdir input \
1182              && runmodel $dir/$rundir && run=Y \              && runmodel $dir/$rundir && run=Y \
1183              && results=`testoutput $dir $rundir`              && results=`testoutput_run $dir $rundir $ref_outp`
1184      fi      fi
1185            
1186      echo      echo
1187      formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} \          fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1188          ${run:-N} $results          echo
1189      echo          echo "$fres" | sed 's/ 99/ --/g' | sed 's/  > />/' | sed 's/  < /</' >> $SUMMARY
1190      formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} \          touch $CDIR"/summary.txt"
1191          ${run:-N} $results >> $SUMMARY          echo "fresults='$fres'" | sed 's/ 99/ --/g' >> $CDIR"/summary.txt"
1192      echo "fresults='" > $CDIR"/summary.txt"          echo "MACH='$MACH'" >> $CDIR"/summary.txt"
1193      formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} \          echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"
1194          ${run:-N} $results >> $CDIR"/summary.txt"          echo "DATE='$DATE'" >> $CDIR"/summary.txt"
1195      echo "'" >> $CDIR"/summary.txt"          echo "tdir='$dir'" >> $CDIR"/summary.txt"
1196      echo "MACH='$MACH'" >> $CDIR"/summary.txt"          if test "x$ADM" = xt ; then
1197      echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"              head -1 $dir/$builddir/taf_ad.log >> $CDIR"/summary.txt"
1198      echo "DATE='$DATE'" >> $CDIR"/summary.txt"              grep -A3 'Seconds in section "ALL' $dir/$rundir/$OUTPUTFILE \
1199      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*"  
1200          fi          fi
     fi  
1201    
1202      echo "-------------------------------------------------------------------------------"          for ex in $extra_runs ; do
1203                unset run
1204                results=$EMPTY_RESULTS
1205                #  reference output file
1206                refExOut=`echo $ref_outp | sed "s/\./.${ex}./g"`
1207                #  Create an output dir for each OPTFILE/tdir.ex combination
1208                rel_CDIR=$DRESULTS"/"$dir"."$ex
1209                mkdir $rel_CDIR
1210                CDIR=`pwd`"/$rel_CDIR"
1211                test ! -e "$dir/tr_run.$ex" && mkdir "$dir/tr_run.$ex"
1212                run_clean $dir/tr_run.$ex
1213                linkdata $dir/tr_run.$ex $inputdir.$ex $inputdir input
1214                runmodel $dir/tr_run.$ex && run=Y \
1215                && results=`testoutput_run $dir tr_run.$ex $refExOut`
1216                fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1217                fres="$fres.$ex"
1218                echo
1219                echo "$fres" | sed 's/ 99/ --/g' | sed 's/  > />/' | sed 's/  < /</' >> $SUMMARY
1220                touch $CDIR"/summary.txt"
1221                echo "fresults='$fres'" | sed 's/ 99/ --/g' >> $CDIR"/summary.txt"
1222                echo "MACH='$MACH'" >> $CDIR"/summary.txt"
1223                echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"
1224                echo "DATE='$DATE'" >> $CDIR"/summary.txt"
1225                echo "tdir='$dir.$ex'" >> $CDIR"/summary.txt"
1226                if test "x$ADM" = xt ; then
1227                    head -1 $dir/$builddir/taf_ad.log >> $CDIR"/summary.txt"
1228                    grep -A3 'Seconds in section "ALL' $dir/tr_run.$ex/$OUTPUTFILE \
1229                                       >> $CDIR"/summary.txt"
1230                fi
1231                if test "x$POSTCLEAN" = xt ; then
1232                    run_clean $dir/tr_run.$ex
1233                fi
1234            done
1235    
1236        #postclean $dir/$builddir
1237        if test "x$POSTCLEAN" = xt ; then
1238            makeclean $dir/$builddir \
1239                && run_clean $dir/$rundir
1240        fi
1241            
1242      NDIR=$(( $NDIR + 1 ))      echo "-------------------------------------------------------------------------------"
1243            
1244  done  done
1245    
1246  echo -n "Start time:  " >> $SUMMARY  printf "Start time:  " >> $SUMMARY
1247  date -r dfile >> $SUMMARY  echo $start_date >> $SUMMARY
1248  echo -n "End time:    " >> $SUMMARY  printf "End time:    " >> $SUMMARY
1249  date >> $SUMMARY  date >> $SUMMARY
1250    
1251  rm tmp_cmpnum.f a.out dfile  #  If addresses were supplied and mpack built successfully, then try
1252    #  to send email using mpack.
1253    if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then
1254        echo "No results email was sent."
1255    else
1256        if test "x$HAVE_MPACK" = xt ; then
1257            tar -cf $DRESULTS".tar" $DRESULTS > /dev/null 2>&1 \
1258                && gzip $DRESULTS".tar" \
1259                && $MPACK -s MITgcm-test -m 3555000 $DRESULTS".tar.gz" $ADDRESSES
1260            RETVAL=$?
1261            if test "x$RETVAL" != x0 ; then
1262                echo
1263                echo "Warning: The tar, gzip, & mpack step failed.  Please send email"
1264                echo "  to <MITgcm-support@mitgcm.org> for help.  You may copy the "
1265                echo "  summary of results from the directory \"$DRESULTS\"."
1266                echo
1267            else
1268                echo
1269                echo "An email containing results was sent to the following addresses:"
1270                echo "  \"$ADDRESSES\""
1271                echo
1272            fi
1273            test -f $DRESULTS".tar"  &&  rm -f $DRESULTS".tar"
1274            test -f $DRESULTS".tar.gz"  &&  rm -f $DRESULTS".tar.gz"
1275        fi
1276    fi
1277    
1278    rm -f tr_cmpnum.c tr_cmpnum
1279    
1280  if test "x$CLEANUP" != xt ; then  if test "x$CLEANUP" != xt ; then
1281      cat $SUMMARY      cat $SUMMARY | sed 's/ \.  \.  \.  \.  \.  \.  \.  \.  \.  \.  \.  \. //'
1282      if test -e tr.out ; then      if test -e tr_out.txt ; then
1283          mv tr.out tr.out.old          mv tr_out.txt tr_out.txt.old
1284      fi      fi
1285      cat $SUMMARY > tr.out      cat $SUMMARY | sed '/^[YN] [YN] [YN] [YN]/ s/ \. //g' > tr_out.txt
1286    fi
1287    
1288    if test "x$DELDIR" = xt ; then
1289        rm -rf $DRESULTS
1290  fi  fi
1291    

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

  ViewVC Help
Powered by ViewVC 1.1.22