22 #include "rheolef/form_vf_assembly.h"
23 #include "rheolef/eigen_util.h"
25 namespace rheolef {
namespace details {
33 norm_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;
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;
61 local_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++) {
77 local_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());
91 std::ofstream
out (
"inv_failed.mtx");
102 #define _RHEOLEF_instanciate(T) \
103 template T norm_max (Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>& m); \
104 template bool check_is_symmetric (Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>&, const T&); \
105 template void local_lump (Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>&); \
106 template void local_invert (Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>&, bool); \
see the Float page for the full documentation
#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.
_RHEOLEF_instanciate(Float, sequential) _RHEOLEF_instanciate(Float
void put_matrix_market(std::ostream &out, const Eigen::SparseMatrix< T, Eigen::RowMajor > &a)
void invert(tiny_matrix< T > &a, tiny_matrix< T > &inv_a)