v0.15.5
Loading...
Searching...
No Matches
AdolOps.cpp
Go to the documentation of this file.
1/**
2 * @file AdolCElasticOps.cpp
3 * @author your name (you@domain.com)
4 * @brief
5 * @date 2026-03-26
6 *
7 * @copyright Copyright (c) 2026
8 *
9 */
10
11#include <MoFEM.hpp>
12
13using namespace MoFEM;
14
15#include "AdolCOps.hpp"
16
17namespace AdolCOps {
18
19struct ADolCDataImpl : public ADolCData {
21
22 struct Data {
23 Data() = default;
24 Data(const std::string &data_name,
25 const MatrixDouble &data_value = MatrixDouble(), int data_shift = 0)
26 : name(data_name), data(data_value), shift(data_shift) {}
27
28 std::string name;
30 mutable int shift = 0;
31 };
32
33 struct DataSequence_mi_tag;
34 struct DataName_mi_tag;
35
36 using DataContainer = boost::multi_index::multi_index_container<
37
38 Data,
39
40 boost::multi_index::indexed_by<
41
42 boost::multi_index::sequenced<
43 boost::multi_index::tag<DataSequence_mi_tag>>,
44
45 boost::multi_index::hashed_unique<
46 boost::multi_index::tag<DataName_mi_tag>,
47 boost::multi_index::member<Data, std::string, &Data::name>>>>;
48
50 return boost::multi_index::get<DataName_mi_tag>(dataCommon);
51 }
52
54 return boost::multi_index::get<DataName_mi_tag>(dataActive);
55 }
56
58 return boost::multi_index::get<DataName_mi_tag>(dataDependent);
59 }
60
62 return boost::multi_index::get<DataName_mi_tag>(dataDependentDerivatives);
63 }
64
65 std::pair<bool, MatrixPtr>
66 insertCommonData(const std::string &name,
67 const MatrixDouble &data = MatrixDouble(),
68 int shift = 0) override {
69 auto insert_ret = getDataCommonByName().insert(Data{name, data, shift});
70 if (!insert_ret.second)
71 return {false, MatrixPtr()};
72 return {true, boost::shared_ptr<MatrixDouble>(this->shared_from_this(),
73 &insert_ret.first->data)};
74 }
75
76 std::pair<bool, MatrixPtr>
77 insertActiveData(const std::string &name,
78 const MatrixDouble &data = MatrixDouble(),
79 int shift = 0) override {
80 auto insert_ret = getDataActiveByName().insert(Data{name, data, shift});
81 if (!insert_ret.second)
82 return {false, MatrixPtr()};
83 return {true, boost::shared_ptr<MatrixDouble>(this->shared_from_this(),
84 &insert_ret.first->data)};
85 }
86
87 std::pair<bool, MatrixPtr>
88 insertDependentData(const std::string &name,
89 const MatrixDouble &data = MatrixDouble(),
90 int shift = 0) override {
91 auto insert_ret = getDataDependentByName().insert(Data{name, data, shift});
92 if (!insert_ret.second)
93 return {false, MatrixPtr()};
94 return {true, boost::shared_ptr<MatrixDouble>(this->shared_from_this(),
95 &insert_ret.first->data)};
96 }
97
98 std::pair<bool, MatrixPtr>
99 insertDependentDerivativesData(const std::string &name,
100 const MatrixDouble &data = MatrixDouble(),
101 int shift = 0) override {
102 auto insert_ret =
103 getDataDependentDerivativesByName().insert(Data{name, data, shift});
104 if (!insert_ret.second)
105 return {false, MatrixPtr()};
106 return {true, boost::shared_ptr<MatrixDouble>(this->shared_from_this(),
107 &insert_ret.first->data)};
108 }
109
110 MatrixPtr getCommonDataPtr(const std::string &name) override {
111 auto &data_by_name = getDataCommonByName();
112 auto it = data_by_name.find(name);
113 if (it == data_by_name.end()) {
115 "Common data with name " + name + " not found");
116 return MatrixPtr();
117 }
118 return boost::shared_ptr<MatrixDouble>(this->shared_from_this(), &it->data);
119 }
120
121 MatrixPtr getActiveDataPtr(const std::string &name) override {
122 auto &data_by_name = getDataActiveByName();
123 auto it = data_by_name.find(name);
124 if (it == data_by_name.end()) {
126 "Active data with name " + name + " not found");
127 return MatrixPtr();
128 }
129 return boost::shared_ptr<MatrixDouble>(this->shared_from_this(), &it->data);
130 }
131
132 MatrixPtr getDependentDataPtr(const std::string &name) override {
133 auto &data_by_name = getDataDependentByName();
134 auto it = data_by_name.find(name);
135 if (it == data_by_name.end()) {
137 "Dependent data with name " + name + " not found");
138 return MatrixPtr();
139 }
140 return boost::shared_ptr<MatrixDouble>(this->shared_from_this(), &it->data);
141 }
142
143 MatrixPtr getDependentDerivativesDataPtr(const std::string &name) override {
144 auto &data_by_name = getDataDependentDerivativesByName();
145 auto it = data_by_name.find(name);
146 if (it == data_by_name.end()) {
148 "Dependent derivatives data with name " + name +
149 " not found");
150 return MatrixPtr();
151 }
152 return boost::shared_ptr<MatrixDouble>(this->shared_from_this(), &it->data);
153 }
154
156 setActiveContinuousVector(std::vector<double> &active_variables) override {
157 return setContinuousVector(dataActive, active_variables);
158 }
159
161 std::vector<double> &dependent_variables) override {
162 return setContinuousVector(dataDependent, dependent_variables);
163 }
164
166 std::vector<double> &dependent_variables_derivatives) override {
168 dependent_variables_derivatives);
169 }
170
172 const std::vector<double> &active_variables) override {
173 return getContinuousVector(dataActive, active_variables);
174 }
175
177 const std::vector<double> &dependent_variables) override {
178 return getContinuousVector(dataDependent, dependent_variables);
179 }
180
182 const std::vector<double> &dependent_variables_derivatives) override {
184 dependent_variables_derivatives);
185 }
186
187private:
189 std::vector<double> &variables) {
191
192 auto &data_by_sequence =
193 boost::multi_index::get<DataSequence_mi_tag>(data_container);
194
195 int nb_variables = 0;
196 for (const auto &d : data_by_sequence)
197 nb_variables += d.data.data().size();
198
199 variables.resize(nb_variables);
200
201 int shift = 0;
202 for (const auto &d : data_by_sequence) {
203 d.shift = shift;
204 for (auto it = d.data.data().begin(); it != d.data.data().end();
205 ++it, ++shift)
206 variables[shift] = *it;
207 }
208
210 }
211
213 const std::vector<double> &variables) {
215
216 auto &data_by_sequence =
217 boost::multi_index::get<DataSequence_mi_tag>(data_container);
218
219 int nb_variables = 0;
220 for (const auto &d : data_by_sequence)
221 nb_variables += d.data.data().size();
222
223 if (variables.size() != static_cast<size_t>(nb_variables)) {
224 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
225 "Inconsistent size of continuous vector");
226 }
227
228 int shift = 0;
229 for (const auto &d : data_by_sequence) {
230 d.shift = shift;
231 for (auto it = d.data.data().begin(); it != d.data.data().end();
232 ++it, ++shift)
233 *it = variables[shift];
234 }
235
237 }
238
243};
244
245boost::shared_ptr<ADolCData> createADolCDataPtr() {
246 return boost::make_shared<ADolCDataImpl>();
247}
248
249} // namespace AdolCOps
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
@ MOFEM_OPERATION_UNSUCCESSFUL
Definition definitions.h:34
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
boost::shared_ptr< ADolCData > createADolCDataPtr()
Definition AdolOps.cpp:245
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
UBlasMatrix< double > MatrixDouble
Definition Types.hpp:77
implementation of Data Operators for Forces and Sources
Definition Common.hpp:10
Data(const std::string &data_name, const MatrixDouble &data_value=MatrixDouble(), int data_shift=0)
Definition AdolOps.cpp:24
MatrixPtr getActiveDataPtr(const std::string &name) override
Definition AdolOps.cpp:121
std::pair< bool, MatrixPtr > insertActiveData(const std::string &name, const MatrixDouble &data=MatrixDouble(), int shift=0) override
Definition AdolOps.cpp:77
DataContainer dataActive
Definition AdolOps.cpp:240
std::pair< bool, MatrixPtr > insertCommonData(const std::string &name, const MatrixDouble &data=MatrixDouble(), int shift=0) override
Definition AdolOps.cpp:66
MatrixPtr getDependentDataPtr(const std::string &name) override
Definition AdolOps.cpp:132
std::pair< bool, MatrixPtr > insertDependentData(const std::string &name, const MatrixDouble &data=MatrixDouble(), int shift=0) override
Definition AdolOps.cpp:88
MoFEMErrorCode getDependentDerivativesContinuousVector(const std::vector< double > &dependent_variables_derivatives) override
Definition AdolOps.cpp:181
MoFEMErrorCode setDependentContinuousVector(std::vector< double > &dependent_variables) override
Definition AdolOps.cpp:160
MoFEMErrorCode getActiveContinuousVector(const std::vector< double > &active_variables) override
Definition AdolOps.cpp:171
DataContainer dataCommon
Definition AdolOps.cpp:239
boost::multi_index::multi_index_container< Data, boost::multi_index::indexed_by< boost::multi_index::sequenced< boost::multi_index::tag< DataSequence_mi_tag > >, boost::multi_index::hashed_unique< boost::multi_index::tag< DataName_mi_tag >, boost::multi_index::member< Data, std::string, &Data::name > > > > DataContainer
Definition AdolOps.cpp:47
auto & getDataActiveByName()
Definition AdolOps.cpp:53
ADolCData::MatrixPtr MatrixPtr
Definition AdolOps.cpp:20
MoFEMErrorCode getContinuousVector(DataContainer &data_container, const std::vector< double > &variables)
Definition AdolOps.cpp:212
auto & getDataDependentByName()
Definition AdolOps.cpp:57
auto & getDataCommonByName()
Definition AdolOps.cpp:49
MatrixPtr getDependentDerivativesDataPtr(const std::string &name) override
Definition AdolOps.cpp:143
MoFEMErrorCode setContinuousVector(DataContainer &data_container, std::vector< double > &variables)
Definition AdolOps.cpp:188
MoFEMErrorCode setDependentDerivativesContinuousVector(std::vector< double > &dependent_variables_derivatives) override
Definition AdolOps.cpp:165
MatrixPtr getCommonDataPtr(const std::string &name) override
Definition AdolOps.cpp:110
auto & getDataDependentDerivativesByName()
Definition AdolOps.cpp:61
DataContainer dataDependentDerivatives
Definition AdolOps.cpp:242
MoFEMErrorCode getDependentContinuousVector(const std::vector< double > &dependent_variables) override
Definition AdolOps.cpp:176
MoFEMErrorCode setActiveContinuousVector(std::vector< double > &active_variables) override
Definition AdolOps.cpp:156
std::pair< bool, MatrixPtr > insertDependentDerivativesData(const std::string &name, const MatrixDouble &data=MatrixDouble(), int shift=0) override
Definition AdolOps.cpp:99
DataContainer dataDependent
Definition AdolOps.cpp:241
boost::shared_ptr< MatrixDouble > MatrixPtr
Definition AdolCOps.hpp:78