/[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.33 by adcroft, Thu Dec 18 15:12:34 2003 UTC revision 1.195 by jmc, Sun Sep 22 23:35:56 2013 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    
85  #  build the mpack utility  #  build the mpack utility
86  build_mpack()  build_mpack()
87  {  {
88      echo -n "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
         echo -n "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      # 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 1>&2          echo testoutput_var: grep "$2" $1/$5 1>&2
147      fi      fi
148      grep "$2" $1/results/output.txt | 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          #-- 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; cg2dres=$?  
         if [ $debug -gt 0 ]; then  
             echo testoutput: cg2dres=$cg2dres 1>&2  
         fi  
         testoutput_for_prop $1 "dynstat_theta_min" "theta minimum" $2; tmin=$?  
         testoutput_for_prop $1 "dynstat_theta_max" "theta maximum" $2; tmax=$?  
         testoutput_for_prop $1 "dynstat_theta_mean" "theta mean" $2; tmean=$?  
         testoutput_for_prop $1 "dynstat_theta_sd" "theta s.d." $2; tsd=$?  
         testoutput_for_prop $1 "dynstat_salt_min" "salt minimum" $2; smin=$?  
         testoutput_for_prop $1 "dynstat_salt_max" "salt maximum" $2; smax=$?  
         testoutput_for_prop $1 "dynstat_salt_mean" "salt mean" $2; smean=$?  
         testoutput_for_prop $1 "dynstat_salt_sd" "salt s.d." $2; ssd=$?  
         testoutput_for_prop $1 "dynstat_uvel_min" "U minimum" $2; umin=$?  
         testoutput_for_prop $1 "dynstat_uvel_max" "U maximum" $2; umax=$?  
         testoutput_for_prop $1 "dynstat_uvel_mean" "U mean" $2; umean=$?  
         testoutput_for_prop $1 "dynstat_uvel_sd" "U s.d." $2; usd=$?  
         testoutput_for_prop $1 "dynstat_vvel_min" "V minimum" $2; vmin=$?  
         testoutput_for_prop $1 "dynstat_vvel_max" "V maximum" $2; vmax=$?  
         testoutput_for_prop $1 "dynstat_vvel_mean" "V mean" $2; vmean=$?  
         testoutput_for_prop $1 "dynstat_vvel_sd" "V s.d." $2; vsd=$?  
         dashnum $cg2dres $tmin $tmax $tmean $tsd $smin $smax $smean $ssd \  
             $umin $umax $umean $usd $vmin $vmax $vmean $vsd  
     else  
         testoutput_ad $1 $2 "precision_grdchk_result"  
     fi  
352  }  }
353    
354  genmakemodel()  genmakemodel()
# Line 211  genmakemodel() Line 357  genmakemodel()
357      if test "x$NOGENMAKE" = xt ; then      if test "x$NOGENMAKE" = xt ; then
358          echo "genmake skipped!"          echo "genmake skipped!"
359      else      else
360          GENMAKE2="$BASH ../../../tools/genmake2"          if test "x$BASH" = x ; then
361                GENMAKE2="../../../tools/genmake2"
362            else
363                GENMAKE2="$BASH ../../../tools/genmake2 -bash $BASH"
364            fi
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              else              fi
371                if test $KIND = 1 -o $KIND = 2 ; then
372                  command="$command --mods=../code_ad"                  command="$command --mods=../code_ad"
373                  command="$command -adof=../../../tools/adjoint_options/adjoint_staf"              elif test $KIND = 4 ; then
374                    command="$command -adof ../../../tools/adjoint_options/adjoint_oad -mods ../code_oad"
375                else
376                    command="$command -mods=../code"
377              fi              fi
378              if test "x$OPTFILE" != xNONE ; then              if test "x$OPTFILE" != xNONE ; then
379                  command="$command --optfile=$OPTFILE"                  command="$command -optfile=$OPTFILE"
380              fi              fi
381              if test "x$IEEE" != x ; then              if test $OptLev = 1 ; then
382                  command="$command -ieee"                  command="$command -ieee"
383              fi              fi
384              printf 'genmake ... ' 1>&2              if test $OptLev = 0 ; then
385              $command > make.log 2>&1                  command="$command -devel"
386                fi
387                if test "x$GSL" = xt ; then
388                    command="$command -gsl"
389                fi
390                if test "x$MPI" != x0 ; then
391                    command="$command -mpi"
392                fi
393                if test "x$MULTI_THREAD" = xt ; then
394                #- run multi-threaded using OpenMP:
395                    command="$command -omp"
396                fi
397                if test "x$USE_R4" = xt ; then
398                    command="$command -use_r4"
399                fi
400                if test "x$EXTRFLG" != x ; then
401                    command="$command -extra_flag $EXTRFLG"
402                fi
403                if test "x$TS" = xt ; then
404                    command="$command -ts"
405                fi
406                if test "x$PAPIS" = xt ; then
407                    command="$command -papis"
408                else
409                if test "x$PCLS" = xt ; then
410                    command="$command -pcls"
411                fi
412                fi
413                printf 'genmake ... '
414                eval $command > genmake.tr_log 2>&1
415              RETVAL=$?              RETVAL=$?
416              cp Makefile $CDIR              #  Reduce the size of the testing emails!
417                head -100 Makefile > $CDIR/Makefile_head
418              if test "x$RETVAL" != x0 ; then              if test "x$RETVAL" != x0 ; then
419                  tail make.log                  tail genmake.tr_log
420                  echo "genmakemodel: genmake failed" 1>&2                  echo "genmakemodel: genmake failed"
421                  cp genmake_* make.log $CDIR                  cp genmake.log genmake_* genmake.tr_log $CDIR
422                  return 1                  return 1
423              else              else
424                  echo "successful" 1>&2                  echo "successful"
425              fi              fi
426          )          )
427      fi      fi
# Line 246  genmakemodel() Line 430  genmakemodel()
430  makeclean()  makeclean()
431  {  {
432      # makeclean directory      # makeclean directory
433        if test "x$NOGENMAKE" = xf ; then rm -f $1/make.tr_log ; fi
434      if test "x$NOCLEAN" = xt ; then      if test "x$NOCLEAN" = xt ; then
435          echo "make CLEAN skipped!"          echo "make Clean skipped!"
436      else      else
437          (          (
438              cd $1;              cd $1;
439              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  
440              if test -r Makefile ; then              if test -r Makefile ; then
441                  $MAKE CLEAN >> make.log 2>&1                  printf 'clean build-dir: make Clean ... '
442                    $MAKE Clean >> make.tr_log 2>&1
443                  RETVAL=$?                  RETVAL=$?
444                  if test "x$RETVAL" != x0 ; then                  if test "x$RETVAL" != x0 ; then
445                      tail make.log                      tail make.tr_log
446                      echo "makeclean: \"make CLEAN\" failed" 1>&2                      echo "makeclean: \"make Clean\" failed"
447                      cp make.log $CDIR"/make.log"                      cp make.tr_log genmake.log genmake.tr_log $CDIR
448                      return 1                      return 1
449                  fi                  fi
450                    echo successful
451                else
452                    echo ''
453              fi              fi
             echo successful 1>&2  
454              exit 0              exit 0
455          )          )
456      fi      fi
457  }  }
458    
459    run_clean()
460    {
461        # run_clean directory
462        if test "x$NOCLEAN" = xt ; then
463            echo "run_clean skipped!"
464        else
465          (
466            cd $1;
467            printf 'clean run-dir ... '
468            # part of what is done after "make clean" when doing "make CLEAN"
469            find . -name "*.meta" -exec rm {} \;
470            find . -name "*.data" -exec rm {} \;
471            find . -name "fort.*" -exec rm {} \;
472            find . -type l -exec rm {} \;
473            #- should remove executable only if sym-link (already done above)
474            rm -f $RUNLOG *.txt STDOUT.* STDERR.* *diagnostics.log *.[0-9][0-9][0-9][0-9].log
475            rm -f datetime costfinal divided.ctrl snapshot* output_adm.*.diva_*
476            rm -f *_MIT_CE_000.opt0000 costfunction*0000
477            rm -f oad_cp.[0-9][0-9][0-9].?????
478            rm -rf mnc_test_*
479            echo successful
480            exit 0
481          )
482        fi
483    }
484    
485  makedependmodel()  makedependmodel()
486  {  {
487      # makedependmodel directory      # makedependmodel directory
# Line 279  makedependmodel() Line 490  makedependmodel()
490      else      else
491          (          (
492              cd $1;              cd $1;
493              printf 'make depend ... ' 1>&2              printf 'make depend ... '
494              $MAKE depend >> make.log 2>&1              $MAKE depend >> make.tr_log 2>&1
495              RETVAL=$?              RETVAL=$?
496              if test "x$RETVAL" != x0 ; then              if test "x$RETVAL" != x0 ; then
497                  tail make.log                  tail make.tr_log
498                  echo "makedependmodel: make depend failed" 1>&2                  echo "makedependmodel: make depend failed"
499                  cp make.log $CDIR"/make.log"                  cp make.tr_log genmake.log genmake.tr_log $CDIR
500                  return 1                  return 1
501              else              else
502                  echo successful 1>&2                  echo successful
503              fi              fi
504          )          )
505      fi      fi
# Line 298  makemodel() Line 509  makemodel()
509  {  {
510      # makemodel directory      # makemodel directory
511      (      (
512        mk_fail=0
513        if test "x$NOMAKE" = xt ; then
514            cd $1;
515            if test -x $EXECUTABLE ; then
516                echo "make skipped!"
517            else
518                echo "no executable!"
519                mk_fail=3
520            fi
521        else
522          cd $1;          cd $1;
523          if test -r Makefile ; then          if test -r Makefile ; then
524              printf 'make ... ' 1>&2              printf 'make ... '
525              if test "x$ADM" = x ; then              if test "x$REPLMAKE" = x ; then
526                  $MAKE >> make.log 2>&1                  $MAKE $TARG >> make.tr_log 2>&1
527              else              else
528                  $MAKE adall >> make.log 2>&1                  $REPLMAKE $TARG >> make.tr_log 2>&1
529              fi              fi
530              RETVAL=$?              RETVAL=$?
531              if test "x$RETVAL" != x0 ; then              if test "x$RETVAL" != x0 ; then
532                  tail make.log                  tail make.tr_log
533                  echo failed 1>&2                  echo failed
534                  cp make.log $CDIR"/make.log"                  cp genmake.log genmake.tr_log $CDIR
535                  return 1                  tail -$NBLINES_MKLOG make.tr_log > $CDIR"/make.tr_log_tail"
536                    rm -f $EXECUTABLE
537                    mk_fail=1
538              else              else
539                  echo successful 1>&2                  echo successful
540              fi              fi
541            else
542                echo "no Makefile !"
543                mk_fail=2
544          fi          fi
545        fi
546        if test $KIND = 1 -a -f taf_ftl.log ; then
547            head -1 taf_ftl.log >> $CDIR"/summary.txt"
548        fi
549        if test $KIND = 2 -a -f taf_ad.log ; then
550            head -1 taf_ad.log >> $CDIR"/summary.txt"
551            nerr=`grep -c 'TAF *.* ERROR ' taf_ad.log`
552            nwar=`grep -c 'TAF RECOMPUTATION *.* WARNING ' taf_ad.log`
553            if test -f taf_output ; then
554                n2er=`grep -c 'TAF *.* ERROR ' taf_output`
555                n3er=`grep -c '\*ERROR\* ' taf_output`
556                nerr=`expr $nerr + $n2er + $n3er`
557            fi
558            echo " TAF reports $nerr Errors and $nwar Recomputation Warnings" \
559                                    >> $CDIR"/summary.txt"
560        fi
561        if test $mk_fail != 0 ; then return $mk_fail ; fi
562      )      )
563  }  }
564    
565    mk_mpi_size()
566    {
567        # mk_mpi_size input_file output_file proc_Nb threads_Nb_X threads_Nb_Y
568        #
569        #  make new SIZE.h (=output_file) from SIZE.h_mpi (=input_file)
570        #     for an MPI build with no more than proc_Nb processors ;
571        #  ensure that enough tiles per proc (nSx,nSy) remain for the given
572        #     number of threads (nTx,nTy) ;
573        #  return the effective number of processors.
574    
575        inp=$1
576        out=$2
577        np=$3
578        tx=$4
579        ty=$5
580        tmp=TTT.$$
581    
582        # dirX : select with direction to favor in MPI process repartition
583        #   dirX=1 : prefer to put more proc in X direction
584        #   dirX=0 : prefer to put more proc in Y direction
585        dirX=0
586    
587        px=`grep "^     & *nPx *=" $inp | sed "s/^     & *nPx *= *//" | sed 's/, *$//'`
588        py=`grep "^     & *nPy *=" $inp | sed "s/^     & *nPy *= *//" | sed 's/, *$//'`
589        sx=`grep "^     & *nSx *=" $inp | sed "s/^     & *nSx *= *//" | sed 's/, *$//'`
590        sy=`grep "^     & *nSy *=" $inp | sed "s/^     & *nSy *= *//" | sed 's/, *$//'`
591    
592        #- for each direction, assume # of threads is a multiple of total number of tiles
593        nx=$px
594        if [ `expr $sx % $tx` -ne 0 -a `expr $sx \* $px % $tx` -eq 0 ] ; then
595            nx=`expr $sx \* $px / $tx`
596            if [ $verbose -gt 1 ]; then
597                echo " change px from $px to $nx to accommodate $tx threads"
598            fi
599        fi
600        ny=$py
601        if [ `expr $sy % $ty` -ne 0 -a `expr $sy \* $py % $ty` -eq 0 ] ; then
602            ny=`expr $sy \* $py / $ty`
603            if [ $verbose -gt 1 ]; then
604                echo " change py from $py to $ny to accommodate $ty threads"
605            fi
606        fi
607        #- find the largest divisor of input_file proc Nb, but not larger than $np
608        pp=0
609        i=1
610        while [ $i -le $nx ] ; do
611          if [ `expr $nx % $i` -eq 0 ] ; then
612            j=1
613            while [ $j -le $ny ] ; do
614              if [ `expr $ny % $j` -eq 0 ] ; then
615                ij=`expr $i \* $j`
616                if [ $ij -gt $pp ] ; then
617                    flag=1
618                elif [ $ij -eq $pp ] ; then
619                    flag=$dirX
620                else
621                    flag=0
622                fi
623                if test $flag = 1 ; then
624                  if [ $ij -le $np ] ; then
625                    ix=$i ; jy=$j ; pp=$ij
626                    #echo "  ix,jy= $ix,$jy"
627                  fi
628                fi
629              fi
630              j=`expr $j + 1`
631            done
632          fi
633          i=`expr $i + 1`
634        done
635    
636        #- create new SIZE.h type file:
637        sx=`expr $sx \* $px / $ix`
638        sy=`expr $sy \* $py / $jy`
639        if [ $verbose -gt 1 ]; then
640            echo " px,py,np= $px,$py,$np : New MPI size: px,py= $ix,$jy : sx,sy= $sx,$sy"
641        fi
642        sed "/^     \& *nPx *=/s/[0-9]*,/$ix,/" $inp > $tmp
643        sed "/^     \& *nPy *=/s/[0-9]*,/$jy,/" $tmp > $out
644        sed "/^     \& *nSx *=/s/[0-9]*,/$sx,/" $out > $tmp
645        sed "/^     \& *nSy *=/s/[0-9]*,/$sy,/" $tmp > $out
646        rm -f $tmp
647        return $pp
648    }
649    
650  symlink_mpifiles()  symlink_mpifiles()
651  {  {
652      # Put special links so that MPI specific files are used      # Put special links so that MPI specific files are used
# Line 327  symlink_mpifiles() Line 655  symlink_mpifiles()
655    
656      dir=$1      dir=$1
657      code_dir=$2      code_dir=$2
658      BUILD_DIR=$dir/$3      build_dir=$dir/$3
     CODE_DIR=$dir/$code_dir  
659    
660      # These are files that should replace their counter-part when using -mpi      # These are files that should replace their counter-part when using -mpi
661      MPI_FILES=`(cd $CODE_DIR; find . -name "*_mpi")`      MPI_FILES=`(cd $dir/$code_dir; find . -name "*_mpi" -print)`
662    
663      #  Is this an MPI run?      for ii in $MPI_FILES ; do
664      if test "x$MPI" = xt ; then          i=`echo $ii | sed 's:^\./::'`
665          # YES: We symbolically link these files to the build          name=`echo $i | sed 's:_mpi::'`
666          # dir so long as there is no real file in place          file="../$code_dir/$i"
667          for ii in $MPI_FILES ; do          if test $name = 'SIZE.h' ; then file="SIZE.h.mpi" ; fi
668              i=`echo $ii | sed 's:^\./::'`  
669              name=`echo $i | sed 's:_mpi::' `          #  Is this an MPI run?
670              cmp $CODE_DIR/$i $BUILD_DIR/$name > /dev/null 2>&1          if test "x$MPI" = x0 ; then
671              RETVAL=$?              # NO: We undo any _mpi symbolically linked files
672              if test "x$RETVAL" != x0 ; then              if test -L $build_dir/$name ; then
673                  if ! test -f $BUILD_DIR/$i ; then                  ( cd $build_dir ; cmp $name $file > /dev/null 2>&1 )
674                  #echo Linking $name to $i                  RETVAL=$?
675                      (cd $BUILD_DIR; ln -sf ../$code_dir/$i $name)                  if test "x$RETVAL" = x0 ; then
676                        if [ $verbose -gt 1 ]; then
677                            echo "  Un-linking $name from ../$code_dir" ; fi
678                        rm -f $build_dir/$name
679                  fi                  fi
680              fi              fi
681          done          else
682      else              # YES: We symbolically link these files to the build
683      # NO: We undo any _mpi symbolically linked files              # dir so long as there is no real file in place
684          for ii in $MPI_FILES ; do              ( cd $build_dir ; cmp $name $file > /dev/null 2>&1 )
685              i=`echo $ii | sed 's:^\./::'`              RETVAL=$?
686              name=`echo $i | sed 's:_mpi::' `              if [ $verbose -gt 1 ]; then echo "  cmp $name $file returns: $RETVAL" ; fi
687              if test -L $BUILD_DIR/$name ; then              if test "x$RETVAL" != x0 ; then
688                  linktarg=`(cd $BUILD_DIR; readlink $name)`                  if test -h $build_dir/$name ; then rm -f $build_dir/$name ; fi
689                  if test $linktarg = "../$code_dir/$name"_mpi ; then                  if test ! -r $build_dir/$name ; then
690                  #echo Un-linking $name from $linktarg                      if [ $verbose -gt 1 ]; then echo "  Linking $name to $file" ; fi
691                      rm -f $BUILD_DIR/$name                      (cd $build_dir; ln -sf $file $name)
692                  fi                  fi
693              fi              fi
694          done          fi
695      fi      done
       
696  }  }
697    
698  linkdata()  linkdata()
699  {  {
700      # linkdata flag      # linkdata run_dir input_dir_1 input_dir_2 ...
701      #      #
702      # symbolically link data files to run directory      # symbolically link data files to run directory
703      if test "x$1" = x1 ; then      if test -d $1 ; then
704          (          (
705              cd $2              cd $1 ; shift
706              if test "x$ADM" = x ; then              echo 'linkdata from dirs:' $*
707                  files=`( cd ../input ; ls -1 | grep -v CVS )`              inpMPI=`(cd ../$1 ; find . -name "*.mpi" -print | sed 's:^\./::')`
708                  for i in $files ; do              for xx in $inpMPI ; do
709                      if test ! -d "../input/"$i ; then                if test -r "../"$1"/"$xx ; then
710                          ln -sf "../input/"$i $i                  # found 1 _mpi sfx file in 1rst input dir and it is readable
711                      fi                  yy=`echo $xx | sed 's:\.mpi$::'`
712                  done                  if test "x$MPI" = "x0" ; then
713              else                      # not mpi test: remove symbolic link
714                  files=`( cd ../input ; ls -1 *.bin | grep -v CVS )`                      if test -h $yy ; then rm -f $yy ; fi
715                  for i in $files ; do                  else
716                      if test ! -d "../input/"$i ; then                      # mpi test: remove symbolic link & link .mpi sfx file
717                          ln -sf "../input/"$i $i                      if test -h $yy ; then rm -f $yy ; fi
718                        if test ! -r $yy ; then
719                            ln -sf "../"$1"/"$xx $yy ;
720                            printf " $xx" 1>&2
721                      fi                      fi
722                  done                  fi
723                  files=`( cd ../input_ad ; ls -1 | grep -v CVS )`                fi
724                  for i in $files ; do              done
725                      if test ! -d "../input_ad/"$i ; then              if test -r "../"$1"/eedata.mth" ; then
726                          ln -sf "../input_ad/"$i $i              # found eedata.mth in 1rst input dir and it is readable
727                    if test "x$MULTI_THREAD" = "xt" ; then
728                    # multi-threaded test: remove symbolic link & link eedata.mth
729                        if test -h eedata ; then rm -f eedata ; fi
730                        if test ! -r eedata ; then
731                            ln -sf "../"$1"/eedata.mth" eedata ;
732                            printf ' eedata.mth' 1>&2
733                      fi                      fi
734                  done                  else
735                    # not multi-threaded test: remove eedata symbolic link
736                        if test -h eedata ; then rm -f eedata ; fi
737                    fi
738              fi              fi
739                prevDir='NONE'
740                for ldir in $* ; do
741                    if test -d "../"$ldir -a $ldir != $prevDir ; then
742                        printf " ldir=${ldir}:" 1>&2
743                        files=`( cd "../"$ldir ; ls -1 | grep -v CVS )`
744                        for i in $files ; do
745                            if test ! -d "../"$ldir/$i ; then
746                                if test ! -r $i  ; then
747                                    printf ' '$i 1>&2
748                                    ln -sf "../"$ldir"/"$i $i
749                                fi
750                            fi
751                        done
752                        printf ' ;' 1>&2
753                        if test -x "../"$ldir"/"prepare_run ; then
754                            "../"$ldir"/"prepare_run 1>&2
755                        else
756                            echo '' 1>&2
757                        fi
758                    fi
759                    prevDir=$ldir
760                done
761          )          )
762      fi      fi
763  }  }
# Line 403  runmodel() Line 766  runmodel()
766  {  {
767      # runmodel directory      # runmodel directory
768      #      #
769      #  runs "$COMMAND in "directory"      #  runs $COMMAND in "directory"
770      #  (where "$COMMAND" is relative to "directory")      #  (where "$COMMAND" is relative to "directory")
771      (      (
772          cd $1          cd $1
773          printf 'runmodel ... ' 1>&2          printf 'runmodel in %s ... ' $1
774          # make output.txt          if test "x$MPI" != x0 ; then
775          $COMMAND >> run.log 2>&1              #- adjust the MPI run command with the right number of Procs
776          RETVAL=$?              #echo '' ; echo "  COMMAND='$COMMAND'"
777          if test "x$RETVAL" = x0 ; then              COMMAND=`echo $COMMAND | sed "s/ TR_NPROC / $LOC_NPROC /"`
778              echo successful 1>&2              if test "x$MPI_MFILE" != x ; then
779              if test "x$ADM" = x ; then                COMMAND=`echo $COMMAND | sed "s/ TR_MFILE / ..\/..\/$LOC_MFILE /"`
780                  cp output.txt $CDIR"/output.txt"              fi
781              else              #echo "  COMMAND='$COMMAND'"
782                  cp output.txt_adm $CDIR"/output.txt_adm"          fi
783            if test -L $EXECUTABLE ; then
784              if test -x "../"$builddir"/"$EXECUTABLE ; then
785                cmp $EXECUTABLE "../"$builddir"/"$EXECUTABLE > /dev/null 2>&1
786                outD=$? ; if test "x$outD" != x0 ; then rm -f $EXECUTABLE ; fi
787              else rm -f $EXECUTABLE
788              fi
789            fi
790            if test ! -x $EXECUTABLE -a -x "../"$builddir"/"$EXECUTABLE ; then
791                echo " link" $EXECUTABLE "from dir ../"$builddir > run.log_tmp
792                ln -sf "../"$builddir"/"$EXECUTABLE .
793            fi
794            if test ! -x $EXECUTABLE ; then
795                rm -f $RUNLOG ; touch $RUNLOG
796                if test -f run.log_tmp ; then cat run.log_tmp >> $RUNLOG ; fi
797                echo " no executable:" $EXECUTABLE >> $RUNLOG
798                RETVAL=8
799                ENDVAL=-1
800            else
801              if test ! -f $OUTPUTFILE -o $OUTPUTFILE -ot $EXECUTABLE ; then
802                # output do not exist or is older than executable:
803                rm -f $OUTPUTFILE $RUNLOG ; touch $RUNLOG
804                if test -f run.log_tmp ; then cat run.log_tmp >> $RUNLOG ; fi
805            #- Divided Adjoint Run:
806            #  get the number of additional runs (add_DIVA_runs) from file "run_ADM_DIVA"
807                if test $KIND = 2 -a -f run_ADM_DIVA ; then
808                  adm_diva_nb=`sed -n '/^ *add_DIVA_runs\>.*=/p' run_ADM_DIVA | sed 's/ //g'`
809                  echo " Divided Adjoint Run: $adm_diva_nb" >> $RUNLOG
810                  eval "let $adm_diva_nb"
811                  if [ $add_DIVA_runs -ge 1 ] ; then
812                    rm -f costf* divided.ctrl snapshot*
813                    echo -n "(add_DIVA_runs=$add_DIVA_runs) ... "
814                    for ii in `seq 1 $add_DIVA_runs` ; do
815                      ( eval $COMMAND ) >> $RUNLOG 2>&1
816                      echo " additional DIVA run # $ii : done" >> $RUNLOG
817                      mv -f $OUTPUTFILE ${OUTPUTFILE}.diva_${ii}
818                    done
819                  fi
820              fi              fi
821            #- special DIVA processing ends here
822                ( eval $COMMAND ) >> $RUNLOG 2>&1
823                RETVAL=$?
824                ENDVAL=`tail $OUTPUTFILE | grep -c 'PROGRAM MAIN: Execution ended Normally'`
825                if [ $POSTCLEAN -eq 1 -a $ENDVAL -gt 0 ] ; then
826                    find . -name "*.meta" -exec rm {} \;
827                    find . -name "*.data" -exec rm {} \;
828                    rm -rf mnc_test_*
829                fi
830              else
831                RETVAL=0
832                ENDVAL=`tail $OUTPUTFILE | grep -c 'PROGRAM MAIN: Execution ended Normally'`
833                touch $RUNLOG
834                if test -f run.log_tmp ; then cat run.log_tmp >> $RUNLOG ; fi
835                echo "---------->> $OUTPUTFILE is up to date " >> $RUNLOG 2>&1
836              fi
837            fi
838            rm -f run.log_tmp
839            #- in all cases where OutputFile exists, report SIZE and time
840            if test -f $OUTPUTFILE ; then
841              grep '(PID\.TID 0000\.0001)      n.. =' $OUTPUTFILE \
842                    | sed 's/(PID.TID 0000.0001)   //' >> $CDIR"/summary.txt"
843              grep -A3 'Seconds in section "ALL' $OUTPUTFILE \
844                    | sed 's/(PID.TID 0000.0001)   //' >> $CDIR"/summary.txt"
845            fi
846            if test -s STDERR.0000 ; then cp STDERR.0000 $CDIR"/STDERR.0000" ; fi
847            if [ $RETVAL -eq 0 -a $ENDVAL -gt 0 ] ; then
848                echo successful
849                printf '=> output from running in %s :\n' $1 1>&2
850                tail $RUNLOG | sed 's/^.*/> &/g' 1>&2
851                return 0
852            elif [ $RETVAL -ne 0 -a $ENDVAL -gt 0 ] ; then
853                #-- for some weird cases (run is finihed but with error code)
854                echo 'finished with error (run:' $RETVAL ' end:' $ENDVAL ')'
855                printf '=> output from running in %s :\n' $1 1>&2
856                tail $RUNLOG | sed 's/^.*/> &/g' 1>&2
857              return 0              return 0
858          else          else
859              tail run.log              echo 'failed (run:' $RETVAL ' end:' $ENDVAL ')'
860              echo failed 1>&2              printf '=> output from running in %s :\n' $1 1>&2
861              cp run.log $CDIR"/run.log"              tail $RUNLOG | sed 's/^.*/> &/g' 1>&2
862                cp $RUNLOG $CDIR"/"$RUNLOG
863              return 1              return 1
864          fi          fi
865      )      )
# Line 432  createcodelet() Line 869  createcodelet()
869  {  {
870      # create codelet for comparing model output      # create codelet for comparing model output
871    
872      echo -n "creating the comparison code...  "      printf "creating the comparison code (using CC=$CC)...  "
873      cat > tmp_cmpnum.c <<EOF      cat > tr_cmpnum.c <<EOF
874  #include <stdio.h>  #include <stdio.h>
875  #include <math.h>  #include <math.h>
876  int main( int argc, char** argv )  {  int main( int argc, char** argv )  {
877    int linnum,best,lncnt;    int linnum,cmplin,best,lncnt;
878    double a,b,diff;    double a,b,abave,relerr;
879    best = -16;    best = -22;
880    lncnt = 0;    lncnt = 0;
881    while( 1 & (lncnt+=1) < 999 )  {    while( 1 & ( (lncnt+=1) < 999 ) )  {
882      scanf("%d", &linnum);      scanf("%d", &linnum);
883      if (linnum == -1)  break;      if (linnum == -1)  break;
884      scanf("%lf", &a);  scanf("%lf", &b);      scanf("%lf", &a);  scanf("%lf", &b);
885      diff = 0.5*(fabs(a)+fabs(b));      abave = 0.5*(fabs(a)+fabs(b));
886      if (diff > 1.e-12) {      if ( abave == abave ) {
887        diff=fabs(a-b)/diff;        if (abave > 0.0) {
888        if (diff > 0.0) {          relerr=fabs(a-b)/abave;
889          linnum = (int)log10(diff);          if (relerr > 0.0) { cmplin = (int)rint(log10(relerr)); }
890          best = (best > linnum) ? best : linnum;          else { cmplin = -16 ; }
891        }          best = (best > cmplin) ? best : cmplin; }
892        else {        else { cmplin = -22 ; }
893          if (best == -16 && diff != 0)  best = -22;     /* printf("%d ; %lf ; %lf\n",cmplin,a,b); */
894        }        }
895      }     else {
896       /* printf("%lf ; %lf ; %lf\n",abave,a,b); */
897          break; }
898    }    }
899    if (lncnt == 999) best=-29;    if (lncnt == 999) best=-29;
900      if (linnum != -1) best=-99;
901    printf("%d\n", -best);    printf("%d\n", -best);
902    return 0;    return 0;
903  }  }
904  EOF  EOF
905      cc -o tmp_cmpnum tmp_cmpnum.c -lm      $CC -o tr_cmpnum tr_cmpnum.c -lm
906    
907      if [ -x ./tmp_cmpnum ]; then      if [ -x ./tr_cmpnum ]; then
908          echo "OK"          echo "OK"
909          return 0          return 0
910      else      else
911          echo          echo
912          echo "ERROR: failed to compile comparison code"          echo "ERROR: failed to compile comparison code -- please specify"
913            echo "  a C compiler using the CC environment variable."
914          exit 1          exit 1
915      fi      fi
916  }  }
# Line 481  formatresults() Line 922  formatresults()
922      nm=$1      nm=$1
923      printf '%s %s %s %s' $2 $3 $4 $5      printf '%s %s %s %s' $2 $3 $4 $5
924      shift; shift; shift; shift; shift;      shift; shift; shift; shift; shift;
925      printf '%3s' $@      listPrt=$@
926            listRes=`echo $listPrt | sed 's/>//' | sed 's/<//'`
927      if [ $1 = '--' ]; then      xx=`echo $listPrt | sed 's/.*>//' | sed 's/<.*//' | awk '{print $1}'`
928        printf '%3s' $listPrt
929    #   line below does not work on hp-ux_ia64 : do those substitutions later on
930    #   printf '%3s' $listPrt | sed 's/ 99/ --/g' | sed 's/  > />/' | sed 's/  < /</'
931    
932        if [ $xx = '..' ]; then
933            printf ' N/O '
934        elif [ $xx = '--' ]; then
935            printf ' N/O '
936        elif [ $xx = 99 ]; then
937          printf ' N/O '          printf ' N/O '
938      else      else
939          if [ $1 -gt 12 ]; then          if [ $xx -ge $MATCH_CRIT ]; then
940              printf ' pass'              printf ' pass'
941          else          else
942              printf ' FAIL'              printf ' FAIL'
943          fi          fi
944      fi      fi
945      printf '  %s' $nm      printf '  %s' $nm
946        if test $KIND = 2 ; then
947            #-- apppend taf repport summary:
948            tafrep=`grep -c '^ TAF reports ' $CDIR/summary.txt`
949            if test $tafrep = 1 ; then
950                grep '^ TAF reports ' $CDIR/summary.txt | awk '{printf "  (e=%i, w=%i)",$3,$6}'
951            fi
952        fi
953      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.  
954    
 Normal usage:  
  $0 *       Configure, compile, run and analyze in all experiment directories  
 EOF  
955  }  }
956    
957  scandirs()  scandirs()
958  {  {
959      if [ $# -eq 0 ]; then      if [ $# -eq 1 ]; then
960          for arg in * ; do          for arg in * ; do
961              test -d $arg/input && echo $arg             #test -f $arg/$1 && echo $arg
962          done              test -f $arg/$1 -o -f $arg/$1.gz && echo $arg
963            done
964      else      else
965          echo $*          echo $*
966      fi      fi
967  }  }
968    
969    
970    check_eedata()
971    {
972        # check_eedata eedata size.h
973        if [ $# -eq 2 ] ; then
974         if test -f $1 -a -f $2 ; then
975          nx=`grep "^ *nTx *=" $1 | tail -1 | sed 's/^ *nTx *= *//' | sed "s/, *$//"`
976          sx=`grep "^     & *nSx *=" $2 | sed "s/^     & *nSx *=//" | sed 's/, *$//'`
977          if test "x$nx" = x ; then
978            rx=10
979          else
980            rx=`expr $sx % $nx`
981          fi
982          ny=`grep "^ *nTy *=" $1 | tail -1 | sed 's/^ *nTy *= *//' | sed "s/, *$//"`
983          sy=`grep "^     & *nSy *=" $2 | sed "s/^     & *nSy *=//" | sed 's/, *$//'`
984          if test "x$ny" = x ; then
985            ry=20
986          else
987            ry=`expr $sy % $ny`
988          fi
989          echo `expr $rx + $ry`
990         else
991          echo '-1'
992         fi
993        elif [ $# -eq 1 ] ; then
994         if test -f $1 ; then
995          nx=`grep "^ *nTx *=" $1 | tail -1 | sed 's/^ *nTx *= *//' | sed "s/, *$//"`
996          if test "x$nx" = x ; then nx=1 ; fi
997          ny=`grep "^ *nTy *=" $1 | tail -1 | sed 's/^ *nTy *= *//' | sed "s/, *$//"`
998          if test "x$ny" = x ; then ny=1 ; fi
999         #echo $nx $ny
1000          echo $nx
1001         else
1002          echo '-1'
1003         fi
1004        else
1005          echo '-2'
1006        fi
1007    
1008    }
1009    
1010  ###############################################################################  ###############################################################################
1011    
1012    
1013  #  Default properties  #  Default properties
1014  debug=0  debug=0
1015  verbose=1  verbose=1
1016  clean=0  NBLINES_MKLOG=16000
 expts=''  
 # ieee=1  
   
 IEEE=  
 if test "x$MITGCM_IEEE" != x ; then  
     IEEE=$MITGCM_IEEE  
 fi  
1017    
1018    OptLev=1
1019    GSL=f
1020    
1021  CLEANUP=f  CLEANUP=f
1022    NORUN=f
1023  QUICK=f  QUICK=f
1024    NOMAKE=f
1025  NOGENMAKE=f  NOGENMAKE=f
1026  NOCLEAN=f  NOCLEAN=f
1027  NODEPEND=f  NODEPEND=f
1028    POSTCLEAN=0
1029    
1030  BASH=  BASH=
1031  OPTFILE=NONE  OPTFILE=NONE
1032  ADDRESSES=  ADDRESSES=
1033  TESTDIRS=  TESTDIRS=
1034    SKIPDIRS=
1035  MPACKDIR="../tools/mpack-1.6"  MPACKDIR="../tools/mpack-1.6"
1036  HAVE_MPACK=  HAVE_MPACK=
1037  MPACK="$MPACKDIR/mpack"  MPACK=
1038    SENDCMD=
1039    SAVDIR='.'
1040  COMMAND=  COMMAND=
1041  MAKE=make  MKDEPEND=
1042  MPI=f  if test "x$MAKE" = x ; then
1043        MAKE=make
1044    fi
1045    REPLMAKE=
1046    if test "x$CC" = x ; then
1047        CC=cc
1048    fi
1049    JOBS=
1050    TARG=
1051    MPI=0
1052    MPI_MFILE=
1053    MULTI_THREAD=f
1054    OUTDIR=
1055    DELDIR=
1056    USE_R4=
1057    EXTRFLG=
1058    
1059    #- type of testing (KIND):
1060    #   KIND=0 : forward (= default) ;  KIND=1 : Tangent Linear with TAF ;
1061    #   KIND=2 : Adjoint with TAF ;     KIND=4 : Adjoint with OpenAD
1062    KIND=0
1063    
1064    # list of pTracers to check for monitor output
1065    PTRACERS_NUM="1 2 3 4 5"
1066    
1067  ADM=  MATCH_CRIT=10
1068    
1069  echo -n "parsing options...  "  printf "parsing options...  "
1070    
1071  ac_prev=  ac_prev=
1072  for ac_option ; do  for ac_option ; do
# Line 576  for ac_option ; do Line 1079  for ac_option ; do
1079      fi      fi
1080    
1081      ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`      ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
1082        
1083      case $ac_option in      case $ac_option in
1084                    
1085          -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 ;;  
1086    
1087          -mpi) MPI=t ;;          -optfile | --optfile | -of | --of) ac_prev=OPTFILE ;;
1088            -optfile=* | --optfile=* | -of=* | --of=*) OPTFILE=$ac_optarg ;;
1089    
1090          -adm | -ad) ADM=t ;;          -addr | --addr | -a | --a) ac_prev=ADDRESSES ;;
1091            -addr=* | --addr=* | -a=* | --a=*) ADDRESSES=$ac_optarg ;;
1092          -ieee) IEEE=true ;;          -mpackdir | --mpackdir | -mpd | --mpd) ac_prev=MPACKDIR ;;
1093          -noieee) IEEE= ;;          -mpackdir=* | --mpackdir=* | -mpd=* | --mpd=*) MPACKDIR=$ac_optarg ;;
1094    
1095            -send | --send ) ac_prev=SENDCMD ;;
1096            -send=* | --send=* ) SENDCMD=$ac_optarg ;;
1097            -savdir | --savdir | -sd | --sd ) ac_prev=SAVDIR ;;
1098            -savdir=* | --savdir=* | -sd=* | --sd=* ) SAVDIR=$ac_optarg ;;
1099    
1100            -tdir | --tdir | -t | --t) ac_prev=TESTDIRS ;;
1101            -tdir=* | --tdir=* | -t=* | --t=*) TESTDIRS=$ac_optarg ;;
1102            -skipdir | --skipdir | -skd | --skd) ac_prev=SKIPDIRS ;;
1103            -skipdir=* | --skipdir=* | -skd=* | --skd=*) SKIPDIRS=$ac_optarg ;;
1104    
1105            -bash | --bash | -b | --b) ac_prev=BASH ;;
1106            -bash=* | --bash=* | -b=* | --b=*) BASH=$ac_optarg ;;
1107    
1108            -command | --command | -c | --c) ac_prev=COMMAND ;;
1109            -command=* | --command=* | -c=* | --c=*) COMMAND=$ac_optarg ;;
1110    
1111            -makedepend | --makedepend | -md | --md) ac_prev=MKDEPEND ;;
1112            -makedepend=* | --makedepend=* | -md=* | --md=*) MKDEPEND=$ac_optarg ;;
1113    
1114            -make | --make | -m | --m) ac_prev=MAKE ;;
1115            -make=* | --make=* | -m=* | --m=*) MAKE=$ac_optarg ;;
1116    
1117            -repl_mk | --repl_mk ) ac_prev=REPLMAKE ;;
1118            -repl_mk=* | --repl_mk=*) REPLMAKE=$ac_optarg ;;
1119    
1120            -odir | --odir) ac_prev=OUTDIR ;;
1121            -odir=* | --odir=*) OUTDIR=$ac_optarg ;;
1122    
1123            -ptracers | --ptracers | -ptr | --ptr) ac_prev=PTRACERS_NUM ;;
1124            -ptracers=* | --ptracers=* | -ptr=* | --ptr=*) PTRACERS_NUM=$ac_optarg ;;
1125    
1126            -match | --match ) ac_prev=MATCH_CRIT ;;
1127            -match=* | --match=* ) MATCH_CRIT=$ac_optarg ;;
1128    
1129            -j | --j) ac_prev=JOBS ;;
1130            -j=* | --j=*) JOBS=$ac_optarg ;;
1131    
1132            -ef | --ef) ac_prev=EXTRFLG ;;
1133            -ef=* | --ef=*) EXTRFLG=$ac_optarg ;;
1134    
1135            -clean | --clean) CLEANUP=t ; DELDIR=t ;;
1136    
1137            -norun | --norun | -nr | --nr) NORUN=t ;;
1138            -obj | --obj ) TARG='obj' ; NORUN=t ;;
1139            -runonly | --runonly | -ro | --ro) QUICK=t ; NOMAKE=t ;;
1140            -quick | --quick | -q | --q) QUICK=t ;;
1141            -nogenmake | --nogenmake | -ng | --ng) NOGENMAKE=t ;;
1142            -noclean | --noclean | -nc | --nc) NOCLEAN=t ;;
1143            -nodepend | --nodepend | -nd | --nd) NODEPEND=t ;;
1144    
1145            -postclean | --postclean | -pc | --pc) POSTCLEAN=2 ;;
1146            -deloutp | --deloutp | -do | --do) POSTCLEAN=1 ;;
1147    
1148            -mpi | --mpi) MPI=2 ;;
1149            -MPI | --MPI) ac_prev=MPI ;;
1150            -MPI=* | --MPI=*) MPI=$ac_optarg ;;
1151    
1152            -mfile | --mfile | -mf | --mf) ac_prev=MPI_MFILE ;;
1153            -mfile=* | --mfile=* | -mf=* | --mf=*) MPI_MFILE=$ac_optarg ;;
1154    
1155            -mth) MULTI_THREAD=t ;;
1156    
1157            -tlm) if test $KIND = 0 ; then KIND=1 ; else
1158                    echo "Error: '-tlm', '-adm' and '-oad' are exclusive" ; usage
1159                  fi ;;
1160            -adm | -ad) if test $KIND = 0 ; then KIND=2 ; else
1161                    echo "Error: '-tlm', '-adm' and '-oad' are exclusive" ; usage
1162                  fi ;;
1163            -oad) if test $KIND = 0 ; then KIND=4 ; NODEPEND=t ; else
1164                    echo "Error: '-tlm', '-adm' and '-oad' are exclusive" ; usage
1165                  fi ;;
1166    
1167            -ieee)   echo "Warning: ignore option '-ieee' (already the default)"
1168                     printf " ... " ;;
1169            -noieee) echo "Warning: will use option '-fast' instead of '-noieee' (obsolete)"
1170                     printf " ... " ; OptLev=`expr $OptLev \* 2` ;;
1171            -fast)  OptLev=`expr $OptLev \* 2` ;;
1172            -devel) OptLev=0 ;;
1173            -gsl) GSL=t ;;
1174    
1175          -verbose) verbose=2 ;;          -verbose) verbose=2 ;;
1176          -debug) debug=1 ;;          -debug) debug=1 ;;
1177          -quiet) verbose=0 ;;          -quiet) verbose=0 ;;
1178    
1179          -*)          -deldir | -dd) DELDIR=t ;;
1180              echo "Error: unrecognized option: "$ac_option  
1181              usage          -use_r4|-ur4) USE_R4=t ;;
1182              ;;  
1183                    -ts) TS=t;;
1184          *)          -papis) PAPIS=t;;
1185              echo "Error: unrecognized argument: "$ac_option          -pcls) PCL=t;;
1186              usage  
1187              ;;          -*) echo "Error: unrecognized option: "$ac_option
1188                        usage ;;
1189            *)  echo "Error: unrecognized argument: "$ac_option
1190                usage ;;
1191    
1192       esac       esac
1193        
1194  done  done
1195    
1196  if test "x$QUICK" = xt ; then  if test "x$QUICK" = xt ; then
# Line 655  if test "x$QUICK" = xt ; then Line 1199  if test "x$QUICK" = xt ; then
1199      NODEPEND=t      NODEPEND=t
1200  fi  fi
1201    
1202    #- check length of MPI machine file:
1203    if test "x$MPI" != x0 -a "x$MPI_MFILE" != x ; then
1204        if test -r $MPI_MFILE ; then
1205            nl=`wc -l $MPI_MFILE | awk '{print $1}'`
1206            if [ $nl -lt $MPI ] ; then
1207              echo "Error: need at least $MPI nodes (currently only $nl) in MPI_MFILE=$MPI_FILE"
1208              usage
1209            fi
1210            if [ $verbose -gt 1 ]; then
1211                echo " MPI_MFILE=$MPI_MFILE : $nl procs for MPI=$MPI run"
1212            fi
1213        else
1214              echo "Error: cannot access MPI_MFILE=$MPI_FILE"
1215              usage
1216        fi
1217    fi
1218    
1219    #- setting for forward or ADM testing
1220    if test $KIND = 1 ; then
1221        TARG=ftlall
1222        code_dir=code_ad
1223        inputdir=input_ad
1224        ref_outp="output_tlm.txt"
1225        EXECUTABLE="mitgcmuv_ftl"
1226    elif test $KIND = 2 ; then
1227        if test "x$TARG" = xobj ; then TARG=adobj ; else TARG=adall ; fi
1228        code_dir=code_ad
1229        inputdir=input_ad
1230        ref_outp="output_adm.txt"
1231        EXECUTABLE="mitgcmuv_ad"
1232    elif test $KIND = 4 ; then
1233        TARG=adAll
1234        code_dir=code_oad
1235        inputdir=input_oad
1236        ref_outp="output_oadm.txt"
1237        EXECUTABLE="mitgcmuv_ad"
1238    else
1239        if test "x$JOBS" != x ; then TARG="-j $JOBS $TARG" ; fi
1240        code_dir=code
1241        inputdir=input
1242        ref_outp="output.txt"
1243        EXECUTABLE="mitgcmuv"
1244    fi
1245    
1246    xx=`echo $TESTDIRS | awk '{print $1}'`
1247  if test "x$TESTDIRS" = x ; then  if test "x$TESTDIRS" = x ; then
1248      TESTDIRS=`scandirs`      LIST=`scandirs results/$ref_outp`
1249    elif test $xx = 'start_from' ; then
1250        xx=`echo $TESTDIRS | awk '{print $2}'`
1251        LIST=`scandirs results/$ref_outp | sed -n "/$xx/,$ p"`
1252    else
1253        #- expand group of experiments:
1254        LIST=" "
1255        for xx in $TESTDIRS
1256        do
1257          case $xx in
1258            'basic') LIST=${LIST}" aim.5l_cs hs94.128x64x5 ideal_2D_oce"
1259                     LIST=${LIST}" lab_sea tutorial_baroclinic_gyre"
1260                     LIST=${LIST}" tutorial_global_oce_latlon tutorial_plume_on_slope"
1261                    ;;
1262            'tutorials')
1263                     LIST=${LIST}" "`ls | grep 'tutorial_'` ;;
1264            *)       LIST=${LIST}" "$xx ;;
1265          esac
1266        done
1267  fi  fi
1268    #echo 'LIST='${LIST}'<'
1269    #- skip dirs, remove duplicate and non-directory:
1270    TESTDIRS=" "
1271    count=0
1272    for xx in $LIST
1273    do
1274        yy=`echo $SKIPDIRS | grep -c $xx`
1275        if test $yy = 0 ; then
1276            if test -d $xx ; then
1277                yy=`echo $TESTDIRS | grep -c $xx`
1278                if test $yy = 0 ; then TESTDIRS=${TESTDIRS}" "$xx ; fi
1279            else count=1 ;
1280                echo ""; echo -n " -- skip \"$xx\" (not a directory !)"
1281            fi
1282        else
1283            if test $count = 1 ; then echo -n ", \"$xx\""
1284            else count=1 ; echo "" ;  echo -n " skip: \"$xx\""
1285            fi
1286        fi
1287    done
1288    if test $count = 1 ; then echo "" ; echo -n " ... " ; fi
1289    #echo 'TESTDIRS='${TESTDIRS}'<'
1290    
1291  if test "x$OPTFILE" = xNONE -a "x$MITGCM_OF" != x ; then  if test "x$OPTFILE" = xNONE -a "x$MITGCM_OF" != x ; then
1292      OPTFILE=$MITGCM_OF      OPTFILE=$MITGCM_OF
1293  fi  fi
1294    
1295  if test "x$ADM" = xt -a "x$COMMAND" = x ; then  LOC_MFILE='tr_mpi_mfile'
1296      COMMAND="./mitgcmuv_ad > output.txt_adm 2>&1"  RUNLOG="run.tr_log"
1297    if test "x$MPI" = x0 ; then
1298      OUTPUTFILE=$ref_outp
1299      if test "x$COMMAND" = x ; then COMMAND="./$EXECUTABLE > $OUTPUTFILE" ; fi
1300    else
1301      OUTPUTFILE="STDOUT.0000"
1302      if test "x$COMMAND" = x ; then COMMAND="mpirun -v -np TR_NPROC ./$EXECUTABLE" ; fi
1303  fi  fi
1304    
1305  if test "x$COMMAND" = x ; then  echo "OK (COMMAND='$COMMAND')"
     COMMAND="make output.txt"  
 fi  
1306    
1307  echo "OK"  TMP=./tr_$$
1308    #- try to put temporary files in system-local /tmp dir
1309    #TMP=/tmp/tr_$$
1310    #touch $TMP ; retVal=$?
1311    #if [ $retVal -eq 0 ] ; then
1312    #  if test ! -r $TMP ; then TMP=./tr_$$ ; fi
1313    #else
1314    #  TMP=./tr_$$
1315    #fi
1316    #rm -f $TMP
1317    #if [ $verbose -gt 1 ]; then echo " temp files: $TMP" ; fi
1318    
1319    # set the Default List of output variables to be checked:
1320    #  (use default or load experiment-specific list from file "tr_checklist")
1321    # content : 1rst = main variable used to decide if it pass or FAIL
1322    #         others = number of matching digits to be printed in summary.txt
1323    if test $KIND = 1 ; then
1324        DEF_CHECK_LIST='tlmGrd tlmCst tlmGrd fwdGrd'
1325        EMPTY_RESULTS='.. .. ..'
1326        LEN_CHECK_LIST=`echo $DEF_CHECK_LIST | sed 's/ [a-zA-Z0-9]*+/&mn &mx &av &sd/g' | awk '{print NF-1}'`
1327    elif test $KIND = 2 -o $KIND = 4 ; then
1328        DEF_CHECK_LIST='AdGrd Cost AdGrd FDGrd'
1329        EMPTY_RESULTS='.. .. ..'
1330        LEN_CHECK_LIST=`echo $DEF_CHECK_LIST | sed 's/ [a-zA-Z0-9]*+/&mn &mx &av &sd/g' | awk '{print NF-1}'`
1331    else
1332        DEF_CHECK_LIST='PS PS T+ S+ U+ V+ pt1+ pt2+ pt3+ pt4+ pt5+'
1333        EMPTY_RESULTS='.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..'
1334        LEN_CHECK_LIST=`echo $DEF_CHECK_LIST | sed 's/ [a-zA-Z0-9]*+/&mn &mx &av &sd/g' | awk '{print NF-1}'`
1335        ii=`echo $EMPTY_RESULTS | awk '{print NF}'`
1336        EMPTY_RESULTS=$EMPTY_RESULTS`expr $LEN_CHECK_LIST - $ii | awk 'BEGIN{FS=":"}{for(i=1;i<=$1;i++){printf "  ."}}'`
1337    fi
1338    
1339  #  create the FORTRAN comparison code  #  create the FORTRAN comparison code
1340  createcodelet  if test "x$CLEANUP" = xt -o -x tr_cmpnum ; then
1341        echo "skipping comparison code build"
1342    else
1343        createcodelet
1344    fi
1345    
1346  #  build the mpack utility  #  build the mpack utility (if ADDRESSES = NONE, do it to test the build)
1347  if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then  if test "x$ADDRESSES" = x -o "x$SENDCMD" != x ; then
1348      echo "skipping mpack build"      echo "skipping mpack build"
1349  else  else
1350      build_mpack      build_mpack
1351        if test "x$HAVE_MPACK" = xt ; then SENDCMD=$MPACK ; fi
1352  fi  fi
1353    
1354  #  Create a uniquely named directory to store results  #  Create a uniquely named directory to store results
1355    CMDLINE=$0
1356    for xx in "$@" ; do nw=`echo $xx | wc -w`
1357        if test $nw = '1' ; then CMDLINE="$CMDLINE $xx" ; else
1358          nb=`echo $xx | grep -c '='`
1359          if test $nb = 0 ; then CMDLINE="$CMDLINE '$xx'"
1360          else yy=`echo "$xx'" | sed "s/=/='/"` ;
1361                                 CMDLINE="$CMDLINE $yy" ; fi
1362        fi
1363    done
1364    #for xx in "$@" ; do CMDLINE="$CMDLINE '$xx'" ; done
1365  MACH=`hostname`  MACH=`hostname`
1366  UNAMEA=`uname -a`  UNAMEA=`uname -a`
1367  DATE=`date +%Y%m%d`  DATE=`date +%Y%m%d`
1368  BASE="tr_"$MACH"_"$DATE"_"  BASE="tr_"$MACH"_"$DATE"_"
1369    if test "x$OUTDIR" != x ; then
1370        BASE="tr_"$OUTDIR"_"$DATE"_"
1371    else
1372        short_name=`hostname | sed 's/\..*$//'`
1373        BASE="tr_"$short_name"_"$DATE"_"
1374    fi
1375  DNUM=0  DNUM=0
1376  DRESULTS="$BASE$DNUM"  DRESULTS="$BASE$DNUM"
1377  while test -e $DRESULTS ; do  while test -e $DRESULTS ; do
# Line 701  if test "x$RETVAL" != x0 ; then Line 1385  if test "x$RETVAL" != x0 ; then
1385      exit 1      exit 1
1386  fi  fi
1387  SUMMARY="$DRESULTS/summary.txt"  SUMMARY="$DRESULTS/summary.txt"
 echo -n "Start time:  " >> $SUMMARY  
1388  start_date=`date`  start_date=`date`
1389  echo $start_date > $SUMMARY  echo $start_date > $SUMMARY
1390    echo 'run:' $CMDLINE >> $SUMMARY
1391    echo 'on :' $UNAMEA  >> $SUMMARY
1392    
1393  of_path=  of_path=
1394  if test "x$OPTFILE" != xNONE ; then  if test "x$OPTFILE" != xNONE ; then
# Line 721  if test "x$OPTFILE" != xNONE ; then Line 1406  if test "x$OPTFILE" != xNONE ; then
1406          echo >> $SUMMARY          echo >> $SUMMARY
1407          echo "  OPTFILE=$OPTFILE" >> $SUMMARY          echo "  OPTFILE=$OPTFILE" >> $SUMMARY
1408      else      else
1409          echo | tee $SUMMARY          echo | tee -a $SUMMARY
1410          echo "ERROR: can't read OPTFILE=\"$OPTFILE\"" | tee $SUMMARY          echo "ERROR: can't read OPTFILE=\"$OPTFILE\"" | tee -a $SUMMARY
1411          exit 1          exit 1
1412      fi      fi
1413  else  else
1414      echo >> $SUMMARY      echo >> $SUMMARY
1415      echo "No \"OPTFILE\" was explicitly specified by testreport," >> $SUMMARY      echo "No \"OPTFILE\" was specified ; genmake2 found and uses:" >> $SUMMARY
1416      echo "   so the genmake default will be used." >> $SUMMARY      #-note: to be filled later after 1rst run
1417  fi  fi
1418  echo  echo
1419  echo >> $SUMMARY  echo >> $SUMMARY
1420  if test "x$ADM" = x ; then  if test $KIND = 0 ; then
1421      cat << EOF | tee -a $SUMMARY      line_0=`printf '%s %2i' 'default' $MATCH_CRIT`
1422                  T           S           U           V         line_0="$line_0  ----T-----  ----S-----  ----U-----  ----V-----"
1423  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"
1424  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  ."
1425  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"
1426  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  ."
1427        for ii in $PTRACERS_NUM ; do
1428  EOF          line_0="$line_0  --PTR 0"$ii"--"
1429            line_1="$line_1        m  s"
1430            line_2="$line_2  m  m  e  ."
1431            line_3="$line_3  i  a  a  d"
1432            line_4="$line_4  n  x  n  ."
1433        done
1434  else  else
1435      echo "ADJOINT=true" >> $SUMMARY      line_0=`printf '%s %2i' 'default   ' $MATCH_CRIT`
1436      if test $KIND = 1 ; then
1437       #echo "TANGLIN=true" >> $SUMMARY
1438        echo "TangLin generated by TAF" >> $SUMMARY
1439      elif test $KIND = 3 ; then
1440        echo "TangLin generated by OpenAD" >> $SUMMARY
1441      elif test $KIND = 2 ; then
1442       #echo "ADJOINT=true" >> $SUMMARY
1443        echo "Adjoint generated by TAF" >> $SUMMARY
1444      else
1445        echo "Adjoint generated by OpenAD" >> $SUMMARY
1446      fi
1447      if test $KIND = 1 -o $KIND = 3 ; then
1448        line_1="G D M    C  T  F"
1449        line_2="e p a R  o  L  D"
1450      else
1451        line_1="G D M    C  A  F"
1452        line_2="e p a R  o  d  D"
1453      fi
1454        line_3="n n k u  s  G  G"
1455        line_4="2 d e n  t  r  r"
1456      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  
1457  fi  fi
1458    if test "x$CLEANUP" != xt ; then
1459        echo "$line_0" | tee -a $SUMMARY
1460        echo "$line_1" | tee -a $SUMMARY
1461        echo "$line_2" | tee -a $SUMMARY
1462        echo "$line_3" | tee -a $SUMMARY
1463        echo "$line_4" | tee -a $SUMMARY
1464        echo ""        | tee -a $SUMMARY
1465    fi
1466    echo "-------------------------------------------------------------------------------"
1467    
1468  #  ...and each test directory...  #  ...and each test directory...
1469  for dir in $TESTDIRS ; do  for dir in $TESTDIRS ; do
1470        
1471        # set builddir & rundir:
1472        builddir="build"
1473        if test ! -d $dir/$builddir ; then mkdir $dir/$builddir ; fi
1474        rundir="run"
1475        pfxdir="tr_$rundir"
1476        if test ! -d $dir/$rundir ; then
1477            rundir=$builddir
1478        fi
1479        CODE_DIR=$dir/$code_dir
1480        BUILD_DIR=$dir/$builddir
1481    
1482      #  Cleanup only!      #  Cleanup only!
1483      if test "x$CLEANUP" = xt ; then      if test "x$CLEANUP" = xt ; then
1484          if test -r $dir/build/Makefile ; then          echo -n '  --- dir:' $BUILD_DIR ': '
1485              ( cd $dir/build ; make CLEAN )          makeclean $BUILD_DIR
1486            (   cd $BUILD_DIR
1487                rm -f $EXECUTABLE *.bak
1488                rm -f genmake_state genmake_*optfile genmake.log
1489                rm -f SIZE.h.mpi genmake.tr_log make.tr_log
1490                rm -rf mpi_headers
1491            )
1492            if test -d $dir/$rundir/CVS ; then
1493                echo -n '  --- dir:' $dir/$rundir ': '
1494                run_clean $dir/$rundir
1495          fi          fi
1496          if test -r $dir/input/Makefile ; then          trdir=`( cd $dir ; find . -type d -name "$pfxdir.*" -print | sed 's/^.\///')`
1497              ( cd $dir/input ; make CLEAN )          ttd=`echo $trdir | wc -w`
1498            if test $ttd != 0 ; then
1499                echo '  --- rm dir:' $trdir
1500                ( cd $dir ; rm -rf $trdir )
1501          fi          fi
1502          continue          continue
1503      fi      fi
1504    
1505      #  Verify that the testdir exists and contains previous      #  Verify that the testdir exists and contains previous
1506      #  results in the correct location--or skip this directory!      #  results in the correct location--or skip this directory!
1507      fout=      fout=$dir"/results/"$ref_outp
1508      if test "x$ADM" = x ; then     #if test ! -r $fout ; then
1509          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  
1510          echo "can't read \"$fout\" -- skipping $dir"          echo "can't read \"$fout\" -- skipping $dir"
1511          continue          continue
1512      fi      fi
1513    
1514      builddir="input"      # Check for specific files for particular type of run
     rundir="input"  
     use_seperate_build=0  
     if test -d $dir/build -a -r $dir/build ; then  
         builddir="build"  
         rundir="build"  
         use_seperate_build=1  
         linkdata $use_seperate_build $dir/$rundir  
     fi  
       
     if test "x$ADM" = x ; then  
         code_dir=code  
         CODE_DIR=$dir/code  
     else  
         code_dir=code_ad  
         CODE_DIR=$dir/code_ad  
     fi  
     BUILD_DIR=$dir/$builddir  
1515    
1516      if test ! -r $CODE_DIR"/SIZE.h_mpi" -a "x$MPI" = "xt" ; then      if test ! -r $CODE_DIR"/SIZE.h_mpi"  -a "x$MPI" != "x0" ; then
1517          echo "can't find \"$CODE_DIR/SIZE.h_mpi\" -- skipping $dir"          echo "can't find \"$CODE_DIR/SIZE.h_mpi\" -- skipping $dir"
1518          continue          continue
1519      fi      fi
1520        if test ! -r $dir"/input/eedata.mth" -a "x$MULTI_THREAD" = "xt" ; then
1521            echo "can't find \"$dir/input/eedata.mth\" -- skipping $dir"
1522            continue
1523        fi
1524    
1525        if test "x$MPI" != "x0" ; then
1526            ntx=1 ; nty=1
1527            if test "x$MULTI_THREAD" = "xt" ; then
1528              ff=$dir"/input/eedata.mth"
1529              ntx=`grep "^ *nTx *=" $ff | tail -1 | sed 's/^ *nTx *= *//' | sed "s/, *$//"`
1530              nty=`grep "^ *nTy *=" $ff | tail -1 | sed 's/^ *nTy *= *//' | sed "s/, *$//"`
1531              if test "x$ntx" = x ; then ntx=1 ; fi
1532              if test "x$nty" = x ; then nty=1 ; fi
1533            fi
1534            #- create new SIZE.h with no more than '$MPI' Procs
1535            mk_mpi_size $CODE_DIR"/SIZE.h_mpi" $BUILD_DIR"/tr_size.mpi" $MPI $ntx $nty
1536            LOC_NPROC=$?
1537            (   cd $BUILD_DIR
1538                if test -r SIZE.h.mpi ; then
1539                    cmp tr_size.mpi SIZE.h.mpi > /dev/null 2>&1 ; RETVAL=$?
1540                else RETVAL=1
1541                fi
1542                if test "x$RETVAL" = x0 ; then
1543                    rm -f tr_size.mpi
1544                else
1545                    rm -f SIZE.h.mpi ; mv tr_size.mpi SIZE.h.mpi
1546                fi
1547            )
1548            if test "x$MPI_MFILE" != x ; then
1549                #- create new MPI machine-file with the right number of Procs
1550                rm -f $LOC_MFILE
1551                cat $MPI_MFILE | sort | uniq | head -$LOC_NPROC > $LOC_MFILE
1552                nl=`wc -l $LOC_MFILE | awk '{print $1}'`
1553                if [ $nl -lt $LOC_NPROC ] ; then
1554                    rm -f $LOC_MFILE
1555                    cat $MPI_MFILE | head -$LOC_NPROC > $LOC_MFILE
1556                    #sed -n "1,$LOC_NPROC p" $MPI_MFILE > $LOC_MFILE
1557                fi
1558                if [ $verbose -gt 1 ]; then
1559                    nl=`wc -l $LOC_MFILE | awk '{print $1}'`
1560                    echo " new LOC_MFILE=$LOC_MFILE : $nl procs for LOC_NPROC=$LOC_NPROC"
1561                fi
1562            fi
1563            if test "x$MULTI_THREAD" = "xt" ; then
1564                retv=`check_eedata $dir"/input/eedata.mth" $BUILD_DIR"/SIZE.h.mpi"`
1565                if test $retv != 0 ; then
1566                    echo "input/eedata.mth tiling misfit -- skipping $dir"
1567                    continue
1568                fi
1569            fi
1570        fi
1571    
1572        #  Check whether there are "extra runs" for this testdir
1573        extra_runs=
1574        if test "x$NORUN" = xf ; then
1575            ex_run_dirs=`( cd $dir ; ls -d $inputdir.* 2> /dev/null )`
1576        fi
1577        #echo "ex_run_dirs='$ex_run_dirs'"
1578        for exd in $ex_run_dirs ; do
1579            name=`echo $exd | sed -e "s/$inputdir\.//"`
1580            refExOut=`echo $ref_outp | sed "s/\./.${name}./"`
1581            outf="$dir/results/$refExOut"
1582            if test -r $outf -o -r ${outf}.gz ; then
1583              if test "x$MULTI_THREAD" = "xt" ; then
1584                if test -r $dir"/"$exd"/eedata.mth" ; then
1585                  if test "x$MPI" = "x0" ; then
1586                    extra_runs="$extra_runs $name"
1587                  else
1588                    retv=`check_eedata $dir"/"$exd"/eedata.mth" $BUILD_DIR"/SIZE.h.mpi"`
1589                    if test $retv = 0 ; then
1590                        extra_runs="$extra_runs $name"
1591                    else
1592                        echo $exd"/eedata.mth tiling misfit -- skipping $dir"
1593                    fi
1594                  fi
1595                #else echo $dir"/"$exd"/eedata.mth: not found"
1596                fi
1597              else
1598                extra_runs="$extra_runs $name"
1599              fi
1600            fi
1601        done
1602    
     echo "-------------------------------------------------------------------------------"  
1603      echo      echo
1604      echo "Experiment:  $dir"      if test "x$extra_runs" = "x" ; then
1605            echo "Experiment:  $dir"
1606        else
1607            echo "Experiment:  $dir ; extra_runs=$extra_runs"
1608        fi
1609      echo      echo
1610      unset genmake makedepend make run      unset genmake makedepend make run
1611      results='-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --'      results=$EMPTY_RESULTS
1612    
1613      #  Create an output dir for each OPTFILE/tdir combination      #  Create an output dir & summary.txt file for each tested experiment (tdir)
1614      rel_CDIR=$DRESULTS"/"$dir      locDIR=$DRESULTS"/"$dir
1615      mkdir $rel_CDIR      mkdir $locDIR
1616      CDIR=`pwd`"/$rel_CDIR"      #- report to this experiment local summary file ---
1617            echo "DATE='$DATE' ; tdir='$dir'" > $locDIR"/summary.txt"
1618      if test "x$CLEANUP" = xt ; then      echo "MACH='$MACH'" >> $locDIR"/summary.txt"
1619          makeclean $dir/$builddir      echo "UNAMEA='$UNAMEA'" >> $locDIR"/summary.txt"
1620        CDIR=`pwd`"/$locDIR"
1621    
1622        if test "x$NORUN" = xt ; then
1623                run=N
1624            genmakemodel $dir/$builddir && genmake=Y \
1625                && makeclean $dir/$builddir \
1626                && symlink_mpifiles $dir $code_dir $builddir \
1627                && makedependmodel $dir/$builddir && makedepend=Y \
1628                && makemodel $dir/$builddir && make=Y
1629      else      else
1630          genmakemodel $dir/$builddir && genmake=Y \          genmakemodel $dir/$builddir && genmake=Y \
1631              && makeclean $dir/$builddir \              && makeclean $dir/$builddir \
1632              && symlink_mpifiles $dir $code_dir $builddir \              && symlink_mpifiles $dir $code_dir $builddir \
1633              && makedependmodel $dir/$builddir && makedepend=Y \              && makedependmodel $dir/$builddir && makedepend=Y \
1634              && makemodel $dir/$builddir && make=Y \              && makemodel $dir/$builddir && make=Y \
1635              && linkdata $use_seperate_build $dir/$rundir \              && run_clean $dir/$rundir \
1636                && linkdata $dir/$rundir $inputdir \
1637              && runmodel $dir/$rundir && run=Y \              && runmodel $dir/$rundir && run=Y \
1638              && results=`testoutput $dir $rundir`              && results=`testoutput_run $dir $rundir $ref_outp`
1639      fi      fi
1640            #echo "results='$results'"
1641      echo  
     if test "x$ADM" = x ; then  
1642          fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`          fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1643      else          echo 1>&2
1644          fres=`printf '%s %s %s %s' ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N}`          echo "$fres" | sed 's/ 99/ --/g' | sed 's/  > />/' | sed 's/  < /</' >> $SUMMARY
1645          fres=$fres"$results   $dir"          echo "fresults='$fres'" | sed 's/ 99/ --/g' >> $locDIR"/summary.txt"
1646    
1647            for ex in $extra_runs ; do
1648                unset run
1649                results=$EMPTY_RESULTS
1650                #  reference output file
1651                refExOut=`echo $ref_outp | sed "s/\./.${ex}./g"`
1652                #  Create an output dir & summary.txt file for each extra run (tdir.ex)
1653                locDIR=$DRESULTS"/"$dir"."$ex
1654                mkdir $locDIR
1655                #- report to this experiment local summary file ---
1656                echo "DATE='$DATE' ; tdir='$dir.$ex'" > $locDIR"/summary.txt"
1657                #echo "MACH='$MACH'" >> $locDIR"/summary.txt"
1658                #echo "UNAMEA='$UNAMEA'" >> $locDIR"/summary.txt"
1659                CDIR=`pwd`"/$locDIR"
1660                test ! -e "$dir/$pfxdir.$ex" && mkdir "$dir/$pfxdir.$ex"
1661                run_clean $dir/$pfxdir.$ex
1662                linkdata $dir/$pfxdir.$ex $inputdir.$ex $inputdir
1663                runmodel $dir/$pfxdir.$ex && run=Y \
1664                && results=`testoutput_run $dir $pfxdir.$ex $refExOut`
1665                fres=`formatresults $dir.$ex ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1666                echo 1>&2
1667                echo "$fres" | sed 's/ 99/ --/g' | sed 's/  > />/' | sed 's/  < /</' >> $SUMMARY
1668                echo "fresults='$fres'" | sed 's/ 99/ --/g' >> $locDIR"/summary.txt"
1669                if test "x$POSTCLEAN" = x2 ; then
1670                    run_clean $dir/$pfxdir.$ex
1671                fi
1672            done
1673    
1674        if test ! -f $DRESULTS"/"genmake_state ; then
1675            if test -f $dir/$builddir/Makefile ; then
1676                mkOpt=`grep '^# OPTFILE=' $dir/$builddir/Makefile 2>/dev/null | head -1 | sed 's/^# //'`
1677                echo "from '$dir/$builddir/Makefile', extract:" > $DRESULTS/genmake_state
1678                sed -n '/^# executed by:/,+1 p' $dir/$builddir/Makefile >> $DRESULTS/genmake_state
1679                echo " $mkOpt" >> $DRESULTS/genmake_state
1680                if test "x$OPTFILE" = xNONE ; then
1681                    eval $mkOpt
1682                    sed "/^No \"OPTFILE\" was specified ; genmake2/a\  OPTFILE=${OPTFILE}"\
1683                            $SUMMARY > tmp.tr_log
1684                    RETVAL=$?
1685                    if test "x$RETVAL" = x0 ; then
1686                        cp -f tmp.tr_log $SUMMARY
1687                    fi
1688                    rm -f tmp.tr_log
1689                fi
1690                gmkLog=$dir/$builddir/genmake.log
1691                if test -r $gmkLog ; then
1692                    grep '^Get compiler version using:' $gmkLog > /dev/null 2>&1
1693                    RETVAL=$?
1694                    if test "x$RETVAL" = x0 ; then
1695                      echo -n "from '$gmkLog', " >> $DRESULTS/genmake_state
1696                      echo "extract compiler version:"   >> $DRESULTS/genmake_state
1697                      sed -n '/Get compiler version/,/<-- compiler version/p' \
1698                         $gmkLog | grep -v '^... compiler version ' > tmp.tr_log
1699                      sed -n '1p' tmp.tr_log >> $DRESULTS/genmake_state
1700                      sed -n '2,/^$/p' tmp.tr_log | sed '/^$/d' | sed 's/^./ &/' \
1701                                             >> $DRESULTS/genmake_state
1702                      rm -f tmp.tr_log
1703                    fi
1704                    echo -n "from '$gmkLog', " >> $DRESULTS/genmake_state
1705                    echo "get NETCDF & LAPACK settings:" >> $DRESULTS/genmake_state
1706                    sed -n '/set HAVE_NETCDF=/p' $gmkLog >> $DRESULTS/genmake_state
1707                    sed -n '/set HAVE_LAPACK=/p' $gmkLog >> $DRESULTS/genmake_state
1708                fi
1709            fi
1710      fi      fi
1711      echo      #postclean $dir/$builddir
1712      echo "$fres" >> $SUMMARY      if test "x$POSTCLEAN" = x2 ; then
1713      echo "fresults='$fres'" > $CDIR"/summary.txt"          makeclean $dir/$builddir \
1714      echo "MACH='$MACH'" >> $CDIR"/summary.txt"              && run_clean $dir/$rundir
1715      echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"      fi
1716      echo "DATE='$DATE'" >> $CDIR"/summary.txt"      if test "x$MPI" != x0 -a "x$MPI_MFILE" != x ; then rm -f $LOC_MFILE ; fi
1717      echo "tdir='$dir'" >> $CDIR"/summary.txt"  
       
1718      echo "-------------------------------------------------------------------------------"      echo "-------------------------------------------------------------------------------"
1719        
1720  done  done
1721    
1722  echo -n "Start time:  " >> $SUMMARY  printf "Start time:  " >> $SUMMARY
1723  echo $start_date >> $SUMMARY  echo "$start_date" >> $SUMMARY
1724  echo -n "End time:    " >> $SUMMARY  printf "End time:    " >> $SUMMARY
1725  date >> $SUMMARY  date >> $SUMMARY
1726    
1727  #  If addresses were supplied and mpack built successfully, then try  #  If addresses were supplied and mpack built successfully, then try
# Line 858  date >> $SUMMARY Line 1729  date >> $SUMMARY
1729  if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then  if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then
1730      echo "No results email was sent."      echo "No results email was sent."
1731  else  else
1732      if test "x$HAVE_MPACK" = xt ; then      if test "x$SENDCMD" != x ; then
1733          tar -cf $DRESULTS".tar" $DRESULTS > /dev/null 2>&1 \          if [ $verbose -gt 1 ]; then
1734              && gzip $DRESULTS".tar" \             echo " run: $SENDCMD -s MITgcm-test -m 3555000 ${SAVDIR}/${DRESULTS}".tar.gz" $ADDRESSES"
1735              && $MPACK -s MITgcm-test -m 1500000 $DRESULTS".tar.gz" $ADDRESSES          fi
1736            tar -cf ${SAVDIR}/${DRESULTS}".tar" $DRESULTS > /dev/null 2>&1 \
1737                && gzip ${SAVDIR}/${DRESULTS}".tar" \
1738                && $SENDCMD -s MITgcm-test -m 3555000 ${SAVDIR}/${DRESULTS}".tar.gz" $ADDRESSES
1739          RETVAL=$?          RETVAL=$?
1740          if test "x$RETVAL" != x0 ; then          if test "x$RETVAL" != x0 ; then
1741              echo              echo
# Line 874  else Line 1748  else
1748              echo "An email containing results was sent to the following addresses:"              echo "An email containing results was sent to the following addresses:"
1749              echo "  \"$ADDRESSES\""              echo "  \"$ADDRESSES\""
1750              echo              echo
1751                test -f ${SAVDIR}/${DRESULTS}".tar" &&  rm -f ${SAVDIR}/${DRESULTS}".tar"
1752                test -f ${SAVDIR}/${DRESULTS}".tar.gz" &&  rm -f ${SAVDIR}/${DRESULTS}".tar.gz"
1753          fi          fi
         test -f $DRESULTS".tar"  &&  rm -f $DRESULTS".tar"  
         test -f $DRESULTS".tar.gz"  &&  rm -f $DRESULTS".tar.gz"  
1754      fi      fi
1755  fi  fi
1756    
1757  # rm -f tmp_cmpnum.f a.out  if test "x$QUICK" = xf -a "x$NORUN" = xf ; then
1758  rm -f tmp_cmpnum.c tmp_cmpnum      rm -f tr_cmpnum.c tr_cmpnum
1759    fi
1760    
1761  if test "x$CLEANUP" != xt ; then  if test "x$CLEANUP" != xt ; then
1762      cat $SUMMARY      cat $SUMMARY | sed 's/ \.  \.  \.  \.  \.  \.  \.  \.  \.  \.  \.  \. //'
1763      if test -e tr_out.txt ; then      if test -e tr_out.txt ; then
1764          mv tr_out.txt tr_out.txt.old          mv tr_out.txt tr_out.txt.old
1765      fi      fi
1766      cat $SUMMARY > tr_out.txt      cat $SUMMARY | sed '/^[YN] [YN] [YN] [YN]/ s/ \. //g' > tr_out.txt
1767  fi  fi
1768    
1769    if test "x$DELDIR" = xt ; then
1770        rm -rf $DRESULTS
1771    fi
1772    echo "======== End of testreport execution ========"

Legend:
Removed from v.1.33  
changed lines
  Added in v.1.195

  ViewVC Help
Powered by ViewVC 1.1.22