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

Legend:
Removed from v.1.40  
changed lines
  Added in v.1.177

  ViewVC Help
Powered by ViewVC 1.1.22