/[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.32 by edhill, Sun Dec 7 07:06:13 2003 UTC revision 1.163 by jmc, Wed May 18 22:03:57 2011 UTC
# Line 11  usage() Line 11  usage()
11      echo      echo
12      echo "where possible OPTIONS are:"      echo "where possible OPTIONS are:"
13      echo "  (-help|-h)               print usage"      echo "  (-help|-h)               print usage"
14      echo "  (-mpi)                   use MPI input files"      echo "  (-mth)                   run multi-threaded (using eedata.mth)"
15      echo "  (-ieee|-noieee)          if possible, use IEEE compiler flags"      echo "  (-mpi)                   use MPI to compile and run on 2 processors"
16      echo "                             (DEF=\"noieee\")"      echo "  (-MPI)  NUMBER           use MPI to compile and run on max NUMBER procs"
17      echo "  (-optfile=|-of=)STRING   list of optfiles to use"      echo "  (-mfile|-mf) STRING      MPI: file with list of possible machines to run on"
18      echo "  (-a|-addr) STRING        list of email recipients"      echo "  (-ieee/-noieee)          if possible, use IEEE compiler flags"
19      echo "                             (DEF=\"edhill@mitgcm.org\")"      echo "                             (DEF=\"-ieee\")"
20      echo "  (-t|-tdir) STRING        list of test dirs to use"      echo "  (-gsl)                   compile with \"-gsl\" flag"
21      echo "                             (DEF=\"\" which builds all)"      echo "  (-use_r4|-ur4)           if allowed, use real*4 type for '_RS' variable"
22      echo "  (-b|-bash) STRING        preferred location of a \"bash\" or"      echo "  (-optfile|-of) STRING    list of optfiles to use"
23        echo "  (-addr|-a) STRING        list of email recipients"
24        echo "                             (DEF=\"\" no email is sent)"
25        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"      echo "                             Bourne-compatible \"sh\" shell"
36      echo "                             (DEF=\"\" for \"bash\")"      echo "                             (DEF=\"\" for \"bash\")"
37      echo "  (-adm|-ad)               perform an adjoint run"      echo "  (-adm|-ad)               perform an adjoint run"
38      echo "  (-command) STRING        command to run"      echo "  (-oad)                   perform an OpenAD adjoint run"
39      echo "                             (DEF=\"make output.txt\")"      echo "  (-command|-c) STRING     command to run"
40      echo "  (-m|-make) STRING        command to use for \"make\""      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              echo
84              echo "Error: can't find \"$MPACKDIR\""              echo "Error: can't find \"$MPACKDIR\""
# Line 54  build_mpack() Line 87  build_mpack()
87              echo              echo
88              HAVE_MPACK=f              HAVE_MPACK=f
89          fi          fi
         echo -n "building mpack...  "  
90          if test "x$CC" = x ; then          if test "x$CC" = x ; then
91              export CC=cc              export CC=cc
92          fi          fi
93            printf "building mpack (using CC=$CC)...  "
94          ( cd $MPACKDIR && ./configure && $MAKE ) > tr_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
# Line 68  build_mpack() Line 101  build_mpack()
101          else          else
102              rm -f tr_build_mpack.out              rm -f tr_build_mpack.out
103              HAVE_MPACK=t              HAVE_MPACK=t
104                echo "done"
105          fi          fi
106      else      else
107          HAVE_MPACK=t          HAVE_MPACK=t
108            echo "already exist"
109      fi      fi
     echo "OK"  
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/.*=//' | cat -n > 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/.*=//' | cat -n > 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      if [ $verbose -gt 1 ]; then      if [ $verbose -gt 1 ]; then
171          cat tmp3.txt 1>&2          cat tmp3.txt 1>&2
# Line 122  testoutput_for_prop() Line 173  testoutput_for_prop()
173      echo "-1" >> tmp3.txt      echo "-1" >> tmp3.txt
174      # On the SGI O3K (*not* the O2K), "cat -n" inserts a ":" after the line number      # On the SGI O3K (*not* the O2K), "cat -n" inserts a ":" after the line number
175      cat tmp3.txt | sed -e 's|:||g' > tmp4.txt      cat tmp3.txt | sed -e 's|:||g' > tmp4.txt
176      digits_of_similarity=`./tmp_cmpnum < tmp4.txt`      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 -f tmp1.txt tmp2.txt tmp3.txt tmp4.txt      rm -f tmp1.txt tmp2.txt tmp3.txt tmp4.txt
       
     return $digits_of_similarity  
 }  
   
 dashnum()  
 {  
     # 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  
 }  
188    
189  testoutput_ad()      return $digits_of_similarity
 {  
     grep $3 $1/results_ad/output.txt_adm | awk '{print NR " " $5}' > t05.txt  
     grep $3 $1/$2/output.txt_adm | awk '{print NR " " $5}' > t15.txt  
     grep $3 $1/results_ad/output.txt_adm | awk '{print NR " " $6}' > t06.txt  
     grep $3 $1/$2/output.txt_adm | awk '{print NR " " $6}' > t16.txt  
     join t05.txt t15.txt > t5.txt  
     join t06.txt t16.txt > t6.txt  
     echo "-1" >> t5.txt  
     echo "-1" >> t6.txt  
     digits_5=`./tmp_cmpnum < t5.txt`  
     digits_6=`./tmp_cmpnum < t6.txt`  
     dashnum $digits_5 $digits_6  
     rm -f t[01][56].txt t[56].txt  
190  }  }
191    
192  testoutput()  testoutput_run()
193  {  {
194      # testoutput directory subdir      # testoutput_run directory subdir reference_output
195      #      #
196      #  test output in "directory"      #  test output from 1 run in "directory"
197      if test "x$ADM" = x ; then  # --> 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          testoutput_for_prop $1 "dynstat_theta_min" "theta minimum" $2; tmin=$?          # remove 1rst var and expand the list: + => min max mean s.d
206          testoutput_for_prop $1 "dynstat_theta_max" "theta maximum" $2; tmax=$?          listVar=`echo $listChk | sed 's/ [a-zA-Z0-9]*+/&mn &mx &av &sd/g' \
207          testoutput_for_prop $1 "dynstat_theta_mean" "theta mean" $2; tmean=$?                                 | sed 's/+//g' | sed "s/^$sVar//"`
208          testoutput_for_prop $1 "dynstat_theta_sd" "theta s.d." $2; tsd=$?          if [ $debug -gt 0 ]; then echo "testoutput_run: listVar(I)='$listVar'" 1>&2 ; fi
209          testoutput_for_prop $1 "dynstat_salt_min" "salt minimum" $2; smin=$?          # check for ptracer output in reference_output file :
210          testoutput_for_prop $1 "dynstat_salt_max" "salt maximum" $2; smax=$?          outpref=$1/results/$3
211          testoutput_for_prop $1 "dynstat_salt_mean" "salt mean" $2; smean=$?          ptr_mon="trcstat_ptracerXX_min trcstat_ptracerXX_max"
212          testoutput_for_prop $1 "dynstat_salt_sd" "salt s.d." $2; ssd=$?          ptr_mon="$ptr_mon trcstat_ptracerXX_mean trcstat_ptracerXX_sd"
213          testoutput_for_prop $1 "dynstat_uvel_min" "U minimum" $2; umin=$?          for ii in $PTRACERS_NUM ; do
214          testoutput_for_prop $1 "dynstat_uvel_max" "U maximum" $2; umax=$?              ptrfound=0
215          testoutput_for_prop $1 "dynstat_uvel_mean" "U mean" $2; umean=$?              for jj in $ptr_mon ; do
216          testoutput_for_prop $1 "dynstat_uvel_sd" "U s.d." $2; usd=$?                  name=`eval "echo $jj | sed -e 's|XX|0"$ii"|g'"`
217          testoutput_for_prop $1 "dynstat_vvel_min" "V minimum" $2; vmin=$?                  tst=`grep $name $outpref | wc -l | awk '{print $1}'`
218          testoutput_for_prop $1 "dynstat_vvel_max" "V maximum" $2; vmax=$?                  if test ! "x$tst" = x0 ; then ptrfound=1 ; fi
219          testoutput_for_prop $1 "dynstat_vvel_mean" "V mean" $2; vmean=$?              done
220          testoutput_for_prop $1 "dynstat_vvel_sd" "V s.d." $2; vsd=$?              if test $ptrfound = '1' ; then
221          dashnum $cg2dres $tmin $tmax $tmean $tsd $smin $smax $smean $ssd \                  eval "HAVE_PTR0"$ii"=t"
222              $umin $umax $umean $usd $vmin $vmax $vmean $vsd              else
223      else                  eval "HAVE_PTR0"$ii"=f"
224          testoutput_ad $1 $2 "precision_grdchk_result"                if test "x$ADM" = x -a "x$OADM" = x; then
225      fi                # 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 211  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"              command="$GENMAKE2  -ds -m $MAKE"
328              if test "x$ADM" = x ; then              if test "x$MKDEPEND" != x ; then
329                  command="$command --mods=../code"                  command="$command -makedepend=$MKDEPEND"
330              else              fi
331                if test "x$ADM" = xt ; then
332                  command="$command --mods=../code_ad"                  command="$command --mods=../code_ad"
333                  command="$command -adof=../../../tools/adjoint_options/adjoint_staf"              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              fi
338              if test "x$OPTFILE" != xNONE ; then              if test "x$OPTFILE" != xNONE ; then
339                  command="$command --optfile=$OPTFILE"                  command="$command -optfile=$OPTFILE"
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              printf 'genmake ... ' 1>&2              if test "x$GSL" = xt ; then
345              $command > make.log 2>&1                  command="$command -gsl"
346                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              cp Makefile $CDIR              #  Reduce the size of the testing emails!
371                head -100 Makefile > $CDIR/Makefile_head
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 genmake_* make.log $CDIR                  cp genmake.log genmake_* genmake.tr_log $CDIR
376                  return 1                  return 1
377              else              else
378                  echo "successful" 1>&2                  echo "successful"
379              fi              fi
380          )          )
381      fi      fi
# Line 246  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 successful 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 279  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 successful 1>&2                  echo successful
455              fi              fi
456          )          )
457      fi      fi
# Line 298  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              if test "x$ADM" = x ; then              if test "x$ADM" = xt ; then
478                  $MAKE >> make.log 2>&1                  $MAKE adall >> make.tr_log 2>&1
479              else              elif test "x$OADM" = xt ; then
480                  $MAKE adall >> make.log 2>&1                  $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              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 successful 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()  symlink_mpifiles()
578  {  {
579      # Put special links so that MPI specific files are used      # Put special links so that MPI specific files are used
# Line 327  symlink_mpifiles() Line 582  symlink_mpifiles()
582    
583      dir=$1      dir=$1
584      code_dir=$2      code_dir=$2
585      BUILD_DIR=$dir/$3      build_dir=$dir/$3
     CODE_DIR=$dir/$code_dir  
586    
587      # These are files that should replace their counter-part when using -mpi      # These are files that should replace their counter-part when using -mpi
588      MPI_FILES=`(cd $CODE_DIR; find . -name "*_mpi")`      MPI_FILES=`(cd $dir/$code_dir; find . -name "*_mpi" -print)`
589    
590      #  Is this an MPI run?      for ii in $MPI_FILES ; do
591      if test "x$MPI" = xt ; then          i=`echo $ii | sed 's:^\./::'`
592          # YES: We symbolically link these files to the build          name=`echo $i | sed 's:_mpi::'`
593          # dir so long as there is no real file in place          file="../$code_dir/$i"
594          for ii in $MPI_FILES ; do          if test $name = 'SIZE.h' ; then file="SIZE.h.mpi" ; fi
595              i=`echo $ii | sed 's:^\./::'`  
596              name=`echo $i | sed 's:_mpi::' `          #  Is this an MPI run?
597              cmp $CODE_DIR/$i $BUILD_DIR/$name > /dev/null 2>&1          if test "x$MPI" = x0 ; then
598              RETVAL=$?              # NO: We undo any _mpi symbolically linked files
599              if test "x$RETVAL" != x0 ; then              if test -L $build_dir/$name ; then
600                  if ! test -f $BUILD_DIR/$i ; then                  ( cd $build_dir ; cmp $name $file > /dev/null 2>&1 )
601                  #echo Linking $name to $i                  RETVAL=$?
602                      (cd $BUILD_DIR; ln -sf ../$code_dir/$i $name)                  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                  fi
607              fi              fi
608          done          else
609      else              # YES: We symbolically link these files to the build
610      # NO: We undo any _mpi symbolically linked files              # dir so long as there is no real file in place
611          for ii in $MPI_FILES ; do              ( cd $build_dir ; cmp $name $file > /dev/null 2>&1 )
612              i=`echo $ii | sed 's:^\./::'`              RETVAL=$?
613              name=`echo $i | sed 's:_mpi::' `              if [ $verbose -gt 1 ]; then echo "  cmp $name $file returns: $RETVAL" ; fi
614              if test -L $BUILD_DIR/$name ; then              if test "x$RETVAL" != x0 ; then
615                  linktarg=`(cd $BUILD_DIR; readlink $name)`                  if test -h $build_dir/$name ; then rm -f $build_dir/$name ; fi
616                  if test $linktarg = "../$code_dir/$name"_mpi ; then                  if test ! -r $build_dir/$name ; then
617                  #echo Un-linking $name from $linktarg                      if [ $verbose -gt 1 ]; then echo "  Linking $name to $file" ; fi
618                      rm -f $BUILD_DIR/$name                      (cd $build_dir; ln -sf $file $name)
619                  fi                  fi
620              fi              fi
621          done          fi
622      fi      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 test "x$1" = x1 ; then      if test -d $1 ; then
631          (          (
632              cd $2              cd $1 ; shift
633              if test "x$ADM" = x ; then              echo 'linkdata from dirs:' $*
634                  files=`( cd ../input ; ls -1 | grep -v CVS )`              inpMPI=`(cd ../$1 ; find . -name "*.mpi" -print | sed 's:^\./::')`
635                  for i in $files ; do              for xx in $inpMPI ; do
636                      if test ! -d "../input/"$i ; then                if test -r "../"$1"/"$xx ; then
637                          ln -sf "../input/"$i $i                  # 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                      fi
649                  done                  fi
650              else                fi
651                  files=`( cd ../input ; ls -1 *.bin | grep -v CVS )`              done
652                  for i in $files ; do              if test -r "../"$1"/eedata.mth" ; then
653                      if test ! -d "../input/"$i ; then              # found eedata.mth in 1rst input dir and it is readable
654                          ln -sf "../input/"$i $i                  if test "x$MULTI_THREAD" = "xt" ; then
655                      fi                  # multi-threaded test: remove symbolic link & link eedata.mth
656                  done                      if test -h eedata ; then rm -f eedata ; fi
657                  files=`( cd ../input_ad ; ls -1 | grep -v CVS )`                      if test ! -r eedata ; then
658                  for i in $files ; do                          ln -sf "../"$1"/eedata.mth" eedata ;
659                      if test ! -d "../input_ad/"$i ; then                          printf ' eedata.mth' 1>&2
                         ln -sf "../input_ad/"$i $i  
660                      fi                      fi
661                  done                  else
662                    # not multi-threaded test: remove eedata symbolic link
663                        if test -h eedata ; then rm -f eedata ; fi
664                    fi
665              fi              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  }  }
# Line 403  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 >> run.log 2>&1              #- 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              echo successful 1>&2              if test "x$MPI_MFILE" != x ; then
706              if test "x$ADM" = x ; then                COMMAND=`echo $COMMAND | sed "s/ TR_MFILE / ..\/..\/$LOC_MFILE /"`
707                  cp output.txt $CDIR"/output.txt"              fi
708              else              #echo "  COMMAND='$COMMAND'"
709                  cp output.txt_adm $CDIR"/output.txt_adm"          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              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              tail run.log              echo 'failed (run:' $RETVAL ' end:' $ENDVAL ')'
771              echo failed 1>&2              printf '=> output from running in %s :\n' $1 1>&2
772              cp run.log $CDIR"/run.log"              tail $RUNLOG | sed 's/^.*/> &/g' 1>&2
773                cp $RUNLOG $CDIR"/"$RUNLOG
774              return 1              return 1
775          fi          fi
776      )      )
# Line 432  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.c <<EOF      cat > tr_cmpnum.c <<EOF
785  #include <stdio.h>  #include <stdio.h>
786  #include <math.h>  #include <math.h>
787  int main( int argc, char** argv )  {  int main( int argc, char** argv )  {
788    int linnum,best;    int linnum,cmplin,best,lncnt;
789    double a,b,diff;    double a,b,abave,relerr;
790    best = -16;    best = -22;
791    while( 1 )  {    lncnt = 0;
792      while( 1 & ( (lncnt+=1) < 999 ) )  {
793      scanf("%d", &linnum);      scanf("%d", &linnum);
794      if (linnum == -1)  break;      if (linnum == -1)  break;
795      scanf("%lf", &a);  scanf("%lf", &b);      scanf("%lf", &a);  scanf("%lf", &b);
796      diff = 0.5*(fabs(a)+fabs(b));      abave = 0.5*(fabs(a)+fabs(b));
797      if (diff > 1.e-12) {      if ( abave == abave ) {
798        diff=fabs(a-b)/diff;        if (abave > 0.0) {
799        if (diff > 0.0) {          relerr=fabs(a-b)/abave;
800          linnum = (int)log10(diff);          if (relerr > 0.0) { cmplin = (int)rint(log10(relerr)); }
801          best = (best > linnum) ? best : linnum;          else { cmplin = -16 ; }
802            best = (best > cmplin) ? best : cmplin; }
803          else { cmplin = -22 ; }
804       /* printf("%d ; %lf ; %lf\n",cmplin,a,b); */
805        }        }
806        else {     else {
807          if (best == -16 && diff != 0)  best = -22;     /* 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);    printf("%d\n", -best);
813    return 0;    return 0;
814  }  }
815  EOF  EOF
816      cc -o tmp_cmpnum tmp_cmpnum.c -lm      $CC -o tr_cmpnum tr_cmpnum.c -lm
817    
818      if [ -x ./tmp_cmpnum ]; then      if [ -x ./tr_cmpnum ]; then
819          echo "OK"          echo "OK"
820          return 0          return 0
821      else      else
822          echo          echo
823          echo "ERROR: failed to compile comparison code"          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 479  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 492  formatresults() Line 855  formatresults()
855      fi      fi
856      printf '  %s' $nm      printf '  %s' $nm
857      printf '\n'      printf '\n'
       
 }  
858    
 show_help()  
 {  
     cat - << EOF  
 $0 [-help] [-quick] [-verbose] dir1 [dir2] [...]  
   
  -help|-h      Show this help message  
  -quiet     Reduce the amount of output  
  -verbose   Produce copious amounts of output  
  -debug     Produce even more output which will mean nothing to most  
  -force     Do "make CLEAN" before compiling. This forces a complete rebuild.  
  -clean     Do "make CLEAN" after compiling and testing.  
  -cleanup   Aggresively removes all model output, executables and object files  
             and then exits. Use with care.  
   
 Normal usage:  
  $0 *       Configure, compile, run and analyze in all experiment directories  
 EOF  
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  HAVE_MPACK=  HAVE_MPACK=
943  MPACK="$MPACKDIR/mpack"  MPACK=
944  COMMAND=  COMMAND=
945  MAKE=make  MKDEPEND=
946  MPI=f  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=  ADM=
961    OADM=
962    
963    # list of pTracers to check for monitor output
964    PTRACERS_NUM="1 2 3 4 5"
965    
966  echo -n "parsing options...  "  MATCH_CRIT=10
967    
968    printf "parsing options...  "
969    
970  ac_prev=  ac_prev=
971  for ac_option ; do  for ac_option ; do
# Line 574  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 ;;
1016    
1017          -clean | --clean)          -match | --match ) ac_prev=MATCH_CRIT ;;
1018              CLEANUP=t ;;          -match=* | --match=* ) MATCH_CRIT=$ac_optarg ;;
   
         -quick | --quick | -q | --q)  
             QUICK=t ;;  
         -nogenmake | --nogenmake | -ng | --ng)  
             NOGENMAKE=t ;;  
         -noclean | --noclean | -nc | --nc)  
             NOCLEAN=t ;;  
         -nodepend | --nodepend | -nd | --nd)  
             NODEPEND=t ;;  
1019    
1020          -mpi) MPI=t ;;          -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 ;;          -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 653  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  if test "x$ADM" = xt -a "x$COMMAND" = x ; then  LOC_MFILE='tr_mpi_mfile'
1163      COMMAND="./mitgcmuv_ad > output.txt_adm 2>&1"  RUNLOG="run.tr_log"
1164  fi  OUTPUTFILE=$ref_outp
   
1165  if test "x$COMMAND" = x ; then  if test "x$COMMAND" = x ; then
1166      COMMAND="make output.txt"      COMMAND="./$EXECUTABLE > $OUTPUTFILE"
1167    fi
1168    if test "x$MPI" != x0 ; then
1169        OUTPUTFILE="STDOUT.0000"
1170  fi  fi
1171    
1172  echo "OK"  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  if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then  if test "x$ADDRESSES" = x ; then
1199      echo "skipping mpack build"      echo "skipping mpack build"
1200  else  else
1201      build_mpack      build_mpack
1202  fi  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="tr_"$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 699  if test "x$RETVAL" != x0 ; then Line 1231  if test "x$RETVAL" != x0 ; then
1231      exit 1      exit 1
1232  fi  fi
1233  SUMMARY="$DRESULTS/summary.txt"  SUMMARY="$DRESULTS/summary.txt"
 echo -n "Start time:  " >> $SUMMARY  
1234  start_date=`date`  start_date=`date`
1235  echo $start_date > $SUMMARY  echo $start_date > $SUMMARY
1236    echo 'run:' $CMDLINE >> $SUMMARY
1237    echo 'on :' $UNAMEA  >> $SUMMARY
1238    
1239  of_path=  of_path=
1240  if test "x$OPTFILE" != xNONE ; then  if test "x$OPTFILE" != xNONE ; then
# Line 725  if test "x$OPTFILE" != xNONE ; then Line 1258  if test "x$OPTFILE" != xNONE ; then
1258      fi      fi
1259  else  else
1260      echo >> $SUMMARY      echo >> $SUMMARY
1261      echo "No \"OPTFILE\" was explicitly specified by testreport," >> $SUMMARY      echo "No \"OPTFILE\" was specified ; genmake2 found and uses:" >> $SUMMARY
1262      echo "   so the genmake default will be used." >> $SUMMARY      #-note: to be filled later after 1rst run
1263  fi  fi
1264  echo  echo
1265  echo >> $SUMMARY  echo >> $SUMMARY
1266  if test "x$ADM" = x ; then  if test "x$ADM" = x -a "x$OADM" = x; then
1267      cat << EOF | tee -a $SUMMARY      if [ $MATCH_CRIT -lt 10 ] ;
1268                  T           S           U           V      then line_0="default  "$MATCH_CRIT ;
1269  G D M    c        m  s        m  s        m  s        m  s      else line_0="default "$MATCH_CRIT ; fi
1270  E p a R  g  m  m  e  .  m  m  e  .  m  m  e  .  m  m  e  .         line_0="$line_0  ----T-----  ----S-----  ----U-----  ----V-----"
1271  N n k u  2  i  a  a  d  i  a  a  d  i  a  a  d  i  a  a  d      line_1="G D M    c        m  s        m  s        m  s        m  s"
1272  2 d e n  d  n  x  n  .  n  x  n  .  n  x  n  .  n  x  n  .      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  EOF      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  else
1289      echo "ADJOINT=true" >> $SUMMARY      echo "ADJOINT=true" >> $SUMMARY
1290      echo >> $SUMMARY      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      cat << EOF | tee -a $SUMMARY
1296  G D M    C  G  G D M    C  G
1297  E p a R  o  r  E p a R  o  r
# Line 750  N n k u  s  a Line 1300  N n k u  s  a
1300    
1301  EOF  EOF
1302  fi  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      fout=      fout=$dir"/results/"$ref_outp
     if test "x$ADM" = x ; then  
         fout=$dir"/results/output.txt"  
     else  
         fout=$dir"/results_ad/output.txt_adm"  
     fi  
1344      if test ! -r $fout ; then      if test ! -r $fout ; then
1345          echo "can't read \"$fout\" -- skipping $dir"          echo "can't read \"$fout\" -- skipping $dir"
1346          continue          continue
1347      fi      fi
1348    
1349      builddir="input"      # Check for specific files for particular type of run
     rundir="input"  
     use_seperate_build=0  
     if test -d $dir/build -a -r $dir/build ; then  
         builddir="build"  
         rundir="build"  
         use_seperate_build=1  
         linkdata $use_seperate_build $dir/$rundir  
     fi  
       
     if test "x$ADM" = x ; then  
         code_dir=code  
         CODE_DIR=$dir/code  
     else  
         code_dir=code_ad  
         CODE_DIR=$dir/code_ad  
     fi  
     BUILD_DIR=$dir/$builddir  
1350    
1351      if test ! -r $CODE_DIR"/SIZE.h_mpi" -a "x$MPI" = "xt" ; then      if test ! -r $CODE_DIR"/SIZE.h_mpi"  -a "x$MPI" != "x0" ; then
1352          echo "can't find \"$CODE_DIR/SIZE.h_mpi\" -- skipping $dir"          echo "can't find \"$CODE_DIR/SIZE.h_mpi\" -- skipping $dir"
1353          continue          continue
1354      fi      fi
1355        if test ! -r $dir"/input/eedata.mth" -a "x$MULTI_THREAD" = "xt" ; then
1356            echo "can't find \"$dir/input/eedata.mth\" -- skipping $dir"
1357            continue
1358        fi
1359    
1360        if test "x$MPI" != "x0" ; then
1361            prefer_X=0
1362            if test "x$MULTI_THREAD" = "xt" ; then
1363                retv=`check_eedata $dir"/input/eedata.mth"`
1364                if test $retv = 1 ; then prefer_X=1 ; fi
1365            fi
1366            #- create new SIZE.h with no more than '$MPI' Procs
1367            mk_mpi_size $CODE_DIR"/SIZE.h_mpi" $BUILD_DIR"/tr_size.mpi" $MPI $prefer_X
1368            LOC_NPROC=$?
1369            (   cd $BUILD_DIR
1370                if test -r SIZE.h.mpi ; then
1371                    cmp tr_size.mpi SIZE.h.mpi > /dev/null 2>&1 ; RETVAL=$?
1372                else RETVAL=1
1373                fi
1374                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
1402        fi
1403    
1404        #  Check whether there are "extra runs" for this testdir
1405        extra_runs=
1406        if test "x$NORUN" = xf ; then
1407            ex_run_dirs=`( cd $dir ; echo $inputdir.* )`
1408        fi
1409        #echo "ex_run_dirs='$ex_run_dirs'"
1410        for exd in $ex_run_dirs ; do
1411            name=`echo $exd | sed -e "s/$inputdir\.//"`
1412            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
1429              else
1430                extra_runs="$extra_runs $name"
1431              fi
1432            fi
1433        done
1434    
     echo "-------------------------------------------------------------------------------"  
1435      echo      echo
1436      echo "Experiment:  $dir"      if test "x$extra_runs" = "x" ; then
1437           echo "Experiment:  $dir"
1438        else
1439           echo "Experiment:  $dir ; extra_runs=$extra_runs"
1440        fi
1441      echo      echo
1442      unset genmake makedepend make run      unset genmake makedepend make run
1443      results='-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --'      results=$EMPTY_RESULTS
1444    
1445      #  Create an output dir for each OPTFILE/tdir combination      #  Create an output dir & summary.txt file for each tested experiment (tdir)
1446      rel_CDIR=$DRESULTS"/"$dir      locDIR=$DRESULTS"/"$dir
1447      mkdir $rel_CDIR      mkdir $locDIR
1448      CDIR=`pwd`"/$rel_CDIR"      #- report to this experiment local summary file ---
1449            echo "DATE='$DATE' ; tdir='$dir'" > $locDIR"/summary.txt"
1450      if test "x$CLEANUP" = xt ; then      echo "MACH='$MACH'" >> $locDIR"/summary.txt"
1451          makeclean $dir/$builddir      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 \              && 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 $use_seperate_build $dir/$rundir \              && run_clean $dir/$rundir \
1468                && linkdata $dir/$rundir $inputdir \
1469              && runmodel $dir/$rundir && run=Y \              && runmodel $dir/$rundir && run=Y \
1470              && results=`testoutput $dir $rundir`              && results=`testoutput_run $dir $rundir $ref_outp`
1471      fi      fi
1472            #echo "results='$results'"
1473      echo  
     if test "x$ADM" = x ; then  
1474          fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`          fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1475      else          echo 1>&2
1476          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
1477          fres=$fres"$results   $dir"          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      echo      #postclean $dir/$builddir
1537      echo "$fres" >> $SUMMARY      if test "x$POSTCLEAN" = x2 ; then
1538      echo "fresults='$fres'" > $CDIR"/summary.txt"          makeclean $dir/$builddir \
1539      echo "MACH='$MACH'" >> $CDIR"/summary.txt"              && run_clean $dir/$rundir
1540      echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"      fi
1541      echo "DATE='$DATE'" >> $CDIR"/summary.txt"      if test "x$MPI" != x0 -a "x$MPI_MFILE" != x ; then rm -f $LOC_MFILE ; fi
1542      echo "tdir='$dir'" >> $CDIR"/summary.txt"  
       
1543      echo "-------------------------------------------------------------------------------"      echo "-------------------------------------------------------------------------------"
1544        
1545  done  done
1546    
1547  echo -n "Start time:  " >> $SUMMARY  printf "Start time:  " >> $SUMMARY
1548  echo $start_date >> $SUMMARY  echo "$start_date" >> $SUMMARY
1549  echo -n "End time:    " >> $SUMMARY  printf "End time:    " >> $SUMMARY
1550  date >> $SUMMARY  date >> $SUMMARY
1551    
1552  #  If addresses were supplied and mpack built successfully, then try  #  If addresses were supplied and mpack built successfully, then try
# Line 859  else Line 1557  else
1557      if test "x$HAVE_MPACK" = xt ; then      if test "x$HAVE_MPACK" = xt ; then
1558          tar -cf $DRESULTS".tar" $DRESULTS > /dev/null 2>&1 \          tar -cf $DRESULTS".tar" $DRESULTS > /dev/null 2>&1 \
1559              && gzip $DRESULTS".tar" \              && gzip $DRESULTS".tar" \
1560              && $MPACK -s MITgcm-test -m 1500000 $DRESULTS".tar.gz" $ADDRESSES              && $MPACK -s MITgcm-test -m 3555000 $DRESULTS".tar.gz" $ADDRESSES
1561          RETVAL=$?          RETVAL=$?
1562          if test "x$RETVAL" != x0 ; then          if test "x$RETVAL" != x0 ; then
1563              echo              echo
# Line 872  else Line 1570  else
1570              echo "An email containing results was sent to the following addresses:"              echo "An email containing results was sent to the following addresses:"
1571              echo "  \"$ADDRESSES\""              echo "  \"$ADDRESSES\""
1572              echo              echo
1573                test -f $DRESULTS".tar"  &&  rm -f $DRESULTS".tar"
1574                test -f $DRESULTS".tar.gz"  &&  rm -f $DRESULTS".tar.gz"
1575          fi          fi
         test -f $DRESULTS".tar"  &&  rm -f $DRESULTS".tar"  
         test -f $DRESULTS".tar.gz"  &&  rm -f $DRESULTS".tar.gz"  
1576      fi      fi
1577  fi  fi
1578    
1579  # rm -f tmp_cmpnum.f a.out  if test "x$QUICK" = xf -a "x$NORUN" = xf ; then
1580  rm -f tmp_cmpnum.c tmp_cmpnum      rm -f tr_cmpnum.c tr_cmpnum
1581    fi
1582    
1583  if test "x$CLEANUP" != xt ; then  if test "x$CLEANUP" != xt ; then
1584      cat $SUMMARY      cat $SUMMARY | sed 's/ \.  \.  \.  \.  \.  \.  \.  \.  \.  \.  \.  \. //'
1585      if test -e tr_out.txt ; then      if test -e tr_out.txt ; then
1586          mv tr_out.txt tr_out.txt.old          mv tr_out.txt tr_out.txt.old
1587      fi      fi
1588      cat $SUMMARY > tr_out.txt      cat $SUMMARY | sed '/^[YN] [YN] [YN] [YN]/ s/ \. //g' > tr_out.txt
1589    fi
1590    
1591    if test "x$DELDIR" = xt ; then
1592        rm -rf $DRESULTS
1593  fi  fi
1594    

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

  ViewVC Help
Powered by ViewVC 1.1.22