v0.16.3
Loading...
Searching...
No Matches
Public Types | Public Member Functions | Protected Attributes | List of all members
MatOps::OpEvalTopoMatObjectiveImpl< DIM, DomainEleOp > Struct Template Reference
Inheritance diagram for MatOps::OpEvalTopoMatObjectiveImpl< DIM, DomainEleOp >:
[legend]
Collaboration diagram for MatOps::OpEvalTopoMatObjectiveImpl< DIM, DomainEleOp >:
[legend]

Public Types

using OP = DomainEleOp
 

Public Member Functions

 OpEvalTopoMatObjectiveImpl (boost::shared_ptr< PhysicalEquations > physical_ptr, bool eval_stress, bool eval_tangent, bool update)
 
MoFEMErrorCode doWork (int side, EntityType type, EntData &data)
 

Protected Attributes

boost::shared_ptr< PhysicalEquations > physicalPtr
 
const bool evalStress
 
const bool evalTangent
 
const bool updateState
 

Detailed Description

template<int DIM, typename DomainEleOp>
struct MatOps::OpEvalTopoMatObjectiveImpl< DIM, DomainEleOp >

Definition at line 203 of file MatElastic.cpp.

Member Typedef Documentation

◆ OP

template<int DIM, typename DomainEleOp >
using MatOps::OpEvalTopoMatObjectiveImpl< DIM, DomainEleOp >::OP = DomainEleOp

Definition at line 205 of file MatElastic.cpp.

Constructor & Destructor Documentation

◆ OpEvalTopoMatObjectiveImpl()

template<int DIM, typename DomainEleOp >
MatOps::OpEvalTopoMatObjectiveImpl< DIM, DomainEleOp >::OpEvalTopoMatObjectiveImpl ( boost::shared_ptr< PhysicalEquations >  physical_ptr,
bool  eval_stress,
bool  eval_tangent,
bool  update 
)
inline

Definition at line 207 of file MatElastic.cpp.

209 : DomainEleOp(NOSPACE, DomainEleOp::OPSPACE), physicalPtr(physical_ptr),
210 evalStress(eval_stress), evalTangent(eval_tangent),
211 updateState(update) {}
@ NOSPACE
Definition definitions.h:83
boost::shared_ptr< PhysicalEquations > physicalPtr

Member Function Documentation

◆ doWork()

template<int DIM, typename DomainEleOp >
MoFEMErrorCode MatOps::OpEvalTopoMatObjectiveImpl< DIM, DomainEleOp >::doWork ( int  side,
EntityType  type,
EntData &  data 
)

Definition at line 224 of file MatElastic.cpp.

225 {
227
228 int nb_integration_pts = OP::getGaussPts().size2();
229
230 auto get_tag = [&]() {
231 if (physicalPtr->tagVsRangePtr) {
232 for (const auto &tag_range_pair : *(physicalPtr->tagVsRangePtr)) {
233 if (tag_range_pair.second.find(DomainEleOp::getFEEntityHandle()) !=
234 tag_range_pair.second.end()) {
235 return tag_range_pair.first;
236 }
237 }
238 }
239#ifndef NDEBUG
242 "ADOL-C tag not found " +
243 std::to_string(physicalPtr->tAg));
244 }
245#endif
246 return physicalPtr->tAg; // Default tag if no range matches
247 };
248
249 const int current_tag = get_tag();
250 auto *fe_ptr = const_cast<FEMethod *>(this->getFEMethod());
251 const auto ent = fe_ptr->getFEEntityHandle();
252
253 physicalPtr->matOpsDataPtr->getActiveDataPtr("Jac")->resize(DIM, DIM, false);
254 physicalPtr->matOpsDataPtr->getDependentDataPtr("Obj")->resize(1, false);
255 physicalPtr->matOpsDataPtr->getDependentDerivativesDataPtr("dObj")->resize(
256 DIM, DIM, false);
257 auto mat_jac_ptr = physicalPtr->matOpsDataPtr->getCommonDataPtr("Jac");
258 auto mat_grad_ptr = physicalPtr->matOpsDataPtr->getCommonDataPtr("grad");
259 auto mat_var_grad_ptr =
260 physicalPtr->matOpsDataPtr->getCommonDataPtr("var_grad");
261 auto mat_obj_ptr = physicalPtr->matOpsDataPtr->getCommonDataPtr("Obj");
262 auto mat_dObj_ptr = physicalPtr->matOpsDataPtr->getCommonDataPtr("dObj");
263
264#ifndef NDEBUG
265 if (!mat_jac_ptr || !mat_grad_ptr || !mat_var_grad_ptr || !mat_obj_ptr ||
266 !mat_dObj_ptr) {
267 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
268 "Missing common data for ADOL-C evaluation");
269 }
270#endif
271
273 auto get_jac_at_pts =
274 MatrixSizeHelper<GetFTensor2FromMatType<DIM, DIM, -1, DL>, DL>::get(
275 *mat_jac_ptr, nb_integration_pts);
276 [[maybe_unused]] auto get_grad_at_pts =
277 MatrixSizeHelper<GetFTensor2FromMatType<DIM, DIM, -1, DL>, DL>::get(
278 *mat_grad_ptr, nb_integration_pts);
279 [[maybe_unused]] auto get_var_grad_at_pts =
280 MatrixSizeHelper<GetFTensor2FromMatType<DIM, DIM, -1, DL>, DL>::get(
281 *mat_var_grad_ptr, nb_integration_pts);
282 auto get_obj_at_pts =
284 *mat_obj_ptr, nb_integration_pts);
285 auto get_dObj_at_pts =
287 *mat_dObj_ptr, nb_integration_pts);
288
289 if (evalStress) {
290 FTENSOR_INDEX(DIM, i);
291 FTENSOR_INDEX(DIM, J);
292
293 auto t_jac_at_pts = get_jac_at_pts();
294 auto t_obj_at_pts = get_obj_at_pts();
295
296 auto next = [&]() {
297 ++t_jac_at_pts;
298 ++t_obj_at_pts;
299 };
300
301 for (auto gg = 0; gg != nb_integration_pts; ++gg) {
302 auto t_jac = getFTensor2FromPtr<DIM, DIM>(
303 physicalPtr->matOpsDataPtr->getActiveDataPtr("Jac")->data().data());
304 t_jac(i, J) = t_jac_at_pts(i, J);
305 CHKERR physicalPtr->setParams(fe_ptr, gg);
306 CHKERR physicalPtr->evaluateVariable(current_tag, ent, gg);
307 auto t_obj = getFTensor1FromPtr<1, 1>(
308 physicalPtr->matOpsDataPtr->getDependentDataPtr("Obj")
309 ->data()
310 .data());
311 t_obj_at_pts(0) = t_obj(0);
312 next();
313 }
314 }
315
316 if (evalTangent) {
317 FTENSOR_INDEX(DIM, i);
318 FTENSOR_INDEX(DIM, J);
319 FTENSOR_INDEX(DIM, k);
320 FTENSOR_INDEX(DIM, L);
321
322 auto t_jac_at_pts = get_jac_at_pts();
323 auto t_dObj_at_pts = get_dObj_at_pts();
324 auto next = [&]() {
325 ++t_jac_at_pts;
326 ++t_dObj_at_pts;
327 };
328
329 for (auto gg = 0; gg != nb_integration_pts; ++gg) {
330 auto t_jac = getFTensor2FromPtr<DIM, DIM>(
331 physicalPtr->matOpsDataPtr->getActiveDataPtr("Jac")->data().data());
332 t_jac(i, J) = t_jac_at_pts(i, J);
333 CHKERR physicalPtr->setParams(fe_ptr, gg);
334 CHKERR physicalPtr->evaluateDerivatives(current_tag, ent, gg);
335 auto t_dObj = getFTensor2FromPtr<DIM, DIM>(
336 physicalPtr->matOpsDataPtr->getDependentDerivativesDataPtr("dObj")
337 ->data()
338 .data());
339 t_dObj_at_pts(i, J) = t_dObj(i, J);
340 next();
341 }
342 }
343
344 if (updateState) {
345 }
346
348}
PetscInt size
#define FTENSOR_INDEX(DIM, I)
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
#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.
FTensor::Index< 'i', SPACE_DIM > i
FTensor::Index< 'J', DIM1 > J
Definition level_set.cpp:30
FTensor::Index< 'k', 3 > k
DataLayoutTraits< DataLayout::GaussByCoeffs > DL
Definition MatHuHu.hpp:33
decltype(GetFTensor1FromMatImpl< Tensor_Dim, S, DL, M >::get(std::declval< M & >(), 0, 0)) GetFTensor1FromMatType
decltype(GetFTensor2FromMatImpl< Tensor_Dim0, Tensor_Dim1, S, DL, M >::get(std::declval< M & >(), 0, 0)) GetFTensor2FromMatType
static std::string getTagName(int tag)
Definition MatOps.cpp:90
Structure for user loop methods on finite elements.
EntityHandle getFEEntityHandle() const
Get the entity handle of the current finite element.

Member Data Documentation

◆ evalStress

template<int DIM, typename DomainEleOp >
const bool MatOps::OpEvalTopoMatObjectiveImpl< DIM, DomainEleOp >::evalStress
protected

Definition at line 217 of file MatElastic.cpp.

◆ evalTangent

template<int DIM, typename DomainEleOp >
const bool MatOps::OpEvalTopoMatObjectiveImpl< DIM, DomainEleOp >::evalTangent
protected

Definition at line 218 of file MatElastic.cpp.

◆ physicalPtr

template<int DIM, typename DomainEleOp >
boost::shared_ptr<PhysicalEquations> MatOps::OpEvalTopoMatObjectiveImpl< DIM, DomainEleOp >::physicalPtr
protected

Definition at line 216 of file MatElastic.cpp.

◆ updateState

template<int DIM, typename DomainEleOp >
const bool MatOps::OpEvalTopoMatObjectiveImpl< DIM, DomainEleOp >::updateState
protected

Definition at line 219 of file MatElastic.cpp.


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