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

Legend:
Removed from v.1.31  
changed lines
  Added in v.1.190

  ViewVC Help
Powered by ViewVC 1.1.22