Loading [MathJax]/extensions/tex2jax.js
PolyFEM
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
polyfem::solver::SmoothContactForm Class Reference

#include <SmoothContactForm.hpp>

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

Public Member Functions

 SmoothContactForm (const ipc::CollisionMesh &collision_mesh, const double dhat, const double avg_mass, const double alpha_t, const double alpha_n, const bool use_adaptive_dhat, const double min_distance_ratio, const bool use_adaptive_barrier_stiffness, const bool is_time_dependent, const bool enable_shape_derivatives, const ipc::BroadPhaseMethod broad_phase_method, const double ccd_tolerance, const int ccd_max_iterations)
 
virtual std::string name () const override
 
void update_barrier_stiffness (const Eigen::VectorXd &x, const Eigen::MatrixXd &grad_energy) override
 Update the barrier stiffness based on the current elasticity energy.
 
void force_shape_derivative (const ipc::SmoothCollisions &collision_set, const Eigen::MatrixXd &solution, const Eigen::VectorXd &adjoint_sol, Eigen::VectorXd &term) const
 
void post_step (const polysolve::nonlinear::PostStepData &data) override
 Update fields after a step in the optimization.
 
bool using_adaptive_dhat () const
 
const ipc::ParameterType & get_params () const
 
const ipc::SmoothCollisions & collision_set () const
 
- Public Member Functions inherited from polyfem::solver::ContactForm
 ContactForm (const ipc::CollisionMesh &collision_mesh, const double dhat, const double avg_mass, const bool use_adaptive_barrier_stiffness, const bool is_time_dependent, const bool enable_shape_derivatives, const ipc::BroadPhaseMethod broad_phase_method, const double ccd_tolerance, const int ccd_max_iterations)
 Construct a new Contact Form object.
 
virtual ~ContactForm ()=default
 
virtual void init (const Eigen::VectorXd &x) override
 Initialize the form.
 
virtual void update_quantities (const double t, const Eigen::VectorXd &x) override
 Update time-dependent fields.
 
virtual double max_step_size (const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const override
 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) override
 Initialize variables used during the line search.
 
void line_search_end () override
 Clear variables used during the line search.
 
virtual void solution_changed (const Eigen::VectorXd &new_x) override
 Update cached fields upon a change in the solution.
 
virtual bool is_step_collision_free (const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const override
 Checks if the step is collision free.
 
Eigen::MatrixXd compute_displaced_surface (const Eigen::VectorXd &x) const
 Compute the displaced positions of the surface nodes.
 
double barrier_stiffness () const
 Get the current barrier stiffness.
 
void set_barrier_stiffness (const double barrier_stiffness)
 Get the current barrier stiffness.
 
bool use_adaptive_barrier_stiffness () const
 Get use_adaptive_barrier_stiffness.
 
virtual bool use_convergent_formulation () const
 Get use_convergent_formulation.
 
bool enable_shape_derivatives () const
 
double weight () const override
 Get the form's multiplicative constant weight.
 
double dhat () const
 
std::shared_ptr< ipc::BroadPhase > get_broad_phase () const
 
- Public Member Functions inherited from polyfem::solver::Form
virtual ~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 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.
 
void set_weight (const double weight)
 Set the form's multiplicative constant weight.
 
void set_output_dir (const std::string &output_dir)
 
virtual void set_scale (const double scale)
 sets the scale for the form
 

Protected Member Functions

double value_unweighted (const Eigen::VectorXd &x) const override
 Compute the contact barrier potential value.
 
Eigen::VectorXd value_per_element_unweighted (const Eigen::VectorXd &x) const override
 Compute the value of the form multiplied per element.
 
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.
 
double barrier_support_size () const override
 
void update_collision_set (const Eigen::MatrixXd &displaced_surface) override
 Update the cached candidate set for the current solution.
 
- Protected Member Functions inherited from polyfem::solver::Form
std::string resolve_output_path (const std::string &path) const
 

Private Attributes

ipc::ParameterType params
 
const bool use_adaptive_dhat
 
ipc::SmoothCollisions collision_set_
 Cached constraint set for the current solution.
 
ipc::SmoothContactPotential barrier_potential_
 Contact potential.
 

Additional Inherited Members

- Public Attributes inherited from polyfem::solver::ContactForm
bool save_ccd_debug_meshes = false
 If true, output debug files.
 
- Protected Attributes inherited from polyfem::solver::ContactForm
const ipc::CollisionMesh & collision_mesh_
 Collision mesh.
 
const double dhat_
 Barrier activation distance.
 
const double dmin_ = 0
 Minimum distance between elements.
 
const bool use_adaptive_barrier_stiffness_
 If true, use an adaptive barrier stiffness.
 
double barrier_stiffness_
 Barrier stiffness.
 
double max_barrier_stiffness_
 Maximum barrier stiffness to use when using adaptive barrier stiffness.
 
const double avg_mass_
 Average mass of the mesh (used for adaptive barrier stiffness)
 
const bool is_time_dependent_
 Is the simulation time dependent?
 
const bool enable_shape_derivatives_
 Enable shape derivatives computation.
 
const ipc::BroadPhaseMethod broad_phase_method_
 Broad phase method to use for distance and CCD evaluations.
 
const std::shared_ptr< ipc::BroadPhase > broad_phase_
 
const ipc::TightInclusionCCD tight_inclusion_ccd_
 Continuous collision detection specification object.
 
double prev_distance_
 Previous minimum distance between all elements.
 
bool use_cached_candidates_ = false
 If true, use the cached candidate set for the current solution.
 
ipc::Candidates candidates_
 Cached candidate set for the current solution.
 
- 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

Definition at line 10 of file SmoothContactForm.hpp.

Constructor & Destructor Documentation

◆ SmoothContactForm()

polyfem::solver::SmoothContactForm::SmoothContactForm ( const ipc::CollisionMesh &  collision_mesh,
const double  dhat,
const double  avg_mass,
const double  alpha_t,
const double  alpha_n,
const bool  use_adaptive_dhat,
const double  min_distance_ratio,
const bool  use_adaptive_barrier_stiffness,
const bool  is_time_dependent,
const bool  enable_shape_derivatives,
const ipc::BroadPhaseMethod  broad_phase_method,
const double  ccd_tolerance,
const int  ccd_max_iterations 
)

Definition at line 15 of file SmoothContactForm.cpp.

References polyfem::solver::ContactForm::broad_phase_, collision_set_, polyfem::logger(), params, polyfem::solver::ContactForm::use_adaptive_barrier_stiffness(), and use_adaptive_dhat.

Here is the call graph for this function:

Member Function Documentation

◆ barrier_support_size()

double polyfem::solver::SmoothContactForm::barrier_support_size ( ) const
inlineoverrideprotectedvirtual

Reimplemented from polyfem::solver::ContactForm.

Definition at line 64 of file SmoothContactForm.hpp.

References polyfem::solver::ContactForm::dhat_.

◆ collision_set()

const ipc::SmoothCollisions & polyfem::solver::SmoothContactForm::collision_set ( ) const
inline

Definition at line 41 of file SmoothContactForm.hpp.

References collision_set_.

Referenced by force_shape_derivative().

Here is the caller graph for this function:

◆ first_derivative_unweighted()

void polyfem::solver::SmoothContactForm::first_derivative_unweighted ( const Eigen::VectorXd &  x,
Eigen::VectorXd &  gradv 
) const
overrideprotectedvirtual

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 78 of file SmoothContactForm.cpp.

References barrier_potential_, polyfem::solver::ContactForm::collision_mesh_, collision_set_, polyfem::solver::ContactForm::compute_displaced_surface(), and x.

Here is the call graph for this function:

◆ force_shape_derivative()

void polyfem::solver::SmoothContactForm::force_shape_derivative ( const ipc::SmoothCollisions &  collision_set,
const Eigen::MatrixXd &  solution,
const Eigen::VectorXd &  adjoint_sol,
Eigen::VectorXd &  term 
) const

Definition at line 46 of file SmoothContactForm.cpp.

References barrier_potential_, polyfem::solver::ContactForm::barrier_stiffness(), polyfem::solver::ContactForm::collision_mesh_, collision_set(), and polyfem::solver::ContactForm::compute_displaced_surface().

Here is the call graph for this function:

◆ get_params()

const ipc::ParameterType & polyfem::solver::SmoothContactForm::get_params ( ) const
inline

Definition at line 39 of file SmoothContactForm.hpp.

References params.

◆ name()

virtual std::string polyfem::solver::SmoothContactForm::name ( ) const
inlineoverridevirtual

Reimplemented from polyfem::solver::ContactForm.

Definition at line 27 of file SmoothContactForm.hpp.

◆ post_step()

void polyfem::solver::SmoothContactForm::post_step ( const polysolve::nonlinear::PostStepData &  data)
overridevirtual

Update fields after a step in the optimization.

Parameters
iter_numOptimization iteration number
xCurrent solution

Reimplemented from polyfem::solver::Form.

Definition at line 97 of file SmoothContactForm.cpp.

References polyfem::solver::ContactForm::barrier_stiffness(), polyfem::solver::ContactForm::barrier_stiffness_, polyfem::solver::ContactForm::collision_mesh_, collision_set_, polyfem::solver::ContactForm::compute_displaced_surface(), polyfem::solver::ContactForm::dhat(), polyfem::solver::ContactForm::is_time_dependent_, polyfem::logger(), polyfem::solver::ContactForm::max_barrier_stiffness_, polyfem::solver::ContactForm::prev_distance_, and polyfem::solver::ContactForm::use_adaptive_barrier_stiffness_.

Here is the call graph for this function:

◆ second_derivative_unweighted()

void polyfem::solver::SmoothContactForm::second_derivative_unweighted ( const Eigen::VectorXd &  x,
StiffnessMatrix hessian 
) const
overrideprotectedvirtual

Compute the second derivative of the value wrt x.

Parameters
xCurrent solution
hessianOutput Hessian of the value wrt x

Implements polyfem::solver::Form.

Definition at line 84 of file SmoothContactForm.cpp.

References barrier_potential_, polyfem::solver::ContactForm::collision_mesh_, collision_set_, polyfem::solver::ContactForm::compute_displaced_surface(), POLYFEM_SCOPED_TIMER, polyfem::solver::Form::project_to_psd_, and x.

Here is the call graph for this function:

◆ update_barrier_stiffness()

void polyfem::solver::SmoothContactForm::update_barrier_stiffness ( const Eigen::VectorXd &  x,
const Eigen::MatrixXd &  grad_energy 
)
overridevirtual

Update the barrier stiffness based on the current elasticity energy.

Parameters
xCurrent solution

Implements polyfem::solver::ContactForm.

Definition at line 38 of file SmoothContactForm.cpp.

References polyfem::log_and_throw_error(), and polyfem::solver::ContactForm::use_adaptive_barrier_stiffness().

Here is the call graph for this function:

◆ update_collision_set()

void polyfem::solver::SmoothContactForm::update_collision_set ( const Eigen::MatrixXd &  displaced_surface)
overrideprotectedvirtual

Update the cached candidate set for the current solution.

Parameters
displaced_surfaceVertex positions displaced by the current solution

Implements polyfem::solver::ContactForm.

Definition at line 52 of file SmoothContactForm.cpp.

References polyfem::solver::ContactForm::broad_phase_, polyfem::solver::ContactForm::candidates_, polyfem::solver::ContactForm::collision_mesh_, collision_set_, params, use_adaptive_dhat, and polyfem::solver::ContactForm::use_cached_candidates_.

◆ using_adaptive_dhat()

bool polyfem::solver::SmoothContactForm::using_adaptive_dhat ( ) const
inline

Definition at line 38 of file SmoothContactForm.hpp.

References use_adaptive_dhat.

◆ value_per_element_unweighted()

Eigen::VectorXd polyfem::solver::SmoothContactForm::value_per_element_unweighted ( const Eigen::VectorXd &  x) const
overrideprotectedvirtual

Compute the value of the form multiplied per element.

Parameters
xCurrent solution
Returns
Computed value

Reimplemented from polyfem::solver::Form.

Definition at line 73 of file SmoothContactForm.cpp.

References polyfem::log_and_throw_error().

Here is the call graph for this function:

◆ value_unweighted()

double polyfem::solver::SmoothContactForm::value_unweighted ( const Eigen::VectorXd &  x) const
overrideprotectedvirtual

Compute the contact barrier potential value.

Parameters
xCurrent solution
Returns
Value of the contact barrier potential

Implements polyfem::solver::Form.

Definition at line 68 of file SmoothContactForm.cpp.

References barrier_potential_, polyfem::solver::ContactForm::collision_mesh_, collision_set_, polyfem::solver::ContactForm::compute_displaced_surface(), and x.

Here is the call graph for this function:

Member Data Documentation

◆ barrier_potential_

ipc::SmoothContactPotential polyfem::solver::SmoothContactForm::barrier_potential_
private

◆ collision_set_

ipc::SmoothCollisions polyfem::solver::SmoothContactForm::collision_set_
private

◆ params

ipc::ParameterType polyfem::solver::SmoothContactForm::params
private

Definition at line 69 of file SmoothContactForm.hpp.

Referenced by get_params(), SmoothContactForm(), and update_collision_set().

◆ use_adaptive_dhat

const bool polyfem::solver::SmoothContactForm::use_adaptive_dhat
private

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