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

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

  ViewVC Help
Powered by ViewVC 1.1.22