23class ALIEN_EXPORT SchurBlock1D
26#ifdef ALIEN_USE_EIGEN3
27 typedef Eigen::Matrix<Real, Eigen::Dynamic, 1> vector;
28 typedef Eigen::Map<vector> eigen_vector;
30 SchurBlock1D(ArrayView<Real> block, Integer size)
32 , m_size_1(std::min(size, m_block.size()))
33 , m_size_2(m_block.size() - m_size_1)
34#ifdef ALIEN_USE_EIGEN3
35 , m_block_1(m_block.data(), m_size_1)
36 , m_block_2(m_block.data() + m_size_1, m_size_2)
41 virtual ~SchurBlock1D() {}
43 ConstArrayView<Real> block()
const {
return m_block; }
45#ifdef ALIEN_USE_EIGEN3
46 eigen_vector& block_1() {
return m_block_1; }
47 const eigen_vector& block_1()
const {
return m_block_1; }
49 eigen_vector& block_2() {
return m_block_2; }
50 const eigen_vector& block_2()
const {
return m_block_2; }
53 ArrayView<Real> m_block;
58#ifdef ALIEN_USE_EIGEN3
59 eigen_vector m_block_1;
60 eigen_vector m_block_2;
67class ALIEN_EXPORT SchurBlock2D
70#ifdef ALIEN_USE_EIGEN3
71 typedef Eigen::Matrix<Real, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> matrix;
72 typedef Eigen::OuterStride<> outer_stride;
73 typedef Eigen::Map<matrix, 0, outer_stride> eigen_matrix;
75 SchurBlock2D(Array2View<Real> block, Integer size)
77 , m_sizex_1(std::min(size, m_block.dim1Size()))
78 , m_sizex_2(m_block.dim1Size() - m_sizex_1)
79 , m_sizey_1(std::min(size, m_block.dim2Size()))
80 , m_sizey_2(m_block.dim2Size() - m_sizey_1)
81#ifdef ALIEN_USE_EIGEN3
82 , m_block_11(m_block.unguardedBasePointer(),
84 outer_stride(m_block.dim2Size()))
85 , m_block_12(m_block.unguardedBasePointer() + m_sizex_1,
87 outer_stride(m_block.dim2Size()))
88 , m_block_21(m_block.unguardedBasePointer() + (m_sizex_1 * m_block.dim2Size()),
90 outer_stride(m_block.dim2Size()))
91 , m_block_22(m_block.unguardedBasePointer() + (m_sizex_1 * (m_block.dim2Size() + 1)),
93 outer_stride(m_block.dim2Size()))
98 virtual ~SchurBlock2D() {}
100 ConstArray2View<Real> block()
const {
return m_block; }
102#ifdef ALIEN_USE_EIGEN3
103 eigen_matrix& block_11() {
return m_block_11; }
104 const eigen_matrix& block_11()
const {
return m_block_11; }
106 eigen_matrix& block_12() {
return m_block_12; }
107 const eigen_matrix& block_12()
const {
return m_block_12; }
109 eigen_matrix& block_21() {
return m_block_21; }
110 const eigen_matrix& block_21()
const {
return m_block_21; }
112 eigen_matrix& block_22() {
return m_block_22; }
113 const eigen_matrix& block_22()
const {
return m_block_22; }
116 Array2View<Real> m_block;
123#ifdef ALIEN_USE_EIGEN3
124 eigen_matrix m_block_11;
125 eigen_matrix m_block_12;
126 eigen_matrix m_block_21;
127 eigen_matrix m_block_22;
134class ALIEN_EXPORT SchurAlgo
141 ALIEN_ASSERT((A.block().dim1Size() == A.block().dim2Size()), (
"Schur complement must be applied on square block"));
142 ALIEN_ASSERT((A.block().dim1Size() == b.block().size()), (
"Blocks size are not equals"));
145#ifdef ALIEN_USE_EIGEN3
146 typedef SchurBlock2D::eigen_matrix matrix;
147 typedef SchurBlock1D::eigen_vector vector;
149 matrix& matrix_11 = A.block_11();
150 matrix& matrix_12 = A.block_12();
151 matrix& matrix_21 = A.block_21();
152 matrix& matrix_22 = A.block_22();
154 vector& vector_1 = b.block_1();
155 vector& vector_2 = b.block_2();
166 matrix_22 = matrix_22.inverse();
167 matrix_21 = matrix_22 * matrix_21;
168 matrix_11 -= matrix_12 * matrix_21;
170 vector_2 = matrix_22 * vector_2;
171 vector_1 -= matrix_12 * vector_2;