22#include "rheolef/form_vf_assembly.h"
23#include "rheolef/eigen_util.h"
25namespace rheolef {
namespace details {
33norm_max (Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>& m) {
35 for (
size_t i = 0; i < size_t(m.rows()); i++) {
36 for (
size_t j = 0; j < size_t(m.cols()); j++) {
37 m_max = std::max (m_max, m(i,j));
47 if (m.rows() != m.cols())
return false;
48 const T eps = std::numeric_limits<T>::epsilon();
49 if (tol_m_max < sqr(eps))
return true;
50 for (
size_t i = 0; i < size_t(m.rows()); i++) {
51 for (
size_t j = i+1; j < size_t(m.cols()); j++) {
52 if (abs(m(i,j) - m(j,i)) > tol_m_max)
return false;
61local_lump (Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>& m) {
62 check_macro (m.rows() == m.cols(),
"unexpected rectangular matrix for lumped mass");
63 for (
size_t i = 0; i < size_t(m.rows()); i++) {
65 for (
size_t j = 0; j < size_t(m.cols()); j++) {
77local_invert (Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>& m,
bool is_diag) {
78 check_macro (m.rows() == m.cols(),
"unexpected rectangular matrix for local invert");
81 for (
size_t i = 0; i < size_t(m.rows()); i++) {
87 Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> inv_m (m.rows(),m.cols());
88 bool status =
invert(m,inv_m);
91 std::ofstream out (
"inv_failed.mtx");
102#define _RHEOLEF_instanciate(T) \
103template T norm_max (Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>& m); \
104template bool check_is_symmetric (Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>&, const T&); \
105template void local_lump (Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>&); \
106template void local_invert (Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>&, bool); \
see the Float page for the full documentation
#define _RHEOLEF_instanciate(T)
#define error_macro(message)
check_macro(expr1.have_homogeneous_space(Xh1), "dual(expr1,expr2); expr1 should have homogeneous space. HINT: use dual(interpolate(Xh, expr1),expr2)")
void local_lump(Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &m)
bool check_is_symmetric(Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &m, const T &tol_m_max)
T norm_max(Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &m)
void local_invert(Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &m, bool is_diag)
This file is part of Rheolef.
void invert(tiny_matrix< T > &a, tiny_matrix< T > &inv_a)
void put_matrix_market(std::ostream &out, const Eigen::SparseMatrix< T, Eigen::RowMajor > &a)