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

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

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

trunk/esys2/escript/src/Data/AbstractDomain.h revision 115 by jgs, Fri Mar 4 07:12:47 2005 UTC trunk/escript/src/AbstractDomain.h revision 2881 by jfenwick, Thu Jan 28 02:03:15 2010 UTC
# Line 1  Line 1 
1  // $Id$  
2  /*  /*******************************************************
3   ******************************************************************************  *
4   *                                                                            *  * Copyright (c) 2003-2010 by University of Queensland
5   *       COPYRIGHT  ACcESS 2004 -  All Rights Reserved                        *  * Earth Systems Science Computational Center (ESSCC)
6   *                                                                            *  * http://www.uq.edu.au/esscc
7   * This software is the property of ACcESS. No part of this code              *  *
8   * may be copied in any form or by any means without the expressed written    *  * Primary Business: Queensland, Australia
9   * consent of ACcESS.  Copying, use or modification of this software          *  * Licensed under the Open Software License version 3.0
10   * by any unauthorised person is illegal unless that person has a software    *  * http://www.opensource.org/licenses/osl-3.0.php
11   * license agreement with ACcESS.                                             *  *
12   *                                                                            *  *******************************************************/
13   ******************************************************************************  
 */  
14    
15  #if !defined escript_AbstractDomain_20040609_H  #if !defined escript_AbstractDomain_20040609_H
16  #define escript_AbstractDomain_20040609_H  #define escript_AbstractDomain_20040609_H
17    
18    #include "system_dep.h"
19    
20    #include <vector>
21  #include <string>  #include <string>
22  #include <utility>  #include <map>
23    #include <boost/python/dict.hpp>
24    #include <boost/python/list.hpp>
25    #include "paso/Paso_MPI.h"
26    
 namespace escript {  
27    
28      // forward declarations of certain classes which will be used  #include "Pointers.h"
     class Data;  
     class AbstractSystemMatrix;  
     class FunctionSpace;  
29    
30    namespace escript {
31    // class forward declarations
32    class Data;
33  /**  /**
34     \brief     \brief
35     Base class for all escript domains.     Base class for all escript domains.
# Line 34  namespace escript { Line 38  namespace escript {
38     Base class for all escript domains.     Base class for all escript domains.
39  */  */
40    
41  class AbstractDomain {  class AbstractDomain;
42    
43    typedef POINTER_WRAPPER_CLASS(AbstractDomain) Domain_ptr;
44    typedef POINTER_WRAPPER_CLASS(const AbstractDomain) const_Domain_ptr;
45    
46    class AbstractDomain : public REFCOUNT_BASE_CLASS(AbstractDomain){
47    
48   public:   public:
49    
50    /**
51    \brief Returns smart pointer which is managing this object.
52    If one does not exist yet it creates one.
53    
54    Note: This is _not_ equivalent to weak_ptr::lock.
55    */
56       ESCRIPT_DLL_API
57       Domain_ptr getPtr();
58       ESCRIPT_DLL_API
59       const_Domain_ptr getPtr() const;
60    
61       // structure holding values for X, size and normal
62       typedef int StatusType;
63       struct ValueBuffer
64       {
65           StatusType m_status;
66           boost::shared_ptr<Data> m_data;
67       };
68       typedef struct ValueBuffer ValueBuffer;
69    
70       //
71       // map from function space type code to value buffer
72       typedef std::map<int, ValueBuffer> BufferMapType;
73    
74    
75    /**    /**
76       \brief       \brief
77       Default constructor for AbstractDomain       Default constructor for AbstractDomain.
78    
79       Description:       Description:
80       Default constructor for AbstractDomain. As the name suggests       Default constructor for AbstractDomain. As the name suggests
81       this is intended to be an abstract base class but by making it       this is intended to be an abstract base class but by making it
82       constructable avoid a boost.python wrapper class. A call to       constructable we avoid a boost.python wrapper class. A call to
83       almost any of the base class functions will throw an exception       almost any of the base class functions will throw an exception
84       as they are not intended to be used directly, but are overridden       as they are not intended to be used directly, but are overridden
85       by the underlying solver package which is linked to.       by the underlying solver package which escript is linked to.
86    
87       By default, this class is overridden by the class NullDomain.       By default, this class is overridden by the class NullDomain.
88    
89       Preconditions:       Preconditions:
90       Describe any preconditions       Describe any preconditions.
91    
92       Throws:       Throws:
93       Describe any exceptions thrown       Describe any exceptions thrown.
94    */    */
95      ESCRIPT_DLL_API
96    AbstractDomain();    AbstractDomain();
97    
98    /**    /**
99       \brief       \brief
100       Destructor for AbstractDomain       Destructor for AbstractDomain.
101    
102       Description:       Description:
103       Destructor for AbstractDomain       Destructor for AbstractDomain.
104    */    */
105      ESCRIPT_DLL_API
106    virtual ~AbstractDomain();    virtual ~AbstractDomain();
107    
108    /**    /**
109       \brief       \brief
110         return the number of processors used for this domain
111      */
112      ESCRIPT_DLL_API
113      virtual int getMPISize() const;
114      /**
115         \brief
116         return the number MPI rank of this processor
117      */
118    
119      ESCRIPT_DLL_API
120      virtual int getMPIRank() const;
121    
122      /**
123         \brief
124         If compiled for MPI then execute an MPI_Barrier, else do nothing
125      */
126    
127      ESCRIPT_DLL_API
128      virtual void MPIBarrier() const;
129      /**
130         \brief
131         Return true if on MPI master, else false
132      */
133    
134      ESCRIPT_DLL_API
135      virtual bool onMasterProcessor() const;
136    
137      /**
138      \brief get the communicator for this domain.
139      Returns 0 on non-MPI builds
140      Routine must be implemented by the DomainAdapter
141      */
142      ESCRIPT_DLL_API
143      virtual
144    #ifdef PASO_MPI
145      MPI_Comm
146    #else
147      unsigned int
148    #endif
149      getMPIComm() const;
150    
151      /**
152         \brief
153       Returns true if the given integer is a valid function space type       Returns true if the given integer is a valid function space type
154       for this domain.       for this domain.
155    */    */
156      ESCRIPT_DLL_API
157    virtual bool isValidFunctionSpaceType(int functionSpaceType) const;    virtual bool isValidFunctionSpaceType(int functionSpaceType) const;
158    
159    /**    /**
160       \brief       \brief
161       Return a description for this domain       Return a description for this domain.
162    */    */
163      ESCRIPT_DLL_API
164    virtual std::string getDescription() const;    virtual std::string getDescription() const;
165    
166    /**    /**
167       \brief       \brief
168       Return a description for the given function space type code       Return a description for the given function space type code.
169    */    */
170      ESCRIPT_DLL_API
171    virtual std::string functionSpaceTypeAsString(int functionSpaceType) const;    virtual std::string functionSpaceTypeAsString(int functionSpaceType) const;
172    
173    /**    /**
174       \brief       \brief
      Throw a standard exception. This function is called if any attempt  
      is made to use a base class function.  
   */  
   void throwStandardException(const std::string& functionName) const;  
   
   /**  
      \brief  
175        Returns the spatial dimension of the domain.        Returns the spatial dimension of the domain.
176        has to be implemented by the actual Domain adapter.  
177          This has to be implemented by the actual Domain adapter.
178    */    */
179      ESCRIPT_DLL_API
180    virtual int getDim() const;    virtual int getDim() const;
181    
182    /**    /**
183     \brief       \brief
184     Return true if given domains are equal.       Return true if given domains are equal.
185    */    */
186    bool operator==(const AbstractDomain& other) const;    ESCRIPT_DLL_API
187    bool operator!=(const AbstractDomain& other) const;    virtual bool operator==(const AbstractDomain& other) const;
188      ESCRIPT_DLL_API
189      virtual bool operator!=(const AbstractDomain& other) const;
190    
191    /**    /**
192       \brief       \brief
193       Writes the doamin to an external file filename.       Writes the domain to an external file filename.
194    
195       This has to be implemented by the actual Domain adapter.       This has to be implemented by the actual Domain adapter.
196    */    */
197      ESCRIPT_DLL_API
198    virtual void write(const std::string& filename) const;    virtual void write(const std::string& filename) const;
199    
200    /**    /**
201       \brief       \brief
202       Sets the tagList pointer and length of tag list numTags.       dumps the domain to an external file filename.
   */  
   virtual void getTagList(int functionSpaceType, int** tagList, int* numTags) const;  
203    
204    /**       This has to be implemented by the actual Domain adapter.
      \brief  
      Sets the referenceNoList pointer and length of tag list numReferenceNo.  
205    */    */
206    virtual void getReferenceNoList(int functionSpaceType, int** referenceNoList, int* numReferenceNo) const;    ESCRIPT_DLL_API
207      virtual void dump(const std::string& filename) const;
208    
209    /**    /**
210       \brief       \brief
211       Return the number of data points per sample, and the number of samples as a pair.       Return the number of data points per sample, and the number of samples as a pair.
212       has to be implemented by the actual Domain adapter.  
213         This has to be implemented by the actual Domain adapter.
214    
215       \param functionSpaceCode Input - Code for the function space type.       \param functionSpaceCode Input - Code for the function space type.
216       \return pair, first - number of data points per sample, second - number of samples       \return pair, first - number of data points per sample, second - number of samples
217    */    */
218      ESCRIPT_DLL_API
219    virtual std::pair<int,int> getDataShape(int functionSpaceCode) const;    virtual std::pair<int,int> getDataShape(int functionSpaceCode) const;
220    
221    /**    /**
# Line 143  class AbstractDomain { Line 224  class AbstractDomain {
224       \param functionSpaceType Input - The function space type.       \param functionSpaceType Input - The function space type.
225       \param sampleNo Input - The sample number.       \param sampleNo Input - The sample number.
226    */    */
227      ESCRIPT_DLL_API
228    virtual int getTagFromSampleNo(int functionSpaceType, int sampleNo) const;    virtual int getTagFromSampleNo(int functionSpaceType, int sampleNo) const;
229    
230    /**    /**
231       \brief       \brief
232       Return the reference number of the given sample number.       sets a map from a clear tag name to a tag key
233         \param name Input - tag name.
234         \param tag Input - tag key.
235      */
236      ESCRIPT_DLL_API
237      virtual void setTagMap(const std::string& name,  int tag);
238    
239      /**
240         \brief
241         Return the tag key for tag name.
242         \param name Input - tag name
243      */
244      ESCRIPT_DLL_API
245      virtual int getTag(const std::string& name) const;
246    
247      /**
248         \brief
249         Returns True if name is a defined tag name
250         \param name Input - tag name
251      */
252      ESCRIPT_DLL_API
253      virtual bool isValidTagName(const std::string& name) const;
254    
255      /**
256         \brief
257         Returns all tag names in a single string sperated by commas
258      */
259      ESCRIPT_DLL_API
260      virtual std::string showTagNames() const;
261    
262      /**
263         \brief
264         Return a borrowed pointer to the sample reference number id list
265       \param functionSpaceType Input - The function space type.       \param functionSpaceType Input - The function space type.
      \param sampleNo Input - The sample number.  
266    */    */
267    virtual int getReferenceNoFromSampleNo(int functionSpaceType, int sampleNo) const;    ESCRIPT_DLL_API
268      virtual const int* borrowSampleReferenceIDs(int functionSpaceType) const;
269    
270    /**    /**
271       \brief       \brief
272       Assigns new location to the domain       Assigns new location to the domain.
273       has to be implemented by the actual Domain adapter.  
274         This has to be implemented by the actual Domain adapter.
275    */    */
276      ESCRIPT_DLL_API
277    virtual void setNewX(const escript::Data& arg);    virtual void setNewX(const escript::Data& arg);
278    
279    /**    /**
280       \brief       \brief
281       Interpolates data given on source onto target where source and target have to be given on the same domain.       Interpolates data given on source onto target where source and target have to be given on the same domain.
282       has to be implemented by the actual Domain adapter.  
283         This has to be implemented by the actual Domain adapter.
284    */    */
285      ESCRIPT_DLL_API
286    virtual void interpolateOnDomain(escript::Data& target,const escript::Data& source) const;    virtual void interpolateOnDomain(escript::Data& target,const escript::Data& source) const;
287      ESCRIPT_DLL_API
288    virtual bool probeInterpolationOnDomain(int functionSpaceType_source,int functionSpaceType_target) const;    virtual bool probeInterpolationOnDomain(int functionSpaceType_source,int functionSpaceType_target) const;
289    
290    /**    /**
291        \brief given a vector of FunctionSpace type codes, pass back a code which then can all be interpolated to.
292        \note This method must be called on the domain which the FunctionSpaces point to
293        \return true is result is valid, false if not
294      */
295      ESCRIPT_DLL_API
296      virtual
297      bool
298      commonFunctionSpace(const std::vector<int>& fs, int& resultcode) const;
299    
300      /**
301       \brief       \brief
302       Interpolates data given on source onto target where source and target are given on different domains.       Interpolates data given on source onto target where source and target are given on different domains.
303       has to be implemented by the actual Domain adapter.  
304         This has to be implemented by the actual Domain adapter.
305    */    */
306      ESCRIPT_DLL_API
307    virtual void interpolateACross(escript::Data& target, const escript::Data& source) const;    virtual void interpolateACross(escript::Data& target, const escript::Data& source) const;
308      ESCRIPT_DLL_API
309    virtual bool probeInterpolationACross(int functionSpaceType_source,const AbstractDomain& targetDomain, int functionSpaceType_target) const;    virtual bool probeInterpolationACross(int functionSpaceType_source,const AbstractDomain& targetDomain, int functionSpaceType_target) const;
310    
311    /**    /**
312       \brief returns locations in the domain. The function space is chosen appropriately.       \brief
313         Returns locations in the domain. The function space is chosen appropriately.
314    */    */
315      ESCRIPT_DLL_API
316    virtual escript::Data getX() const;    virtual escript::Data getX() const;
317    
318    /**    /**
319       \brief return boundary normals. The function space is chosen appropriately.       \brief
320         Return boundary normals. The function space is chosen appropriately.
321    */    */
322      ESCRIPT_DLL_API
323    virtual escript::Data getNormal() const;    virtual escript::Data getNormal() const;
324    
325    /**    /**
326       \brief returns the local size of samples. The function space is chosen appropriately.       \brief
327         Returns the local size of samples. The function space is chosen appropriately.
328    */    */
329      ESCRIPT_DLL_API
330    virtual escript::Data getSize() const;    virtual escript::Data getSize() const;
331        
332    /**    /**
# Line 196  class AbstractDomain { Line 334  class AbstractDomain {
334       Copies the location of data points on the domain into out.       Copies the location of data points on the domain into out.
335       The actual function space to be considered       The actual function space to be considered
336       is defined by out. out has to be defined on this.       is defined by out. out has to be defined on this.
337       has to be implemented by the actual Domain adapter.  
338         This has to be implemented by the actual Domain adapter.
339    */    */
340      ESCRIPT_DLL_API
341    virtual void setToX(escript::Data& out) const;    virtual void setToX(escript::Data& out) const;
342    
343    /**    /**
# Line 205  class AbstractDomain { Line 345  class AbstractDomain {
345       Copies the surface normals at data points into out.       Copies the surface normals at data points into out.
346       The actual function space to be considered       The actual function space to be considered
347       is defined by out. out has to be defined on this.       is defined by out. out has to be defined on this.
348       has to be implemented by the actual Domain adapter.  
349         This has to be implemented by the actual Domain adapter.
350    */    */
351      ESCRIPT_DLL_API
352    virtual void setToNormal(escript::Data& out) const;    virtual void setToNormal(escript::Data& out) const;
353    
354    /**    /**
# Line 214  class AbstractDomain { Line 356  class AbstractDomain {
356       Copies the size of samples into out. The actual       Copies the size of samples into out. The actual
357       function space to be considered       function space to be considered
358       is defined by out. out has to be defined on this.       is defined by out. out has to be defined on this.
359       has to be implemented by the actual Domain adapter.  
360         This has to be implemented by the actual Domain adapter.
361    */    */
362      ESCRIPT_DLL_API
363    virtual void setToSize(escript::Data& out) const;    virtual void setToSize(escript::Data& out) const;
364    
365    /**    /**
366       \brief       \brief
367       Copies the gradient of arg into grad. The actual function space to be considered       Copies the gradient of arg into grad. The actual function space to be considered
368       for the gradient is defined by grad. arg and grad have to be defined on this.       for the gradient is defined by grad. arg and grad have to be defined on this.
369       has to be implemented by the actual Domain adapter.  
370         This has to be implemented by the actual Domain adapter.
371    */    */
372      ESCRIPT_DLL_API
373    virtual void setToGradient(escript::Data& grad, const escript::Data& arg) const;    virtual void setToGradient(escript::Data& grad, const escript::Data& arg) const;
   
374    /**    /**
375       \brief       \brief
376       Saves data arg to an OpenDX input file.       Saves a dictonary of Data objects to an OpenDX input file. The keywords are used as identifier
377       considered as cell centered data.  
378       has to be implemented by the actual Domain adapter.       This has to be implemented by the actual Domain adapter.
379    */    */
380    virtual void saveDX(const std::string& filename,const escript::Data& arg) const;    ESCRIPT_DLL_API
381      virtual void saveDX(const std::string& filename,const boost::python::dict& arg) const;
382    
383    /**    /**
384       \brief       \brief
385       saves data arg to a VTK input file.       Saves a dictonary of Data objects to an VTK XML input file. The keywords are used as identifier.
386       considered as cell centered data.       metadata is string representing some meta data to be added. metadata_schema assign schema to namespaces used in the meta data.
387       has to be implemented by the actual Domain adapter.  
388         This has to be implemented by the actual Domain adapter.
389    */    */
390    virtual void saveVTK(const std::string& filename,const escript::Data& arg) const;    ESCRIPT_DLL_API
391      virtual void saveVTK(const std::string& filename,const boost::python::dict& arg, const std::string& metadata, const std::string& metadata_schema) const;
392    
393    /**    /**
394       \brief    \brief True if this rank owns the sample(id)
395       returns the function space representation of the type functionSpaceCode on this domain    Must be implemented by the Domain adapter
      as a vtkObject.  
      has to be implemented by the actual Domain adapter.  
396    */    */
397    //virtual vtkObject createVtkObject(int functionSpaceCode) const;    ESCRIPT_DLL_API
398      virtual bool ownSample(int fs_code, index_t id) const;
399    
400      /**
401         \brief assigns new tag newTag to all samples of functionspace with a positive
402         value of mask for any its sample point.
403    
404      */
405      ESCRIPT_DLL_API
406      virtual void setTags(const int functionSpaceType, const int newTag, const escript::Data& mask) const;
407    
408    /**    /**
409       \brief       \brief
410       returns true if data on this domain and a function space of type functionSpaceCode has to       returns true if data on this domain and a function space of type functionSpaceCode has to
411       considered as cell centered data.       considered as cell centered data.
412       has to be implemented by the actual Domain adapter.  
413         This has to be implemented by the actual Domain adapter.
414    */    */
415      ESCRIPT_DLL_API
416    virtual bool isCellOriented(int functionSpaceCode) const;    virtual bool isCellOriented(int functionSpaceCode) const;
417    
418      /**
419         \brief
420          Returns a status indicator of the domain. The status identifier should be unique over
421          the live time if the object but may be updated if changes to the domain happen, e.g.
422          modifications to its geometry.
423    
424         This has to be implemented by the actual Domain adapter.
425      */
426      ESCRIPT_DLL_API
427      virtual StatusType getStatus() const;
428    
429      /**
430         \brief
431         Throw a standard exception. This function is called if any attempt
432         is made to use a base class function.
433      */
434      ESCRIPT_DLL_API
435      void throwStandardException(const std::string& functionName) const;
436    
437      /**
438            \brief
439                      return the number of tags in use and a pointer to an array with the number of tags in use
440      */
441      ESCRIPT_DLL_API
442      virtual int getNumberOfTagsInUse(int functionSpaceCode) const;
443    
444      ESCRIPT_DLL_API
445      virtual const int* borrowListOfTagsInUse(int functionSpaceCode) const;
446    
447      /**
448        \brief Checks if this domain allows tags for the specified functionSpaceCode.
449      */
450      ESCRIPT_DLL_API
451      virtual bool canTag(int functionspacecode) const;
452    
453       /**
454       \brief returns the approximation order used for a function space functionSpaceCode
455       */
456    
457       ESCRIPT_DLL_API
458       virtual int getApproximationOrder(const int functionSpaceCode) const;
459    
460    
461   protected:   protected:
462    
463   private:   private:
464    
465       // buffer for coordinates used by function spaces
466       BufferMapType m_x_buffer;
467    
468       // buffer for normal vectors used by function spaces
469       BufferMapType m_normal_buffer;
470    
471       // buffer for normal element size used by function spaces
472       BufferMapType m_size_buffer;
473    
474  };  };
475    
476  } // end of namespace  } // end of namespace
477    
478  #endif  #endif

Legend:
Removed from v.115  
changed lines
  Added in v.2881

  ViewVC Help
Powered by ViewVC 1.1.26