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

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

  ViewVC Help
Powered by ViewVC 1.1.22