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

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

  ViewVC Help
Powered by ViewVC 1.1.22