1 |
|
|
2 |
/******************************************************* |
/******************************************************* |
3 |
* |
* |
4 |
* Copyright (c) 2003-2011 by University of Queensland |
* Copyright (c) 2003-2012 by University of Queensland |
5 |
* Earth Systems Science Computational Center (ESSCC) |
* Earth Systems Science Computational Center (ESSCC) |
6 |
* http://www.uq.edu.au/esscc |
* http://www.uq.edu.au/esscc |
7 |
* |
* |
16 |
|
|
17 |
#include <ripley/RipleyDomain.h> |
#include <ripley/RipleyDomain.h> |
18 |
|
|
19 |
|
struct Paso_Connector; |
20 |
|
|
21 |
namespace ripley { |
namespace ripley { |
22 |
|
|
23 |
/** |
/** |
83 |
|
|
84 |
/** |
/** |
85 |
\brief |
\brief |
86 |
copies the gradient of 'in' into 'out'. The actual function space to be |
copies the surface normals at data points into out. The actual function |
87 |
considered for the gradient is defined by 'in'. Both arguments have to |
space to be considered is defined by out. out has to be defined on this |
88 |
be defined on this domain. |
domain. |
|
*/ |
|
|
RIPLEY_DLL_API |
|
|
virtual void setToGradient(escript::Data& out, const escript::Data& in) const; |
|
|
|
|
|
/** |
|
|
\brief |
|
|
copies the integrals of the function defined by arg into integrals. |
|
|
arg has to be defined on this domain. |
|
89 |
*/ |
*/ |
90 |
RIPLEY_DLL_API |
RIPLEY_DLL_API |
91 |
virtual void setToIntegrals(std::vector<double>& integrals, const escript::Data& arg) const; |
virtual void setToNormal(escript::Data& out) const; |
92 |
|
|
93 |
/** |
/** |
94 |
\brief |
\brief |
95 |
copies the surface normals at data points into out. The actual function |
copies the size of samples into out. The actual function space to be |
96 |
space to be considered is defined by out. out has to be defined on this |
considered is defined by out. out has to be defined on this domain. |
|
domain. |
|
97 |
*/ |
*/ |
98 |
RIPLEY_DLL_API |
RIPLEY_DLL_API |
99 |
virtual void setToNormal(escript::Data& out) const; |
virtual void setToSize(escript::Data& out) const; |
100 |
|
|
101 |
/** |
/** |
102 |
\brief |
\brief |
153 |
protected: |
protected: |
154 |
virtual dim_t getNumNodes() const { return m_N0*m_N1; } |
virtual dim_t getNumNodes() const { return m_N0*m_N1; } |
155 |
virtual dim_t getNumElements() const { return m_NE0*m_NE1; } |
virtual dim_t getNumElements() const { return m_NE0*m_NE1; } |
|
virtual dim_t getNumDOF() const; |
|
156 |
virtual dim_t getNumFaceElements() const; |
virtual dim_t getNumFaceElements() const; |
157 |
|
virtual dim_t getNumDOF() const; |
158 |
|
virtual dim_t insertNeighbourNodes(IndexVector& index, index_t node) const; |
159 |
virtual void assembleCoordinates(escript::Data& arg) const; |
virtual void assembleCoordinates(escript::Data& arg) const; |
160 |
|
virtual void assembleGradient(escript::Data& out, escript::Data& in) const; |
161 |
|
virtual void assembleIntegrate(std::vector<double>& integrals, escript::Data& arg) const; |
162 |
virtual void assemblePDESingle(Paso_SystemMatrix* mat, escript::Data& rhs, |
virtual void assemblePDESingle(Paso_SystemMatrix* mat, escript::Data& rhs, |
163 |
const escript::Data& A, const escript::Data& B, |
const escript::Data& A, const escript::Data& B, |
164 |
const escript::Data& C, const escript::Data& D, |
const escript::Data& C, const escript::Data& D, |
165 |
const escript::Data& X, const escript::Data& Y, |
const escript::Data& X, const escript::Data& Y, |
166 |
const escript::Data& d, const escript::Data& y) const; |
const escript::Data& d, const escript::Data& y) const; |
167 |
//virtual void assemblePDESystem(Paso_SystemMatrix* mat, escript::Data& rhs, |
virtual void assemblePDESingleReduced(Paso_SystemMatrix* mat, |
168 |
// const escript::Data& A, const escript::Data& B, |
escript::Data& rhs, const escript::Data& A, const escript::Data& B, |
169 |
// const escript::Data& C, const escript::Data& D, |
const escript::Data& C, const escript::Data& D, |
170 |
// const escript::Data& X, const escript::Data& Y, |
const escript::Data& X, const escript::Data& Y, |
171 |
// const escript::Data& d, const escript::Data& y) const; |
const escript::Data& d, const escript::Data& y) const; |
172 |
|
virtual void assemblePDESystem(Paso_SystemMatrix* mat, escript::Data& rhs, |
173 |
|
const escript::Data& A, const escript::Data& B, |
174 |
|
const escript::Data& C, const escript::Data& D, |
175 |
|
const escript::Data& X, const escript::Data& Y, |
176 |
|
const escript::Data& d, const escript::Data& y) const; |
177 |
|
virtual void assemblePDESystemReduced(Paso_SystemMatrix* mat, |
178 |
|
escript::Data& rhs, const escript::Data& A, const escript::Data& B, |
179 |
|
const escript::Data& C, const escript::Data& D, |
180 |
|
const escript::Data& X, const escript::Data& Y, |
181 |
|
const escript::Data& d, const escript::Data& y) const; |
182 |
virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const; |
virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const; |
183 |
virtual void interpolateNodesOnElements(escript::Data& out, |
virtual void interpolateNodesOnElements(escript::Data& out, |
184 |
escript::Data& in, bool reduced) const; |
escript::Data& in, bool reduced) const; |
185 |
virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in, |
virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in, |
186 |
bool reduced) const; |
bool reduced) const; |
187 |
virtual void nodesToDOF(escript::Data& out, escript::Data& in) const; |
virtual void nodesToDOF(escript::Data& out, escript::Data& in) const; |
188 |
|
virtual void dofToNodes(escript::Data& out, escript::Data& in) const; |
189 |
|
|
190 |
private: |
private: |
191 |
void populateSampleIds(); |
void populateSampleIds(); |
192 |
int insertNeighbours(IndexVector& index, index_t node) const; |
void createPattern(); |
|
void addToSystemMatrix(Paso_SystemMatrix* in, const IndexVector& nodes_Eq, |
|
|
dim_t num_Eq, const IndexVector& nodes_Sol, dim_t num_Sol, |
|
|
const std::vector<double>& array) const; |
|
193 |
|
|
194 |
/// total number of elements in each dimension |
/// total number of elements in each dimension |
195 |
dim_t m_gNE0, m_gNE1; |
dim_t m_gNE0, m_gNE1; |
200 |
/// number of spatial subdivisions |
/// number of spatial subdivisions |
201 |
int m_NX, m_NY; |
int m_NX, m_NY; |
202 |
|
|
203 |
/// number of elements for this rank in each dimension |
/// number of elements for this rank in each dimension including shared |
204 |
dim_t m_NE0, m_NE1; |
dim_t m_NE0, m_NE1; |
205 |
|
|
206 |
|
/// number of own elements for this rank in each dimension |
207 |
|
dim_t m_ownNE0, m_ownNE1; |
208 |
|
|
209 |
/// number of nodes for this rank in each dimension |
/// number of nodes for this rank in each dimension |
210 |
dim_t m_N0, m_N1; |
dim_t m_N0, m_N1; |
211 |
|
|
225 |
// vector with first node id on each rank |
// vector with first node id on each rank |
226 |
IndexVector m_nodeDistribution; |
IndexVector m_nodeDistribution; |
227 |
|
|
228 |
// vector that maps each node to a DOF index for coupling |
// vector that maps each node to a DOF index (used for the coupler) |
229 |
mutable IndexVector m_dofMap; |
IndexVector m_dofMap; |
230 |
|
|
231 |
|
// Paso connector used by the system matrix and to interpolate DOF to |
232 |
|
// nodes |
233 |
|
Paso_Connector* m_connector; |
234 |
|
|
235 |
|
// the Paso System Matrix pattern |
236 |
|
Paso_SystemMatrixPattern* m_pattern; |
237 |
}; |
}; |
238 |
|
|
239 |
} // end of namespace ripley |
} // end of namespace ripley |