/[escript]/trunk/escript/src/Data.h
ViewVC logotype

Diff of /trunk/escript/src/Data.h

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 104 by jgs, Fri Dec 17 07:43:12 2004 UTC revision 151 by jgs, Thu Sep 22 01:55:00 2005 UTC
# Line 1  Line 1 
1  // $Id$  // $Id$
2  /*=============================================================================  /*
   
3   ******************************************************************************   ******************************************************************************
4   *                                                                            *   *                                                                            *
5   *       COPYRIGHT ACcESS 2004 -  All Rights Reserved                         *   *       COPYRIGHT ACcESS 2004 -  All Rights Reserved                         *
# Line 12  Line 11 
11   * person has a software license agreement with ACcESS.                       *   * person has a software license agreement with ACcESS.                       *
12   *                                                                            *   *                                                                            *
13   ******************************************************************************   ******************************************************************************
14    */
15    
16  ******************************************************************************/  /** \file Data.h */
17    
18  #ifndef DATA_H  #ifndef DATA_H
19  #define DATA_H  #define DATA_H
20    
21  #include "escript/Data/DataAbstract.h"  #include "escript/Data/DataAbstract.h"
22  #include "escript/Data/DataTagged.h"  #include "escript/Data/DataTagged.h"
23    #include "escript/Data/DataAlgorithm.h"
24  #include "escript/Data/FunctionSpace.h"  #include "escript/Data/FunctionSpace.h"
25  #include "escript/Data/BinaryOp.h"  #include "escript/Data/BinaryOp.h"
26  #include "escript/Data/UnaryOp.h"  #include "escript/Data/UnaryOp.h"
27    #include "escript/Data/DataException.h"
28    
29  extern "C" {  extern "C" {
30  #include "escript/Data/DataC.h"  #include "escript/Data/DataC.h"
# Line 39  extern "C" { Line 41  extern "C" {
41  #include <boost/python/tuple.hpp>  #include <boost/python/tuple.hpp>
42  #include <boost/python/numeric.hpp>  #include <boost/python/numeric.hpp>
43    
44    namespace escript {
45    
46    //
47    // Forward declaration for various implementations of Data.
48    class DataEmpty;
49    class DataConstant;
50    class DataTagged;
51    class DataExpanded;
52    
53  /**  /**
54     \brief     \brief
55     Data is essentially a factory class which creates the appropriate Data     Data creates the appropriate Data object for the given construction
56     object for the given construction arguments. It retains control over     arguments.
    the object created for the lifetime of the object.  
    The type of Data object referred to may change during the lifetime of  
    the Data object.  
57    
58     Description:     Description:
59     Data is essentially a factory class which creates the appropriate Data     Data is essentially a factory class which creates the appropriate Data
# Line 54  extern "C" { Line 62  extern "C" {
62     The type of Data object referred to may change during the lifetime of     The type of Data object referred to may change during the lifetime of
63     the Data object.     the Data object.
64  */  */
   
 namespace escript {  
   
 //  
 // Forward declaration for various implimentations of Data.  
 class DataEmpty;  
 class DataConstant;  
 class DataTagged;  
 class DataExpanded;  
   
65  class Data {  class Data {
66    
67    public:    public:
68    
69      // These typedefs allow function names to be cast to pointers
70      // to functions of the appropriate type when calling unaryOp etc.
71    typedef double (*UnaryDFunPtr)(double);    typedef double (*UnaryDFunPtr)(double);
72    typedef double (*BinaryDFunPtr)(double,double);    typedef double (*BinaryDFunPtr)(double,double);
73    
# Line 206  class Data { Line 206  class Data {
206         const boost::python::tuple& shape=boost::python::make_tuple(),         const boost::python::tuple& shape=boost::python::make_tuple(),
207         const FunctionSpace& what=FunctionSpace(),         const FunctionSpace& what=FunctionSpace(),
208         bool expanded=false);         bool expanded=false);
209      /**
210         \brief
211         Destructor
212      */
213      ~Data();
214    
215    /**    /**
216       \brief       \brief
# Line 220  class Data { Line 225  class Data {
225    
226    /**    /**
227       \brief       \brief
228         Return the values of all data-points as a single python numarray object.
229      */
230      const boost::python::numeric::array
231      convertToNumArray();
232    
233      /**
234         \brief
235         Return the values of all data-points for the given sample as a single python numarray object.
236      */
237      const boost::python::numeric::array
238      convertToNumArrayFromSampleNo(int sampleNo);
239    
240      /**
241         \brief
242         Return the value of the specified data-point as a single python numarray object.
243      */
244      const boost::python::numeric::array
245      convertToNumArrayFromDPNo(int sampleNo,
246                                int dataPointNo);
247    
248      /**
249         \brief
250         Fills the expanded Data object from values of a python numarray object.
251      */
252      void
253      fillFromNumArray(const boost::python::numeric::array);
254    
255      /**
256         \brief
257         Return the tag number associated with the given data-point.
258    
259         The data-point number here corresponds to the data-point number in the
260         numarray returned by convertToNumArray.
261      */
262      int
263      getTagNumber(int dpno);
264    
265      /**
266         \brief
267       Return the C wrapper for the Data object.       Return the C wrapper for the Data object.
268    */    */
269    escriptDataC    escriptDataC
# Line 397  class Data { Line 441  class Data {
441    
442    /**    /**
443       \brief       \brief
444         Assign the given value to the data-points referenced by the given
445         reference number.
446    
447         The value supplied is a python numarray object.  The data from this numarray
448         is unpacked into a DataArray, and this is used to set the corresponding
449         data-points in the underlying Data object.
450    
451         If the underlying Data object cannot be accessed via reference numbers, an
452         exception will be thrown.
453    
454         \param ref - Input - reference number.
455         \param value - Input - value to assign to data-points associated with
456                                the given reference number.
457      */
458      void
459      setRefValue(int ref,
460                  const boost::python::numeric::array& value);
461    
462      /**
463         \brief
464         Return the values associated with the data-points referenced by the given
465         reference number.
466    
467         The value supplied is a python numarray object. The data from the corresponding
468         data-points in this Data object are packed into the given numarray object.
469    
470         If the underlying Data object cannot be accessed via reference numbers, an
471         exception will be thrown.
472    
473         \param ref - Input - reference number.
474         \param value - Output - object to receive values from data-points
475                                 associated with the given reference number.
476      */
477      void
478      getRefValue(int ref,
479                  boost::python::numeric::array& value);
480    
481      /**
482         \brief
483       Return a view into the data for the data point specified.       Return a view into the data for the data point specified.
484       NOTE: Construction of the DataArrayView is a relatively expensive       NOTE: Construction of the DataArrayView is a relatively expensive
485       operation.       operation.
# Line 422  class Data { Line 505  class Data {
505       \brief       \brief
506       Return the data point shape as a tuple of integers.       Return the data point shape as a tuple of integers.
507    */    */
508    boost::python::tuple    const boost::python::tuple
509    getShapeTuple() const;    getShapeTuple() const;
510    
511    /**    /**
# Line 459  class Data { Line 542  class Data {
542       cannot be converted to a DataTagged object.       cannot be converted to a DataTagged object.
543       \param tagKey - Input - Integer key.       \param tagKey - Input - Integer key.
544       \param value - Input - Value to associate with given key.       \param value - Input - Value to associate with given key.
      Note: removed for now - this version not needed, and breaks escript.cpp  
545    */    */
   /*  
546    void    void
547    setTaggedValue(int tagKey,    setTaggedValueFromCPP(int tagKey,
548                   const DataArrayView& value);                          const DataArrayView& value);
   */  
549    
550    /**    /**
551      \brief      \brief
# Line 483  class Data { Line 563  class Data {
563       \brief       \brief
564       Interpolates this onto the given functionspace and returns       Interpolates this onto the given functionspace and returns
565       the result as a Data object.       the result as a Data object.
566         *
567    */    */
568    Data    Data
569    interpolate(const FunctionSpace& functionspace) const;    interpolate(const FunctionSpace& functionspace) const;
# Line 491  class Data { Line 572  class Data {
572       \brief       \brief
573       Calculates the gradient of the data at the data points of functionspace.       Calculates the gradient of the data at the data points of functionspace.
574       If functionspace is not present the function space of Function(getDomain()) is used.       If functionspace is not present the function space of Function(getDomain()) is used.
575         *
576    */    */
577    Data    Data
578    gradOn(const FunctionSpace& functionspace) const;    gradOn(const FunctionSpace& functionspace) const;
# Line 501  class Data { Line 583  class Data {
583    /**    /**
584       \brief       \brief
585       Calculate the integral over the function space domain.       Calculate the integral over the function space domain.
586         *
587    */    */
588    boost::python::numeric::array    boost::python::numeric::array
589    integrate() const;    integrate() const;
# Line 508  class Data { Line 591  class Data {
591    /**    /**
592       \brief       \brief
593       Return a Data with a 1 for +ive values and a 0 for 0 or -ive values.       Return a Data with a 1 for +ive values and a 0 for 0 or -ive values.
594         *
595    */    */
596    Data    Data
597    wherePositive() const;    wherePositive() const;
# Line 515  class Data { Line 599  class Data {
599    /**    /**
600       \brief       \brief
601       Return a Data with a 1 for -ive values and a 0 for +ive or 0 values.       Return a Data with a 1 for -ive values and a 0 for +ive or 0 values.
602         *
603    */    */
604    Data    Data
605    whereNegative() const;    whereNegative() const;
# Line 522  class Data { Line 607  class Data {
607    /**    /**
608       \brief       \brief
609       Return a Data with a 1 for +ive or 0 values and a 0 for -ive values.       Return a Data with a 1 for +ive or 0 values and a 0 for -ive values.
610         *
611    */    */
612    Data    Data
613    whereNonNegative() const;    whereNonNegative() const;
# Line 529  class Data { Line 615  class Data {
615    /**    /**
616       \brief       \brief
617       Return a Data with a 1 for -ive or 0 values and a 0 for +ive values.       Return a Data with a 1 for -ive or 0 values and a 0 for +ive values.
618         *
619    */    */
620    Data    Data
621    whereNonPositive() const;    whereNonPositive() const;
# Line 536  class Data { Line 623  class Data {
623    /**    /**
624       \brief       \brief
625       Return a Data with a 1 for 0 values and a 0 for +ive or -ive values.       Return a Data with a 1 for 0 values and a 0 for +ive or -ive values.
626         *
627    */    */
628    Data    Data
629    whereZero() const;    whereZero() const;
# Line 543  class Data { Line 631  class Data {
631    /**    /**
632       \brief       \brief
633       Return a Data with a 0 for 0 values and a 1 for +ive or -ive values.       Return a Data with a 0 for 0 values and a 1 for +ive or -ive values.
634         *
635    */    */
636    Data    Data
637    whereNonZero() const;    whereNonZero() const;
638    
639    /**    /**
640       \brief       \brief
641         Return the maximum absolute value of this Data object.
642         *
643      */
644      double
645      Lsup() const;
646    
647      /**
648         \brief
649         Return the minimum absolute value of this Data object.
650         *
651      */
652      double
653      Linf() const;
654    
655      /**
656         \brief
657         Return the maximum value of this Data object.
658         *
659      */
660      double
661      sup() const;
662    
663      /**
664         \brief
665         Return the minimum value of this Data object.
666         *
667      */
668      double
669      inf() const;
670    
671      /**
672         \brief
673         Return the absolute value of each data point of this Data object.
674         *
675      */
676      Data
677      abs() const;
678    
679      /**
680         \brief
681         Return the maximum value of each data point of this Data object.
682         *
683      */
684      Data
685      maxval() const;
686    
687      /**
688         \brief
689         Return the minimum value of each data point of this Data object.
690         *
691      */
692      Data
693      minval() const;
694    
695      /**
696         \brief
697         Return the (sample number, data-point number) of the data point with
698         the minimum value in this Data object.
699      */
700      const boost::python::tuple
701      mindp() const;
702    
703      void
704      calc_mindp(int& SampleNo,
705                 int& DataPointNo) const;
706    
707      /**
708         \brief
709         Return the length of each data point of this Data object.
710         sqrt(sum(A[i,j,k,l]^2))
711         *
712      */
713      Data
714      length() const;
715    
716      /**
717         \brief
718         Return the sign of each data point of this Data object.
719         -1 for negative values, zero for zero values, 1 for positive values.
720         *
721      */
722      Data
723      sign() const;
724    
725      /**
726         \brief
727         Transpose each data point of this Data object around the given axis.
728         --* not implemented yet *--
729         *
730      */
731      Data
732      transpose(int axis) const;
733    
734      /**
735         \brief
736         Calculate the trace of each data point of this Data object.
737         sum(A[i,i,i,i])
738         *
739      */
740      Data
741      trace() const;
742    
743      /**
744         \brief
745       Return the sin of each data point of this Data object.       Return the sin of each data point of this Data object.
746         *
747    */    */
748    Data    Data
749    sin() const;    sin() const;
# Line 557  class Data { Line 751  class Data {
751    /**    /**
752       \brief       \brief
753       Return the cos of each data point of this Data object.       Return the cos of each data point of this Data object.
754         *
755    */    */
756    Data    Data
757    cos() const;    cos() const;
# Line 564  class Data { Line 759  class Data {
759    /**    /**
760       \brief       \brief
761       Return the tan of each data point of this Data object.       Return the tan of each data point of this Data object.
762         *
763    */    */
764    Data    Data
765    tan() const;    tan() const;
766    
767    /**    /**
768       \brief       \brief
769       Return the log to base 10 of each data point of this Data object.       Return the asin of each data point of this Data object.
770         *
771    */    */
772    Data    Data
773    log() const;    asin() const;
774    
775    /**    /**
776       \brief       \brief
777       Return the natural log of each data point of this Data object.       Return the acos of each data point of this Data object.
778         *
779    */    */
780    Data    Data
781    ln() const;    acos() const;
782    
783    /**    /**
784       \brief       \brief
785       Return the maximum absolute value of this Data object.       Return the atan of each data point of this Data object.
786         *
787    */    */
788    double    Data
789    Lsup() const;    atan() const;
790    
791    /**    /**
792       \brief       \brief
793       Return the maximum value of this Data object.       Return the sinh of each data point of this Data object.
794         *
795    */    */
796    double    Data
797    sup() const;    sinh() const;
798    
799    /**    /**
800       \brief       \brief
801       Return the minimum value of this Data object.       Return the cosh of each data point of this Data object.
802         *
803    */    */
804    double    Data
805    inf() const;    cosh() const;
806    
807    /**    /**
808       \brief       \brief
809       Return the absolute value of each data point of this Data object.       Return the tanh of each data point of this Data object.
810         *
811    */    */
812    Data    Data
813    abs() const;    tanh() const;
814    
815    /**    /**
816       \brief       \brief
817       Return the maximum value of each data point of this Data object.       Return the asinh of each data point of this Data object.
818         *
819    */    */
820    Data    Data
821    maxval() const;    asinh() const;
822    
823    /**    /**
824       \brief       \brief
825       Return the minimum value of each data point of this Data object.       Return the acosh of each data point of this Data object.
826         *
827    */    */
828    Data    Data
829    minval() const;    acosh() const;
830    
831    /**    /**
832       \brief       \brief
833       Return the length of each data point of this Data object.       Return the atanh of each data point of this Data object.
834       sqrt(sum(A[i,j,k,l]^2))       *
835    */    */
836    Data    Data
837    length() const;    atanh() const;
838    
839    /**    /**
840       \brief       \brief
841       Return the sign of each data point of this Data object.       Return the log to base 10 of each data point of this Data object.
842       -1 for negative values, zero for zero values, 1 for positive values.       *
843    */    */
844    Data    Data
845    sign() const;    log() const;
846    
847    /**    /**
848      \transpose       \brief
849      Transpose each data point of this Data object around the given axis.       Return the natural log of each data point of this Data object.
850         *
851    */    */
852    Data    Data
853    transpose(int axis) const;    ln() const;
854    
855    /**    /**
856      \trace       \brief
857      Calculate the trace of each data point of this Data object.       Return the exponential function of each data point of this Data object.
858      sum(A[i,i,i,i])       *
859    */    */
860    Data    Data
861    trace() const;    exp() const;
862    
863    /**    /**
864      \exp       \brief
865      Return the exponential function of each data point of this Data object.       Return the square root of each data point of this Data object.
866         *
867    */    */
868    Data    Data
869    exp() const;    sqrt() const;
870    
871    /**    /**
872      \sqrt       \brief
873      Return the square root of each data point of this Data object.       Return the negation of each data point of this Data object.
874         *
875    */    */
876    Data    Data
877    sqrt() const;    neg() const;
878    
879      /**
880         \brief
881         Return the identity of each data point of this Data object.
882         Simply returns this object unmodified.
883         *
884      */
885      Data
886      pos() const;
887    
888    /**    /**
889       \brief       \brief
890       Return the given power of each data point of this Data object.       Return the given power of each data point of this Data object.
891    
892         \param right Input - the power to raise the object to.
893         *
894    */    */
895    Data    Data
896    powD(const Data& right) const;    powD(const Data& right) const;
897    
898      /**
899         \brief
900         Return the given power of each data point of this boost python object.
901        
902         \param right Input - the power to raise the object to.
903         *
904       */
905    Data    Data
906    powO(const boost::python::object& right) const;    powO(const boost::python::object& right) const;
907    
908    /**    /**
909      \brief       \brief
910      writes the object to a file in the DX file format       writes the object to a file in the DX file format
911    */    */
912    void    void
913    saveDX(std::string fileName) const;    saveDX(std::string fileName) const;
914    
915    /**    /**
916      \brief       \brief
917      Return the negation of each data point of this Data object.       writes the object to a file in the VTK file format
   */  
   Data  
   neg() const;  
   
   /**  
     \brief  
     Return the identity of each data point of this Data object.  
     Simply returns this object unmodified.  
918    */    */
919    Data    void
920    pos() const;    saveVTK(std::string fileName) const;
921    
922    /**    /**
923       \brief       \brief
924       Overloaded operator +=       Overloaded operator +=
925       \param right - Input - The right hand side.       \param right - Input - The right hand side.
926         *
927    */    */
928    Data& operator+=(const Data& right);    Data& operator+=(const Data& right);
929    Data& operator+=(const boost::python::object& right);    Data& operator+=(const boost::python::object& right);
# Line 713  class Data { Line 932  class Data {
932       \brief       \brief
933       Overloaded operator -=       Overloaded operator -=
934       \param right - Input - The right hand side.       \param right - Input - The right hand side.
935         *
936    */    */
937    Data& operator-=(const Data& right);    Data& operator-=(const Data& right);
938    Data& operator-=(const boost::python::object& right);    Data& operator-=(const boost::python::object& right);
# Line 721  class Data { Line 941  class Data {
941       \brief       \brief
942       Overloaded operator *=       Overloaded operator *=
943       \param right - Input - The right hand side.       \param right - Input - The right hand side.
944         *
945    */    */
946    Data& operator*=(const Data& right);    Data& operator*=(const Data& right);
947    Data& operator*=(const boost::python::object& right);    Data& operator*=(const boost::python::object& right);
# Line 729  class Data { Line 950  class Data {
950       \brief       \brief
951       Overloaded operator /=       Overloaded operator /=
952       \param right - Input - The right hand side.       \param right - Input - The right hand side.
953         *
954    */    */
955    Data& operator/=(const Data& right);    Data& operator/=(const Data& right);
956    Data& operator/=(const boost::python::object& right);    Data& operator/=(const boost::python::object& right);
# Line 762  class Data { Line 984  class Data {
984       \brief       \brief
985       Copies slice from value into this Data object.       Copies slice from value into this Data object.
986    
      \description  
987       Implements the [] set operator in python.       Implements the [] set operator in python.
988       Calls setSlice.       Calls setSlice.
989    
# Line 795  class Data { Line 1016  class Data {
1016       Return a Data object containing the specified slice of       Return a Data object containing the specified slice of
1017       this Data object.       this Data object.
1018       \param region - Input - Region to copy.       \param region - Input - Region to copy.
1019         *
1020    */    */
1021    Data    Data
1022    getSlice(const DataArrayView::RegionType& region) const;    getSlice(const DataArrayView::RegionType& region) const;
# Line 805  class Data { Line 1027  class Data {
1027       Data object.       Data object.
1028       \param value - Input - Data to copy from.       \param value - Input - Data to copy from.
1029       \param region - Input - Region to copy.       \param region - Input - Region to copy.
1030         *
1031    */    */
1032    void    void
1033    setSlice(const Data& value,    setSlice(const Data& value,
1034             const DataArrayView::RegionType& region);             const DataArrayView::RegionType& region);
1035    
1036      /**
1037         \brief
1038         Archive the current Data object to the given file.
1039         \param fileName - Input - file to archive to.
1040      */
1041      void
1042      archiveData(const std::string fileName);
1043    
1044      /**
1045         \brief
1046         Extract the Data object archived in the given file, overwriting
1047         the current Data object.
1048         Note - the current object must be of type DataEmpty.
1049         \param fileName - Input - file to extract from.
1050         \param fspace - Input - a suitable FunctionSpace descibing the data.
1051      */
1052      void
1053      extractData(const std::string fileName,
1054                  const FunctionSpace& fspace);
1055    
1056   protected:   protected:
1057    
1058   private:   private:
# Line 830  class Data { Line 1073  class Data {
1073    /**    /**
1074       \brief       \brief
1075       Perform the specified reduction algorithm on every element of every data point in       Perform the specified reduction algorithm on every element of every data point in
1076       this Data object and return the single double value result.       this Data object according to the given function and return the single value result.
1077    */    */
1078    template <class UnaryFunction>    template <class BinaryFunction>
1079    inline    inline
1080    double    double
1081    algorithm(UnaryFunction operation) const;    algorithm(BinaryFunction operation,
1082                double initial_value) const;
1083    
1084      /**
1085         \brief
1086         Reduce each data-point in this Data object using the given operation. Return a Data
1087         object with the same number of data-points, but with each data-point containing only
1088         one value - the result of the reduction operation on the corresponding data-point in
1089         this Data object
1090      */
1091      template <class BinaryFunction>
1092      inline
1093      Data
1094      dp_algorithm(BinaryFunction operation,
1095                   double initial_value) const;
1096    
1097    /**    /**
1098       \brief       \brief
# Line 902  class Data { Line 1159  class Data {
1159    // pointer to the actual data object    // pointer to the actual data object
1160    boost::shared_ptr<DataAbstract> m_data;    boost::shared_ptr<DataAbstract> m_data;
1161    
1162      //
1163      // pointer to the internal profiling data
1164      struct profDataEntry *profData;
1165    
1166  };  };
1167    
1168  template <class IValueType>  template <class IValueType>
# Line 1197  Data::unaryOp(UnaryFunction operation) Line 1458  Data::unaryOp(UnaryFunction operation)
1458    object (*this) is a rank n Data object, and returned object is a scalar.    object (*this) is a rank n Data object, and returned object is a scalar.
1459    Calls escript::algorithm.    Calls escript::algorithm.
1460  */  */
1461  template <class UnaryFunction>  template <class BinaryFunction>
1462  inline  inline
1463  double  double
1464  Data::algorithm(UnaryFunction operation) const  Data::algorithm(BinaryFunction operation, double initial_value) const
1465  {  {
1466    if (isExpanded()) {    if (isExpanded()) {
1467      DataExpanded* leftC=dynamic_cast<DataExpanded*>(m_data.get());      DataExpanded* leftC=dynamic_cast<DataExpanded*>(m_data.get());
1468      EsysAssert((leftC!=0), "Programming error - casting to DataExpanded.");      EsysAssert((leftC!=0), "Programming error - casting to DataExpanded.");
1469      return escript::algorithm(*leftC,operation);      return escript::algorithm(*leftC,operation,initial_value);
1470    } else if (isTagged()) {    } else if (isTagged()) {
1471      DataTagged* leftC=dynamic_cast<DataTagged*>(m_data.get());      DataTagged* leftC=dynamic_cast<DataTagged*>(m_data.get());
1472      EsysAssert((leftC!=0), "Programming error - casting to DataTagged.");      EsysAssert((leftC!=0), "Programming error - casting to DataTagged.");
1473      return escript::algorithm(*leftC,operation);      return escript::algorithm(*leftC,operation,initial_value);
1474    } else if (isConstant()) {    } else if (isConstant()) {
1475      DataConstant* leftC=dynamic_cast<DataConstant*>(m_data.get());      DataConstant* leftC=dynamic_cast<DataConstant*>(m_data.get());
1476      EsysAssert((leftC!=0), "Programming error - casting to DataConstant.");      EsysAssert((leftC!=0), "Programming error - casting to DataConstant.");
1477      return escript::algorithm(*leftC,operation);      return escript::algorithm(*leftC,operation,initial_value);
1478    }    }
1479    return 0;    return 0;
1480  }  }
# Line 1226  Data::algorithm(UnaryFunction operation) Line 1487  Data::algorithm(UnaryFunction operation)
1487    rank 0 Data object.    rank 0 Data object.
1488    Calls escript::dp_algorithm.    Calls escript::dp_algorithm.
1489  */  */
1490  template <class UnaryFunction>  template <class BinaryFunction>
1491  inline  inline
1492  Data  Data
1493  dp_algorithm(const Data& data,  Data::dp_algorithm(BinaryFunction operation, double initial_value) const
              UnaryFunction operation)  
1494  {  {
1495    Data result(0,DataArrayView::ShapeType(),data.getFunctionSpace(),data.isExpanded());    Data result(0,DataArrayView::ShapeType(),getFunctionSpace(),isExpanded());
1496    if (data.isExpanded()) {    if (isExpanded()) {
1497      DataExpanded* dataE=dynamic_cast<DataExpanded*>(data.m_data.get());      DataExpanded* dataE=dynamic_cast<DataExpanded*>(m_data.get());
1498      DataExpanded* resultE=dynamic_cast<DataExpanded*>(result.m_data.get());      DataExpanded* resultE=dynamic_cast<DataExpanded*>(result.m_data.get());
1499      EsysAssert((dataE!=0), "Programming error - casting data to DataExpanded.");      EsysAssert((dataE!=0), "Programming error - casting data to DataExpanded.");
1500      EsysAssert((resultE!=0), "Programming error - casting result to DataExpanded.");      EsysAssert((resultE!=0), "Programming error - casting result to DataExpanded.");
1501      escript::dp_algorithm(*dataE,*resultE,operation);      escript::dp_algorithm(*dataE,*resultE,operation,initial_value);
1502    } else if (data.isTagged()) {    } else if (isTagged()) {
1503      DataTagged* dataT=dynamic_cast<DataTagged*>(data.m_data.get());      DataTagged* dataT=dynamic_cast<DataTagged*>(m_data.get());
1504      DataTagged* resultT=dynamic_cast<DataTagged*>(result.m_data.get());      DataTagged* resultT=dynamic_cast<DataTagged*>(result.m_data.get());
1505      EsysAssert((dataT!=0), "Programming error - casting data to DataTagged.");      EsysAssert((dataT!=0), "Programming error - casting data to DataTagged.");
1506      EsysAssert((resultT!=0), "Programming error - casting result to DataTagged.");      EsysAssert((resultT!=0), "Programming error - casting result to DataTagged.");
1507      escript::dp_algorithm(*dataT,*resultT,operation);      escript::dp_algorithm(*dataT,*resultT,operation,initial_value);
1508    } else if (data.isConstant()) {    } else if (isConstant()) {
1509      DataConstant* dataC=dynamic_cast<DataConstant*>(data.m_data.get());      DataConstant* dataC=dynamic_cast<DataConstant*>(m_data.get());
1510      DataConstant* resultC=dynamic_cast<DataConstant*>(result.m_data.get());      DataConstant* resultC=dynamic_cast<DataConstant*>(result.m_data.get());
1511      EsysAssert((dataC!=0), "Programming error - casting data to DataConstant.");      EsysAssert((dataC!=0), "Programming error - casting data to DataConstant.");
1512      EsysAssert((resultC!=0), "Programming error - casting result to DataConstant.");      EsysAssert((resultC!=0), "Programming error - casting result to DataConstant.");
1513      escript::dp_algorithm(*dataC,*resultC,operation);      escript::dp_algorithm(*dataC,*resultC,operation,initial_value);
1514    }    }
1515    return result;    return result;
1516  }  }

Legend:
Removed from v.104  
changed lines
  Added in v.151

  ViewVC Help
Powered by ViewVC 1.1.26