https://mooseframework.inl.gov
Loading...
Searching...
No Matches
Public Types | Public Member Functions | Static Public Member Functions | Public Attributes | Static Public Attributes | Protected Member Functions | Protected Attributes | Static Private Member Functions | Private Attributes | List of all members
PetscProjectSolutionOntoBounds Class Reference

Petsc implementation of the contact line search (based on the Petsc LineSearchShell) More...

#include <PetscProjectSolutionOntoBounds.h>

Inheritance diagram for PetscProjectSolutionOntoBounds:
[legend]

Public Types

typedef DataFileName DataFileParameterType
 

Public Member Functions

 PetscProjectSolutionOntoBounds (const InputParameters &parameters)
 
void initialSetup () override
 
virtual void lineSearch () override
 
void zeroIts ()
 
size_t nlIts () const
 
virtual void timestepSetup ()
 
virtual void customSetup (const ExecFlagType &)
 
virtual bool enabled () const
 
std::shared_ptr< MooseObjectgetSharedPtr ()
 
std::shared_ptr< const MooseObjectgetSharedPtr () const
 
bool isKokkosObject () const
 
MooseAppgetMooseApp () const
 
const std::string & type () const
 
const std::string & name () const
 
std::string typeAndName () const
 
MooseObjectParameterName uniqueParameterName (const std::string &parameter_name) const
 
MooseObjectName uniqueName () const
 
const InputParametersparameters () const
 
const hit::Node * getHitNode () const
 
bool hasBase () const
 
const std::string & getBase () const
 
const TgetParam (const std::string &name) const
 
std::vector< std::pair< T1, T2 > > getParam (const std::string &param1, const std::string &param2) const
 
const TqueryParam (const std::string &name) const
 
const TgetRenamedParam (const std::string &old_name, const std::string &new_name) const
 
T getCheckedPointerParam (const std::string &name, const std::string &error_string="") const
 
bool isParamValid (const std::string &name) const
 
bool isParamSetByUser (const std::string &name) const
 
void connectControllableParams (const std::string &parameter, const std::string &object_type, const std::string &object_name, const std::string &object_parameter) const
 
void paramError (const std::string &param, Args... args) const
 
void paramWarning (const std::string &param, Args... args) const
 
void paramWarning (const std::string &param, Args... args) const
 
void paramInfo (const std::string &param, Args... args) const
 
std::string messagePrefix (const bool hit_prefix=true) const
 
std::string errorPrefix (const std::string &) const
 
void mooseError (Args &&... args) const
 
void mooseDocumentedError (const std::string &repo_name, const unsigned int issue_num, Args &&... args) const
 
void mooseErrorNonPrefixed (Args &&... args) const
 
void mooseWarning (Args &&... args) const
 
void mooseWarning (Args &&... args) const
 
void mooseWarningNonPrefixed (Args &&... args) const
 
void mooseWarningNonPrefixed (Args &&... args) const
 
void mooseDeprecated (Args &&... args) const
 
void mooseDeprecated (Args &&... args) const
 
void mooseDeprecatedNoTrace (Args &&... args) const
 
void mooseInfo (Args &&... args) const
 
void callMooseError (std::string msg, const bool with_prefix, const hit::Node *node=nullptr, const bool show_trace=true) const
 
std::string getDataFileName (const std::string &param) const
 
std::string getDataFileNameByName (const std::string &relative_path) const
 
std::string getDataFilePath (const std::string &relative_path) const
 
const Parallel::Communicator & comm () const
 
processor_id_type n_processors () const
 
processor_id_type processor_id () const
 

Static Public Member Functions

static InputParameters validParams ()
 
static void callMooseError (MooseApp *const app, const InputParameters &params, std::string msg, const bool with_prefix, const hit::Node *node, const bool show_trace=true)
 

Public Attributes

 usingCombinedWarningSolutionWarnings
 
const ConsoleStream _console
 

Static Public Attributes

static const std::string type_param
 
static const std::string name_param
 
static const std::string unique_name_param
 
static const std::string app_param
 
static const std::string moose_base_param
 
static const std::string kokkos_object_param
 

Protected Member Functions

void flagInvalidSolutionInternal (const InvalidSolutionID invalid_solution_id) const
 
InvalidSolutionID registerInvalidSolutionInternal (const std::string &message, const bool warning) const
 

Protected Attributes

NonlinearSystemBase_nl
 
PetscNonlinearSolver< Real > * _solver
 
DisplacedProblem_displaced_problem
 
const GeometricSearchData_geometric_search_data
 
const std::map< std::pair< unsigned int, unsigned int >, PenetrationLocator * > * _pentration_locators
 
FEProblem_fe_problem
 
size_t _nl_its
 
const bool & _enabled
 
MooseApp_app
 
Factory_factory
 
ActionFactory_action_factory
 
const std::string & _type
 
const std::string & _name
 
const InputParameters_pars
 
const Parallel::Communicator & _communicator
 

Static Private Member Functions

static const hit::Node * getHitNode (const InputParameters &params)
 
static std::string messagePrefix (const InputParameters &params, const bool hit_prefix)
 

Private Attributes

const ParallelParamObject_parent
 
const MooseBase_si_moose_base
 
const FEProblemBase_si_problem
 

Detailed Description

Petsc implementation of the contact line search (based on the Petsc LineSearchShell)

Definition at line 35 of file PetscProjectSolutionOntoBounds.h.

Constructor & Destructor Documentation

◆ PetscProjectSolutionOntoBounds()

PetscProjectSolutionOntoBounds::PetscProjectSolutionOntoBounds ( const InputParameters parameters)

Definition at line 30 of file PetscProjectSolutionOntoBounds.C.

32{
33 _solver = dynamic_cast<PetscNonlinearSolver<Real> *>(
35 if (!_solver)
37 "This line search operates only with Petsc, so Petsc must be your nonlinear solver.");
38}
NonlinearSystemBase & getNonlinearSystemBase(const unsigned int sys_num)
virtual NonlinearSystem & getNonlinearSystem(const unsigned int nl_sys_num) override
FEProblem & _fe_problem
const InputParameters & parameters() const
void mooseError(Args &&... args) const
virtual libMesh::NonlinearSolver< Number > * nonlinearSolver() override

Member Function Documentation

◆ initialSetup()

void PetscProjectSolutionOntoBounds::initialSetup ( )
overridevirtual

Reimplemented from LineSearch.

Definition at line 41 of file PetscProjectSolutionOntoBounds.C.

42{
45 mooseError("This line search only makes sense in a displaced context");
46}
virtual std::shared_ptr< const DisplacedProblem > getDisplacedProblem() const

◆ lineSearch()

void PetscProjectSolutionOntoBounds::lineSearch ( )
overridevirtual

Reimplemented from LineSearch.

Definition at line 49 of file PetscProjectSolutionOntoBounds.C.

50{
51 PetscBool changed_y = PETSC_FALSE;
52 Vec X, F, Y, W, G;
53 SNESLineSearch line_search;
54 PetscReal fnorm, xnorm, ynorm;
55 SNES snes = _solver->snes();
56
57 LibmeshPetscCall(SNESGetLineSearch(snes, &line_search));
58 LibmeshPetscCall(SNESLineSearchGetVecs(line_search, &X, &F, &Y, &W, &G));
59 LibmeshPetscCall(SNESLineSearchGetNorms(line_search, &xnorm, &fnorm, &ynorm));
60 LibmeshPetscCall(SNESLineSearchSetReason(line_search, SNES_LINESEARCH_SUCCEEDED));
61
62 LibmeshPetscCall(SNESLineSearchPreCheck(line_search, X, Y, &changed_y));
63
64 // apply the full newton step
65 LibmeshPetscCall(VecWAXPY(W, -1., Y, X));
66
67 {
68 PetscVector<Number> solution(W, this->comm());
69
70 _nl.setSolution(solution);
71
72 // Displace the mesh and update the displaced geometric search objects
74 }
75
76 // A reference to the displaced MeshBase object
77 const auto & mesh = _displaced_problem->mesh().getMesh();
78
79 const auto & pen_locs = _displaced_problem->geomSearchData().getPenetrationLocators();
80
81 // Keep track of the secondary nodes that we push back onto the primary face. We'll eventually
82 // check to make sure that we didn't have a corner node at the intersection of two secondary faces
83 // that we tried to displace twice. As this stands now this won't cover the case wherethe
84 // intersection happens only across processes
85 std::set<dof_id_type> nodes_displaced;
86
87 std::vector<unsigned int> disp_nums;
88
89 // Generate the displaced variable numbers
90 for (const auto & disp_name : _displaced_problem->getDisplacementVarNames())
91 disp_nums.push_back(_nl.system().variable_number(disp_name));
92
93 for (const auto & pen_loc : pen_locs)
94 for (const auto & pinfo_pair : pen_loc.second->_penetration_info)
95 {
96 auto node_id = pinfo_pair.first;
97 auto pen_info = pinfo_pair.second;
98
99 // We have penetration
100 if (pen_info && pen_info->_distance > 0)
101 {
102// Avoid warning in optimized modes about unused variables
103#ifndef NDEBUG
104 // Make sure we haven't done this node before
105 auto pair = nodes_displaced.insert(node_id);
106 mooseAssert(pair.second, "Node id " << node_id << " has already been displaced");
107#endif
108
109 const auto & node = mesh.node_ref(node_id);
110
111 // If this is not a local node, we will let displacement happen on another process
112 if (node.processor_id() != this->processor_id())
113 continue;
114
115 // The vector that we need to displace by
116 auto required_solution_change = pen_info->_distance * pen_info->_normal;
117
118 unsigned component = 0;
119 std::vector<PetscInt> indices;
120 std::vector<PetscScalar> values;
121 for (auto disp_num : disp_nums)
122 {
123 auto dof_number = node.dof_number(/*sys=*/0, disp_num, /*component=*/0);
124 indices.push_back(static_cast<PetscInt>(dof_number));
125 values.push_back(static_cast<PetscScalar>(required_solution_change(component++)));
126 }
127 LibmeshPetscCall(VecSetValues(
128 W, static_cast<PetscInt>(indices.size()), indices.data(), values.data(), ADD_VALUES));
129 }
130 }
131
132 LibmeshPetscCall(VecAssemblyBegin(W));
133 LibmeshPetscCall(VecAssemblyEnd(W));
134
135 LibmeshPetscCall(SNESComputeFunction(snes, W, F));
136#if PETSC_VERSION_LESS_THAN(3, 25, 0)
137 PetscBool domainerror;
138 LibmeshPetscCall(SNESGetFunctionDomainError(snes, &domainerror));
139 if (domainerror)
140 LibmeshPetscCall(SNESLineSearchSetReason(line_search, SNES_LINESEARCH_FAILED_DOMAIN));
141#else
142 SNESConvergedReason reason;
143 LibmeshPetscCall(SNESGetConvergedReason(snes, &reason));
144 if (reason == SNES_DIVERGED_FUNCTION_DOMAIN)
145 LibmeshPetscCall(SNESLineSearchSetReason(line_search, SNES_LINESEARCH_FAILED_FUNCTION_DOMAIN));
146#endif
147
148 LibmeshPetscCall(VecNorm(F, NORM_2, &fnorm));
149
150 LibmeshPetscCall(VecCopy(W, X));
151
152 LibmeshPetscCall(SNESLineSearchComputeNorms(line_search));
153}
std::array< Real, 2 > values
for(PetscInt i=0;i< nvars;++i)
virtual GeometricSearchData & geomSearchData() override
virtual void updateMesh(bool mesh_changing=false)
virtual MooseMesh & mesh() override
const std::map< std::pair< BoundaryID, BoundaryID >, PenetrationLocator * > & getPenetrationLocators() const
MeshBase & getMesh()
void setSolution(const NumericVector< Number > &soln)
const Parallel::Communicator & comm() const
SNES snes(const char *name=nullptr)
MeshBase & mesh
T component(const RankTwoTensorTempl< T > &r2tensor, unsigned int i, unsigned int j)
template class LIBMESH_EXPORT PetscVector< Number >

◆ validParams()

InputParameters PetscProjectSolutionOntoBounds::validParams ( )
static

Definition at line 25 of file PetscProjectSolutionOntoBounds.C.

26{
28}
static InputParameters validParams()

Member Data Documentation

◆ _displaced_problem

DisplacedProblem* PetscProjectSolutionOntoBounds::_displaced_problem
protected

Definition at line 48 of file PetscProjectSolutionOntoBounds.h.

Referenced by initialSetup(), and lineSearch().

◆ _geometric_search_data

const GeometricSearchData* PetscProjectSolutionOntoBounds::_geometric_search_data
protected

Definition at line 49 of file PetscProjectSolutionOntoBounds.h.

◆ _nl

NonlinearSystemBase& PetscProjectSolutionOntoBounds::_nl
protected

Definition at line 46 of file PetscProjectSolutionOntoBounds.h.

Referenced by lineSearch().

◆ _pentration_locators

const std::map<std::pair<unsigned int, unsigned int>, PenetrationLocator *>* PetscProjectSolutionOntoBounds::_pentration_locators
protected

Definition at line 51 of file PetscProjectSolutionOntoBounds.h.

◆ _solver

PetscNonlinearSolver<Real>* PetscProjectSolutionOntoBounds::_solver
protected

Definition at line 47 of file PetscProjectSolutionOntoBounds.h.

Referenced by lineSearch(), and PetscProjectSolutionOntoBounds().


The documentation for this class was generated from the following files: