/[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.157 by jmc, Thu Jan 27 04:51:03 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  
 }  
188    
189  dashnum()      return $digits_of_similarity
 {  
     # dashnum n1 n2 n3 ...  
     #  
     #  print numbers using %3i format or "--" if number = 99  
   
     for num in $@ ; do  
         if [ $num = 99 ]; then  
             printf ' --'  
         else  
             printf '%3i' $num  
         fi  
     done  
 }  
   
 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  
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            #- report to this experiment local summary file ---
242            echo "MACH='$MACH'" > $locDIR"/summary.txt"
243            echo "UNAMEA='$UNAMEA'" >> $locDIR"/summary.txt"
244            echo "DATE='$DATE'" >> $locDIR"/summary.txt"
245            grep '(PID\.TID 0000\.0001)      n.. =' $1/$2/$OUTPUTFILE \
246             | sed 's/(PID.TID 0000.0001)     //' >> $locDIR"/summary.txt"
247            echo "listVar='$listVar'" >> $locDIR"/summary.txt"
248            #---
249            allargs=""
250            for xx in $listVar
251            do
252              case $xx in
253               'PS')  if [ $debug -gt 0 ]
254                      then echo testoutput_run: testoutput_var $1 cg2d_init_res 1>&2 ; fi
255                      testoutput_var $1 "cg2d_init_res" "Press. Solver (cg2d)" $2 $3; yy=$?
256                      if [ $debug -gt 0 ] ; then echo testoutput_run: cg2dres=$yy 1>&2 ; fi ;;
257              'Cost') testoutput_var $1 "ADM  precision_derivative_cost" "ADM Cost" $2 $3; yy=$? ;;
258              'Grad') testoutput_var $1 "ADM  precision_derivative_grad" "ADM Grad" $2 $3; yy=$? ;;
259               'Tmn') testoutput_var $1 "dynstat_theta_min"  "Theta minimum"  $2 $3; yy=$? ;;
260               'Tmx') testoutput_var $1 "dynstat_theta_max"  "Theta maximum"  $2 $3; yy=$? ;;
261               'Tav') testoutput_var $1 "dynstat_theta_mean" "Theta mean"     $2 $3; yy=$? ;;
262               'Tsd') testoutput_var $1 "dynstat_theta_sd"   "Theta Std.Dev"  $2 $3; yy=$? ;;
263               'Smn') testoutput_var $1 "dynstat_salt_min"  "Salt minimum"    $2 $3; yy=$? ;;
264               'Smx') testoutput_var $1 "dynstat_salt_max"  "Salt maximum"    $2 $3; yy=$? ;;
265               'Sav') testoutput_var $1 "dynstat_salt_mean" "Salt mean"       $2 $3; yy=$? ;;
266               'Ssd') testoutput_var $1 "dynstat_salt_sd"   "Salt Std.Dev"    $2 $3; yy=$? ;;
267               'Umn') testoutput_var $1 "dynstat_uvel_min"  "U minimum"       $2 $3; yy=$? ;;
268               'Umx') testoutput_var $1 "dynstat_uvel_max"  "U maximum"       $2 $3; yy=$? ;;
269               'Uav') testoutput_var $1 "dynstat_uvel_mean" "U mean"          $2 $3; yy=$? ;;
270               'Usd') testoutput_var $1 "dynstat_uvel_sd"   "U Std.Dev"       $2 $3; yy=$? ;;
271               'Vmn') testoutput_var $1 "dynstat_vvel_min"  "V minimum"       $2 $3; yy=$? ;;
272               'Vmx') testoutput_var $1 "dynstat_vvel_max"  "V maximum"       $2 $3; yy=$? ;;
273               'Vav') testoutput_var $1 "dynstat_vvel_mean" "V mean"          $2 $3; yy=$? ;;
274               'Vsd') testoutput_var $1 "dynstat_vvel_sd"   "V Std.Dev"       $2 $3; yy=$? ;;
275            'pt1mn'|'pt2mn'|'pt3mn'|'pt4mn'|'pt5mn') ii=`echo $xx | sed 's/pt//' | sed 's/..$//'`
276               testoutput_var $1 "trcstat_ptracer0"$ii"_min"  "p0"$ii"_min"   $2 $3; yy=$? ;;
277            'pt1mx'|'pt2mx'|'pt3mx'|'pt4mx'|'pt5mx') ii=`echo $xx | sed 's/pt//' | sed 's/..$//'`
278               testoutput_var $1 "trcstat_ptracer0"$ii"_max"  "p0"$ii"_max"   $2 $3; yy=$? ;;
279            'pt1av'|'pt2av'|'pt3av'|'pt4av'|'pt5av') ii=`echo $xx | sed 's/pt//' | sed 's/..$//'`
280               testoutput_var $1 "trcstat_ptracer0"$ii"_mean" "p0"$ii"_mean" $2 $3; yy=$? ;;
281            'pt1sd'|'pt2sd'|'pt3sd'|'pt4sd'|'pt5sd') ii=`echo $xx | sed 's/pt//' | sed 's/..$//'`
282               testoutput_var $1 "trcstat_ptracer0"$ii"_sd"   "p0"$ii"_StDv"  $2 $3; yy=$? ;;
283             'Qntmn') testoutput_var $1 "forcing_qnet_min" "Qnet minimum"  $2 $3; yy=$? ;;
284             'Qntmx') testoutput_var $1 "forcing_qnet_max" "Qnet maximum"  $2 $3; yy=$? ;;
285             'Qntav') testoutput_var $1 "forcing_qnet_mean" "Qnet mean"       $2 $3; yy=$? ;;
286             'Qntsd') testoutput_var $1 "forcing_qnet_sd"  "Qnet Std.Dev"  $2 $3; yy=$? ;;
287             'aSImn') testoutput_var $1 "seaice_area_min"   "SIce Area min"   $2 $3; yy=$? ;;
288             'aSImx') testoutput_var $1 "seaice_area_max"   "SIce Area max"   $2 $3; yy=$? ;;
289             'aSIav') testoutput_var $1 "seaice_area_mean"  "SIce Area mean"  $2 $3; yy=$? ;;
290             'aSIsd') testoutput_var $1 "seaice_area_sd"    "SIce Area StDv"  $2 $3; yy=$? ;;
291             'hSImn') testoutput_var $1 "seaice_heff_min"   "SIce Heff min"   $2 $3; yy=$? ;;
292             'hSImx') testoutput_var $1 "seaice_heff_max"   "SIce Heff max"   $2 $3; yy=$? ;;
293             'hSIav') testoutput_var $1 "seaice_heff_mean"  "SIce Heff mean"  $2 $3; yy=$? ;;
294             'hSIsd') testoutput_var $1 "seaice_heff_sd"    "SIce Heff StDv"  $2 $3; yy=$? ;;
295            'AthSiG') testoutput_var $1 "thSI_Ice_Area_G" "thSIc Area Global" $2 $3; yy=$? ;;
296            'AthSiS') testoutput_var $1 "thSI_Ice_Area_S" "thSIc Area South"  $2 $3; yy=$? ;;
297            'AthSiN') testoutput_var $1 "thSI_Ice_Area_N" "thSIc Area North"  $2 $3; yy=$? ;;
298            'HthSiG') testoutput_var $1 "thSI_IceH_ave_G" "thSIc H Global"    $2 $3; yy=$? ;;
299            'HthSiS') testoutput_var $1 "thSI_IceH_ave_S" "thSIc H South"     $2 $3; yy=$? ;;
300            'HthSiN') testoutput_var $1 "thSI_IceH_ave_N" "thSIc H North"     $2 $3; yy=$? ;;
301                  *) yy=99; echo "WARNING: asking for var=$xx : not recognized !" 1>&2 ;;
302              esac
303              if test $xx = $sVar
304              then allargs="$allargs > $yy <"
305              else allargs="$allargs $yy"
306              fi
307            done
308    
309            nbVar=`echo $listVar | awk '{print NF}'`
310            if [ $nbVar -lt $LEN_CHECK_LIST ] ; then
311            #-- fill line (up to standard length) with dot:
312              adNul=`expr $LEN_CHECK_LIST - $nbVar | awk '{for(i=1;i<=$1;i++){print "."}}'`
313              echo $allargs $adNul
314            else
315              echo $allargs
316            fi
317    # <-- same processing for adjoint & forward test
318  }  }
319    
320  genmakemodel()  genmakemodel()
# Line 211  genmakemodel() Line 323  genmakemodel()
323      if test "x$NOGENMAKE" = xt ; then      if test "x$NOGENMAKE" = xt ; then
324          echo "genmake skipped!"          echo "genmake skipped!"
325      else      else
326          GENMAKE2="$BASH ../../../tools/genmake2"          if test "x$BASH" = x ; then
327                GENMAKE2="../../../tools/genmake2"
328            else
329                GENMAKE2="$BASH ../../../tools/genmake2 -bash $BASH"
330            fi
331          (          (
332              cd $1;              cd $1;
333              command="$GENMAKE2  -ds -m $MAKE"              command="$GENMAKE2  -ds -m $MAKE"
334              if test "x$ADM" = x ; then              if test "x$MKDEPEND" != x ; then
335                  command="$command --mods=../code"                  command="$command -makedepend=$MKDEPEND"
336              else              fi
337                if test "x$ADM" = xt ; then
338                  command="$command --mods=../code_ad"                  command="$command --mods=../code_ad"
339                  command="$command -adof=../../../tools/adjoint_options/adjoint_staf"              elif test "x$OADM" = xt ; then
340                    command="$command -adof ../../../tools/adjoint_options/adjoint_oad -mods '../code_oad ../../OpenAD/code_oad_all'"
341                else
342                    command="$command -mods=../code"
343              fi              fi
344              if test "x$OPTFILE" != xNONE ; then              if test "x$OPTFILE" != xNONE ; then
345                  command="$command --optfile=$OPTFILE"                  command="$command -optfile=$OPTFILE"
346              fi              fi
347              if test "x$IEEE" != x ; then              if test "x$IEEE" != x ; then
348                  command="$command -ieee"                  command="$command -ieee"
349              fi              fi
350              printf 'genmake ... ' 1>&2              if test "x$GSL" = xt ; then
351              $command > make.log 2>&1                  command="$command -gsl"
352                fi
353                if test "x$MPI" != x0 ; then
354                    command="$command -mpi"
355                fi
356                if test "x$MULTI_THREAD" = xt ; then
357                #- run multi-threaded using OpenMP:
358                    command="$command -omp"
359                fi
360                if test "x$USE_R4" = xt ; then
361                    command="$command -use_r4"
362                fi
363                if test "x$TS" = xt ; then
364                    command="$command -ts"
365                fi
366                if test "x$PAPIS" = xt ; then
367                    command="$command -papis"
368                else
369                if test "x$PCLS" = xt ; then
370                    command="$command -pcls"
371                fi
372                fi
373                printf 'genmake ... '
374                eval $command > genmake.tr_log 2>&1
375              RETVAL=$?              RETVAL=$?
376              cp Makefile $CDIR              #  Reduce the size of the testing emails!
377                head -100 Makefile > $CDIR/Makefile_head
378              if test "x$RETVAL" != x0 ; then              if test "x$RETVAL" != x0 ; then
379                  tail make.log                  tail genmake.tr_log
380                  echo "genmakemodel: genmake failed" 1>&2                  echo "genmakemodel: genmake failed"
381                  cp genmake_* make.log $CDIR                  cp genmake.log genmake_* genmake.tr_log $CDIR
382                  return 1                  return 1
383              else              else
384                  echo "successful" 1>&2                  echo "successful"
385              fi              fi
386          )          )
387      fi      fi
# Line 246  genmakemodel() Line 390  genmakemodel()
390  makeclean()  makeclean()
391  {  {
392      # makeclean directory      # makeclean directory
393        if test "x$NODEPEND" = xf ; then rm -f $1/make.tr_log ; fi
394      if test "x$NOCLEAN" = xt ; then      if test "x$NOCLEAN" = xt ; then
395          echo "make CLEAN skipped!"          echo "make Clean skipped!"
396      else      else
397          (          (
398              cd $1;              cd $1;
399              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  
400              if test -r Makefile ; then              if test -r Makefile ; then
401                  $MAKE CLEAN >> make.log 2>&1                  printf 'clean build-dir: make Clean ... '
402                    $MAKE Clean >> make.tr_log 2>&1
403                  RETVAL=$?                  RETVAL=$?
404                  if test "x$RETVAL" != x0 ; then                  if test "x$RETVAL" != x0 ; then
405                      tail make.log                      tail make.tr_log
406                      echo "makeclean: \"make CLEAN\" failed" 1>&2                      echo "makeclean: \"make Clean\" failed"
407                      cp make.log $CDIR"/make.log"                      cp make.tr_log genmake.log genmake.tr_log $CDIR
408                      return 1                      return 1
409                  fi                  fi
410                    echo successful
411                else
412                    echo ''
413              fi              fi
414              echo successful 1>&2              exit 0
415            )
416        fi
417    }
418    
419    run_clean()
420    {
421        # run_clean directory
422        if test "x$NOCLEAN" = xt ; then
423            echo "run_clean skipped!"
424        else
425            (
426                cd $1;
427                printf 'clean run-dir ... '
428                # part of what is done after "make clean" when doing "make CLEAN"
429                find . -name "*.meta" -exec rm {} \;
430                find . -name "*.data" -exec rm {} \;
431                find . -name "fort.*" -exec rm {} \;
432                find . -type l -exec rm {} \;
433                rm -f $EXECUTABLE $RUNLOG *.txt STD* *diagnostics.log datetime
434                rm -rf mnc_test_*
435                rm -f *_MIT_CE_000.opt0000 costfunction*0000
436                echo successful
437              exit 0              exit 0
438          )          )
439      fi      fi
# Line 279  makedependmodel() Line 447  makedependmodel()
447      else      else
448          (          (
449              cd $1;              cd $1;
450              printf 'make depend ... ' 1>&2              printf 'make depend ... '
451              $MAKE depend >> make.log 2>&1              $MAKE depend >> make.tr_log 2>&1
452              RETVAL=$?              RETVAL=$?
453              if test "x$RETVAL" != x0 ; then              if test "x$RETVAL" != x0 ; then
454                  tail make.log                  tail make.tr_log
455                  echo "makedependmodel: make depend failed" 1>&2                  echo "makedependmodel: make depend failed"
456                  cp make.log $CDIR"/make.log"                  cp make.tr_log genmake.log genmake.tr_log $CDIR
457                  return 1                  return 1
458              else              else
459                  echo successful 1>&2                  echo successful
460              fi              fi
461          )          )
462      fi      fi
# Line 298  makemodel() Line 466  makemodel()
466  {  {
467      # makemodel directory      # makemodel directory
468      (      (
469        if test "x$NOMAKE" = xt ; then
470            cd $1;
471            if test -x $EXECUTABLE ; then
472                echo "make skipped!"
473            else
474                echo "no executable!"
475                return 2
476            fi
477        else
478          cd $1;          cd $1;
479          if test -r Makefile ; then          if test -r Makefile ; then
480              printf 'make ... ' 1>&2              printf 'make ... '
481              if test "x$ADM" = x ; then              if test "x$ADM" = xt ; then
482                  $MAKE >> make.log 2>&1                  $MAKE adall >> make.tr_log 2>&1
483              else              elif test "x$OADM" = xt ; then
484                  $MAKE adall >> make.log 2>&1                  $MAKE adAll >> make.tr_log 2>&1
485                else
486                    if test "x$JOBS" = x ; then
487                        $MAKE >> make.tr_log 2>&1
488                    else
489                        $MAKE -j $JOBS >> make.tr_log 2>&1
490                    fi
491              fi              fi
492              RETVAL=$?              RETVAL=$?
493              if test "x$RETVAL" != x0 ; then              if test "x$RETVAL" != x0 ; then
494                  tail make.log                  tail make.tr_log
495                  echo failed 1>&2                  echo failed
496                  cp make.log $CDIR"/make.log"                  cp make.tr_log genmake.log genmake.tr_log $CDIR
497                    rm -f $EXECUTABLE
498                  return 1                  return 1
499              else              else
500                  echo successful 1>&2                  echo successful
501              fi              fi
502          fi          fi
503        fi
504      )      )
505  }  }
506    
507    mk_mpi_size()
508    {
509        # mk_mpi_size input_file output_file proc_Nb
510        #
511        # make new SIZE.h (=output_file) from SIZE.h_mpi (=input_file)
512        #     for an MPI build with no more than proc_Nb processors ;
513        # return the effective number of processors.
514    
515        inp=$1
516        out=$2
517        np=$3
518        tmp=TTT.$$
519    
520        px=`grep "^     & *nPx *=" $inp | sed "s/^     & *nPx *= *//" | sed 's/, *$//'`
521        py=`grep "^     & *nPy *=" $inp | sed "s/^     & *nPy *= *//" | sed 's/, *$//'`
522        sx=`grep "^     & *nSx *=" $inp | sed "s/^     & *nSx *= *//" | sed 's/, *$//'`
523        sy=`grep "^     & *nSy *=" $inp | sed "s/^     & *nSy *= *//" | sed 's/, *$//'`
524    
525        #- find the largest divisor of input_file proc Nb, but not larger than $np
526        pp=0
527        i=1
528        while [ $i -le $px ] ; do
529          if [ `expr $px % $i` -eq 0 ] ; then
530            j=1
531            while [ $j -le $py ] ; do
532              if [ `expr $py % $j` -eq 0 ] ; then
533                ij=`expr $i \* $j`
534                if [ $ij -gt $pp ] ; then
535                  if [ $ij -le $np ] ; then
536                    ix=$i ; jy=$j ; pp=$ij
537                    #echo "  ix,jy= $ix,$jy"
538                  fi
539                fi
540              fi
541              j=`expr $j + 1`
542            done
543          fi
544          i=`expr $i + 1`
545        done
546    
547        #- create new SIZE.h type file:
548        sx=`expr $sx \* $px / $ix`
549        sy=`expr $sy \* $py / $jy`
550        if [ $verbose -gt 1 ]; then
551            echo " px,py,np= $px,$py,$np : New MPI size: px,py= $ix,$jy : sx,sy= $sx,$sy"
552        fi
553        sed "/^     \& *nPx *=/s/[0-9]*,/$ix,/" $inp > $tmp
554        sed "/^     \& *nPy *=/s/[0-9]*,/$jy,/" $tmp > $out
555        sed "/^     \& *nSx *=/s/[0-9]*,/$sx,/" $out > $tmp
556        sed "/^     \& *nSy *=/s/[0-9]*,/$sy,/" $tmp > $out
557        rm -f $tmp
558        return $pp
559    }
560    
561  symlink_mpifiles()  symlink_mpifiles()
562  {  {
563      # 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 566  symlink_mpifiles()
566    
567      dir=$1      dir=$1
568      code_dir=$2      code_dir=$2
569      BUILD_DIR=$dir/$3      build_dir=$dir/$3
     CODE_DIR=$dir/$code_dir  
570    
571      # These are files that should replace their counter-part when using -mpi      # These are files that should replace their counter-part when using -mpi
572      MPI_FILES=`(cd $CODE_DIR; find . -name "*_mpi")`      MPI_FILES=`(cd $dir/$code_dir; find . -name "*_mpi" -print)`
573    
574      #  Is this an MPI run?      for ii in $MPI_FILES ; do
575      if test "x$MPI" = xt ; then          i=`echo $ii | sed 's:^\./::'`
576          # YES: We symbolically link these files to the build          name=`echo $i | sed 's:_mpi::'`
577          # dir so long as there is no real file in place          file="../$code_dir/$i"
578          for ii in $MPI_FILES ; do          if test $name = 'SIZE.h' ; then file="SIZE.h.mpi" ; fi
579              i=`echo $ii | sed 's:^\./::'`  
580              name=`echo $i | sed 's:_mpi::' `          #  Is this an MPI run?
581              cmp $CODE_DIR/$i $BUILD_DIR/$name > /dev/null 2>&1          if test "x$MPI" = x0 ; then
582              RETVAL=$?              # NO: We undo any _mpi symbolically linked files
583              if test "x$RETVAL" != x0 ; then              if test -L $build_dir/$name ; then
584                  if ! test -f $BUILD_DIR/$i ; then                  ( cd $build_dir ; cmp $name $file > /dev/null 2>&1 )
585                  #echo Linking $name to $i                  RETVAL=$?
586                      (cd $BUILD_DIR; ln -sf ../$code_dir/$i $name)                  if test "x$RETVAL" = x0 ; then
587                        if [ $verbose -gt 1 ]; then
588                            echo "  Un-linking $name from ../$code_dir" ; fi
589                        rm -f $build_dir/$name
590                  fi                  fi
591              fi              fi
592          done          else
593      else              # YES: We symbolically link these files to the build
594      # NO: We undo any _mpi symbolically linked files              # dir so long as there is no real file in place
595          for ii in $MPI_FILES ; do              ( cd $build_dir ; cmp $name $file > /dev/null 2>&1 )
596              i=`echo $ii | sed 's:^\./::'`              RETVAL=$?
597              name=`echo $i | sed 's:_mpi::' `              if [ $verbose -gt 1 ]; then echo "  cmp $name $file returns: $RETVAL" ; fi
598              if test -L $BUILD_DIR/$name ; then              if test "x$RETVAL" != x0 ; then
599                  linktarg=`(cd $BUILD_DIR; readlink $name)`                  if test -h $build_dir/$name ; then rm -f $build_dir/$name ; fi
600                  if test $linktarg = "../$code_dir/$name"_mpi ; then                  if test ! -r $build_dir/$name ; then
601                  #echo Un-linking $name from $linktarg                      if [ $verbose -gt 1 ]; then echo "  Linking $name to $file" ; fi
602                      rm -f $BUILD_DIR/$name                      (cd $build_dir; ln -sf $file $name)
603                  fi                  fi
604              fi              fi
605          done          fi
606      fi      done
       
607  }  }
608    
609  linkdata()  linkdata()
610  {  {
611      # linkdata flag      # linkdata run_dir input_dir_1 input_dir_2 ...
612      #      #
613      # symbolically link data files to run directory      # symbolically link data files to run directory
614      if test "x$1" = x1 ; then      if test -d $1 ; then
615          (          (
616              cd $2              cd $1 ; shift
617              if test "x$ADM" = x ; then              echo 'linkdata from dirs:' $*
618                  files=`( cd ../input ; ls -1 | grep -v CVS )`              inpMPI=`(cd ../$1 ; find . -name "*.mpi" -print | sed 's:^\./::')`
619                  for i in $files ; do              for xx in $inpMPI ; do
620                      if test ! -d "../input/"$i ; then                if test -r "../"$1"/"$xx ; then
621                          ln -sf "../input/"$i $i                  # found 1 _mpi sfx file in 1rst input dir and it is readable
622                      fi                  yy=`echo $xx | sed 's:\.mpi$::'`
623                  done                  if test "x$MPI" = "x0" ; then
624              else                      # not mpi test: remove symbolic link
625                  files=`( cd ../input ; ls -1 *.bin | grep -v CVS )`                      if test -h $yy ; then rm -f $yy ; fi
626                  for i in $files ; do                  else
627                      if test ! -d "../input/"$i ; then                      # mpi test: remove symbolic link & link .mpi sfx file
628                          ln -sf "../input/"$i $i                      if test -h $yy ; then rm -f $yy ; fi
629                        if test ! -r $yy ; then
630                            ln -sf "../"$1"/"$xx $yy ;
631                            printf " $xx" 1>&2
632                      fi                      fi
633                  done                  fi
634                  files=`( cd ../input_ad ; ls -1 | grep -v CVS )`                fi
635                  for i in $files ; do              done
636                      if test ! -d "../input_ad/"$i ; then              if test -r "../"$1"/eedata.mth" ; then
637                          ln -sf "../input_ad/"$i $i              # found eedata.mth in 1rst input dir and it is readable
638                    if test "x$MULTI_THREAD" = "xt" ; then
639                    # multi-threaded test: remove symbolic link & link eedata.mth
640                        if test -h eedata ; then rm -f eedata ; fi
641                        if test ! -r eedata ; then
642                            ln -sf "../"$1"/eedata.mth" eedata ;
643                            printf ' eedata.mth' 1>&2
644                      fi                      fi
645                  done                  else
646                    # not multi-threaded test: remove eedata symbolic link
647                        if test -h eedata ; then rm -f eedata ; fi
648                    fi
649              fi              fi
650                prevDir='NONE'
651                for ldir in $* ; do
652                    if test -d "../"$ldir -a $ldir != $prevDir ; then
653                        printf " ldir=${ldir}:" 1>&2
654                        files=`( cd "../"$ldir ; ls -1 | grep -v CVS )`
655                        for i in $files ; do
656                            if test ! -d "../"$ldir/$i ; then
657                                if test ! -r $i  ; then
658                                    printf ' '$i 1>&2
659                                    ln -sf "../"$ldir"/"$i $i
660                                fi
661                            fi
662                        done
663                        printf ' ;' 1>&2
664                        if test -x "../"$ldir"/"prepare_run ; then
665                            "../"$ldir"/"prepare_run 1>&2
666                        else
667                            echo '' 1>&2
668                        fi
669                    fi
670                    prevDir=$ldir
671                done
672          )          )
673      fi      fi
674  }  }
# Line 403  runmodel() Line 677  runmodel()
677  {  {
678      # runmodel directory      # runmodel directory
679      #      #
680      #  runs "$COMMAND in "directory"      #  runs $COMMAND in "directory"
681      #  (where "$COMMAND" is relative to "directory")      #  (where "$COMMAND" is relative to "directory")
682      (      (
683          cd $1          cd $1
684          printf 'runmodel ... ' 1>&2          printf 'runmodel in %s ... ' $1
685          # make output.txt          if test -L $EXECUTABLE ; then
686          $COMMAND >> run.log 2>&1            if test -x "../"$builddir"/"$EXECUTABLE ; then
687          RETVAL=$?              cmp $EXECUTABLE "../"$builddir"/"$EXECUTABLE > /dev/null 2>&1
688          if test "x$RETVAL" = x0 ; then              outD=$? ; if test "x$outD" != x0 ; then rm -f $EXECUTABLE ; fi
689              echo successful 1>&2            else rm -f $EXECUTABLE
690              if test "x$ADM" = x ; then            fi
691                  cp output.txt $CDIR"/output.txt"          fi
692              else          if test ! -x $EXECUTABLE -a -x "../"$builddir"/"$EXECUTABLE ; then
693                  cp output.txt_adm $CDIR"/output.txt_adm"              echo " link" $EXECUTABLE "from dir ../"$builddir > run.log_tmp
694                ln -sf "../"$builddir"/"$EXECUTABLE .
695            fi
696            if test "x$MPI" != x0 ; then
697                #- adjust the MPI run command with the right number of Procs
698                #echo '' ; echo "  COMMAND='$COMMAND'"
699                COMMAND=`echo $COMMAND | sed "s/ TR_NPROC / $LOC_NPROC /"`
700                if test "x$MPI_MFILE" != x ; then
701                  COMMAND=`echo $COMMAND | sed "s/ TR_MFILE / ..\/..\/$LOC_MFILE /"`
702                fi
703                #echo "  COMMAND='$COMMAND'"
704            fi
705            if test ! -x $EXECUTABLE ; then
706                rm -f $RUNLOG ; touch $RUNLOG
707                if test -f run.log_tmp ; then cat run.log_tmp >> $RUNLOG ; fi
708                echo " no executable:" $EXECUTABLE >> $RUNLOG
709                RETVAL=8
710                ENDVAL=-1
711            else
712              if test ! -f $OUTPUTFILE -o $OUTPUTFILE -ot $EXECUTABLE ; then
713                # output do not exist or is older than executable:
714                rm -f $RUNLOG ; touch $RUNLOG
715                if test -f run.log_tmp ; then cat run.log_tmp >> $RUNLOG ; fi
716                ( eval $COMMAND ) >> $RUNLOG 2>&1
717                RETVAL=$?
718                ENDVAL=`tail $OUTPUTFILE | grep -c 'PROGRAM MAIN: Execution ended Normally'`
719                if [ $POSTCLEAN -eq 1 -a $ENDVAL -gt 0 ] ; then
720                    find . -name "*.meta" -exec rm {} \;
721                    find . -name "*.data" -exec rm {} \;
722                    rm -rf mnc_test_*
723              fi              fi
724              else
725                RETVAL=0
726                ENDVAL=`tail $OUTPUTFILE | grep -c 'PROGRAM MAIN: Execution ended Normally'`
727                touch $RUNLOG
728                if test -f run.log_tmp ; then cat run.log_tmp >> $RUNLOG ; fi
729                echo "---------->> $OUTPUTFILE is up to date " >> $RUNLOG 2>&1
730              fi
731            fi
732            rm -f run.log_tmp
733            if [ $RETVAL -eq 0 -a $ENDVAL -gt 0 ] ; then
734                echo successful
735                printf '=> output from running in %s :\n' $1 1>&2
736                tail $RUNLOG | sed 's/^.*/> &/g' 1>&2
737                # === Reduce the size of the testing emails!
738                #cp $OUTPUTFILE $CDIR"/"$OUTPUTFILE
739                if test -s STDERR.0000 ; then cp STDERR.0000 $CDIR"/STDERR.0000" ; fi
740                return 0
741            elif [ $RETVAL -ne 0 -a $ENDVAL -gt 0 ] ; then
742                #-- for some weird cases (run is finihed but with error code)
743                echo 'finished with error (run:' $RETVAL ' end:' $ENDVAL ')'
744                printf '=> output from running in %s :\n' $1 1>&2
745                tail $RUNLOG | sed 's/^.*/> &/g' 1>&2
746              return 0              return 0
747          else          else
748              tail run.log              echo 'failed (run:' $RETVAL ' end:' $ENDVAL ')'
749              echo failed 1>&2              printf '=> output from running in %s :\n' $1 1>&2
750              cp run.log $CDIR"/run.log"              tail $RUNLOG | sed 's/^.*/> &/g' 1>&2
751                cp $RUNLOG $CDIR"/"$RUNLOG
752                if test -s STDERR.0000 ; then cp STDERR.0000 $CDIR"/STDERR.0000" ; fi
753              return 1              return 1
754          fi          fi
755      )      )
# Line 432  createcodelet() Line 759  createcodelet()
759  {  {
760      # create codelet for comparing model output      # create codelet for comparing model output
761    
762      echo -n "creating the comparison code...  "      printf "creating the comparison code (using CC=$CC)...  "
763      cat > tmp_cmpnum.c <<EOF      cat > tr_cmpnum.c <<EOF
764  #include <stdio.h>  #include <stdio.h>
765  #include <math.h>  #include <math.h>
766  int main( int argc, char** argv )  {  int main( int argc, char** argv )  {
767    int linnum,best;    int linnum,cmplin,best,lncnt;
768    double a,b,diff;    double a,b,abave,relerr;
769    best = -16;    best = -22;
770    while( 1 )  {    lncnt = 0;
771      while( 1 & ( (lncnt+=1) < 999 ) )  {
772      scanf("%d", &linnum);      scanf("%d", &linnum);
773      if (linnum == -1)  break;      if (linnum == -1)  break;
774      scanf("%lf", &a);  scanf("%lf", &b);      scanf("%lf", &a);  scanf("%lf", &b);
775      diff = 0.5*(fabs(a)+fabs(b));      abave = 0.5*(fabs(a)+fabs(b));
776      if (diff > 1.e-12) {      if ( abave == abave ) {
777        diff=fabs(a-b)/diff;        if (abave > 0.0) {
778        if (diff > 0.0) {          relerr=fabs(a-b)/abave;
779          linnum = (int)log10(diff);          if (relerr > 0.0) { cmplin = (int)rint(log10(relerr)); }
780          best = (best > linnum) ? best : linnum;          else { cmplin = -16 ; }
781        }          best = (best > cmplin) ? best : cmplin; }
782        else {        else { cmplin = -22 ; }
783          if (best == -16 && diff != 0)  best = -22;     /* printf("%d ; %lf ; %lf\n",cmplin,a,b); */
784        }        }
785      }     else {
786       /* printf("%lf ; %lf ; %lf\n",abave,a,b); */
787          break; }
788    }    }
789      if (lncnt == 999) best=-29;
790      if (linnum != -1) best=-99;
791    printf("%d\n", -best);    printf("%d\n", -best);
792    return 0;    return 0;
793  }  }
794  EOF  EOF
795      cc -o tmp_cmpnum tmp_cmpnum.c -lm      $CC -o tr_cmpnum tr_cmpnum.c -lm
796    
797      if [ -x ./tmp_cmpnum ]; then      if [ -x ./tr_cmpnum ]; then
798          echo "OK"          echo "OK"
799          return 0          return 0
800      else      else
801          echo          echo
802          echo "ERROR: failed to compile comparison code"          echo "ERROR: failed to compile comparison code -- please specify"
803            echo "  a C compiler using the CC environment variable."
804          exit 1          exit 1
805      fi      fi
806  }  }
# Line 479  formatresults() Line 812  formatresults()
812      nm=$1      nm=$1
813      printf '%s %s %s %s' $2 $3 $4 $5      printf '%s %s %s %s' $2 $3 $4 $5
814      shift; shift; shift; shift; shift;      shift; shift; shift; shift; shift;
815      printf '%3s' $@      listPrt=$@
816            listRes=`echo $listPrt | sed 's/>//' | sed 's/<//'`
817      if [ $1 = '--' ]; then      xx=`echo $listPrt | sed 's/.*>//' | sed 's/<.*//' | awk '{print $1}'`
818        printf '%3s' $listPrt
819    #   line below does not work on hp-ux_ia64 : do those substitutions later on
820    #   printf '%3s' $listPrt | sed 's/ 99/ --/g' | sed 's/  > />/' | sed 's/  < /</'
821    
822        if [ $xx = '..' ]; then
823            printf ' N/O '
824        elif [ $xx = '--' ]; then
825            printf ' N/O '
826        elif [ $xx = 99 ]; then
827          printf ' N/O '          printf ' N/O '
828      else      else
829          if [ $1 -gt 12 ]; then          if [ $xx -ge $MATCH_CRIT ]; then
830              printf ' pass'              printf ' pass'
831          else          else
832              printf ' FAIL'              printf ' FAIL'
# Line 492  formatresults() Line 834  formatresults()
834      fi      fi
835      printf '  %s' $nm      printf '  %s' $nm
836      printf '\n'      printf '\n'
       
 }  
   
 show_help()  
 {  
     cat - << EOF  
 $0 [-help] [-quick] [-verbose] dir1 [dir2] [...]  
   
  -help|-h      Show this help message  
  -quiet     Reduce the amount of output  
  -verbose   Produce copious amounts of output  
  -debug     Produce even more output which will mean nothing to most  
  -force     Do "make CLEAN" before compiling. This forces a complete rebuild.  
  -clean     Do "make CLEAN" after compiling and testing.  
  -cleanup   Aggresively removes all model output, executables and object files  
             and then exits. Use with care.  
837    
 Normal usage:  
  $0 *       Configure, compile, run and analyze in all experiment directories  
 EOF  
838  }  }
839    
840  scandirs()  scandirs()
841  {  {
842      if [ $# -eq 0 ]; then      if [ $# -eq 1 ]; then
843          for arg in * ; do          for arg in * ; do
844              test -d $arg/input && echo $arg              test -f $arg/$1 && echo $arg
845          done          done
846      else      else
847          echo $*          echo $*
848      fi      fi
849  }  }
850    
851    
852    check_eedata()
853    {
854        # check_eedata size.h eedata
855        if [ $# -eq 2 ] ; then
856          if test -f $1 -a -f $2 ; then
857          sx=`grep "^     & *nSx *=" $1 | sed "s/^     & *nSx *=//" | sed 's/, *$//'`
858          nx=`grep "^ *nTx *=" $2 | tail -1 | sed 's/^ *nTx *= *//' | sed "s/, *$//"`
859          if test "x$nx" = x ; then
860            rx=10
861          else
862            rx=`expr $sx % $nx`
863          fi
864          sy=`grep "^     & *nSy *=" $1 | sed "s/^     & *nSy *=//" | sed 's/, *$//'`
865          ny=`grep "^ *nTy *=" $2 | tail -1 | sed 's/^ *nTy *= *//' | sed "s/, *$//"`
866          if test "x$ny" = x ; then
867            ry=20
868          else
869            ry=`expr $sy % $ny`
870          fi
871          echo `expr $rx + $ry`
872        else
873          echo '-1'
874          fi
875        else
876          echo '-2'
877        fi
878    
879    }
880    
881  ###############################################################################  ###############################################################################
882    
883    
884  #  Default properties  #  Default properties
885  debug=0  debug=0
886  verbose=1  verbose=1
 clean=0  
 expts=''  
 # ieee=1  
887    
888  IEEE=  IEEE=true
889  if test "x$MITGCM_IEEE" != x ; then  if test "x$MITGCM_IEEE" != x ; then
890      IEEE=$MITGCM_IEEE      IEEE=$MITGCM_IEEE
891  fi  fi
892    GSL=f
893    
894  CLEANUP=f  CLEANUP=f
895    NORUN=f
896  QUICK=f  QUICK=f
897    NOMAKE=f
898  NOGENMAKE=f  NOGENMAKE=f
899  NOCLEAN=f  NOCLEAN=f
900  NODEPEND=f  NODEPEND=f
901    POSTCLEAN=0
902    
903  BASH=  BASH=
904  OPTFILE=NONE  OPTFILE=NONE
905  ADDRESSES=  ADDRESSES=
906  TESTDIRS=  TESTDIRS=
907    SKIPDIRS=
908  MPACKDIR="../tools/mpack-1.6"  MPACKDIR="../tools/mpack-1.6"
909  HAVE_MPACK=  HAVE_MPACK=
910  MPACK="$MPACKDIR/mpack"  MPACK=
911  COMMAND=  COMMAND=
912  MAKE=make  MKDEPEND=
913  MPI=f  if test "x$MAKE" = x ; then
914        MAKE=make
915    fi
916    if test "x$CC" = x ; then
917        CC=cc
918    fi
919    JOBS=
920    MPI=0
921    MPI_MFILE=
922    MULTI_THREAD=f
923    OUTDIR=
924    DELDIR=
925    USE_R4=
926    
927  ADM=  ADM=
928    OADM=
929    
930    # list of pTracers to check for monitor output
931    PTRACERS_NUM="1 2 3 4 5"
932    
933    MATCH_CRIT=10
934    
935  echo -n "parsing options...  "  printf "parsing options...  "
936    
937  ac_prev=  ac_prev=
938  for ac_option ; do  for ac_option ; do
# Line 574  for ac_option ; do Line 945  for ac_option ; do
945      fi      fi
946    
947      ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`      ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
948        
949      case $ac_option in      case $ac_option in
950                    
951          -help | --help | -h | --h)          -help | --help | -h | --h) usage ;;
952              usage ;;  
953                    -optfile | --optfile | -of | --of) ac_prev=OPTFILE ;;
954          -optfile | --optfile | -of | --of)          -optfile=* | --optfile=* | -of=* | --of=*) OPTFILE=$ac_optarg ;;
955              ac_prev=OPTFILE ;;  
956          -optfile=* | --optfile=* | -of=* | --of=*)          -addr | --addr | -a | --a) ac_prev=ADDRESSES ;;
957              OPTFILE=$ac_optarg ;;          -addr=* | --addr=* | -a=* | --a=*) ADDRESSES=$ac_optarg ;;
958                    -mpackdir | --mpackdir | -mpd | --mpd) ac_prev=MPACKDIR ;;
959          -addr | --addr | -a | --a)          -mpackdir=* | --mpackdir=* | -mpd=* | --mpd=*) MPACKDIR=$ac_optarg ;;
960              ac_prev=ADDRESSES ;;  
961          -addr=* | --addr=*)          -tdir | --tdir | -t | --t) ac_prev=TESTDIRS ;;
962              ADDRESSES=$ac_optarg ;;          -tdir=* | --tdir=* | -t=* | --t=*) TESTDIRS=$ac_optarg ;;
963            -skipdir | --skipdir | -skd | --skd) ac_prev=SKIPDIRS ;;
964          -tdir | --tdir | -t | --t)          -skipdir=* | --skipdir=* | -skd=* | --skd=*) SKIPDIRS=$ac_optarg ;;
965              ac_prev=TESTDIRS ;;  
966          -tdir=* | --tdir=*)          -bash | --bash | -b | --b) ac_prev=BASH ;;
967              TESTDIRS=$ac_optarg ;;          -bash=* | --bash=* | -b=* | --b=*) BASH=$ac_optarg ;;
968    
969          -bash | --bash | -b | --b)          -command | --command | -c | --c) ac_prev=COMMAND ;;
970              ac_prev=BASH ;;          -command=* | --command=* | -c=* | --c=*) COMMAND=$ac_optarg ;;
971          -bash=* | --bash=*)  
972              BASH=$ac_optarg ;;          -makedepend | --makedepend | -md | --md) ac_prev=MKDEPEND ;;
973            -makedepend=* | --makedepend=* | -md=* | --md=*) MKDEPEND=$ac_optarg ;;
974          -command | --command | -c | --c)  
975              ac_prev=COMMAND ;;          -make | --make | -m | --m) ac_prev=MAKE ;;
976          -command=* | --command=*)          -make=* | --make=* | -m=* | --m=*) MAKE=$ac_optarg ;;
977              COMMAND=$ac_optarg ;;  
978            -odir | --odir) ac_prev=OUTDIR ;;
979          -make | --make | -m | --m)          -odir=* | --odir=*) OUTDIR=$ac_optarg ;;
980              ac_prev=MAKE ;;  
981          -make=* | --make=*)          -ptracers | --ptracers | -ptr | --ptr) ac_prev=PTRACERS_NUM ;;
982              MAKE=$ac_optarg ;;          -ptracers=* | --ptracers=* | -ptr=* | --ptr=*) PTRACERS_NUM=$ac_optarg ;;
983    
984          -clean | --clean)          -match | --match ) ac_prev=MATCH_CRIT ;;
985              CLEANUP=t ;;          -match=* | --match=* ) MATCH_CRIT=$ac_optarg ;;
986    
987          -quick | --quick | -q | --q)          -j | --j) ac_prev=JOBS ;;
988              QUICK=t ;;          -j=* | --j=*) JOBS=$ac_optarg ;;
         -nogenmake | --nogenmake | -ng | --ng)  
             NOGENMAKE=t ;;  
         -noclean | --noclean | -nc | --nc)  
             NOCLEAN=t ;;  
         -nodepend | --nodepend | -nd | --nd)  
             NODEPEND=t ;;  
989    
990          -mpi) MPI=t ;;          -clean | --clean) CLEANUP=t ; DELDIR=t ;;
991    
992            -norun | --norun | -nr | --nr) NORUN=t ;;
993            -runonly | --runonly | -ro | --ro) QUICK=t ; NOMAKE=t ;;
994            -quick | --quick | -q | --q) QUICK=t ;;
995            -nogenmake | --nogenmake | -ng | --ng) NOGENMAKE=t ;;
996            -noclean | --noclean | -nc | --nc) NOCLEAN=t ;;
997            -nodepend | --nodepend | -nd | --nd) NODEPEND=t ;;
998    
999            -postclean | --postclean | -pc | --pc) POSTCLEAN=2 ;;
1000            -deloutp | --deloutp | -do | --do) POSTCLEAN=1 ;;
1001    
1002            -mpi | --mpi) MPI=2 ;;
1003            -MPI | --MPI) ac_prev=MPI ;;
1004            -MPI=* | --MPI=*) MPI=$ac_optarg ;;
1005    
1006            -mfile | --mfile | -mf | --mf) ac_prev=MPI_MFILE ;;
1007            -mfile=* | --mfile=* | -mf=* | --mf=*) MPI_MFILE=$ac_optarg ;;
1008    
1009            -mth) MULTI_THREAD=t ;;
1010    
1011          -adm | -ad) ADM=t ;;          -adm | -ad) ADM=t ;;
1012            -oad) OADM=t; NODEPEND=t ;;
1013    
1014          -ieee) IEEE=true ;;          -ieee) IEEE=true ;;
1015          -noieee) IEEE= ;;          -noieee) IEEE= ;;
1016            -gsl) GSL=t ;;
1017    
1018          -verbose) verbose=2 ;;          -verbose) verbose=2 ;;
1019          -debug) debug=1 ;;          -debug) debug=1 ;;
1020          -quiet) verbose=0 ;;          -quiet) verbose=0 ;;
1021    
1022          -*)          -deldir | -dd) DELDIR=t ;;
1023              echo "Error: unrecognized option: "$ac_option  
1024              usage          -use_r4|-ur4) USE_R4=t ;;
1025              ;;  
1026                    -ts) TS=t;;
1027          *)          -papis) PAPIS=t;;
1028              echo "Error: unrecognized argument: "$ac_option          -pcls) PCL=t;;
1029              usage  
1030              ;;          -*) echo "Error: unrecognized option: "$ac_option
1031                        usage ;;
1032            *)  echo "Error: unrecognized argument: "$ac_option
1033                usage ;;
1034    
1035       esac       esac
1036        
1037  done  done
1038    
1039  if test "x$QUICK" = xt ; then  if test "x$QUICK" = xt ; then
# Line 653  if test "x$QUICK" = xt ; then Line 1042  if test "x$QUICK" = xt ; then
1042      NODEPEND=t      NODEPEND=t
1043  fi  fi
1044    
1045    #- check length of MPI machine file:
1046    if test "x$MPI" != x0 -a "x$MPI_MFILE" != x ; then
1047        if test -r $MPI_MFILE ; then
1048            nl=`wc -l $MPI_MFILE | awk '{print $1}'`
1049            if [ $nl -lt $MPI ] ; then
1050              echo "Error: need at least $MPI nodes (currently only $nl) in MPI_MFILE=$MPI_FILE"
1051              usage
1052            fi
1053            if [ $verbose -gt 1 ]; then
1054                echo " MPI_MFILE=$MPI_MFILE : $nl procs for MPI=$MPI run"
1055            fi
1056        else
1057              echo "Error: cannot access MPI_MFILE=$MPI_FILE"
1058              usage
1059        fi
1060    fi
1061    
1062    #- setting for forward or ADM testing
1063    if test "x$ADM" = xt ; then
1064        code_dir=code_ad
1065        inputdir=input_ad
1066        ref_outp="output_adm.txt"
1067        EXECUTABLE="mitgcmuv_ad"
1068    elif test "x$OADM" = xt ; then
1069        code_dir=code_oad
1070        inputdir=input_oad
1071        ref_outp="output_oadm.txt"
1072        EXECUTABLE="mitgcmuv_ad"
1073    else
1074        code_dir=code
1075        inputdir=input
1076        ref_outp="output.txt"
1077        EXECUTABLE="mitgcmuv"
1078    fi
1079    
1080    xx=`echo $TESTDIRS | awk '{print $1}'`
1081  if test "x$TESTDIRS" = x ; then  if test "x$TESTDIRS" = x ; then
1082      TESTDIRS=`scandirs`      LIST=`scandirs results/$ref_outp`
1083    elif test $xx = 'start_from' ; then
1084        xx=`echo $TESTDIRS | awk '{print $2}'`
1085        LIST=`scandirs results/$ref_outp | sed -n "/$xx/,$ p"`
1086    else
1087        #- expand group of experiments:
1088        LIST=" "
1089        for xx in $TESTDIRS
1090        do
1091          case $xx in
1092            'basic') LIST=${LIST}" aim.5l_cs hs94.128x64x5 ideal_2D_oce"
1093                     LIST=${LIST}" lab_sea tutorial_baroclinic_gyre"
1094                     LIST=${LIST}" tutorial_global_oce_latlon tutorial_plume_on_slope"
1095                    ;;
1096            'tutorials')
1097                     LIST=${LIST}" "`ls | grep 'tutorial_'` ;;
1098            *)       LIST=${LIST}" "$xx ;;
1099          esac
1100        done
1101  fi  fi
1102    #echo 'LIST='${LIST}'<'
1103    #- skip dirs, remove duplicate and non-directory:
1104    TESTDIRS=" "
1105    count=0
1106    for xx in $LIST
1107    do
1108        yy=`echo $SKIPDIRS | grep -c $xx`
1109        if test $yy = 0 ; then
1110            if test -d $xx ; then
1111                yy=`echo $TESTDIRS | grep -c $xx`
1112                if test $yy = 0 ; then TESTDIRS=${TESTDIRS}" "$xx ; fi
1113            else count=1 ;
1114                echo ""; echo -n " -- skip \"$xx\" (not a directory !)"
1115            fi
1116        else
1117            if test $count = 1 ; then echo -n ", \"$xx\""
1118            else count=1 ; echo "" ;  echo -n " skip: \"$xx\""
1119            fi
1120        fi
1121    done
1122    if test $count = 1 ; then echo "" ; echo -n " ... " ; fi
1123    #echo 'TESTDIRS='${TESTDIRS}'<'
1124    
1125  if test "x$OPTFILE" = xNONE -a "x$MITGCM_OF" != x ; then  if test "x$OPTFILE" = xNONE -a "x$MITGCM_OF" != x ; then
1126      OPTFILE=$MITGCM_OF      OPTFILE=$MITGCM_OF
1127  fi  fi
1128    
1129  if test "x$ADM" = xt -a "x$COMMAND" = x ; then  LOC_MFILE='tr_mpi_mfile'
1130      COMMAND="./mitgcmuv_ad > output.txt_adm 2>&1"  RUNLOG="run.tr_log"
1131  fi  OUTPUTFILE=$ref_outp
   
1132  if test "x$COMMAND" = x ; then  if test "x$COMMAND" = x ; then
1133      COMMAND="make output.txt"      COMMAND="./$EXECUTABLE > $OUTPUTFILE"
1134    fi
1135    if test "x$MPI" != x0 ; then
1136        OUTPUTFILE="STDOUT.0000"
1137  fi  fi
1138    
1139  echo "OK"  echo "OK (COMMAND= $COMMAND )"
1140    
1141    # set the Default List of output variables to be checked:
1142    #  (use default or load experiment-specific list from file "tr_checklist")
1143    # content : 1rst = main variable used to decide if it pass or FAIL
1144    #         others = number of matching digits to be printed in summary.txt
1145    if test "x$ADM" = x -a "x$OADM" = x; then
1146        DEF_CHECK_LIST='PS PS T+ S+ U+ V+ pt1+ pt2+ pt3+ pt4+ pt5+'
1147        EMPTY_RESULTS='.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..'
1148        LEN_CHECK_LIST=`echo $DEF_CHECK_LIST | sed 's/ [a-zA-Z0-9]*+/&mn &mx &av &sd/g' | awk '{print NF-1}'`
1149        ii=`echo $EMPTY_RESULTS | awk '{print NF}'`
1150        EMPTY_RESULTS=$EMPTY_RESULTS`expr $LEN_CHECK_LIST - $ii | awk 'BEGIN{FS=":"}{for(i=1;i<=$1;i++){printf "  ."}}'`
1151    else
1152        DEF_CHECK_LIST='Grad Cost Grad'
1153        EMPTY_RESULTS='.. ..'
1154        LEN_CHECK_LIST=`echo $DEF_CHECK_LIST | sed 's/ [a-zA-Z0-9]*+/&mn &mx &av &sd/g' | awk '{print NF-1}'`
1155    fi
1156    
1157  #  create the FORTRAN comparison code  #  create the FORTRAN comparison code
1158  createcodelet  if test -x tr_cmpnum ; then
1159        echo "skipping comparison code build"
1160    else
1161        createcodelet
1162    fi
1163    
1164  #  build the mpack utility  #  build the mpack utility (if ADDRESSES = NONE, do it to test the build)
1165  if test "x$ADDRESSES" = xNONE -o "x$ADDRESSES" = x ; then  if test "x$ADDRESSES" = x ; then
1166      echo "skipping mpack build"      echo "skipping mpack build"
1167  else  else
1168      build_mpack      build_mpack
1169  fi  fi
1170    
1171  #  Create a uniquely named directory to store results  #  Create a uniquely named directory to store results
1172    CMDLINE=$0
1173    for xx in "$@" ; do nw=`echo $xx | wc -w`
1174        if test $nw = '1' ; then CMDLINE="$CMDLINE $xx"
1175                            else CMDLINE="$CMDLINE '$xx'" ; fi
1176    done
1177    #for xx in "$@" ; do CMDLINE="$CMDLINE '$xx'" ; done
1178  MACH=`hostname`  MACH=`hostname`
1179  UNAMEA=`uname -a`  UNAMEA=`uname -a`
1180  DATE=`date +%Y%m%d`  DATE=`date +%Y%m%d`
1181  BASE="tr_"$MACH"_"$DATE"_"  BASE="tr_"$MACH"_"$DATE"_"
1182    if test "x$OUTDIR" != x ; then
1183        BASE="tr_"$OUTDIR"_"$DATE"_"
1184    else
1185        short_name=`hostname | sed 's/\..*$//'`
1186        BASE="tr_"$short_name"_"$DATE"_"
1187    fi
1188  DNUM=0  DNUM=0
1189  DRESULTS="$BASE$DNUM"  DRESULTS="$BASE$DNUM"
1190  while test -e $DRESULTS ; do  while test -e $DRESULTS ; do
# Line 699  if test "x$RETVAL" != x0 ; then Line 1198  if test "x$RETVAL" != x0 ; then
1198      exit 1      exit 1
1199  fi  fi
1200  SUMMARY="$DRESULTS/summary.txt"  SUMMARY="$DRESULTS/summary.txt"
 echo -n "Start time:  " >> $SUMMARY  
1201  start_date=`date`  start_date=`date`
1202  echo $start_date > $SUMMARY  echo $start_date > $SUMMARY
1203    echo 'run:' $CMDLINE >> $SUMMARY
1204    echo 'on :' $UNAMEA  >> $SUMMARY
1205    
1206  of_path=  of_path=
1207  if test "x$OPTFILE" != xNONE ; then  if test "x$OPTFILE" != xNONE ; then
# Line 725  if test "x$OPTFILE" != xNONE ; then Line 1225  if test "x$OPTFILE" != xNONE ; then
1225      fi      fi
1226  else  else
1227      echo >> $SUMMARY      echo >> $SUMMARY
1228      echo "No \"OPTFILE\" was explicitly specified by testreport," >> $SUMMARY      echo "No \"OPTFILE\" was specified ; genmake2 found and uses:" >> $SUMMARY
1229      echo "   so the genmake default will be used." >> $SUMMARY      #-note: to be filled later after 1rst run
1230  fi  fi
1231  echo  echo
1232  echo >> $SUMMARY  echo >> $SUMMARY
1233  if test "x$ADM" = x ; then  if test "x$ADM" = x -a "x$OADM" = x; then
1234      cat << EOF | tee -a $SUMMARY      if [ $MATCH_CRIT -lt 10 ] ;
1235                  T           S           U           V      then line_0="default  "$MATCH_CRIT ;
1236  G D M    c        m  s        m  s        m  s        m  s      else line_0="default "$MATCH_CRIT ; fi
1237  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-----"
1238  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"
1239  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  ."
1240        line_3="N n k u  2  i  a  a  d  i  a  a  d  i  a  a  d  i  a  a  d"
1241  EOF      line_4="2 d e n  d  n  x  n  .  n  x  n  .  n  x  n  .  n  x  n  ."
1242        for ii in $PTRACERS_NUM ; do
1243            line_0="$line_0  --PTR 0"$ii"--"
1244            line_1="$line_1        m  s"
1245            line_2="$line_2  m  m  e  ."
1246            line_3="$line_3  i  a  a  d"
1247            line_4="$line_4  n  x  n  ."
1248        done
1249        echo "$line_0" | tee -a $SUMMARY
1250        echo "$line_1" | tee -a $SUMMARY
1251        echo "$line_2" | tee -a $SUMMARY
1252        echo "$line_3" | tee -a $SUMMARY
1253        echo "$line_4" | tee -a $SUMMARY
1254        echo " "       | tee -a $SUMMARY
1255  else  else
1256      echo "ADJOINT=true" >> $SUMMARY      echo "ADJOINT=true" >> $SUMMARY
1257      echo >> $SUMMARY      echo >> $SUMMARY
1258        if [ $MATCH_CRIT -lt 10 ] ;
1259        then line_0="default     "$MATCH_CRIT ;
1260        else line_0="default    "$MATCH_CRIT ; fi
1261        echo "$line_0" | tee -a $SUMMARY
1262      cat << EOF | tee -a $SUMMARY      cat << EOF | tee -a $SUMMARY
1263  G D M    C  G  G D M    C  G
1264  E p a R  o  r  E p a R  o  r
# Line 750  N n k u  s  a Line 1267  N n k u  s  a
1267    
1268  EOF  EOF
1269  fi  fi
1270    echo "-------------------------------------------------------------------------------"
1271    
1272  #  ...and each test directory...  #  ...and each test directory...
1273  for dir in $TESTDIRS ; do  for dir in $TESTDIRS ; do
1274        
1275        # set builddir & rundir:
1276        builddir="build"
1277        if test ! -d $dir/$builddir ; then mkdir $dir/$builddir ; fi
1278        rundir="run"
1279        pfxdir="tr_$rundir"
1280        if test ! -d $dir/$rundir ; then
1281            rundir=$builddir
1282        fi
1283        CODE_DIR=$dir/$code_dir
1284        BUILD_DIR=$dir/$builddir
1285    
1286      #  Cleanup only!      #  Cleanup only!
1287      if test "x$CLEANUP" = xt ; then      if test "x$CLEANUP" = xt ; then
1288          if test -r $dir/build/Makefile ; then          echo -n '  --- dir:' $BUILD_DIR ': '
1289              ( cd $dir/build ; make CLEAN )          makeclean $BUILD_DIR
1290            (   cd $BUILD_DIR
1291                rm -f $EXECUTABLE *.bak
1292                rm -f genmake_state genmake_*optfile genmake.log
1293                rm -f SIZE.h.mpi genmake.tr_log make.tr_log
1294            )
1295            if test -d $dir/$rundir/CVS ; then
1296                echo -n '  --- dir:' $dir/$rundir ': '
1297                run_clean $dir/$rundir
1298          fi          fi
1299          if test -r $dir/input/Makefile ; then          trdir=`( cd $dir ; find . -type d -name "$pfxdir.*" -print | sed 's/^.\///')`
1300              ( cd $dir/input ; make CLEAN )          ttd=`echo $trdir | wc -w`
1301            if test $ttd != 0 ; then
1302                echo '  --- rm dir:' $trdir
1303                ( cd $dir ; rm -rf $trdir )
1304          fi          fi
1305          continue          continue
1306      fi      fi
1307    
1308      #  Verify that the testdir exists and contains previous      #  Verify that the testdir exists and contains previous
1309      #  results in the correct location--or skip this directory!      #  results in the correct location--or skip this directory!
1310      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  
1311      if test ! -r $fout ; then      if test ! -r $fout ; then
1312          echo "can't read \"$fout\" -- skipping $dir"          echo "can't read \"$fout\" -- skipping $dir"
1313          continue          continue
1314      fi      fi
1315    
1316      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  
1317    
1318      if test ! -r $CODE_DIR"/SIZE.h_mpi" -a "x$MPI" = "xt" ; then      if test "x$MPI" != "x0" ; then
1319          echo "can't find \"$CODE_DIR/SIZE.h_mpi\" -- skipping $dir"          if test -r $CODE_DIR"/SIZE.h_mpi" ; then
1320                #- create new SIZE.h with no more than '$MPI' Procs
1321                mk_mpi_size $CODE_DIR"/SIZE.h_mpi" $BUILD_DIR"/tr_size.mpi" $MPI
1322                LOC_NPROC=$?
1323                (   cd $BUILD_DIR
1324                    if test -r SIZE.h.mpi ; then
1325                        cmp tr_size.mpi SIZE.h.mpi > /dev/null 2>&1 ; RETVAL=$?
1326                    else RETVAL=1
1327                    fi
1328                    if test "x$RETVAL" = x0 ; then
1329                        rm -f tr_size.mpi
1330                    else
1331                        rm -f SIZE.h.mpi ; mv tr_size.mpi SIZE.h.mpi
1332                    fi
1333                )
1334            else
1335                echo "can't find \"$CODE_DIR/SIZE.h_mpi\" -- skipping $dir"
1336                continue
1337            fi
1338            if test "x$MPI_MFILE" != x ; then
1339                #- create new MPI machine-file with the right number of Procs
1340                rm -f $LOC_MFILE
1341                cat $MPI_MFILE | sort | uniq | head -$LOC_NPROC > $LOC_MFILE
1342                nl=`wc -l $LOC_MFILE | awk '{print $1}'`
1343                if [ $nl -lt $LOC_NPROC ] ; then
1344                    rm -f $LOC_MFILE
1345                    cat $MPI_MFILE | head -$LOC_NPROC > $LOC_MFILE
1346                    #sed -n "1,$LOC_NPROC p" $MPI_MFILE > $LOC_MFILE
1347                fi
1348                if [ $verbose -gt 1 ]; then
1349                    nl=`wc -l $LOC_MFILE | awk '{print $1}'`
1350                    echo " new LOC_MFILE=$LOC_MFILE : $nl procs for LOC_NPROC=$LOC_NPROC"
1351                fi
1352            fi
1353        fi
1354        if test ! -r $dir"/input/eedata.mth" -a "x$MULTI_THREAD" = "xt" ; then
1355            echo "can't find \"$dir/input/eedata.mth\" -- skipping $dir"
1356          continue          continue
1357      fi      fi
1358        if test "x$MPI" != "x0" -a "x$MULTI_THREAD" = "xt" ; then
1359            retv=`check_eedata $BUILD_DIR"/SIZE.h.mpi" $dir"/input/eedata.mth"`
1360            if test $retv != 0 ; then
1361                echo "input/eedata.mth tiling misfit -- skipping $dir"
1362                continue
1363            fi
1364        fi
1365    
1366        #  Check whether there are "extra runs" for this testdir
1367        extra_runs=
1368        if test "x$NORUN" = xf ; then
1369            ex_run_dirs=`( cd $dir ; echo $inputdir.* )`
1370        fi
1371        #echo "ex_run_dirs='$ex_run_dirs'"
1372        for exd in $ex_run_dirs ; do
1373            name=`echo $exd | sed -e "s/$inputdir\.//"`
1374            refExOut=`echo $ref_outp | sed "s/\./.${name}./"`
1375            outf="$dir/results/$refExOut"
1376            if test -f $outf -a -r $outf ; then
1377              if test "x$MULTI_THREAD" = "xt" ; then
1378                if test -r $dir"/"$exd"/eedata.mth" ; then
1379                  if test "x$MPI" = "x0" ; then
1380                    extra_runs="$extra_runs $name"
1381                  else
1382                    retv=`check_eedata $BUILD_DIR"/SIZE.h.mpi" $dir"/"$exd"/eedata.mth"`
1383                    if test $retv = 0 ; then
1384                        extra_runs="$extra_runs $name"
1385                    else
1386                        echo $exd"/eedata.mth tiling misfit -- skipping $dir"
1387                    fi
1388                  fi
1389                #else echo $dir"/"$exd"/eedata.mth: not found"
1390                fi
1391              else
1392                extra_runs="$extra_runs $name"
1393              fi
1394            fi
1395        done
1396    
     echo "-------------------------------------------------------------------------------"  
1397      echo      echo
1398      echo "Experiment:  $dir"      if test "x$extra_runs" = "x" ; then
1399           echo "Experiment:  $dir"
1400        else
1401           echo "Experiment:  $dir ; extra_runs=$extra_runs"
1402        fi
1403      echo      echo
1404      unset genmake makedepend make run      unset genmake makedepend make run
1405      results='-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --'      results=$EMPTY_RESULTS
1406    
1407      #  Create an output dir for each OPTFILE/tdir combination      #  Create an output dir for each OPTFILE/tdir combination
1408      rel_CDIR=$DRESULTS"/"$dir      locDIR=$DRESULTS"/"$dir
1409      mkdir $rel_CDIR      mkdir $locDIR
1410      CDIR=`pwd`"/$rel_CDIR"      CDIR=`pwd`"/$locDIR"
1411        
1412      if test "x$CLEANUP" = xt ; then      if test "x$NORUN" = xt ; then
1413          makeclean $dir/$builddir              run=N
1414            genmakemodel $dir/$builddir && genmake=Y \
1415                && makeclean $dir/$builddir \
1416                && symlink_mpifiles $dir $code_dir $builddir \
1417                && makedependmodel $dir/$builddir && makedepend=Y \
1418                && makemodel $dir/$builddir && make=Y
1419      else      else
1420          genmakemodel $dir/$builddir && genmake=Y \          genmakemodel $dir/$builddir && genmake=Y \
1421              && makeclean $dir/$builddir \              && makeclean $dir/$builddir \
1422              && symlink_mpifiles $dir $code_dir $builddir \              && symlink_mpifiles $dir $code_dir $builddir \
1423              && makedependmodel $dir/$builddir && makedepend=Y \              && makedependmodel $dir/$builddir && makedepend=Y \
1424              && makemodel $dir/$builddir && make=Y \              && makemodel $dir/$builddir && make=Y \
1425              && linkdata $use_seperate_build $dir/$rundir \              && run_clean $dir/$rundir \
1426                && linkdata $dir/$rundir $inputdir \
1427              && runmodel $dir/$rundir && run=Y \              && runmodel $dir/$rundir && run=Y \
1428              && results=`testoutput $dir $rundir`              && results=`testoutput_run $dir $rundir $ref_outp`
1429      fi      fi
1430            #echo "results='$results'"
1431      echo  
     if test "x$ADM" = x ; then  
1432          fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`          fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1433      else          echo 1>&2
1434          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
1435          fres=$fres"$results   $dir"          touch $locDIR"/summary.txt"
1436            echo "fresults='$fres'" | sed 's/ 99/ --/g' >> $locDIR"/summary.txt"
1437            echo "tdir='$dir'" >> $locDIR"/summary.txt"
1438            if test "x$ADM" = xt ; then
1439                head -1 $dir/$builddir/taf_ad.log >> $locDIR"/summary.txt"
1440                nerr=`grep -c 'TAF *.* ERROR ' $dir/$builddir/taf_ad.log`
1441                nwar=`grep -c 'TAF RECOMPUTATION *.* WARNING ' $dir/$builddir/taf_ad.log`
1442                echo " TAF reports $nerr Errors and $nwar Recomputation Warnings" \
1443                                    >> $locDIR"/summary.txt"
1444                grep -A3 'Seconds in section "ALL' $dir/$rundir/$OUTPUTFILE \
1445                                    >> $locDIR"/summary.txt"
1446            fi
1447    
1448            for ex in $extra_runs ; do
1449                unset run
1450                results=$EMPTY_RESULTS
1451                #  reference output file
1452                refExOut=`echo $ref_outp | sed "s/\./.${ex}./g"`
1453                #  Create an output dir for each OPTFILE/tdir.ex combination
1454                locDIR=$DRESULTS"/"$dir"."$ex
1455                mkdir $locDIR
1456                CDIR=`pwd`"/$locDIR"
1457                test ! -e "$dir/$pfxdir.$ex" && mkdir "$dir/$pfxdir.$ex"
1458                run_clean $dir/$pfxdir.$ex
1459                linkdata $dir/$pfxdir.$ex $inputdir.$ex $inputdir
1460                runmodel $dir/$pfxdir.$ex && run=Y \
1461                && results=`testoutput_run $dir $pfxdir.$ex $refExOut`
1462                fres=`formatresults $dir ${genmake:-N} ${makedepend:-N} ${make:-N} ${run:-N} $results`
1463                fres="$fres.$ex"
1464                echo 1>&2
1465                echo "$fres" | sed 's/ 99/ --/g' | sed 's/  > />/' | sed 's/  < /</' >> $SUMMARY
1466                touch $locDIR"/summary.txt"
1467                echo "fresults='$fres'" | sed 's/ 99/ --/g' >> $locDIR"/summary.txt"
1468                echo "tdir='$dir.$ex'" >> $locDIR"/summary.txt"
1469                if test "x$ADM" = xt ; then
1470                    grep -A3 'Seconds in section "ALL' $dir/$pfxdir.$ex/$OUTPUTFILE \
1471                                       >> $locDIR"/summary.txt"
1472                fi
1473                if test "x$POSTCLEAN" = x2 ; then
1474                    run_clean $dir/$pfxdir.$ex
1475                fi
1476            done
1477    
1478        if test -f $DRESULTS"/"genmake_state ; then : ; else
1479            if test -f $dir/$builddir/Makefile ; then
1480                mkOpt=`grep '^# OPTFILE=' $dir/$builddir/Makefile 2>/dev/null | head -1 | sed 's/^# //'`
1481                echo "from '$dir/$builddir/Makefile', extract:" > $DRESULTS/genmake_state
1482                sed -n '/^# executed by:/,+1 p' $dir/$builddir/Makefile >> $DRESULTS/genmake_state
1483                echo " $mkOpt" >> $DRESULTS/genmake_state
1484                if test "x$OPTFILE" = xNONE ; then
1485                    eval $mkOpt
1486                    sed "/^No \"OPTFILE\" was specified ; genmake2/a\  OPTFILE=${OPTFILE}"\
1487                            $SUMMARY > tr_0.tmp_log
1488                    RETVAL=$?
1489                    if test "x$RETVAL" = x0 ; then rm -f $SUMMARY
1490                            cp tr_0.tmp_log $SUMMARY
1491                    else rm -f tr_0.tmp_log
1492                    fi
1493                fi
1494                gmkLog=$dir/$builddir/genmake.log
1495                grep '^Get compiler version using:' $gmkLog > /dev/null 2>&1
1496                RETVAL=$?
1497                if test "x$RETVAL" = x0 ; then
1498                    echo "from '$gmkLog', extract compiler version:" >> $DRESULTS/genmake_state
1499                    sed -n '/Get compiler version/,/<-- compiler version/p' $gmkLog \
1500                           | grep -v '^... compiler version ' > tr_1.tmp_log
1501                    sed -n '1,/^$/p' tr_1.tmp_log | sed '/^$/d' | sed 's/^./ &/' \
1502                            >> $DRESULTS/genmake_state
1503                    rm -f tr_1.tmp_log
1504                fi
1505            fi
1506      fi      fi
1507      echo      #postclean $dir/$builddir
1508      echo "$fres" >> $SUMMARY      if test "x$POSTCLEAN" = x2 ; then
1509      echo "fresults='$fres'" > $CDIR"/summary.txt"          makeclean $dir/$builddir \
1510      echo "MACH='$MACH'" >> $CDIR"/summary.txt"              && run_clean $dir/$rundir
1511      echo "UNAMEA='$UNAMEA'" >> $CDIR"/summary.txt"      fi
1512      echo "DATE='$DATE'" >> $CDIR"/summary.txt"      if test "x$MPI" != x0 -a "x$MPI_MFILE" != x ; then rm -f $LOC_MFILE ; fi
1513      echo "tdir='$dir'" >> $CDIR"/summary.txt"  
       
1514      echo "-------------------------------------------------------------------------------"      echo "-------------------------------------------------------------------------------"
1515        
1516  done  done
1517    
1518  echo -n "Start time:  " >> $SUMMARY  printf "Start time:  " >> $SUMMARY
1519  echo $start_date >> $SUMMARY  echo "$start_date" >> $SUMMARY
1520  echo -n "End time:    " >> $SUMMARY  printf "End time:    " >> $SUMMARY
1521  date >> $SUMMARY  date >> $SUMMARY
1522    
1523  #  If addresses were supplied and mpack built successfully, then try  #  If addresses were supplied and mpack built successfully, then try
# Line 859  else Line 1528  else
1528      if test "x$HAVE_MPACK" = xt ; then      if test "x$HAVE_MPACK" = xt ; then
1529          tar -cf $DRESULTS".tar" $DRESULTS > /dev/null 2>&1 \          tar -cf $DRESULTS".tar" $DRESULTS > /dev/null 2>&1 \
1530              && gzip $DRESULTS".tar" \              && gzip $DRESULTS".tar" \
1531              && $MPACK -s MITgcm-test -m 1500000 $DRESULTS".tar.gz" $ADDRESSES              && $MPACK -s MITgcm-test -m 3555000 $DRESULTS".tar.gz" $ADDRESSES
1532          RETVAL=$?          RETVAL=$?
1533          if test "x$RETVAL" != x0 ; then          if test "x$RETVAL" != x0 ; then
1534              echo              echo
# Line 872  else Line 1541  else
1541              echo "An email containing results was sent to the following addresses:"              echo "An email containing results was sent to the following addresses:"
1542              echo "  \"$ADDRESSES\""              echo "  \"$ADDRESSES\""
1543              echo              echo
1544                test -f $DRESULTS".tar"  &&  rm -f $DRESULTS".tar"
1545                test -f $DRESULTS".tar.gz"  &&  rm -f $DRESULTS".tar.gz"
1546          fi          fi
         test -f $DRESULTS".tar"  &&  rm -f $DRESULTS".tar"  
         test -f $DRESULTS".tar.gz"  &&  rm -f $DRESULTS".tar.gz"  
1547      fi      fi
1548  fi  fi
1549    
1550  # rm -f tmp_cmpnum.f a.out  if test "x$QUICK" = xf -a "x$NORUN" = xf ; then
1551  rm -f tmp_cmpnum.c tmp_cmpnum      rm -f tr_cmpnum.c tr_cmpnum
1552    fi
1553    
1554  if test "x$CLEANUP" != xt ; then  if test "x$CLEANUP" != xt ; then
1555      cat $SUMMARY      cat $SUMMARY | sed 's/ \.  \.  \.  \.  \.  \.  \.  \.  \.  \.  \.  \. //'
1556      if test -e tr_out.txt ; then      if test -e tr_out.txt ; then
1557          mv tr_out.txt tr_out.txt.old          mv tr_out.txt tr_out.txt.old
1558      fi      fi
1559      cat $SUMMARY > tr_out.txt      cat $SUMMARY | sed '/^[YN] [YN] [YN] [YN]/ s/ \. //g' > tr_out.txt
1560    fi
1561    
1562    if test "x$DELDIR" = xt ; then
1563        rm -rf $DRESULTS
1564  fi  fi
1565    

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

  ViewVC Help
Powered by ViewVC 1.1.22