Two point constraint

Hi,
I want to couple two points (or facets) on a mesh with a spring with a linear stiffness. I looked at dolfinx_mpc, but I couldn’t find a solution. Could you please point me out?

Thanks,
Petr

Updated. The code works differently than I expected. What is the correct way?

import numpy as np
import mpi4py
import dolfinx
import ufl
from petsc4py import PETSc
import matplotlib.pyplot as plt
msh = dolfinx.mesh.create_unit_square(mpi4py.MPI.COMM_WORLD, 4, 4)

V = dolfinx.fem.functionspace(msh, ("Lagrange", 1, (msh.geometry.dim,)))

def source(x):
    return np.logical_and(np.isclose(x[0], 0), np.isclose(x[1], 0))

def target(x):
    return np.logical_and(np.isclose(x[0], 1), np.isclose(x[1], 1))

dofs_source = dolfinx.fem.locate_dofs_geometrical(V, source)
dofs_target = dolfinx.fem.locate_dofs_geometrical(V, target)

from dolfinx.fem.petsc import create_matrix
dummy_form = dolfinx.fem.form(ufl.inner(ufl.TrialFunction(V), ufl.TestFunction(V)) * ufl.dx)
K_lig = create_matrix(dummy_form)
K_lig.zeroEntries()

K_lig.setOption(PETSc.Mat.Option.NEW_NONZERO_ALLOCATION_ERR, False)

n = len(dofs_source) #expected found one point with the dofs (x, y), but get only one dof, why?

L=1.
for k in range(n):
    i = dofs_source[k]
    j = dofs_target[k]

    K_lig.setValue(i, j, -L, addv=PETSc.InsertMode.ADD_VALUES)
    K_lig.setValue(j, i, -L, addv=PETSc.InsertMode.ADD_VALUES)

K_lig.assemble()
plt.imshow(K_lig[:, :])
plt.colorbar()
plt.show()