1 |
// $Id$ |
2 |
/* |
3 |
****************************************************************************** |
4 |
* * |
5 |
* COPYRIGHT ACcESS 2004 - All Rights Reserved * |
6 |
* * |
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 * |
9 |
* consent of ACcESS. Copying, use or modification of this software * |
10 |
* by any unauthorised person is illegal unless that person has a software * |
11 |
* license agreement with ACcESS. * |
12 |
* * |
13 |
****************************************************************************** |
14 |
*/ |
15 |
|
16 |
#if !defined escript_AbstractDomain_20040609_H |
17 |
#define escript_AbstractDomain_20040609_H |
18 |
|
19 |
#include <string> |
20 |
#include <boost/python/dict.hpp> |
21 |
|
22 |
namespace escript { |
23 |
|
24 |
// |
25 |
// forward declarations |
26 |
class Data; |
27 |
//class AbstractSystemMatrix; |
28 |
//class FunctionSpace; |
29 |
|
30 |
/** |
31 |
\brief |
32 |
Base class for all escript domains. |
33 |
|
34 |
Description: |
35 |
Base class for all escript domains. |
36 |
*/ |
37 |
|
38 |
class AbstractDomain { |
39 |
|
40 |
public: |
41 |
|
42 |
/** |
43 |
\brief |
44 |
Default constructor for AbstractDomain. |
45 |
|
46 |
Description: |
47 |
Default constructor for AbstractDomain. As the name suggests |
48 |
this is intended to be an abstract base class but by making it |
49 |
constructable we avoid a boost.python wrapper class. A call to |
50 |
almost any of the base class functions will throw an exception |
51 |
as they are not intended to be used directly, but are overridden |
52 |
by the underlying solver package which escript is linked to. |
53 |
|
54 |
By default, this class is overridden by the class NullDomain. |
55 |
|
56 |
Preconditions: |
57 |
Describe any preconditions. |
58 |
|
59 |
Throws: |
60 |
Describe any exceptions thrown. |
61 |
*/ |
62 |
AbstractDomain(); |
63 |
|
64 |
/** |
65 |
\brief |
66 |
Destructor for AbstractDomain. |
67 |
|
68 |
Description: |
69 |
Destructor for AbstractDomain. |
70 |
*/ |
71 |
virtual ~AbstractDomain(); |
72 |
|
73 |
/** |
74 |
\brief |
75 |
Returns true if the given integer is a valid function space type |
76 |
for this domain. |
77 |
*/ |
78 |
virtual bool isValidFunctionSpaceType(int functionSpaceType) const; |
79 |
|
80 |
/** |
81 |
\brief |
82 |
Return a description for this domain. |
83 |
*/ |
84 |
virtual std::string getDescription() const; |
85 |
|
86 |
/** |
87 |
\brief |
88 |
Return a description for the given function space type code. |
89 |
*/ |
90 |
virtual std::string functionSpaceTypeAsString(int functionSpaceType) const; |
91 |
|
92 |
/** |
93 |
\brief |
94 |
Returns the spatial dimension of the domain. |
95 |
|
96 |
This has to be implemented by the actual Domain adapter. |
97 |
*/ |
98 |
virtual int getDim() const; |
99 |
|
100 |
/** |
101 |
\brief |
102 |
Return true if given domains are equal. |
103 |
*/ |
104 |
virtual bool operator==(const AbstractDomain& other) const; |
105 |
virtual bool operator!=(const AbstractDomain& other) const; |
106 |
|
107 |
/** |
108 |
\brief |
109 |
Writes the domain to an external file filename. |
110 |
|
111 |
This has to be implemented by the actual Domain adapter. |
112 |
*/ |
113 |
virtual void write(const std::string& filename) const; |
114 |
|
115 |
/** |
116 |
\brief |
117 |
Return the number of data points per sample, and the number of samples as a pair. |
118 |
|
119 |
This has to be implemented by the actual Domain adapter. |
120 |
|
121 |
\param functionSpaceCode Input - Code for the function space type. |
122 |
\return pair, first - number of data points per sample, second - number of samples |
123 |
*/ |
124 |
virtual std::pair<int,int> getDataShape(int functionSpaceCode) const; |
125 |
|
126 |
/** |
127 |
\brief |
128 |
Return the tag key for the given sample number. |
129 |
\param functionSpaceType Input - The function space type. |
130 |
\param sampleNo Input - The sample number. |
131 |
*/ |
132 |
virtual int getTagFromSampleNo(int functionSpaceType, int sampleNo) const; |
133 |
|
134 |
/** |
135 |
\brief |
136 |
Return the reference number of the given sample number. |
137 |
\param functionSpaceType Input - The function space type. |
138 |
\param sampleNo Input - The sample number. |
139 |
*/ |
140 |
virtual int getReferenceNoFromSampleNo(int functionSpaceType, int sampleNo) const; |
141 |
|
142 |
/** |
143 |
\brief |
144 |
Assigns new location to the domain. |
145 |
|
146 |
This has to be implemented by the actual Domain adapter. |
147 |
*/ |
148 |
virtual void setNewX(const escript::Data& arg); |
149 |
|
150 |
/** |
151 |
\brief |
152 |
Interpolates data given on source onto target where source and target have to be given on the same domain. |
153 |
|
154 |
This has to be implemented by the actual Domain adapter. |
155 |
*/ |
156 |
virtual void interpolateOnDomain(escript::Data& target,const escript::Data& source) const; |
157 |
virtual bool probeInterpolationOnDomain(int functionSpaceType_source,int functionSpaceType_target) const; |
158 |
|
159 |
/** |
160 |
\brief |
161 |
Interpolates data given on source onto target where source and target are given on different domains. |
162 |
|
163 |
This has to be implemented by the actual Domain adapter. |
164 |
*/ |
165 |
virtual void interpolateACross(escript::Data& target, const escript::Data& source) const; |
166 |
virtual bool probeInterpolationACross(int functionSpaceType_source,const AbstractDomain& targetDomain, int functionSpaceType_target) const; |
167 |
|
168 |
/** |
169 |
\brief |
170 |
Returns locations in the domain. The function space is chosen appropriately. |
171 |
*/ |
172 |
virtual escript::Data getX() const; |
173 |
|
174 |
/** |
175 |
\brief |
176 |
Return boundary normals. The function space is chosen appropriately. |
177 |
*/ |
178 |
virtual escript::Data getNormal() const; |
179 |
|
180 |
/** |
181 |
\brief |
182 |
Returns the local size of samples. The function space is chosen appropriately. |
183 |
*/ |
184 |
virtual escript::Data getSize() const; |
185 |
|
186 |
/** |
187 |
\brief |
188 |
Copies the location of data points on the domain into out. |
189 |
The actual function space to be considered |
190 |
is defined by out. out has to be defined on this. |
191 |
|
192 |
This has to be implemented by the actual Domain adapter. |
193 |
*/ |
194 |
virtual void setToX(escript::Data& out) const; |
195 |
|
196 |
/** |
197 |
\brief |
198 |
Copies the surface normals at data points into out. |
199 |
The actual function space to be considered |
200 |
is defined by out. out has to be defined on this. |
201 |
|
202 |
This has to be implemented by the actual Domain adapter. |
203 |
*/ |
204 |
virtual void setToNormal(escript::Data& out) const; |
205 |
|
206 |
/** |
207 |
\brief |
208 |
Copies the size of samples into out. The actual |
209 |
function space to be considered |
210 |
is defined by out. out has to be defined on this. |
211 |
|
212 |
This has to be implemented by the actual Domain adapter. |
213 |
*/ |
214 |
virtual void setToSize(escript::Data& out) const; |
215 |
|
216 |
/** |
217 |
\brief |
218 |
Copies the gradient of arg into grad. The actual function space to be considered |
219 |
for the gradient is defined by grad. arg and grad have to be defined on this. |
220 |
|
221 |
This has to be implemented by the actual Domain adapter. |
222 |
*/ |
223 |
virtual void setToGradient(escript::Data& grad, const escript::Data& arg) const; |
224 |
/** |
225 |
\brief |
226 |
Saves a dictonary of Data objects to an OpenDX input file. The keywords are used as identifier |
227 |
|
228 |
This has to be implemented by the actual Domain adapter. |
229 |
*/ |
230 |
virtual void saveDX(const std::string& filename,const boost::python::dict& arg) const; |
231 |
|
232 |
/** |
233 |
\brief |
234 |
Saves a dictonary of Data objects to an VTK XML input file. The keywords are used as identifier |
235 |
|
236 |
This has to be implemented by the actual Domain adapter. |
237 |
*/ |
238 |
virtual void saveVTK(const std::string& filename,const boost::python::dict& arg) const; |
239 |
|
240 |
/** |
241 |
\brief |
242 |
returns the function space representation of the type functionSpaceCode on this domain |
243 |
as a vtkObject. |
244 |
|
245 |
This has to be implemented by the actual Domain adapter. |
246 |
*/ |
247 |
//virtual vtkObject createVtkObject(int functionSpaceCode) const; |
248 |
|
249 |
/** |
250 |
\brief |
251 |
returns true if data on this domain and a function space of type functionSpaceCode has to |
252 |
considered as cell centered data. |
253 |
|
254 |
This has to be implemented by the actual Domain adapter. |
255 |
*/ |
256 |
virtual bool isCellOriented(int functionSpaceCode) const; |
257 |
|
258 |
/** |
259 |
\brief |
260 |
Throw a standard exception. This function is called if any attempt |
261 |
is made to use a base class function. |
262 |
*/ |
263 |
void throwStandardException(const std::string& functionName) const; |
264 |
|
265 |
protected: |
266 |
|
267 |
private: |
268 |
|
269 |
}; |
270 |
|
271 |
} // end of namespace |
272 |
|
273 |
#endif |