/[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.201 by jmc, Mon Feb 23 23:05:57 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/.*=//' | cat -n > ${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/.*=//' | cat -n > ${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            fi
848            if test -s STDERR.0000 ; then cp STDERR.0000 $CDIR"/STDERR.0000" ; fi
849            if [ $RETVAL -eq 0 -a $ENDVAL -gt 0 ] ; then
850                echo successful
851                printf '=> output from running in %s :\n' $1 1>&2
852                tail $RUNLOG | sed 's/^.*/> &/g' 1>&2
853                return 0
854            elif [ $RETVAL -ne 0 -a $ENDVAL -gt 0 ] ; then
855                #-- for some weird cases (run is finihed but with error code)
856                echo 'finished with error (run:' $RETVAL ' end:' $ENDVAL ')'
857                printf '=> output from running in %s :\n' $1 1>&2
858                tail $RUNLOG | sed 's/^.*/> &/g' 1>&2
859              return 0              return 0
860          else          else
861                echo 'failed (run:' $RETVAL ' end:' $ENDVAL ')'
862                printf '=> output from running in %s :\n' $1 1>&2
863                tail $RUNLOG | sed 's/^.*/> &/g' 1>&2
864                cp $RUNLOG $CDIR"/"$RUNLOG
865              return 1              return 1
866          fi          fi
867      )      )
# Line 317  createcodelet() Line 871  createcodelet()
871  {  {
872      # create codelet for comparing model output      # create codelet for comparing model output
873    
874      echo -n "creating the comparison code...  "      printf "creating the comparison code (using CC=$CC)...  "
875      cat > tmp_cmpnum.f <<EOFA      cat > tr_cmpnum.c <<EOF
876        program cmpnum  #include <stdio.h>
877        implicit none  #include <math.h>
878        real*8 a,b,diff  int main( int argc, char** argv )  {
879        integer linnum,best    int linnum,cmplin,best,lncnt;
880        best=-16    double a,b,abave,relerr;
881    99  read(*,*,end=70,err=60) linnum,a,b    best = -22;
882        diff=0.5*(abs(a)+abs(b))    lncnt = 0;
883  c     print *,a,b,diff,abs(a-b)/diff    while( 1 & ( (lncnt+=1) < 999 ) )  {
884        if (diff.gt.1.e-12) then      scanf("%d", &linnum);
885          diff=abs(a-b)/diff      if (linnum == -1)  break;
886          if (diff.gt.0.) then      scanf("%lf", &a);  scanf("%lf", &b);
887  c         print *,int(log10(diff)),diff      abave = 0.5*(fabs(a)+fabs(b));
888            linnum=int(log10(diff))      if ( abave == abave ) {
889            best=max(best,linnum)        if (abave > 0.0) {
890          endif          relerr=fabs(a-b)/abave;
891        else          if (relerr > 0.0) { cmplin = (int)rint(log10(relerr)); }
892          if (best.eq.-16.and.diff.ne.0.) best=-22          else { cmplin = -16 ; }
893        endif          best = (best > cmplin) ? best : cmplin; }
894        goto 99        else { cmplin = -22 ; }
895    60  stop 'cmpnum: An error occured reading a,b'     /* printf("%d ; %lf ; %lf\n",cmplin,a,b); */
896    70  print *,-best        }
897        end     else {
898  EOFA     /* printf("%lf ; %lf ; %lf\n",abave,a,b); */
899          break; }
900      }
901      if (lncnt == 999) best=-29;
902      if (linnum != -1) best=-99;
903      printf("%d\n", -best);
904      return 0;
905    }
906    EOF
907        $CC -o tr_cmpnum tr_cmpnum.c -lm
908    
909      f77 tmp_cmpnum.f      if [ -x ./tr_cmpnum ]; then
     if [ -x ./a.out ]; then  
910          echo "OK"          echo "OK"
911          return 0          return 0
912      else      else
913          echo          echo
914          echo "createcodelet: failed to compile codelet"          echo "ERROR: failed to compile comparison code -- please specify"
915            echo "  a C compiler using the CC environment variable."
916          exit 1          exit 1
917      fi      fi
918  }  }
# Line 361  formatresults() Line 924  formatresults()
924      nm=$1      nm=$1
925      printf '%s %s %s %s' $2 $3 $4 $5      printf '%s %s %s %s' $2 $3 $4 $5
926      shift; shift; shift; shift; shift;      shift; shift; shift; shift; shift;
927      printf '%3s' $@      listPrt=$@
928            listRes=`echo $listPrt | sed 's/>//' | sed 's/<//'`
929      if [ $1 = '--' ]; then      xx=`echo $listPrt | sed 's/.*>//' | sed 's/<.*//' | awk '{print $1}'`
930        printf '%3s' $listPrt
931    #   line below does not work on hp-ux_ia64 : do those substitutions later on
932    #   printf '%3s' $listPrt | sed 's/ 99/ --/g' | sed 's/  > />/' | sed 's/  < /</'
933    
934        if [ $xx = '..' ]; then
935            printf ' N/O '
936        elif [ $xx = '--' ]; then
937            printf ' N/O '
938        elif [ $xx = 99 ]; then
939          printf ' N/O '          printf ' N/O '
940      else      else
941          if [ $1 -gt 12 ]; then          if [ $xx -ge $MATCH_CRIT ]; then
942              printf ' pass'              printf ' pass'
943          else          else
944              printf ' FAIL'              printf ' FAIL'
945          fi          fi
946      fi      fi
947      printf '  %s' $nm      printf '  %s' $nm
948        if test $KIND = 2 ; then
949            #-- apppend taf repport summary:
950            tafrep=`grep -c '^ TAF reports ' $CDIR/summary.txt`
951            if test $tafrep = 1 ; then
952                grep '^ TAF reports ' $CDIR/summary.txt | awk '{printf "  (e=%i, w=%i)",$3,$6}'
953            fi
954        fi
955      printf '\n'      printf '\n'
       
 }  
956    
 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  
957  }  }
958    
959  scandirs()  scandirs()
960  {  {
961      if [ $# -eq 0 ]; then      if [ $# -eq 1 ]; then
962          for arg in * ; do          for arg in * ; do
963              test -d $arg/input && echo $arg             #test -f $arg/$1 && echo $arg
964          done              test -f $arg/$1 -o -f $arg/$1.gz && echo $arg
965            done
966      else      else
967          echo $*          echo $*
968      fi      fi
969  }  }
970    
971    
972  ###############################################################################  check_eedata()
973  ###############################################################################  {
974        # check_eedata eedata size.h
975        if [ $# -eq 2 ] ; then
976         if test -f $1 -a -f $2 ; then
977          nx=`grep "^ *nTx *=" $1 | tail -1 | sed 's/^ *nTx *= *//' | sed "s/, *$//"`
978          sx=`grep "^     & *nSx *=" $2 | sed "s/^     & *nSx *=//" | sed 's/, *$//'`
979          if test "x$nx" = x ; then
980            rx=10
981          else
982            rx=`expr $sx % $nx`
983          fi
984          ny=`grep "^ *nTy *=" $1 | tail -1 | sed 's/^ *nTy *= *//' | sed "s/, *$//"`
985          sy=`grep "^     & *nSy *=" $2 | sed "s/^     & *nSy *=//" | sed 's/, *$//'`
986          if test "x$ny" = x ; then
987            ry=20
988          else
989            ry=`expr $sy % $ny`
990          fi
991          echo `expr $rx + $ry`
992         else
993          echo '-1'
994         fi
995        elif [ $# -eq 1 ] ; then
996         if test -f $1 ; then
997          nx=`grep "^ *nTx *=" $1 | tail -1 | sed 's/^ *nTx *= *//' | sed "s/, *$//"`
998          if test "x$nx" = x ; then nx=1 ; fi
999          ny=`grep "^ *nTy *=" $1 | tail -1 | sed 's/^ *nTy *= *//' | sed "s/, *$//"`
1000          if test "x$ny" = x ; then ny=1 ; fi
1001         #echo $nx $ny
1002          echo $nx
1003         else
1004          echo '-1'
1005         fi
1006        else
1007          echo '-2'
1008        fi
1009    
1010    }
1011    
1012  ###############################################################################  ###############################################################################
1013    
1014    
1015  #  Default properties  #  Default properties
1016  debug=0  debug=0
1017  verbose=1  verbose=1
1018  clean=0  NBLINES_MKLOG=16000
1019  expts=''  
1020  # ieee=1  OptLev=1
1021    GSL=f
1022    
1023  CLEANUP=f  CLEANUP=f
1024    NORUN=f
1025  QUICK=f  QUICK=f
1026    NOMAKE=f
1027  NOGENMAKE=f  NOGENMAKE=f
1028  NOCLEAN=f  NOCLEAN=f
1029  NODEPEND=f  NODEPEND=f
1030    POSTCLEAN=0
1031    
1032  BASH=  BASH=
1033  OPTFILE=NONE  OPTFILE=NONE
1034  ADDRESSES=  ADDRESSES=
1035  TESTDIRS=  TESTDIRS=
1036    SKIPDIRS=
1037  MPACKDIR="../tools/mpack-1.6"  MPACKDIR="../tools/mpack-1.6"
1038  MPACK="$MPACKDIR/mpack"  HAVE_MPACK=
1039  COMMAND="make output.txt"  MPACK=
1040  MAKE=make  SENDCMD=
1041  MPI=f  SAVDIR='.'
1042    COMMAND=
1043    MKDEPEND=
1044    if test "x$MAKE" = x ; then
1045        MAKE=make
1046    fi
1047    MAKE_CMD=
1048    if test "x$CC" = x ; then
1049        CC=cc
1050    fi
1051    JOBS=
1052    TARG=
1053    MPI=0
1054    MPI_MFILE=
1055    MULTI_THREAD=f
1056    OUTDIR=
1057    DELDIR=
1058    USE_R4=
1059    EXTRFLG=
1060    NOCATAD=
1061    
1062    #- type of testing (KIND):
1063    #   KIND=0 : forward (= default) ;  KIND=1 : Tangent Linear with TAF ;
1064    #   KIND=2 : Adjoint with TAF ;     KIND=4 : Adjoint with OpenAD
1065    KIND=0
1066    
1067  echo -n "parsing options...  "  # list of pTracers to check for monitor output
1068    PTRACERS_NUM="1 2 3 4 5"
1069    
1070    MATCH_CRIT=10
1071    
1072    printf "parsing options...  "
1073    
1074  ac_prev=  ac_prev=
1075  for ac_option ; do  for ac_option ; do
# Line 450  for ac_option ; do Line 1082  for ac_option ; do
1082      fi      fi
1083    
1084      ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`      ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
1085        
1086      case $ac_option in      case $ac_option in
1087                    
1088          -help | --help | -h | --h)          -help | --help | -h | --h) usage ;;
1089              usage ;;  
1090                    -optfile | --optfile | -of | --of) ac_prev=OPTFILE ;;
1091          -optfile | --optfile | -of | --of)          -optfile=* | --optfile=* | -of=* | --of=*) OPTFILE=$ac_optarg ;;
1092              ac_prev=OPTFILE ;;  
1093          -optfile=* | --optfile=* | -of=* | --of=*)          -addr | --addr | -a | --a) ac_prev=ADDRESSES ;;
1094              OPTFILE=$ac_optarg ;;          -addr=* | --addr=* | -a=* | --a=*) ADDRESSES=$ac_optarg ;;
1095                    -mpackdir | --mpackdir | -mpd | --mpd) ac_prev=MPACKDIR ;;
1096          -addr | --addr | -a | --a)          -mpackdir=* | --mpackdir=* | -mpd=* | --mpd=*) MPACKDIR=$ac_optarg ;;
1097              ac_prev=ADDRESSES ;;  
1098          -addr=* | --addr=*)          -send | --send ) ac_prev=SENDCMD ;;
1099              ADDRESSES=$ac_optarg ;;          -send=* | --send=* ) SENDCMD=$ac_optarg ;;
1100            -savdir | --savdir | -sd | --sd ) ac_prev=SAVDIR ;;
1101          -tdir | --tdir | -t | --t)          -savdir=* | --savdir=* | -sd=* | --sd=* ) SAVDIR=$ac_optarg ;;
1102              ac_prev=TESTDIRS ;;  
1103          -tdir=* | --tdir=*)          -tdir | --tdir | -t | --t) ac_prev=TESTDIRS ;;
1104              TESTDIRS=$ac_optarg ;;          -tdir=* | --tdir=* | -t=* | --t=*) TESTDIRS=$ac_optarg ;;
1105            -skipdir | --skipdir | -skd | --skd) ac_prev=SKIPDIRS ;;
1106          -bash | --bash | -b | --b)          -skipdir=* | --skipdir=* | -skd=* | --skd=*) SKIPDIRS=$ac_optarg ;;
1107              ac_prev=BASH ;;  
1108          -bash=* | --bash=*)          -bash | --bash | -b | --b) ac_prev=BASH ;;
1109              BASH=$ac_optarg ;;          -bash=* | --bash=* | -b=* | --b=*) BASH=$ac_optarg ;;
1110    
1111          -command | --command | -c | --c)          -command | --command | -c | --c) ac_prev=COMMAND ;;
1112              ac_prev=COMMAND ;;          -command=* | --command=* | -c=* | --c=*) COMMAND=$ac_optarg ;;
1113          -command=* | --command=*)  
1114              COMMAND=$ac_optarg ;;          -makedepend | --makedepend | -md | --md) ac_prev=MKDEPEND ;;
1115            -makedepend=* | --makedepend=* | -md=* | --md=*) MKDEPEND=$ac_optarg ;;
1116          -make | --make | -m | --m)  
1117              ac_prev=MAKE ;;          -make | --make | -m | --m) ac_prev=MAKE ;;
1118          -make=* | --make=*)          -make=* | --make=* | -m=* | --m=*) MAKE=$ac_optarg ;;
1119              MAKE=$ac_optarg ;;  
1120            -repl_mk | --repl_mk ) ac_prev=MAKE_CMD ;;
1121          -clean | --clean)          -repl_mk=* | --repl_mk=*) MAKE_CMD=$ac_optarg ;;
1122              CLEANUP=t ;;  
1123            -odir | --odir) ac_prev=OUTDIR ;;
1124          -quick | --quick | -q | --q)          -odir=* | --odir=*) OUTDIR=$ac_optarg ;;
1125              QUICK=t ;;  
1126          -nogenmake | --nogenmake | -ng | --ng)          -ptracers | --ptracers | -ptr | --ptr) ac_prev=PTRACERS_NUM ;;
1127              NOGENMAKE=t ;;          -ptracers=* | --ptracers=* | -ptr=* | --ptr=*) PTRACERS_NUM=$ac_optarg ;;
1128          -noclean | --noclean | -nc | --nc)  
1129              NOCLEAN=t ;;          -match | --match ) ac_prev=MATCH_CRIT ;;
1130          -nodepend | --nodepend | -nd | --nd)          -match=* | --match=* ) MATCH_CRIT=$ac_optarg ;;
1131              NODEPEND=t ;;  
1132            -j | --j) ac_prev=JOBS ;;
1133            -j=* | --j=*) JOBS=$ac_optarg ;;
1134    
1135            -ef | --ef) ac_prev=EXTRFLG ;;
1136            -ef=* | --ef=*) EXTRFLG=$ac_optarg ;;
1137    
1138            -clean | --clean) CLEANUP=t ; DELDIR=t ;;
1139    
1140            -norun | --norun | -nr | --nr) NORUN=t ;;
1141            -obj | --obj ) TARG='obj' ; NORUN=t ;;
1142            -runonly | --runonly | -ro | --ro) QUICK=t ; NOMAKE=t ;;
1143            -quick | --quick | -q | --q) QUICK=t ;;
1144            -nogenmake | --nogenmake | -ng | --ng) NOGENMAKE=t ;;
1145            -noclean | --noclean | -nc | --nc) NOCLEAN=t ;;
1146            -nodepend | --nodepend | -nd | --nd) NODEPEND=t ;;
1147    
1148            -postclean | --postclean | -pc | --pc) POSTCLEAN=2 ;;
1149            -deloutp | --deloutp | -do | --do) POSTCLEAN=1 ;;
1150    
1151            -mpi | --mpi) MPI=2 ;;
1152            -MPI | --MPI) ac_prev=MPI ;;
1153            -MPI=* | --MPI=*) MPI=$ac_optarg ;;
1154    
1155            -mfile | --mfile | -mf | --mf) ac_prev=MPI_MFILE ;;
1156            -mfile=* | --mfile=* | -mf=* | --mf=*) MPI_MFILE=$ac_optarg ;;
1157    
1158            -mth) MULTI_THREAD=t ;;
1159    
1160            -tlm) if test $KIND = 0 ; then KIND=1 ; else
1161                    echo "Error: '-tlm', '-adm' and '-oad' are exclusive" ; usage
1162                  fi ;;
1163            -adm | -ad) if test $KIND = 0 ; then KIND=2 ; else
1164                    echo "Error: '-tlm', '-adm' and '-oad' are exclusive" ; usage
1165                  fi ;;
1166            -oad) if test $KIND = 0 ; then KIND=4 ; NODEPEND=t ; else
1167                    echo "Error: '-tlm', '-adm' and '-oad' are exclusive" ; usage
1168                  fi ;;
1169            -ncad) NOCATAD=t ;;
1170    
1171            -ieee)   echo "Warning: ignore option '-ieee' (already the default)"
1172                     printf " ... " ;;
1173            -noieee) echo "Warning: will use option '-fast' instead of '-noieee' (obsolete)"
1174                     printf " ... " ; OptLev=`expr $OptLev \* 2` ;;
1175            -fast)  OptLev=`expr $OptLev \* 2` ;;
1176            -devel) OptLev=0 ;;
1177            -gsl) GSL=t ;;
1178    
         -mpi) MPI=t ;;  
1179          -verbose) verbose=2 ;;          -verbose) verbose=2 ;;
1180          -debug) debug=1 ;;          -debug) debug=1 ;;
1181          -quiet) verbose=0 ;;          -quiet) verbose=0 ;;
1182    
1183          -*)          -deldir | -dd) DELDIR=t ;;
1184              echo "Error: unrecognized option: "$ac_option  
1185              usage          -use_r4|-ur4) USE_R4=t ;;
1186              ;;  
1187                    -ts) TS=t;;
1188          *)          -papis) PAPIS=t;;
1189              echo "Error: unrecognized argument: "$ac_option          -pcls) PCLS=t;;
1190              usage  
1191              ;;          -*) echo "Error: unrecognized option: "$ac_option
1192                        usage ;;
1193            *)  echo "Error: unrecognized argument: "$ac_option
1194                usage ;;
1195    
1196       esac       esac
1197        
1198  done  done
1199    
1200  if test "x$QUICK" = xt ; then  if test "x$QUICK" = xt ; then
# Line 522  if test "x$QUICK" = xt ; then Line 1202  if test "x$QUICK" = xt ; then
1202      NOCLEAN=t      NOCLEAN=t
1203      NODEPEND=t      NODEPEND=t
1204  fi  fi
1205    if test "x$MAKE_CMD" = x ; then MAKE_CMD=$MAKE ; fi
1206    
1207    #- check length of MPI machine file:
1208    if test "x$MPI" != x0 -a "x$MPI_MFILE" != x ; then
1209        if test -r $MPI_MFILE ; then
1210            nl=`wc -l $MPI_MFILE | awk '{print $1}'`
1211            if [ $nl -lt $MPI ] ; then
1212              echo "Error: need at least $MPI nodes (currently only $nl) in MPI_MFILE=$MPI_FILE"
1213              usage
1214            fi
1215            if [ $verbose -gt 1 ]; then
1216                echo " MPI_MFILE=$MPI_MFILE : $nl procs for MPI=$MPI run"
1217            fi
1218        else
1219              echo "Error: cannot access MPI_MFILE=$MPI_FILE"
1220              usage
1221        fi
1222    fi
1223    
1224    #- setting for forward or ADM testing
1225    if test $KIND = 1 ; then
1226        TARG=ftlall
1227        code_dir=code_ad
1228        inputdir=input_ad
1229        ref_outp="output_tlm.txt"
1230        EXECUTABLE="mitgcmuv_ftl"
1231    elif test $KIND = 2 ; then
1232        if test "x$TARG" = xobj ; then TARG=adobj ; else TARG=adall ; fi
1233        code_dir=code_ad
1234        inputdir=input_ad
1235        ref_outp="output_adm.txt"
1236        EXECUTABLE="mitgcmuv_ad"
1237    elif test $KIND = 4 ; then
1238        TARG=adAll
1239        code_dir=code_oad
1240        inputdir=input_oad
1241        ref_outp="output_oadm.txt"
1242        EXECUTABLE="mitgcmuv_ad"
1243    else
1244        code_dir=code
1245        inputdir=input
1246        ref_outp="output.txt"
1247        EXECUTABLE="mitgcmuv"
1248    fi
1249    if test "x$JOBS" != x ; then TARG="-j $JOBS $TARG" ; fi
1250    
1251    xx=`echo $TESTDIRS | awk '{print $1}'`
1252  if test "x$TESTDIRS" = x ; then  if test "x$TESTDIRS" = x ; then
1253      TESTDIRS=`scandirs`      LIST=`scandirs results/$ref_outp`
1254    elif test $xx = 'start_from' ; then
1255        xx=`echo $TESTDIRS | awk '{print $2}'`
1256        LIST=`scandirs results/$ref_outp | sed -n "/$xx/,$ p"`
1257    else
1258        #- expand group of experiments:
1259        LIST=" "
1260        for xx in $TESTDIRS
1261        do
1262          case $xx in
1263            'basic') LIST=${LIST}" aim.5l_cs hs94.128x64x5 ideal_2D_oce"
1264                     LIST=${LIST}" lab_sea tutorial_baroclinic_gyre"
1265                     LIST=${LIST}" tutorial_global_oce_latlon tutorial_plume_on_slope"
1266                    ;;
1267            'tutorials')
1268                     LIST=${LIST}" "`ls | grep 'tutorial_'` ;;
1269            *)       LIST=${LIST}" "$xx ;;
1270          esac
1271        done
1272  fi  fi
1273    #echo 'LIST='${LIST}'<'
1274    #- skip dirs, remove duplicate and non-directory:
1275    TESTDIRS=" "
1276    count=0
1277    for xx in $LIST
1278    do
1279        yy=`echo $SKIPDIRS | grep -c $xx`
1280        if test $yy = 0 ; then
1281            if test -d $xx ; then
1282                yy=`echo $TESTDIRS | grep -c $xx`
1283                if test $yy = 0 ; then TESTDIRS=${TESTDIRS}" "$xx ; fi
1284            else count=1 ;
1285                echo ""; echo -n " -- skip \"$xx\" (not a directory !)"
1286            fi
1287        else
1288            if test $count = 1 ; then echo -n ", \"$xx\""
1289            else count=1 ; echo "" ;  echo -n " skip: \"$xx\""
1290            fi
1291        fi
1292    done
1293    if test $count = 1 ; then echo "" ; echo -n " ... " ; fi
1294    #echo 'TESTDIRS='${TESTDIRS}'<'
1295    
1296  if test "x$OPTFILE" = xNONE -a "x$MITGCM_OF" != x ; then  if test "x$OPTFILE" = xNONE -a "x$MITGCM_OF" != x ; then
1297      OPTFILE=$MITGCM_OF      OPTFILE=$MITGCM_OF
1298  fi  fi
1299    
1300  echo "OK"  LOC_MFILE='tr_mpi_mfile'
1301    RUNLOG="run.tr_log"
1302    if test "x$MPI" = x0 ; then
1303      OUTPUTFILE=$ref_outp
1304      if test "x$COMMAND" = x ; then COMMAND="./$EXECUTABLE > $OUTPUTFILE" ; fi
1305    else
1306      OUTPUTFILE="STDOUT.0000"
1307      if test "x$COMMAND" = x ; then COMMAND="mpirun -v -np TR_NPROC ./$EXECUTABLE" ; fi
1308    fi
1309    
1310    echo "OK (COMMAND='$COMMAND')"
1311    
1312    #TMP=./tr_$$
1313    #- try to put temporary files in system-local /tmp dir
1314    TMP=/tmp/tr_${USER}_$$
1315    touch $TMP ; retVal=$?
1316    if [ $retVal -eq 0 ] ; then
1317      if test ! -r $TMP ; then TMP=./tr_$$ ; fi
1318    else
1319      TMP=./tr_$$
1320    fi
1321    rm -f $TMP
1322    if [ $verbose -gt 1 ]; then echo " temp files: $TMP" ; fi
1323    
1324    # set the Default List of output variables to be checked:
1325    #  (use default or load experiment-specific list from file "tr_checklist")
1326    # content : 1rst = main variable used to decide if it pass or FAIL
1327    #         others = number of matching digits to be printed in summary.txt
1328    if test $KIND = 1 ; then
1329        DEF_CHECK_LIST='tlmGrd tlmCst tlmGrd fwdGrd'
1330        EMPTY_RESULTS='.. .. ..'
1331        LEN_CHECK_LIST=`echo $DEF_CHECK_LIST | sed 's/ [a-zA-Z0-9]*+/&mn &mx &av &sd/g' | awk '{print NF-1}'`
1332    elif test $KIND = 2 -o $KIND = 4 ; then
1333        DEF_CHECK_LIST='AdGrd Cost AdGrd FDGrd'
1334        EMPTY_RESULTS='.. .. ..'
1335        LEN_CHECK_LIST=`echo $DEF_CHECK_LIST | sed 's/ [a-zA-Z0-9]*+/&mn &mx &av &sd/g' | awk '{print NF-1}'`
1336    else
1337        DEF_CHECK_LIST='PS PS T+ S+ U+ V+ pt1+ pt2+ pt3+ pt4+ pt5+'
1338        EMPTY_RESULTS='.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..'
1339        LEN_CHECK_LIST=`echo $DEF_CHECK_LIST | sed 's/ [a-zA-Z0-9]*+/&mn &mx &av &sd/g' | awk '{print NF-1}'`
1340        ii=`echo $EMPTY_RESULTS | awk '{print NF}'`
1341        EMPTY_RESULTS=$EMPTY_RESULTS`expr $LEN_CHECK_LIST - $ii | awk 'BEGIN{FS=":"}{for(i=1;i<=$1;i++){printf "  ."}}'`
1342    fi
1343    
1344  #  create the FORTRAN comparison code  #  create the FORTRAN comparison code
1345  createcodelet  if test "x$CLEANUP" = xt -o -x tr_cmpnum ; then
1346        echo "skipping comparison code build"
1347    else
1348        createcodelet
1349    fi
1350    
1351  #  build the mpack utility  #  build the mpack utility (if ADDRESSES = NONE, do it to test the build)
1352  build_mpack  if test "x$ADDRESSES" = x -o "x$SENDCMD" != x ; then
1353        echo "skipping mpack build"
1354    else
1355        build_mpack
1356        if test "x$HAVE_MPACK" = xt ; then SENDCMD=$MPACK ; fi
1357    fi
1358    
1359  #  Create a uniquely named directory to store results  #  Create a uniquely named directory to store results
1360    CMDLINE=$0
1361    for xx in "$@" ; do nw=`echo $xx | wc -w`
1362        if test $nw = '1' ; then CMDLINE="$CMDLINE $xx" ; else
1363          nb=`echo $xx | grep -c '='`
1364          if test $nb = 0 ; then CMDLINE="$CMDLINE '$xx'"
1365          else yy=`echo "$xx'" | sed "s/=/='/"` ;
1366                                 CMDLINE="$CMDLINE $yy" ; fi
1367        fi
1368    done
1369  MACH=`hostname`  MACH=`hostname`
1370  UNAMEA=`uname -a`  UNAMEA=`uname -a`
1371  DATE=`date +%Y%m%d`  DATE=`date +%Y%m%d`
1372  BASE=$MACH"_"$DATE"_"  BASE="tr_"$MACH"_"$DATE"_"
1373    if test "x$OUTDIR" != x ; then
1374        BASE="tr_"$OUTDIR"_"$DATE"_"
1375    else
1376       #short_name=`hostname -s | tr '[:upper:]' '[:lower:]'`
1377       # hostname -s is not universal (does work on AIX system)
1378        short_name=`hostname | sed 's/\..*$//' | tr '[:upper:]' '[:lower:]'`
1379        BASE="tr_"$short_name"_"$DATE"_"
1380    fi
1381  DNUM=0  DNUM=0
1382  DRESULTS="$BASE$DNUM"  DRESULTS="$BASE$DNUM"
1383  while test -e $DRESULTS ; do  while test -e $DRESULTS ; do
# Line 553  done Line 1387  done
1387  mkdir $DRESULTS  mkdir $DRESULTS
1388  RETVAL=$?  RETVAL=$?
1389  if test "x$RETVAL" != x0 ; then  if test "x$RETVAL" != x0 ; then
1390      echo "Error: can't create results directory \"./$DRESULTS\""      echo "ERROR: Can't create results directory \"./$DRESULTS\""
1391      exit 1      exit 1
1392  fi  fi
1393  SUMMARY="$DRESULTS/summary.txt"  SUMMARY="$DRESULTS/summary.txt"
1394  date > $SUMMARY  start_date=`date`
1395  cat << EOF >> $SUMMARY  echo $start_date > $SUMMARY
1396                  T           S           U           V  echo 'run:' $CMDLINE >> $SUMMARY
1397  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  
1398    
1399    of_path=
1400  if test "x$OPTFILE" != xNONE ; then  if test "x$OPTFILE" != xNONE ; then
1401      if test -r $OPTFILE ; then      if test -r $OPTFILE ; then
1402          OPTFILE=`pwd`"/$OPTFILE"          # get the path
1403            path=${OPTFILE%/*}
1404            if test "x$path" = x ; then
1405                of_path=`pwd`
1406            else
1407                of_path=`( cd $path > /dev/null 2>&1 ; pwd )`
1408            fi
1409            file=${OPTFILE##*/}
1410            OPTFILE=$of_path/$file
1411            cp $OPTFILE $DRESULTS
1412            echo >> $SUMMARY
1413            echo "  OPTFILE=$OPTFILE" >> $SUMMARY
1414        else
1415            echo | tee -a $SUMMARY
1416            echo "ERROR: can't read OPTFILE=\"$OPTFILE\"" | tee -a $SUMMARY
1417            exit 1
1418      fi      fi
1419    else
1420        echo >> $SUMMARY
1421        echo "No \"OPTFILE\" was specified ; genmake2 found and uses:" >> $SUMMARY
1422        #-note: to be filled later after 1rst run
1423  fi  fi
1424  echo  echo
 echo "OPTFILE=$OPTFILE" >> $SUMMARY  
1425  echo >> $SUMMARY  echo >> $SUMMARY
1426    if test $KIND = 0 ; then
1427        line_0=`printf '%s %2i' 'default' $MATCH_CRIT`
1428           line_0="$line_0  ----T-----  ----S-----  ----U-----  ----V-----"
1429        line_1="G D M    c        m  s        m  s        m  s        m  s"
1430        line_2="e p a R  g  m  m  e  .  m  m  e  .  m  m  e  .  m  m  e  ."
1431        line_3="n n k u  2  i  a  a  d  i  a  a  d  i  a  a  d  i  a  a  d"
1432        line_4="2 d e n  d  n  x  n  .  n  x  n  .  n  x  n  .  n  x  n  ."
1433        for ii in $PTRACERS_NUM ; do
1434            line_0="$line_0  --PTR 0"$ii"--"
1435            line_1="$line_1        m  s"
1436            line_2="$line_2  m  m  e  ."
1437            line_3="$line_3  i  a  a  d"
1438            line_4="$line_4  n  x  n  ."
1439        done
1440    else
1441        line_0=`printf '%s %2i' 'default   ' $MATCH_CRIT`
1442      if test $KIND = 1 ; then
1443       #echo "TANGLIN=true" >> $SUMMARY
1444        echo "TangLin generated by TAF" >> $SUMMARY
1445      elif test $KIND = 3 ; then
1446        echo "TangLin generated by OpenAD" >> $SUMMARY
1447      elif test $KIND = 2 ; then
1448       #echo "ADJOINT=true" >> $SUMMARY
1449        echo "Adjoint generated by TAF" >> $SUMMARY
1450      else
1451        echo "Adjoint generated by OpenAD" >> $SUMMARY
1452      fi
1453      if test $KIND = 1 -o $KIND = 3 ; then
1454        line_1="G D M    C  T  F"
1455        line_2="e p a R  o  L  D"
1456      else
1457        line_1="G D M    C  A  F"
1458        line_2="e p a R  o  d  D"
1459      fi
1460        line_3="n n k u  s  G  G"
1461        line_4="2 d e n  t  r  r"
1462        echo >> $SUMMARY
1463    fi
1464    if test "x$CLEANUP" != xt ; then
1465        echo "$line_0" | tee -a $SUMMARY
1466        echo "$line_1" | tee -a $SUMMARY
1467        echo "$line_2" | tee -a $SUMMARY
1468        echo "$line_3" | tee -a $SUMMARY
1469        echo "$line_4" | tee -a $SUMMARY
1470        echo ""        | tee -a $SUMMARY
1471    fi
1472    echo "-------------------------------------------------------------------------------"
1473    
1474  #  ...and each test directory...  #  ...and each test directory...
1475  for dir in $TESTDIRS ; do  for dir in $TESTDIRS ; do
1476        
1477        # set builddir & rundir:
1478        builddir="build"
1479        if test ! -d $dir/$builddir ; then mkdir $dir/$builddir ; fi
1480        rundir="run"
1481        pfxdir="tr_$rundir"
1482        if test ! -d $dir/$rundir ; then
1483            rundir=$builddir
1484        fi
1485        CODE_DIR=$dir/$code_dir
1486        BUILD_DIR=$dir/$builddir
1487    
1488      #  Cleanup only!      #  Cleanup only!
1489      if test "x$CLEANUP" = xt ; then      if test "x$CLEANUP" = xt ; then
1490          if test -r $dir/build/Makefile ; then          echo -n '  --- dir:' $BUILD_DIR ': '
1491              ( cd $dir/build ; make CLEAN )          makeclean $BUILD_DIR
1492            (   cd $BUILD_DIR
1493                rm -f $EXECUTABLE *.bak
1494                rm -f genmake_state genmake_*optfile genmake.log
1495                rm -f SIZE.h.mpi genmake.tr_log make.tr_log
1496                rm -rf mpi_headers
1497            )
1498            if test -d $dir/$rundir/CVS ; then
1499                echo -n '  --- dir:' $dir/$rundir ': '
1500                run_clean $dir/$rundir
1501          fi          fi
1502          if test -r $dir/input/Makefile ; then          trdir=`( cd $dir ; find . -type d -name "$pfxdir.*" -print | sed 's/^.\///')`
1503              ( cd $dir/input ; make CLEAN )          ttd=`echo $trdir | wc -w`
1504            if test $ttd != 0 ; then
1505                echo '  --- rm dir:' $trdir
1506                ( cd $dir ; rm -rf $trdir )
1507          fi          fi
1508          continue          continue
1509      fi      fi
1510    
1511      #  Verify that the testdir exists and contains previous      #  Verify that the testdir exists and contains previous
1512      #  results in the correct location--or skip this directory!      #  results in the correct location--or skip this directory!
1513      if test ! -r $dir"/results/output.txt" ; then      fout=$dir"/results/"$ref_outp
1514          echo "can't read \"$dir/results/output.txt\" -- skipping $dir"     #if test ! -r $fout ; then
1515        if test ! -r $fout -a ! -r ${fout}.gz ; then
1516            echo "can't read \"$fout\" -- skipping $dir"
1517          continue          continue
1518      fi      fi
1519    
1520      echo "-------------------------------------------------------------------------------"      # Check for specific files for particular type of run
     echo  
     echo "Experiment:  $dir"  
     echo  
     unset genmake makedepend make run  
     results='-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --'  
1521    
1522      if [ -r $dir/build ]; then      if test ! -r $CODE_DIR"/SIZE.h_mpi"  -a "x$MPI" != "x0" ; then
1523          seperatebuilddir=1          echo "can't find \"$CODE_DIR/SIZE.h_mpi\" -- skipping $dir"
1524          builddir=build          continue
1525          rundir=build      fi
1526          ( cd $dir/build; ln -sf ../input/* . )      if test ! -r $dir"/input/eedata.mth" -a "x$MULTI_THREAD" = "xt" ; then
1527      else          echo "can't find \"$dir/input/eedata.mth\" -- skipping $dir"
1528          seperatebuilddir=0          continue
         builddir=input  
         rundir=input  
1529      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"  
1530    
1531      #  Is this an MPI run?      if test "x$MPI" != "x0" ; then
1532      if test "x$MPI" = xt ; then          ntx=1 ; nty=1
1533          FILES=$MPI_FILES          if test "x$MULTI_THREAD" = "xt" ; then
1534      else            ff=$dir"/input/eedata.mth"
1535          FILES=$NOMPI_FILES            ntx=`grep "^ *nTx *=" $ff | tail -1 | sed 's/^ *nTx *= *//' | sed "s/, *$//"`
1536      fi            nty=`grep "^ *nTy *=" $ff | tail -1 | sed 's/^ *nTy *= *//' | sed "s/, *$//"`
1537                  if test "x$ntx" = x ; then ntx=1 ; fi
1538      #  Check to see that we have the files            if test "x$nty" = x ; then nty=1 ; fi
1539      have_files=t          fi
1540      for i in $FILES ; do          #- create new SIZE.h with no more than '$MPI' Procs
1541          if test ! -r $CODE_DIR/$i ; then          mk_mpi_size $CODE_DIR"/SIZE.h_mpi" $BUILD_DIR"/tr_size.mpi" $MPI $ntx $nty
1542              echo "Warning: can't read file $CODE_DIR/$i"          LOC_NPROC=$?
1543              have_files=f          (   cd $BUILD_DIR
1544                if test -r SIZE.h.mpi ; then
1545                    cmp tr_size.mpi SIZE.h.mpi > /dev/null 2>&1 ; RETVAL=$?
1546                else RETVAL=1
1547                fi
1548                if test "x$RETVAL" = x0 ; then
1549                    rm -f tr_size.mpi
1550                else
1551                    rm -f SIZE.h.mpi ; mv tr_size.mpi SIZE.h.mpi
1552                fi
1553            )
1554            if test "x$MPI_MFILE" != x ; then
1555                #- create new MPI machine-file with the right number of Procs
1556                rm -f $LOC_MFILE
1557                cat $MPI_MFILE | sort | uniq | head -$LOC_NPROC > $LOC_MFILE
1558                nl=`wc -l $LOC_MFILE | awk '{print $1}'`
1559                if [ $nl -lt $LOC_NPROC ] ; then
1560                    rm -f $LOC_MFILE
1561                    cat $MPI_MFILE | head -$LOC_NPROC > $LOC_MFILE
1562                    #sed -n "1,$LOC_NPROC p" $MPI_MFILE > $LOC_MFILE
1563                fi
1564                if [ $verbose -gt 1 ]; then
1565                    nl=`wc -l $LOC_MFILE | awk '{print $1}'`
1566                    echo " new LOC_MFILE=$LOC_MFILE : $nl procs for LOC_NPROC=$LOC_NPROC"
1567                fi
1568            fi
1569            if test "x$MULTI_THREAD" = "xt" ; then
1570                retv=`check_eedata $dir"/input/eedata.mth" $BUILD_DIR"/SIZE.h.mpi"`
1571                if test $retv != 0 ; then
1572                    echo "input/eedata.mth tiling misfit -- skipping $dir"
1573                    continue
1574                fi
1575          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  
1576      fi      fi
1577        
1578      #  If we have the $FILES and they differ, copy the $FILES to $BUILD_DIR      #  Check whether there are "extra runs" for this testdir
1579      if test "x$have_files" = xt ; then      extra_runs=
1580          for i in $FILES ; do      if test "x$NORUN" = xf ; then
1581              cmp $CODE_DIR/$i $BUILD_DIR/$i > /dev/null 2>&1          ex_run_dirs=`( cd $dir ; ls -d $inputdir.* 2> /dev/null )`
1582              RETVAL=$?      fi
1583              if test "x$RETVAL" != x0 ; then      #echo "ex_run_dirs='$ex_run_dirs'"
1584                  cp $CODE_DIR/$i $BUILD_DIR/$i      for exd in $ex_run_dirs ; do
1585            name=`echo $exd | sed -e "s/$inputdir\.//"`
1586            refExOut=`echo $ref_outp | sed "s/\./.${name}./"`
1587            outf="$dir/results/$refExOut"
1588            if test -r $outf -o -r ${outf}.gz ; then
1589              if test "x$MULTI_THREAD" = "xt" ; then
1590                if test -r $dir"/"$exd"/eedata.mth" ; then
1591                  if test "x$MPI" = "x0" ; then
1592                    extra_runs="$extra_runs $name"
1593                  else
1594                    retv=`check_eedata $dir"/"$exd"/eedata.mth" $BUILD_DIR"/SIZE.h.mpi"`
1595                    if test $retv = 0 ; then
1596                        extra_runs="$extra_runs $name"
1597                    else
1598                        echo $exd"/eedata.mth tiling misfit -- skipping $dir"
1599                    fi
1600                  fi
1601                #else echo $dir"/"$exd"/eedata.mth: not found"
1602              fi              fi
1603          done            else
1604                extra_runs="$extra_runs $name"
1605              fi
1606            fi
1607        done
1608    
1609        echo
1610        if test "x$extra_runs" = "x" ; then
1611            echo "Experiment:  $dir"
1612        else
1613            echo "Experiment:  $dir ; extra_runs=$extra_runs"
1614      fi      fi
1615            echo
1616      #  Create an output dir for each OPTFILE/tdir combination      unset genmake makedepend make run
1617      CDIR=$DRESULTS"/"$DRESULTS"_"$NDIR      results=$EMPTY_RESULTS
1618      mkdir $CDIR  
1619      CDIR=`pwd`"/$CDIR"      #  Create an output dir & summary.txt file for each tested experiment (tdir)
1620            locDIR=$DRESULTS"/"$dir
1621      if test "x$CLEANUP" = xt ; then      mkdir $locDIR
1622          makeclean $dir/$builddir      #- report to this experiment local summary file ---
1623        echo "DATE='$DATE' ; tdir='$dir'" > $locDIR"/summary.txt"
1624        echo "MACH='$MACH'" >> $locDIR"/summary.txt"
1625        echo "UNAMEA='$UNAMEA'" >> $locDIR"/summary.txt"
1626        CDIR=`pwd`"/$locDIR"
1627    
1628        if test "x$NORUN" = xt ; then
1629                run=N
1630            genmakemodel $dir/$builddir && genmake=Y \
1631                && makeclean $dir/$builddir \
1632                && symlink_mpifiles $dir $code_dir $builddir \
1633                && makedependmodel $dir/$builddir && makedepend=Y \
1634                && makemodel $dir/$builddir && make=Y
1635      else      else
1636          genmakemodel $dir/$builddir && genmake=Y \          genmakemodel $dir/$builddir && genmake=Y \
1637              && makeclean $dir/$builddir \              && makeclean $dir/$builddir \
1638                && symlink_mpifiles $dir $code_dir $builddir \
1639              && makedependmodel $dir/$builddir && makedepend=Y \              && makedependmodel $dir/$builddir && makedepend=Y \
1640              && makemodel $dir/$builddir && make=Y \              && makemodel $dir/$builddir && make=Y \
1641              && linkdata $seperatebuilddir $dir/$rundir \              && run_clean $dir/$rundir \
1642              && runmodel $dir/$builddir && run=Y \              && linkdata $dir/$rundir $inputdir \
1643              && results=`testoutput $dir $rundir`              && runmodel $dir/$rundir && run=Y \
1644                && results=`testoutput_run $dir $rundir $ref_outp`
1645        fi
1646        #echo "results='$results'"
1647    
1648            fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1649            echo 1>&2
1650            echo "$fres" | sed 's/ 99/ --/g' | sed 's/  > />/' | sed 's/  < /</' >> $SUMMARY
1651            echo "fresults='$fres'" | sed 's/ 99/ --/g' >> $locDIR"/summary.txt"
1652    
1653            for ex in $extra_runs ; do
1654                unset run
1655                results=$EMPTY_RESULTS
1656                #  reference output file
1657                refExOut=`echo $ref_outp | sed "s/\./.${ex}./g"`
1658                #  Create an output dir & summary.txt file for each extra run (tdir.ex)
1659                locDIR=$DRESULTS"/"$dir"."$ex
1660                mkdir $locDIR
1661                #- report to this experiment local summary file ---
1662                echo "DATE='$DATE' ; tdir='$dir.$ex'" > $locDIR"/summary.txt"
1663                #echo "MACH='$MACH'" >> $locDIR"/summary.txt"
1664                #echo "UNAMEA='$UNAMEA'" >> $locDIR"/summary.txt"
1665                CDIR=`pwd`"/$locDIR"
1666                test ! -e "$dir/$pfxdir.$ex" && mkdir "$dir/$pfxdir.$ex"
1667                run_clean $dir/$pfxdir.$ex
1668                linkdata $dir/$pfxdir.$ex $inputdir.$ex $inputdir
1669                runmodel $dir/$pfxdir.$ex && run=Y \
1670                && results=`testoutput_run $dir $pfxdir.$ex $refExOut`
1671                fres=`formatresults $dir.$ex ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1672                echo 1>&2
1673                echo "$fres" | sed 's/ 99/ --/g' | sed 's/  > />/' | sed 's/  < /</' >> $SUMMARY
1674                echo "fresults='$fres'" | sed 's/ 99/ --/g' >> $locDIR"/summary.txt"
1675                if test "x$POSTCLEAN" = x2 ; then
1676                    run_clean $dir/$pfxdir.$ex
1677                fi
1678            done
1679    
1680        if test ! -f $DRESULTS"/"genmake_state ; then
1681            if test -f $dir/$builddir/Makefile ; then
1682                mkOpt=`grep '^# OPTFILE=' $dir/$builddir/Makefile 2>/dev/null | head -1 | sed 's/^# //'`
1683                echo "from '$dir/$builddir/Makefile', extract:" > $DRESULTS/genmake_state
1684    #           sed -n '/^# executed by:/,+1 p' $dir/$builddir/Makefile >> $DRESULTS/genmake_state
1685    # bsd-sed cannot do the above code
1686                cat $dir/$builddir/Makefile | \
1687                    sed  -n '/^# executed by:/{N
1688                                               p
1689                                               }' >> $DRESULTS/genmake_state
1690                echo " $mkOpt" >> $DRESULTS/genmake_state
1691                if test "x$OPTFILE" = xNONE ; then
1692                    eval $mkOpt
1693    #               sed "/^No \"OPTFILE\" was specified ; genmake2/a\  OPTFILE=${OPTFILE}"\
1694    #                       $SUMMARY > tmp.tr_log
1695    # bsd-sed requires a newline after "a\":
1696                    sed "/^No \"OPTFILE\" was specified ; genmake2/a\\
1697                             OPTFILE=${OPTFILE}" $SUMMARY > tmp.tr_log
1698                    RETVAL=$?
1699                    if test "x$RETVAL" = x0 ; then
1700                        cp -f tmp.tr_log $SUMMARY
1701                    fi
1702                    rm -f tmp.tr_log
1703                fi
1704                gmkLog=$dir/$builddir/genmake.log
1705                if test -r $gmkLog ; then
1706                    grep '^Get compiler version using:' $gmkLog > /dev/null 2>&1
1707                    RETVAL=$?
1708                    if test "x$RETVAL" = x0 ; then
1709                      echo -n "from '$gmkLog', " >> $DRESULTS/genmake_state
1710                      echo "extract compiler version:"   >> $DRESULTS/genmake_state
1711                      sed -n '/Get compiler version/,/<-- compiler version/p' \
1712                         $gmkLog | grep -v '^... compiler version ' > tmp.tr_log
1713                      sed -n '1p' tmp.tr_log >> $DRESULTS/genmake_state
1714                      sed -n '2,/^$/p' tmp.tr_log | sed '/^$/d' | sed 's/^./ &/' \
1715                                             >> $DRESULTS/genmake_state
1716                      rm -f tmp.tr_log
1717                    fi
1718                    echo -n "from '$gmkLog', " >> $DRESULTS/genmake_state
1719                    echo "get NETCDF & LAPACK settings:" >> $DRESULTS/genmake_state
1720                    sed -n '/set HAVE_NETCDF=/p' $gmkLog >> $DRESULTS/genmake_state
1721                    sed -n '/set HAVE_LAPACK=/p' $gmkLog >> $DRESULTS/genmake_state
1722                fi
1723            fi
1724      fi      fi
1725            #postclean $dir/$builddir
1726      echo      if test "x$POSTCLEAN" = x2 ; then
1727      formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} \          makeclean $dir/$builddir \
1728          ${run:-N} $results              && run_clean $dir/$rundir
1729      echo      fi
1730      formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} \      if test "x$MPI" != x0 -a "x$MPI_MFILE" != x ; then rm -f $LOC_MFILE ; fi
1731          ${run:-N} $results >> $SUMMARY  
1732      echo "fresults='" > $CDIR"/summary.txt"      echo "-------------------------------------------------------------------------------"
1733      formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} \  
1734          ${run:-N} $results >> $CDIR"/summary.txt"  done
1735      echo "'" >> $CDIR"/summary.txt"  
1736      echo "MACH='$MACH'" >> $CDIR"/summary.txt"  printf "Start time:  " >> $SUMMARY
1737      echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"  echo "$start_date" >> $SUMMARY
1738      echo "DATE='$DATE'" >> $CDIR"/summary.txt"  printf "End time:    " >> $SUMMARY
1739      echo "tdir='$dir'" >> $CDIR"/summary.txt"  date >> $SUMMARY
1740        
1741      (  #  If addresses were supplied and mpack built successfully, then try
1742          cd $DRESULTS  #  to send email using mpack.
1743          tar -cf $NDIR".tar" $DRESULTS"_"$NDIR > /dev/null 2>&1  if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then
1744          gzip $NDIR".tar"      echo "No results email was sent."
1745      )  else
1746            if test "x$SENDCMD" != x ; then
1747      if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then          if [ $verbose -gt 1 ]; then
1748          echo "No mail sent"             echo " run: $SENDCMD -s MITgcm-test -m 3555000 ${SAVDIR}/${DRESULTS}".tar.gz" $ADDRESSES"
1749      else          fi
1750          $MPACK -s MITgcm-test -m 1000000 $DRESULTS"/"$NDIR".tar.gz" $ADDRESSES          tar -cf ${SAVDIR}/${DRESULTS}".tar" $DRESULTS > /dev/null 2>&1 \
1751                && gzip ${SAVDIR}/${DRESULTS}".tar" \
1752                && $SENDCMD -s MITgcm-test -m 3555000 ${SAVDIR}/${DRESULTS}".tar.gz" $ADDRESSES
1753          RETVAL=$?          RETVAL=$?
1754          if test "x$RETVAL" != x0 ; then          if test "x$RETVAL" != x0 ; then
1755              echo "Warning: \"$MPACK\" failed -- please contact <edhill@mitgcm.org>"              echo
1756                echo "Warning: The tar, gzip, & mpack step failed.  Please send email"
1757                echo "  to <MITgcm-support@mitgcm.org> for help.  You may copy the "
1758                echo "  summary of results from the directory \"$DRESULTS\"."
1759                echo
1760          else          else
1761              rm -f $DRESULTS"/"$NDIR".tar*"              echo
1762                echo "An email containing results was sent to the following addresses:"
1763                echo "  \"$ADDRESSES\""
1764                echo
1765                test -f ${SAVDIR}/${DRESULTS}".tar" &&  rm -f ${SAVDIR}/${DRESULTS}".tar"
1766                test -f ${SAVDIR}/${DRESULTS}".tar.gz" &&  rm -f ${SAVDIR}/${DRESULTS}".tar.gz"
1767          fi          fi
1768      fi      fi
1769    fi
1770    
1771      echo "-------------------------------------------------------------------------------"  if test "x$QUICK" = xf -a "x$NORUN" = xf ; then
1772            rm -f tr_cmpnum.c tr_cmpnum
1773      NDIR=$(( $NDIR + 1 ))  fi
       
 done  
   
 rm tmp_cmpnum.f a.out  
1774    
1775  cat $SUMMARY  if test "x$CLEANUP" != xt ; then
1776        cat $SUMMARY | sed 's/ \.  \.  \.  \.  \.  \.  \.  \.  \.  \.  \.  \. //'
1777        if test -e tr_out.txt ; then
1778            mv tr_out.txt tr_out.txt.old
1779        fi
1780        cat $SUMMARY | sed '/^[YN] [YN] [YN] [YN]/ s/ \. //g' > tr_out.txt
1781    fi
1782    
1783    if test "x$DELDIR" = xt ; then
1784        rm -rf $DRESULTS
1785    fi
1786    echo "======== End of testreport execution ========"

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

  ViewVC Help
Powered by ViewVC 1.1.22