How to set up a structural element and function space with 6 degrees of freedom?


import pyvista
from dolfinx import mesh, fem, plot, io, default_scalar_type
from dolfinx.fem.petsc import LinearProblem
from mpi4py import MPI

from ufl import FiniteElement, MixedElement  # Ensure this import is correct
import numpy as np

L = 72
W = 4.0
mu = 1
rho = 1
delta = W / L
gamma = 0.4 * delta**2
beta = 1.25
lambda_ = beta
g = gamma

domain = mesh.create_box(MPI.COMM_WORLD, [np.array([0, 0, 0]), np.array([L, W, W])],
                         [20, 6, 6], cell_type=mesh.CellType.hexahedron)

# Create two elements: one for displacements (3 DOFs) and one for rotations (3 DOFs)
displacement_element = FiniteElement("Lagrange", domain.ufl_cell(), 1, dim=3)
rotation_element = FiniteElement("Lagrange", domain.ufl_cell(), 1, dim=3)

# Combine the elements into a mixed element
element = MixedElement([displacement_element, rotation_element])

# Create a function space with the specified element
V = fem.FunctionSpace(domain, element)



Traceback (most recent call last):
  File "/home/prusso/dolfinx-beam_w/dolfinx_beam_w.py", line 2, in <module>
    from dolfinx import mesh, fem, plot, io, default_scalar_type
  File "/home/prusso/spack/var/spack/environments/fenicsx-env/.spack-env/view/lib/python3.11/site-packages/dolfinx/__init__.py", line 25, in <module>
    from dolfinx import fem, geometry, graph, io, jit, la, log, mesh, nls, plot, utils
  File "/home/prusso/spack/var/spack/environments/fenicsx-env/.spack-env/view/lib/python3.11/site-packages/dolfinx/fem/__init__.py", line 23, in <module>
    from dolfinx.fem.assemble import (
  File "/home/prusso/spack/var/spack/environments/fenicsx-env/.spack-env/view/lib/python3.11/site-packages/dolfinx/fem/assemble.py", line 22, in <module>
    from dolfinx.fem.forms import Form
  File "/home/prusso/spack/var/spack/environments/fenicsx-env/.spack-env/view/lib/python3.11/site-packages/dolfinx/fem/forms.py", line 15, in <module>
    import ufl
  File "/home/prusso/spack/var/spack/environments/fenicsx-env/.spack-env/view/lib/python3.11/site-packages/ufl/__init__.py", line 349, in <module>
    from ufl.formoperators import replace, derivative, action, energy_norm, rhs, lhs,\
  File "/home/prusso/spack/var/spack/environments/fenicsx-env/.spack-env/view/lib/python3.11/site-packages/ufl/formoperators.py", line 46, in <module>
    from ufl.algorithms import compute_form_adjoint, compute_form_action
  File "/home/prusso/spack/var/spack/environments/fenicsx-env/.spack-env/view/lib/python3.11/site-packages/ufl/algorithms/__init__.py", line 95, in <module>
    from ufl.algorithms.compute_form_data import compute_form_data
  File "/home/prusso/spack/var/spack/environments/fenicsx-env/.spack-env/view/lib/python3.11/site-packages/ufl/algorithms/compute_form_data.py", line 31, in <module>
    from ufl.algorithms.formtransformations import compute_form_arities
  File "/home/prusso/spack/var/spack/environments/fenicsx-env/.spack-env/view/lib/python3.11/site-packages/ufl/algorithms/formtransformations.py", line 39, in <module>
    from ufl.algorithms.transformer import Transformer
  File "/home/prusso/spack/var/spack/environments/fenicsx-env/.spack-env/view/lib/python3.11/site-packages/ufl/algorithms/transformer.py", line 26, in <module>
    from inspect import getargspec
ImportError: cannot import name 'getargspec' from 'inspect' (/home/prusso/spack/opt/spack/linux-ubuntu22.04-skylake/gcc-11.4.0/python-3.11.9-3k6gyosv23rjrhjsrblavq5la3tdu2z5/lib/python3.11/inspect.py)

What I would like to do is set up the function space for a stuctural element of 6 d.o.f.'s… A tetrahedron, or hexahedron would be great… Any way to do this with dolfinx?

I think you want to create a VectorElement with dim=3 instead. For further posts please also include the version of DOLFINx you are running.

This is not so specific. Should there be six dofs at each vertex, or six dofs in total? Do you want a Lagrange element or another family of elements:


spack find fenics-dolfinx
==> In environment fenicsx-env
==> 3 root specs
[+] fenics-dolfinx +adios2  [+] py-fenics-dolfinx  [+] py-pip  cflags=-O3 fflags=-O3 

-- linux-ubuntu22.04-skylake / gcc@11.4.0 -----------------------
fenics-dolfinx@0.8.0
==> 1 installed package
==> 0 concretized packages to be installed (show with `spack find -c`)

So, a Lagrange element should be great to start out with…

I had meant 6 degrees of freedom for each vertex. A common format for this is (u,v,w,\theta x, \theta y, \theta z) or (fx,fy,fz,mx,my,mz) if you prefer where fx is force of x, and mx is moment force of x…

So far from what I gathered the “from inspect import getargspec” traceback that results from running the code you are showing on my particular environment seems to have maybe to do with depreciation of getargspec, and the code maybe might start to work if I downgrade the spack environment to use Python 3.10 instead of Python 3.11.

Use VectorElement with dim=3 for each of the two spaces.

Yes, downgrade Python to 3.10

OK… I did the downgrade to Python 3.10…There seems to be an issue after the downgrade takes place loading this import statement:


from dolfinx import mesh, fem, plot, io, default_scalar_type

Traceback (most recent call last):
File “/home/prusso/dolfinx-beam_w/dolfinx_beam_w.py”, line 2, in
from dolfinx import mesh, fem, plot, io, default_scalar_type
File “/home/prusso/spack/var/spack/environments/fenicsx-env/.spack-env/view/lib/python3.10/site-packages/dolfinx/init.py”, line 25, in
from dolfinx import fem, geometry, graph, io, jit, la, log, mesh, nls, plot, utils
File “/home/prusso/spack/var/spack/environments/fenicsx-env/.spack-env/view/lib/python3.10/site-packages/dolfinx/fem/init.py”, line 23, in
from dolfinx.fem.assemble import (
File “/home/prusso/spack/var/spack/environments/fenicsx-env/.spack-env/view/lib/python3.10/site-packages/dolfinx/fem/assemble.py”, line 22, in
from dolfinx.fem.forms import Form
File “/home/prusso/spack/var/spack/environments/fenicsx-env/.spack-env/view/lib/python3.10/site-packages/dolfinx/fem/forms.py”, line 17, in
from dolfinx import default_scalar_type, jit
File “/home/prusso/spack/var/spack/environments/fenicsx-env/.spack-env/view/lib/python3.10/site-packages/dolfinx/jit.py”, line 17, in
import ffcx.codegeneration.jit
File “/home/prusso/spack/var/spack/environments/fenicsx-env/.spack-env/view/lib/python3.10/site-packages/ffcx/codegeneration/jit.py”, line 26, in
import ffcx.naming
File “/home/prusso/spack/var/spack/environments/fenicsx-env/.spack-env/view/lib/python3.10/site-packages/ffcx/naming.py”, line 12, in
import basix.ufl
File “/home/prusso/spack/var/spack/environments/fenicsx-env/.spack-env/view/lib/python3.10/site-packages/basix/ufl.py”, line 19, in
from ufl.finiteelement import AbstractFiniteElement as _AbstractFiniteElement
File “/home/prusso/spack/var/spack/environments/fenicsx-env/.spack-env/view/lib/python3.10/site-packages/ufl/finiteelement.py”, line 20, in
from ufl.cell import Cell as _Cell
ModuleNotFoundError: No module named ‘ufl.cell’


I also tried to see what would happen if I "pip install ufl" since I have py-pip installed in the spack environment however that leads to a different traceback related to "AbstractFiniteElement" so far...

Thanks for taking the time to look this over...

How exactly did you set up your spack environment?

So I was able to get past those tracebacks by removing the environment and installing a new environment from the cached packages and by using spack add @python3.10

The difficulty I am having now is that the statement ‘from ufl import VectorElement’ states that VectorElement can’t be found as part of ufl…

Here is the code:


#import pyvista
from dolfinx import mesh, fem, plot, io, default_scalar_type
from dolfinx.fem.petsc import LinearProblem
from mpi4py import MPI
import ufl
from ufl import VectorElement
import numpy as np

L = 72
W = 4.0
mu = 1
rho = 1
delta = W / L
gamma = 0.4 * delta**2
beta = 1.25
lambda_ = beta
g = gamma

domain = mesh.create_box(MPI.COMM_WORLD, [np.array([0, 0, 0]), np.array([L, W, W])],
                        [20, 6, 6], cell_type=mesh.CellType.hexahedron)

# Create two elements: one for displacements (3 DOFs) and one for rotations (3 DOFs)
displacement_element = VectorElement("Lagrange", domain.ufl_cell(), 1, dim=3)
rotation_element = VectorElement("Lagrange", domain.ufl_cell(), 1, dim=3)

print('done...')



Traceback (most recent call last):
  File "/home/prusso/dolfinx-beam_w/dolfinx_beam_w.py", line 6, in <module>
    from ufl import VectorElement
ImportError: cannot import name 'VectorElement' from 'ufl' (/home/prusso/spack/var/spack/environments/fenicsx-env/.spack-env/view/lib/python3.10/site-packages/ufl/__init__.py)

So what I am struggling with is maybe how to update or upgrade UFL maybe… Where is VectorElement? Can it be imported from somewhere else? How should I get VectorElement imported? Should I add py-pip or how should this be done?

So the I added py-pip and ran spack install and also pip install ufl, pip install setuptools to get rid of the pkgresources traceback… Now what I have is this one I mentioned earlier about the AbstractElement:


Traceback (most recent call last):
  File "/home/prusso/dolfinx-beam_w/dolfinx_beam_w.py", line 2, in <module>
    from dolfinx import mesh, fem, plot, io, default_scalar_type
  File "/home/prusso/spack/var/spack/environments/fenicsx-env/.spack-env/view/lib/python3.10/site-packages/dolfinx/__init__.py", line 25, in <module>
    from dolfinx import fem, geometry, graph, io, jit, la, log, mesh, nls, plot, utils
  File "/home/prusso/spack/var/spack/environments/fenicsx-env/.spack-env/view/lib/python3.10/site-packages/dolfinx/fem/__init__.py", line 23, in <module>
    from dolfinx.fem.assemble import (
  File "/home/prusso/spack/var/spack/environments/fenicsx-env/.spack-env/view/lib/python3.10/site-packages/dolfinx/fem/assemble.py", line 22, in <module>
    from dolfinx.fem.forms import Form
  File "/home/prusso/spack/var/spack/environments/fenicsx-env/.spack-env/view/lib/python3.10/site-packages/dolfinx/fem/forms.py", line 17, in <module>
    from dolfinx import default_scalar_type, jit
  File "/home/prusso/spack/var/spack/environments/fenicsx-env/.spack-env/view/lib/python3.10/site-packages/dolfinx/jit.py", line 17, in <module>
    import ffcx.codegeneration.jit
  File "/home/prusso/spack/var/spack/environments/fenicsx-env/.spack-env/view/lib/python3.10/site-packages/ffcx/codegeneration/jit.py", line 26, in <module>
    import ffcx.naming
  File "/home/prusso/spack/var/spack/environments/fenicsx-env/.spack-env/view/lib/python3.10/site-packages/ffcx/naming.py", line 12, in <module>
    import basix.ufl
  File "/home/prusso/spack/var/spack/environments/fenicsx-env/.spack-env/view/lib/python3.10/site-packages/basix/ufl.py", line 19, in <module>
    from ufl.finiteelement import AbstractFiniteElement as _AbstractFiniteElement
ImportError: cannot import name 'AbstractFiniteElement' from 'ufl.finiteelement' (/home/prusso/spack/var/spack/environments/fenicsx-env/.spack-env/view/lib/python3.10/site-packages/ufl/finiteelement/__init__.py)

Please stop mixing installations with pip.
The newer syntax is explained in What happened to VectorElement? - #2 by dokken
and
Introduction to the Unified Form Language — FEniCS Workshop

1 Like