Set initial conditions for tensor-element

Yes, consider the minimal example:

import dolfinx
from mpi4py import MPI
import numpy as np
import ufl

mesh = dolfinx.mesh.create_unit_cube(MPI.COMM_WORLD, nx=1, ny=1, nz=1)
n = ufl.FacetNormal(mesh)

P = ufl.VectorElement("CG", mesh.ufl_cell(), 1)
R = ufl.TensorElement("DG", mesh.ufl_cell(), 1)
P_wish = ufl.VectorElement("CG", mesh.ufl_cell(), 1)
R_wish = ufl.TensorElement("DG", mesh.ufl_cell(), 1)
mel = ufl.MixedElement([P, R, P_wish, R_wish])
U = dolfinx.fem.FunctionSpace(mesh, mel)

u = dolfinx.fem.Function(U)
(p, F, v, P) = ufl.split(u)


def T(x):
    values = np.zeros((mesh.geometry.dim*mesh.geometry.dim,
                      x.shape[1]), dtype=np.float64)
    values[0] = x[0]
    values[1] = x[1]
    values[2] = x[0] + 2 * x[1]
    values[3] = x[1] - x[0]
    return values


form = dolfinx.fem.form(ufl.inner(F, F)*ufl.dx)
print(f"Pre {dolfinx.fem.assemble_scalar(form)}")
u.sub(1).interpolate(T)
print(f"Post {dolfinx.fem.assemble_scalar(form)}")

yielding

Pre 0.0
Post 3.5000000000000115
1 Like