https://mooseframework.inl.gov
Public Types | Public Member Functions | Static Public Member Functions | Public Attributes | Static Public Attributes | Protected Member Functions | Protected 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 haveParameter (const std::string &name) 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
 

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> *>(
34  _fe_problem.getNonlinearSystem(/*nl_sys_num=*/0).nonlinearSolver());
35  if (!_solver)
36  mooseError(
37  "This line search operates only with Petsc, so Petsc must be your nonlinear solver.");
38 }
virtual libMesh::NonlinearSolver< Number > * nonlinearSolver() override
const InputParameters & parameters() const
FEProblem & _fe_problem
NonlinearSystemBase & getNonlinearSystemBase(const unsigned int sys_num)
PetscNonlinearSolver< Real > * _solver
void mooseError(Args &&... args) const
virtual NonlinearSystem & getNonlinearSystem(const unsigned int nl_sys_num) override
LineSearch(const InputParameters &parameters)

Member Function Documentation

◆ initialSetup()

void PetscProjectSolutionOntoBounds::initialSetup ( )
overridevirtual

Reimplemented from LineSearch.

Definition at line 41 of file PetscProjectSolutionOntoBounds.C.

42 {
44  if (!_displaced_problem)
45  mooseError("This line search only makes sense in a displaced context");
46 }
FEProblem & _fe_problem
virtual std::shared_ptr< const DisplacedProblem > getDisplacedProblem() const
void mooseError(Args &&... args) 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 }
virtual MooseMesh & mesh() override
SNES snes(const char *name=nullptr)
virtual GeometricSearchData & geomSearchData() override
static const std::string component
Definition: NS.h:157
MeshBase & mesh
const Parallel::Communicator & comm() const
void setSolution(const NumericVector< Number > &soln)
static const std::string F
Definition: NS.h:169
unsigned int variable_number(std::string_view var) const
static const std::string G
Definition: NS.h:170
MeshBase & getMesh()
PetscNonlinearSolver< Real > * _solver
const std::vector< std::string > & getDisplacementVarNames() const
const std::map< std::pair< BoundaryID, BoundaryID >, PenetrationLocator *> & getPenetrationLocators() const
virtual void updateMesh(bool mesh_changing=false)
processor_id_type processor_id() const
virtual libMesh::System & system() override

◆ validParams()

InputParameters PetscProjectSolutionOntoBounds::validParams ( )
static

Definition at line 25 of file PetscProjectSolutionOntoBounds.C.

26 {
27  return LineSearch::validParams();
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: