https://mooseframework.inl.gov
Public Types | Public Member Functions | Static Public Member Functions | Public Attributes | 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
 
MooseAppgetMooseApp () const
 
const std::string & type () const
 
virtual const std::string & name () const
 
std::string typeAndName () const
 
std::string errorPrefix (const std::string &error_type) const
 
void callMooseError (std::string msg, const bool with_prefix) const
 
MooseObjectParameterName uniqueParameterName (const std::string &parameter_name) const
 
const InputParametersparameters () const
 
MooseObjectName uniqueName () const
 
const T & getParam (const std::string &name) const
 
std::vector< std::pair< T1, T2 > > getParam (const std::string &param1, const std::string &param2) const
 
const T * queryParam (const std::string &name) const
 
const T & getRenamedParam (const std::string &old_name, const std::string &new_name) const
 
getCheckedPointerParam (const std::string &name, const std::string &error_string="") const
 
bool isParamValid (const std::string &name) const
 
bool isParamSetByUser (const std::string &nm) const
 
void paramError (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
 
void connectControllableParams (const std::string &parameter, const std::string &object_type, const std::string &object_name, const std::string &object_parameter) const
 
void mooseError (Args &&... args) const
 
void mooseErrorNonPrefixed (Args &&... args) const
 
void mooseDocumentedError (const std::string &repo_name, const unsigned int issue_num, Args &&... args) const
 
void mooseWarning (Args &&... args) const
 
void mooseWarningNonPrefixed (Args &&... args) const
 
void mooseDeprecated (Args &&... args) const
 
void mooseInfo (Args &&... args) 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 ()
 

Public Attributes

const ConsoleStream _console
 

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