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

Legend:
Removed from v.1.38  
changed lines
  Added in v.1.212

  ViewVC Help
Powered by ViewVC 1.1.22