/[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.9.2.8 by edhill, Sat Oct 4 02:10:52 2003 UTC revision 1.111 by mlosch, Wed Feb 6 21:06:03 2008 UTC
# Line 1  Line 1 
1  #!/bin/bash  #! /usr/bin/env bash
2  #  #
3  #  $Header$  #  $Header$
4    #  $Name$
5  #  #
6    
7  usage()  usage()
# Line 10  usage() Line 11  usage()
11      echo      echo
12      echo "where possible OPTIONS are:"      echo "where possible OPTIONS are:"
13      echo "  (-help|-h)               print usage"      echo "  (-help|-h)               print usage"
14      echo "  (-mpi)                   use MPI input files"      echo "  (-mth)                   run multi threaded (using eedata.mth)"
15      echo "  (-optfile=|-of=)STRING   list of optfiles to use"      echo "  (-mpi)                   compile and run using MPI"
16      echo "  (-a|-addr)STRING         list of email recipients"      echo "  (-ieee|-noieee)          if possible, use IEEE compiler flags"
17      echo "                             (DEF=\"edhill@mitgcm.org\")"      echo "                             (DEF=\"-ieee\")"
18      echo "  (-t|-tdir)STRING         list of test dirs to use"      echo "  (-gsl)                   compile with \"-gsl\" flag"
19      echo "                             (DEF=\"\" which builds all)"      echo "  (-of=|-optfile=)STRING   list of optfiles to use"
20      echo "  (-b|-bash)STRING         location of \"bash\" executable"      echo "  (-a|-addr) STRING        list of email recipients"
21      echo "                             (DEF=\"\" for \"/bin/bash\")"      echo "                             (DEF=\"\" no email is sent)"
22      echo "  (-command)STRING         command to run"      echo "  (-t|-tdir) STRING        list of group and/or exp. dirs to test"
23        echo "                             (recognized groups: basic, tutorials)"
24        echo "                             (DEF=\"\" which test all)"
25        echo "  (-skd|-skipdir) STRING   list of exp. dirs to skip"
26        echo "                             (DEF=\"\" which test all)"
27        echo "  (-b|-bash) STRING        preferred location of a \"bash\" or"
28        echo "                             Bourne-compatible \"sh\" shell"
29        echo "                             (DEF=\"\" for \"bash\")"
30        echo "  (-adm|-ad)               perform an adjoint run"
31        echo "  (-command) STRING        command to run"
32      echo "                             (DEF=\"make output.txt\")"      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                # remove 1rst var and expand the list: + => min max mean s.d
217      testoutput_for_prop $1 "dynstat_theta_min" "theta minimum" $2; tmin=$?          listVar=`echo $listChk | sed 's/ [a-zA-Z0-9]*+/&mn &mx &av &sd/g' \
218      testoutput_for_prop $1 "dynstat_theta_max" "theta maximum" $2; tmax=$?                                 | sed 's/+//g' | sed "s/^$sVar//"`
219      testoutput_for_prop $1 "dynstat_theta_mean" "theta mean" $2; tmean=$?          if [ $debug -gt 0 ]; then echo "testoutput_run: listVar(I)='$listVar'" 1>&2 ; fi
220      testoutput_for_prop $1 "dynstat_theta_sd" "theta s.d." $2; tsd=$?          for ii in 1 2 3 4 5 6 7 8 9 ; do
221      testoutput_for_prop $1 "dynstat_salt_min" "salt minimum" $2; smin=$?            tst=`eval 'echo "$HAVE_PTR0'$ii'"'`
222      testoutput_for_prop $1 "dynstat_salt_max" "salt maximum" $2; smax=$?           #echo "-- ptr test=" $tst "number of var=" `echo $listVar | awk '{print NF}'` 1>&2
223      testoutput_for_prop $1 "dynstat_salt_mean" "salt mean" $2; smean=$?            if test "x$tst" != xt ; then listVar=`echo "$listVar" | sed "s/ pt$ii..//g"` ; fi
224      testoutput_for_prop $1 "dynstat_salt_sd" "salt s.d." $2; ssd=$?          done
225      testoutput_for_prop $1 "dynstat_uvel_min" "U minimum" $2; umin=$?          tst=`echo $sVar $listVar | awk '{ for(i=2;i<=NF;i++){t+=($i==$1)}; print t }'`
226      testoutput_for_prop $1 "dynstat_uvel_max" "U maximum" $2; umax=$?          if test $tst != 1 ; then
227      testoutput_for_prop $1 "dynstat_uvel_mean" "U mean" $2; umean=$?            if test $tst = 0 ; then echo "==> WARNING: selected var >$sVar< not found" 1>&2
228      testoutput_for_prop $1 "dynstat_uvel_sd" "U s.d." $2; usd=$?                   else echo "==> WARNING: found selected var >$sVar< $tst times" 1>&2 ; fi
229      testoutput_for_prop $1 "dynstat_vvel_min" "V minimum" $2; vmin=$?            echo "==> WARNING: in checked list:" $listVar 1>&2
230      testoutput_for_prop $1 "dynstat_vvel_max" "V maximum" $2; vmax=$?          #- put it back once:
231      testoutput_for_prop $1 "dynstat_vvel_mean" "V mean" $2; vmean=$?            listVar=" $sVar "`echo "$listVar " | sed "s/ $sVar / /g"`
232      testoutput_for_prop $1 "dynstat_vvel_sd" "V s.d." $2; vsd=$?          fi
233                if [ $debug -gt 0 ]; then echo "testoutput_run: listVar(M)='$listVar'" 1>&2 ; fi
234      dashnum $cg2dres $tmin $tmax $tmean $tsd $smin $smax $smean $ssd \          echo "listVar='$listVar'" > $CDIR"/summary.txt"
235          $umin $umax $umean $usd $vmin $vmax $vmean $vsd          allargs=""
236            for xx in $listVar
237            do
238              case $xx in
239               'PS')  if [ $debug -gt 0 ]
240                      then echo testoutput_run: testoutput_var $1 cg2d_init_res 1>&2 ; fi
241                      testoutput_var $1 "cg2d_init_res" "Press. Solver (cg2d)" $2 $3; yy=$?
242                      if [ $debug -gt 0 ] ; then echo testoutput_run: cg2dres=$yy 1>&2 ; fi ;;
243              'Cost') testoutput_var $1 "ADM  precision_derivative_cost" "ADM Cost" $2 $3; yy=$? ;;
244              'Grad') testoutput_var $1 "ADM  precision_derivative_grad" "ADM Grad" $2 $3; yy=$? ;;
245               'Tmn') testoutput_var $1 "dynstat_theta_min"  "Theta minimum"  $2 $3; yy=$? ;;
246               'Tmx') testoutput_var $1 "dynstat_theta_max"  "Theta maximum"  $2 $3; yy=$? ;;
247               'Tav') testoutput_var $1 "dynstat_theta_mean" "Theta mean"     $2 $3; yy=$? ;;
248               'Tsd') testoutput_var $1 "dynstat_theta_sd"   "Theta Std.Dev"  $2 $3; yy=$? ;;
249               'Smn') testoutput_var $1 "dynstat_salt_min"  "Salt minimum"    $2 $3; yy=$? ;;
250               'Smx') testoutput_var $1 "dynstat_salt_max"  "Salt maximum"    $2 $3; yy=$? ;;
251               'Sav') testoutput_var $1 "dynstat_salt_mean" "Salt mean"       $2 $3; yy=$? ;;
252               'Ssd') testoutput_var $1 "dynstat_salt_sd"   "Salt Std.Dev"    $2 $3; yy=$? ;;
253               'Umn') testoutput_var $1 "dynstat_uvel_min"  "U minimum"       $2 $3; yy=$? ;;
254               'Umx') testoutput_var $1 "dynstat_uvel_max"  "U maximum"       $2 $3; yy=$? ;;
255               'Uav') testoutput_var $1 "dynstat_uvel_mean" "U mean"          $2 $3; yy=$? ;;
256               'Usd') testoutput_var $1 "dynstat_uvel_sd"   "U Std.Dev"       $2 $3; yy=$? ;;
257               'Vmn') testoutput_var $1 "dynstat_vvel_min"  "V minimum"       $2 $3; yy=$? ;;
258               'Vmx') testoutput_var $1 "dynstat_vvel_max"  "V maximum"       $2 $3; yy=$? ;;
259               'Vav') testoutput_var $1 "dynstat_vvel_mean" "V mean"          $2 $3; yy=$? ;;
260               'Vsd') testoutput_var $1 "dynstat_vvel_sd"   "V Std.Dev"       $2 $3; yy=$? ;;
261            'pt1mn'|'pt2mn'|'pt3mn'|'pt4mn'|'pt5mn') ii=`echo $xx | sed 's/pt//' | sed 's/..$//'`
262               testoutput_var $1 "trcstat_ptracer0"$ii"_min"  "p0"$ii"_min"   $2 $3; yy=$? ;;
263            'pt1mx'|'pt2mx'|'pt3mx'|'pt4mx'|'pt5mx') ii=`echo $xx | sed 's/pt//' | sed 's/..$//'`
264               testoutput_var $1 "trcstat_ptracer0"$ii"_max"  "p0"$ii"_max"   $2 $3; yy=$? ;;
265            'pt1av'|'pt2av'|'pt3av'|'pt4av'|'pt5av') ii=`echo $xx | sed 's/pt//' | sed 's/..$//'`
266               testoutput_var $1 "trcstat_ptracer0"$ii"_mean" "p0"$ii"_mean" $2 $3; yy=$? ;;
267            'pt1sd'|'pt2sd'|'pt3sd'|'pt4sd'|'pt5sd') ii=`echo $xx | sed 's/pt//' | sed 's/..$//'`
268               testoutput_var $1 "trcstat_ptracer0"$ii"_sd"   "p0"$ii"_StDv"  $2 $3; yy=$? ;;
269             'Qntmn') testoutput_var $1 "extforcing_qnet_min" "Qnet minimum"  $2 $3; yy=$? ;;
270             'Qntmx') testoutput_var $1 "extforcing_qnet_max" "Qnet maximum"  $2 $3; yy=$? ;;
271             'Qntav') testoutput_var $1 "extforcing_qnet_mean" "Qnet mean"    $2 $3; yy=$? ;;
272             'Qntsd') testoutput_var $1 "extforcing_qnet_sd"  "Qnet Std.Dev"  $2 $3; yy=$? ;;
273             'aSImn') testoutput_var $1 "seaice_area_min"   "SIce Area min"   $2 $3; yy=$? ;;
274             'aSImx') testoutput_var $1 "seaice_area_max"   "SIce Area max"   $2 $3; yy=$? ;;
275             'aSIav') testoutput_var $1 "seaice_area_mean"  "SIce Area mean"  $2 $3; yy=$? ;;
276             'aSIsd') testoutput_var $1 "seaice_area_sd"    "SIce Area StDv"  $2 $3; yy=$? ;;
277             'hSImn') testoutput_var $1 "seaice_heff_min"   "SIce Heff min"   $2 $3; yy=$? ;;
278             'hSImx') testoutput_var $1 "seaice_heff_max"   "SIce Hell max"   $2 $3; yy=$? ;;
279             'hSIav') testoutput_var $1 "seaice_heff_mean"  "SIce Hell mean"  $2 $3; yy=$? ;;
280             'hSIsd') testoutput_var $1 "seaice_heff_sd"    "SIce Hell StDv"  $2 $3; yy=$? ;;
281            'AthSiG') testoutput_var $1 "thSI_Ice_Area_G" "thSIc Area Global" $2 $3; yy=$? ;;
282            'AthSiS') testoutput_var $1 "thSI_Ice_Area_S" "thSIc Area South"  $2 $3; yy=$? ;;
283            'AthSiN') testoutput_var $1 "thSI_Ice_Area_N" "thSIc Area North"  $2 $3; yy=$? ;;
284            'HthSiG') testoutput_var $1 "thSI_IceH_ave_G" "thSIc H Global"    $2 $3; yy=$? ;;
285            'HthSiS') testoutput_var $1 "thSI_IceH_ave_S" "thSIc H South"     $2 $3; yy=$? ;;
286            'HthSiN') testoutput_var $1 "thSI_IceH_ave_N" "thSIc H North"     $2 $3; yy=$? ;;
287                  *) yy=99; echo "WARNING: asking for var=$xx : not recognized !" 1>&2 ;;
288              esac
289              if test $xx = $sVar
290              then allargs="$allargs > $yy <"
291              else allargs="$allargs $yy"
292              fi
293            done
294    
295            nbVar=`echo $listVar | awk '{print NF}'`
296            if [ $nbVar -lt $LEN_CHECK_LIST ] ; then
297            #-- fill line (up to standard length) with dot:
298              adNul=`expr $LEN_CHECK_LIST - $nbVar | awk '{for(i=1;i<=$1;i++){print "."}}'`
299              echo $allargs $adNul
300            else
301              echo $allargs
302            fi
303    # <-- same processing for adjoint & forward test
304  }  }
305    
306  genmakemodel()  genmakemodel()
# Line 182  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              printf 'genmake ... ' 1>&2              command="$GENMAKE2  -ds -m $MAKE"
320              command="$GENMAKE2  -ds -m $MAKE --mods=../code"              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
329                    command="$command -ieee"
330                fi
331                if test "x$GSL" = xt ; then
332                    command="$command -gsl"
333                fi
334                if test "x$MPI" = xt ; then
335                    command="$command -mpi"
336                fi
337                if test "x$TS" = xt ; then
338                    command="$command -ts"
339                fi
340                if test "x$PAPIS" = xt ; then
341                    command="$command -papis"
342                else
343                if test "x$PCLS" = xt ; then
344                    command="$command -pcls"
345                fi
346                fi
347                printf 'genmake ... ' 1>&2
348              $command > make.log 2>&1              $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 214  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 255  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 268  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 276  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" -print)`
478    
479        #  Is this an MPI run?
480        if test "x$MPI" = xt ; then
481            # YES: We symbolically link these files to the build
482            # dir so long as there is no real file in place
483            for ii in $MPI_FILES ; do
484                i=`echo $ii | sed 's:^\./::'`
485                name=`echo $i | sed 's:_mpi::' `
486                cmp $CODE_DIR/$i $BUILD_DIR/$name > /dev/null 2>&1
487                RETVAL=$?
488                if test "x$RETVAL" != x0 ; then
489                    if ! test -f $BUILD_DIR/$i ; then
490                        #echo Linking $name to $i
491                        (cd $BUILD_DIR; ln -sf ../$code_dir/$i $name)
492                    fi
493                fi
494            done
495        else
496            # NO: We undo any _mpi symbolically linked files
497            for ii in $MPI_FILES ; do
498                i=`echo $ii | sed 's:^\./::'`
499                name=`echo $i | sed 's:_mpi::' `
500                if test -L $BUILD_DIR/$name ; then
501                    cmp $BUILD_DIR/$name "../$code_dir/$name"_mpi > /dev/null 2>&1
502                    RETVAL=$?
503                    if test "x$RETVAL" = x0 ; then
504                        #echo Un-linking $name from $linktarg
505                        rm -f $BUILD_DIR/$name
506                    fi
507                fi
508            done
509        fi
510        
511    }
512    
513  linkdata()  linkdata()
514  {  {
515      # linkdata flag      # linkdata run_dir input_dir_1 input_dir_2 ...
516      #      #
517      # symbolically link data files to run directory      # symbolically link data files to run directory
518      if [ $1 -ne 0 ]; then      if test -d $1 ; then
519          ( cd $2 ;  ln -sf ../input/* . )          (
520                cd $1 ; shift
521                if test -r "../"$1"/eedata.mth" ; then
522                # found eedata.mth in 1rst input dir and it is readable
523                    if test "x$MULTI_THREAD" = "xt" ; then
524                    # multi-threaded test: remove symbolic link & link eedata.mth
525                        if test -h eedata ; then rm -f eedata ; fi
526                        if test ! -r eedata ; then
527                            ln -sf "../"$1"/eedata.mth" eedata ;
528                            printf 'eedata.mth ' 1>&2
529                        fi
530                    else
531                    # not multi-threaded test: remove eedata symbolic link
532                        if test -h eedata ; then rm -f eedata ; fi
533                    fi
534                fi
535                prevDir='NONE'
536                for ldir in $* ; do
537                    if test -d "../"$ldir -a $ldir != $prevDir ; then
538                        printf 'ldir='${ldir} 1>&2
539                        files=`( cd "../"$ldir ; ls -1 | grep -v CVS )`
540                        for i in $files ; do
541                            if test ! -d "../"$ldir/$i ; then
542                                if test ! -r $i  ; then
543                                    printf ' '$i 1>&2
544                                    ln -sf "../"$ldir"/"$i $i
545                                fi
546                            fi
547                        done
548                        if test -x "../"$ldir"/"prepare_run ; then
549                            "../"$ldir"/"prepare_run
550                        fi
551                        printf ' ; ' 1>&2
552                    fi
553                    prevDir=$ldir
554                done
555            )
556      fi      fi
557  }  }
558    
# Line 296  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 317  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 361  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 377  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.  
  -noieee    By default, $0 uses the -ieee option for genmake. This turns it off.  
  -cleanup   Aggresively removes all model output, executables and object files  
             and then exits. Use with care.  
   
 Normal usage:  
  $0 *       Configure, compile, run and analyze in all experiment directories  
 EOF  
 }  
   
706  scandirs()  scandirs()
707  {  {
708      if [ $# -eq 0 ]; then      if [ $# -eq 1 ]; then
709          for arg in * ; do          for arg in * ; do
710              test -d $arg/input && echo $arg              test -f $arg/$1 && echo $arg
711          done          done
712      else      else
713          echo $*          echo $*
714      fi      fi
715  }  }
716    
717    
718  ###############################################################################  ###############################################################################
 ###############################################################################  
 ###############################################################################  
719    
720    
721  #  Default properties  #  Default properties
722  debug=0  debug=0
723  verbose=1  verbose=1
724  clean=0  clean=0
725  expts=''  
726  # ieee=1  IEEE=true
727    if test "x$MITGCM_IEEE" != x ; then
728        IEEE=$MITGCM_IEEE
729    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  echo -n "parsing options...  "  MATCH_CRIT=13
766    
767    printf "parsing options...  "
768    
769  ac_prev=  ac_prev=
770  for ac_option ; do  for ac_option ; do
# Line 471  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 486  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 498  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            -postclean | --postclean | -pc | --pc)
850                POSTCLEAN=t ;;
851    
852          -mpi) MPI=t ;;          -mpi) MPI=t ;;
853    
854            -mth) MULTI_THREAD=t ;;
855    
856            -adm | -ad) ADM=t ;;
857    
858            -ieee) IEEE=true ;;
859            -noieee) IEEE= ;;
860            -gsl) GSL=t ;;
861    
862          -verbose) verbose=2 ;;          -verbose) verbose=2 ;;
863          -debug) debug=1 ;;          -debug) debug=1 ;;
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 523  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    CMDLINE=$0
990    for xx in "$@" ; do CMDLINE="$CMDLINE '$xx'" ; done
991  MACH=`hostname`  MACH=`hostname`
992  UNAMEA=`uname -a`  UNAMEA=`uname -a`
993  DATE=`date +%Y%m%d`  DATE=`date +%Y%m%d`
994  BASE=$MACH"_"$DATE"_"  BASE="tr_"$MACH"_"$DATE"_"
995    if test "x$OUTDIR" != x ; then
996        BASE="tr_"$OUTDIR"_"$DATE"_"
997    fi
998  DNUM=0  DNUM=0
999  DRESULTS="$BASE$DNUM"  DRESULTS="$BASE$DNUM"
1000  while test -e $DRESULTS ; do  while test -e $DRESULTS ; do
# Line 553  done Line 1004  done
1004  mkdir $DRESULTS  mkdir $DRESULTS
1005  RETVAL=$?  RETVAL=$?
1006  if test "x$RETVAL" != x0 ; then  if test "x$RETVAL" != x0 ; then
1007      echo "Error: can't create results directory \"./$DRESULTS\""      echo "ERROR: Can't create results directory \"./$DRESULTS\""
1008      exit 1      exit 1
1009  fi  fi
1010  SUMMARY="$DRESULTS/summary.txt"  SUMMARY="$DRESULTS/summary.txt"
1011  date > $SUMMARY  start_date=`date`
1012  cat << EOF >> $SUMMARY  echo $start_date > $SUMMARY
1013                  T           S           U           V  echo 'run:' $CMDLINE >> $SUMMARY
1014  G D M    c        m  s        m  s        m  s        m  s  echo 'on :' $UNAMEA  >> $SUMMARY
 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  
1015    
1016    of_path=
1017  if test "x$OPTFILE" != xNONE ; then  if test "x$OPTFILE" != xNONE ; then
1018      if test -r $OPTFILE ; then      if test -r $OPTFILE ; then
1019          OPTFILE=`pwd`"/$OPTFILE"          # get the path
1020            path=${OPTFILE%/*}
1021            if test "x$path" = x ; then
1022                of_path=`pwd`
1023            else
1024                of_path=`( cd $path > /dev/null 2>&1 ; pwd )`
1025            fi
1026            file=${OPTFILE##*/}
1027            OPTFILE=$of_path/$file
1028            cp $OPTFILE $DRESULTS
1029            echo >> $SUMMARY
1030            echo "  OPTFILE=$OPTFILE" >> $SUMMARY
1031        else
1032            echo | tee $SUMMARY
1033            echo "ERROR: can't read OPTFILE=\"$OPTFILE\"" | tee $SUMMARY
1034            exit 1
1035      fi      fi
1036    else
1037        echo >> $SUMMARY
1038        echo "No \"OPTFILE\" was explicitly specified by testreport," >> $SUMMARY
1039        echo "   so the genmake default will be used." >> $SUMMARY
1040  fi  fi
1041  echo  echo
 echo "OPTFILE=$OPTFILE" >> $SUMMARY  
1042  echo >> $SUMMARY  echo >> $SUMMARY
1043    if test "x$ADM" = x ; then
1044        if [ $MATCH_CRIT -lt 10 ] ;
1045        then line_0="default  "$MATCH_CRIT ;
1046        else line_0="default "$MATCH_CRIT ; fi
1047           line_0="$line_0  ----T-----  ----S-----  ----U-----  ----V-----"
1048    #   line_0="            ----T-----  ----S-----  ----U-----  ----V-----"
1049        line_1="G D M    c        m  s        m  s        m  s        m  s"
1050        line_2="E p a R  g  m  m  e  .  m  m  e  .  m  m  e  .  m  m  e  ."
1051        line_3="N n k u  2  i  a  a  d  i  a  a  d  i  a  a  d  i  a  a  d"
1052        line_4="2 d e n  d  n  x  n  .  n  x  n  .  n  x  n  .  n  x  n  ."
1053        for ii in $PTRACERS_NUM ; do
1054            #  tst=`eval 'echo $HAVE_PTR0'$ii`
1055            #  if test "x$tst" = xt ; then
1056            line_0="$line_0  --PTR 0"$ii"--"
1057            line_1="$line_1        m  s"
1058            line_2="$line_2  m  m  e  ."
1059            line_3="$line_3  i  a  a  d"
1060            line_4="$line_4  n  x  n  ."
1061            #  fi
1062        done
1063        echo "$line_0" | tee -a $SUMMARY
1064        echo "$line_1" | tee -a $SUMMARY
1065        echo "$line_2" | tee -a $SUMMARY
1066        echo "$line_3" | tee -a $SUMMARY
1067        echo "$line_4" | tee -a $SUMMARY
1068        echo " "       | tee -a $SUMMARY
1069    else
1070        echo "ADJOINT=true" >> $SUMMARY
1071        echo >> $SUMMARY
1072        if [ $MATCH_CRIT -lt 10 ] ;
1073        then line_0="default     "$MATCH_CRIT ;
1074        else line_0="default    "$MATCH_CRIT ; fi
1075        echo "$line_0" | tee -a $SUMMARY
1076        cat << EOF | tee -a $SUMMARY
1077    G D M    C  G
1078    E p a R  o  r
1079    N n k u  s  a
1080    2 d e n  t  d
1081    
1082    EOF
1083    fi
1084    
1085  #  ...and each test directory...  #  ...and each test directory...
1086  for dir in $TESTDIRS ; do  for dir in $TESTDIRS ; do
1087            
1088        # set builddir & rundir:
1089        builddir="build"
1090        if test ! -d $dir/$builddir ; then mkdir $dir/$builddir ; fi
1091        rundir="run"
1092        if test ! -d $dir/$rundir ; then
1093            rundir=$builddir
1094        fi
1095        CODE_DIR=$dir/$code_dir
1096        BUILD_DIR=$dir/$builddir
1097    
1098      #  Cleanup only!      #  Cleanup only!
1099      if test "x$CLEANUP" = xt ; then      if test "x$CLEANUP" = xt ; then
1100          if test -r $dir/build/Makefile ; then          if test -r $BUILD_DIR/Makefile ; then
1101              ( cd $dir/build ; make CLEAN )              echo '  ------  clean dir:' $dir/build
1102                ( cd $BUILD_DIR ; make CLEAN )
1103          fi          fi
1104          if test -r $dir/input/Makefile ; then          if test -d $dir/$rundir/CVS ; then
1105              ( cd $dir/input ; make CLEAN )              echo '  ------  clean dir:' $dir/$rundir
1106                run_clean $dir/$rundir
1107          fi          fi
1108            (
1109                cd $dir
1110                rm -rf tr_run.*
1111            )
1112          continue          continue
1113      fi      fi
1114    
1115      #  Verify that the testdir exists and contains previous      #  Verify that the testdir exists and contains previous
1116      #  results in the correct location--or skip this directory!      #  results in the correct location--or skip this directory!
1117      if test ! -r $dir"/results/output.txt" ; then      fout=$dir"/results/"$ref_outp
1118          echo "can't read \"$dir/results/output.txt\" -- skipping $dir"      if test ! -r $fout ; then
1119            echo "can't read \"$fout\" -- skipping $dir"
1120          continue          continue
1121      fi      fi
1122        if test "x$ADM" = x ; then
1123      echo "-------------------------------------------------------------------------------"          check_for_add_mon_output  $fout
     echo  
     echo "Experiment:  $dir"  
     echo  
     unset genmake makedepend make run  
     results='-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --'  
   
     if [ -r $dir/build ]; then  
         seperatebuilddir=1  
         builddir=build  
         rundir=build  
         ( cd $dir/build; ln -sf ../input/* . )  
     else  
         seperatebuilddir=0  
         builddir=input  
         rundir=input  
1124      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"  
1125    
1126      #  Is this an MPI run?      # Check for additional types of monitor output
1127      if test "x$MPI" = xt ; then  
1128          FILES=$MPI_FILES      if test ! -r $CODE_DIR"/SIZE.h_mpi" -a "x$MPI" = "xt" ; then
1129      else          echo "can't find \"$CODE_DIR/SIZE.h_mpi\" -- skipping $dir"
1130          FILES=$NOMPI_FILES          continue
1131      fi      fi
1132            if test ! -r $dir"/input/eedata.mth" -a "x$MULTI_THREAD" = "xt" ; then
1133      #  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)"  
1134          continue          continue
1135      fi      fi
1136        
1137      #  If we have the $FILES and they differ, copy the $FILES to $BUILD_DIR      #  Check whether there are "extra runs" for this testdir
1138      if test "x$have_files" = xt ; then      extra_runs=
1139          for i in $FILES ; do      ex_run_dirs=`( cd $dir ; echo $inputdir.* )`
1140              cmp $CODE_DIR/$i $BUILD_DIR/$i > /dev/null 2>&1      #echo "ex_run_dirs='$ex_run_dirs'"
1141              RETVAL=$?      for exd in $ex_run_dirs ; do
1142              if test "x$RETVAL" != x0 ; then          name=`echo $exd | sed -e "s/$inputdir\.//"`
1143                  cp $CODE_DIR/$i $BUILD_DIR/$i          refExOut=`echo $ref_outp | sed "s/\./.${name}./"`
1144            outf="$dir/results/$refExOut"
1145            if test -f $outf -a -r $outf ; then
1146                if test "x$MULTI_THREAD" = "xt" ; then
1147                    if test -r $dir"/"$exd"/eedata.mth" ; then
1148                        extra_runs="$extra_runs $name"
1149                    #else echo $dir"/"$exd"/eedata.mth: not found"
1150                    fi
1151                else
1152                    extra_runs="$extra_runs $name"
1153              fi              fi
1154          done          fi
1155        done
1156    
1157        echo "-------------------------------------------------------------------------------"
1158        echo
1159        if test "x$extra_runs" = "x" ; then
1160           echo "Experiment:  $dir"
1161        else
1162           echo "Experiment:  $dir ; extra_runs=$extra_runs"
1163      fi      fi
1164            echo
1165        unset genmake makedepend make run
1166        results=$EMPTY_RESULTS
1167    
1168      #  Create an output dir for each OPTFILE/tdir combination      #  Create an output dir for each OPTFILE/tdir combination
1169      CDIR=$DRESULTS"/"$DRESULTS"_"$NDIR      rel_CDIR=$DRESULTS"/"$dir
1170      mkdir $CDIR      mkdir $rel_CDIR
1171      CDIR=`pwd`"/$CDIR"      CDIR=`pwd`"/$rel_CDIR"
1172            
1173      if test "x$CLEANUP" = xt ; then      if test "x$CLEANUP" = xt ; then
1174          makeclean $dir/$builddir          echo '====>>> this is to check that we never go through this part <<< ==='
1175            makeclean $dir/$builddir \
1176                && run_clean $dir/$rundir
1177      else      else
1178          genmakemodel $dir/$builddir && genmake=Y \          genmakemodel $dir/$builddir && genmake=Y \
1179              && makeclean $dir/$builddir \              && makeclean $dir/$builddir \
1180                && run_clean $dir/$rundir \
1181                && symlink_mpifiles $dir $code_dir $builddir \
1182              && makedependmodel $dir/$builddir && makedepend=Y \              && makedependmodel $dir/$builddir && makedepend=Y \
1183              && makemodel $dir/$builddir && make=Y \              && makemodel $dir/$builddir && make=Y \
1184              && linkdata $seperatebuilddir $dir/$rundir \              && linkdata $dir/$rundir $inputdir input \
1185              && runmodel $dir/$builddir && run=Y \              && runmodel $dir/$rundir && run=Y \
1186              && results=`testoutput $dir $rundir`              && results=`testoutput_run $dir $rundir $ref_outp`
1187      fi      fi
1188            
1189      echo      echo
1190      formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} \          fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1191          ${run:-N} $results          echo
1192      echo          echo "$fres" | sed 's/ 99/ --/g' | sed 's/  > />/' | sed 's/  < /</' >> $SUMMARY
1193      formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} \          touch $CDIR"/summary.txt"
1194          ${run:-N} $results >> $SUMMARY          echo "fresults='$fres'" | sed 's/ 99/ --/g' >> $CDIR"/summary.txt"
1195      echo "fresults='" > $CDIR"/summary.txt"          echo "MACH='$MACH'" >> $CDIR"/summary.txt"
1196      formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} \          echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"
1197          ${run:-N} $results >> $CDIR"/summary.txt"          echo "DATE='$DATE'" >> $CDIR"/summary.txt"
1198      echo "'" >> $CDIR"/summary.txt"          echo "tdir='$dir'" >> $CDIR"/summary.txt"
1199      echo "MACH='$MACH'" >> $CDIR"/summary.txt"          if test "x$ADM" = xt ; then
1200      echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"              head -1 $dir/$builddir/taf_ad.log >> $CDIR"/summary.txt"
1201      echo "DATE='$DATE'" >> $CDIR"/summary.txt"              grep -A3 'Seconds in section "ALL' $dir/$rundir/$OUTPUTFILE \
1202      echo "tdir='$dir'" >> $CDIR"/summary.txt"                                  >> $CDIR"/summary.txt"
1203            fi
1204    
1205            for ex in $extra_runs ; do
1206                unset run
1207                results=$EMPTY_RESULTS
1208                #  reference output file
1209                refExOut=`echo $ref_outp | sed "s/\./.${ex}./g"`
1210                #  Create an output dir for each OPTFILE/tdir.ex combination
1211                rel_CDIR=$DRESULTS"/"$dir"."$ex
1212                mkdir $rel_CDIR
1213                CDIR=`pwd`"/$rel_CDIR"
1214                test ! -e "$dir/tr_run.$ex" && mkdir "$dir/tr_run.$ex"
1215                run_clean $dir/tr_run.$ex
1216                linkdata $dir/tr_run.$ex $inputdir.$ex $inputdir input
1217                runmodel $dir/tr_run.$ex && run=Y \
1218                && results=`testoutput_run $dir tr_run.$ex $refExOut`
1219                fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1220                fres="$fres.$ex"
1221                echo
1222                echo "$fres" | sed 's/ 99/ --/g' | sed 's/  > />/' | sed 's/  < /</' >> $SUMMARY
1223                touch $CDIR"/summary.txt"
1224                echo "fresults='$fres'" | sed 's/ 99/ --/g' >> $CDIR"/summary.txt"
1225                echo "MACH='$MACH'" >> $CDIR"/summary.txt"
1226                echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"
1227                echo "DATE='$DATE'" >> $CDIR"/summary.txt"
1228                echo "tdir='$dir.$ex'" >> $CDIR"/summary.txt"
1229                if test "x$ADM" = xt ; then
1230                    head -1 $dir/$builddir/taf_ad.log >> $CDIR"/summary.txt"
1231                    grep -A3 'Seconds in section "ALL' $dir/tr_run.$ex/$OUTPUTFILE \
1232                                       >> $CDIR"/summary.txt"
1233                fi
1234                if test "x$POSTCLEAN" = xt ; then
1235                    run_clean $dir/tr_run.$ex
1236                fi
1237            done
1238    
1239        #postclean $dir/$builddir
1240        if test "x$POSTCLEAN" = xt ; then
1241            makeclean $dir/$builddir \
1242                && run_clean $dir/$rundir
1243        fi
1244            
1245      (      echo "-------------------------------------------------------------------------------"
         cd $DRESULTS  
         tar -cf $NDIR".tar" $DRESULTS"_"$NDIR > /dev/null 2>&1  
         gzip $NDIR".tar"  
     )  
1246            
1247      if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then  done
1248          echo "No mail sent"  
1249      else  printf "Start time:  " >> $SUMMARY
1250          $MPACK -s MITgcm-test -m 1000000 $DRESULTS"/"$NDIR".tar.gz" $ADDRESSES  echo $start_date >> $SUMMARY
1251    printf "End time:    " >> $SUMMARY
1252    date >> $SUMMARY
1253    
1254    #  If addresses were supplied and mpack built successfully, then try
1255    #  to send email using mpack.
1256    if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then
1257        echo "No results email was sent."
1258    else
1259        if test "x$HAVE_MPACK" = xt ; then
1260            tar -cf $DRESULTS".tar" $DRESULTS > /dev/null 2>&1 \
1261                && gzip $DRESULTS".tar" \
1262                && $MPACK -s MITgcm-test -m 3555000 $DRESULTS".tar.gz" $ADDRESSES
1263          RETVAL=$?          RETVAL=$?
1264          if test "x$RETVAL" != x0 ; then          if test "x$RETVAL" != x0 ; then
1265              echo "Warning: \"$MPACK\" failed -- please contact <edhill@mitgcm.org>"              echo
1266                echo "Warning: The tar, gzip, & mpack step failed.  Please send email"
1267                echo "  to <MITgcm-support@mitgcm.org> for help.  You may copy the "
1268                echo "  summary of results from the directory \"$DRESULTS\"."
1269                echo
1270          else          else
1271              rm -f $DRESULTS"/"$NDIR".tar*"              echo
1272                echo "An email containing results was sent to the following addresses:"
1273                echo "  \"$ADDRESSES\""
1274                echo
1275          fi          fi
1276            test -f $DRESULTS".tar"  &&  rm -f $DRESULTS".tar"
1277            test -f $DRESULTS".tar.gz"  &&  rm -f $DRESULTS".tar.gz"
1278      fi      fi
1279    fi
1280    
1281      echo "-------------------------------------------------------------------------------"  rm -f tr_cmpnum.c tr_cmpnum
       
     NDIR=$(( $NDIR + 1 ))  
       
 done  
1282    
1283  rm tmp_cmpnum.f a.out  if test "x$CLEANUP" != xt ; then
1284        cat $SUMMARY | sed 's/ \.  \.  \.  \.  \.  \.  \.  \.  \.  \.  \.  \. //'
1285        if test -e tr_out.txt ; then
1286            mv tr_out.txt tr_out.txt.old
1287        fi
1288        cat $SUMMARY | sed '/^[YN] [YN] [YN] [YN]/ s/ \. //g' > tr_out.txt
1289    fi
1290    
1291  cat $SUMMARY  if test "x$DELDIR" = xt ; then
1292        rm -rf $DRESULTS
1293    fi
1294    

Legend:
Removed from v.1.9.2.8  
changed lines
  Added in v.1.111

  ViewVC Help
Powered by ViewVC 1.1.22