20 #ifndef __mast_libmesh_assembly_utility_h__ 21 #define __mast_libmesh_assembly_utility_h__ 29 #include <libmesh/dof_map.h> 30 #include <libmesh/dense_vector.h> 31 #include <libmesh/dense_matrix.h> 32 #include <libmesh/numeric_vector.h> 33 #include <libmesh/sparse_matrix.h> 38 namespace libMeshWrapper {
41 template <
typename ScalarType,
typename VecType>
56 template <
typename ScalarType,
typename MatType>
71 template <
typename ScalarType,
int P2,
typename P3>
76 m.coeffRef(i, j) += v;
80 template <
typename ScalarType,
89 const libMesh::DofMap &dof_map,
90 std::vector<libMesh::dof_id_type> &dof_indices,
94 libMesh::DenseVector<real_t> v1;
95 libMesh::DenseMatrix<real_t> m1;
99 dof_map.constrain_element_matrix_and_vector(m1, v1, dof_indices);
101 for (
uint_t i=0; i<dof_indices.size(); i++)
104 for (
uint_t i=0; i<dof_indices.size(); i++)
105 for (
uint_t j=0; j<dof_indices.size(); j++)
110 template <
typename ScalarType,
typename VecType,
typename SubVecType>
112 typename std::enable_if<std::is_same<ScalarType, real_t>::value,
void>::type
114 const libMesh::DofMap &dof_map,
115 std::vector<libMesh::dof_id_type> &dof_indices,
118 libMesh::DenseVector<real_t> v1;
121 dof_map.constrain_element_vector(v1, dof_indices);
123 for (
uint_t i=0; i<dof_indices.size(); i++)
129 template <
typename ScalarType,
typename MatType,
typename SubMatType>
131 typename std::enable_if<std::is_same<ScalarType, real_t>::value,
void>::type
133 const libMesh::DofMap &dof_map,
134 std::vector<libMesh::dof_id_type> &dof_indices,
137 libMesh::DenseMatrix<real_t> m1;
140 dof_map.constrain_element_matrix(m1, dof_indices);
142 for (
uint_t i=0; i<dof_indices.size(); i++)
143 for (
uint_t j=0; j<dof_indices.size(); j++)
149 template <
typename ScalarType,
158 const libMesh::DofMap &dof_map,
159 std::vector<libMesh::dof_id_type> &dof_indices,
163 Assert2(v_sub.size() == dof_indices.size(),
164 v_sub.size(), dof_indices.size(),
165 "Incompatible vector size");
166 Assert2(m_sub.rows() == dof_indices.size(),
167 m_sub.rows(), dof_indices.size(),
168 "Incompatible matrix rows");
169 Assert2(m_sub.cols() == dof_indices.size(),
170 m_sub.cols(), dof_indices.size(),
171 "Incompatible matrix columns");
175 libMesh::DenseVector<real_t>
178 libMesh::DenseMatrix<real_t>
179 m_re(v_sub.size(), v_sub.size()),
180 m_im(v_sub.size(), v_sub.size());
182 std::vector<libMesh::dof_id_type>
183 dof_indices_im = dof_indices;
186 for (
uint_t i=0; i<v_sub.size(); i++) {
188 v_re(i) = v_sub(i).real();
189 v_im(i) = v_sub(i).imag();
191 for (
uint_t j=0; j<v_sub.size(); j++) {
193 m_re(i, j) = m_sub(i, j).real();
194 m_im(i, j) = m_sub(i, j).imag();
200 dof_map.constrain_element_matrix_and_vector(m_re, v_re, dof_indices);
201 dof_map.constrain_element_matrix_and_vector(m_im, v_im, dof_indices_im);
204 for (
uint_t i=0; i<dof_indices.size(); i++) {
206 v(dof_indices[i]) +=
complex_t(v_re(i), v_im(i));
208 for (
uint_t j=0; j<dof_indices.size(); j++)
214 template <
typename ScalarType,
typename VecType,
typename SubVecType>
216 typename std::enable_if<std::is_same<ScalarType, complex_t>::value,
void>::type
218 const libMesh::DofMap &dof_map,
219 std::vector<libMesh::dof_id_type> &dof_indices,
222 Assert2(v_sub.size() == dof_indices.size(),
223 v_sub.size(), dof_indices.size(),
224 "Incompatible vector size");
228 libMesh::DenseVector<real_t>
232 std::vector<libMesh::dof_id_type>
233 dof_indices_im = dof_indices;
236 for (
uint_t i=0; i<v_sub.size(); i++) {
238 v_re(i) = v_sub(i).real();
239 v_im(i) = v_sub(i).imag();
244 dof_map.constrain_element_vector(v_re, dof_indices);
245 dof_map.constrain_element_vector(v_im, dof_indices_im);
248 for (
uint_t i=0; i<dof_indices.size(); i++)
249 v(dof_indices[i]) +=
complex_t(v_re(i), v_im(i));
253 template <
typename ScalarType,
typename MatType,
typename SubMatType>
255 typename std::enable_if<std::is_same<ScalarType, complex_t>::value,
void>::type
257 const libMesh::DofMap &dof_map,
258 std::vector<libMesh::dof_id_type> &dof_indices,
261 Assert2(m_sub.rows() == dof_indices.size(),
262 m_sub.rows(), dof_indices.size(),
263 "Incompatible matrix rows");
264 Assert2(m_sub.cols() == dof_indices.size(),
265 m_sub.cols(), dof_indices.size(),
266 "Incompatible matrix columns");
270 libMesh::DenseMatrix<real_t>
271 m_re(m_sub.rows(), m_sub.cols()),
272 m_im(m_sub.rows(), m_sub.cols());
274 std::vector<libMesh::dof_id_type>
275 dof_indices_im = dof_indices;
278 for (
uint_t i=0; i<m_sub.rows(); i++)
279 for (
uint_t j=0; j<m_sub.cols(); j++) {
281 m_re(i, j) = m_sub(i, j).real();
282 m_im(i, j) = m_sub(i, j).imag();
287 dof_map.constrain_element_matrix(m_re, dof_indices);
288 dof_map.constrain_element_matrix(m_im, dof_indices_im);
291 for (
uint_t i=0; i<dof_indices.size(); i++)
292 for (
uint_t j=0; j<dof_indices.size(); j++)
299 libMesh::SparseMatrix<real_t> &m,
300 const libMesh::DofMap &dof_map,
301 std::vector<libMesh::dof_id_type> &dof_indices,
302 libMesh::DenseVector<real_t> &v_sub,
303 libMesh::DenseMatrix<real_t> &m_sub) {
305 dof_map.constrain_element_matrix_and_vector(m_sub, v_sub, dof_indices);
306 m.add_matrix(m_sub, dof_indices);
307 v.add_vector(v_sub, dof_indices);
313 const libMesh::DofMap &dof_map,
314 std::vector<libMesh::dof_id_type> &dof_indices,
315 libMesh::DenseVector<real_t> &v_sub) {
317 dof_map.constrain_element_vector(v_sub, dof_indices);
318 v.add_vector(v_sub, dof_indices);
324 const libMesh::DofMap &dof_map,
325 std::vector<libMesh::dof_id_type> &dof_indices,
326 libMesh::DenseMatrix<real_t> &m_sub) {
328 dof_map.constrain_element_matrix(m_sub, dof_indices);
329 m.add_matrix(m_sub, dof_indices);
338 #endif // __mast_libmesh_assembly_utility_h__
std::complex< real_t > complex_t
std::enable_if< Dim< 3, ScalarType >::typesource_load_multiplier(const SourceLoadFieldType *f, const SectionAreaType *s, ContextType &c) { Assert0(f, "Invalid pointer");Assert0(s, "Invalid pointer");return f-> value(c) *s -> value(c)
std::enable_if< std::is_same< ScalarType, real_t >::value, void >::type constrain_and_add_matrix_and_vector(VecType &v, MatType &m, const libMesh::DofMap &dof_map, std::vector< libMesh::dof_id_type > &dof_indices, SubVecType &v_sub, SubMatType &m_sub)
std::enable_if< std::is_same< ScalarType, real_t >::value, void >::type constrain_and_add_vector(VecType &v, const libMesh::DofMap &dof_map, std::vector< libMesh::dof_id_type > &dof_indices, SubVecType &v_sub)
void add_to_matrix(MatType &m, const uint_t i, const uint_t j, const ScalarType &v)
void add_to_vector(VecType &v, const uint_t i, const ScalarType &s)
#define Assert2(cond, v1, v2, msg)
void copy(const VecType &v_from, libMesh::DenseVector< ScalarType > &v_to)
std::enable_if< std::is_same< ScalarType, real_t >::value, void >::type constrain_and_add_matrix(MatType &m, const libMesh::DofMap &dof_map, std::vector< libMesh::dof_id_type > &dof_indices, SubMatType &m_sub)