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

#include <ESPContactForm.hpp>

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

Public Member Functions

 ESPContactForm (const ipc::CollisionMesh &collision_mesh, const double dhat, const double avg_mass, const json esp_params, const bool skip_obstacles, std::shared_ptr< ipc::Barrier > barrier, const bool use_adaptive_dhat, 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, const double dhat_epsilon_scale)
 
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 post_step (const polysolve::nonlinear::PostStepData &data) override
 Update fields after a step in the optimization.
 
const ipc::ESPParameters & get_params () const
 
const ipc::ESPCollisions & collision_set () const
 
const ipc::ESPPotential & barrier_potential () 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, const double dhat_epsilon_scale)
 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)
 Set the current barrier stiffness.
 
bool use_adaptive_barrier_stiffness () const
 Get use_adaptive_barrier_stiffness.
 
double dhat_epsilon_scale () const
 Get the dhat_epsilon_scale passed to ipc::update_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?
 
virtual 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::ESPParameters params
 
ipc::ESPCollisions collision_set_
 Cached constraint set for the current solution.
 
ipc::ESPPotential barrier_potential_
 Contact potential.
 
Eigen::MatrixXd cached_displaced_surface
 

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 dhat_epsilon_scale_
 dhat_epsilon_scale used by ipc::update_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 11 of file ESPContactForm.hpp.

Constructor & Destructor Documentation

◆ ESPContactForm()

polyfem::solver::ESPContactForm::ESPContactForm ( const ipc::CollisionMesh &  collision_mesh,
const double  dhat,
const double  avg_mass,
const json  esp_params,
const bool  skip_obstacles,
std::shared_ptr< ipc::Barrier >  barrier,
const bool  use_adaptive_dhat,
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,
const double  dhat_epsilon_scale 
)

Definition at line 85 of file ESPContactForm.cpp.

References polyfem::log_and_throw_error().

Here is the call graph for this function:

Member Function Documentation

◆ barrier_potential()

const ipc::ESPPotential & polyfem::solver::ESPContactForm::barrier_potential ( ) const
inline

Definition at line 42 of file ESPContactForm.hpp.

References barrier_potential_.

◆ barrier_support_size()

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

Reimplemented from polyfem::solver::ContactForm.

Definition at line 65 of file ESPContactForm.hpp.

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

◆ collision_set()

const ipc::ESPCollisions & polyfem::solver::ESPContactForm::collision_set ( ) const
inline

Definition at line 40 of file ESPContactForm.hpp.

References collision_set_.

◆ first_derivative_unweighted()

void polyfem::solver::ESPContactForm::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 139 of file ESPContactForm.cpp.

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

Here is the call graph for this function:

◆ get_params()

const ipc::ESPParameters & polyfem::solver::ESPContactForm::get_params ( ) const
inline

Definition at line 38 of file ESPContactForm.hpp.

References params.

◆ name()

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

Reimplemented from polyfem::solver::ContactForm.

Definition at line 29 of file ESPContactForm.hpp.

◆ post_step()

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

◆ second_derivative_unweighted()

void polyfem::solver::ESPContactForm::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 151 of file ESPContactForm.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::ESPContactForm::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 105 of file ESPContactForm.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::ESPContactForm::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 113 of file ESPContactForm.cpp.

References polyfem::solver::ContactForm::broad_phase_, cached_displaced_surface, polyfem::solver::ContactForm::collision_mesh_, collision_set_, and params.

Referenced by post_step().

Here is the caller graph for this function:

◆ value_per_element_unweighted()

Eigen::VectorXd polyfem::solver::ESPContactForm::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 134 of file ESPContactForm.cpp.

References polyfem::log_and_throw_error().

Here is the call graph for this function:

◆ value_unweighted()

double polyfem::solver::ESPContactForm::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 124 of file ESPContactForm.cpp.

References barrier_potential_, cached_displaced_surface, 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::ESPPotential polyfem::solver::ESPContactForm::barrier_potential_
private

◆ cached_displaced_surface

Eigen::MatrixXd polyfem::solver::ESPContactForm::cached_displaced_surface
private

◆ collision_set_

ipc::ESPCollisions polyfem::solver::ESPContactForm::collision_set_
private

Cached constraint set for the current solution.

Definition at line 73 of file ESPContactForm.hpp.

Referenced by collision_set(), first_derivative_unweighted(), post_step(), second_derivative_unweighted(), update_collision_set(), and value_unweighted().

◆ params

ipc::ESPParameters polyfem::solver::ESPContactForm::params
private

Definition at line 70 of file ESPContactForm.hpp.

Referenced by get_params(), and update_collision_set().


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