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

Diff of /MITgcm/verification/testreport

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

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

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

  ViewVC Help
Powered by ViewVC 1.1.22