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

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

  ViewVC Help
Powered by ViewVC 1.1.22