/[MITgcm]/MITgcm/verification/testreport
ViewVC logotype

Diff of /MITgcm/verification/testreport

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph | View Patch Patch

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

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

  ViewVC Help
Powered by ViewVC 1.1.22