20#include <boost/math/constants/constants.hpp>
25std::vector<PhysicalEquations::FieldDefinition>
27 std::vector<FieldDefinition> fields;
35 Orders::auxiliaryLogStress(ep.
spaceOrder), 5}};
46 "Get material field orders failed");
50std::vector<std::string>
52 std::vector<std::string> fields;
55 fields.push_back(field.name);
59std::vector<std::pair<std::string, std::string>>
61 std::vector<std::pair<std::string, std::string>> blocks;
68 blocks.emplace_back(field, field);
73 for (
const auto &mechanical :
75 blocks.emplace_back(field, mechanical);
83std::vector<std::pair<std::string, std::string>>
85 std::vector<std::pair<std::string, std::string>> blocks;
94 for (
const auto &field :
108 double alpha_grad_u = 0;
110 "-neo_hookean_viscosity_alpha_grad_u",
111 &alpha_grad_u, PETSC_NULLPTR);
114 "-physical_h1_update", &h1_update, PETSC_NULLPTR);
115 const bool plastic_solver =
125 const std::pair<bool, const char *> unsupported[] = {
126 {material_model !=
Neohookean,
"requires -material neo_hookean"},
130 "requires the symmetric row convention"},
133 "requires zero -neo_hookean_viscosity_alpha_grad_u"},
136 "requires time_solver without dynamic relaxation or plastic "
137 "incremental optimization"},
138 {h1_update == PETSC_TRUE,
"does not yet support -physical_h1_update"},
140 "does not yet support -cracking_on or -cohesive_interface_on"},
142 "does not yet support internal stress"},
144 "does not yet support material mesh transfer"}};
145 for (
const auto &[invalid, reason] : unsupported) {
148 "-auxiliary_logarithmic_stress %s", reason);
159 Range sdf_contact_faces;
160 for (
const auto &block :
162 std::regex(
"CONTACT_SDF(.*)"))) {
163 CHKERR block->getMeshsetIdEntitiesByDimension(
166 const auto nonempty = [](
const auto &ptr) {
return ptr && !ptr->empty(); };
167 const std::pair<bool, const char *> unsupported_data[] = {
170 {nonempty(ep.
contactFaces) || !sdf_contact_faces.empty(),
174 "front, crack or interface meshsets"}};
175 for (
const auto &[local_active, capability] : unsupported_data) {
176 int active = local_active;
177 CHKERR MPI_Allreduce(MPI_IN_PLACE, &
active, 1, MPI_INT, MPI_MAX,
181 "-auxiliary_logarithmic_stress does not yet support %s",
189 const EshelbianCore &ep, boost::ptr_deque<UserDataOperator> &pipeline,
190 boost::shared_ptr<DataAtIntegrationPts> data_ptr,
const FieldState state) {
194 auto strain_ptr = previous ? data_ptr->getLogStretchTensor0AtPts()
195 : data_ptr->getLogStretchTensorAtPts();
199 previous ? data_ptr->auxiliaryData0 : data_ptr->auxiliaryData;
201 fields = boost::make_shared<AuxiliaryLogarithmicStressData>();
206 previous ? data_ptr->getApproxP0AtPts()
207 : data_ptr->getApproxPAtPts());
216 const EshelbianCore &ep, boost::ptr_deque<UserDataOperator> &pipeline,
217 boost::shared_ptr<DataAtIntegrationPts> data_ptr) {
221 ep.
stretchTensor, data_ptr->getLogStretchDotTensorAtPts(), MBTET));
223 ep.
stretchTensor, data_ptr->getGradLogStretchDotTensorAtPts(), MBTET));
229 const EshelbianCore &ep, boost::ptr_deque<UserDataOperator> &pipeline,
230 boost::shared_ptr<DataAtIntegrationPts> data_ptr,
231 boost::shared_ptr<MatrixDouble> strain_ptr,
232 boost::shared_ptr<MatrixDouble> stress_ptr) {
235 auto external_pressure_ptr = boost::make_shared<VectorDouble>();
238 pipeline.push_back(op);
241 std::move(stress_ptr), std::move(external_pressure_ptr)));
246 const EshelbianCore &ep, boost::ptr_deque<UserDataOperator> &pipeline,
247 boost::shared_ptr<DataAtIntegrationPts> data_ptr,
const bool rhs,
264 boost::shared_ptr<DataAtIntegrationPts> data_ptr,
265 boost::shared_ptr<MatrixDouble> state_gradient_ptr)
271 "Helmholtz state-gradient operator has a null data pointer");
276 constexpr int state_size = 6;
277 const int nb_integration_pts =
getGaussPts().size2();
279 auto get_state_gradient =
282 auto t_state_gradient = get_state_gradient();
283 auto t_work =
dataAtPts->getFTensorAdjointPdU(nb_integration_pts);
284 auto t_plastic_f =
dataAtPts->getFTensorPlasticF(nb_integration_pts);
286 for (
int gg = 0; gg != nb_integration_pts; ++gg) {
291 t_state_gradient(
L) = det_plastic_f * t_work(
L);
305 const EshelbianCore &ep, boost::ptr_deque<UserDataOperator> &pipeline,
306 boost::shared_ptr<DataAtIntegrationPts> data_ptr) {
308 auto gradient_at_points = boost::make_shared<MatrixDouble>();
314 new OpAssembleGradient(ep.
stretchTensor, gradient_at_points));
319 const EshelbianCore &ep, boost::ptr_deque<UserDataOperator> &,
320 boost::shared_ptr<DataAtIntegrationPts>,
bool) {
323 "Selected material does not implement auxiliary logarithmic stress");
328 const EshelbianCore &ep, boost::ptr_deque<UserDataOperator> &,
329 boost::shared_ptr<DataAtIntegrationPts>,
bool) {
332 "Selected material does not evaluate auxiliary logarithmic stress");
337 const EshelbianCore &ep, boost::ptr_deque<UserDataOperator> &pipeline,
338 boost::shared_ptr<DataAtIntegrationPts> data_ptr) {
359 "Unsupported mesh transfer interpolation order %d, for "
365 boost::make_shared<EshelbianCore::DynamicRelaxationTimeScale>(
366 "internal_stress_history.txt",
false, default_scaling);
376 pipeline.push_back(op);
380 "OpSpatialPhysicalExternalStrain not implemented for this material");
388 const EshelbianCore &ep, boost::ptr_deque<UserDataOperator> &pipeline,
389 boost::shared_ptr<DataAtIntegrationPts> data_ptr) {
419 const EshelbianCore &ep, boost::ptr_deque<UserDataOperator> &pipeline,
420 boost::shared_ptr<DataAtIntegrationPts> data_ptr,
421 boost::shared_ptr<double> total_energy_ptr) {
428 data_ptr->getLogStretchTotalTensorAtPts());
429 pipeline.push_back(op);
435 const EshelbianCore &ep, boost::ptr_deque<UserDataOperator> &pipeline,
436 boost::shared_ptr<DataAtIntegrationPts> data_ptr) {
449 const bool eval_rhs,
const bool eval_lhs,
450 boost::shared_ptr<DataAtIntegrationPts> data_ptr,
451 boost::shared_ptr<PhysicalEquations> physics_ptr) {
457 boost::shared_ptr<DataAtIntegrationPts> data_ptr,
const double alpha_u) {
463 boost::shared_ptr<DataAtIntegrationPts> data_ptr,
464 boost::shared_ptr<ExternalStrainVec> external_strain_vec_ptr,
465 std::map<std::string, boost::shared_ptr<ScalingMethod>> smv) {
470 std::string row_field, std::string col_field,
471 boost::shared_ptr<DataAtIntegrationPts> data_ptr,
const double alpha) {
477 boost::shared_ptr<DataAtIntegrationPts> data_ptr,
479 boost::shared_ptr<TopologicalData> topo_ptr,
const double alpha_u,
480 boost::shared_ptr<double> J_ptr) {
485 boost::shared_ptr<DataAtIntegrationPts> data_ptr,
486 boost::shared_ptr<double> total_helmholtz_free_energy_ptr) {
493 boost::shared_ptr<DataAtIntegrationPts> data_ptr,
494 boost::shared_ptr<PhysicalEquations> physics_ptr,
495 boost::shared_ptr<MatrixDouble> strain_ptr) {
500 boost::shared_ptr<DataAtIntegrationPts> data_ptr,
501 boost::shared_ptr<PhysicalEquations> physics_ptr,
502 boost::shared_ptr<MatrixDouble> strain_ptr,
505 std::move(data_ptr), std::move(physics_ptr), std::move(strain_ptr));
509 boost::shared_ptr<DataAtIntegrationPts> data_ptr,
510 boost::shared_ptr<PhysicalEquations> physics_ptr,
511 boost::shared_ptr<MatrixDouble> strain_ptr,
512 boost::shared_ptr<MatrixDouble> stress_ptr,
515 std::move(data_ptr), std::move(physics_ptr), std::move(strain_ptr),
516 std::move(external_pressure_ptr));
521 boost::shared_ptr<ExternalStrainVec> external_strain_vec_ptr,
522 std::map<std::string, boost::shared_ptr<ScalingMethod>> smv) {
527 boost::shared_ptr<DataAtIntegrationPts> data_ptr,
528 boost::shared_ptr<PhysicalEquations> physics_ptr) {
533 const EshelbianCore &ep, boost::ptr_deque<UserDataOperator> &pipeline,
534 boost::shared_ptr<DataAtIntegrationPts> data_ptr,
547 pipeline.push_back(op);
550 data_ptr->getLogStretchTensorAtPts();
551 output.
symmetricFields[
"SpatialStretch"] = data_ptr->getStretchTensorAtPts();
553 output.
vectorFields[
"EiegnLogStreach"] = data_ptr->getEigenVals();
558 const EshelbianCore &ep, boost::ptr_deque<UserDataOperator> &pipeline,
559 boost::shared_ptr<DataAtIntegrationPts> data_ptr,
563 auto values = boost::make_shared<AuxiliaryLogarithmicStressData>();
565 ep, pipeline, values, data_ptr->getVarLogStreachPts(), variation);
574 ep.
stretchTensor, data_ptr->getVarLogStreachPts(), variation, MBTET));
578 data_ptr->getVarLogStreachPts();
583 const EshelbianCore &ep, boost::ptr_deque<UserDataOperator> &pipeline,
584 boost::shared_ptr<DataAtIntegrationPts> data_ptr,
588 auto values = boost::make_shared<AuxiliaryLogarithmicStressData>();
589 auto residual_stretch = boost::make_shared<MatrixDouble>();
591 residual_stretch, residual);
595 auto residual_stretch = boost::make_shared<MatrixDouble>();
605 boost::shared_ptr<DataAtIntegrationPts> data_ptr,
611 CHKERR EshelbianPlasticity::AddHOOps<SPACE_DIM, SPACE_DIM, SPACE_DIM>::add(
616 ep.
rotAxis, data_ptr->getRotAxisAtPts(), MBTET));
624 ep.
bubbleField, data_ptr->getApproxPAtPts(), MBMAXTYPE));
646 data_ptr->getStretchTensorAtPts();
653 data_ptr->getLogStretchTensorAtPts();
666 const char *list_materials[] = {
"stvenant_kirchhoff",
"mooney_rivlin",
667 "hencky",
"neo_hookean",
"meta"};
669 PetscBool no_stretch = PETSC_FALSE;
670 PetscBool auxiliary_logarithmic_stress = PETSC_FALSE;
671 PetscOptionsBegin(ep.
mField.
get_comm(),
"",
"Material physical equations",
673 CHKERR PetscOptionsEList(
"-material",
"material model",
"", list_materials,
675 &choice_material, PETSC_NULLPTR);
676 CHKERR PetscOptionsBool(
"-no_stretch",
"do not solve for stretch",
"",
677 no_stretch, &no_stretch, PETSC_NULLPTR);
679 "-auxiliary_logarithmic_stress",
680 "independent logarithmic deviator, volume and auxiliary stress",
"",
681 PETSC_FALSE, &auxiliary_logarithmic_stress, PETSC_NULLPTR);
684 const auto material_model =
static_cast<MaterialModel>(choice_material);
685 if (auxiliary_logarithmic_stress && no_stretch &&
689 "-auxiliary_logarithmic_stress cannot be combined with -no_stretch");
691 features.set(auxiliary_logarithmic_stress
696 ep.
dataAtPts = boost::make_shared<DataAtIntegrationPts>();
697 const std::map<std::string, std::string> material_model_names_dictionary = {
698 {
"grad",
"stretchH1AtPts"}, {
"P",
"PAtPts"}, {
"P_dF",
"PAtPts_du"}};
699 MatOps::MatPiolaResponse::useDeformationGradient =
true;
700 boost::shared_ptr<MatOps::PhysicalEquations> mat_physical_equations_ptr;
702 switch (material_model) {
704 MOFEM_LOG(
"EP", Sev::inform) <<
"St. Venant-Kirchhoff material model";
708 material_model_names_dictionary),
712 MOFEM_LOG(
"EP", Sev::inform) <<
"Mooney-Rivlin material model";
716 material_model_names_dictionary),
720 MOFEM_LOG(
"EP", Sev::inform) <<
"Hencky material model";
725 MOFEM_LOG(
"EP", Sev::inform) <<
"Neo-Hookean material model";
730 MOFEM_LOG(
"EP", Sev::inform) <<
"Meta Material model";
731 mat_physical_equations_ptr =
735 material_model_names_dictionary),
742 if (mat_physical_equations_ptr) {
743 CHKERR mat_physical_equations_ptr->getOptions(&ep.
mField);
744 CHKERR mat_physical_equations_ptr->recordTape();
745 if (material_model ==
Meta)
747 boost::static_pointer_cast<MatOps::MatPiolaResponse>(
748 mat_physical_equations_ptr),
752 boost::static_pointer_cast<MatOps::MatElastic>(
753 mat_physical_equations_ptr),
757 MOFEM_LOG(
"EP", Sev::inform) <<
"No stretch: -no_stretch "
Material and stress-work blocks for the independent D/theta/Td fields.
Distinct kinematic and material copies for diagnostic output.
Auxilary functions for Eshelbian plasticity.
Eshelbian plasticity interface.
Direct logarithmic Neo-Hookean material adapter.
Plasticity implementation of incremental optimization.
#define FTENSOR_INDEX(DIM, I)
FieldApproximationBase
approximation base
#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()
@ L2
field with C-1 continuity
@ HDIV
field with continuous normal traction
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_DATA_INCONSISTENCY
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
virtual bool check_field(const std::string &name) const =0
check if field is in database
#define MOFEM_LOG(channel, severity)
Log.
MoFEMErrorCode pushAuxiliaryLogarithmicPostProc(boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pipeline, boost::shared_ptr< DataAtIntegrationPts > data, MaterialPostProcData &output)
MoFEMErrorCode pushAuxiliaryLogarithmicStatePostProc(boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pipeline, boost::shared_ptr< AuxiliaryLogarithmicStressData > values, const std::string &prefix, MaterialPostProcData &output)
MoFEMErrorCode addCalculatePlasticLogarithmicStretchFieldValues(boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pipeline, const std::string &field_name, boost::shared_ptr< MatrixDouble > tensor_values, const EntityType zero_type, SmartPetscObj< DM > data_dm, SmartPetscObj< Vec > data_vector)
boost::shared_ptr< VectorDouble > VectorPtr
MoFEMErrorCode pushAuxiliaryLogarithmicFields(const EshelbianCore &ep, boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pipeline, boost::shared_ptr< AuxiliaryLogarithmicStressData > values, boost::shared_ptr< MatrixDouble > reconstructed_log_stretch, SmartPetscObj< Vec > state=nullptr)
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag)
boost::shared_ptr< MatOpsData > createMatOpsDataPtr()
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
implementation of Data Operators for Forces and Sources
PetscErrorCode PetscOptionsGetBool(PetscOptions *, const char pre[], const char name[], PetscBool *bval, PetscBool *set)
PetscErrorCode PetscOptionsGetScalar(PetscOptions *, const char pre[], const char name[], PetscScalar *dval, PetscBool *set)
static auto determinantTensor3by3(T &t)
Calculate the determinant of a 3x3 matrix or a tensor of rank 2.
constexpr auto field_name
boost::shared_ptr< ExternalStrainVec > externalStrainVecPtr
static PetscBool physicalH1Update
static enum StretchSelector stretchSelector
boost::shared_ptr< Range > frontAdjEdges
boost::shared_ptr< Range > contactFaces
MoFEM::Interface & mField
const std::string spatialL2Disp
std::map< std::string, boost::shared_ptr< ScalingMethod > > timeScaleMap
static enum SolverType solverType
const std::string materialH1Positions
static PetscBool crackingOn
static enum RotSelector rotSelector
static enum RotSelector gradApproximator
const std::string spatialH1Disp
@ TestIncrementalOptimizationConstraintDerivative
@ TestIncrementalOptimizationLayout
@ TestIncrementalOptimizationTransaction
@ TestIncrementalOptimizationObjectiveDerivative
@ IncrementalOptimization
@ TestEquilibratedMechanicalValue
const std::string logDeviator
const std::string plasticHField
const std::string piolaStress
const std::string logJacobian
boost::shared_ptr< Range > interfaceFaces
static PetscBool physicalTimeFlg
const std::string bubbleField
static constexpr enum SymmetrySelector symmetrySelector
const std::string auxiliaryLogStress
boost::shared_ptr< PhysicalEquations > physicalEquations
const std::string rotAxis
static std::string internalStressTagName
static PetscBool internalStressVoigt
static PetscBool plasticVolume
static PetscBool meshTransferSourceMeshFileSpecified
static PetscBool interfaceCrack
boost::shared_ptr< DataAtIntegrationPts > dataAtPts
boost::shared_ptr< Range > crackFaces
boost::shared_ptr< PressureBcVec > bcSpatialPressureVecPtr
static int meshTransferInterpOrder
SmartPetscObj< Vec > solTSStep
boost::shared_ptr< Range > frontEdges
const std::string stretchTensor
MoFEMErrorCode withFieldOrders(Op &&op) const
Map::DataMapMat vectorFields
Map::DataMapMat symmetricFields
boost::shared_ptr< MatrixDouble > stateGradientPtr
boost::shared_ptr< DataAtIntegrationPts > dataAtPts
MoFEMErrorCode doWork(int, EntityType, EntData &) override
Operator for linear form, usually to calculate values on right hand side.
OpCalculateHelmholtzStateGradient(boost::shared_ptr< DataAtIntegrationPts > data_ptr, boost::shared_ptr< MatrixDouble > state_gradient_ptr)
MoFEMErrorCode pushMaterialRates(const EshelbianCore &ep, boost::ptr_deque< UserDataOperator > &pipeline, boost::shared_ptr< DataAtIntegrationPts > data_ptr)
static const Features noStretchMask
virtual MoFEMErrorCode pushHelmholtzStateGradient(const EshelbianCore &ep, boost::ptr_deque< UserDataOperator > &pipeline, boost::shared_ptr< DataAtIntegrationPts > data_ptr)
Assemble the physical Helmholtz state derivative at equilibrium.
MoFEMErrorCode pushMaterialFields(const EshelbianCore &ep, boost::ptr_deque< UserDataOperator > &pipeline, boost::shared_ptr< DataAtIntegrationPts > data_ptr, FieldState state=CURRENT)
Evaluate the selected fields, or recover stretch from the matching stress.
std::vector< FieldDefinition > getMaterialFieldDefinitions(const EshelbianCore &ep) const
bool usesStressBasedStrain() const
virtual VolUserDataOperator * returnOpCalculateExternalPressure(VectorPtr external_pressure_ptr, boost::shared_ptr< ExternalStrainVec > external_strain_vec_ptr, std::map< std::string, boost::shared_ptr< ScalingMethod > > smv)
std::vector< std::pair< std::string, std::string > > getMaterialEmptyBlocks(const EshelbianCore &ep) const
MoFEMErrorCode pushPostProcResidual(const EshelbianCore &ep, boost::ptr_deque< UserDataOperator > &pipeline, boost::shared_ptr< DataAtIntegrationPts > data_ptr, SmartPetscObj< Vec > residual, MaterialPostProcData &output)
virtual VolUserDataOperator * returnOpCalculateVarStretchFromStress(boost::shared_ptr< DataAtIntegrationPts > data_ptr, boost::shared_ptr< PhysicalEquations > physics_ptr)
MoFEMErrorCode pushEnergyEvaluation(const EshelbianCore &ep, boost::ptr_deque< UserDataOperator > &pipeline, boost::shared_ptr< DataAtIntegrationPts > data_ptr, boost::shared_ptr< double > total_energy_ptr)
MoFEMErrorCode checkSetup(const EshelbianCore &ep) const
Check material capabilities after geometry and boundary setup.
MoFEMErrorCode pushMaterialEvaluation(const EshelbianCore &ep, boost::ptr_deque< UserDataOperator > &pipeline, boost::shared_ptr< DataAtIntegrationPts > data_ptr, bool rhs, bool lhs)
Evaluate constitutive data after kinematics and before material assembly.
MoFEMErrorCode pushMaterialResidual(const EshelbianCore &ep, boost::ptr_deque< UserDataOperator > &pipeline, boost::shared_ptr< DataAtIntegrationPts > data_ptr)
@ CURRENT
Current state of the field.
@ PREVIOUS
Previous state of the field.
virtual UserDataOperator * returnOpJacobian(const bool eval_rhs, const bool eval_lhs, boost::shared_ptr< DataAtIntegrationPts > data_ptr, boost::shared_ptr< PhysicalEquations > physics_ptr)
virtual VolUserDataOperator * returnOpSpatialPhysical(const std::string &field_name, boost::shared_ptr< DataAtIntegrationPts > data_ptr, const double alpha_u)
virtual VolUserDataOperator * returnOpSpatialPhysicalExternalStrain(const std::string &field_name, boost::shared_ptr< DataAtIntegrationPts > data_ptr, boost::shared_ptr< ExternalStrainVec > external_strain_vec_ptr, std::map< std::string, boost::shared_ptr< ScalingMethod > > smv)
virtual VolUserDataOperator * returnOpCalculateHelmholtzFreeEnergy(boost::shared_ptr< DataAtIntegrationPts > data_ptr, boost::shared_ptr< double > total_helmholtz_free_energy_ptr)
const Features & getFeatures() const
static MoFEMErrorCode create(EshelbianCore &ep)
Select and configure the material before registering fields and DMs.
virtual MoFEMErrorCode pushAuxiliaryLogarithmicStressOps(const EshelbianCore &ep, boost::ptr_deque< UserDataOperator > &pipeline, boost::shared_ptr< DataAtIntegrationPts > data_ptr, bool lhs)
Assemble the selected material field group after kinematic reconstruction.
MoFEMErrorCode pushMaterialTangent(const EshelbianCore &ep, boost::ptr_deque< UserDataOperator > &pipeline, boost::shared_ptr< DataAtIntegrationPts > data_ptr)
std::bitset< LAST_FEATURE > Features
MoFEMErrorCode pushSkeletonEvaluation(const EshelbianCore &ep, VolumeElementForcesAndSourcesCoreOnSide &fe, boost::shared_ptr< DataAtIntegrationPts > data_ptr, SmartPetscObj< Vec > residual, MaterialPostProcData &output)
MoFEMErrorCode pushMaterialForceFields(const EshelbianCore &ep, boost::ptr_deque< UserDataOperator > &pipeline, boost::shared_ptr< DataAtIntegrationPts > data_ptr)
std::vector< std::string > getMaterialFields(const EshelbianCore &ep) const
Active material unknowns used by the element, DMs and field split.
virtual bool providesHelmholtzFreeEnergy() const
virtual VolUserDataOperator * returnOpTopoSpatialPhysical(const std::string &field_name, boost::shared_ptr< DataAtIntegrationPts > data_ptr, SmartPetscObj< Vec > assemble_vec, boost::shared_ptr< TopologicalData > topo_ptr, const double alpha_u, boost::shared_ptr< double > J_ptr)
@ NO_STRETCH_LINEAR
No-stretch linear formulation.
@ DIRECT_STRETCH
Direct stretch formulation.
@ AUXILIARY_LOGARITHMIC_STRESS
Auxiliary logarithmic stress formulation.
@ NON_HOMOGENEOUS_MATERIAL
virtual MoFEMErrorCode pushAuxiliaryLogarithmicMaterialEvaluation(const EshelbianCore &ep, boost::ptr_deque< UserDataOperator > &pipeline, boost::shared_ptr< DataAtIntegrationPts > data_ptr, bool lhs=false)
Evaluate the auxiliary material copy and energies without assembly.
virtual VolUserDataOperator * returnOpCalculateStretchFromStress(boost::shared_ptr< DataAtIntegrationPts > data_ptr, boost::shared_ptr< PhysicalEquations > physics_ptr, boost::shared_ptr< MatrixDouble > strain_ptr=nullptr)
static MoFEMErrorCode checkOptions(const EshelbianCore &ep, MaterialModel material_model, Features features)
std::vector< std::pair< std::string, std::string > > getMaterialCouplings(const EshelbianCore &ep) const
Material-dependent blocks; each pair also represents its transpose.
virtual VolUserDataOperator * returnOpSpatialPhysical_du_du(std::string row_field, std::string col_field, boost::shared_ptr< DataAtIntegrationPts > data_ptr, const double alpha)
MoFEMErrorCode pushStretchFromStress(const EshelbianCore &ep, boost::ptr_deque< UserDataOperator > &pipeline, boost::shared_ptr< DataAtIntegrationPts > data_ptr, boost::shared_ptr< MatrixDouble > strain_ptr=nullptr, boost::shared_ptr< MatrixDouble > stress_ptr=nullptr)
MoFEMErrorCode pushPostProc(const EshelbianCore &ep, boost::ptr_deque< UserDataOperator > &pipeline, boost::shared_ptr< DataAtIntegrationPts > data_ptr, MaterialPostProcData &output)
MoFEMErrorCode pushMaterialVariation(const EshelbianCore &ep, boost::ptr_deque< UserDataOperator > &pipeline, boost::shared_ptr< DataAtIntegrationPts > data_ptr, SmartPetscObj< Vec > variation, MaterialPostProcData *output=nullptr)
virtual moab::Interface & get_moab()=0
virtual MPI_Comm & get_comm() const =0
Data on single entity (This is passed as argument to DataOperator::doWork)
@ OPSPACE
operator do Work is execute on space data
MatrixDouble & getGaussPts()
matrix of integration (Gauss) points for Volume Element
auto & getUserPolynomialBase()
Get the User Polynomial Base object.
boost::ptr_deque< UserDataOperator > & getOpPtrVector()
Use to push back operator for row operator.
Interface for managing meshsets containing materials and boundary conditions.
Calculate tenor field using tensor base, i.e. Hdiv/Hcurl.
Calculate tenor field using vectorial base, i.e. Hdiv/Hcurl.
Calculate symmetric tensor field rates ant integratio pts.
Calculate symmetric tensor field values at integration pts.
Get field gradients time derivative at integration pts for scalar field rank 0, i....
Get field gradients at integration pts for scalar field rank 0, i.e. vector field.
Specialization for MatrixDouble vector field values calculation.
intrusive_ptr for managing petsc objects
std::function< double(double)> ScalingFun
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
Base volume element used to integrate on skeleton.