# Non-linear Multiphysics on subdomain error

**URL:** <https://fenicsproject.discourse.group/t/non-linear-multiphysics-on-subdomain-error/19360>\
**Category:** dolfinx\
**Tags:** mesh, dolfinx\
**Created:** [January 17, 2026, 5:56am UTC](https://fenicsproject.discourse.group/t/non-linear-multiphysics-on-subdomain-error/19360 "2026-01-17T05:56:49Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![swgoldpf](https://yyz2.discourse-cdn.com/free1/user_avatar/fenicsproject.discourse.group/swgoldpf/32/8168_2.png) [@swgoldpf](https://fenicsproject.discourse.group/u/swgoldpf)\
**Post date:** [January 17, 2026, 5:56am UTC](https://fenicsproject.discourse.group/t/non-linear-multiphysics-on-subdomain-error/19360/1 "2026-01-17T05:56:49Z")

</div>

Hello.

I am trying to solve a coupled system of non-linear equations that define on part of mesh, following examples **Multiphysics: Solving PDEs on subdomains** and **Coupling PDEs of multiple dimensions** from FEniCS-workshop. In following minimal example i get error:

```
 Cannot insert rows that do not exist in the IndexMap.

 File "/home/admin_ubuntu/Py/FenicsxSem/test.py", line 37, in <module>
  resid,

...<15 lines>...
    "pc_type": "lu",
    ^
 RuntimeError: Cannot insert rows that do not exist in the IndexMap.

```

But when i change function space domain from submesh to whole mesh error disappears  
( QWspaceN = fem.functionspace(msh\_S, (“CG”, 1) → fem.functionspace(msh, (“CG”, 1) )  
QWspaceP = fem.functionspace(msh\_S, (“CG”, 1)) → fem.functionspace(msh, (“CG”, 1))  
But from **Multiphysics: Solving PDEs on subdomains** seem that i can define function space on sub mesh.

How to correct use multyphisics style on submesh with non-linear problem?  
Please help. (dolfinx version is 0.10.0)  
Min example:

```auto
import dolfinx
from mpi4py import MPI
from dolfinx import fem, mesh
import ufl
import numpy as np
from dolfinx.fem.petsc import NonlinearProblem
import matplotlib.pyplot as plt
domain = [[-1, 0], [1, 1]]
n_cells = [100, 1000]
msh = dolfinx.mesh.create_rectangle(MPI.COMM_WORLD, domain, n_cells, cell_type=mesh.CellType.quadrilateral )

mask = lambda x: (x[1] <= 0.6) & (x[1] >= 0.4)
cell_map = msh.topology.index_map(msh.topology.dim)
num_cells_local = cell_map.size_local + cell_map.num_ghosts
marker = np.ones(num_cells_local, dtype=np.int32)
marker[dolfinx.mesh.locate_entities(msh, msh.topology.dim, mask)] = 2

subdomains = dolfinx.mesh.meshtags(msh, msh.topology.dim, np.arange(num_cells_local, dtype=np.int32), marker)
msh_S, msh_S_cell_map, msh_S_vertex_map, _ = dolfinx.mesh.create_submesh(msh, msh.topology.dim, subdomains.values == 2 )

dx = ufl.dx( domain = msh, subdomain_data=subdomains )
dx2 = dx(2)
QWspaceN = fem.functionspace(msh_S, ("CG", 1)) 
QWspaceP = fem.functionspace(msh_S, ("CG", 1)) 
W = ufl.MixedFunctionSpace(QWspaceN, QWspaceP)
dqphiN2D, dqphiP2D = ufl.TrialFunctions(W) 
v_2d_n, v_2d_p = ufl.TestFunctions(W)
qphiN2D = fem.Function(QWspaceN)
qphiP2D = fem.Function(QWspaceP)
FN2d = ufl.exp(qphiN2D)*ufl.dot( ufl.grad(qphiN2D) , ufl.grad(v_2d_n) ) * dx2 
FP2d = - ufl.exp(-qphiP2D)*ufl.dot( ufl.grad(qphiP2D) , ufl.grad(v_2d_p) ) * dx2
F = FN2d + FP2d 
Jac = ufl.derivative(F, qphiN2D, dqphiN2D) + ufl.derivative(F, qphiP2D, dqphiP2D)

resid = ufl.extract_blocks(F)
JC = ufl.extract_blocks(Jac)
solverCurr = NonlinearProblem(
    resid,
    u = [qphiN2D, qphiP2D],
    J = JC ,
    bcs = [],
    entity_maps = [msh_S_cell_map],
    petsc_options={
            "snes_monitor": None,
            "ksp_type": "preonly",
            "pc_type": "lu",
            "pc_factor_mat_solver_type": "mumps",
            "mat_mumps_icntl_14": 120,
            "ksp_error_if_not_converged": True,
            "snes_error_if_not_converged": True,
                },
            petsc_options_prefix="signorini_",
        )

```

---

<div class="post-metadata">

**Author:** ![dokken](https://yyz2.discourse-cdn.com/free1/user_avatar/fenicsproject.discourse.group/dokken/32/1560_2.png) [@dokken](https://fenicsproject.discourse.group/u/dokken)\
**Post date:** [January 17, 2026, 10:44am UTC](https://fenicsproject.discourse.group/t/non-linear-multiphysics-on-subdomain-error/19360/2 "2026-01-17T10:44:31Z")

</div>

> [@swgoldpf](#):
>
> `msh_S, msh_S_cell_map, msh_S_vertex_map, _ = dolfinx.mesh.create_submesh(msh, msh.topology.dim, subdomains.values == 2 )`

This line is the issue, as `subdomains.values ==2` returns a boolean array of [True, False, …] rathre than the indicies of the cells.  
To solve this, replace the offending line by:

```python
msh_S, msh_S_cell_map, msh_S_vertex_map, _ = dolfinx.mesh.create_submesh(
    msh, msh.topology.dim, subdomains.find(2)
)

```

or

```python
msh_S, msh_S_cell_map, msh_S_vertex_map, _ = dolfinx.mesh.create_submesh(
    msh, msh.topology.dim, subdomains.indices[subdomains.values == 2]
)
```

---

<div class="post-metadata">

**Author:** ![swgoldpf](https://yyz2.discourse-cdn.com/free1/user_avatar/fenicsproject.discourse.group/swgoldpf/32/8168_2.png) [@swgoldpf](https://fenicsproject.discourse.group/u/swgoldpf)\
**Post date:** [January 17, 2026, 1:56pm UTC](https://fenicsproject.discourse.group/t/non-linear-multiphysics-on-subdomain-error/19360/3 "2026-01-17T13:56:58Z")

</div>

Thank you for correction. Now it is work.
