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

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

  ViewVC Help
Powered by ViewVC 1.1.22