18 for (
const auto &[field,
scale] : problem.getControlFieldScales()) {
21 field.c_str(), &raw_is);
27 "Gradient fixture requires both control fields");
30 const auto error = VecSet(block, norm / (
scale * std::sqrt(
double(
size))));
44 PetscScalar *
values =
nullptr;
46 for (
const auto &dof : *problem->getNumeredRowDofsPtr()) {
47 const auto index = dof->getPetscLocalDofIdx();
49 values[index] = dof->getEntDofIdx() == 0 ? std::log(
slack) : 0.;
52 CHKERR VecGhostUpdateBegin(control, INSERT_VALUES, SCATTER_FORWARD);
53 CHKERR VecGhostUpdateEnd(control, INSERT_VALUES, SCATTER_FORWARD);
66 constexpr double tolerance = 1.e-3;
68 std::string diagnostics;
71 if (std::abs(norm - std::sqrt(2.) * 0.6 * tolerance) > 1.e-12 * tolerance)
73 "Joint gradient norm has incorrect scaling or MPI ownership");
75 tolerance, diagnostics);
78 CHKERR PetscPushErrorHandler(PetscReturnErrorHandler,
nullptr);
79 const auto rejection = problem.validateSolution(
81 CHKERR PetscPopErrorHandler();
84 "Unresolved joint gradient was accepted");
86 double slack_tolerance = 0;
88 nullptr,
nullptr,
"-incremental_optimization_plastic_slack_tolerance",
89 &slack_tolerance,
nullptr);
90 const double factor = std::max(1., problem.getIsotropicHardeningModulus() /
91 problem.getInitialYieldStress());
92 bool converged =
false;
94 0.5 * slack_tolerance / factor);
95 CHKERR problem.assessProximalConvergence(
context->candidateControl, converged,
99 "Resolved physical slack was rejected");
100 CHKERR setSlack(ep,
context->candidateControl, 2. * slack_tolerance / factor);
101 CHKERR problem.assessProximalConvergence(
context->candidateControl, converged,
105 "Unresolved strain/hardening slack was accepted");
107 "Joint gradient and combined slack acceptance verified\n");
113static char help[] =
"Verify the two plastic acceptance criteria.\n";
115int main(
int argc,
char *argv[]) {
117 auto core_log = logging::core::get();
Shared mesh and problem setup for auxiliary formulation atoms.
boost::shared_ptr< IncrementalOptimizationContext > context
VectorDouble slack
exp(psi)
Plasticity implementation of incremental optimization.
SmartPetscObj< Vec > gradient
SmartPetscObj< Vec > values
#define CATCH_ERRORS
Catch errors.
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_ATOM_TEST_INVALID
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
PetscErrorCode DMMoFEMGetProblemPtr(DM dm, const MoFEM::Problem **problem_ptr)
Get pointer to problem data structure.
PetscErrorCode DMMoFEMGetFieldIS(DM dm, RowColData rc, const char field_name[], IS *is)
get field is in the problem
auto createDMVector(DM dm, RowColData rc=RowColData::COL)
Get smart vector from DM.
static LoggerType & setLog(const std::string channel)
Set ans resset chanel logger.
const FTensor::Tensor2< T, Dim, Dim > Vec
MoFEMErrorCode runAuxiliaryLogarithmicStressTest(const std::function< MoFEMErrorCode(EshelbianCore &)> &test)
boost::shared_ptr< IncrementalOptimizationContext > createPlasticIncrementalOptimizationContext(EshelbianCore &ep, SmartPetscObj< TS > ts, SmartPetscObj< Vec > state)
PlasticIncrementalOptimizationProblem & getPlasticIncrementalOptimizationProblem(const boost::shared_ptr< IncrementalOptimizationContext > &context)
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
implementation of Data Operators for Forces and Sources
PetscErrorCode PetscOptionsGetReal(PetscOptions *, const char pre[], const char name[], PetscReal *dval, PetscBool *set)
SmartPetscObj< Vec > vectorDuplicate(Vec vec)
Create duplicate vector of smart vector.
auto createTS(MPI_Comm comm)
MoFEM::Interface & mField
SmartPetscObj< DM > dmElastic
Elastic problem.
SmartPetscObj< DM > dmIncrementalOptimization
const std::string plasticLatentField
DM getControlDM() const override
virtual MPI_Comm & get_comm() const =0
static MoFEMErrorCode Initialize(int *argc, char ***args, const char file[], const char help[])
Initializes the MoFEM database PETSc, MOAB and MPI.
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
static boost::shared_ptr< SinkType > createSink(boost::shared_ptr< std::ostream > stream_ptr, std::string comm_filter)
Create a sink object.
static boost::shared_ptr< std::ostream > getStrmWorld()
Get the strm world object.
static boost::shared_ptr< std::ostream > getStrmSync()
Get the strm sync object.
static boost::shared_ptr< std::ostream > getStrmSelf()
Get the strm self object.
keeps basic data about problem
intrusive_ptr for managing petsc objects