v0.16.0
Loading...
Searching...
No Matches
Classes | Public Types | Public Member Functions | Protected Member Functions | Protected Attributes | List of all members
MatOps::MatOpsDataImpl Struct Reference
Inheritance diagram for MatOps::MatOpsDataImpl:
[legend]
Collaboration diagram for MatOps::MatOpsDataImpl:
[legend]

Classes

struct  Data
 

Public Types

using MatrixPtr = MatOpsData::MatrixPtr
 
using StateMatrixPtr = MatOpsData::StateMatrixPtr
 
using DataContainer = 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 > > > >
 
- Public Types inherited from MatOps::MatOpsData
using MatrixPtr = boost::shared_ptr< MatrixDouble >
 
using StateMatrixPtr = boost::shared_ptr< MatrixAdaptor >
 

Public Member Functions

auto & getDataCommonByName ()
 
auto & getDataActiveByName ()
 
auto & getDataDependentByName ()
 
auto & getDataDependentDerivativesByName ()
 
auto & getStateDataByName ()
 
auto & getStateDataBySequence ()
 
std::pair< bool, MatrixPtrinsertCommonData (const std::string &name, const MatrixDouble &data=MatrixDouble(), int shift=0) override
 
std::pair< bool, MatrixPtrinsertActiveData (const std::string &name, const MatrixDouble &data=MatrixDouble(), int shift=0) override
 
std::pair< bool, MatrixPtrinsertDependentData (const std::string &name, const MatrixDouble &data=MatrixDouble(), int shift=0) override
 
std::pair< bool, MatrixPtrinsertDependentDerivativesData (const std::string &name, const MatrixDouble &data=MatrixDouble(), int shift=0) override
 
MatrixPtr getCommonDataPtr (const std::string &name) override
 
MatrixPtr getActiveDataPtr (const std::string &name) override
 
MatrixPtr getDependentDataPtr (const std::string &name) override
 
MatrixPtr getDependentDerivativesDataPtr (const std::string &name) override
 
StateMatrixPtr getStateDataPtr (const std::string &name, EntityHandle ent, int gg) override
 
StateTags getStateTags () const override
 
MoFEMErrorCode bindStateTag (MoFEM::Interface &m_field, const std::string &name, int num_components) override
 
MoFEMErrorCode setupStateData () override
 
MoFEMErrorCode setActiveContinuousVector (std::vector< double > &active_variables) override
 
MoFEMErrorCode setDependentContinuousVector (std::vector< double > &dependent_variables) override
 
MoFEMErrorCode setDependentDerivativesContinuousVector (std::vector< double > &dependent_variables_derivatives) override
 
MoFEMErrorCode getActiveContinuousVector (const std::vector< double > &active_variables) override
 
MoFEMErrorCode getDependentContinuousVector (const std::vector< double > &dependent_variables) override
 
MoFEMErrorCode getDependentDerivativesContinuousVector (const std::vector< double > &dependent_variables_derivatives) override
 
- Public Member Functions inherited from MatOps::MatOpsData
virtual ~MatOpsData ()=default
 

Protected Member Functions

MoFEMErrorCode setContinuousVector (DataContainer &data_container, std::vector< double > &variables)
 
MoFEMErrorCode getContinuousVector (DataContainer &data_container, const std::vector< double > &variables)
 

Protected Attributes

DataContainer dataCommon
 
DataContainer dataActive
 
DataContainer dataDependent
 
DataContainer dataDependentDerivatives
 
DataContainer dataState
 
MoFEM::InterfacemFieldPtr = nullptr
 

Detailed Description

Definition at line 92 of file MatOps.cpp.

Member Typedef Documentation

◆ DataContainer

using MatOps::MatOpsDataImpl::DataContainer = 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> >> >

Definition at line 115 of file MatOps.cpp.

◆ MatrixPtr

Definition at line 93 of file MatOps.cpp.

◆ StateMatrixPtr

Definition at line 94 of file MatOps.cpp.

Member Function Documentation

◆ bindStateTag()

MoFEMErrorCode MatOps::MatOpsDataImpl::bindStateTag ( MoFEM::Interface m_field,
const std::string &  name,
int  num_components 
)
inlineoverridevirtual

Implements MatOps::MatOpsData.

Definition at line 324 of file MatOps.cpp.

326 {
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 }
#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()
MoFEM::Interface * mFieldPtr
Definition MatOps.cpp:468
auto & getStateDataByName()
Definition MatOps.cpp:144

◆ getActiveContinuousVector()

MoFEMErrorCode MatOps::MatOpsDataImpl::getActiveContinuousVector ( const std::vector< double > &  active_variables)
inlineoverridevirtual

Implements MatOps::MatOpsData.

Definition at line 395 of file MatOps.cpp.

396 {
397 return getContinuousVector(dataActive, active_variables);
398 }
DataContainer dataActive
Definition MatOps.cpp:464
MoFEMErrorCode getContinuousVector(DataContainer &data_container, const std::vector< double > &variables)
Definition MatOps.cpp:436

◆ getActiveDataPtr()

MatrixPtr MatOps::MatOpsDataImpl::getActiveDataPtr ( const std::string &  name)
inlineoverridevirtual

Implements MatOps::MatOpsData.

Definition at line 204 of file MatOps.cpp.

204 {
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 }
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
auto & getDataActiveByName()
Definition MatOps.cpp:132
MatOpsData::MatrixPtr MatrixPtr
Definition MatOps.cpp:93

◆ getCommonDataPtr()

MatrixPtr MatOps::MatOpsDataImpl::getCommonDataPtr ( const std::string &  name)
inlineoverridevirtual

Implements MatOps::MatOpsData.

Definition at line 193 of file MatOps.cpp.

193 {
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 }
auto & getDataCommonByName()
Definition MatOps.cpp:128

◆ getContinuousVector()

MoFEMErrorCode MatOps::MatOpsDataImpl::getContinuousVector ( DataContainer data_container,
const std::vector< double > &  variables 
)
inlineprotected

Definition at line 436 of file MatOps.cpp.

437 {
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 }
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...

◆ getDataActiveByName()

auto & MatOps::MatOpsDataImpl::getDataActiveByName ( )
inline

Definition at line 132 of file MatOps.cpp.

132 {
133 return boost::multi_index::get<DataName_mi_tag>(dataActive);
134 }

◆ getDataCommonByName()

auto & MatOps::MatOpsDataImpl::getDataCommonByName ( )
inline

Definition at line 128 of file MatOps.cpp.

128 {
129 return boost::multi_index::get<DataName_mi_tag>(dataCommon);
130 }
DataContainer dataCommon
Definition MatOps.cpp:463

◆ getDataDependentByName()

auto & MatOps::MatOpsDataImpl::getDataDependentByName ( )
inline

Definition at line 136 of file MatOps.cpp.

136 {
137 return boost::multi_index::get<DataName_mi_tag>(dataDependent);
138 }
DataContainer dataDependent
Definition MatOps.cpp:465

◆ getDataDependentDerivativesByName()

auto & MatOps::MatOpsDataImpl::getDataDependentDerivativesByName ( )
inline

Definition at line 140 of file MatOps.cpp.

140 {
141 return boost::multi_index::get<DataName_mi_tag>(dataDependentDerivatives);
142 }
DataContainer dataDependentDerivatives
Definition MatOps.cpp:466

◆ getDependentContinuousVector()

MoFEMErrorCode MatOps::MatOpsDataImpl::getDependentContinuousVector ( const std::vector< double > &  dependent_variables)
inlineoverridevirtual

Implements MatOps::MatOpsData.

Definition at line 400 of file MatOps.cpp.

401 {
402 return getContinuousVector(dataDependent, dependent_variables);
403 }

◆ getDependentDataPtr()

MatrixPtr MatOps::MatOpsDataImpl::getDependentDataPtr ( const std::string &  name)
inlineoverridevirtual

Implements MatOps::MatOpsData.

Definition at line 215 of file MatOps.cpp.

215 {
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 }
auto & getDataDependentByName()
Definition MatOps.cpp:136

◆ getDependentDerivativesContinuousVector()

MoFEMErrorCode MatOps::MatOpsDataImpl::getDependentDerivativesContinuousVector ( const std::vector< double > &  dependent_variables_derivatives)
inlineoverridevirtual

Implements MatOps::MatOpsData.

Definition at line 405 of file MatOps.cpp.

406 {
408 dependent_variables_derivatives);
409 }

◆ getDependentDerivativesDataPtr()

MatrixPtr MatOps::MatOpsDataImpl::getDependentDerivativesDataPtr ( const std::string &  name)
inlineoverridevirtual

Implements MatOps::MatOpsData.

Definition at line 226 of file MatOps.cpp.

226 {
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 }
auto & getDataDependentDerivativesByName()
Definition MatOps.cpp:140

◆ getStateDataByName()

auto & MatOps::MatOpsDataImpl::getStateDataByName ( )
inline

Definition at line 144 of file MatOps.cpp.

144 {
145 return boost::multi_index::get<DataName_mi_tag>(dataState);
146 }
DataContainer dataState
Definition MatOps.cpp:467

◆ getStateDataBySequence()

auto & MatOps::MatOpsDataImpl::getStateDataBySequence ( )
inline

Definition at line 148 of file MatOps.cpp.

148 {
149 return boost::multi_index::get<DataSequence_mi_tag>(dataState);
150 }

◆ getStateDataPtr()

StateMatrixPtr MatOps::MatOpsDataImpl::getStateDataPtr ( const std::string &  name,
EntityHandle  ent,
int  gg 
)
inlineoverridevirtual

Implements MatOps::MatOpsData.

Definition at line 238 of file MatOps.cpp.

239 {
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 }
static MoFEMErrorCodeGeneric< moab::ErrorCode > rval
MatOpsData::StateMatrixPtr StateMatrixPtr
Definition MatOps.cpp:94
virtual moab::Interface & get_moab()=0

◆ getStateTags()

StateTags MatOps::MatOpsDataImpl::getStateTags ( ) const
inlineoverridevirtual

Implements MatOps::MatOpsData.

Definition at line 307 of file MatOps.cpp.

307 {
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 }
static void sortStateTags(StateTags &state_tags)
Definition MatOps.cpp:19
std::vector< StateTag > StateTags
Definition MatOps.hpp:21

◆ insertActiveData()

std::pair< bool, MatrixPtr > MatOps::MatOpsDataImpl::insertActiveData ( const std::string &  name,
const MatrixDouble &  data = MatrixDouble(),
int  shift = 0 
)
inlineoverridevirtual

Implements MatOps::MatOpsData.

Definition at line 163 of file MatOps.cpp.

165 {
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 }

◆ insertCommonData()

std::pair< bool, MatrixPtr > MatOps::MatOpsDataImpl::insertCommonData ( const std::string &  name,
const MatrixDouble &  data = MatrixDouble(),
int  shift = 0 
)
inlineoverridevirtual

Implements MatOps::MatOpsData.

Definition at line 153 of file MatOps.cpp.

155 {
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 }

◆ insertDependentData()

std::pair< bool, MatrixPtr > MatOps::MatOpsDataImpl::insertDependentData ( const std::string &  name,
const MatrixDouble &  data = MatrixDouble(),
int  shift = 0 
)
inlineoverridevirtual

Implements MatOps::MatOpsData.

Definition at line 173 of file MatOps.cpp.

175 {
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 }

◆ insertDependentDerivativesData()

std::pair< bool, MatrixPtr > MatOps::MatOpsDataImpl::insertDependentDerivativesData ( const std::string &  name,
const MatrixDouble &  data = MatrixDouble(),
int  shift = 0 
)
inlineoverridevirtual

Implements MatOps::MatOpsData.

Definition at line 183 of file MatOps.cpp.

185 {
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 }

◆ setActiveContinuousVector()

MoFEMErrorCode MatOps::MatOpsDataImpl::setActiveContinuousVector ( std::vector< double > &  active_variables)
inlineoverridevirtual

Implements MatOps::MatOpsData.

Definition at line 380 of file MatOps.cpp.

380 {
381 return setContinuousVector(dataActive, active_variables);
382 }
MoFEMErrorCode setContinuousVector(DataContainer &data_container, std::vector< double > &variables)
Definition MatOps.cpp:412

◆ setContinuousVector()

MoFEMErrorCode MatOps::MatOpsDataImpl::setContinuousVector ( DataContainer data_container,
std::vector< double > &  variables 
)
inlineprotected

Definition at line 412 of file MatOps.cpp.

413 {
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 }

◆ setDependentContinuousVector()

MoFEMErrorCode MatOps::MatOpsDataImpl::setDependentContinuousVector ( std::vector< double > &  dependent_variables)
inlineoverridevirtual

Implements MatOps::MatOpsData.

Definition at line 384 of file MatOps.cpp.

385 {
386 return setContinuousVector(dataDependent, dependent_variables);
387 }

◆ setDependentDerivativesContinuousVector()

MoFEMErrorCode MatOps::MatOpsDataImpl::setDependentDerivativesContinuousVector ( std::vector< double > &  dependent_variables_derivatives)
inlineoverridevirtual

Implements MatOps::MatOpsData.

Definition at line 389 of file MatOps.cpp.

390 {
392 dependent_variables_derivatives);
393 }

◆ setupStateData()

MoFEMErrorCode MatOps::MatOpsDataImpl::setupStateData ( )
inlineoverridevirtual

Implements MatOps::MatOpsData.

Definition at line 356 of file MatOps.cpp.

356 {
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 }
#define CHKERR
Inline error check.
auto & getStateDataBySequence()
Definition MatOps.cpp:148

Member Data Documentation

◆ dataActive

DataContainer MatOps::MatOpsDataImpl::dataActive
protected

Definition at line 464 of file MatOps.cpp.

◆ dataCommon

DataContainer MatOps::MatOpsDataImpl::dataCommon
protected

Definition at line 463 of file MatOps.cpp.

◆ dataDependent

DataContainer MatOps::MatOpsDataImpl::dataDependent
protected

Definition at line 465 of file MatOps.cpp.

◆ dataDependentDerivatives

DataContainer MatOps::MatOpsDataImpl::dataDependentDerivatives
protected

Definition at line 466 of file MatOps.cpp.

◆ dataState

DataContainer MatOps::MatOpsDataImpl::dataState
protected

Definition at line 467 of file MatOps.cpp.

◆ mFieldPtr

MoFEM::Interface* MatOps::MatOpsDataImpl::mFieldPtr = nullptr
protected

Definition at line 468 of file MatOps.cpp.


The documentation for this struct was generated from the following file: