BEM++  2.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
geometry_imp.hpp
1 // Copyright (C) 2011-2012 by the BEM++ Authors
2 //
3 // Permission is hereby granted, free of charge, to any person obtaining a copy
4 // of this software and associated documentation files (the "Software"), to deal
5 // in the Software without restriction, including without limitation the rights
6 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 // copies of the Software, and to permit persons to whom the Software is
8 // furnished to do so, subject to the following conditions:
9 //
10 // The above copyright notice and this permission notice shall be included in
11 // all copies or substantial portions of the Software.
12 //
13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19 // THE SOFTWARE.
20 
21 #ifndef bempp_geometry_imp_hpp
22 #define bempp_geometry_imp_hpp
23 
24 #include "../common/common.hpp"
25 
26 #include "geometry.hpp" // keep IDEs happy
27 #include "../fiber/geometrical_data.hpp"
28 
29 #include <algorithm>
30 
31 namespace Bempp
32 {
33 
34 inline void Geometry::setup(const arma::Mat<double>& corners,
35  const arma::Col<char>& auxData)
36 {
37  setupImpl(corners, auxData);
38 }
39 
40 inline void Geometry::setup(const arma::Mat<float>& corners,
41  const arma::Col<char>& auxData)
42 {
43  arma::Mat<double> cornersDouble;
44  convertMat(corners, cornersDouble);
45  setupImpl(cornersDouble, auxData);
46 }
47 
48 inline void Geometry::getCorners(arma::Mat<double>& c) const
49 {
50  getCornersImpl(c);
51 }
52 
53 inline void Geometry::getCorners(arma::Mat<float>& c) const
54 {
55  arma::Mat<double> cDouble;
56  getCornersImpl(cDouble);
57  convertMat(cDouble, c);
58 }
59 
60 inline void Geometry::local2global(const arma::Mat<double>& local,
61  arma::Mat<double>& global) const
62 {
63  local2globalImpl(local, global);
64 }
65 
66 inline void Geometry::local2global(const arma::Mat<float>& local,
67  arma::Mat<float>& global) const
68 {
69  arma::Mat<double> localDouble, globalDouble;
70  convertMat(local, localDouble);
71  local2globalImpl(localDouble, globalDouble);
72  convertMat(globalDouble, global);
73 }
74 
75 inline void Geometry::global2local(const arma::Mat<double>& global,
76  arma::Mat<double>& local) const
77 {
78  global2localImpl(global, local);
79 }
80 
81 inline void Geometry::global2local(const arma::Mat<float>& global,
82  arma::Mat<float>& local) const
83 {
84  arma::Mat<double> localDouble, globalDouble;
85  convertMat(global, globalDouble);
86  global2localImpl(globalDouble, localDouble);
87  convertMat(localDouble, local);
88 }
89 
90 inline void Geometry::getIntegrationElements(const arma::Mat<double>& local,
91  arma::Row<double>& int_element) const
92 {
93  getIntegrationElementsImpl(local, int_element);
94 }
95 
96 inline void Geometry::getIntegrationElements(const arma::Mat<float>& local,
97  arma::Row<float>& int_element) const
98 {
99  arma::Mat<double> localDouble;
100  arma::Row<double> int_elementDouble;
101  convertMat(local, localDouble);
102  getIntegrationElementsImpl(localDouble, int_elementDouble);
103  convertMat(int_elementDouble, int_element);
104 }
105 
106 inline void Geometry::getCenter(arma::Col<double>& c) const
107 {
108  getCenterImpl(c);
109 }
110 
111 inline void Geometry::getCenter(arma::Col<float>& c) const
112 {
113  arma::Col<double> cDouble;
114  getCenterImpl(cDouble);
115  convertMat(cDouble, c);
116 }
117 
119  const arma::Mat<double>& local,
120  arma::Cube<double>& jacobian_t) const
121 {
122  const size_t n = local.n_cols;
123  const size_t mdim = dim();
124  const size_t cdim = dimWorld();
125  jacobian_t.set_size(mdim, cdim, n);
126  Fiber::_3dArray<double> fiber_jacobian_t(
127  mdim, cdim, n, jacobian_t.memptr(),
128  true /* strict */);
129  getJacobiansTransposedImpl(local, fiber_jacobian_t);
130 }
131 
133  const arma::Mat<float>& local,
134  arma::Cube<float>& jacobian_t) const
135 {
136  arma::Mat<double> localDouble;
137  Fiber::_3dArray<double> jacobian_tDouble;
138  convertMat(local, localDouble);
139  getJacobiansTransposedImpl(localDouble, jacobian_tDouble);
140  convertCube(jacobian_tDouble, jacobian_t);
141 }
142 
144  const arma::Mat<double>& local,
145  Fiber::_3dArray<double>& jacobian_t) const
146 {
147  getJacobiansTransposedImpl(local, jacobian_t);
148 }
149 
151  const arma::Mat<float>& local,
152  Fiber::_3dArray<float>& jacobian_t) const
153 {
154  arma::Mat<double> localDouble;
155  Fiber::_3dArray<double> jacobian_tDouble;
156  convertMat(local, localDouble);
157  getJacobiansTransposedImpl(localDouble, jacobian_tDouble);
158  convertCube(jacobian_tDouble, jacobian_t);
159 }
160 
162  const arma::Mat<double>& local,
163  arma::Cube<double>& jacobian_inv_t) const
164 {
165  const size_t n = local.n_cols;
166  const size_t mdim = dim();
167  const size_t cdim = dimWorld();
168  jacobian_inv_t.set_size(cdim, mdim, n);
169  Fiber::_3dArray<double> fiber_jacobian_inv_t(
170  cdim, mdim, n, jacobian_inv_t.memptr(),
171  true /* strict */);
172  getJacobianInversesTransposed(local, fiber_jacobian_inv_t);
173 }
174 
176  const arma::Mat<float>& local,
177  arma::Cube<float>& jacobian_inv_t) const
178 {
179  arma::Mat<double> localDouble;
180  Fiber::_3dArray<double> jacobian_inv_tDouble;
181  convertMat(local, localDouble);
182  getJacobianInversesTransposed(localDouble, jacobian_inv_tDouble);
183  convertCube(jacobian_inv_tDouble, jacobian_inv_t);
184 }
185 
187  const arma::Mat<double>& local,
188  Fiber::_3dArray<double>& jacobian_inv_t) const
189 {
190  getJacobianInversesTransposedImpl(local, jacobian_inv_t);
191 }
192 
194  const arma::Mat<float>& local,
195  Fiber::_3dArray<float>& jacobian_inv_t) const
196 {
197  arma::Mat<double> localDouble;
198  Fiber::_3dArray<double> jacobian_inv_tDouble;
199  convertMat(local, localDouble);
200  getJacobianInversesTransposedImpl(localDouble, jacobian_inv_tDouble);
201  convertCube(jacobian_inv_tDouble, jacobian_inv_t);
202 }
203 
204 inline void Geometry::getNormals(const arma::Mat<double>& local,
205  arma::Mat<double>& normal) const
206 {
207  getNormalsImpl(local, normal);
208 }
209 
210 inline void Geometry::getNormals(const arma::Mat<float>& local,
211  arma::Mat<float>& normal) const
212 {
213  arma::Mat<double> localDouble, normalDouble;
214  convertMat(local, localDouble);
215  getNormalsImpl(localDouble, normalDouble);
216  convertMat(normalDouble, normal);
217 }
218 
219 inline void Geometry::getData(size_t what, const arma::Mat<double>& local,
220  Fiber::GeometricalData<double>& data) const
221 {
222  getDataImpl(what, local, data);
223 }
224 
225 inline void Geometry::getData(size_t what, const arma::Mat<float>& local,
226  Fiber::GeometricalData<float>& data) const
227 {
228  arma::Mat<double> localDouble;
230  convertMat(local, localDouble);
231  getDataImpl(what, localDouble, dataDouble);
232  convertMat(dataDouble.globals, data.globals);
233  convertMat(dataDouble.normals, data.normals);
234  convertMat(dataDouble.integrationElements, data.integrationElements);
235  convertCube(dataDouble.jacobiansTransposed, data.jacobiansTransposed);
236  convertCube(dataDouble.jacobianInversesTransposed, data.jacobianInversesTransposed);
237 }
238 
239 template <typename T1, typename T2>
240 void Geometry::convertMat(const arma::Mat<T1>& in, arma::Mat<T2>& out) const
241 {
242  out.set_size(in.n_rows, in.n_cols);
243  for (size_t elem = 0; elem < in.n_elem; ++elem)
244  out[elem] = in[elem];
245 }
246 
247 template <typename T1, typename T2>
248 void Geometry::convertCube(const arma::Cube<T1>& in, arma::Cube<T2>& out) const
249 {
250  out.set_size(in.n_rows, in.n_cols, in.n_slices);
251  for (size_t elem = 0; elem < in.n_elem; ++elem)
252  out[elem] = in[elem];
253 }
254 
255 template <typename T1, typename T2>
256 void Geometry::convertCube(const Fiber::_3dArray<T1>& in, Fiber::_3dArray<T2>& out) const
257 {
258  out.set_size(in.extent(0), in.extent(1), in.extent(2));
259  std::copy(in.begin(), in.end(), out.begin());
260 }
261 
262 template <typename T1, typename T2>
263 void Geometry::convertCube(const Fiber::_3dArray<T1>& in, arma::Cube<T2>& out) const
264 {
265  out.set_size(in.extent(0), in.extent(1), in.extent(2));
266  std::copy(in.begin(), in.end(), out.begin());
267 }
268 
269 } // namespace Bempp
270 
271 #endif
void local2global(const arma::Mat< double > &local, arma::Mat< double > &global) const
Convert local (logical) to global (physical) coordinates.
Definition: geometry_imp.hpp:60
virtual int dim() const =0
Dimension of the geometry.
void setup(const arma::Mat< double > &corners, const arma::Col< char > &auxData)
Set up geometry of an entity.
Definition: geometry_imp.hpp:34
void getJacobiansTransposed(const arma::Mat< double > &local, arma::Cube< double > &jacobian_t) const
Get transposed Jacobian matrices at specified points.
Definition: geometry_imp.hpp:118
Storage of geometrical data.
Definition: geometrical_data.hpp:54
void global2local(const arma::Mat< double > &global, arma::Mat< double > &local) const
Convert global (physical) to local (logical) coordinates.
Definition: geometry_imp.hpp:75
void getIntegrationElements(const arma::Mat< double > &local, arma::Row< double > &int_element) const
Get the factor appearing in the integral transformation formula at specified points.
Definition: geometry_imp.hpp:90
void getCenter(arma::Col< double > &c) const
Get center of geometry.
Definition: geometry_imp.hpp:106
void getJacobianInversesTransposed(const arma::Mat< double > &local, arma::Cube< double > &jacobian_inv_t) const
Get inverses of transposed Jacobian matrices at specified points.
Definition: geometry_imp.hpp:161
virtual int dimWorld() const =0
Dimension of the space containing the geometry.
void getNormals(const arma::Mat< double > &local, arma::Mat< double > &normal) const
Get unit vectors normal to the entity at specified points.
Definition: geometry_imp.hpp:204
Simple implementation of a 3D Fortran-ordered array.
Definition: _3d_array.hpp:48
void getCorners(arma::Mat< double > &c) const
Get the positions of the geometry corners.
Definition: geometry_imp.hpp:48