/[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.1 by edhill, Wed Aug 27 22:12:31 2003 UTC revision 1.191 by jmc, Thu Jul 25 00:42:41 2013 UTC
# Line 1  Line 1 
1  #!/bin/bash  #! /usr/bin/env bash
2  #  #
3  #  $Header$  #  $Header$
4    #  $Name$
5  #  #
6    
7  usage()  usage()
# Line 10  usage() Line 11  usage()
11      echo      echo
12      echo "where possible OPTIONS are:"      echo "where possible OPTIONS are:"
13      echo "  (-help|-h)               print usage"      echo "  (-help|-h)               print usage"
14      echo "  (-optfile=|-of=)STRING   list of genmake2 \"optfiles\""      echo "  (-mth)                   run multi-threaded (using eedata.mth)"
15      echo "  (-a|-addr)STRING         list of email recipients"      echo "  (-mpi)                   use MPI to compile and run on 2 processors"
16      echo "  (-t|-tdir)STRING         list of \"test\" dirs"      echo "  (-MPI)  NUMBER           use MPI to compile and run on max NUMBER procs"
17        echo "  (-mfile|-mf) STRING      MPI: file with list of possible machines to run on"
18        echo "  (-fast)                  use optfile default for compiler flags (no '-ieee')"
19        echo "                            DEF=off => use IEEE numerics option (if available)"
20        echo "  (-devel)                 use optfile developement flags (if available)"
21        echo "  (-gsl)                   compile with \"-gsl\" flag"
22        echo "  (-use_r4|-ur4)           if allowed, use real*4 type for '_RS' variable"
23        echo "  (-optfile|-of) STRING    list of optfiles to use"
24        echo "  (-addr|-a) STRING        list of email recipients"
25        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\")"
45        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\""
58        echo "  (-nogenmake|-ng)         skip the genmake stage"
59        echo "  (-noclean|-nc)           skip the \"make clean\" stage"
60        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
68        echo "and where STRING can be a whitespace-delimited list"
69        echo "such as:"
70        echo
71        echo "  -t 'exp0 exp2 exp3' "
72        echo "  -addr='abc@123.com testing@home.org'"
73        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      echo
77      exit 1      exit 1
78  }  }
# Line 20  usage() Line 80  usage()
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          fi
94          echo -n "building mpack...  "          if test "x$CC" = x ; then
95          ( cd $MPACKDIR && ./configure && make ) > build_mpack.out 2>&1              export CC=cc
96            fi
97            printf "building mpack (using CC=$CC)...  "
98            ( 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()
351  {  {
352      # genmakemodel directory      # genmakemodel directory
353      GENMAKE2="../../../tools/genmake2"      if test "x$NOGENMAKE" = xt ; then
354      (          echo "genmake skipped!"
355          cd $1;      else
356          printf 'genmake ... ' 1>&2          if test "x$BASH" = x ; then
357          # ../../../tools/genmake -ieee -mods=../code > make.log 2>&1              GENMAKE2="../../../tools/genmake2"
         $GENMAKE2  -ds --mods=../code "--optfile="$OPTFILE > make.log 2>&1  
         RETVAL=$?  
         for i in gm_state gm_optfile gm_local Makefile ; do  
             if test -r $i ; then  
                 cp $i $CDIR  
             fi  
         done  
         if test "x$RETVAL" != x0 ; then  
             tail make.log  
             echo "genmakemodel: genmake failed" 1>&2  
             cp make.log $CDIR  
             return 1  
358          else          else
359              echo "succesful" 1>&2              GENMAKE2="$BASH ../../../tools/genmake2 -bash $BASH"
360          fi          fi
361      )          (
362                cd $1;
363                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
375                    command="$command -optfile=$OPTFILE"
376                fi
377                if test $OptLev = 1 ; then
378                    command="$command -ieee"
379                fi
380                if test $OptLev = 0 ; then
381                    command="$command -devel"
382                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=$?
412                #  Reduce the size of the testing emails!
413                head -100 Makefile > $CDIR/Makefile_head
414                if test "x$RETVAL" != x0 ; then
415                    tail genmake.tr_log
416                    echo "genmakemodel: genmake failed"
417                    cp genmake.log genmake_* genmake.tr_log $CDIR
418                    return 1
419                else
420                    echo "successful"
421                fi
422            )
423        fi
424  }  }
425    
426  makeclean()  makeclean()
427  {  {
428      # makeclean directory      # makeclean directory
429      (      if test "x$NODEPEND" = xf ; then rm -f $1/make.tr_log ; fi
430          cd $1;      if test "x$NOCLEAN" = xt ; then
431          rm -f output.txt          echo "make Clean skipped!"
432          printf 'make CLEAN ... ' 2>&1      else
433          if test -r Makefile ; then          (
434              make CLEAN >> make.log 2>&1              cd $1;
435              RETVAL=$?              #if test -e $OUTPUTFILE ; then rm -f $OUTPUTFILE ; fi
436              if test "x$RETVAL" != x0 ; then              if test -r Makefile ; then
437                  tail make.log                  printf 'clean build-dir: make Clean ... '
438                  echo "makeclean: \"make CLEAN\" failed" 1>&2                  $MAKE Clean >> make.tr_log 2>&1
439                  cp make.log $CDIR"/make.log"                  RETVAL=$?
440                  return 1                  if test "x$RETVAL" != x0 ; then
441                        tail make.tr_log
442                        echo "makeclean: \"make Clean\" failed"
443                        cp make.tr_log genmake.log genmake.tr_log $CDIR
444                        return 1
445                    fi
446                    echo successful
447                else
448                    echo ''
449              fi              fi
450          fi              exit 0
451          echo succesful 1>&2          )
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 (already done above)
470            rm -f $RUNLOG *.txt STDOUT.* STDERR.* *diagnostics.log *.[0-9][0-9][0-9][0-9].log
471            rm -f datetime costfinal divided.ctrl snapshot* output_adm.*.diva_*
472            rm -f *_MIT_CE_000.opt0000 costfunction*0000
473            rm -f oad_cp.[0-9][0-9][0-9].?????
474            rm -rf mnc_test_*
475            echo successful
476          exit 0          exit 0
477      )        )
478        fi
479  }  }
480    
481  makedependmodel()  makedependmodel()
482  {  {
483      # makedependmodel directory      # makedependmodel directory
484      (      if test "x$NODEPEND" = xt ; then
485          cd $1;          echo "make depend skipped!"
486          printf 'make depend ... ' 1>&2      else
487          make depend >> make.log 2>&1          (
488          RETVAL=$?              cd $1;
489          if test "x$RETVAL" != x0 ; then              printf 'make depend ... '
490              tail make.log              $MAKE depend >> make.tr_log 2>&1
491              echo "makedependmodel: make depend failed" 1>&2              RETVAL=$?
492              cp make.log $CDIR"/make.log"              if test "x$RETVAL" != x0 ; then
493              return 1                  tail make.tr_log
494          else                  echo "makedependmodel: make depend failed"
495              echo succesful 1>&2                  cp make.tr_log genmake.log genmake.tr_log $CDIR
496          fi                  return 1
497      )              else
498                    echo successful
499                fi
500            )
501        fi
502  }  }
503    
504  makemodel()  makemodel()
505  {  {
506      # makemodel directory      # makemodel directory
507      (      (
508        mk_fail=0
509        if test "x$NOMAKE" = xt ; then
510            cd $1;
511            if test -x $EXECUTABLE ; then
512                echo "make skipped!"
513            else
514                echo "no executable!"
515                mk_fail=3
516            fi
517        else
518          cd $1;          cd $1;
519          if test -r Makefile ; then          if test -r Makefile ; then
520              printf 'make ... ' 1>&2              printf 'make ... '
521              make >> make.log 2>&1              if test "x$REPLMAKE" = x ; then
522                    $MAKE $TARG >> make.tr_log 2>&1
523                else
524                    $REPLMAKE $TARG >> make.tr_log 2>&1
525                fi
526              RETVAL=$?              RETVAL=$?
527              if test "x$RETVAL" != x0 ; then              if test "x$RETVAL" != x0 ; then
528                  tail make.log                  tail make.tr_log
529                  echo failed 1>&2                  echo failed
530                  cp make.log $CDIR"/make.log"                  cp genmake.log genmake.tr_log $CDIR
531                  return 1                  tail -$NBLINES_MKLOG make.tr_log > $CDIR"/make.tr_log_tail"
532                    rm -f $EXECUTABLE
533                    mk_fail=1
534              else              else
535                  echo succesful 1>&2                  echo successful
536              fi              fi
537            else
538                echo "no Makefile !"
539                mk_fail=2
540          fi          fi
541        fi
542        if test $KIND = 1 -a -f taf_ftl.log ; then
543            head -1 taf_ftl.log >> $CDIR"/summary.txt"
544        fi
545        if test $KIND = 2 -a -f taf_ad.log ; then
546            head -1 taf_ad.log >> $CDIR"/summary.txt"
547            nerr=`grep -c 'TAF *.* ERROR ' taf_ad.log`
548            nwar=`grep -c 'TAF RECOMPUTATION *.* WARNING ' taf_ad.log`
549            if test -f taf_output ; then
550                n2er=`grep -c 'TAF *.* ERROR ' taf_output`
551                n3er=`grep -c '\*ERROR\* ' taf_output`
552                nerr=`expr $nerr + $n2er + $n3er`
553            fi
554            echo " TAF reports $nerr Errors and $nwar Recomputation Warnings" \
555                                    >> $CDIR"/summary.txt"
556        fi
557        if test $mk_fail != 0 ; then return $mk_fail ; fi
558      )      )
559  }  }
560    
561    mk_mpi_size()
562    {
563        # mk_mpi_size input_file output_file proc_Nb threads_Nb_X threads_Nb_Y
564        #
565        #  make new SIZE.h (=output_file) from SIZE.h_mpi (=input_file)
566        #     for an MPI build with no more than proc_Nb processors ;
567        #  ensure that enough tiles per proc (nSx,nSy) remain for the given
568        #     number of threads (nTx,nTy) ;
569        #  return the effective number of processors.
570    
571        inp=$1
572        out=$2
573        np=$3
574        tx=$4
575        ty=$5
576        tmp=TTT.$$
577    
578        # dirX : select with direction to favor in MPI process repartition
579        #   dirX=1 : prefer to put more proc in X direction
580        #   dirX=0 : prefer to put more proc in Y direction
581        dirX=0
582    
583        px=`grep "^     & *nPx *=" $inp | sed "s/^     & *nPx *= *//" | sed 's/, *$//'`
584        py=`grep "^     & *nPy *=" $inp | sed "s/^     & *nPy *= *//" | sed 's/, *$//'`
585        sx=`grep "^     & *nSx *=" $inp | sed "s/^     & *nSx *= *//" | sed 's/, *$//'`
586        sy=`grep "^     & *nSy *=" $inp | sed "s/^     & *nSy *= *//" | sed 's/, *$//'`
587    
588        #- for each direction, assume # of threads is a multiple of total number of tiles
589        nx=$px
590        if [ `expr $sx % $tx` -ne 0 -a `expr $sx \* $px % $tx` -eq 0 ] ; then
591            nx=`expr $sx \* $px / $tx`
592            if [ $verbose -gt 1 ]; then
593                echo " change px from $px to $nx to accommodate $tx threads"
594            fi
595        fi
596        ny=$py
597        if [ `expr $sy % $ty` -ne 0 -a `expr $sy \* $py % $ty` -eq 0 ] ; then
598            ny=`expr $sy \* $py / $ty`
599            if [ $verbose -gt 1 ]; then
600                echo " change py from $py to $ny to accommodate $ty threads"
601            fi
602        fi
603        #- find the largest divisor of input_file proc Nb, but not larger than $np
604        pp=0
605        i=1
606        while [ $i -le $nx ] ; do
607          if [ `expr $nx % $i` -eq 0 ] ; then
608            j=1
609            while [ $j -le $ny ] ; do
610              if [ `expr $ny % $j` -eq 0 ] ; then
611                ij=`expr $i \* $j`
612                if [ $ij -gt $pp ] ; then
613                    flag=1
614                elif [ $ij -eq $pp ] ; then
615                    flag=$dirX
616                else
617                    flag=0
618                fi
619                if test $flag = 1 ; then
620                  if [ $ij -le $np ] ; then
621                    ix=$i ; jy=$j ; pp=$ij
622                    #echo "  ix,jy= $ix,$jy"
623                  fi
624                fi
625              fi
626              j=`expr $j + 1`
627            done
628          fi
629          i=`expr $i + 1`
630        done
631    
632        #- create new SIZE.h type file:
633        sx=`expr $sx \* $px / $ix`
634        sy=`expr $sy \* $py / $jy`
635        if [ $verbose -gt 1 ]; then
636            echo " px,py,np= $px,$py,$np : New MPI size: px,py= $ix,$jy : sx,sy= $sx,$sy"
637        fi
638        sed "/^     \& *nPx *=/s/[0-9]*,/$ix,/" $inp > $tmp
639        sed "/^     \& *nPy *=/s/[0-9]*,/$jy,/" $tmp > $out
640        sed "/^     \& *nSx *=/s/[0-9]*,/$sx,/" $out > $tmp
641        sed "/^     \& *nSy *=/s/[0-9]*,/$sy,/" $tmp > $out
642        rm -f $tmp
643        return $pp
644    }
645    
646    symlink_mpifiles()
647    {
648        # Put special links so that MPI specific files are used
649        # This MUST be invoked between makeclean and makelinks because
650        # the Makefile will link to non-mpi files by default
651    
652        dir=$1
653        code_dir=$2
654        build_dir=$dir/$3
655    
656        # These are files that should replace their counter-part when using -mpi
657        MPI_FILES=`(cd $dir/$code_dir; find . -name "*_mpi" -print)`
658    
659        for ii in $MPI_FILES ; do
660            i=`echo $ii | sed 's:^\./::'`
661            name=`echo $i | sed 's:_mpi::'`
662            file="../$code_dir/$i"
663            if test $name = 'SIZE.h' ; then file="SIZE.h.mpi" ; fi
664    
665            #  Is this an MPI run?
666            if test "x$MPI" = x0 ; then
667                # NO: We undo any _mpi symbolically linked files
668                if test -L $build_dir/$name ; then
669                    ( cd $build_dir ; cmp $name $file > /dev/null 2>&1 )
670                    RETVAL=$?
671                    if test "x$RETVAL" = x0 ; then
672                        if [ $verbose -gt 1 ]; then
673                            echo "  Un-linking $name from ../$code_dir" ; fi
674                        rm -f $build_dir/$name
675                    fi
676                fi
677            else
678                # YES: We symbolically link these files to the build
679                # dir so long as there is no real file in place
680                ( cd $build_dir ; cmp $name $file > /dev/null 2>&1 )
681                RETVAL=$?
682                if [ $verbose -gt 1 ]; then echo "  cmp $name $file returns: $RETVAL" ; fi
683                if test "x$RETVAL" != x0 ; then
684                    if test -h $build_dir/$name ; then rm -f $build_dir/$name ; fi
685                    if test ! -r $build_dir/$name ; then
686                        if [ $verbose -gt 1 ]; then echo "  Linking $name to $file" ; fi
687                        (cd $build_dir; ln -sf $file $name)
688                    fi
689                fi
690            fi
691        done
692    }
693    
694  linkdata()  linkdata()
695  {  {
696      # linkdata flag      # linkdata run_dir input_dir_1 input_dir_2 ...
697      #      #
698      # symbolically link data files to run directory      # symbolically link data files to run directory
699      if [ $1 -ne 0 ]; then      if test -d $1 ; then
700          ( cd $2 ;  ln -sf ../input/* . )          (
701                cd $1 ; shift
702                echo 'linkdata from dirs:' $*
703                inpMPI=`(cd ../$1 ; find . -name "*.mpi" -print | sed 's:^\./::')`
704                for xx in $inpMPI ; do
705                  if test -r "../"$1"/"$xx ; then
706                    # found 1 _mpi sfx file in 1rst input dir and it is readable
707                    yy=`echo $xx | sed 's:\.mpi$::'`
708                    if test "x$MPI" = "x0" ; then
709                        # not mpi test: remove symbolic link
710                        if test -h $yy ; then rm -f $yy ; fi
711                    else
712                        # mpi test: remove symbolic link & link .mpi sfx file
713                        if test -h $yy ; then rm -f $yy ; fi
714                        if test ! -r $yy ; then
715                            ln -sf "../"$1"/"$xx $yy ;
716                            printf " $xx" 1>&2
717                        fi
718                    fi
719                  fi
720                done
721                if test -r "../"$1"/eedata.mth" ; then
722                # found eedata.mth in 1rst input dir and it is readable
723                    if test "x$MULTI_THREAD" = "xt" ; then
724                    # multi-threaded test: remove symbolic link & link eedata.mth
725                        if test -h eedata ; then rm -f eedata ; fi
726                        if test ! -r eedata ; then
727                            ln -sf "../"$1"/eedata.mth" eedata ;
728                            printf ' eedata.mth' 1>&2
729                        fi
730                    else
731                    # not multi-threaded test: remove eedata symbolic link
732                        if test -h eedata ; then rm -f eedata ; fi
733                    fi
734                fi
735                prevDir='NONE'
736                for ldir in $* ; do
737                    if test -d "../"$ldir -a $ldir != $prevDir ; then
738                        printf " ldir=${ldir}:" 1>&2
739                        files=`( cd "../"$ldir ; ls -1 | grep -v CVS )`
740                        for i in $files ; do
741                            if test ! -d "../"$ldir/$i ; then
742                                if test ! -r $i  ; then
743                                    printf ' '$i 1>&2
744                                    ln -sf "../"$ldir"/"$i $i
745                                fi
746                            fi
747                        done
748                        printf ' ;' 1>&2
749                        if test -x "../"$ldir"/"prepare_run ; then
750                            "../"$ldir"/"prepare_run 1>&2
751                        else
752                            echo '' 1>&2
753                        fi
754                    fi
755                    prevDir=$ldir
756                done
757            )
758      fi      fi
759  }  }
760    
761  runmodel()  runmodel()
762  {  {
763      # runmodel directory exe      # runmodel directory
764      #      #
765      #  runs the model "exe" in "directory" (exe is relative to directory)      #  runs $COMMAND in "directory"
766        #  (where "$COMMAND" is relative to "directory")
767      (      (
768          cd $1          cd $1
769          if [ -x $2 ]; then          printf 'runmodel in %s ... ' $1
770              if [ $quick -eq 0 ]; then          if test "x$MPI" != x0 ; then
771                  rm -f output.txt              #- adjust the MPI run command with the right number of Procs
772                #echo '' ; echo "  COMMAND='$COMMAND'"
773                COMMAND=`echo $COMMAND | sed "s/ TR_NPROC / $LOC_NPROC /"`
774                if test "x$MPI_MFILE" != x ; then
775                  COMMAND=`echo $COMMAND | sed "s/ TR_MFILE / ..\/..\/$LOC_MFILE /"`
776              fi              fi
777              printf 'runmodel: ' 1>&2              #echo "  COMMAND='$COMMAND'"
778              make output.txt          fi
779            if test -L $EXECUTABLE ; then
780              if test -x "../"$builddir"/"$EXECUTABLE ; then
781                cmp $EXECUTABLE "../"$builddir"/"$EXECUTABLE > /dev/null 2>&1
782                outD=$? ; if test "x$outD" != x0 ; then rm -f $EXECUTABLE ; fi
783              else rm -f $EXECUTABLE
784              fi
785            fi
786            if test ! -x $EXECUTABLE -a -x "../"$builddir"/"$EXECUTABLE ; then
787                echo " link" $EXECUTABLE "from dir ../"$builddir > run.log_tmp
788                ln -sf "../"$builddir"/"$EXECUTABLE .
789            fi
790            if test ! -x $EXECUTABLE ; then
791                rm -f $RUNLOG ; touch $RUNLOG
792                if test -f run.log_tmp ; then cat run.log_tmp >> $RUNLOG ; fi
793                echo " no executable:" $EXECUTABLE >> $RUNLOG
794                RETVAL=8
795                ENDVAL=-1
796            else
797              if test ! -f $OUTPUTFILE -o $OUTPUTFILE -ot $EXECUTABLE ; then
798                # output do not exist or is older than executable:
799                rm -f $OUTPUTFILE $RUNLOG ; touch $RUNLOG
800                if test -f run.log_tmp ; then cat run.log_tmp >> $RUNLOG ; fi
801            #- Divided Adjoint Run:
802            #  get the number of additional runs (add_DIVA_runs) from file "run_ADM_DIVA"
803                if test $KIND = 2 -a -f run_ADM_DIVA ; then
804                  adm_diva_nb=`sed -n '/^ *add_DIVA_runs\>.*=/p' run_ADM_DIVA | sed 's/ //g'`
805                  echo " Divided Adjoint Run: $adm_diva_nb" >> $RUNLOG
806                  eval "let $adm_diva_nb"
807                  if [ $add_DIVA_runs -ge 1 ] ; then
808                    rm -f costf* divided.ctrl snapshot*
809                    echo -n "(add_DIVA_runs=$add_DIVA_runs) ... "
810                    for ii in `seq 1 $add_DIVA_runs` ; do
811                      ( eval $COMMAND ) >> $RUNLOG 2>&1
812                      echo " additional DIVA run # $ii : done" >> $RUNLOG
813                      mv -f $OUTPUTFILE ${OUTPUTFILE}.diva_${ii}
814                    done
815                  fi
816                fi
817            #- special DIVA processing ends here
818                ( eval $COMMAND ) >> $RUNLOG 2>&1
819              RETVAL=$?              RETVAL=$?
820              if test "x$RETVAL" = x0 ; then              ENDVAL=`tail $OUTPUTFILE | grep -c 'PROGRAM MAIN: Execution ended Normally'`
821                  cp output.txt $CDIR"/output.txt"              if [ $POSTCLEAN -eq 1 -a $ENDVAL -gt 0 ] ; then
822                  return 0                  find . -name "*.meta" -exec rm {} \;
823              else                  find . -name "*.data" -exec rm {} \;
824                  return 1                  rm -rf mnc_test_*
825              fi              fi
826              else
827                RETVAL=0
828                ENDVAL=`tail $OUTPUTFILE | grep -c 'PROGRAM MAIN: Execution ended Normally'`
829                touch $RUNLOG
830                if test -f run.log_tmp ; then cat run.log_tmp >> $RUNLOG ; fi
831                echo "---------->> $OUTPUTFILE is up to date " >> $RUNLOG 2>&1
832              fi
833            fi
834            rm -f run.log_tmp
835            #- in all cases where OutputFile exists, report SIZE and time
836            if test -f $OUTPUTFILE ; then
837              grep '(PID\.TID 0000\.0001)      n.. =' $OUTPUTFILE \
838                    | sed 's/(PID.TID 0000.0001)   //' >> $CDIR"/summary.txt"
839              grep -A3 'Seconds in section "ALL' $OUTPUTFILE \
840                    | sed 's/(PID.TID 0000.0001)   //' >> $CDIR"/summary.txt"
841            fi
842            if test -s STDERR.0000 ; then cp STDERR.0000 $CDIR"/STDERR.0000" ; fi
843            if [ $RETVAL -eq 0 -a $ENDVAL -gt 0 ] ; then
844                echo successful
845                printf '=> output from running in %s :\n' $1 1>&2
846                tail $RUNLOG | sed 's/^.*/> &/g' 1>&2
847                return 0
848            elif [ $RETVAL -ne 0 -a $ENDVAL -gt 0 ] ; then
849                #-- for some weird cases (run is finihed but with error code)
850                echo 'finished with error (run:' $RETVAL ' end:' $ENDVAL ')'
851                printf '=> output from running in %s :\n' $1 1>&2
852                tail $RUNLOG | sed 's/^.*/> &/g' 1>&2
853                return 0
854            else
855                echo 'failed (run:' $RETVAL ' end:' $ENDVAL ')'
856                printf '=> output from running in %s :\n' $1 1>&2
857                tail $RUNLOG | sed 's/^.*/> &/g' 1>&2
858                cp $RUNLOG $CDIR"/"$RUNLOG
859                return 1
860          fi          fi
861      )      )
862  }  }
# Line 283  createcodelet() Line 865  createcodelet()
865  {  {
866      # create codelet for comparing model output      # create codelet for comparing model output
867    
868      echo -n "creating the comparison code...  "      printf "creating the comparison code (using CC=$CC)...  "
869      cat > tmp_cmpnum.f <<EOFA      cat > tr_cmpnum.c <<EOF
870        program cmpnum  #include <stdio.h>
871        implicit none  #include <math.h>
872        real*8 a,b,diff  int main( int argc, char** argv )  {
873        integer linnum,best    int linnum,cmplin,best,lncnt;
874        best=-16    double a,b,abave,relerr;
875    99  read(*,*,end=70,err=60) linnum,a,b    best = -22;
876        diff=0.5*(abs(a)+abs(b))    lncnt = 0;
877  c     print *,a,b,diff,abs(a-b)/diff    while( 1 & ( (lncnt+=1) < 999 ) )  {
878        if (diff.gt.1.e-12) then      scanf("%d", &linnum);
879          diff=abs(a-b)/diff      if (linnum == -1)  break;
880          if (diff.gt.0.) then      scanf("%lf", &a);  scanf("%lf", &b);
881  c         print *,int(log10(diff)),diff      abave = 0.5*(fabs(a)+fabs(b));
882            linnum=int(log10(diff))      if ( abave == abave ) {
883            best=max(best,linnum)        if (abave > 0.0) {
884          endif          relerr=fabs(a-b)/abave;
885        else          if (relerr > 0.0) { cmplin = (int)rint(log10(relerr)); }
886          if (best.eq.-16.and.diff.ne.0.) best=-22          else { cmplin = -16 ; }
887        endif          best = (best > cmplin) ? best : cmplin; }
888        goto 99        else { cmplin = -22 ; }
889    60  stop 'cmpnum: An error occured reading a,b'     /* printf("%d ; %lf ; %lf\n",cmplin,a,b); */
890    70  print *,-best        }
891        end     else {
892  EOFA     /* printf("%lf ; %lf ; %lf\n",abave,a,b); */
893          break; }
894      }
895      if (lncnt == 999) best=-29;
896      if (linnum != -1) best=-99;
897      printf("%d\n", -best);
898      return 0;
899    }
900    EOF
901        $CC -o tr_cmpnum tr_cmpnum.c -lm
902    
903      f77 tmp_cmpnum.f      if [ -x ./tr_cmpnum ]; then
     if [ -x ./a.out ]; then  
904          echo "OK"          echo "OK"
905          return 0          return 0
906      else      else
907          echo          echo
908          echo "createcodelet: failed to compile codelet" | tee          echo "ERROR: failed to compile comparison code -- please specify"
909            echo "  a C compiler using the CC environment variable."
910          exit 1          exit 1
911      fi      fi
912  }  }
# Line 327  formatresults() Line 918  formatresults()
918      nm=$1      nm=$1
919      printf '%s %s %s %s' $2 $3 $4 $5      printf '%s %s %s %s' $2 $3 $4 $5
920      shift; shift; shift; shift; shift;      shift; shift; shift; shift; shift;
921      printf '%3s' $@      listPrt=$@
922            listRes=`echo $listPrt | sed 's/>//' | sed 's/<//'`
923      if [ $1 = '--' ]; then      xx=`echo $listPrt | sed 's/.*>//' | sed 's/<.*//' | awk '{print $1}'`
924        printf '%3s' $listPrt
925    #   line below does not work on hp-ux_ia64 : do those substitutions later on
926    #   printf '%3s' $listPrt | sed 's/ 99/ --/g' | sed 's/  > />/' | sed 's/  < /</'
927    
928        if [ $xx = '..' ]; then
929            printf ' N/O '
930        elif [ $xx = '--' ]; then
931            printf ' N/O '
932        elif [ $xx = 99 ]; then
933          printf ' N/O '          printf ' N/O '
934      else      else
935          if [ $1 -gt 12 ]; then          if [ $xx -ge $MATCH_CRIT ]; then
936              printf ' pass'              printf ' pass'
937          else          else
938              printf ' FAIL'              printf ' FAIL'
939          fi          fi
940      fi      fi
941      printf '  %s' $nm      printf '  %s' $nm
942        if test $KIND = 2 ; then
943            #-- apppend taf repport summary:
944            tafrep=`grep -c '^ TAF reports ' $CDIR/summary.txt`
945            if test $tafrep = 1 ; then
946                grep '^ TAF reports ' $CDIR/summary.txt | awk '{printf "  (e=%i, w=%i)",$3,$6}'
947            fi
948        fi
949      printf '\n'      printf '\n'
       
 }  
   
 show_help()  
 {  
     cat - << EOF  
 $0 [-help] [-quick] [-verbose] dir1 [dir2] [...]  
  -help      Show this help message  
  -quick     Skip "genmake" and "make depend" if the Makefile exists  
  -quiet     Reduce the amount of output  
  -verbose   Produce copious amounts of output  
  -debug     Produce even more output which will mean nothing to most  
  -force     Do "make CLEAN" before compiling. This forces a complete rebuild.  
  -clean     Do "make CLEAN" after compiling and testing.  
  -noieee    By default, $0 uses the -ieee option for genmake. This turns it off.  
  -cleanup   Aggresively removes all model output, executables and object files  
             and then exits. Use with care.  
950    
 Normal usage:  
  $0 *       Configure, compile, run and analyze in all experiment directories  
 EOF  
951  }  }
952    
953  scandirs()  scandirs()
954  {  {
955      if [ $# -eq 0 ]; then      if [ $# -eq 1 ]; then
956          for arg in * ; do          for arg in * ; do
957              test -d $arg/input && echo $arg             #test -f $arg/$1 && echo $arg
958          done              test -f $arg/$1 -o -f $arg/$1.gz && echo $arg
959            done
960      else      else
961          echo $*          echo $*
962      fi      fi
963  }  }
964    
965    
966  ###############################################################################  check_eedata()
967  ###############################################################################  {
968        # check_eedata eedata size.h
969        if [ $# -eq 2 ] ; then
970         if test -f $1 -a -f $2 ; then
971          nx=`grep "^ *nTx *=" $1 | tail -1 | sed 's/^ *nTx *= *//' | sed "s/, *$//"`
972          sx=`grep "^     & *nSx *=" $2 | sed "s/^     & *nSx *=//" | sed 's/, *$//'`
973          if test "x$nx" = x ; then
974            rx=10
975          else
976            rx=`expr $sx % $nx`
977          fi
978          ny=`grep "^ *nTy *=" $1 | tail -1 | sed 's/^ *nTy *= *//' | sed "s/, *$//"`
979          sy=`grep "^     & *nSy *=" $2 | sed "s/^     & *nSy *=//" | sed 's/, *$//'`
980          if test "x$ny" = x ; then
981            ry=20
982          else
983            ry=`expr $sy % $ny`
984          fi
985          echo `expr $rx + $ry`
986         else
987          echo '-1'
988         fi
989        elif [ $# -eq 1 ] ; then
990         if test -f $1 ; then
991          nx=`grep "^ *nTx *=" $1 | tail -1 | sed 's/^ *nTx *= *//' | sed "s/, *$//"`
992          if test "x$nx" = x ; then nx=1 ; fi
993          ny=`grep "^ *nTy *=" $1 | tail -1 | sed 's/^ *nTy *= *//' | sed "s/, *$//"`
994          if test "x$ny" = x ; then ny=1 ; fi
995         #echo $nx $ny
996          echo $nx
997         else
998          echo '-1'
999         fi
1000        else
1001          echo '-2'
1002        fi
1003    
1004    }
1005    
1006  ###############################################################################  ###############################################################################
1007    
1008    
1009  #  Default properties  #  Default properties
1010  debug=0  debug=0
1011  verbose=1  verbose=1
1012  quick=0  NBLINES_MKLOG=16000
 clean=0  
 ieee=1  
 expts=''  
1013    
1014  OPTFILES=  OptLev=1
1015  ADDRESSES=edhill@mitgcm.org  GSL=f
1016    
1017    CLEANUP=f
1018    NORUN=f
1019    QUICK=f
1020    NOMAKE=f
1021    NOGENMAKE=f
1022    NOCLEAN=f
1023    NODEPEND=f
1024    POSTCLEAN=0
1025    
1026    BASH=
1027    OPTFILE=NONE
1028    ADDRESSES=
1029  TESTDIRS=  TESTDIRS=
1030    SKIPDIRS=
1031  MPACKDIR="../tools/mpack-1.6"  MPACKDIR="../tools/mpack-1.6"
1032  MPACK="$MPACKDIR/mpack"  HAVE_MPACK=
1033    MPACK=
1034    COMMAND=
1035    MKDEPEND=
1036    if test "x$MAKE" = x ; then
1037        MAKE=make
1038    fi
1039    REPLMAKE=
1040    if test "x$CC" = x ; then
1041        CC=cc
1042    fi
1043    JOBS=
1044    TARG=
1045    MPI=0
1046    MPI_MFILE=
1047    MULTI_THREAD=f
1048    OUTDIR=
1049    DELDIR=
1050    USE_R4=
1051    EXTRFLG=
1052    
1053    #- type of testing (KIND):
1054    #   KIND=0 : forward (= default) ;  KIND=1 : Tangent Linear with TAF ;
1055    #   KIND=2 : Adjoint with TAF ;     KIND=4 : Adjoint with OpenAD
1056    KIND=0
1057    
1058    # list of pTracers to check for monitor output
1059    PTRACERS_NUM="1 2 3 4 5"
1060    
1061    MATCH_CRIT=10
1062    
1063  echo -n "parsing options...  "  printf "parsing options...  "
1064    
1065  ac_prev=  ac_prev=
1066  for ac_option ; do  for ac_option ; do
# Line 407  for ac_option ; do Line 1073  for ac_option ; do
1073      fi      fi
1074    
1075      ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`      ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
1076        
1077      case $ac_option in      case $ac_option in
1078                    
1079          -help | --help | -h | --h)          -help | --help | -h | --h) usage ;;
1080              usage ;;  
1081                    -optfile | --optfile | -of | --of) ac_prev=OPTFILE ;;
1082          -optfile | --optfile | -f | --f)          -optfile=* | --optfile=* | -of=* | --of=*) OPTFILE=$ac_optarg ;;
1083              ac_prev=OPTFILES ;;  
1084          -optfile=* | --optfile=*)          -addr | --addr | -a | --a) ac_prev=ADDRESSES ;;
1085              OPTFILES=$ac_optarg ;;          -addr=* | --addr=* | -a=* | --a=*) ADDRESSES=$ac_optarg ;;
1086                    -mpackdir | --mpackdir | -mpd | --mpd) ac_prev=MPACKDIR ;;
1087          -addr | --addr | -a | --a)          -mpackdir=* | --mpackdir=* | -mpd=* | --mpd=*) MPACKDIR=$ac_optarg ;;
1088              ac_prev=ADDRESSES ;;  
1089          -addr=* | --addr=*)          -tdir | --tdir | -t | --t) ac_prev=TESTDIRS ;;
1090              ADDRESSES=$ac_optarg ;;          -tdir=* | --tdir=* | -t=* | --t=*) TESTDIRS=$ac_optarg ;;
1091            -skipdir | --skipdir | -skd | --skd) ac_prev=SKIPDIRS ;;
1092          -tdir | --tdir | -t | --t)          -skipdir=* | --skipdir=* | -skd=* | --skd=*) SKIPDIRS=$ac_optarg ;;
1093              ac_prev=TESTDIRS ;;  
1094          -tdir=* | --tdir=*)          -bash | --bash | -b | --b) ac_prev=BASH ;;
1095              TESTDIRS=$ac_optarg ;;          -bash=* | --bash=* | -b=* | --b=*) BASH=$ac_optarg ;;
1096    
1097            -command | --command | -c | --c) ac_prev=COMMAND ;;
1098            -command=* | --command=* | -c=* | --c=*) COMMAND=$ac_optarg ;;
1099    
1100            -makedepend | --makedepend | -md | --md) ac_prev=MKDEPEND ;;
1101            -makedepend=* | --makedepend=* | -md=* | --md=*) MKDEPEND=$ac_optarg ;;
1102    
1103            -make | --make | -m | --m) ac_prev=MAKE ;;
1104            -make=* | --make=* | -m=* | --m=*) MAKE=$ac_optarg ;;
1105    
1106            -repl_mk | --repl_mk ) ac_prev=REPLMAKE ;;
1107            -repl_mk=* | --repl_mk=*) REPLMAKE=$ac_optarg ;;
1108    
1109            -odir | --odir) ac_prev=OUTDIR ;;
1110            -odir=* | --odir=*) OUTDIR=$ac_optarg ;;
1111    
1112            -ptracers | --ptracers | -ptr | --ptr) ac_prev=PTRACERS_NUM ;;
1113            -ptracers=* | --ptracers=* | -ptr=* | --ptr=*) PTRACERS_NUM=$ac_optarg ;;
1114    
1115            -match | --match ) ac_prev=MATCH_CRIT ;;
1116            -match=* | --match=* ) MATCH_CRIT=$ac_optarg ;;
1117    
1118            -j | --j) ac_prev=JOBS ;;
1119            -j=* | --j=*) JOBS=$ac_optarg ;;
1120    
1121            -ef | --ef) ac_prev=EXTRFLG ;;
1122            -ef=* | --ef=*) EXTRFLG=$ac_optarg ;;
1123    
1124            -clean | --clean) CLEANUP=t ; DELDIR=t ;;
1125    
1126            -norun | --norun | -nr | --nr) NORUN=t ;;
1127            -obj | --obj ) TARG='obj' ; NORUN=t ;;
1128            -runonly | --runonly | -ro | --ro) QUICK=t ; NOMAKE=t ;;
1129            -quick | --quick | -q | --q) QUICK=t ;;
1130            -nogenmake | --nogenmake | -ng | --ng) NOGENMAKE=t ;;
1131            -noclean | --noclean | -nc | --nc) NOCLEAN=t ;;
1132            -nodepend | --nodepend | -nd | --nd) NODEPEND=t ;;
1133    
1134            -postclean | --postclean | -pc | --pc) POSTCLEAN=2 ;;
1135            -deloutp | --deloutp | -do | --do) POSTCLEAN=1 ;;
1136    
1137            -mpi | --mpi) MPI=2 ;;
1138            -MPI | --MPI) ac_prev=MPI ;;
1139            -MPI=* | --MPI=*) MPI=$ac_optarg ;;
1140    
1141            -mfile | --mfile | -mf | --mf) ac_prev=MPI_MFILE ;;
1142            -mfile=* | --mfile=* | -mf=* | --mf=*) MPI_MFILE=$ac_optarg ;;
1143    
1144            -mth) MULTI_THREAD=t ;;
1145    
1146            -tlm) if test $KIND = 0 ; then KIND=1 ; else
1147                    echo "Error: '-tlm', '-adm' and '-oad' are exclusive" ; usage
1148                  fi ;;
1149            -adm | -ad) if test $KIND = 0 ; then KIND=2 ; else
1150                    echo "Error: '-tlm', '-adm' and '-oad' are exclusive" ; usage
1151                  fi ;;
1152            -oad) if test $KIND = 0 ; then KIND=4 ; NODEPEND=t ; else
1153                    echo "Error: '-tlm', '-adm' and '-oad' are exclusive" ; usage
1154                  fi ;;
1155    
1156            -ieee)   echo "Warning: ignore option '-ieee' (already the default)"
1157                     printf " ... " ;;
1158            -noieee) echo "Warning: will use option '-fast' instead of '-noieee' (obsolete)"
1159                     printf " ... " ; OptLev=`expr $OptLev \* 2` ;;
1160            -fast)  OptLev=`expr $OptLev \* 2` ;;
1161            -devel) OptLev=0 ;;
1162            -gsl) GSL=t ;;
1163    
         -quick) quick=1 ;;  
1164          -verbose) verbose=2 ;;          -verbose) verbose=2 ;;
1165          -debug) debug=1 ;;          -debug) debug=1 ;;
         -clean) clean=1 ;;  
         -noieee) ieee=0 ;;  
1166          -quiet) verbose=0 ;;          -quiet) verbose=0 ;;
1167    
1168          -*)          -deldir | -dd) DELDIR=t ;;
1169              echo "Error: unrecognized option: "$ac_option  
1170              usage          -use_r4|-ur4) USE_R4=t ;;
1171              ;;  
1172                    -ts) TS=t;;
1173          *)          -papis) PAPIS=t;;
1174              echo "Error: unrecognized argument: "$ac_option          -pcls) PCL=t;;
1175              usage  
1176              ;;          -*) echo "Error: unrecognized option: "$ac_option
1177                        usage ;;
1178            *)  echo "Error: unrecognized argument: "$ac_option
1179                usage ;;
1180    
1181       esac       esac
1182        
1183  done  done
1184    
1185    if test "x$QUICK" = xt ; then
1186        NOGENMAKE=t
1187        NOCLEAN=t
1188        NODEPEND=t
1189    fi
1190    
1191    #- check length of MPI machine file:
1192    if test "x$MPI" != x0 -a "x$MPI_MFILE" != x ; then
1193        if test -r $MPI_MFILE ; then
1194            nl=`wc -l $MPI_MFILE | awk '{print $1}'`
1195            if [ $nl -lt $MPI ] ; then
1196              echo "Error: need at least $MPI nodes (currently only $nl) in MPI_MFILE=$MPI_FILE"
1197              usage
1198            fi
1199            if [ $verbose -gt 1 ]; then
1200                echo " MPI_MFILE=$MPI_MFILE : $nl procs for MPI=$MPI run"
1201            fi
1202        else
1203              echo "Error: cannot access MPI_MFILE=$MPI_FILE"
1204              usage
1205        fi
1206    fi
1207    
1208    #- setting for forward or ADM testing
1209    if test $KIND = 1 ; then
1210        TARG=ftlall
1211        code_dir=code_ad
1212        inputdir=input_ad
1213        ref_outp="output_tlm.txt"
1214        EXECUTABLE="mitgcmuv_ftl"
1215    elif test $KIND = 2 ; then
1216        if test "x$TARG" = xobj ; then TARG=adobj ; else TARG=adall ; fi
1217        code_dir=code_ad
1218        inputdir=input_ad
1219        ref_outp="output_adm.txt"
1220        EXECUTABLE="mitgcmuv_ad"
1221    elif test $KIND = 4 ; then
1222        TARG=adAll
1223        code_dir=code_oad
1224        inputdir=input_oad
1225        ref_outp="output_oadm.txt"
1226        EXECUTABLE="mitgcmuv_ad"
1227    else
1228        if test "x$JOBS" != x ; then TARG="-j $JOBS $TARG" ; fi
1229        code_dir=code
1230        inputdir=input
1231        ref_outp="output.txt"
1232        EXECUTABLE="mitgcmuv"
1233    fi
1234    
1235    xx=`echo $TESTDIRS | awk '{print $1}'`
1236  if test "x$TESTDIRS" = x ; then  if test "x$TESTDIRS" = x ; then
1237      TESTDIRS=`scandirs`      LIST=`scandirs results/$ref_outp`
1238    elif test $xx = 'start_from' ; then
1239        xx=`echo $TESTDIRS | awk '{print $2}'`
1240        LIST=`scandirs results/$ref_outp | sed -n "/$xx/,$ p"`
1241    else
1242        #- expand group of experiments:
1243        LIST=" "
1244        for xx in $TESTDIRS
1245        do
1246          case $xx in
1247            'basic') LIST=${LIST}" aim.5l_cs hs94.128x64x5 ideal_2D_oce"
1248                     LIST=${LIST}" lab_sea tutorial_baroclinic_gyre"
1249                     LIST=${LIST}" tutorial_global_oce_latlon tutorial_plume_on_slope"
1250                    ;;
1251            'tutorials')
1252                     LIST=${LIST}" "`ls | grep 'tutorial_'` ;;
1253            *)       LIST=${LIST}" "$xx ;;
1254          esac
1255        done
1256  fi  fi
1257    #echo 'LIST='${LIST}'<'
1258    #- skip dirs, remove duplicate and non-directory:
1259    TESTDIRS=" "
1260    count=0
1261    for xx in $LIST
1262    do
1263        yy=`echo $SKIPDIRS | grep -c $xx`
1264        if test $yy = 0 ; then
1265            if test -d $xx ; then
1266                yy=`echo $TESTDIRS | grep -c $xx`
1267                if test $yy = 0 ; then TESTDIRS=${TESTDIRS}" "$xx ; fi
1268            else count=1 ;
1269                echo ""; echo -n " -- skip \"$xx\" (not a directory !)"
1270            fi
1271        else
1272            if test $count = 1 ; then echo -n ", \"$xx\""
1273            else count=1 ; echo "" ;  echo -n " skip: \"$xx\""
1274            fi
1275        fi
1276    done
1277    if test $count = 1 ; then echo "" ; echo -n " ... " ; fi
1278    #echo 'TESTDIRS='${TESTDIRS}'<'
1279    
1280  echo "OK"  if test "x$OPTFILE" = xNONE -a "x$MITGCM_OF" != x ; then
1281        OPTFILE=$MITGCM_OF
1282    fi
1283    
1284    LOC_MFILE='tr_mpi_mfile'
1285    RUNLOG="run.tr_log"
1286    OUTPUTFILE=$ref_outp
1287    if test "x$COMMAND" = x ; then
1288        COMMAND="./$EXECUTABLE > $OUTPUTFILE"
1289    fi
1290    if test "x$MPI" != x0 ; then
1291        OUTPUTFILE="STDOUT.0000"
1292    fi
1293    
1294    echo "OK (COMMAND= $COMMAND )"
1295    
1296    # set the Default List of output variables to be checked:
1297    #  (use default or load experiment-specific list from file "tr_checklist")
1298    # content : 1rst = main variable used to decide if it pass or FAIL
1299    #         others = number of matching digits to be printed in summary.txt
1300    if test $KIND = 1 ; then
1301        DEF_CHECK_LIST='tlmGrd tlmCst tlmGrd fwdGrd'
1302        EMPTY_RESULTS='.. .. ..'
1303        LEN_CHECK_LIST=`echo $DEF_CHECK_LIST | sed 's/ [a-zA-Z0-9]*+/&mn &mx &av &sd/g' | awk '{print NF-1}'`
1304    elif test $KIND = 2 -o $KIND = 4 ; then
1305        DEF_CHECK_LIST='AdGrd Cost AdGrd FDGrd'
1306        EMPTY_RESULTS='.. .. ..'
1307        LEN_CHECK_LIST=`echo $DEF_CHECK_LIST | sed 's/ [a-zA-Z0-9]*+/&mn &mx &av &sd/g' | awk '{print NF-1}'`
1308    else
1309        DEF_CHECK_LIST='PS PS T+ S+ U+ V+ pt1+ pt2+ pt3+ pt4+ pt5+'
1310        EMPTY_RESULTS='.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..'
1311        LEN_CHECK_LIST=`echo $DEF_CHECK_LIST | sed 's/ [a-zA-Z0-9]*+/&mn &mx &av &sd/g' | awk '{print NF-1}'`
1312        ii=`echo $EMPTY_RESULTS | awk '{print NF}'`
1313        EMPTY_RESULTS=$EMPTY_RESULTS`expr $LEN_CHECK_LIST - $ii | awk 'BEGIN{FS=":"}{for(i=1;i<=$1;i++){printf "  ."}}'`
1314    fi
1315    
1316  #  create the FORTRAN comparison code  #  create the FORTRAN comparison code
1317  createcodelet  if test "x$CLEANUP" = xt -o -x tr_cmpnum ; then
1318        echo "skipping comparison code build"
1319    else
1320        createcodelet
1321    fi
1322    
1323  #  build the mpack utility  #  build the mpack utility (if ADDRESSES = NONE, do it to test the build)
1324  build_mpack  if test "x$ADDRESSES" = x ; then
1325        echo "skipping mpack build"
1326    else
1327        build_mpack
1328    fi
1329    
1330  #  Create a uniquely named directory to store results  #  Create a uniquely named directory to store results
1331    CMDLINE=$0
1332    for xx in "$@" ; do nw=`echo $xx | wc -w`
1333        if test $nw = '1' ; then CMDLINE="$CMDLINE $xx" ; else
1334          nb=`echo $xx | grep -c '='`
1335          if test $nb = 0 ; then CMDLINE="$CMDLINE '$xx'"
1336          else yy=`echo "$xx'" | sed "s/=/='/"` ;
1337                                 CMDLINE="$CMDLINE $yy" ; fi
1338        fi
1339    done
1340    #for xx in "$@" ; do CMDLINE="$CMDLINE '$xx'" ; done
1341  MACH=`hostname`  MACH=`hostname`
1342    UNAMEA=`uname -a`
1343  DATE=`date +%Y%m%d`  DATE=`date +%Y%m%d`
1344  BASE=$MACH"_"$DATE"_"  BASE="tr_"$MACH"_"$DATE"_"
1345    if test "x$OUTDIR" != x ; then
1346        BASE="tr_"$OUTDIR"_"$DATE"_"
1347    else
1348        short_name=`hostname | sed 's/\..*$//'`
1349        BASE="tr_"$short_name"_"$DATE"_"
1350    fi
1351  DNUM=0  DNUM=0
1352  DRESULTS="$BASE$DNUM"  DRESULTS="$BASE$DNUM"
1353  while test -e $DRESULTS ; do  while test -e $DRESULTS ; do
# Line 474  done Line 1357  done
1357  mkdir $DRESULTS  mkdir $DRESULTS
1358  RETVAL=$?  RETVAL=$?
1359  if test "x$RETVAL" != x0 ; then  if test "x$RETVAL" != x0 ; then
1360      echo "Error: can't create results directory \"./$DRESULTS\""      echo "ERROR: Can't create results directory \"./$DRESULTS\""
1361      exit 1      exit 1
1362  fi  fi
1363  SUMMARY="$DRESULTS/summary.txt"  SUMMARY="$DRESULTS/summary.txt"
1364  date > $SUMMARY  start_date=`date`
1365  cat << EOF >> $SUMMARY  echo $start_date > $SUMMARY
1366                  T           S           U           V  echo 'run:' $CMDLINE >> $SUMMARY
1367  G D M    c        m  s        m  s        m  s        m  s  echo 'on :' $UNAMEA  >> $SUMMARY
1368  E p a R  g  m  m  e  .  m  m  e  .  m  m  e  .  m  m  e  .  
1369  N n k u  2  i  a  a  d  i  a  a  d  i  a  a  d  i  a  a  d  of_path=
1370  2 d e n  d  n  x  n  .  n  x  n  .  n  x  n  .  n  x  n  .  if test "x$OPTFILE" != xNONE ; then
1371        if test -r $OPTFILE ; then
1372            # get the path
1373            path=${OPTFILE%/*}
1374            if test "x$path" = x ; then
1375                of_path=`pwd`
1376            else
1377                of_path=`( cd $path > /dev/null 2>&1 ; pwd )`
1378            fi
1379            file=${OPTFILE##*/}
1380            OPTFILE=$of_path/$file
1381            cp $OPTFILE $DRESULTS
1382            echo >> $SUMMARY
1383            echo "  OPTFILE=$OPTFILE" >> $SUMMARY
1384        else
1385            echo | tee -a $SUMMARY
1386            echo "ERROR: can't read OPTFILE=\"$OPTFILE\"" | tee -a $SUMMARY
1387            exit 1
1388        fi
1389    else
1390        echo >> $SUMMARY
1391        echo "No \"OPTFILE\" was specified ; genmake2 found and uses:" >> $SUMMARY
1392        #-note: to be filled later after 1rst run
1393    fi
1394    echo
1395    echo >> $SUMMARY
1396    if test $KIND = 0 ; then
1397        line_0=`printf '%s %2i' 'default' $MATCH_CRIT`
1398           line_0="$line_0  ----T-----  ----S-----  ----U-----  ----V-----"
1399        line_1="G D M    c        m  s        m  s        m  s        m  s"
1400        line_2="e p a R  g  m  m  e  .  m  m  e  .  m  m  e  .  m  m  e  ."
1401        line_3="n n k u  2  i  a  a  d  i  a  a  d  i  a  a  d  i  a  a  d"
1402        line_4="2 d e n  d  n  x  n  .  n  x  n  .  n  x  n  .  n  x  n  ."
1403        for ii in $PTRACERS_NUM ; do
1404            line_0="$line_0  --PTR 0"$ii"--"
1405            line_1="$line_1        m  s"
1406            line_2="$line_2  m  m  e  ."
1407            line_3="$line_3  i  a  a  d"
1408            line_4="$line_4  n  x  n  ."
1409        done
1410    else
1411        line_0=`printf '%s %2i' 'default   ' $MATCH_CRIT`
1412      if test $KIND = 1 ; then
1413       #echo "TANGLIN=true" >> $SUMMARY
1414        echo "TangLin generated by TAF" >> $SUMMARY
1415      elif test $KIND = 3 ; then
1416        echo "TangLin generated by OpenAD" >> $SUMMARY
1417      elif test $KIND = 2 ; then
1418       #echo "ADJOINT=true" >> $SUMMARY
1419        echo "Adjoint generated by TAF" >> $SUMMARY
1420      else
1421        echo "Adjoint generated by OpenAD" >> $SUMMARY
1422      fi
1423      if test $KIND = 1 -o $KIND = 3 ; then
1424        line_1="G D M    C  T  F"
1425        line_2="e p a R  o  L  D"
1426      else
1427        line_1="G D M    C  A  F"
1428        line_2="e p a R  o  d  D"
1429      fi
1430        line_3="n n k u  s  G  G"
1431        line_4="2 d e n  t  r  r"
1432        echo >> $SUMMARY
1433    fi
1434    if test "x$CLEANUP" != xt ; then
1435        echo "$line_0" | tee -a $SUMMARY
1436        echo "$line_1" | tee -a $SUMMARY
1437        echo "$line_2" | tee -a $SUMMARY
1438        echo "$line_3" | tee -a $SUMMARY
1439        echo "$line_4" | tee -a $SUMMARY
1440        echo ""        | tee -a $SUMMARY
1441    fi
1442    echo "-------------------------------------------------------------------------------"
1443    
1444  EOF  #  ...and each test directory...
1445    for dir in $TESTDIRS ; do
1446    
1447  NDIR=0      # set builddir & rundir:
1448        builddir="build"
1449        if test ! -d $dir/$builddir ; then mkdir $dir/$builddir ; fi
1450        rundir="run"
1451        pfxdir="tr_$rundir"
1452        if test ! -d $dir/$rundir ; then
1453            rundir=$builddir
1454        fi
1455        CODE_DIR=$dir/$code_dir
1456        BUILD_DIR=$dir/$builddir
1457    
1458  #  For each optfile...      #  Cleanup only!
1459  for OPTFILE in $OPTFILES ; do      if test "x$CLEANUP" = xt ; then
1460            echo -n '  --- dir:' $BUILD_DIR ': '
1461            makeclean $BUILD_DIR
1462            (   cd $BUILD_DIR
1463                rm -f $EXECUTABLE *.bak
1464                rm -f genmake_state genmake_*optfile genmake.log
1465                rm -f SIZE.h.mpi genmake.tr_log make.tr_log
1466                rm -rf mpi_headers
1467            )
1468            if test -d $dir/$rundir/CVS ; then
1469                echo -n '  --- dir:' $dir/$rundir ': '
1470                run_clean $dir/$rundir
1471            fi
1472            trdir=`( cd $dir ; find . -type d -name "$pfxdir.*" -print | sed 's/^.\///')`
1473            ttd=`echo $trdir | wc -w`
1474            if test $ttd != 0 ; then
1475                echo '  --- rm dir:' $trdir
1476                ( cd $dir ; rm -rf $trdir )
1477            fi
1478            continue
1479        fi
1480    
1481      OPTFILE=`pwd`"/$OPTFILE"      #  Verify that the testdir exists and contains previous
1482      if test ! -r $OPTFILE ; then      #  results in the correct location--or skip this directory!
1483          echo "Error: can't read optfile \"$OPTFILE\""      fout=$dir"/results/"$ref_outp
1484          exit 1     #if test ! -r $fout ; then
1485        if test ! -r $fout -a ! -r ${fout}.gz ; then
1486            echo "can't read \"$fout\" -- skipping $dir"
1487            continue
1488      fi      fi
     echo  
     echo "OPTFILE=$OPTFILE" >> $SUMMARY  
     echo >> $SUMMARY  
       
     #  ...and each test directory...  
     for dir in $TESTDIRS ; do  
           
         #  Create an output dir for each OPTFILE/tdir combination  
         CDIR=$DRESULTS"/"$NDIR  
         mkdir $CDIR  
         CDIR=`pwd`"/$CDIR"  
1489    
1490          #  ...configue, make, run, and compare the output.      # Check for specific files for particular type of run
1491          echo "-------------------------------------------------------------------------------"  
1492          echo      if test ! -r $CODE_DIR"/SIZE.h_mpi"  -a "x$MPI" != "x0" ; then
1493          echo "Experiment:  $dir"          echo "can't find \"$CODE_DIR/SIZE.h_mpi\" -- skipping $dir"
1494          echo          continue
1495          unset genmake makedepend make run      fi
1496          results='-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --'      if test ! -r $dir"/input/eedata.mth" -a "x$MULTI_THREAD" = "xt" ; then
1497          ( cd $dir/input; rm -f *.{o,f,c,F} *.[f,F]90 work* output.txt Make* make.log; )          echo "can't find \"$dir/input/eedata.mth\" -- skipping $dir"
1498          if [ -r $dir/build ]; then          continue
1499              seperatebuilddir=1      fi
1500              builddir=build  
1501              rundir=build      if test "x$MPI" != "x0" ; then
1502              ( cd $dir/build; ln -sf ../input/* . )          ntx=1 ; nty=1
1503          else          if test "x$MULTI_THREAD" = "xt" ; then
1504              seperatebuilddir=0            ff=$dir"/input/eedata.mth"
1505              builddir=input            ntx=`grep "^ *nTx *=" $ff | tail -1 | sed 's/^ *nTx *= *//' | sed "s/, *$//"`
1506              rundir=input            nty=`grep "^ *nTy *=" $ff | tail -1 | sed 's/^ *nTy *= *//' | sed "s/, *$//"`
1507              if test "x$ntx" = x ; then ntx=1 ; fi
1508              if test "x$nty" = x ; then nty=1 ; fi
1509          fi          fi
1510            #- create new SIZE.h with no more than '$MPI' Procs
1511            mk_mpi_size $CODE_DIR"/SIZE.h_mpi" $BUILD_DIR"/tr_size.mpi" $MPI $ntx $nty
1512            LOC_NPROC=$?
1513            (   cd $BUILD_DIR
1514                if test -r SIZE.h.mpi ; then
1515                    cmp tr_size.mpi SIZE.h.mpi > /dev/null 2>&1 ; RETVAL=$?
1516                else RETVAL=1
1517                fi
1518                if test "x$RETVAL" = x0 ; then
1519                    rm -f tr_size.mpi
1520                else
1521                    rm -f SIZE.h.mpi ; mv tr_size.mpi SIZE.h.mpi
1522                fi
1523            )
1524            if test "x$MPI_MFILE" != x ; then
1525                #- create new MPI machine-file with the right number of Procs
1526                rm -f $LOC_MFILE
1527                cat $MPI_MFILE | sort | uniq | head -$LOC_NPROC > $LOC_MFILE
1528                nl=`wc -l $LOC_MFILE | awk '{print $1}'`
1529                if [ $nl -lt $LOC_NPROC ] ; then
1530                    rm -f $LOC_MFILE
1531                    cat $MPI_MFILE | head -$LOC_NPROC > $LOC_MFILE
1532                    #sed -n "1,$LOC_NPROC p" $MPI_MFILE > $LOC_MFILE
1533                fi
1534                if [ $verbose -gt 1 ]; then
1535                    nl=`wc -l $LOC_MFILE | awk '{print $1}'`
1536                    echo " new LOC_MFILE=$LOC_MFILE : $nl procs for LOC_NPROC=$LOC_NPROC"
1537                fi
1538            fi
1539            if test "x$MULTI_THREAD" = "xt" ; then
1540                retv=`check_eedata $dir"/input/eedata.mth" $BUILD_DIR"/SIZE.h.mpi"`
1541                if test $retv != 0 ; then
1542                    echo "input/eedata.mth tiling misfit -- skipping $dir"
1543                    continue
1544                fi
1545            fi
1546        fi
1547    
1548        #  Check whether there are "extra runs" for this testdir
1549        extra_runs=
1550        if test "x$NORUN" = xf ; then
1551            ex_run_dirs=`( cd $dir ; ls -d $inputdir.* 2> /dev/null )`
1552        fi
1553        #echo "ex_run_dirs='$ex_run_dirs'"
1554        for exd in $ex_run_dirs ; do
1555            name=`echo $exd | sed -e "s/$inputdir\.//"`
1556            refExOut=`echo $ref_outp | sed "s/\./.${name}./"`
1557            outf="$dir/results/$refExOut"
1558            if test -r $outf -o -r ${outf}.gz ; then
1559              if test "x$MULTI_THREAD" = "xt" ; then
1560                if test -r $dir"/"$exd"/eedata.mth" ; then
1561                  if test "x$MPI" = "x0" ; then
1562                    extra_runs="$extra_runs $name"
1563                  else
1564                    retv=`check_eedata $dir"/"$exd"/eedata.mth" $BUILD_DIR"/SIZE.h.mpi"`
1565                    if test $retv = 0 ; then
1566                        extra_runs="$extra_runs $name"
1567                    else
1568                        echo $exd"/eedata.mth tiling misfit -- skipping $dir"
1569                    fi
1570                  fi
1571                #else echo $dir"/"$exd"/eedata.mth: not found"
1572                fi
1573              else
1574                extra_runs="$extra_runs $name"
1575              fi
1576            fi
1577        done
1578    
1579        echo
1580        if test "x$extra_runs" = "x" ; then
1581            echo "Experiment:  $dir"
1582        else
1583            echo "Experiment:  $dir ; extra_runs=$extra_runs"
1584        fi
1585        echo
1586        unset genmake makedepend make run
1587        results=$EMPTY_RESULTS
1588    
1589        #  Create an output dir & summary.txt file for each tested experiment (tdir)
1590        locDIR=$DRESULTS"/"$dir
1591        mkdir $locDIR
1592        #- report to this experiment local summary file ---
1593        echo "DATE='$DATE' ; tdir='$dir'" > $locDIR"/summary.txt"
1594        echo "MACH='$MACH'" >> $locDIR"/summary.txt"
1595        echo "UNAMEA='$UNAMEA'" >> $locDIR"/summary.txt"
1596        CDIR=`pwd`"/$locDIR"
1597    
1598        if test "x$NORUN" = xt ; then
1599                run=N
1600            genmakemodel $dir/$builddir && genmake=Y \
1601                && makeclean $dir/$builddir \
1602                && symlink_mpifiles $dir $code_dir $builddir \
1603                && makedependmodel $dir/$builddir && makedepend=Y \
1604                && makemodel $dir/$builddir && make=Y
1605        else
1606          genmakemodel $dir/$builddir && genmake=Y \          genmakemodel $dir/$builddir && genmake=Y \
1607              && makeclean $dir/$builddir \              && makeclean $dir/$builddir \
1608                && symlink_mpifiles $dir $code_dir $builddir \
1609              && makedependmodel $dir/$builddir && makedepend=Y \              && makedependmodel $dir/$builddir && makedepend=Y \
1610              && makemodel $dir/$builddir && make=Y \              && makemodel $dir/$builddir && make=Y \
1611              && linkdata $seperatebuilddir $dir/$rundir \              && run_clean $dir/$rundir \
1612              && runmodel $dir/$builddir mitgcmuv && run=Y \              && linkdata $dir/$rundir $inputdir \
1613              && results=`testoutput $dir $rundir`              && runmodel $dir/$rundir && run=Y \
1614          echo              && results=`testoutput_run $dir $rundir $ref_outp`
1615          formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results      fi
1616          echo      #echo "results='$results'"
         formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results >> $SUMMARY  
1617    
1618          ( cd $DRESULTS"/"$NDIR ; gzip * )          fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1619            echo 1>&2
1620            echo "$fres" | sed 's/ 99/ --/g' | sed 's/  > />/' | sed 's/  < /</' >> $SUMMARY
1621            echo "fresults='$fres'" | sed 's/ 99/ --/g' >> $locDIR"/summary.txt"
1622    
1623            for ex in $extra_runs ; do
1624                unset run
1625                results=$EMPTY_RESULTS
1626                #  reference output file
1627                refExOut=`echo $ref_outp | sed "s/\./.${ex}./g"`
1628                #  Create an output dir & summary.txt file for each extra run (tdir.ex)
1629                locDIR=$DRESULTS"/"$dir"."$ex
1630                mkdir $locDIR
1631                #- report to this experiment local summary file ---
1632                echo "DATE='$DATE' ; tdir='$dir.$ex'" > $locDIR"/summary.txt"
1633                #echo "MACH='$MACH'" >> $locDIR"/summary.txt"
1634                #echo "UNAMEA='$UNAMEA'" >> $locDIR"/summary.txt"
1635                CDIR=`pwd`"/$locDIR"
1636                test ! -e "$dir/$pfxdir.$ex" && mkdir "$dir/$pfxdir.$ex"
1637                run_clean $dir/$pfxdir.$ex
1638                linkdata $dir/$pfxdir.$ex $inputdir.$ex $inputdir
1639                runmodel $dir/$pfxdir.$ex && run=Y \
1640                && results=`testoutput_run $dir $pfxdir.$ex $refExOut`
1641                fres=`formatresults $dir.$ex ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1642                echo 1>&2
1643                echo "$fres" | sed 's/ 99/ --/g' | sed 's/  > />/' | sed 's/  < /</' >> $SUMMARY
1644                echo "fresults='$fres'" | sed 's/ 99/ --/g' >> $locDIR"/summary.txt"
1645                if test "x$POSTCLEAN" = x2 ; then
1646                    run_clean $dir/$pfxdir.$ex
1647                fi
1648            done
1649    
1650          tar -cf $DRESULTS"/"$NDIR".tar" $DRESULTS"/"$NDIR      if test ! -f $DRESULTS"/"genmake_state ; then
1651          $MPACK -s MITgcm-test -m 1000000 $DRESULTS"/"$NDIR".tar" $ADDRESSES          if test -f $dir/$builddir/Makefile ; then
1652                mkOpt=`grep '^# OPTFILE=' $dir/$builddir/Makefile 2>/dev/null | head -1 | sed 's/^# //'`
1653                echo "from '$dir/$builddir/Makefile', extract:" > $DRESULTS/genmake_state
1654                sed -n '/^# executed by:/,+1 p' $dir/$builddir/Makefile >> $DRESULTS/genmake_state
1655                echo " $mkOpt" >> $DRESULTS/genmake_state
1656                if test "x$OPTFILE" = xNONE ; then
1657                    eval $mkOpt
1658                    sed "/^No \"OPTFILE\" was specified ; genmake2/a\  OPTFILE=${OPTFILE}"\
1659                            $SUMMARY > tmp.tr_log
1660                    RETVAL=$?
1661                    if test "x$RETVAL" = x0 ; then rm -f $SUMMARY
1662                            cp tmp.tr_log $SUMMARY
1663                    else rm -f tmp.tr_log
1664                    fi
1665                fi
1666                gmkLog=$dir/$builddir/genmake.log
1667                if test -r $gmkLog ; then
1668                    grep '^Get compiler version using:' $gmkLog > /dev/null 2>&1
1669                    RETVAL=$?
1670                    if test "x$RETVAL" = x0 ; then
1671                      echo -n "from '$gmkLog', " >> $DRESULTS/genmake_state
1672                      echo "extract compiler version:"   >> $DRESULTS/genmake_state
1673                      sed -n '/Get compiler version/,/<-- compiler version/p' \
1674                         $gmkLog | grep -v '^... compiler version ' > tmp.tr_log
1675                      sed -n '1p' tmp.tr_log >> $DRESULTS/genmake_state
1676                      sed -n '2,/^$/p' tmp.tr_log | sed '/^$/d' | sed 's/^./ &/' \
1677                                             >> $DRESULTS/genmake_state
1678                      rm -f tmp.tr_log
1679                    fi
1680                    echo -n "from '$gmkLog', " >> $DRESULTS/genmake_state
1681                    echo "get NETCDF & LAPACK settings:" >> $DRESULTS/genmake_state
1682                    sed -n '/set HAVE_NETCDF=/p' $gmkLog >> $DRESULTS/genmake_state
1683                    sed -n '/set HAVE_LAPACK=/p' $gmkLog >> $DRESULTS/genmake_state
1684                fi
1685            fi
1686        fi
1687        #postclean $dir/$builddir
1688        if test "x$POSTCLEAN" = x2 ; then
1689            makeclean $dir/$builddir \
1690                && run_clean $dir/$rundir
1691        fi
1692        if test "x$MPI" != x0 -a "x$MPI_MFILE" != x ; then rm -f $LOC_MFILE ; fi
1693    
1694          NDIR=$(( $NDIR + 1 ))      echo "-------------------------------------------------------------------------------"
           
     done  
 done  
1695    
1696  # rm tmp_cmpnum.f a.out  done
1697    
1698  echo -------------------------------------------------------------------------------  printf "Start time:  " >> $SUMMARY
1699  echo  echo "$start_date" >> $SUMMARY
1700  echo >> $SUMMARY  printf "End time:    " >> $SUMMARY
1701  date >> $SUMMARY  date >> $SUMMARY
 cat $SUMMARY  
1702    
1703  # tar -cf $DRESULTS".tar" $DRESULTS  #  If addresses were supplied and mpack built successfully, then try
1704  #  #  to send email using mpack.
1705  # $MPACK -s MITgcm-test -m 1000000 $DRESULTS".tar" $ADDRESSES  if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then
1706        echo "No results email was sent."
1707    else
1708        if test "x$HAVE_MPACK" = xt ; then
1709            tar -cf $DRESULTS".tar" $DRESULTS > /dev/null 2>&1 \
1710                && gzip $DRESULTS".tar" \
1711                && $MPACK -s MITgcm-test -m 3555000 $DRESULTS".tar.gz" $ADDRESSES
1712            RETVAL=$?
1713            if test "x$RETVAL" != x0 ; then
1714                echo
1715                echo "Warning: The tar, gzip, & mpack step failed.  Please send email"
1716                echo "  to <MITgcm-support@mitgcm.org> for help.  You may copy the "
1717                echo "  summary of results from the directory \"$DRESULTS\"."
1718                echo
1719            else
1720                echo
1721                echo "An email containing results was sent to the following addresses:"
1722                echo "  \"$ADDRESSES\""
1723                echo
1724                test -f $DRESULTS".tar"  &&  rm -f $DRESULTS".tar"
1725                test -f $DRESULTS".tar.gz"  &&  rm -f $DRESULTS".tar.gz"
1726            fi
1727        fi
1728    fi
1729    
1730    if test "x$QUICK" = xf -a "x$NORUN" = xf ; then
1731        rm -f tr_cmpnum.c tr_cmpnum
1732    fi
1733    
1734    if test "x$CLEANUP" != xt ; then
1735        cat $SUMMARY | sed 's/ \.  \.  \.  \.  \.  \.  \.  \.  \.  \.  \.  \. //'
1736        if test -e tr_out.txt ; then
1737            mv tr_out.txt tr_out.txt.old
1738        fi
1739        cat $SUMMARY | sed '/^[YN] [YN] [YN] [YN]/ s/ \. //g' > tr_out.txt
1740    fi
1741    
1742    if test "x$DELDIR" = xt ; then
1743        rm -rf $DRESULTS
1744    fi
1745    echo "======== End of testreport execution ========"

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.191

  ViewVC Help
Powered by ViewVC 1.1.22