/[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

trunk/esys2/escript/src/Data/Data.h revision 97 by jgs, Tue Dec 14 05:39:33 2004 UTC trunk/escript/src/Data.h revision 876 by ksteube, Thu Oct 19 03:50:23 2006 UTC
# Line 1  Line 1 
1  // $Id$  // $Id$
2  /*=============================================================================  /*
3     ************************************************************
4   ******************************************************************************   *          Copyright 2006 by ACcESS MNRF                   *
5   *                                                                            *   *                                                          *
6   *       COPYRIGHT ACcESS 2004 -  All Rights Reserved                         *   *              http://www.access.edu.au                    *
7   *                                                                            *   *       Primary Business: Queensland, Australia            *
8   * This software is the property of ACcESS.  No part of this code             *   *  Licensed under the Open Software License version 3.0    *
9   * may be copied in any form or by any means without the expressed written    *   *     http://www.opensource.org/licenses/osl-3.0.php       *
10   * consent of ACcESS.  Copying, use or modification of this software          *   *                                                          *
11   * by any unauthorised person is illegal unless that                          *   ************************************************************
12   * person has a software license agreement with ACcESS.                       *  */
  *                                                                            *  
  ******************************************************************************  
13    
14  ******************************************************************************/  /** \file Data.h */
15    
16  #ifndef DATA_H  #ifndef DATA_H
17  #define DATA_H  #define DATA_H
18    #include "system_dep.h"
19    
20  #include "escript/Data/DataAbstract.h"  #include "DataAbstract.h"
21  #include "escript/Data/DataTagged.h"  #include "DataAlgorithm.h"
22  #include "escript/Data/FunctionSpace.h"  #include "FunctionSpace.h"
23  #include "escript/Data/BinaryOp.h"  #include "BinaryOp.h"
24  #include "escript/Data/UnaryOp.h"  #include "UnaryOp.h"
25    #include "DataException.h"
26    
27  extern "C" {  extern "C" {
28  #include "escript/Data/DataC.h"  #include "DataC.h"
29    #include "paso/Paso.h"
30  }  }
31    
32  #include <iostream>  #ifndef PASO_MPI
33    #define MPI_Comm long
34    #endif
35    
36  #include <string>  #include <string>
 #include <memory>  
37  #include <algorithm>  #include <algorithm>
38    
39  #include <boost/shared_ptr.hpp>  #include <boost/shared_ptr.hpp>
40  #include <boost/python/object.hpp>  #include <boost/python/object.hpp>
 #include <boost/python/list.hpp>  
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 DataConstant;
49    class DataTagged;
50    class DataExpanded;
51    
52  /**  /**
53     \brief     \brief
54     Data is essentially a factory class which creates the appropriate Data     Data creates the appropriate Data object for the given construction
55     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.  
56    
57     Description:     Description:
58     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 61  extern "C" {
61     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
62     the Data object.     the Data object.
63  */  */
   
 namespace escript {  
   
 //  
 // Forward declaration for various implimentations of Data.  
 class DataEmpty;  
 class DataConstant;  
 class DataTagged;  
 class DataExpanded;  
   
64  class Data {  class Data {
65    
66    public:    public:
67    
68      // These typedefs allow function names to be cast to pointers
69      // to functions of the appropriate type when calling unaryOp etc.
70    typedef double (*UnaryDFunPtr)(double);    typedef double (*UnaryDFunPtr)(double);
71    typedef double (*BinaryDFunPtr)(double,double);    typedef double (*BinaryDFunPtr)(double,double);
72    
73    
74    /**    /**
75       Constructors.       Constructors.
76    */    */
# Line 80  class Data { Line 80  class Data {
80       Default constructor.       Default constructor.
81       Creates a DataEmpty object.       Creates a DataEmpty object.
82    */    */
83      ESCRIPT_DLL_API
84    Data();    Data();
85    
86    /**    /**
# Line 87  class Data { Line 88  class Data {
88       Copy constructor.       Copy constructor.
89       WARNING: Only performs a shallow copy.       WARNING: Only performs a shallow copy.
90    */    */
91      ESCRIPT_DLL_API
92    Data(const Data& inData);    Data(const Data& inData);
93    
94    /**    /**
# Line 95  class Data { Line 97  class Data {
97       function space of inData the inData are tried to be interpolated to what,       function space of inData the inData are tried to be interpolated to what,
98       otherwise a shallow copy of inData is returned.       otherwise a shallow copy of inData is returned.
99    */    */
100      ESCRIPT_DLL_API
101    Data(const Data& inData,    Data(const Data& inData,
102         const FunctionSpace& what);         const FunctionSpace& what);
103    
# Line 108  class Data { Line 111  class Data {
111                         the value. Otherwise a more efficient storage                         the value. Otherwise a more efficient storage
112                         mechanism will be used.                         mechanism will be used.
113    */    */
114      ESCRIPT_DLL_API
115    Data(const DataArrayView& value,    Data(const DataArrayView& value,
116         const FunctionSpace& what=FunctionSpace(),         const FunctionSpace& what=FunctionSpace(),
117         bool expanded=false);         bool expanded=false);
# Line 123  class Data { Line 127  class Data {
127                         the given value. Otherwise a more efficient storage                         the given value. Otherwise a more efficient storage
128                         mechanism will be used.                         mechanism will be used.
129    */    */
130      ESCRIPT_DLL_API
131    Data(double value,    Data(double value,
132         const DataArrayView::ShapeType& dataPointShape=DataArrayView::ShapeType(),         const DataArrayView::ShapeType& dataPointShape=DataArrayView::ShapeType(),
133         const FunctionSpace& what=FunctionSpace(),         const FunctionSpace& what=FunctionSpace(),
# Line 135  class Data { Line 140  class Data {
140       \param inData - Input - Input Data object.       \param inData - Input - Input Data object.
141       \param region - Input - Region to copy.       \param region - Input - Region to copy.
142    */    */
143      ESCRIPT_DLL_API
144    Data(const Data& inData,    Data(const Data& inData,
145         const DataArrayView::RegionType& region);         const DataArrayView::RegionType& region);
146    
# Line 150  class Data { Line 156  class Data {
156       \param what - Input - A description of what this data represents.       \param what - Input - A description of what this data represents.
157       \param expanded - Input - Flag, if true fill the entire container with       \param expanded - Input - Flag, if true fill the entire container with
158                         the appropriate values.                         the appropriate values.
159        ==>*
160    */    */
161      ESCRIPT_DLL_API
162    Data(const DataTagged::TagListType& tagKeys,    Data(const DataTagged::TagListType& tagKeys,
163         const DataTagged::ValueListType& values,         const DataTagged::ValueListType& values,
164         const DataArrayView& defaultValue,         const DataArrayView& defaultValue,
# Line 167  class Data { Line 175  class Data {
175                         the value. Otherwise a more efficient storage                         the value. Otherwise a more efficient storage
176                         mechanism will be used.                         mechanism will be used.
177    */    */
178      ESCRIPT_DLL_API
179    Data(const boost::python::numeric::array& value,    Data(const boost::python::numeric::array& value,
180         const FunctionSpace& what=FunctionSpace(),         const FunctionSpace& what=FunctionSpace(),
181         bool expanded=false);         bool expanded=false);
# Line 182  class Data { Line 191  class Data {
191                         the value. Otherwise a more efficient storage                         the value. Otherwise a more efficient storage
192                         mechanism will be used.                         mechanism will be used.
193    */    */
194      ESCRIPT_DLL_API
195    Data(const boost::python::object& value,    Data(const boost::python::object& value,
196         const FunctionSpace& what=FunctionSpace(),         const FunctionSpace& what=FunctionSpace(),
197         bool expanded=false);         bool expanded=false);
# Line 195  class Data { Line 205  class Data {
205       \param value - Input - Input data.       \param value - Input - Input data.
206       \param other - Input - contains all other parameters.       \param other - Input - contains all other parameters.
207    */    */
208      ESCRIPT_DLL_API
209    Data(const boost::python::object& value,    Data(const boost::python::object& value,
210         const Data& other);         const Data& other);
211    
# Line 202  class Data { Line 213  class Data {
213       \brief       \brief
214       Constructor which creates a DataConstant of "shape" with constant value.       Constructor which creates a DataConstant of "shape" with constant value.
215    */    */
216      ESCRIPT_DLL_API
217    Data(double value,    Data(double value,
218         const boost::python::tuple& shape=boost::python::make_tuple(),         const boost::python::tuple& shape=boost::python::make_tuple(),
219         const FunctionSpace& what=FunctionSpace(),         const FunctionSpace& what=FunctionSpace(),
220         bool expanded=false);         bool expanded=false);
221      /**
222         \brief
223         Destructor
224      */
225      ESCRIPT_DLL_API
226      ~Data();
227    
228    /**    /**
229       \brief       \brief
230       Perform a deep copy.       Perform a deep copy.
231    */    */
232      ESCRIPT_DLL_API
233    void    void
234    copy(const Data& other);    copy(const Data& other);
235    
# Line 220  class Data { Line 239  class Data {
239    
240    /**    /**
241       \brief       \brief
242         switches on update protection
243    
244      */
245      ESCRIPT_DLL_API
246      void
247      setProtection();
248    
249      /**
250         \brief
251         Returns trueif the data object is protected against update
252    
253      */
254      ESCRIPT_DLL_API
255      bool
256      isProtected() const;
257      /**
258         \brief
259         Return the values of all data-points as a single python numarray object.
260      */
261      ESCRIPT_DLL_API
262      const boost::python::numeric::array
263      convertToNumArray();
264    
265      /**
266         \brief
267         Return the values of all data-points for the given sample as a single python numarray object.
268      */
269      ESCRIPT_DLL_API
270      const boost::python::numeric::array
271      convertToNumArrayFromSampleNo(int sampleNo);
272    
273      /**
274         \brief
275         Return the value of the specified data-point as a single python numarray object.
276      */
277    #ifndef PASO_MPI  
278      ESCRIPT_DLL_API
279      const boost::python::numeric::array
280      convertToNumArrayFromDPNo(int ProcNo,
281                                                            int sampleNo,
282                                int dataPointNo);
283    #else
284      ESCRIPT_DLL_API
285      const boost::python::numeric::array
286      convertToNumArrayFromDPNo(int procNo,
287                    int sampleNo,
288                    int dataPointNo);
289    #endif
290    
291    
292      /**
293         \brief
294         Fills the expanded Data object from values of a python numarray object.
295      */
296      ESCRIPT_DLL_API
297      void
298      fillFromNumArray(const boost::python::numeric::array);
299    
300      /**
301         \brief
302         Return the tag number associated with the given data-point.
303    
304         The data-point number here corresponds to the data-point number in the
305         numarray returned by convertToNumArray.
306      */
307      ESCRIPT_DLL_API
308      int
309      getTagNumber(int dpno);
310    
311      /**
312         \brief
313       Return the C wrapper for the Data object.       Return the C wrapper for the Data object.
314    */    */
315      ESCRIPT_DLL_API
316    escriptDataC    escriptDataC
317    getDataC();    getDataC();
318    
# Line 229  class Data { Line 320  class Data {
320       \brief       \brief
321       Return the C wrapper for the Data object - const version.       Return the C wrapper for the Data object - const version.
322    */    */
323      ESCRIPT_DLL_API
324    escriptDataC    escriptDataC
325    getDataC() const;    getDataC() const;
326    
# Line 236  class Data { Line 328  class Data {
328       \brief       \brief
329       Write the data as a string.       Write the data as a string.
330    */    */
331      ESCRIPT_DLL_API
332    inline    inline
333    std::string    std::string
334    toString() const    toString() const
# Line 249  class Data { Line 342  class Data {
342       the shape information for each data point although it also may be used       the shape information for each data point although it also may be used
343       to manipulate the point data.       to manipulate the point data.
344    */    */
345      ESCRIPT_DLL_API
346    inline    inline
347    const DataArrayView&    const DataArrayView&
348    getPointDataView() const    getPointDataView() const
# Line 260  class Data { Line 354  class Data {
354       \brief       \brief
355       Whatever the current Data type make this into a DataExpanded.       Whatever the current Data type make this into a DataExpanded.
356    */    */
357      ESCRIPT_DLL_API
358    void    void
359    expand();    expand();
360    
# Line 268  class Data { Line 363  class Data {
363       If possible convert this Data to DataTagged. This will only allow       If possible convert this Data to DataTagged. This will only allow
364       Constant data to be converted to tagged. An attempt to convert       Constant data to be converted to tagged. An attempt to convert
365       Expanded data to tagged will throw an exception.       Expanded data to tagged will throw an exception.
366        ==>*
367    */    */
368      ESCRIPT_DLL_API
369    void    void
370    tag();    tag();
371    
# Line 276  class Data { Line 373  class Data {
373       \brief       \brief
374       Return true if this Data is expanded.       Return true if this Data is expanded.
375    */    */
376      ESCRIPT_DLL_API
377    bool    bool
378    isExpanded() const;    isExpanded() const;
379    
# Line 283  class Data { Line 381  class Data {
381       \brief       \brief
382       Return true if this Data is tagged.       Return true if this Data is tagged.
383    */    */
384      ESCRIPT_DLL_API
385    bool    bool
386    isTagged() const;    isTagged() const;
387    
# Line 290  class Data { Line 389  class Data {
389       \brief       \brief
390       Return true if this Data is constant.       Return true if this Data is constant.
391    */    */
392      ESCRIPT_DLL_API
393    bool    bool
394    isConstant() const;    isConstant() const;
395    
# Line 297  class Data { Line 397  class Data {
397       \brief       \brief
398       Return true if this Data is empty.       Return true if this Data is empty.
399    */    */
400      ESCRIPT_DLL_API
401    bool    bool
402    isEmpty() const;    isEmpty() const;
403    
# Line 304  class Data { Line 405  class Data {
405       \brief       \brief
406       Return the function space.       Return the function space.
407    */    */
408      ESCRIPT_DLL_API
409    inline    inline
410    const FunctionSpace&    const FunctionSpace&
411    getFunctionSpace() const    getFunctionSpace() const
# Line 315  class Data { Line 417  class Data {
417       \brief       \brief
418       Return a copy of the function space.       Return a copy of the function space.
419    */    */
420      ESCRIPT_DLL_API
421    const FunctionSpace    const FunctionSpace
422    getCopyOfFunctionSpace() const;    getCopyOfFunctionSpace() const;
423    
# Line 322  class Data { Line 425  class Data {
425       \brief       \brief
426       Return the domain.       Return the domain.
427    */    */
428      ESCRIPT_DLL_API
429    inline    inline
430    const AbstractDomain&    const AbstractDomain&
431    getDomain() const    getDomain() const
# Line 333  class Data { Line 437  class Data {
437       \brief       \brief
438       Return a copy of the domain.       Return a copy of the domain.
439    */    */
440      ESCRIPT_DLL_API
441    const AbstractDomain    const AbstractDomain
442    getCopyOfDomain() const;    getCopyOfDomain() const;
443    
# Line 340  class Data { Line 445  class Data {
445       \brief       \brief
446       Return the rank of the point data.       Return the rank of the point data.
447    */    */
448      ESCRIPT_DLL_API
449    inline    inline
450    int    int
451    getDataPointRank() const    getDataPointRank() const
# Line 351  class Data { Line 457  class Data {
457       \brief       \brief
458       Return the number of samples.       Return the number of samples.
459    */    */
460      ESCRIPT_DLL_API
461    inline    inline
462    int    int
463    getNumSamples() const    getNumSamples() const
# Line 362  class Data { Line 469  class Data {
469       \brief       \brief
470       Return the number of data points per sample.       Return the number of data points per sample.
471    */    */
472      ESCRIPT_DLL_API
473    inline    inline
474    int    int
475    getNumDataPointsPerSample() const    getNumDataPointsPerSample() const
# Line 375  class Data { Line 483  class Data {
483       preferred interface but is provided for use by C code.       preferred interface but is provided for use by C code.
484       \param sampleNo - Input - the given sample no.       \param sampleNo - Input - the given sample no.
485    */    */
486      ESCRIPT_DLL_API
487    inline    inline
488    DataAbstract::ValueType::value_type*    DataAbstract::ValueType::value_type*
489    getSampleData(DataAbstract::ValueType::size_type sampleNo)    getSampleData(DataAbstract::ValueType::size_type sampleNo)
# Line 388  class Data { Line 497  class Data {
497       access data that isn't tagged an exception will be thrown.       access data that isn't tagged an exception will be thrown.
498       \param tag - Input - the tag key.       \param tag - Input - the tag key.
499    */    */
500      ESCRIPT_DLL_API
501    inline    inline
502    DataAbstract::ValueType::value_type*    DataAbstract::ValueType::value_type*
503    getSampleDataByTag(int tag)    getSampleDataByTag(int tag)
# Line 397  class Data { Line 507  class Data {
507    
508    /**    /**
509       \brief       \brief
510         Assign the given value to the data-points referenced by the given
511         reference number.
512    
513         The value supplied is a python numarray object.  The data from this numarray
514         is unpacked into a DataArray, and this is used to set the corresponding
515         data-points in the underlying Data object.
516    
517         If the underlying Data object cannot be accessed via reference numbers, an
518         exception will be thrown.
519    
520         \param ref - Input - reference number.
521         \param value - Input - value to assign to data-points associated with
522                                the given reference number.
523      */
524      ESCRIPT_DLL_API
525      void
526      setRefValue(int ref,
527                  const boost::python::numeric::array& value);
528    
529      /**
530         \brief
531         Return the values associated with the data-points referenced by the given
532         reference number.
533    
534         The value supplied is a python numarray object. The data from the corresponding
535         data-points in this Data object are packed into the given numarray object.
536    
537         If the underlying Data object cannot be accessed via reference numbers, an
538         exception will be thrown.
539    
540         \param ref - Input - reference number.
541         \param value - Output - object to receive values from data-points
542                                 associated with the given reference number.
543      */
544      ESCRIPT_DLL_API
545      void
546      getRefValue(int ref,
547                  boost::python::numeric::array& value);
548    
549      /**
550         \brief
551       Return a view into the data for the data point specified.       Return a view into the data for the data point specified.
552       NOTE: Construction of the DataArrayView is a relatively expensive       NOTE: Construction of the DataArrayView is a relatively expensive
553       operation.       operation.
554       \param sampleNo - Input -       \param sampleNo - Input -
555       \param dataPointNo - Input -       \param dataPointNo - Input -
556    */    */
557      ESCRIPT_DLL_API
558    inline    inline
559    DataArrayView    DataArrayView
560    getDataPoint(int sampleNo,    getDataPoint(int sampleNo,
561                 int dataPointNo)                 int dataPointNo)
562    {    {
563      return m_data->getDataPoint(sampleNo,dataPointNo);          return m_data->getDataPoint(sampleNo,dataPointNo);
564    }    }
565    
566    /**    /**
567       \brief       \brief
568       Return a reference to the data point shape.       Return a reference to the data point shape.
569    */    */
570      ESCRIPT_DLL_API
571    const DataArrayView::ShapeType&    const DataArrayView::ShapeType&
572    getDataPointShape() const;    getDataPointShape() const;
573    
# Line 422  class Data { Line 575  class Data {
575       \brief       \brief
576       Return the data point shape as a tuple of integers.       Return the data point shape as a tuple of integers.
577    */    */
578    boost::python::tuple    ESCRIPT_DLL_API
579      const boost::python::tuple
580    getShapeTuple() const;    getShapeTuple() const;
581    
582    /**    /**
# Line 430  class Data { Line 584  class Data {
584       Return the size of the data point. It is the product of the       Return the size of the data point. It is the product of the
585       data point shape dimensions.       data point shape dimensions.
586    */    */
587      ESCRIPT_DLL_API
588    int    int
589    getDataPointSize() const;    getDataPointSize() const;
590    
# Line 437  class Data { Line 592  class Data {
592       \brief       \brief
593       Return the number of doubles stored for this Data.       Return the number of doubles stored for this Data.
594    */    */
595      ESCRIPT_DLL_API
596    DataArrayView::ValueType::size_type    DataArrayView::ValueType::size_type
597    getLength() const;    getLength() const;
598    
# Line 447  class Data { Line 603  class Data {
603       cannot be converted to a DataTagged object.       cannot be converted to a DataTagged object.
604       \param tagKey - Input - Integer key.       \param tagKey - Input - Integer key.
605       \param value - Input - Value to associate with given key.       \param value - Input - Value to associate with given key.
606        ==>*
607    */    */
608      ESCRIPT_DLL_API
609    void    void
610    setTaggedValue(int tagKey,    setTaggedValue(int tagKey,
611                   const boost::python::object& value);                   const boost::python::object& value);
# Line 459  class Data { Line 617  class Data {
617       cannot be converted to a DataTagged object.       cannot be converted to a DataTagged object.
618       \param tagKey - Input - Integer key.       \param tagKey - Input - Integer key.
619       \param value - Input - Value to associate with given key.       \param value - Input - Value to associate with given key.
620       Note: removed for now - this version not needed, and breaks escript.cpp      ==>*
621    */    */
622    /*    ESCRIPT_DLL_API
623    void    void
624    setTaggedValue(int tagKey,    setTaggedValueFromCPP(int tagKey,
625                   const DataArrayView& value);                          const DataArrayView& value);
   */  
626    
627    /**    /**
628      \brief      \brief
629      Copy other Data object into this Data object where mask is positive.      Copy other Data object into this Data object where mask is positive.
630    */    */
631      ESCRIPT_DLL_API
632    void    void
633    copyWithMask(const Data& other,    copyWithMask(const Data& other,
634                 const Data& mask);                 const Data& mask);
# Line 483  class Data { Line 641  class Data {
641       \brief       \brief
642       Interpolates this onto the given functionspace and returns       Interpolates this onto the given functionspace and returns
643       the result as a Data object.       the result as a Data object.
644         *
645    */    */
646      ESCRIPT_DLL_API
647    Data    Data
648    interpolate(const FunctionSpace& functionspace) const;    interpolate(const FunctionSpace& functionspace) const;
649    
# Line 491  class Data { Line 651  class Data {
651       \brief       \brief
652       Calculates the gradient of the data at the data points of functionspace.       Calculates the gradient of the data at the data points of functionspace.
653       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.
654         *
655    */    */
656      ESCRIPT_DLL_API
657    Data    Data
658    gradOn(const FunctionSpace& functionspace) const;    gradOn(const FunctionSpace& functionspace) const;
659    
660      ESCRIPT_DLL_API
661    Data    Data
662    grad() const;    grad() const;
663    
664    /**    /**
665       \brief       \brief
666       Calculate the integral over the function space domain.       Calculate the integral over the function space domain.
667         *
668    */    */
669      ESCRIPT_DLL_API
670    boost::python::numeric::array    boost::python::numeric::array
671    integrate() const;    integrate() const;
672    
673    /**    /**
674       \brief       \brief
675         Returns 1./ Data object
676         *
677      */
678      ESCRIPT_DLL_API
679      Data
680      oneOver() const;
681      /**
682         \brief
683       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.
684         *
685    */    */
686      ESCRIPT_DLL_API
687    Data    Data
688    wherePositive() const;    wherePositive() const;
689    
690    /**    /**
691       \brief       \brief
692       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.
693         *
694    */    */
695      ESCRIPT_DLL_API
696    Data    Data
697    whereNegative() const;    whereNegative() const;
698    
699    /**    /**
700       \brief       \brief
701       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.
702         *
703    */    */
704      ESCRIPT_DLL_API
705    Data    Data
706    whereNonNegative() const;    whereNonNegative() const;
707    
708    /**    /**
709       \brief       \brief
710       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.
711         *
712    */    */
713      ESCRIPT_DLL_API
714    Data    Data
715    whereNonPositive() const;    whereNonPositive() const;
716    
717    /**    /**
718       \brief       \brief
719       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.
720         *
721    */    */
722      ESCRIPT_DLL_API
723    Data    Data
724    whereZero() const;    whereZero(double tol=0.0) const;
725    
726    /**    /**
727       \brief       \brief
728       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.
729         *
730      */
731      ESCRIPT_DLL_API
732      Data
733      whereNonZero(double tol=0.0) const;
734    
735      /**
736         \brief
737         Return the maximum absolute value of this Data object.
738         *
739      */
740      ESCRIPT_DLL_API
741      double
742      Lsup() const;
743    
744      /**
745         \brief
746         Return the minimum absolute value of this Data object.
747         *
748      */
749      ESCRIPT_DLL_API
750      double
751      Linf() const;
752    
753      /**
754         \brief
755         Return the maximum value of this Data object.
756         *
757      */
758      ESCRIPT_DLL_API
759      double
760      sup() const;
761    
762      /**
763         \brief
764         Return the minimum value of this Data object.
765         *
766      */
767      ESCRIPT_DLL_API
768      double
769      inf() const;
770    
771      /**
772         \brief
773         Return the absolute value of each data point of this Data object.
774         *
775      */
776      ESCRIPT_DLL_API
777      Data
778      abs() const;
779    
780      /**
781         \brief
782         Return the maximum value of each data point of this Data object.
783         *
784      */
785      ESCRIPT_DLL_API
786      Data
787      maxval() const;
788    
789      /**
790         \brief
791         Return the minimum value of each data point of this Data object.
792         *
793      */
794      ESCRIPT_DLL_API
795      Data
796      minval() const;
797    
798      /**
799         \brief
800         Return the (sample number, data-point number) of the data point with
801         the minimum value in this Data object.
802      */
803      ESCRIPT_DLL_API
804      const boost::python::tuple
805      mindp() const;
806    
807      ESCRIPT_DLL_API
808      void
809      calc_mindp(int& ProcNo,
810                            int& SampleNo,  
811                 int& DataPointNo) const;
812      /**
813         \brief
814         Return the sign of each data point of this Data object.
815         -1 for negative values, zero for zero values, 1 for positive values.
816         *
817      */
818      ESCRIPT_DLL_API
819      Data
820      sign() const;
821    
822      /**
823         \brief
824         Return the symmetric part of a matrix which is half the matrix plus its transpose.
825         *
826      */
827      ESCRIPT_DLL_API
828      Data
829      symmetric() const;
830    
831      /**
832         \brief
833         Return the nonsymmetric part of a matrix which is half the matrix minus its transpose.
834         *
835      */
836      ESCRIPT_DLL_API
837      Data
838      nonsymmetric() const;
839    
840      /**
841         \brief
842         Return the trace of a matrix
843         *
844      */
845      ESCRIPT_DLL_API
846      Data
847      trace(int axis_offset) const;
848    
849      /**
850         \brief
851         Transpose each data point of this Data object around the given axis.
852         *
853      */
854      ESCRIPT_DLL_API
855      Data
856      transpose(int axis_offset) const;
857    
858      /**
859         \brief
860         Return the eigenvalues of the symmetric part at each data point of this Data object in increasing values.
861         Currently this function is restricted to rank 2, square shape, and dimension 3.
862         *
863    */    */
864      ESCRIPT_DLL_API
865    Data    Data
866    whereNonZero() const;    eigenvalues() const;
867    
868      /**
869         \brief
870         Return the eigenvalues and corresponding eigenvcetors of the symmetric part at each data point of this Data object.
871         the eigenvalues are ordered in increasing size where eigenvalues with relative difference less than
872         tol are treated as equal. The eigenvectors are orthogonal, normalized and the sclaed such that the
873         first non-zero entry is positive.
874         Currently this function is restricted to rank 2, square shape, and dimension 3
875         *
876      */
877      ESCRIPT_DLL_API
878      const boost::python::tuple
879      eigenvalues_and_eigenvectors(const double tol=1.e-12) const;
880    
881      /**
882         \brief
883         swaps the components axis0 and axis1
884         *
885      */
886      ESCRIPT_DLL_API
887      Data
888      swapaxes(const int axis0, const int axis1) const;
889    
890      /**
891         \brief
892         Return the error function erf of each data point of this Data object.
893         *
894      */
895      ESCRIPT_DLL_API
896      Data
897      erf() const;
898    
899    /**    /**
900       \brief       \brief
901       Return the sin of each data point of this Data object.       Return the sin of each data point of this Data object.
902         *
903    */    */
904      ESCRIPT_DLL_API
905    Data    Data
906    sin() const;    sin() const;
907    
908    /**    /**
909       \brief       \brief
910       Return the cos of each data point of this Data object.       Return the cos of each data point of this Data object.
911         *
912    */    */
913      ESCRIPT_DLL_API
914    Data    Data
915    cos() const;    cos() const;
916    
917    /**    /**
918       \brief       \brief
919       Return the tan of each data point of this Data object.       Return the tan of each data point of this Data object.
920         *
921    */    */
922      ESCRIPT_DLL_API
923    Data    Data
924    tan() const;    tan() const;
925    
926    /**    /**
927       \brief       \brief
928       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.
929         *
930    */    */
931      ESCRIPT_DLL_API
932    Data    Data
933    log() const;    asin() const;
934    
935    /**    /**
936       \brief       \brief
937       Return the natural log of each data point of this Data object.       Return the acos of each data point of this Data object.
938         *
939    */    */
940      ESCRIPT_DLL_API
941    Data    Data
942    ln() const;    acos() const;
943    
944    /**    /**
945       \brief       \brief
946       Return the maximum absolute value of this Data object.       Return the atan of each data point of this Data object.
947         *
948    */    */
949    double    ESCRIPT_DLL_API
950    Lsup() const;    Data
951      atan() const;
952    
953    /**    /**
954       \brief       \brief
955       Return the maximum value of this Data object.       Return the sinh of each data point of this Data object.
956         *
957    */    */
958    double    ESCRIPT_DLL_API
959    sup() const;    Data
960      sinh() const;
961    
962    /**    /**
963       \brief       \brief
964       Return the minimum value of this Data object.       Return the cosh of each data point of this Data object.
965         *
966    */    */
967    double    ESCRIPT_DLL_API
968    inf() const;    Data
969      cosh() const;
970    
971    /**    /**
972       \brief       \brief
973       Return the absolute value of each data point of this Data object.       Return the tanh of each data point of this Data object.
974         *
975    */    */
976      ESCRIPT_DLL_API
977    Data    Data
978    abs() const;    tanh() const;
979    
980    /**    /**
981       \brief       \brief
982       Return the maximum value of each data point of this Data object.       Return the asinh of each data point of this Data object.
983         *
984    */    */
985      ESCRIPT_DLL_API
986    Data    Data
987    maxval() const;    asinh() const;
988    
989    /**    /**
990       \brief       \brief
991       Return the minimum value of each data point of this Data object.       Return the acosh of each data point of this Data object.
992         *
993    */    */
994      ESCRIPT_DLL_API
995    Data    Data
996    minval() const;    acosh() const;
997    
998    /**    /**
999       \brief       \brief
1000       Return the length of each data point of this Data object.       Return the atanh of each data point of this Data object.
1001       sqrt(sum(A[i,j,k,l]^2))       *
1002    */    */
1003      ESCRIPT_DLL_API
1004    Data    Data
1005    length() const;    atanh() const;
1006    
1007    /**    /**
1008       \brief       \brief
1009       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.
1010       -1 for negative values, zero for zero values, 1 for positive values.       *
1011    */    */
1012      ESCRIPT_DLL_API
1013    Data    Data
1014    sign() const;    log10() const;
1015    
1016      /**
1017         \brief
1018         Return the natural log of each data point of this Data object.
1019         *
1020      */
1021      ESCRIPT_DLL_API
1022      Data
1023      log() const;
1024    
1025    /**    /**
1026      \transpose       \brief
1027      Transpose each data point of this Data object around the given axis.       Return the exponential function of each data point of this Data object.
1028         *
1029    */    */
1030      ESCRIPT_DLL_API
1031    Data    Data
1032    transpose(int axis) const;    exp() const;
1033    
1034    /**    /**
1035      \trace       \brief
1036      Calculate the trace of each data point of this Data object.       Return the square root of each data point of this Data object.
1037      sum(A[i,i,i,i])       *
1038    */    */
1039      ESCRIPT_DLL_API
1040    Data    Data
1041    trace() const;    sqrt() const;
1042    
1043    /**    /**
1044      \exp       \brief
1045      Return the exponential function of each data point of this Data object.       Return the negation of each data point of this Data object.
1046         *
1047    */    */
1048      ESCRIPT_DLL_API
1049    Data    Data
1050    exp() const;    neg() const;
1051    
1052    /**    /**
1053      \sqrt       \brief
1054      Return the square root of each data point of this Data object.       Return the identity of each data point of this Data object.
1055         Simply returns this object unmodified.
1056         *
1057    */    */
1058      ESCRIPT_DLL_API
1059    Data    Data
1060    sqrt() const;    pos() const;
1061    
1062    /**    /**
1063       \brief       \brief
1064       Return the given power of each data point of this Data object.       Return the given power of each data point of this Data object.
1065    
1066         \param right Input - the power to raise the object to.
1067         *
1068    */    */
1069      ESCRIPT_DLL_API
1070    Data    Data
1071    powD(const Data& right) const;    powD(const Data& right) const;
1072    
1073      /**
1074         \brief
1075         Return the given power of each data point of this boost python object.
1076        
1077         \param right Input - the power to raise the object to.
1078         *
1079       */
1080      ESCRIPT_DLL_API
1081    Data    Data
1082    powO(const boost::python::object& right) const;    powO(const boost::python::object& right) const;
1083    
1084    /**    /**
1085      \brief       \brief
1086      Return the negation of each data point of this Data object.       Return the given power of each data point of this boost python object.
1087    */      
1088         \param left Input - the bases
1089         *
1090       */
1091    
1092      ESCRIPT_DLL_API
1093    Data    Data
1094    neg() const;    rpowO(const boost::python::object& left) const;
1095    
1096    /**    /**
1097      \brief       \brief
1098      Return the identity of each data point of this Data object.       writes the object to a file in the DX file format
     Simply returns this object unmodified.  
1099    */    */
1100    Data    ESCRIPT_DLL_API
1101    pos() const;    void
1102      saveDX(std::string fileName) const;
1103    
1104      /**
1105         \brief
1106         writes the object to a file in the VTK file format
1107      */
1108      ESCRIPT_DLL_API
1109      void
1110      saveVTK(std::string fileName) const;
1111    
1112    /**    /**
1113       \brief       \brief
1114       Overloaded operator +=       Overloaded operator +=
1115       \param right - Input - The right hand side.       \param right - Input - The right hand side.
1116         *
1117    */    */
1118      ESCRIPT_DLL_API
1119    Data& operator+=(const Data& right);    Data& operator+=(const Data& right);
1120      ESCRIPT_DLL_API
1121    Data& operator+=(const boost::python::object& right);    Data& operator+=(const boost::python::object& right);
1122    
1123    /**    /**
1124       \brief       \brief
1125       Overloaded operator -=       Overloaded operator -=
1126       \param right - Input - The right hand side.       \param right - Input - The right hand side.
1127         *
1128    */    */
1129      ESCRIPT_DLL_API
1130    Data& operator-=(const Data& right);    Data& operator-=(const Data& right);
1131      ESCRIPT_DLL_API
1132    Data& operator-=(const boost::python::object& right);    Data& operator-=(const boost::python::object& right);
1133    
1134   /**   /**
1135       \brief       \brief
1136       Overloaded operator *=       Overloaded operator *=
1137       \param right - Input - The right hand side.       \param right - Input - The right hand side.
1138         *
1139    */    */
1140      ESCRIPT_DLL_API
1141    Data& operator*=(const Data& right);    Data& operator*=(const Data& right);
1142      ESCRIPT_DLL_API
1143    Data& operator*=(const boost::python::object& right);    Data& operator*=(const boost::python::object& right);
1144    
1145   /**   /**
1146       \brief       \brief
1147       Overloaded operator /=       Overloaded operator /=
1148       \param right - Input - The right hand side.       \param right - Input - The right hand side.
1149         *
1150    */    */
1151      ESCRIPT_DLL_API
1152    Data& operator/=(const Data& right);    Data& operator/=(const Data& right);
1153      ESCRIPT_DLL_API
1154    Data& operator/=(const boost::python::object& right);    Data& operator/=(const boost::python::object& right);
1155    
1156    /**    /**
1157       \brief       \brief
1158       Returns true if this can be interpolated to functionspace.       Returns true if this can be interpolated to functionspace.
1159    */    */
1160      ESCRIPT_DLL_API
1161    bool    bool
1162    probeInterpolation(const FunctionSpace& functionspace) const;    probeInterpolation(const FunctionSpace& functionspace) const;
1163    
# Line 748  class Data { Line 1176  class Data {
1176       \param key - Input - python slice tuple specifying       \param key - Input - python slice tuple specifying
1177       slice to return.       slice to return.
1178    */    */
1179      ESCRIPT_DLL_API
1180    Data    Data
1181    getItem(const boost::python::object& key) const;    getItem(const boost::python::object& key) const;
1182    
# Line 755  class Data { Line 1184  class Data {
1184       \brief       \brief
1185       Copies slice from value into this Data object.       Copies slice from value into this Data object.
1186    
      \description  
1187       Implements the [] set operator in python.       Implements the [] set operator in python.
1188       Calls setSlice.       Calls setSlice.
1189    
# Line 763  class Data { Line 1191  class Data {
1191       slice to copy from value.       slice to copy from value.
1192       \param value - Input - Data object to copy from.       \param value - Input - Data object to copy from.
1193    */    */
1194      ESCRIPT_DLL_API
1195    void    void
1196    setItemD(const boost::python::object& key,    setItemD(const boost::python::object& key,
1197             const Data& value);             const Data& value);
1198    
1199      ESCRIPT_DLL_API
1200    void    void
1201    setItemO(const boost::python::object& key,    setItemO(const boost::python::object& key,
1202             const boost::python::object& value);             const boost::python::object& value);
# Line 779  class Data { Line 1209  class Data {
1209       this Data object.       this Data object.
1210    */    */
1211    template <class UnaryFunction>    template <class UnaryFunction>
1212      ESCRIPT_DLL_API
1213    inline    inline
1214    void    void
1215    unaryOp(UnaryFunction operation);    unaryOp(UnaryFunction operation);
# Line 788  class Data { Line 1219  class Data {
1219       Return a Data object containing the specified slice of       Return a Data object containing the specified slice of
1220       this Data object.       this Data object.
1221       \param region - Input - Region to copy.       \param region - Input - Region to copy.
1222         *
1223    */    */
1224      ESCRIPT_DLL_API
1225    Data    Data
1226    getSlice(const DataArrayView::RegionType& region) const;    getSlice(const DataArrayView::RegionType& region) const;
1227    
# Line 798  class Data { Line 1231  class Data {
1231       Data object.       Data object.
1232       \param value - Input - Data to copy from.       \param value - Input - Data to copy from.
1233       \param region - Input - Region to copy.       \param region - Input - Region to copy.
1234         *
1235    */    */
1236      ESCRIPT_DLL_API
1237    void    void
1238    setSlice(const Data& value,    setSlice(const Data& value,
1239             const DataArrayView::RegionType& region);             const DataArrayView::RegionType& region);
1240    
1241      /**
1242         \brief
1243         Archive the current Data object to the given file.
1244         \param fileName - Input - file to archive to.
1245      */
1246      ESCRIPT_DLL_API
1247      void
1248      archiveData(const std::string fileName);
1249    
1250      /**
1251         \brief
1252         Extract the Data object archived in the given file, overwriting
1253         the current Data object.
1254         Note - the current object must be of type DataEmpty.
1255         \param fileName - Input - file to extract from.
1256         \param fspace - Input - a suitable FunctionSpace descibing the data.
1257      */
1258      ESCRIPT_DLL_API
1259      void
1260      extractData(const std::string fileName,
1261                  const FunctionSpace& fspace);
1262    
1263    
1264      /**
1265         \brief
1266         print the data values to stdout. Used for debugging
1267      */
1268      ESCRIPT_DLL_API
1269      void
1270        print(void);
1271    
1272      /**
1273         \brief
1274         return the MPI rank number of the local data
1275             MPI_COMM_WORLD is assumed and the result of MPI_Comm_size()
1276             is returned
1277      */
1278      ESCRIPT_DLL_API
1279        int
1280        get_MPIRank(void) const;
1281    
1282      /**
1283         \brief
1284         return the MPI rank number of the local data
1285             MPI_COMM_WORLD is assumed and the result of MPI_Comm_rank()
1286             is returned
1287      */
1288      ESCRIPT_DLL_API
1289        int
1290        get_MPISize(void) const;
1291    
1292      /**
1293         \brief
1294         return the MPI rank number of the local data
1295             MPI_COMM_WORLD is assumed and returned.
1296      */
1297      ESCRIPT_DLL_API
1298        MPI_Comm
1299        get_MPIComm(void) const;
1300    
1301      /**
1302         \brief
1303         return the object produced by the factory, which is a DataConstant or DataExpanded
1304      */
1305      ESCRIPT_DLL_API
1306        DataAbstract*
1307        borrowData(void) const;
1308    
1309   protected:   protected:
1310    
1311   private:   private:
# Line 823  class Data { Line 1326  class Data {
1326    /**    /**
1327       \brief       \brief
1328       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
1329       this Data object and return the single double value result.       this Data object according to the given function and return the single value result.
1330    */    */
1331    template <class UnaryFunction>    template <class BinaryFunction>
1332    inline    inline
1333    double    double
1334    algorithm(UnaryFunction operation) const;    algorithm(BinaryFunction operation,
1335                double initial_value) const;
1336    
1337    /**    /**
1338       \brief       \brief
1339       Perform the given binary operation on all of the data's elements.       Reduce each data-point in this Data object using the given operation. Return a Data
1340       The underlying type of the right hand side (right) determines the final       object with the same number of data-points, but with each data-point containing only
1341       type of *this after the operation. For example if the right hand side       one value - the result of the reduction operation on the corresponding data-point in
1342       is expanded *this will be expanded if necessary.       this Data object
      RHS is a Data object.  
1343    */    */
1344    template <class BinaryFunction>    template <class BinaryFunction>
1345    inline    inline
1346    void    Data
1347    binaryOp(const Data& right,    dp_algorithm(BinaryFunction operation,
1348             BinaryFunction operation);                 double initial_value) const;
1349    
1350    /**    /**
1351       \brief       \brief
1352       Perform the given binary operation on all of the data's elements.       Perform the given binary operation on all of the data's elements.
1353       RHS is a boost::python object.       The underlying type of the right hand side (right) determines the final
1354         type of *this after the operation. For example if the right hand side
1355         is expanded *this will be expanded if necessary.
1356         RHS is a Data object.
1357    */    */
1358    template <class BinaryFunction>    template <class BinaryFunction>
1359    inline    inline
1360    void    void
1361    binaryOp(const boost::python::object& right,    binaryOp(const Data& right,
1362             BinaryFunction operation);             BinaryFunction operation);
1363    
1364    /**    /**
# Line 881  class Data { Line 1387  class Data {
1387               const FunctionSpace& what,               const FunctionSpace& what,
1388               bool expanded);               bool expanded);
1389    
1390    /**    //
1391       \brief    // flag to protect the data object against any update
1392       Reshape the data point if the data point is currently rank 0.    bool m_protected;
      Will throw an exception if the data points are not rank 0.  
      The original data point value is used for all values of the new  
      data point.  
   */  
   void  
   reshapeDataPoint(const DataArrayView::ShapeType& shape);  
1393    
1394    //    //
1395    // pointer to the actual data object    // pointer to the actual data object
1396    boost::shared_ptr<DataAbstract> m_data;    boost::shared_ptr<DataAbstract> m_data;
1397    
1398      //
1399      // pointer to the internal profiling data
1400      struct profDataEntry *profData;
1401    
1402  };  };
1403    
1404  template <class IValueType>  template <class IValueType>
# Line 922  Data::initialise(const IValueType& value Line 1426  Data::initialise(const IValueType& value
1426  /**  /**
1427     Binary Data object operators.     Binary Data object operators.
1428  */  */
1429    inline double rpow(double x,double y)
1430    {
1431        return pow(y,x);
1432    };
1433    
1434  /**  /**
1435    \brief    \brief
1436    Operator+    Operator+
1437    Takes two Data objects.    Takes two Data objects.
1438  */  */
1439  Data operator+(const Data& left, const Data& right);  ESCRIPT_DLL_API Data operator+(const Data& left, const Data& right);
1440    
1441  /**  /**
1442    \brief    \brief
1443    Operator-    Operator-
1444    Takes two Data objects.    Takes two Data objects.
1445  */  */
1446  Data operator-(const Data& left, const Data& right);  ESCRIPT_DLL_API Data operator-(const Data& left, const Data& right);
1447    
1448  /**  /**
1449    \brief    \brief
1450    Operator*    Operator*
1451    Takes two Data objects.    Takes two Data objects.
1452  */  */
1453  Data operator*(const Data& left, const Data& right);  ESCRIPT_DLL_API Data operator*(const Data& left, const Data& right);
1454    
1455  /**  /**
1456    \brief    \brief
1457    Operator/    Operator/
1458    Takes two Data objects.    Takes two Data objects.
1459  */  */
1460  Data operator/(const Data& left, const Data& right);  ESCRIPT_DLL_API Data operator/(const Data& left, const Data& right);
1461    
1462  /**  /**
1463    \brief    \brief
# Line 957  Data operator/(const Data& left, const D Line 1465  Data operator/(const Data& left, const D
1465    Takes LHS Data object and RHS python::object.    Takes LHS Data object and RHS python::object.
1466    python::object must be convertable to Data type.    python::object must be convertable to Data type.
1467  */  */
1468  Data operator+(const Data& left, const boost::python::object& right);  ESCRIPT_DLL_API Data operator+(const Data& left, const boost::python::object& right);
1469    
1470  /**  /**
1471    \brief    \brief
# Line 965  Data operator+(const Data& left, const b Line 1473  Data operator+(const Data& left, const b
1473    Takes LHS Data object and RHS python::object.    Takes LHS Data object and RHS python::object.
1474    python::object must be convertable to Data type.    python::object must be convertable to Data type.
1475  */  */
1476  Data operator-(const Data& left, const boost::python::object& right);  ESCRIPT_DLL_API Data operator-(const Data& left, const boost::python::object& right);
1477    
1478  /**  /**
1479    \brief    \brief
# Line 973  Data operator-(const Data& left, const b Line 1481  Data operator-(const Data& left, const b
1481    Takes LHS Data object and RHS python::object.    Takes LHS Data object and RHS python::object.
1482    python::object must be convertable to Data type.    python::object must be convertable to Data type.
1483  */  */
1484  Data operator*(const Data& left, const boost::python::object& right);  ESCRIPT_DLL_API Data operator*(const Data& left, const boost::python::object& right);
1485    
1486  /**  /**
1487    \brief    \brief
# Line 981  Data operator*(const Data& left, const b Line 1489  Data operator*(const Data& left, const b
1489    Takes LHS Data object and RHS python::object.    Takes LHS Data object and RHS python::object.
1490    python::object must be convertable to Data type.    python::object must be convertable to Data type.
1491  */  */
1492  Data operator/(const Data& left, const boost::python::object& right);  ESCRIPT_DLL_API Data operator/(const Data& left, const boost::python::object& right);
1493    
1494  /**  /**
1495    \brief    \brief
# Line 989  Data operator/(const Data& left, const b Line 1497  Data operator/(const Data& left, const b
1497    Takes LHS python::object and RHS Data object.    Takes LHS python::object and RHS Data object.
1498    python::object must be convertable to Data type.    python::object must be convertable to Data type.
1499  */  */
1500  Data operator+(const boost::python::object& left, const Data& right);  ESCRIPT_DLL_API Data operator+(const boost::python::object& left, const Data& right);
1501    
1502  /**  /**
1503    \brief    \brief
# Line 997  Data operator+(const boost::python::obje Line 1505  Data operator+(const boost::python::obje
1505    Takes LHS python::object and RHS Data object.    Takes LHS python::object and RHS Data object.
1506    python::object must be convertable to Data type.    python::object must be convertable to Data type.
1507  */  */
1508  Data operator-(const boost::python::object& left, const Data& right);  ESCRIPT_DLL_API Data operator-(const boost::python::object& left, const Data& right);
1509    
1510  /**  /**
1511    \brief    \brief
# Line 1005  Data operator-(const boost::python::obje Line 1513  Data operator-(const boost::python::obje
1513    Takes LHS python::object and RHS Data object.    Takes LHS python::object and RHS Data object.
1514    python::object must be convertable to Data type.    python::object must be convertable to Data type.
1515  */  */
1516  Data operator*(const boost::python::object& left, const Data& right);  ESCRIPT_DLL_API Data operator*(const boost::python::object& left, const Data& right);
1517    
1518  /**  /**
1519    \brief    \brief
# Line 1013  Data operator*(const boost::python::obje Line 1521  Data operator*(const boost::python::obje
1521    Takes LHS python::object and RHS Data object.    Takes LHS python::object and RHS Data object.
1522    python::object must be convertable to Data type.    python::object must be convertable to Data type.
1523  */  */
1524  Data operator/(const boost::python::object& left, const Data& right);  ESCRIPT_DLL_API Data operator/(const boost::python::object& left, const Data& right);
1525    
1526  /**  /**
1527    \brief    \brief
1528    Output operator    Output operator
1529  */  */
1530  std::ostream& operator<<(std::ostream& o, const Data& data);  ESCRIPT_DLL_API std::ostream& operator<<(std::ostream& o, const Data& data);
1531    
1532    /**
1533      \brief
1534      Compute a tensor product of two Data objects
1535      \param arg0 - Input - Data object
1536      \param arg1 - Input - Data object
1537      \param axis_offset - Input - axis offset
1538      \param transpose - Input - 0: transpose neither, 1: transpose arg0, 2: transpose arg1
1539    */
1540    ESCRIPT_DLL_API
1541    Data
1542    C_GeneralTensorProduct(Data& arg0,
1543                         Data& arg1,
1544                         int axis_offset=0,
1545                         int transpose=0);
1546    
1547  /**  /**
1548    \brief    \brief
# Line 1027  std::ostream& operator<<(std::ostream& o Line 1550  std::ostream& operator<<(std::ostream& o
1550    NB: this operator does very little at this point, and isn't to    NB: this operator does very little at this point, and isn't to
1551    be relied on. Requires further implementation.    be relied on. Requires further implementation.
1552  */  */
1553  //bool operator==(const Data& left, const Data& right);  //ESCRIPT_DLL_API bool operator==(const Data& left, const Data& right);
1554    
1555  /**  /**
1556    \brief    \brief
# Line 1043  Data::binaryOp(const Data& right, Line 1566  Data::binaryOp(const Data& right,
1566     //     //
1567     // if this has a rank of zero promote it to the rank of the RHS     // if this has a rank of zero promote it to the rank of the RHS
1568     if (getPointDataView().getRank()==0 && right.getPointDataView().getRank()!=0) {     if (getPointDataView().getRank()==0 && right.getPointDataView().getRank()!=0) {
1569       reshapeDataPoint(right.getPointDataView().getShape());       throw DataException("Error - attempt to update rank zero object with object with rank bigger than zero.");
1570     }     }
1571     //     //
1572     // initially make the temporary a shallow copy     // initially make the temporary a shallow copy
# Line 1095  Data::binaryOp(const Data& right, Line 1618  Data::binaryOp(const Data& right,
1618       EsysAssert((leftC!=0 && rightC!=0), "Programming error - casting to DataConstant.");       EsysAssert((leftC!=0 && rightC!=0), "Programming error - casting to DataConstant.");
1619       escript::binaryOp(*leftC,*rightC,operation);       escript::binaryOp(*leftC,*rightC,operation);
1620     }     }
1621  }     #if defined DOPROF
1622       profData->binary++;
1623  /**     #endif
   \brief  
   Perform the given binary operation with this and right as operands.  
   Right is a boost::python object.  
 */  
 template <class BinaryFunction>  
 inline  
 void  
 Data::binaryOp(const boost::python::object& right,  
                BinaryFunction operation)  
 {  
    DataArray temp(right);  
    //  
    // if this has a rank of zero promote it to the rank of the RHS.  
    if (getPointDataView().getRank()==0 && temp.getView().getRank()!=0) {  
       reshapeDataPoint(temp.getView().getShape());  
    }  
    //  
    // Always allow scalar values for the RHS but check other shapes  
    if (temp.getView().getRank()!=0) {  
      if (!getPointDataView().checkShape(temp.getView().getShape())) {  
        throw DataException(getPointDataView().createShapeErrorMessage(  
                   "Error - RHS shape doesn't match LHS shape.",temp.getView().getShape()));  
      }  
    }  
    if (isExpanded()) {  
      DataExpanded* leftC=dynamic_cast<DataExpanded*>(m_data.get());  
      EsysAssert((leftC!=0),"Programming error - casting to DataExpanded.");  
      escript::binaryOp(*leftC,temp.getView(),operation);  
    } else if (isTagged()) {  
      DataTagged* leftC=dynamic_cast<DataTagged*>(m_data.get());  
      EsysAssert((leftC!=0), "Programming error - casting to DataTagged.");  
      escript::binaryOp(*leftC,temp.getView(),operation);  
    } else if (isConstant()) {  
      DataConstant* leftC=dynamic_cast<DataConstant*>(m_data.get());  
      EsysAssert((leftC!=0),"Programming error - casting to DataConstant.");  
      escript::binaryOp(*leftC,temp.getView(),operation);  
    }  
1624  }  }
1625    
1626  /**  /**
# Line 1190  Data::unaryOp(UnaryFunction operation) Line 1676  Data::unaryOp(UnaryFunction operation)
1676    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.
1677    Calls escript::algorithm.    Calls escript::algorithm.
1678  */  */
1679  template <class UnaryFunction>  template <class BinaryFunction>
1680  inline  inline
1681  double  double
1682  Data::algorithm(UnaryFunction operation) const  Data::algorithm(BinaryFunction operation, double initial_value) const
1683  {  {
1684    if (isExpanded()) {    if (isExpanded()) {
1685      DataExpanded* leftC=dynamic_cast<DataExpanded*>(m_data.get());      DataExpanded* leftC=dynamic_cast<DataExpanded*>(m_data.get());
1686      EsysAssert((leftC!=0), "Programming error - casting to DataExpanded.");      EsysAssert((leftC!=0), "Programming error - casting to DataExpanded.");
1687      return escript::algorithm(*leftC,operation);      return escript::algorithm(*leftC,operation,initial_value);
1688    } else if (isTagged()) {    } else if (isTagged()) {
1689      DataTagged* leftC=dynamic_cast<DataTagged*>(m_data.get());      DataTagged* leftC=dynamic_cast<DataTagged*>(m_data.get());
1690      EsysAssert((leftC!=0), "Programming error - casting to DataTagged.");      EsysAssert((leftC!=0), "Programming error - casting to DataTagged.");
1691      return escript::algorithm(*leftC,operation);      return escript::algorithm(*leftC,operation,initial_value);
1692    } else if (isConstant()) {    } else if (isConstant()) {
1693      DataConstant* leftC=dynamic_cast<DataConstant*>(m_data.get());      DataConstant* leftC=dynamic_cast<DataConstant*>(m_data.get());
1694      EsysAssert((leftC!=0), "Programming error - casting to DataConstant.");      EsysAssert((leftC!=0), "Programming error - casting to DataConstant.");
1695      return escript::algorithm(*leftC,operation);      return escript::algorithm(*leftC,operation,initial_value);
1696    }    }
1697    return 0;    return 0;
1698  }  }
# Line 1219  Data::algorithm(UnaryFunction operation) Line 1705  Data::algorithm(UnaryFunction operation)
1705    rank 0 Data object.    rank 0 Data object.
1706    Calls escript::dp_algorithm.    Calls escript::dp_algorithm.
1707  */  */
1708  template <class UnaryFunction>  template <class BinaryFunction>
1709  inline  inline
1710  Data  Data
1711  dp_algorithm(const Data& data,  Data::dp_algorithm(BinaryFunction operation, double initial_value) const
              UnaryFunction operation)  
1712  {  {
1713    Data result(0,DataArrayView::ShapeType(),data.getFunctionSpace(),data.isExpanded());    if (isExpanded()) {
1714    if (data.isExpanded()) {      Data result(0,DataArrayView::ShapeType(),getFunctionSpace(),isExpanded());
1715      DataExpanded* dataE=dynamic_cast<DataExpanded*>(data.m_data.get());      DataExpanded* dataE=dynamic_cast<DataExpanded*>(m_data.get());
1716      DataExpanded* resultE=dynamic_cast<DataExpanded*>(result.m_data.get());      DataExpanded* resultE=dynamic_cast<DataExpanded*>(result.m_data.get());
1717      EsysAssert((dataE!=0), "Programming error - casting data to DataExpanded.");      EsysAssert((dataE!=0), "Programming error - casting data to DataExpanded.");
1718      EsysAssert((resultE!=0), "Programming error - casting result to DataExpanded.");      EsysAssert((resultE!=0), "Programming error - casting result to DataExpanded.");
1719      escript::dp_algorithm(*dataE,*resultE,operation);      escript::dp_algorithm(*dataE,*resultE,operation,initial_value);
1720    } else if (data.isTagged()) {      return result;
1721      DataTagged* dataT=dynamic_cast<DataTagged*>(data.m_data.get());    } else if (isTagged()) {
1722        DataTagged* dataT=dynamic_cast<DataTagged*>(m_data.get());
1723        DataArrayView::ShapeType viewShape;
1724        DataArrayView::ValueType viewData(1);
1725        viewData[0]=0;
1726        DataArrayView defaultValue(viewData,viewShape);
1727        DataTagged::TagListType keys;
1728        DataTagged::ValueListType values;
1729        DataTagged::DataMapType::const_iterator i;
1730        for (i=dataT->getTagLookup().begin();i!=dataT->getTagLookup().end();i++) {
1731          keys.push_back(i->first);
1732          values.push_back(defaultValue);
1733        }
1734        Data result(keys,values,defaultValue,getFunctionSpace());
1735      DataTagged* resultT=dynamic_cast<DataTagged*>(result.m_data.get());      DataTagged* resultT=dynamic_cast<DataTagged*>(result.m_data.get());
1736      EsysAssert((dataT!=0), "Programming error - casting data to DataTagged.");      EsysAssert((dataT!=0), "Programming error - casting data to DataTagged.");
1737      EsysAssert((resultT!=0), "Programming error - casting result to DataTagged.");      EsysAssert((resultT!=0), "Programming error - casting result to DataTagged.");
1738      escript::dp_algorithm(*dataT,*resultT,operation);      escript::dp_algorithm(*dataT,*resultT,operation,initial_value);
1739    } else if (data.isConstant()) {      return result;
1740      DataConstant* dataC=dynamic_cast<DataConstant*>(data.m_data.get());    } else if (isConstant()) {
1741        Data result(0,DataArrayView::ShapeType(),getFunctionSpace(),isExpanded());
1742        DataConstant* dataC=dynamic_cast<DataConstant*>(m_data.get());
1743      DataConstant* resultC=dynamic_cast<DataConstant*>(result.m_data.get());      DataConstant* resultC=dynamic_cast<DataConstant*>(result.m_data.get());
1744      EsysAssert((dataC!=0), "Programming error - casting data to DataConstant.");      EsysAssert((dataC!=0), "Programming error - casting data to DataConstant.");
1745      EsysAssert((resultC!=0), "Programming error - casting result to DataConstant.");      EsysAssert((resultC!=0), "Programming error - casting result to DataConstant.");
1746      escript::dp_algorithm(*dataC,*resultC,operation);      escript::dp_algorithm(*dataC,*resultC,operation,initial_value);
1747        return result;
1748    }    }
1749    return result;    Data falseRetVal; // to keep compiler quiet
1750      return falseRetVal;
1751  }  }
1752    
1753  }  }

Legend:
Removed from v.97  
changed lines
  Added in v.876

  ViewVC Help
Powered by ViewVC 1.1.26