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

Legend:
Removed from v.1.11  
changed lines
  Added in v.1.186

  ViewVC Help
Powered by ViewVC 1.1.22