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

#include <AdjointForm.hpp>

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

Public Member Functions

 AdjointForm (const VariableToSimulationGroup &variable_to_simulations)
 
virtual ~AdjointForm ()
 
virtual std::string name () const override
 
void enable_energy_print (const std::string &print_energy_keyword)
 
double value (const Eigen::VectorXd &x) const override
 Compute the value of the form multiplied with the weigth.
 
virtual void solution_changed (const Eigen::VectorXd &new_x) override
 Update cached fields upon a change in the solution.
 
const VariableToSimulationGroupget_variable_to_simulations () const
 
virtual Eigen::MatrixXd compute_reduced_adjoint_rhs (const Eigen::VectorXd &x, const State &state) const
 
virtual void compute_partial_gradient (const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const
 
virtual void first_derivative (const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const final override
 Compute the first derivative of the value wrt x multiplied with the weigth.
 
virtual Eigen::MatrixXd compute_adjoint_rhs (const Eigen::VectorXd &x, const State &state) const
 
virtual void update_quantities (const double t, const Eigen::VectorXd &x) final override
 Update time-dependent fields.
 
virtual void init_lagging (const Eigen::VectorXd &x) final override
 Initialize lagged fields TODO: more than one step.
 
virtual void update_lagging (const Eigen::VectorXd &x, const int iter_num) final override
 Update lagged fields.
 
- Public Member Functions inherited from polyfem::solver::Form
virtual ~Form ()
 
virtual void init (const Eigen::VectorXd &x)
 Initialize the form.
 
Eigen::VectorXd value_per_element (const Eigen::VectorXd &x) const
 Compute the value of the form 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 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)
 

Protected Types

enum class  PrintStage { Inactive , AlreadyPrinted , ToPrint }
 

Protected Member Functions

virtual void first_derivative_unweighted (const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const final override
 Compute the first derivative of the value wrt x.
 
virtual void second_derivative_unweighted (const Eigen::VectorXd &x, StiffnessMatrix &hessian) const final override
 Compute the second derivative of the value wrt x.
 
- Protected Member Functions inherited from polyfem::solver::Form
std::string resolve_output_path (const std::string &path) const
 
virtual double value_unweighted (const Eigen::VectorXd &x) const =0
 Compute the value of the form.
 
virtual Eigen::VectorXd value_per_element_unweighted (const Eigen::VectorXd &x) const
 Compute the value of the form multiplied per element.
 

Protected Attributes

const VariableToSimulationGroup variable_to_simulations_
 
PrintStage print_energy_ = PrintStage::Inactive
 
std::string print_energy_keyword_
 
- 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 8 of file AdjointForm.hpp.

Member Enumeration Documentation

◆ PrintStage

enum class polyfem::solver::AdjointForm::PrintStage
strongprotected
Enumerator
Inactive 
AlreadyPrinted 
ToPrint 

Definition at line 38 of file AdjointForm.hpp.

Constructor & Destructor Documentation

◆ AdjointForm()

polyfem::solver::AdjointForm::AdjointForm ( const VariableToSimulationGroup variable_to_simulations)
inline

Definition at line 11 of file AdjointForm.hpp.

◆ ~AdjointForm()

virtual polyfem::solver::AdjointForm::~AdjointForm ( )
inlinevirtual

Definition at line 12 of file AdjointForm.hpp.

Member Function Documentation

◆ compute_adjoint_rhs()

Eigen::MatrixXd polyfem::solver::AdjointForm::compute_adjoint_rhs ( const Eigen::VectorXd &  x,
const State state 
) const
virtual

Reimplemented in polyfem::solver::StaticForm, polyfem::solver::MinTargetDistForm, polyfem::solver::TransientForm, and polyfem::solver::ProxyTransientForm.

Definition at line 74 of file AdjointForm.cpp.

References polyfem::State::diff_cached, polyfem::State::ndof(), and polyfem::solver::DiffCache::size().

Referenced by compute_reduced_adjoint_rhs().

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

◆ compute_partial_gradient()

void polyfem::solver::AdjointForm::compute_partial_gradient ( const Eigen::VectorXd &  x,
Eigen::VectorXd &  gradv 
) const
virtual

◆ compute_reduced_adjoint_rhs()

Eigen::MatrixXd polyfem::solver::AdjointForm::compute_reduced_adjoint_rhs ( const Eigen::VectorXd &  x,
const State state 
) const
virtual

Reimplemented in polyfem::solver::CompositeForm.

Definition at line 38 of file AdjointForm.cpp.

References compute_adjoint_rhs(), polyfem::State::lin_solver_cached, polyfem::solver::SolveData::nl_problem, polyfem::State::problem, polyfem::State::solve_data, and x.

Here is the call graph for this function:

◆ enable_energy_print()

void polyfem::solver::AdjointForm::enable_energy_print ( const std::string &  print_energy_keyword)

Definition at line 21 of file AdjointForm.cpp.

References print_energy_, print_energy_keyword_, and ToPrint.

◆ first_derivative()

void polyfem::solver::AdjointForm::first_derivative ( const Eigen::VectorXd &  x,
Eigen::VectorXd &  gradv 
) const
finaloverridevirtual

Compute the first derivative of the value wrt x multiplied with the weigth.

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

Reimplemented from polyfem::solver::Form.

Definition at line 57 of file AdjointForm.cpp.

References polyfem::solver::VariableToSimulationGroup::compute_adjoint_term(), compute_partial_gradient(), variable_to_simulations_, and x.

Here is the call graph for this function:

◆ first_derivative_unweighted()

void polyfem::solver::AdjointForm::first_derivative_unweighted ( const Eigen::VectorXd &  x,
Eigen::VectorXd &  gradv 
) const
finaloverrideprotectedvirtual

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 64 of file AdjointForm.cpp.

References polyfem::log_and_throw_adjoint_error().

Here is the call graph for this function:

◆ get_variable_to_simulations()

const VariableToSimulationGroup & polyfem::solver::AdjointForm::get_variable_to_simulations ( ) const
inline

Definition at line 20 of file AdjointForm.hpp.

References variable_to_simulations_.

◆ init_lagging()

void polyfem::solver::AdjointForm::init_lagging ( const Eigen::VectorXd &  x)
finaloverridevirtual

Initialize lagged fields TODO: more than one step.

Parameters
xCurrent solution

Reimplemented from polyfem::solver::Form.

Definition at line 82 of file AdjointForm.cpp.

◆ name()

◆ second_derivative_unweighted()

void polyfem::solver::AdjointForm::second_derivative_unweighted ( const Eigen::VectorXd &  x,
StiffnessMatrix hessian 
) const
finaloverrideprotectedvirtual

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 33 of file AdjointForm.cpp.

References polyfem::log_and_throw_adjoint_error(), and name().

Here is the call graph for this function:

◆ solution_changed()

void polyfem::solver::AdjointForm::solution_changed ( const Eigen::VectorXd &  new_x)
overridevirtual

◆ update_lagging()

void polyfem::solver::AdjointForm::update_lagging ( const Eigen::VectorXd &  x,
const int  iter_num 
)
finaloverridevirtual

Update lagged fields.

Parameters
xCurrent solution

Reimplemented from polyfem::solver::Form.

Definition at line 85 of file AdjointForm.cpp.

◆ update_quantities()

void polyfem::solver::AdjointForm::update_quantities ( const double  t,
const Eigen::VectorXd &  x 
)
finaloverridevirtual

Update time-dependent fields.

Parameters
tCurrent time
xCurrent solution at time t

Reimplemented from polyfem::solver::Form.

Definition at line 79 of file AdjointForm.cpp.

◆ value()

double polyfem::solver::AdjointForm::value ( const Eigen::VectorXd &  x) const
overridevirtual

Compute the value of the form multiplied with the weigth.

Parameters
xCurrent solution
Returns
Computed value

Reimplemented from polyfem::solver::Form.

Definition at line 10 of file AdjointForm.cpp.

References polyfem::adjoint_logger(), AlreadyPrinted, print_energy_, print_energy_keyword_, ToPrint, val, polyfem::solver::Form::value(), and x.

Referenced by polyfem::solver::BarycenterTargetForm::compute_adjoint_rhs_step(), polyfem::solver::BarycenterTargetForm::compute_partial_gradient_step(), and polyfem::solver::TransientForm::value_unweighted().

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

Member Data Documentation

◆ print_energy_

PrintStage polyfem::solver::AdjointForm::print_energy_ = PrintStage::Inactive
mutableprotected

Definition at line 45 of file AdjointForm.hpp.

Referenced by enable_energy_print(), solution_changed(), and value().

◆ print_energy_keyword_

std::string polyfem::solver::AdjointForm::print_energy_keyword_
protected

Definition at line 46 of file AdjointForm.hpp.

Referenced by enable_energy_print(), and value().

◆ variable_to_simulations_


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