PolyFEM
Loading...
Searching...
No Matches
polyfem::solver::BCLagrangianForm Class Reference

Form of the augmented lagrangian for bc constraints. More...

#include <BCLagrangianForm.hpp>

Inheritance diagram for polyfem::solver::BCLagrangianForm:
[legend]
Collaboration diagram for polyfem::solver::BCLagrangianForm:
[legend]

Public Member Functions

 BCLagrangianForm (const int ndof, const std::vector< int > &boundary_nodes, const std::vector< mesh::LocalBoundary > &local_boundary, const std::vector< mesh::LocalBoundary > &local_neumann_boundary, const int n_boundary_samples, const StiffnessMatrix &mass, const assembler::RhsAssembler &rhs_assembler, const size_t obstacle_ndof, const bool is_time_dependent, const double t, const std::shared_ptr< utils::PeriodicBoundary > &periodic_bc=nullptr)
 Construct a new BCLagrangianForm object with a time dependent Dirichlet boundary.
 
std::string name () const override
 
 BCLagrangianForm (const int ndof, const std::vector< int > &boundary_nodes, const StiffnessMatrix &mass, const size_t obstacle_ndof, const Eigen::MatrixXd &target_x)
 Construct a new BCLagrangianForm object with a fixed Dirichlet boundary.
 
double value_unweighted (const Eigen::VectorXd &x) const override
 Compute the value of the form.
 
void first_derivative_unweighted (const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override
 Compute the first derivative of the value wrt x.
 
void second_derivative_unweighted (const Eigen::VectorXd &x, StiffnessMatrix &hessian) const override
 Compute the second derivative of the value wrt x.
 
void update_quantities (const double t, const Eigen::VectorXd &x) override
 Update time dependent quantities.
 
void update_lagrangian (const Eigen::VectorXd &x, const double k_al) override
 
StiffnessMatrixmask ()
 
const StiffnessMatrixmask () const
 
Eigen::VectorXd target (const Eigen::VectorXd &) const override
 
double compute_error (const Eigen::VectorXd &x) const override
 
- Public Member Functions inherited from polyfem::solver::AugmentedLagrangianForm
 AugmentedLagrangianForm (const std::vector< int > &constraint_nodes)
 
virtual ~AugmentedLagrangianForm ()
 
void set_initial_weight (const double k_al)
 
const std::vector< int > & constraint_nodes () const
 
- Public Member Functions inherited from polyfem::solver::Form
virtual ~Form ()
 
virtual void init (const Eigen::VectorXd &x)
 Initialize the form.
 
virtual void finish ()
 
virtual double value (const Eigen::VectorXd &x) const
 Compute the value of the form multiplied with the weigth.
 
Eigen::VectorXd value_per_element (const Eigen::VectorXd &x) const
 Compute the value of the form multiplied with the weigth.
 
virtual void first_derivative (const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const
 Compute the first derivative of the value wrt x multiplied with the weigth.
 
void second_derivative (const Eigen::VectorXd &x, StiffnessMatrix &hessian) const
 Compute the second derivative of the value wrt x multiplied with the weigth.
 
virtual bool is_step_valid (const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const
 Determine if a step from solution x0 to solution x1 is allowed.
 
virtual double max_step_size (const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const
 Determine the maximum step size allowable between the current and next solution.
 
virtual void line_search_begin (const Eigen::VectorXd &x0, const Eigen::VectorXd &x1)
 Initialize variables used during the line search.
 
virtual void line_search_end ()
 Clear variables used during the line search.
 
virtual void post_step (const polysolve::nonlinear::PostStepData &data)
 Update fields after a step in the optimization.
 
virtual void solution_changed (const Eigen::VectorXd &new_x)
 Update cached fields upon a change in the solution.
 
virtual void init_lagging (const Eigen::VectorXd &x)
 Initialize lagged fields TODO: more than one step.
 
virtual void update_lagging (const Eigen::VectorXd &x, const int iter_num)
 Update lagged fields.
 
virtual int max_lagging_iterations () const
 Get the maximum number of lagging iteration allowable.
 
virtual bool uses_lagging () const
 Does this form require lagging?
 
void set_project_to_psd (bool val)
 Set project to psd.
 
bool is_project_to_psd () const
 Get if the form's second derivative is projected to psd.
 
void enable ()
 Enable the form.
 
void disable ()
 Disable the form.
 
void set_enabled (const bool enabled)
 Set if the form is enabled.
 
bool enabled () const
 Determine if the form is enabled.
 
virtual double weight () const
 Get the form's multiplicative constant weight.
 
void set_weight (const double weight)
 Set the form's multiplicative constant weight.
 
virtual bool is_step_collision_free (const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const
 Checks if the step is collision free.
 
void set_output_dir (const std::string &output_dir)
 

Private Member Functions

void init_masked_lumped_mass (const int ndof, const StiffnessMatrix &mass, const size_t obstacle_ndof)
 Initialize the masked lumped mass matrix.
 
void update_target (const double t)
 Update target x to the Dirichlet boundary values at time t.
 

Private Attributes

const std::vector< int > & boundary_nodes_
 
const std::vector< mesh::LocalBoundary > * local_boundary_
 
const std::vector< mesh::LocalBoundary > * local_neumann_boundary_
 
const int n_boundary_samples_
 
const assembler::RhsAssemblerrhs_assembler_
 Reference to the RHS assembler.
 
const bool is_time_dependent_
 
StiffnessMatrix masked_lumped_mass_sqrt_
 sqrt mass matrix masked by the AL dofs
 
StiffnessMatrix masked_lumped_mass_
 mass matrix masked by the AL dofs
 
StiffnessMatrix mask_
 identity matrix masked by the AL dofs
 
Eigen::MatrixXd target_x_
 actually a vector with the same size as x with target nodal positions
 

Additional Inherited Members

- Protected Member Functions inherited from polyfem::solver::Form
std::string resolve_output_path (const std::string &path) const
 
virtual Eigen::VectorXd value_per_element_unweighted (const Eigen::VectorXd &x) const
 Compute the value of the form multiplied per element.
 
- Protected Attributes inherited from polyfem::solver::AugmentedLagrangianForm
Eigen::VectorXd lagr_mults_
 vector of lagrange multipliers
 
double k_al_
 penalty parameter
 
const std::vector< int > constraint_nodes_
 constraint nodes
 
- Protected Attributes inherited from polyfem::solver::Form
bool project_to_psd_ = false
 If true, the form's second derivative is projected to be positive semidefinite.
 
double weight_ = 1
 weight of the form (e.g., AL penalty weight or Δt²)
 
bool enabled_ = true
 If true, the form is enabled.
 
std::string output_dir_
 

Detailed Description

Form of the augmented lagrangian for bc constraints.

Definition at line 17 of file BCLagrangianForm.hpp.

Constructor & Destructor Documentation

◆ BCLagrangianForm() [1/2]

polyfem::solver::BCLagrangianForm::BCLagrangianForm ( const int  ndof,
const std::vector< int > &  boundary_nodes,
const std::vector< mesh::LocalBoundary > &  local_boundary,
const std::vector< mesh::LocalBoundary > &  local_neumann_boundary,
const int  n_boundary_samples,
const StiffnessMatrix mass,
const assembler::RhsAssembler rhs_assembler,
const size_t  obstacle_ndof,
const bool  is_time_dependent,
const double  t,
const std::shared_ptr< utils::PeriodicBoundary > &  periodic_bc = nullptr 
)

Construct a new BCLagrangianForm object with a time dependent Dirichlet boundary.

Parameters
ndofNumber of degrees of freedom
boundary_nodesDoFs that are part of the Dirichlet boundary
local_boundary
local_neumann_boundary
n_boundary_samples
massMass matrix
rhs_assemblerRight hand side assembler
obstacle_ndofObstacle's number of DOF
is_time_dependentWhether the problem is time dependent
tCurrent time
periodic_bcPeriodic boundary conditions

Definition at line 8 of file BCLagrangianForm.cpp.

References init_masked_lumped_mass(), and update_target().

Here is the call graph for this function:

◆ BCLagrangianForm() [2/2]

polyfem::solver::BCLagrangianForm::BCLagrangianForm ( const int  ndof,
const std::vector< int > &  boundary_nodes,
const StiffnessMatrix mass,
const size_t  obstacle_ndof,
const Eigen::MatrixXd &  target_x 
)

Construct a new BCLagrangianForm object with a fixed Dirichlet boundary.

Parameters
ndofNumber of degrees of freedom
boundary_nodesDoFs that are part of the Dirichlet boundary
massMass matrix
obstacle_ndofObstacle's number of DOF
target_xTarget values for the boundary DoFs

Definition at line 31 of file BCLagrangianForm.cpp.

References init_masked_lumped_mass().

Here is the call graph for this function:

Member Function Documentation

◆ compute_error()

double polyfem::solver::BCLagrangianForm::compute_error ( const Eigen::VectorXd &  x) const
overridevirtual

Implements polyfem::solver::AugmentedLagrangianForm.

Definition at line 148 of file BCLagrangianForm.cpp.

References mask(), target(), and x.

Here is the call graph for this function:

◆ first_derivative_unweighted()

void polyfem::solver::BCLagrangianForm::first_derivative_unweighted ( const Eigen::VectorXd &  x,
Eigen::VectorXd &  gradv 
) const
overridevirtual

Compute the first derivative of the value wrt x.

Parameters
[in]xCurrent solution
[out]gradvOutput gradient of the value wrt x

Implements polyfem::solver::Form.

Definition at line 132 of file BCLagrangianForm.cpp.

References polyfem::solver::AugmentedLagrangianForm::k_al_, polyfem::solver::AugmentedLagrangianForm::lagr_mults_, masked_lumped_mass_, masked_lumped_mass_sqrt_, target_x_, and x.

◆ init_masked_lumped_mass()

void polyfem::solver::BCLagrangianForm::init_masked_lumped_mass ( const int  ndof,
const StiffnessMatrix mass,
const size_t  obstacle_ndof 
)
private

Initialize the masked lumped mass matrix.

Parameters
ndofNumber of degrees of freedom
massMass matrix
obstacle_ndofObstacle's number of DOF

Definition at line 48 of file BCLagrangianForm.cpp.

References boundary_nodes_, polyfem::solver::AugmentedLagrangianForm::lagr_mults_, polyfem::logger(), polyfem::utils::lump_matrix(), mask_, masked_lumped_mass_, masked_lumped_mass_sqrt_, polyfem::utils::sparse_identity(), and polyfem::solver::Form::value().

Referenced by BCLagrangianForm(), and BCLagrangianForm().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ mask() [1/2]

StiffnessMatrix & polyfem::solver::BCLagrangianForm::mask ( )
inline

Definition at line 84 of file BCLagrangianForm.hpp.

References mask_.

Referenced by compute_error().

Here is the caller graph for this function:

◆ mask() [2/2]

const StiffnessMatrix & polyfem::solver::BCLagrangianForm::mask ( ) const
inline

Definition at line 88 of file BCLagrangianForm.hpp.

References mask_.

◆ name()

std::string polyfem::solver::BCLagrangianForm::name ( ) const
inlineoverridevirtual

Implements polyfem::solver::Form.

Definition at line 44 of file BCLagrangianForm.hpp.

◆ second_derivative_unweighted()

void polyfem::solver::BCLagrangianForm::second_derivative_unweighted ( const Eigen::VectorXd &  x,
StiffnessMatrix hessian 
) const
overridevirtual

Compute the second derivative of the value wrt x.

Parameters
[in]xCurrent solution
[out]hessianOutput Hessian of the value wrt x

Implements polyfem::solver::Form.

Definition at line 137 of file BCLagrangianForm.cpp.

References polyfem::solver::AugmentedLagrangianForm::k_al_, and masked_lumped_mass_.

◆ target()

Eigen::VectorXd polyfem::solver::BCLagrangianForm::target ( const Eigen::VectorXd &  ) const
inlineoverridevirtual

Reimplemented from polyfem::solver::AugmentedLagrangianForm.

Definition at line 89 of file BCLagrangianForm.hpp.

References target_x_.

Referenced by compute_error().

Here is the caller graph for this function:

◆ update_lagrangian()

void polyfem::solver::BCLagrangianForm::update_lagrangian ( const Eigen::VectorXd &  x,
const double  k_al 
)
overridevirtual

◆ update_quantities()

void polyfem::solver::BCLagrangianForm::update_quantities ( const double  t,
const Eigen::VectorXd &  x 
)
overridevirtual

Update time dependent quantities.

Parameters
tNew time
xSolution at time t

Reimplemented from polyfem::solver::Form.

Definition at line 142 of file BCLagrangianForm.cpp.

References is_time_dependent_, and update_target().

Here is the call graph for this function:

◆ update_target()

void polyfem::solver::BCLagrangianForm::update_target ( const double  t)
private

Update target x to the Dirichlet boundary values at time t.

Parameters
tCurrent time

Definition at line 153 of file BCLagrangianForm.cpp.

References boundary_nodes_, local_boundary_, local_neumann_boundary_, masked_lumped_mass_sqrt_, n_boundary_samples_, rhs_assembler_, polyfem::assembler::RhsAssembler::set_bc(), and target_x_.

Referenced by BCLagrangianForm(), and update_quantities().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ value_unweighted()

double polyfem::solver::BCLagrangianForm::value_unweighted ( const Eigen::VectorXd &  x) const
overridevirtual

Compute the value of the form.

Parameters
xCurrent solution
Returns
Computed value

Implements polyfem::solver::Form.

Definition at line 123 of file BCLagrangianForm.cpp.

References polyfem::solver::AugmentedLagrangianForm::k_al_, polyfem::solver::AugmentedLagrangianForm::lagr_mults_, masked_lumped_mass_, masked_lumped_mass_sqrt_, target_x_, and x.

Member Data Documentation

◆ boundary_nodes_

const std::vector<int>& polyfem::solver::BCLagrangianForm::boundary_nodes_
private

Definition at line 94 of file BCLagrangianForm.hpp.

Referenced by init_masked_lumped_mass(), and update_target().

◆ is_time_dependent_

const bool polyfem::solver::BCLagrangianForm::is_time_dependent_
private

Definition at line 100 of file BCLagrangianForm.hpp.

Referenced by update_quantities().

◆ local_boundary_

const std::vector<mesh::LocalBoundary>* polyfem::solver::BCLagrangianForm::local_boundary_
private

Definition at line 95 of file BCLagrangianForm.hpp.

Referenced by update_target().

◆ local_neumann_boundary_

const std::vector<mesh::LocalBoundary>* polyfem::solver::BCLagrangianForm::local_neumann_boundary_
private

Definition at line 96 of file BCLagrangianForm.hpp.

Referenced by update_target().

◆ mask_

StiffnessMatrix polyfem::solver::BCLagrangianForm::mask_
private

identity matrix masked by the AL dofs

Definition at line 104 of file BCLagrangianForm.hpp.

Referenced by init_masked_lumped_mass(), mask(), and mask().

◆ masked_lumped_mass_

StiffnessMatrix polyfem::solver::BCLagrangianForm::masked_lumped_mass_
private

mass matrix masked by the AL dofs

Definition at line 103 of file BCLagrangianForm.hpp.

Referenced by first_derivative_unweighted(), init_masked_lumped_mass(), second_derivative_unweighted(), and value_unweighted().

◆ masked_lumped_mass_sqrt_

StiffnessMatrix polyfem::solver::BCLagrangianForm::masked_lumped_mass_sqrt_
private

sqrt mass matrix masked by the AL dofs

Definition at line 102 of file BCLagrangianForm.hpp.

Referenced by first_derivative_unweighted(), init_masked_lumped_mass(), update_lagrangian(), update_target(), and value_unweighted().

◆ n_boundary_samples_

const int polyfem::solver::BCLagrangianForm::n_boundary_samples_
private

Definition at line 97 of file BCLagrangianForm.hpp.

Referenced by update_target().

◆ rhs_assembler_

const assembler::RhsAssembler* polyfem::solver::BCLagrangianForm::rhs_assembler_
private

Reference to the RHS assembler.

Definition at line 99 of file BCLagrangianForm.hpp.

Referenced by update_target().

◆ target_x_

Eigen::MatrixXd polyfem::solver::BCLagrangianForm::target_x_
private

actually a vector with the same size as x with target nodal positions

Definition at line 106 of file BCLagrangianForm.hpp.

Referenced by first_derivative_unweighted(), target(), update_lagrangian(), update_target(), and value_unweighted().


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