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

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

  ViewVC Help
Powered by ViewVC 1.1.22