# Barrier¶

double ipc::barrier(const double d, const double dhat)

Function that grows to infinity as d approaches 0 from the right.

$b(d) = -(d-\hat{d})^2\ln\left(\frac{d}{\hat{d}}\right)$

Parameters:
const double d

The distance.

const double dhat

Activation distance of the barrier.

Returns:

The value of the barrier function at d.

double ipc::barrier_gradient(const double d, const double dhat)

Derivative of the barrier function.

$b'(d) = (\hat{d}-d) \left( 2\ln\left( \frac{d}{\hat{d}} \right) - \frac{\hat{d}}{d} + 1\right)$

Parameters:
const double d

The distance.

const double dhat

Activation distance of the barrier.

Returns:

The derivative of the barrier wrt d.

double ipc::barrier_hessian(const double d, const double dhat)

Second derivative of the barrier function.

$b''(d) = \left( \frac{\hat{d}}{d} + 2 \right) \frac{\hat{d}}{d} - 2\ln\left( \frac{d}{\hat{d}} \right) - 3$

Parameters:
const double d

The distance.

const double dhat

Activation distance of the barrier.

Returns:

The second derivative of the barrier wrt d.

double ipc::initial_barrier_stiffness(const double bbox_diagonal,
const
double dhat
, const double average_mass,
const
,
const
,
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 double dhat

[in] Activation distance of the barrier.

const double average_mass

[in] Average mass of all bodies.

[in] Gradient of the elasticity energy function.

[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_distance
, const double max_barrier_stiffness,
const
double barrier_stiffness
, const double bbox_diagonal,
const
double dhat_epsilon_scale = 1e-9
, const 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.

Last update: Nov 12, 2023