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

Legend:
Removed from v.1.47  
changed lines
  Added in v.1.182

  ViewVC Help
Powered by ViewVC 1.1.22