Hi all,
I am trying to compute the mesh quality (scaled Jacobian) after a Lagrangian-type displacement step, where I manually modify the mesh coordinates via domain.geometry.x. Conceptually, some elements should be inverted after the displacement, so I expect some negative values of scaled_jacobian. However, with the code below, the minimum value of scaled_jacobian is still positive.
from dolfinx import default_scalar_type
from dolfinx.fem import (
Constant,
dirichletbc,
Function,
functionspace,
assemble_scalar,
form,
locate_dofs_geometrical,
locate_dofs_topological,
)
from dolfinx.fem.petsc import LinearProblem
from dolfinx.io import XDMFFile
from dolfinx.io import gmshio
from dolfinx.mesh import create_unit_square, locate_entities
from dolfinx.plot import vtk_mesh
import matplotlib.pyplot as plt
from ufl import SpatialCoordinate, TestFunction, TrialFunction, dx, grad, inner
from mpi4py import MPI
import meshio
import gmsh
import numpy as np
import pyvista
from dolfinx import fem
import time
import pyvista as pv
from dolfinx import plot
domain, cell_tags, facet_tags = gmshio.read_from_msh(
"rectangle_with_armature.msh",
comm=MPI.COMM_WORLD,
rank=0,
gdim=2
)
cell_markers = cell_tags
facet_markers = facet_tags
V_linear = fem.functionspace(domain, ("Lagrange", 1))
tdim = domain.topology.dim
fdim = tdim - 1
topology, cell_types, geometry = plot.vtk_mesh(V_linear)
domain.topology.create_connectivity(tdim, tdim) # cell -> cell
domain.topology.create_connectivity(fdim, tdim) # facet -> cell(
domain.topology.create_connectivity(fdim, 0) # facet -> vertex
domain.topology.create_connectivity(tdim, 0) # cell -> vertex
f2v = domain.topology.connectivity(fdim, 0)
c2v = domain.topology.connectivity(tdim, 0)
facets_16 = cell_tags.find(16)
verts_facets16 = np.unique(np.hstack([c2v.links(int(f)) for f in facets_16]))
x = domain.geometry.x
x0 = x.copy()
gdim = domain.geometry.dim
dx = np.array((0.5, 0.5, 0.0))
x1 = x0.copy()
x1[verts_facets16, :gdim] += dx[:gdim]
from dolfinx import plot
import pyvista
grid = pyvista.UnstructuredGrid(topology, cell_types, x1)
plotter = pyvista.Plotter()
plotter.add_mesh(grid, show_edges=True)
plotter.view_xy()
plotter.show()
x = domain.geometry.x
x_backup = x.copy()
x[:] = x1
V_linear = fem.functionspace(domain, ("Lagrange", 1))
cqual = grid.compute_cell_quality("scaled_jacobian")
q = cqual["CellQuality"]
print("cell_number =", q.size)
print("scaled_jacobian: min =", float(q.min()), " max =", float(q.max()), "mean =",float(q.mean()))
plt.figure()
plt.hist(q, bins=30)
plt.xlabel("scaled_jacobian")
plt.ylabel("Number of cells")
plt.title("Mesh quality: scaled_jacobian")
plt.show()


