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
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()