How to implement the penalty method to avoid self-contact


I am working on a self-contact problem of deforming elastic solid. I would like to know how to implement well the penalty method in FEniCS to avoid auto-collisions.

Supposing the problem is:
Capture d’écran de 2024-03-05 16-08-15

  • Supposing the solid undergoes large deformations that lead to auto-penetration as shown on the below pictures:

penalty method

Capture d’écran de 2024-03-05 16-13-46 (reference: V. A. Yastrebov, Numerical methods in contact mechanics, John Wiley & Sons, 2013), with xS: a slave node and xM: its projection onto the opposite boundary of the same solid (~master node) and n: the normal vector at xM, as shown on the two above pictures.

Then, in case of self-penetration, the variation form would becomes:

And writting the above equation with v instead of du as the test-function, the variational form to implement in FEniCS would be:


Here are my questions:

  • Is that last equation correct and should-it be the one to implement in FEniCS?

  • Do I have to compute local test function v (vS and vM) for both contact boundaries, i.e. at both slave node xS and at its master projection xM ? If so, how should I express the test function locally with FEniCS?

  • How to correctly project the ”slave” node xS onto ”master” boundary to get the normal gap:

    • As in that case, the “slave” and “master” contact boundaries are actually the same object (self-
      contact), how to distinguish them? Which are the methods with FEniCS? Building two local submeshes with distinct boundaries?

    • Then, to compute the projection xM of the slave node, are there also specific methods?

Many thanks for your help,

This is far from a trivial question, especially since your deformation is quite large, and the gap has to be computed for each step.
There has been done quite a lot of work on this at: GitHub - Wells-Group/asimov-contact: Contact models for ASiMoV using DOLFINx and an unbiased Nitsche method for enforcement of contact conditions.

1 Like

Many thanks @dokken, I will have a look on that. Do you have anything with penalty method?
Kind regards,

Hello @anneker,

Please have you been able to find a solution to your problem?
I’m currently working on a similar problem. The Nitsche method proposed by Dokken via Contact-Asimov is a really good alternative. But I can’t find enough documentation to be able to implement this resource.

Kind regard.