21 #ifndef bempp_geometry_imp_hpp
22 #define bempp_geometry_imp_hpp
24 #include "../common/common.hpp"
26 #include "geometry.hpp"
27 #include "../fiber/geometrical_data.hpp"
35 const arma::Col<char>& auxData)
37 setupImpl(corners, auxData);
41 const arma::Col<char>& auxData)
43 arma::Mat<double> cornersDouble;
44 convertMat(corners, cornersDouble);
45 setupImpl(cornersDouble, auxData);
55 arma::Mat<double> cDouble;
56 getCornersImpl(cDouble);
57 convertMat(cDouble, c);
61 arma::Mat<double>& global)
const
63 local2globalImpl(local, global);
67 arma::Mat<float>& global)
const
69 arma::Mat<double> localDouble, globalDouble;
70 convertMat(local, localDouble);
71 local2globalImpl(localDouble, globalDouble);
72 convertMat(globalDouble, global);
76 arma::Mat<double>& local)
const
78 global2localImpl(global, local);
82 arma::Mat<float>& local)
const
84 arma::Mat<double> localDouble, globalDouble;
85 convertMat(global, globalDouble);
86 global2localImpl(globalDouble, localDouble);
87 convertMat(localDouble, local);
91 arma::Row<double>& int_element)
const
93 getIntegrationElementsImpl(local, int_element);
97 arma::Row<float>& int_element)
const
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);
113 arma::Col<double> cDouble;
114 getCenterImpl(cDouble);
115 convertMat(cDouble, c);
119 const arma::Mat<double>& local,
120 arma::Cube<double>& jacobian_t)
const
122 const size_t n = local.n_cols;
123 const size_t mdim =
dim();
125 jacobian_t.set_size(mdim, cdim, n);
127 mdim, cdim, n, jacobian_t.memptr(),
129 getJacobiansTransposedImpl(local, fiber_jacobian_t);
133 const arma::Mat<float>& local,
134 arma::Cube<float>& jacobian_t)
const
136 arma::Mat<double> localDouble;
138 convertMat(local, localDouble);
139 getJacobiansTransposedImpl(localDouble, jacobian_tDouble);
140 convertCube(jacobian_tDouble, jacobian_t);
144 const arma::Mat<double>& local,
147 getJacobiansTransposedImpl(local, jacobian_t);
151 const arma::Mat<float>& local,
154 arma::Mat<double> localDouble;
156 convertMat(local, localDouble);
157 getJacobiansTransposedImpl(localDouble, jacobian_tDouble);
158 convertCube(jacobian_tDouble, jacobian_t);
162 const arma::Mat<double>& local,
163 arma::Cube<double>& jacobian_inv_t)
const
165 const size_t n = local.n_cols;
166 const size_t mdim =
dim();
168 jacobian_inv_t.set_size(cdim, mdim, n);
170 cdim, mdim, n, jacobian_inv_t.memptr(),
176 const arma::Mat<float>& local,
177 arma::Cube<float>& jacobian_inv_t)
const
179 arma::Mat<double> localDouble;
181 convertMat(local, localDouble);
183 convertCube(jacobian_inv_tDouble, jacobian_inv_t);
187 const arma::Mat<double>& local,
190 getJacobianInversesTransposedImpl(local, jacobian_inv_t);
194 const arma::Mat<float>& local,
197 arma::Mat<double> localDouble;
199 convertMat(local, localDouble);
200 getJacobianInversesTransposedImpl(localDouble, jacobian_inv_tDouble);
201 convertCube(jacobian_inv_tDouble, jacobian_inv_t);
205 arma::Mat<double>& normal)
const
207 getNormalsImpl(local, normal);
211 arma::Mat<float>& normal)
const
213 arma::Mat<double> localDouble, normalDouble;
214 convertMat(local, localDouble);
215 getNormalsImpl(localDouble, normalDouble);
216 convertMat(normalDouble, normal);
219 inline void Geometry::getData(
size_t what,
const arma::Mat<double>& local,
222 getDataImpl(what, local, data);
225 inline void Geometry::getData(
size_t what,
const arma::Mat<float>& local,
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);
239 template <
typename T1,
typename T2>
240 void Geometry::convertMat(
const arma::Mat<T1>& in, arma::Mat<T2>& out)
const
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];
247 template <
typename T1,
typename T2>
248 void Geometry::convertCube(
const arma::Cube<T1>& in, arma::Cube<T2>& out)
const
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];
255 template <
typename T1,
typename T2>
258 out.set_size(in.extent(0), in.extent(1), in.extent(2));
259 std::copy(in.begin(), in.end(), out.begin());
262 template <
typename T1,
typename T2>
265 out.set_size(in.extent(0), in.extent(1), in.extent(2));
266 std::copy(in.begin(), in.end(), out.begin());
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