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

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

  ViewVC Help
Powered by ViewVC 1.1.22