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

Legend:
Removed from v.1.10  
changed lines
  Added in v.1.163

  ViewVC Help
Powered by ViewVC 1.1.22