11#ifndef ESHELBIAN_TOPOLOGICAL_DERIVATIVE_HPP
12#define ESHELBIAN_TOPOLOGICAL_DERIVATIVE_HPP
17 :
public boost::enable_shared_from_this<MatOpsTopoData> {
22 matOpsData->insertCommonData(
"invJacobianAtPtr");
23 matOpsData->insertCommonData(
"detJacobianAtPts");
28 matOpsData->insertCommonData(
"objDStrainAtPts");
29 matOpsData->insertCommonData(
"objDStressAtPts");
30 matOpsData->insertCommonData(
"objDRotationAtPts");
31 matOpsData->insertCommonData(
"objDDisplacementAtPts");
43 template <
class Tensor>
44 static inline auto getFTensor(MatrixDouble &
m,
const int nb_gauss_pts) {
45 return MatrixSizeHelper<Tensor, DL>::get(
m, nb_gauss_pts)();
48 template <
class Tensor>
50 return getFTensor<Tensor>(*
m, nb_gauss_pts);
56 THROW_MESSAGE(
"TopologicalData matrix pointer is not available");
58 const auto nb =
static_cast<size_t>(nb_gauss_pts);
59 if (!((
m->size1() == nb &&
m->size2() == 1) ||
60 (
m->size1() == 1 &&
m->size2() == nb)))
61 THROW_MESSAGE(
"Scalar matrix size is not compatible with the number of "
62 "integration points");
64 return getFTensor0FromMat(*
m);
70 matOpsData->getCommonDataPtr(
"jacobianAtPts"), nb_gauss_pts);
76 matOpsData->getCommonDataPtr(
"invJacobianAtPtr"), nb_gauss_pts);
86 matOpsData->getCommonDataPtr(
"tangent1AtPts"), nb_gauss_pts);
91 matOpsData->getCommonDataPtr(
"tangent2AtPts"), nb_gauss_pts);
96 matOpsData->getCommonDataPtr(
"normalAtPts"), nb_gauss_pts);
107 matOpsData->getCommonDataPtr(
"objDStrainAtPts"), nb_gauss_pts);
113 matOpsData->getCommonDataPtr(
"objDStressAtPts"), nb_gauss_pts);
118 matOpsData->getCommonDataPtr(
"objDDisplacementAtPts"), nb_gauss_pts);
123 matOpsData->getCommonDataPtr(
"objDRotationAtPts"), nb_gauss_pts);
127 return matOpsData->getCommonDataPtr(
"jacobianAtPts");
131 return matOpsData->getCommonDataPtr(
"invJacobianAtPtr");
135 return matOpsData->getCommonDataPtr(
"detJacobianAtPts");
139 return matOpsData->getCommonDataPtr(
"tangent1AtPts");
143 return matOpsData->getCommonDataPtr(
"tangent2AtPts");
147 return matOpsData->getCommonDataPtr(
"normalAtPts");
151 return matOpsData->getCommonDataPtr(
"objAtPts");
155 return matOpsData->getCommonDataPtr(
"objDStrainAtPts");
159 return matOpsData->getCommonDataPtr(
"objDStressAtPts");
163 return matOpsData->getCommonDataPtr(
"objDDisplacementAtPts");
167 return matOpsData->getCommonDataPtr(
"objDRotationAtPts");
180 ForcesAndSourcesCore::GaussHookFun set_integration_at_interior,
181 ForcesAndSourcesCore::GaussHookFun set_integration_at_face,
182 SmartPetscObj<TS> time_solver);
#define THROW_MESSAGE(msg)
Throw MoFEM exception.
boost::shared_ptr< TopologicalTAOCtx > createTopologicalTAOCtx(EshelbianCore *ep, ForcesAndSourcesCore::GaussHookFun set_integration_at_interior, ForcesAndSourcesCore::GaussHookFun set_integration_at_face, SmartPetscObj< TS > time_solver)
boost::shared_ptr< MatrixDouble > MatrixPtr
MoFEMErrorCode evaluateGradient(TopologicalTAOCtx *ctx_ptr, double *f, Vec g, ObjectiveModelType eval_energy_model)
DataLayoutTraits< DataLayout::GaussByCoeffs > DL
MoFEMErrorCode topologicalEvaluateObjectiveAndGradient(Tao tao, Vec sol, PetscReal *f, Vec g, void *ctx)
MoFEMErrorCode testTopologicalDerivative(TopologicalTAOCtx *ctx_ptr, Vec sol, PetscReal *f, Vec g, ObjectiveModelType eval_energy_model)
boost::shared_ptr< MatOpsData > createMatOpsDataPtr()
FTensor::Index< 'm', 3 > m
boost::shared_ptr< MatOps::MatOpsData > matOpsData
auto getObjDStrainAtPts()
auto getObjDStressAtPts()
auto getFTensorObjDStress(const int nb_gauss_pts)
auto getFTensorObjDRotation(const int nb_gauss_pts)
auto getFTensorObj(const int nb_gauss_pts)
static auto getFTensor(MatrixDouble &m, const int nb_gauss_pts)
auto getFTensorTangent1(const int nb_gauss_pts)
auto getInvJacobianAtPts()
static auto getFTensor0(MatrixPtr m, const int nb_gauss_pts)
auto getObjDRotationAtPts()
auto getFTensorJacobian(const int nb_gauss_pts)
auto getDetJacobianAtPts()
auto getFTensorDetJacobian(const int nb_gauss_pts)
auto getFTensorObjDStrain(const int nb_gauss_pts)
auto getObjDDisplacementAtPts()
auto getFTensorTangent2(const int nb_gauss_pts)
auto getFTensorInvJacobian(const int nb_gauss_pts)
auto getFTensorObjDDisplacement(const int nb_gauss_pts)
static auto getFTensor(MatrixPtr m, const int nb_gauss_pts)
auto getFTensorNormal(const int nb_gauss_pts)
TopologicalTAOCtx()=default
virtual ~TopologicalTAOCtx()=default