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

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

  ViewVC Help
Powered by ViewVC 1.1.22