Barrier

Barrier functions and functionals.

Types

Name

Description

ipc::Barrier

Base class for barrier functions.

ipc::ClampedLogBarrier

Smoothly clamped log barrier functions from [Li et al.].

ipc::ClampedLogSqBarrier

Clamped log barrier with a quadratic log term from [Huang et al.].

ipc::CubicBarrier

Cubic barrier function from [Ando 2024].

ipc::NormalizedBarrier

Normalized barrier function from [Li et al.].

ipc::TwoStageBarrier

Two-stage barrier function from [Chen et al. 2025].

Functions

Name

Description

ipc::barrier()

Evaluate the barrier function.

ipc::barrier_first_derivative()

Derivative of the barrier function.

ipc::barrier_second_derivative()

Second derivative of the barrier function.

ipc::barrier_force_magnitude()

Compute the barrier force magnitude.

ipc::barrier_force_magnitude_gradient()

Compute the gradient of the barrier force magnitude.

ipc::initial_barrier_stiffness()

Compute the initial barrier stiffness.

ipc::update_barrier_stiffness()

Update the barrier stiffness based on the current state.

ipc::semi_implicit_stiffness()

Compute the semi-implicit stiffness for all collisions.

Function Details

Warning

doxygenfunction: Unable to resolve function “barrier” with arguments “(const T, const T)”. Candidate function could not be parsed. Parsing error is Error when parsing function declaration. If the function has no return type: Error in declarator or parameters-and-qualifiers Invalid C++ declaration: Expecting “(” in parameters-and-qualifiers. [error at 45] template<typename T> IPC_TOOLKIT_HOST_DEVICE T barrier (const T d, const T dhat) ———————————————^ If the function has a return type: Error in declarator or parameters-and-qualifiers If pointer to member declarator: Invalid C++ declaration: Expected ‘::’ in pointer to member (function). [error at 47] template<typename T> IPC_TOOLKIT_HOST_DEVICE T barrier (const T d, const T dhat) ———————————————–^ If declarator-id: Invalid C++ declaration: Expecting “(” in parameters-and-qualifiers. [error at 47] template<typename T> IPC_TOOLKIT_HOST_DEVICE T barrier (const T d, const T dhat) ———————————————–^

Warning

doxygenfunction: Unable to resolve function “barrier_first_derivative” with arguments “(const T, const T)”. Candidate function could not be parsed. Parsing error is Error when parsing function declaration. If the function has no return type: Error in declarator or parameters-and-qualifiers Invalid C++ declaration: Expecting “(” in parameters-and-qualifiers. [error at 45] template<typename T> IPC_TOOLKIT_HOST_DEVICE T barrier_first_derivative (const T d, const T dhat) ———————————————^ If the function has a return type: Error in declarator or parameters-and-qualifiers If pointer to member declarator: Invalid C++ declaration: Expected ‘::’ in pointer to member (function). [error at 47] template<typename T> IPC_TOOLKIT_HOST_DEVICE T barrier_first_derivative (const T d, const T dhat) ———————————————–^ If declarator-id: Invalid C++ declaration: Expecting “(” in parameters-and-qualifiers. [error at 47] template<typename T> IPC_TOOLKIT_HOST_DEVICE T barrier_first_derivative (const T d, const T dhat) ———————————————–^

Warning

doxygenfunction: Unable to resolve function “barrier_second_derivative” with arguments “(const T, const T)”. Candidate function could not be parsed. Parsing error is Error when parsing function declaration. If the function has no return type: Error in declarator or parameters-and-qualifiers Invalid C++ declaration: Expecting “(” in parameters-and-qualifiers. [error at 45] template<typename T> IPC_TOOLKIT_HOST_DEVICE T barrier_second_derivative (const T d, const T dhat) ———————————————^ If the function has a return type: Error in declarator or parameters-and-qualifiers If pointer to member declarator: Invalid C++ declaration: Expected ‘::’ in pointer to member (function). [error at 47] template<typename T> IPC_TOOLKIT_HOST_DEVICE T barrier_second_derivative (const T d, const T dhat) ———————————————–^ If declarator-id: Invalid C++ declaration: Expecting “(” in parameters-and-qualifiers. [error at 47] template<typename T> IPC_TOOLKIT_HOST_DEVICE T barrier_second_derivative (const T d, const T dhat) ———————————————–^

Barrier Force Magnitude

double ipc::barrier_force_magnitude(const double distance_squared,
    
const Barrierbarrierconst double dhat,
    
const double barrier_stiffnessconst double dmin = 0);

Compute the magnitude of the force due to a barrier.

Parameters:
const double distance_squared

The squared distance between elements.

const Barrier &barrier

The barrier function.

const double dhat

The activation distance of the barrier.

const double barrier_stiffness

The stiffness of the barrier.

const double dmin = 0

The minimum distance offset to the barrier.

Returns:

The magnitude of the force.

VectorMax12d ipc::barrier_force_magnitude_gradient(
    
const double distance_squared,
    
Eigen::ConstRef<VectorMax12d> distance_squared_gradient,
    
const Barrierbarrierconst double dhat,
    
const double barrier_stiffnessconst double dmin = 0);

Compute the gradient of the magnitude of the force due to a barrier.

Parameters:
const double distance_squared

The squared distance between elements.

Eigen::ConstRef<VectorMax12d> distance_squared_gradient

The gradient of the squared distance.

const Barrier &barrier

The barrier function.

const double dhat

The activation distance of the barrier.

const double barrier_stiffness

The stiffness of the barrier.

const double dmin = 0

The minimum distance offset to the barrier.

Returns:

The gradient of the force.

Adaptive Barrier Stiffness

double ipc::initial_barrier_stiffness(const double bbox_diagonal,
    
const Barrierbarrierconst double dhat,
    
const double average_mass,
    
Eigen::ConstRef<Eigen::VectorXd> grad_energy,
    
Eigen::ConstRef<Eigen::VectorXd> grad_barrier,
    
double& max_barrier_stiffness,
    
const double min_barrier_stiffness_scale = 1e11,
    
const double dmin = 0);

Compute an inital barrier stiffness using the barrier potential gradient.

Parameters:
const double bbox_diagonal

[in] Length of the diagonal of the bounding box of the scene.

const Barrier &barrier

[in] Barrier function.

const double dhat

[in] Activation distance of the barrier.

const double average_mass

[in] Average mass of all bodies.

Eigen::ConstRef<Eigen::VectorXd> grad_energy

[in] Gradient of the elasticity energy function.

Eigen::ConstRef<Eigen::VectorXd> grad_barrier

[in] Gradient of the barrier potential.

double &max_barrier_stiffness

[out] Maximum stiffness of the barrier.

const double min_barrier_stiffness_scale = 1e11

[in] Scale used to premultiply the minimum barrier stiffness.

const double dmin = 0

[in] Minimum distance between elements.

Returns:

The initial barrier stiffness.

double ipc::update_barrier_stiffness(const double prev_min_distance,
    
const double min_distanceconst double max_barrier_stiffness,
    
const double barrier_stiffnessconst double bbox_diagonal,
    
const double dhat_epsilon_scale = 1e-9const double dmin = 0);

Update the barrier stiffness if the distance is decreasing and less than dhat_epsilon_scale * diag.

Parameters:
const double prev_min_distance

[in] Previous minimum distance between elements.

const double min_distance

[in] Current minimum distance between elements.

const double max_barrier_stiffness

[in] Maximum stiffness of the barrier.

const double barrier_stiffness

[in] Current barrier stiffness.

const double bbox_diagonal

[in] Length of the diagonal of the bounding box of the scene.

const double dhat_epsilon_scale = 1e-9

[in] Update if distance is less than this fraction of the diagonal.

const double dmin = 0

[in] Minimum distance between elements.

Returns:

The updated barrier stiffness.

Semi-Implicit Stiffness

template <typename StencilsT>
Eigen::VectorXd ipc::semi_implicit_stiffness(
    
const CollisionMeshmesh,
    
Eigen::ConstRef<Eigen::MatrixXd> vertices,
    
const StencilsTcollisions,
    
Eigen::ConstRef<Eigen::VectorXd> vertex_masses,
    
const Eigen::SparseMatrix<double>& hessconst double dmin);

Compute the semi-implicit stiffness’s for all collisions.

Note

See [Ando 2024] for details.

Parameters:
const CollisionMesh &mesh

Collision mesh.

Eigen::ConstRef<Eigen::MatrixXd> vertices

Vertex positions.

const StencilsT &collisions

Normal collisions or collision candidates.

Eigen::ConstRef<Eigen::VectorXd> vertex_masses

Lumped vertex masses.

const Eigen::SparseMatrix<double> &hess

Hessian of the elasticity energy function.

const double dmin

Minimum distance between elements.

Returns:

The semi-implicit stiffness’s.