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

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

  ViewVC Help
Powered by ViewVC 1.1.22