Lagrange multipliers for Fictitious Domain Method

Hello, I would like to implement the Fictitious Domain Method in FEniCS.
Let’s say that we have a coupled velocity-pressure FE formulation for Stokes/Navier-Stokes. I would like to add Lagrange multipliers to impose velocity BC on the immersed boundaries described by P1 or P2 1D (line) elements. For example, as shown in Figure.
FDM-cylinder

How can I do this in FEniCS? How to write variational forms by combining mixed-dimensional meshes?

This is a very broad research question for which there is no straightforward path. I would suggest you discuss the topic with your collaborators.

Your question depends on what version of FEniCS you use.
See for instance @cdaversin:

for legacy fenics (code at: GitHub - cdaversin/mixed-dimensional-examples: Code to reproduce numerical examples presented in "Abstractions and automated algorithms for mixed-dimensional finite element methods" (2019))
or @jpdean at: https://www.repository.cam.ac.uk/items/6542198a-a078-4332-9f85-4c786313fd30
for dolfinx
(Examples at: GitHub - jpdean/mixed_domain_demos) which should be compatible with dolfinx main branch.

2 Likes

Hi, thank you for your response! I am not sure what you meant by “I would suggest you discuss the topic with your collaborators.” but to me it reads quite condescending.
I know what I am doing. Check my paper https://www.sciencedirect.com/science/article/pii/S0045782515004296

Thank you for pointing me to the relevant references and source code!

I have looked at the thesis and skimmed through the scripts. It does not look as straightforward as I was hoping it would be. I will read further.

As you need to formulate the variational form on submeshes, there are some things (such as entity maps) that needs to be explicitly mapped. A Lagrange multiplier code shouldn’t be much more than 100 lines of Python code (L262-363) in mixed_domain_demos/lagrange_multiplier.py at main · jpdean/mixed_domain_demos · GitHub
as all earlier code is generate the specific mesh of the fenics logo, which shouldn’t be needed for your problem.

Thank you once again!
I am going through the code to understand it.