v0.16.0
Loading...
Searching...
No Matches
MatOps.cpp
Go to the documentation of this file.
1/**
2 * @file MatOps.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 "MatOps.hpp"
16
17namespace MatOps {
18
19static void sortStateTags(StateTags &state_tags) {
20 std::sort(state_tags.begin(), state_tags.end(),
21 [](const auto &lhs, const auto &rhs) {
22 return lhs.name < rhs.name;
23 });
24}
25
26int MatOpsTagsRegistry::atTagName(std::string name) {
27 return tagNameVsTag.at(name);
28}
29
30int MatOpsTagsRegistry::setTagName(std::string name, int tag) {
31 MOFEM_LOG_CHANNEL("WORLD");
32
33 auto it = tagNameVsTag.find(name);
34
35 if (tag >= 0) {
36 if (it != tagNameVsTag.end()) {
37 MOFEM_LOG("WORLD", Sev::warning)
38 << "Tag name: " << name
39 << " is already registered with tag: " << it->second
40 << ". Overwriting with new tag: " << tag;
41 it->second = -1; // set it to invalid value to avoid confusion
42 }
43 for (auto &p : tagNameVsTag) {
44 if (p.second == tag) {
46 "Tag: " + std::to_string(tag) +
47 " is already registered with name: " + p.first);
48 }
49 }
50 // register new tag
51 tagNameVsTag[name] = tag;
52 return tag;
53 }
54
55 int max_tag = 0;
56 for (auto &p : tagNameVsTag) {
57 if (p.second > max_tag) {
58 max_tag = p.second;
59 }
60 }
61
62 if (it == tagNameVsTag.end()) {
63 tagNameVsTag[name] = max_tag + 1;
64 }
65
66 MOFEM_LOG("WORLD", Sev::inform)
67 << "Tag name: " << name
68 << " is registered with tag: " << tagNameVsTag[name];
69
70 return tagNameVsTag[name];
71}
72
73int MatOpsTagsRegistry::getTagByName(std::string name) {
74 auto it = tagNameVsTag.find(name);
75 if (it == tagNameVsTag.end()) {
76 int new_tag = tagNameVsTag.size() + 1;
77 tagNameVsTag[name] = new_tag;
78 return new_tag;
79 }
80 return it->second;
81}
82
83std::string MatOpsTagsRegistry::getTagName(int tag) {
84 for (const auto &p : tagNameVsTag) {
85 if (p.second == tag) {
86 return p.first;
87 }
88 }
89 return std::string();
90}
91
92struct MatOpsDataImpl : public MatOpsData {
95
96 struct Data {
97 Data() = default;
98 Data(const std::string &data_name,
99 const MatrixDouble &data_value = MatrixDouble(), int data_shift = 0)
100 : name(data_name), data(data_value), shift(data_shift) {}
101 Data(const std::string &data_name, int num_components, Tag data_tag = 0)
102 : name(data_name), data(num_components, 1),
103 numComponents(num_components), tag(data_tag) {}
104
105 std::string name;
107 mutable int shift = 0;
109 Tag tag = 0;
110 };
111
112 struct DataSequence_mi_tag;
113 struct DataName_mi_tag;
114
115 using DataContainer = boost::multi_index::multi_index_container<
116
117 Data,
118
119 boost::multi_index::indexed_by<
120
121 boost::multi_index::sequenced<
122 boost::multi_index::tag<DataSequence_mi_tag>>,
123
124 boost::multi_index::hashed_unique<
125 boost::multi_index::tag<DataName_mi_tag>,
126 boost::multi_index::member<Data, std::string, &Data::name>>>>;
127
129 return boost::multi_index::get<DataName_mi_tag>(dataCommon);
130 }
131
133 return boost::multi_index::get<DataName_mi_tag>(dataActive);
134 }
135
137 return boost::multi_index::get<DataName_mi_tag>(dataDependent);
138 }
139
141 return boost::multi_index::get<DataName_mi_tag>(dataDependentDerivatives);
142 }
143
145 return boost::multi_index::get<DataName_mi_tag>(dataState);
146 }
147
149 return boost::multi_index::get<DataSequence_mi_tag>(dataState);
150 }
151
152 std::pair<bool, MatrixPtr>
153 insertCommonData(const std::string &name,
154 const MatrixDouble &data = MatrixDouble(),
155 int shift = 0) override {
156 auto insert_ret = getDataCommonByName().insert(Data{name, data, shift});
157 return {insert_ret.second,
158 boost::shared_ptr<MatrixDouble>(this->shared_from_this(),
159 &insert_ret.first->data)};
160 }
161
162 std::pair<bool, MatrixPtr>
163 insertActiveData(const std::string &name,
164 const MatrixDouble &data = MatrixDouble(),
165 int shift = 0) override {
166 auto insert_ret = getDataActiveByName().insert(Data{name, data, shift});
167 return {insert_ret.second,
168 boost::shared_ptr<MatrixDouble>(this->shared_from_this(),
169 &insert_ret.first->data)};
170 }
171
172 std::pair<bool, MatrixPtr>
173 insertDependentData(const std::string &name,
174 const MatrixDouble &data = MatrixDouble(),
175 int shift = 0) override {
176 auto insert_ret = getDataDependentByName().insert(Data{name, data, shift});
177 return {insert_ret.second,
178 boost::shared_ptr<MatrixDouble>(this->shared_from_this(),
179 &insert_ret.first->data)};
180 }
181
182 std::pair<bool, MatrixPtr>
183 insertDependentDerivativesData(const std::string &name,
184 const MatrixDouble &data = MatrixDouble(),
185 int shift = 0) override {
186 auto insert_ret =
187 getDataDependentDerivativesByName().insert(Data{name, data, shift});
188 return {insert_ret.second,
189 boost::shared_ptr<MatrixDouble>(this->shared_from_this(),
190 &insert_ret.first->data)};
191 }
192
193 MatrixPtr getCommonDataPtr(const std::string &name) override {
194 auto &data_by_name = getDataCommonByName();
195 auto it = data_by_name.find(name);
196 if (it == data_by_name.end()) {
198 "Common data with name " + name + " not found");
199 return MatrixPtr();
200 }
201 return boost::shared_ptr<MatrixDouble>(this->shared_from_this(), &it->data);
202 }
203
204 MatrixPtr getActiveDataPtr(const std::string &name) override {
205 auto &data_by_name = getDataActiveByName();
206 auto it = data_by_name.find(name);
207 if (it == data_by_name.end()) {
209 "Active data with name " + name + " not found");
210 return MatrixPtr();
211 }
212 return boost::shared_ptr<MatrixDouble>(this->shared_from_this(), &it->data);
213 }
214
215 MatrixPtr getDependentDataPtr(const std::string &name) override {
216 auto &data_by_name = getDataDependentByName();
217 auto it = data_by_name.find(name);
218 if (it == data_by_name.end()) {
220 "Dependent data with name " + name + " not found");
221 return MatrixPtr();
222 }
223 return boost::shared_ptr<MatrixDouble>(this->shared_from_this(), &it->data);
224 }
225
226 MatrixPtr getDependentDerivativesDataPtr(const std::string &name) override {
227 auto &data_by_name = getDataDependentDerivativesByName();
228 auto it = data_by_name.find(name);
229 if (it == data_by_name.end()) {
231 "Dependent derivatives data with name " + name +
232 " not found");
233 return MatrixPtr();
234 }
235 return boost::shared_ptr<MatrixDouble>(this->shared_from_this(), &it->data);
236 }
237
238 StateMatrixPtr getStateDataPtr(const std::string &name, EntityHandle ent,
239 int gg) override {
240 auto &state_by_name = getStateDataByName();
241 auto it = state_by_name.find(name);
242 if (it == state_by_name.end()) {
244 "State data with name " + name + " not found");
245 return StateMatrixPtr();
246 }
247 if (!mFieldPtr) {
249 "MoFEM interface for state data is not set");
250 return StateMatrixPtr();
251 }
252 if (!ent) {
254 "State entity is not set");
255 return StateMatrixPtr();
256 }
257 if (gg < 0) {
259 "State gauss point out of range");
260 return StateMatrixPtr();
261 }
262 if (!it->tag) {
264 "State data " + name +
265 " is not initialised; call setupStateData() after binding");
266 return StateMatrixPtr();
267 }
268
269 double *tag_data = nullptr;
270 int tag_size = 0;
271 auto &moab = mFieldPtr->get_moab();
272 const auto required_size = it->numComponents * (gg + 1);
273 auto rval = moab.tag_get_by_ptr(it->tag, &ent, 1,
274 (const void **)&tag_data, &tag_size);
275 if (tag_data && tag_size > 0 && tag_size % it->numComponents != 0) {
277 "Inconsistent state tag size for " + name);
278 return StateMatrixPtr();
279 }
280 if (rval != MB_SUCCESS || !tag_data || tag_size < required_size) {
281 std::vector<double> storage(required_size, 0);
282 if (rval == MB_SUCCESS && tag_data && tag_size > 0) {
283 std::copy_n(tag_data, std::min(tag_size, required_size), storage.data());
284 }
285 void const *storage_ptr[] = {storage.data()};
286 int storage_size = required_size;
287 CHK_THROW_MESSAGE(moab.tag_set_by_ptr(it->tag, &ent, 1, storage_ptr,
288 &storage_size),
289 "Failed to set state data " + name);
290 CHK_THROW_MESSAGE(moab.tag_get_by_ptr(it->tag, &ent, 1,
291 (const void **)&tag_data, &tag_size),
292 "Failed to get state data " + name);
293 }
294 if (!tag_data || tag_size < required_size ||
295 (tag_size > 0 && tag_size % it->numComponents != 0)) {
297 "Inconsistent state tag size for " + name);
298 return StateMatrixPtr();
299 }
300
301 auto *ptr = tag_data + gg * it->numComponents;
302 return boost::make_shared<MatrixAdaptor>(
303 it->numComponents, 1,
304 ublas::shallow_array_adaptor<double>(it->numComponents, ptr));
305 }
306
307 StateTags getStateTags() const override {
308 StateTags state_tags;
309 const auto &state_by_sequence =
310 boost::multi_index::get<DataSequence_mi_tag>(dataState);
311
312 for (const auto &state_data : state_by_sequence) {
313 if (!state_data.tag || state_data.name.empty() ||
314 state_data.numComponents <= 0)
315 continue;
316 state_tags.push_back(
317 {state_data.name, state_data.tag, state_data.numComponents});
318 }
319
320 sortStateTags(state_tags);
321 return state_tags;
322 }
323
325 const std::string &name,
326 int num_components) override {
328 mFieldPtr = &m_field;
329
330 if (name.empty()) {
331 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
332 "State data name can not be empty");
333 }
334
335 if (num_components <= 0) {
336 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
337 "State data %s has non-positive number of components %d",
338 name.c_str(), num_components);
339 }
340
341 auto &state_by_name = getStateDataByName();
342 auto it = state_by_name.find(name);
343 if (it != state_by_name.end()) {
344 if (it->numComponents != num_components) {
345 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
346 "State data %s already exists with incompatible size",
347 name.c_str());
348 }
349 } else {
350 state_by_name.insert(Data{name, num_components});
351 }
352
354 }
355
358 if (!mFieldPtr) {
359 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
360 "MoFEM interface for state data is not set");
361 }
362
363 for (auto &state_data : getStateDataBySequence()) {
364 Tag tag = 0;
365 const auto state_tag_name = "_ADOLC_STATE_" +
366 std::to_string(state_data.numComponents) +
367 "_" + state_data.name;
368 CHKERR mFieldPtr->get_moab().tag_get_handle(
369 state_tag_name.c_str(), 0, MB_TYPE_DOUBLE, tag,
370 MB_TAG_CREAT | MB_TAG_VARLEN | MB_TAG_SPARSE, PETSC_NULLPTR);
371 getStateDataBySequence().modify(getStateDataBySequence().iterator_to(
372 state_data),
373 [&](auto &data) { data.tag = tag; });
374 }
375
377 }
378
380 setActiveContinuousVector(std::vector<double> &active_variables) override {
381 return setContinuousVector(dataActive, active_variables);
382 }
383
385 std::vector<double> &dependent_variables) override {
386 return setContinuousVector(dataDependent, dependent_variables);
387 }
388
390 std::vector<double> &dependent_variables_derivatives) override {
392 dependent_variables_derivatives);
393 }
394
396 const std::vector<double> &active_variables) override {
397 return getContinuousVector(dataActive, active_variables);
398 }
399
401 const std::vector<double> &dependent_variables) override {
402 return getContinuousVector(dataDependent, dependent_variables);
403 }
404
406 const std::vector<double> &dependent_variables_derivatives) override {
408 dependent_variables_derivatives);
409 }
410
411protected:
413 std::vector<double> &variables) {
415
416 auto &data_by_sequence =
417 boost::multi_index::get<DataSequence_mi_tag>(data_container);
418
419 int nb_variables = 0;
420 for (const auto &d : data_by_sequence)
421 nb_variables += d.data.data().size();
422
423 variables.resize(nb_variables);
424
425 int shift = 0;
426 for (const auto &d : data_by_sequence) {
427 d.shift = shift;
428 for (auto it = d.data.data().begin(); it != d.data.data().end();
429 ++it, ++shift)
430 variables[shift] = *it;
431 }
432
434 }
435
437 const std::vector<double> &variables) {
439
440 auto &data_by_sequence =
441 boost::multi_index::get<DataSequence_mi_tag>(data_container);
442
443 int nb_variables = 0;
444 for (const auto &d : data_by_sequence)
445 nb_variables += d.data.data().size();
446
447 if (variables.size() != static_cast<size_t>(nb_variables)) {
448 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
449 "Inconsistent size of continuous vector");
450 }
451
452 int shift = 0;
453 for (const auto &d : data_by_sequence) {
454 d.shift = shift;
455 for (auto it = d.data.data().begin(); it != d.data.data().end();
456 ++it, ++shift)
457 *it = variables[shift];
458 }
459
461 }
462
469};
470
472
474 boost::weak_ptr<MatOpsData> base_data_ptr,
475 DataDictionary common_data_dictionary,
476 DataDictionary state_data_dictionary)
477 : baseImplPtr(lockBaseImplPtr(base_data_ptr)),
478 commonDataDictionary(common_data_dictionary),
479 stateDataDictionary(state_data_dictionary) {}
480
481 std::pair<bool, MatrixPtr>
482 insertCommonData(const std::string &name,
483 const MatrixDouble &data = MatrixDouble(),
484 int shift = 0) override {
485 return baseImplPtr->insertCommonData(name, data, shift);
486 }
487
489 return boost::multi_index::get<DataName_mi_tag>(dataActive);
490 }
491
493 return boost::multi_index::get<DataName_mi_tag>(dataDependent);
494 }
495
497 return boost::multi_index::get<DataName_mi_tag>(dataDependentDerivatives);
498 }
499
500 std::pair<bool, MatrixPtr>
501 insertActiveData(const std::string &name,
502 const MatrixDouble &data = MatrixDouble(),
503 int shift = 0) override {
504 auto insert_ret = getDataActiveByName().insert(Data{name, data, shift});
505 if (!insert_ret.second)
506 return {false, MatrixPtr()};
507 return {true, boost::shared_ptr<MatrixDouble>(this->shared_from_this(),
508 &insert_ret.first->data)};
509 }
510
511 std::pair<bool, MatrixPtr>
512 insertDependentData(const std::string &name,
513 const MatrixDouble &data = MatrixDouble(),
514 int shift = 0) override {
515 auto insert_ret = getDataDependentByName().insert(Data{name, data, shift});
516 if (!insert_ret.second)
517 return {false, MatrixPtr()};
518 return {true, boost::shared_ptr<MatrixDouble>(this->shared_from_this(),
519 &insert_ret.first->data)};
520 }
521
522 std::pair<bool, MatrixPtr>
523 insertDependentDerivativesData(const std::string &name,
524 const MatrixDouble &data = MatrixDouble(),
525 int shift = 0) override {
526 auto insert_ret =
527 getDataDependentDerivativesByName().insert(Data{name, data, shift});
528 if (!insert_ret.second)
529 return {false, MatrixPtr()};
530 return {true, boost::shared_ptr<MatrixDouble>(this->shared_from_this(),
531 &insert_ret.first->data)};
532 }
533
534 MatrixPtr getCommonDataPtr(const std::string &name) override {
535 if (auto it = commonDataDictionary.find(name);
536 it != commonDataDictionary.end()) {
537 return baseImplPtr->getCommonDataPtr(it->second);
538 }
539 return baseImplPtr->getCommonDataPtr(name);
540 }
541
542 MatrixPtr getActiveDataPtr(const std::string &name) override {
543 auto &data_by_name = getDataActiveByName();
544 auto it = data_by_name.find(name);
545 if (it == data_by_name.end()) {
547 "Active data with name " + name + " not found");
548 return MatrixPtr();
549 }
550 return boost::shared_ptr<MatrixDouble>(this->shared_from_this(), &it->data);
551 }
552
553 MatrixPtr getDependentDataPtr(const std::string &name) override {
554 auto &data_by_name = getDataDependentByName();
555 auto it = data_by_name.find(name);
556 if (it == data_by_name.end()) {
558 "Dependent data with name " + name + " not found");
559 return MatrixPtr();
560 }
561 return boost::shared_ptr<MatrixDouble>(this->shared_from_this(), &it->data);
562 }
563
564 MatrixPtr getDependentDerivativesDataPtr(const std::string &name) override {
565 auto &data_by_name = getDataDependentDerivativesByName();
566 auto it = data_by_name.find(name);
567 if (it == data_by_name.end()) {
569 "Dependent derivatives data with name " + name +
570 " not found");
571 return MatrixPtr();
572 }
573 return boost::shared_ptr<MatrixDouble>(this->shared_from_this(), &it->data);
574 }
575
576 StateMatrixPtr getStateDataPtr(const std::string &name, EntityHandle ent,
577 int gg) override {
578 if (auto it = stateDataDictionary.find(name);
579 it != stateDataDictionary.end())
580 return baseImplPtr->getStateDataPtr(it->second, ent, gg);
581 return baseImplPtr->getStateDataPtr(name, ent, gg);
582 }
583
584 StateTags getStateTags() const override {
585 auto state_tags = baseImplPtr->getStateTags();
586 for (auto &tag_info : state_tags) {
587 for (const auto &[alias_name, base_name] : stateDataDictionary) {
588 if (base_name == tag_info.name) {
589 tag_info.name = alias_name;
590 break;
591 }
592 }
593 }
594 sortStateTags(state_tags);
595 return state_tags;
596 }
597
599 const std::string &name,
600 int num_components) override {
601 if (auto it = stateDataDictionary.find(name);
602 it != stateDataDictionary.end())
603 return baseImplPtr->bindStateTag(m_field, it->second, num_components);
604 return baseImplPtr->bindStateTag(m_field, name, num_components);
605 }
606
608 return baseImplPtr->setupStateData();
609 }
610
612 setActiveContinuousVector(std::vector<double> &active_variables) override {
613 return setContinuousVector(dataActive, active_variables);
614 }
615
617 std::vector<double> &dependent_variables) override {
618 return setContinuousVector(dataDependent, dependent_variables);
619 }
620
622 std::vector<double> &dependent_variables_derivatives) override {
624 dependent_variables_derivatives);
625 }
626
628 const std::vector<double> &active_variables) override {
629 return getContinuousVector(dataActive, active_variables);
630 }
631
633 const std::vector<double> &dependent_variables) override {
634 return getContinuousVector(dataDependent, dependent_variables);
635 }
636
638 const std::vector<double> &dependent_variables_derivatives) override {
640 dependent_variables_derivatives);
641 }
642
643protected:
647
648 boost::shared_ptr<MatOpsDataImpl> baseImplPtr;
651
652private:
653 static boost::shared_ptr<MatOpsDataImpl>
654 lockBaseImplPtr(boost::weak_ptr<MatOpsData> base_data_ptr) {
655 auto base_data = base_data_ptr.lock();
656 if (!base_data) {
658 "Base MatOps data pointer expired");
659 }
660
661 auto base_impl_ptr = boost::dynamic_pointer_cast<MatOpsDataImpl>(base_data);
662 if (!base_impl_ptr) {
664 "Base MatOps data pointer has incompatible type");
665 }
666
667 return base_impl_ptr;
668 }
669};
670
671boost::shared_ptr<MatOpsData> createMatOpsDataPtr() {
672 return boost::make_shared<MatOpsDataImpl>();
673}
674
675boost::shared_ptr<MatOpsData>
676createMatOpsDataPtr(boost::weak_ptr<MatOpsData> base_data_ptr,
677 DataDictionary common_data_dictionary,
678 DataDictionary state_data_dictionary) {
679 return boost::make_shared<MatOpsDataDerivedImpl>(base_data_ptr,
680 common_data_dictionary,
681 state_data_dictionary);
682}
683
685AdolCEvaluation::evaluateVariable(boost::shared_ptr<MatOpsData> mat_ops_data_ptr,
686 int tag, EntityHandle entity, int gg) {
688 CHKERR mat_ops_data_ptr->setActiveContinuousVector(
690 CHKERR mat_ops_data_ptr->setDependentContinuousVector(
692 constexpr int adolc_return_value = 0;
693 int r =
694 ::function(tag, dependentVariables.size(), activeVariables.size(),
695 activeVariables.data(), dependentVariables.data());
696 if (PetscUnlikely(r < adolc_return_value)) {
697 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
698 "ADOL-C function evaluation with error");
699 }
700 CHKERR mat_ops_data_ptr->getDependentContinuousVector(
703}
704
706 boost::shared_ptr<MatOpsData> mat_ops_data_ptr, int tag, EntityHandle entity,
707 int gg) {
709 constexpr int adolc_return_value = 0;
710 CHKERR mat_ops_data_ptr->setActiveContinuousVector(
712 CHKERR mat_ops_data_ptr->setDependentContinuousVector(
714
715 const auto number_of_active_variables =
717 const auto number_of_dependent_variables =
720 number_of_dependent_variables * number_of_active_variables);
721 AdolCEvaluation::jacPtrVec.resize(number_of_dependent_variables);
722 for (unsigned int n = 0; n != number_of_dependent_variables; ++n) {
725 [n * number_of_active_variables]);
726 }
727
728 int r =
729 ::jacobian(tag, dependentVariables.size(), activeVariables.size(),
730 activeVariables.data(), jacPtrVec.data());
731 if (PetscUnlikely(r < adolc_return_value)) {
732 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
733 "ADOL-C function evaluation with error");
734 }
735 CHKERR mat_ops_data_ptr->getDependentDerivativesContinuousVector(
738}
739
740
741
742} // namespace MatOps
#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()
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_OPERATION_UNSUCCESSFUL
Definition definitions.h:34
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define MOFEM_LOG(channel, severity)
Log.
#define MOFEM_LOG_CHANNEL(channel)
Set and reset channel.
const double n
refractive index of diffusive medium
static void sortStateTags(StateTags &state_tags)
Definition MatOps.cpp:19
std::map< std::string, std::string > DataDictionary
Definition MatOps.hpp:22
std::vector< StateTag > StateTags
Definition MatOps.hpp:21
boost::shared_ptr< MatOpsData > createMatOpsDataPtr()
Definition MatOps.cpp:671
static MoFEMErrorCodeGeneric< moab::ErrorCode > rval
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
static MoFEMErrorCode evaluateVariable(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag, EntityHandle entity, int gg)
Definition MatOps.cpp:685
static std::vector< double > dependentVariablesDerivatives
Definition MatOps.hpp:107
static std::vector< double > dependentVariables
Definition MatOps.hpp:106
static MoFEMErrorCode evaluateDerivatives(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag, EntityHandle entity, int gg)
Definition MatOps.cpp:705
static std::vector< double > activeVariables
Definition MatOps.hpp:105
static std::vector< double * > jacPtrVec
Definition MatOps.hpp:108
std::pair< bool, MatrixPtr > insertDependentDerivativesData(const std::string &name, const MatrixDouble &data=MatrixDouble(), int shift=0) override
Definition MatOps.cpp:523
DataDictionary commonDataDictionary
Definition MatOps.cpp:649
MoFEMErrorCode setDependentDerivativesContinuousVector(std::vector< double > &dependent_variables_derivatives) override
Definition MatOps.cpp:621
std::pair< bool, MatrixPtr > insertCommonData(const std::string &name, const MatrixDouble &data=MatrixDouble(), int shift=0) override
Definition MatOps.cpp:482
MoFEMErrorCode bindStateTag(MoFEM::Interface &m_field, const std::string &name, int num_components) override
Definition MatOps.cpp:598
MatOpsDataDerivedImpl(boost::weak_ptr< MatOpsData > base_data_ptr, DataDictionary common_data_dictionary, DataDictionary state_data_dictionary)
Definition MatOps.cpp:473
StateMatrixPtr getStateDataPtr(const std::string &name, EntityHandle ent, int gg) override
Definition MatOps.cpp:576
MoFEMErrorCode getDependentDerivativesContinuousVector(const std::vector< double > &dependent_variables_derivatives) override
Definition MatOps.cpp:637
StateTags getStateTags() const override
Definition MatOps.cpp:584
DataContainer dataDependentDerivatives
Definition MatOps.cpp:646
MoFEMErrorCode getActiveContinuousVector(const std::vector< double > &active_variables) override
Definition MatOps.cpp:627
MatrixPtr getCommonDataPtr(const std::string &name) override
Definition MatOps.cpp:534
MatrixPtr getDependentDerivativesDataPtr(const std::string &name) override
Definition MatOps.cpp:564
MatrixPtr getActiveDataPtr(const std::string &name) override
Definition MatOps.cpp:542
MoFEMErrorCode getDependentContinuousVector(const std::vector< double > &dependent_variables) override
Definition MatOps.cpp:632
MoFEMErrorCode setDependentContinuousVector(std::vector< double > &dependent_variables) override
Definition MatOps.cpp:616
MoFEMErrorCode setActiveContinuousVector(std::vector< double > &active_variables) override
Definition MatOps.cpp:612
std::pair< bool, MatrixPtr > insertActiveData(const std::string &name, const MatrixDouble &data=MatrixDouble(), int shift=0) override
Definition MatOps.cpp:501
MatrixPtr getDependentDataPtr(const std::string &name) override
Definition MatOps.cpp:553
auto & getDataDependentDerivativesByName()
Definition MatOps.cpp:496
DataDictionary stateDataDictionary
Definition MatOps.cpp:650
std::pair< bool, MatrixPtr > insertDependentData(const std::string &name, const MatrixDouble &data=MatrixDouble(), int shift=0) override
Definition MatOps.cpp:512
static boost::shared_ptr< MatOpsDataImpl > lockBaseImplPtr(boost::weak_ptr< MatOpsData > base_data_ptr)
Definition MatOps.cpp:654
boost::shared_ptr< MatOpsDataImpl > baseImplPtr
Definition MatOps.cpp:648
MoFEMErrorCode setupStateData() override
Definition MatOps.cpp:607
Data(const std::string &data_name, int num_components, Tag data_tag=0)
Definition MatOps.cpp:101
Data(const std::string &data_name, const MatrixDouble &data_value=MatrixDouble(), int data_shift=0)
Definition MatOps.cpp:98
DataContainer dataDependentDerivatives
Definition MatOps.cpp:466
MoFEMErrorCode getActiveContinuousVector(const std::vector< double > &active_variables) override
Definition MatOps.cpp:395
MoFEM::Interface * mFieldPtr
Definition MatOps.cpp:468
StateMatrixPtr getStateDataPtr(const std::string &name, EntityHandle ent, int gg) override
Definition MatOps.cpp:238
auto & getDataActiveByName()
Definition MatOps.cpp:132
MoFEMErrorCode setupStateData() override
Definition MatOps.cpp:356
DataContainer dataDependent
Definition MatOps.cpp:465
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 MatOps.cpp:126
MatOpsData::StateMatrixPtr StateMatrixPtr
Definition MatOps.cpp:94
std::pair< bool, MatrixPtr > insertDependentDerivativesData(const std::string &name, const MatrixDouble &data=MatrixDouble(), int shift=0) override
Definition MatOps.cpp:183
std::pair< bool, MatrixPtr > insertDependentData(const std::string &name, const MatrixDouble &data=MatrixDouble(), int shift=0) override
Definition MatOps.cpp:173
MoFEMErrorCode setContinuousVector(DataContainer &data_container, std::vector< double > &variables)
Definition MatOps.cpp:412
auto & getDataDependentByName()
Definition MatOps.cpp:136
MoFEMErrorCode getDependentContinuousVector(const std::vector< double > &dependent_variables) override
Definition MatOps.cpp:400
DataContainer dataActive
Definition MatOps.cpp:464
MatrixPtr getCommonDataPtr(const std::string &name) override
Definition MatOps.cpp:193
MoFEMErrorCode bindStateTag(MoFEM::Interface &m_field, const std::string &name, int num_components) override
Definition MatOps.cpp:324
DataContainer dataState
Definition MatOps.cpp:467
MatrixPtr getDependentDataPtr(const std::string &name) override
Definition MatOps.cpp:215
MatOpsData::MatrixPtr MatrixPtr
Definition MatOps.cpp:93
MoFEMErrorCode getDependentDerivativesContinuousVector(const std::vector< double > &dependent_variables_derivatives) override
Definition MatOps.cpp:405
MoFEMErrorCode setDependentDerivativesContinuousVector(std::vector< double > &dependent_variables_derivatives) override
Definition MatOps.cpp:389
auto & getDataDependentDerivativesByName()
Definition MatOps.cpp:140
auto & getStateDataByName()
Definition MatOps.cpp:144
std::pair< bool, MatrixPtr > insertCommonData(const std::string &name, const MatrixDouble &data=MatrixDouble(), int shift=0) override
Definition MatOps.cpp:153
MatrixPtr getDependentDerivativesDataPtr(const std::string &name) override
Definition MatOps.cpp:226
StateTags getStateTags() const override
Definition MatOps.cpp:307
MatrixPtr getActiveDataPtr(const std::string &name) override
Definition MatOps.cpp:204
std::pair< bool, MatrixPtr > insertActiveData(const std::string &name, const MatrixDouble &data=MatrixDouble(), int shift=0) override
Definition MatOps.cpp:163
auto & getDataCommonByName()
Definition MatOps.cpp:128
auto & getStateDataBySequence()
Definition MatOps.cpp:148
MoFEMErrorCode setDependentContinuousVector(std::vector< double > &dependent_variables) override
Definition MatOps.cpp:384
MoFEMErrorCode setActiveContinuousVector(std::vector< double > &active_variables) override
Definition MatOps.cpp:380
DataContainer dataCommon
Definition MatOps.cpp:463
MoFEMErrorCode getContinuousVector(DataContainer &data_container, const std::vector< double > &variables)
Definition MatOps.cpp:436
boost::shared_ptr< MatrixAdaptor > StateMatrixPtr
Definition MatOps.hpp:41
boost::shared_ptr< MatrixDouble > MatrixPtr
Definition MatOps.hpp:40
static int setTagName(std::string name, int tag=-1)
Definition MatOps.cpp:30
static std::string getTagName(int tag)
Definition MatOps.cpp:83
static int atTagName(std::string name)
Definition MatOps.cpp:26
static int getTagByName(std::string name)
Definition MatOps.cpp:73
static std::map< std::string, int > tagNameVsTag
Definition MatOps.hpp:32
virtual moab::Interface & get_moab()=0
Deprecated interface functions.