Skip to content

Commit 280802d

Browse files
authored
Add Draft Adhesion Docs (#144)
* Add Adhesion in refs.bib * Add Draft of Adhesion in getting_started.rst * Remove Bad Code * Remove comments * Improve docs * Remove Adhesion tutorial from getting started * Create adhesion.rst * Remove velocity here * Change displacement variable for x and not y
1 parent e3d7884 commit 280802d

File tree

3 files changed

+160
-1
lines changed

3 files changed

+160
-1
lines changed

docs/source/refs.bib

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,14 @@ @inproceedings{Chen2024Stabler
7575
booktitle = {{ACM} {SIGGRAPH} 2024 Conference Proceedings},
7676
note = {\url{https://www.cs.columbia.edu/cg/abs-psd/}}
7777
}
78+
@article{Fang2023AugmentedStickyInteractions,
79+
title = {Augmented Incremental Potential Contact for Sticky Interactions},
80+
author = {Fang, Yu and Li, Minchen and Cao, Yadi and Li, Xuan and Wolper, Joshuah and Yang, Yin and Jiang, Chenfanfu},
81+
journal = {IEEE Transactions on Visualization and Computer Graphics},
82+
year = {2024},
83+
volume = {30},
84+
number = {8},
85+
pages = {5596-5608},
86+
keywords = {Adhesives;Friction;Computational modeling;Deformation;Solids;Force;Deformable models;Physically based animation;optimization time integration},
87+
doi = {10.1109/TVCG.2023.3295656}
88+
}

docs/source/tutorial/adhesion.rst

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
Adhesion
2+
--------
3+
Adhesion simulates the sticking interaction between surfaces, such as glue bonding or material contact.
4+
Provides functionality to compute normal adhesion (perpendicular forces) and tangential adhesion (parallel forces).
5+
6+
Normal Adhesion
7+
^^^^^^^^^^^^^^^
8+
9+
For a given distance :math:`d`:
10+
11+
- If :math:`d < \hat{d}_p`:
12+
13+
.. math::
14+
A_n(d) = a_1 \cdot d^2 + c_1, \quad \text{where } a_1 = a_2 \left(1 - \frac{\hat{d}_a}{\hat{d}_p}\right)
15+
16+
- If :math:`\hat{d}_p \leq d < \hat{d}_a`:
17+
18+
.. math::
19+
A_n(d) = (a_2 \cdot d + b_2) \cdot d + c_2, \quad \text{where } b_2 = -2 a_2 \hat{d}_a, \, c_2 = a_2 \hat{d}_a^2
20+
21+
- If :math:`d \geq \hat{d}_a`:
22+
23+
.. math::
24+
A_n(d) = 0
25+
26+
The normal adhesion potential models the attraction force based on the distance between two surfaces.
27+
28+
Here dhat_p (:math:\hat{d}_p) is the threshold distance for adhesion (in units of distance) where the largest adhesion force is applied.
29+
Here dhat_a (:math:\hat{d}_a) is the adhesion activation distance (in units of distance), representing the maximum range where adhesion forces are active.
30+
Here Y (:math:Y) is the adhesion stiffness (in units of stress, such as Young's modulus), controlling the intensity of adhesion forces.
31+
Here eps_c (:math:\epsilon_c) is the adhesion coefficient (unitless) that defines the critical strain at which adhesion forces decrease.
32+
33+
.. md-tab-set::
34+
35+
.. md-tab-item:: C++
36+
37+
.. code-block:: c++
38+
39+
const double dhat_p = 1e-3;
40+
const double dhat_a = 2 * dhat_p;
41+
const double Y = 1e3;
42+
const double eps_c = 0.5;
43+
44+
const NormalAdhesionPotential A(dhat_p, dhat_a, Y, eps_c)
45+
double adhesion_potential = A(normal_collisions, collision_mesh, displacement);
46+
47+
.. md-tab-item:: Python
48+
49+
.. code-block:: python
50+
51+
dhat_p = 1e-3
52+
dhat_a = 2 * dhat_p
53+
Y = 1e3
54+
eps_c = 0.5
55+
56+
A = NormalAdhesionPotential(dhat_p, dhat_a, Y, eps_c)
57+
adhesion_potential = A(normal_collisions, collision_mesh, displacement)
58+
59+
Normal Derivatives
60+
^^^^^^^^^^^
61+
62+
We can also compute the first and second derivatives of the normal adhesion potential with respect to the displacement.
63+
64+
.. md-tab-set::
65+
66+
.. md-tab-item:: C++
67+
68+
.. code-block:: c++
69+
70+
Eigen::VectorXd adhesion_potential_grad =
71+
A.gradient(normal_collisions, collision_mesh, displacement);
72+
73+
Eigen::SparseMatrix<double> adhesion_potential_hess =
74+
A.hessian(normal_collisions, collision_mesh, displacement);
75+
76+
.. md-tab-item:: Python
77+
78+
.. code-block:: python
79+
80+
adhesion_potential_grad = A.gradient(
81+
normal_collisions, collision_mesh, displacement)
82+
83+
adhesion_potential_hess = A.hessian(
84+
normal_collisions, collision_mesh, displacement)
85+
86+
Tangential Adhesion
87+
^^^^^^^^^^^^^^^
88+
89+
The tangential adhesion potential models resistance to sliding (parallel to surfaces).
90+
91+
For displacement :math:`x`:
92+
93+
- If :math:`0 \leq x < 2 \varepsilon_a`:
94+
95+
.. math::
96+
A_t(x) = \frac{x^2}{\varepsilon_a} \left(1 - \frac{y}{3 \varepsilon_a}\right)
97+
98+
- If :math:`x \geq 2 \varepsilon_a`:
99+
100+
.. math::
101+
A_t(x) = \frac{4 \varepsilon_a}{3}
102+
103+
Here ``eps_a`` (:math:`\epsilon_a`) is the adhesion threshold (in units of displacement) used to smoothly transition.
104+
105+
.. md-tab-set::
106+
107+
.. md-tab-item:: C++
108+
109+
.. code-block:: c++
110+
111+
const double eps_a = 0.01;
112+
const TangentialAdhesionPotential A(eps_a);
113+
double adhesion_potential = A(tangential_collisions, collision_mesh, displacement);
114+
115+
.. md-tab-item:: Python
116+
117+
.. code-block:: python
118+
119+
eps_a = 0.01
120+
A = TangentialAdhesionPotential(eps_a)
121+
adhesion_potential = A(tangential_collisions, collision_mesh, displacement);
122+
123+
Derivatives
124+
^^^^^^^^^^^
125+
126+
We can also compute the first and second derivatives of the tangential adhesion potential with respect to the displacement.
127+
128+
.. md-tab-set::
129+
130+
.. md-tab-item:: C++
131+
132+
.. code-block:: c++
133+
134+
Eigen::VectorXd adhesion_potential_grad =
135+
A.gradient(tangential_collisions, collision_mesh, displacement);
136+
137+
Eigen::SparseMatrix<double> adhesion_potential_hess =
138+
A.hessian(tangential_collisions, collision_mesh, displacement);
139+
140+
.. md-tab-item:: Python
141+
142+
.. code-block:: python
143+
144+
adhesion_potential_grad = A.gradient(
145+
tangential_collisions, collision_mesh, displacement)
146+
147+
adhesion_potential_hess = A.hessian(
148+
tangential_collisions, collision_mesh, displacement)

docs/source/tutorial/getting_started.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -650,4 +650,4 @@ To do this, we need to set the ``min_distance`` parameter when calling ``is_step
650650
collision_free_vertices =
651651
(vertices_t1 - vertices_t0) * max_step_size + vertices_t0
652652
assert(ipctk.is_step_collision_free(
653-
mesh, vertices_t0, collision_free_vertices, min_distance=1e-4))
653+
mesh, vertices_t0, collision_free_vertices, min_distance=1e-4))

0 commit comments

Comments
 (0)