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

Legend:
Removed from v.1.38  
changed lines
  Added in v.1.196

  ViewVC Help
Powered by ViewVC 1.1.22