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

Diff of /MITgcm/verification/testreport

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

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

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

  ViewVC Help
Powered by ViewVC 1.1.22