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

Legend:
Removed from v.1.9.2.11  
changed lines
  Added in v.1.212

  ViewVC Help
Powered by ViewVC 1.1.22