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