/[MITgcm]/MITgcm/verification/testreport
ViewVC logotype

Diff of /MITgcm/verification/testreport

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph | View Patch Patch

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

Legend:
Removed from v.1.9  
changed lines
  Added in v.1.188

  ViewVC Help
Powered by ViewVC 1.1.22