v0.14.0
Loading...
Searching...
No Matches
BlockMatData.hpp
Go to the documentation of this file.
1/* This file is part of MoFEM.
2 * MoFEM is free software: you can redistribute it and/or modify it under
3 * the terms of the GNU Lesser General Public License as published by the
4 * Free Software Foundation, either version 3 of the License, or (at your
5 * option) any later version.
6 *
7 * MoFEM is distributed in the hope that it will be useful, but WITHOUT
8 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
9 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
10 * License for more details.
11 *
12 * You should have received a copy of the GNU Lesser General Public
13 * License along with MoFEM. If not, see <http://www.gnu.org/licenses/>. */
14
15#pragma once
16
17namespace MoFEM {
18
19// Not really data at integration points, used to calculate Schur complement
21
22 std::string rowField;
23 std::string colField;
31
33
34 BlockMatData(const std::string row_field, const std::string col_field,
35 EntityType row_type, EntityType col_type, int row_side,
36 int col_side, const MatrixDouble &m, const VectorInt row_ind,
37 VectorInt col_ind)
38 : rowField(row_field), colField(col_field), rowType(row_type),
39 colType(col_type), rowSide(row_side), colSide(col_side),
40 setAtElement(true) {
41
42 M.resize(m.size1(), m.size2(), false);
43 noalias(M) = m;
44 rowInd.resize(row_ind.size(), false);
45 noalias(rowInd) = row_ind;
46 colInd.resize(col_ind.size(), false);
47 noalias(colInd) = col_ind;
48 }
49
50 void setInd(const VectorInt &row_ind, const VectorInt &col_ind) const {
51 auto &const_row_ind = const_cast<VectorInt &>(rowInd);
52 auto &const_col_ind = const_cast<VectorInt &>(colInd);
53 const_row_ind.resize(row_ind.size(), false);
54 noalias(const_row_ind) = row_ind;
55 const_col_ind.resize(col_ind.size(), false);
56 noalias(const_col_ind) = col_ind;
57 }
58
59 void setMat(const MatrixDouble &m) const {
60 auto &const_m = const_cast<MatrixDouble &>(M);
61 const_m.resize(m.size1(), m.size2(), false);
62 noalias(const_m) = m;
63 }
64
65 void addMat(const MatrixDouble &m) const {
66 auto &const_m = const_cast<MatrixDouble &>(M);
67 const_m += m;
68 }
69
70 void clearMat() const {
71 auto &const_m = const_cast<MatrixDouble &>(M);
72 const_m.clear();
73 }
74
75 void setSetAtElement() const {
76 bool &set = const_cast<bool &>(setAtElement);
77 set = true;
78 }
79
80 void unSetAtElement() const {
81 bool &set = const_cast<bool &>(setAtElement);
82 set = false;
83 }
84};
85
86typedef multi_index_container<
87 BlockMatData,
88 indexed_by<
89
90 ordered_unique<
91
92 composite_key<
93 BlockMatData,
94
95 member<BlockMatData, std::string, &BlockMatData::rowField>,
96 member<BlockMatData, std::string, &BlockMatData::colField>,
97 member<BlockMatData, EntityType, &BlockMatData::rowType>,
98 member<BlockMatData, EntityType, &BlockMatData::colType>,
99 member<BlockMatData, int, &BlockMatData::rowSide>,
100 member<BlockMatData, int, &BlockMatData::colSide>
101
102 >>,
103 ordered_non_unique<
104
105 composite_key<
106 BlockMatData,
107
108 member<BlockMatData, std::string, &BlockMatData::rowField>,
109 member<BlockMatData, std::string, &BlockMatData::colField>,
110 member<BlockMatData, EntityType, &BlockMatData::rowType>,
111 member<BlockMatData, EntityType, &BlockMatData::colType>
112
113 >>,
114 ordered_non_unique<
115
116 composite_key<
117 BlockMatData,
118
119 member<BlockMatData, std::string, &BlockMatData::rowField>,
120 member<BlockMatData, std::string, &BlockMatData::colField>
121
122 >>,
123 ordered_non_unique<
124 member<BlockMatData, std::string, &BlockMatData::rowField>>,
125 ordered_non_unique<
126 member<BlockMatData, std::string, &BlockMatData::colField>>
127
128 >>
130
131} // namespace MoFEM
FTensor::Index< 'm', SPACE_DIM > m
UBlasVector< int > VectorInt
Definition: Types.hpp:67
implementation of Data Operators for Forces and Sources
Definition: Common.hpp:10
multi_index_container< BlockMatData, indexed_by< ordered_unique< composite_key< BlockMatData, member< BlockMatData, std::string, &BlockMatData::rowField >, member< BlockMatData, std::string, &BlockMatData::colField >, member< BlockMatData, EntityType, &BlockMatData::rowType >, member< BlockMatData, EntityType, &BlockMatData::colType >, member< BlockMatData, int, &BlockMatData::rowSide >, member< BlockMatData, int, &BlockMatData::colSide > > >, ordered_non_unique< composite_key< BlockMatData, member< BlockMatData, std::string, &BlockMatData::rowField >, member< BlockMatData, std::string, &BlockMatData::colField >, member< BlockMatData, EntityType, &BlockMatData::rowType >, member< BlockMatData, EntityType, &BlockMatData::colType > > >, ordered_non_unique< composite_key< BlockMatData, member< BlockMatData, std::string, &BlockMatData::rowField >, member< BlockMatData, std::string, &BlockMatData::colField > > >, ordered_non_unique< member< BlockMatData, std::string, &BlockMatData::rowField > >, ordered_non_unique< member< BlockMatData, std::string, &BlockMatData::colField > > > > BlockMatContainer
void addMat(const MatrixDouble &m) const
void unSetAtElement() const
void setSetAtElement() const
void clearMat() const
void setInd(const VectorInt &row_ind, const VectorInt &col_ind) const
BlockMatData(const std::string row_field, const std::string col_field, EntityType row_type, EntityType col_type, int row_side, int col_side, const MatrixDouble &m, const VectorInt row_ind, VectorInt col_ind)
std::string rowField
void setMat(const MatrixDouble &m) const
std::string colField