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

Legend:
Removed from v.1.48  
changed lines
  Added in v.1.189

  ViewVC Help
Powered by ViewVC 1.1.22