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

Residual-only coupling of the physical fluid/solid interface and of the computational ALE mesh to the solid boundary. More...

#include <FSIInterfaceForm.hpp>

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

Public Member Functions

 FSIInterfaceForm (int total_size, int velocity_offset, int mesh_displacement_offset, int solid_displacement_offset, int fluid_multiplier_offset, int mesh_multiplier_offset, StiffnessMatrix fluid_velocity_trace, StiffnessMatrix fluid_solid_trace, StiffnessMatrix mesh_trace, StiffnessMatrix mesh_solid_trace, const time_integrator::ImplicitTimeIntegrator &fluid_integrator, const time_integrator::ImplicitTimeIntegrator &solid_integrator)
 
std::string name () const override
 
int fluid_multiplier_size () const
 
int mesh_multiplier_size () const
 
const StiffnessMatrixfluid_multiplier_mass () const
 
const StiffnessMatrixmesh_multiplier_mass () const
 
Eigen::VectorXd physical_constraint (const Eigen::VectorXd &velocity, const Eigen::VectorXd &solid_velocity) const
 
Eigen::VectorXd mesh_constraint (const Eigen::VectorXd &mesh_displacement, const Eigen::VectorXd &solid_displacement) 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 update_quantities (const double t, const Eigen::VectorXd &x)
 Update time-dependent fields.
 
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.
 
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)
 
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 value of the form.
 
void first_derivative_unweighted (const Eigen::VectorXd &x, Eigen::VectorXd &residual) const override
 Compute the first derivative of the value wrt x.
 
void second_derivative_unweighted (const Eigen::VectorXd &x, StiffnessMatrix &jacobian) const 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 Eigen::VectorXd value_per_element_unweighted (const Eigen::VectorXd &x) const
 Compute the value of the form multiplied per element.
 

Static Private Member Functions

static StiffnessMatrix make_multiplier_mass (const StiffnessMatrix &trace)
 

Private Attributes

const int total_size_
 
const int velocity_offset_
 
const int mesh_displacement_offset_
 
const int solid_displacement_offset_
 
const int fluid_multiplier_offset_
 
const int mesh_multiplier_offset_
 
const StiffnessMatrix fluid_velocity_trace_
 
const StiffnessMatrix fluid_solid_trace_
 
const StiffnessMatrix mesh_trace_
 
const StiffnessMatrix mesh_solid_trace_
 
const StiffnessMatrix fluid_multiplier_mass_
 
const StiffnessMatrix mesh_multiplier_mass_
 
const time_integrator::ImplicitTimeIntegratorfluid_integrator_
 
const time_integrator::ImplicitTimeIntegratorsolid_integrator_
 

Additional Inherited Members

- 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

Residual-only coupling of the physical fluid/solid interface and of the computational ALE mesh to the solid boundary.

The physical multiplier applies equal and opposite interface forces. The mesh multiplier is deliberately one-way: its reaction acts on D_m, but not on D_s.

Definition at line 13 of file FSIInterfaceForm.hpp.

Constructor & Destructor Documentation

◆ FSIInterfaceForm()

polyfem::solver::FSIInterfaceForm::FSIInterfaceForm ( int  total_size,
int  velocity_offset,
int  mesh_displacement_offset,
int  solid_displacement_offset,
int  fluid_multiplier_offset,
int  mesh_multiplier_offset,
StiffnessMatrix  fluid_velocity_trace,
StiffnessMatrix  fluid_solid_trace,
StiffnessMatrix  mesh_trace,
StiffnessMatrix  mesh_solid_trace,
const time_integrator::ImplicitTimeIntegrator fluid_integrator,
const time_integrator::ImplicitTimeIntegrator solid_integrator 
)

Definition at line 24 of file FSIInterfaceForm.cpp.

References fluid_multiplier_offset_, fluid_multiplier_size(), fluid_solid_trace_, fluid_velocity_trace_, mesh_multiplier_offset_, mesh_multiplier_size(), mesh_solid_trace_, mesh_trace_, and total_size_.

Here is the call graph for this function:

Member Function Documentation

◆ first_derivative_unweighted()

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

References polyfem::time_integrator::ImplicitTimeIntegrator::acceleration_scaling(), polyfem::time_integrator::ImplicitTimeIntegrator::compute_velocity(), fluid_integrator_, fluid_multiplier_offset_, fluid_multiplier_size(), fluid_solid_trace_, fluid_velocity_trace_, mesh_constraint(), mesh_displacement_offset_, mesh_multiplier_offset_, mesh_multiplier_size(), mesh_trace_, physical_constraint(), solid_displacement_offset_, solid_integrator_, total_size_, velocity_offset_, and x.

Referenced by value_unweighted().

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

◆ fluid_multiplier_mass()

const StiffnessMatrix & polyfem::solver::FSIInterfaceForm::fluid_multiplier_mass ( ) const
inline

Definition at line 34 of file FSIInterfaceForm.hpp.

References fluid_multiplier_mass_.

◆ fluid_multiplier_size()

int polyfem::solver::FSIInterfaceForm::fluid_multiplier_size ( ) const
inline

Definition at line 32 of file FSIInterfaceForm.hpp.

References fluid_velocity_trace_.

Referenced by first_derivative_unweighted(), and FSIInterfaceForm().

Here is the caller graph for this function:

◆ make_multiplier_mass()

StiffnessMatrix polyfem::solver::FSIInterfaceForm::make_multiplier_mass ( const StiffnessMatrix trace)
staticprivate

Definition at line 60 of file FSIInterfaceForm.cpp.

References entries.

◆ mesh_constraint()

Eigen::VectorXd polyfem::solver::FSIInterfaceForm::mesh_constraint ( const Eigen::VectorXd &  mesh_displacement,
const Eigen::VectorXd &  solid_displacement 
) const

Definition at line 90 of file FSIInterfaceForm.cpp.

References mesh_solid_trace_, and mesh_trace_.

Referenced by first_derivative_unweighted().

Here is the caller graph for this function:

◆ mesh_multiplier_mass()

const StiffnessMatrix & polyfem::solver::FSIInterfaceForm::mesh_multiplier_mass ( ) const
inline

Definition at line 35 of file FSIInterfaceForm.hpp.

References mesh_multiplier_mass_.

◆ mesh_multiplier_size()

int polyfem::solver::FSIInterfaceForm::mesh_multiplier_size ( ) const
inline

Definition at line 33 of file FSIInterfaceForm.hpp.

References mesh_trace_.

Referenced by first_derivative_unweighted(), and FSIInterfaceForm().

Here is the caller graph for this function:

◆ name()

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

Implements polyfem::solver::Form.

Definition at line 30 of file FSIInterfaceForm.hpp.

◆ physical_constraint()

Eigen::VectorXd polyfem::solver::FSIInterfaceForm::physical_constraint ( const Eigen::VectorXd &  velocity,
const Eigen::VectorXd &  solid_velocity 
) const

Definition at line 82 of file FSIInterfaceForm.cpp.

References fluid_solid_trace_, and fluid_velocity_trace_.

Referenced by first_derivative_unweighted().

Here is the caller graph for this function:

◆ second_derivative_unweighted()

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

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 126 of file FSIInterfaceForm.cpp.

References polyfem::time_integrator::ImplicitTimeIntegrator::acceleration_scaling(), polyfem::time_integrator::ImplicitTimeIntegrator::dv_dx(), entries, fluid_integrator_, fluid_multiplier_offset_, fluid_solid_trace_, fluid_velocity_trace_, mesh_displacement_offset_, mesh_multiplier_offset_, mesh_solid_trace_, mesh_trace_, solid_displacement_offset_, solid_integrator_, total_size_, and velocity_offset_.

Here is the call graph for this function:

◆ value_unweighted()

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

Compute the value of the form.

Parameters
xCurrent solution
Returns
Computed value

Implements polyfem::solver::Form.

Definition at line 75 of file FSIInterfaceForm.cpp.

References first_derivative_unweighted(), and x.

Here is the call graph for this function:

Member Data Documentation

◆ fluid_integrator_

const time_integrator::ImplicitTimeIntegrator& polyfem::solver::FSIInterfaceForm::fluid_integrator_
private

◆ fluid_multiplier_mass_

const StiffnessMatrix polyfem::solver::FSIInterfaceForm::fluid_multiplier_mass_
private

Definition at line 60 of file FSIInterfaceForm.hpp.

Referenced by fluid_multiplier_mass().

◆ fluid_multiplier_offset_

const int polyfem::solver::FSIInterfaceForm::fluid_multiplier_offset_
private

◆ fluid_solid_trace_

const StiffnessMatrix polyfem::solver::FSIInterfaceForm::fluid_solid_trace_
private

◆ fluid_velocity_trace_

const StiffnessMatrix polyfem::solver::FSIInterfaceForm::fluid_velocity_trace_
private

◆ mesh_displacement_offset_

const int polyfem::solver::FSIInterfaceForm::mesh_displacement_offset_
private

◆ mesh_multiplier_mass_

const StiffnessMatrix polyfem::solver::FSIInterfaceForm::mesh_multiplier_mass_
private

Definition at line 61 of file FSIInterfaceForm.hpp.

Referenced by mesh_multiplier_mass().

◆ mesh_multiplier_offset_

const int polyfem::solver::FSIInterfaceForm::mesh_multiplier_offset_
private

◆ mesh_solid_trace_

const StiffnessMatrix polyfem::solver::FSIInterfaceForm::mesh_solid_trace_
private

◆ mesh_trace_

const StiffnessMatrix polyfem::solver::FSIInterfaceForm::mesh_trace_
private

◆ solid_displacement_offset_

const int polyfem::solver::FSIInterfaceForm::solid_displacement_offset_
private

◆ solid_integrator_

const time_integrator::ImplicitTimeIntegrator& polyfem::solver::FSIInterfaceForm::solid_integrator_
private

◆ total_size_

const int polyfem::solver::FSIInterfaceForm::total_size_
private

◆ velocity_offset_

const int polyfem::solver::FSIInterfaceForm::velocity_offset_
private

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