Hi all! I am doing the sensitivity analysis and I have several questions about FEniCSX.
Question 1
Take the classical demo Hyperelasticity — FEniCSx tutorial (jorgensd.github.io) as an example. Now we assume the elasticity parameter mu
is a cell-wise constant instead of a constant on the whole mesh.
S = dolfinx.FunctionSpace(mesh, ('DG', 0))
mu = dolfinx.Function(S)
And we can set some arbitrary values to mu
import numpy as np
NElem = mesh.topology.index_map(mesh.topology.dim).size_local # number of elements
with mu.vector.localForm() as mu_loc:
mu_loc.setValues(np.arange(NElem).tolist(), np.arange(NElem).tolist())
How can I output the values of mu
? In this case it should be np.arange(NElem).tolist()
.
Question 2
Now we want to compute the derivative of F
with respect to the parameter mu
of each element
F = ufl.inner(ufl.grad(v), P)*dx - ufl.inner(v, B)*dx - ufl.inner(v, T)*ds(2)
dFdmu1 = ufl.diff(F, mu1)
dFdmu2 = ufl.diff(F, mu2)
dFdmu3 = ufl.diff(F, mu3)
...
This process should be equivalent to compute cell-wise integrals as (since mu1
, mu2
, and mu3
are independent variables):
dFdmu1 = ufl.diff(F, mu) # take the integral on element 1
dFdmu2 = ufl.diff(F, mu) # take the integral on element 2
dFdmu3 = ufl.diff(F, mu) # take the integral on element 3
...
So is it possible to compute these derivatives conveniently in FEniCSX? I think it is doable with for-loops, but it will be very slow if we have a larger mesh.
Question 3
Finally, I want to assemble these vectors:
R1 = dolfinx.fem.assemble_vector(dFdmu1) # vector 1
R2 = dolfinx.fem.assemble_vector(dFdmu2) # vector 2
R3 = dolfinx.fem.assemble_vector(dFdmu2) # vector 3
Is there some way to assemble multiple vectors simultaneously to improve computational efficiency? It might be something like
dolfinx.fem.assemble_vector([dFdmu1, dFdmu2, dFdmu3])
and then we will obtain a matrix containing the assembled vectors.
Thanks!