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

Diff of /MITgcm/verification/testreport

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

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

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

  ViewVC Help
Powered by ViewVC 1.1.22