24 Data(
const std::string &data_name,
33 struct DataSequence_mi_tag;
34 struct DataName_mi_tag;
40 boost::multi_index::indexed_by<
42 boost::multi_index::sequenced<
43 boost::multi_index::tag<DataSequence_mi_tag>>,
45 boost::multi_index::hashed_unique<
46 boost::multi_index::tag<DataName_mi_tag>,
47 boost::multi_index::member<Data, std::string, &Data::name>>>>;
50 return boost::multi_index::get<DataName_mi_tag>(
dataCommon);
54 return boost::multi_index::get<DataName_mi_tag>(
dataActive);
58 return boost::multi_index::get<DataName_mi_tag>(
dataDependent);
65 std::pair<bool, MatrixPtr>
68 int shift = 0)
override {
70 if (!insert_ret.second)
72 return {
true, boost::shared_ptr<MatrixDouble>(this->shared_from_this(),
73 &insert_ret.first->data)};
76 std::pair<bool, MatrixPtr>
79 int shift = 0)
override {
81 if (!insert_ret.second)
83 return {
true, boost::shared_ptr<MatrixDouble>(this->shared_from_this(),
84 &insert_ret.first->data)};
87 std::pair<bool, MatrixPtr>
90 int shift = 0)
override {
92 if (!insert_ret.second)
94 return {
true, boost::shared_ptr<MatrixDouble>(this->shared_from_this(),
95 &insert_ret.first->data)};
98 std::pair<bool, MatrixPtr>
101 int shift = 0)
override {
104 if (!insert_ret.second)
106 return {
true, boost::shared_ptr<MatrixDouble>(this->shared_from_this(),
107 &insert_ret.first->data)};
112 auto it = data_by_name.find(name);
113 if (it == data_by_name.end()) {
115 "Common data with name " + name +
" not found");
118 return boost::shared_ptr<MatrixDouble>(this->shared_from_this(), &it->data);
123 auto it = data_by_name.find(name);
124 if (it == data_by_name.end()) {
126 "Active data with name " + name +
" not found");
129 return boost::shared_ptr<MatrixDouble>(this->shared_from_this(), &it->data);
134 auto it = data_by_name.find(name);
135 if (it == data_by_name.end()) {
137 "Dependent data with name " + name +
" not found");
140 return boost::shared_ptr<MatrixDouble>(this->shared_from_this(), &it->data);
145 auto it = data_by_name.find(name);
146 if (it == data_by_name.end()) {
148 "Dependent derivatives data with name " + name +
152 return boost::shared_ptr<MatrixDouble>(this->shared_from_this(), &it->data);
161 std::vector<double> &dependent_variables)
override {
166 std::vector<double> &dependent_variables_derivatives)
override {
168 dependent_variables_derivatives);
172 const std::vector<double> &active_variables)
override {
177 const std::vector<double> &dependent_variables)
override {
182 const std::vector<double> &dependent_variables_derivatives)
override {
184 dependent_variables_derivatives);
189 std::vector<double> &variables) {
192 auto &data_by_sequence =
193 boost::multi_index::get<DataSequence_mi_tag>(data_container);
195 int nb_variables = 0;
196 for (
const auto &d : data_by_sequence)
197 nb_variables += d.data.data().size();
199 variables.resize(nb_variables);
202 for (
const auto &d : data_by_sequence) {
204 for (
auto it = d.data.data().begin(); it != d.data.data().end();
206 variables[shift] = *it;
213 const std::vector<double> &variables) {
216 auto &data_by_sequence =
217 boost::multi_index::get<DataSequence_mi_tag>(data_container);
219 int nb_variables = 0;
220 for (
const auto &d : data_by_sequence)
221 nb_variables += d.data.data().size();
223 if (variables.size() !=
static_cast<size_t>(nb_variables)) {
225 "Inconsistent size of continuous vector");
229 for (
const auto &d : data_by_sequence) {
231 for (
auto it = d.data.data().begin(); it != d.data.data().end();
233 *it = variables[shift];
246 return boost::make_shared<ADolCDataImpl>();
#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
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
boost::shared_ptr< ADolCData > createADolCDataPtr()
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
UBlasMatrix< double > MatrixDouble
implementation of Data Operators for Forces and Sources
Data(const std::string &data_name, const MatrixDouble &data_value=MatrixDouble(), int data_shift=0)
MatrixPtr getActiveDataPtr(const std::string &name) override
std::pair< bool, MatrixPtr > insertActiveData(const std::string &name, const MatrixDouble &data=MatrixDouble(), int shift=0) override
std::pair< bool, MatrixPtr > insertCommonData(const std::string &name, const MatrixDouble &data=MatrixDouble(), int shift=0) override
MatrixPtr getDependentDataPtr(const std::string &name) override
std::pair< bool, MatrixPtr > insertDependentData(const std::string &name, const MatrixDouble &data=MatrixDouble(), int shift=0) override
MoFEMErrorCode getDependentDerivativesContinuousVector(const std::vector< double > &dependent_variables_derivatives) override
MoFEMErrorCode setDependentContinuousVector(std::vector< double > &dependent_variables) override
MoFEMErrorCode getActiveContinuousVector(const std::vector< double > &active_variables) override
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
auto & getDataActiveByName()
ADolCData::MatrixPtr MatrixPtr
MoFEMErrorCode getContinuousVector(DataContainer &data_container, const std::vector< double > &variables)
auto & getDataDependentByName()
auto & getDataCommonByName()
MatrixPtr getDependentDerivativesDataPtr(const std::string &name) override
MoFEMErrorCode setContinuousVector(DataContainer &data_container, std::vector< double > &variables)
MoFEMErrorCode setDependentDerivativesContinuousVector(std::vector< double > &dependent_variables_derivatives) override
MatrixPtr getCommonDataPtr(const std::string &name) override
auto & getDataDependentDerivativesByName()
DataContainer dataDependentDerivatives
MoFEMErrorCode getDependentContinuousVector(const std::vector< double > &dependent_variables) override
MoFEMErrorCode setActiveContinuousVector(std::vector< double > &active_variables) override
std::pair< bool, MatrixPtr > insertDependentDerivativesData(const std::string &name, const MatrixDouble &data=MatrixDouble(), int shift=0) override
DataContainer dataDependent
boost::shared_ptr< MatrixDouble > MatrixPtr