Hello!
Here’s a simple example of Dolfin-X code that produces vector field:
import ufl
from mpi4py import MPI
import numpy
import dolfinx
import dolfinx.io
mesh = dolfinx.generation.UnitCubeMesh(MPI.COMM_WORLD, 11, 11, 11) # 3D mesh
P1 = ufl.FiniteElement('Lagrange', mesh.ufl_cell(), 1)
Vs = dolfinx.fem.FunctionSpace(mesh, P1) # scalar space
Vv = dolfinx.fem.FunctionSpace(mesh, ufl.MixedElement(P1, P1, P1)) # vector space
# scalar space
us = ufl.TrialFunction(Vs)
vs = ufl.TestFunction(Vs)
xs = ufl.SpatialCoordinate(Vs)
# $a={u_s}\cdot{v_s}$
# $L=100\left(x^2+y^3\right)\cdot{v_s}$
a_p = (ufl.inner(us, vs) * ufl.dx)
L_p = (100*ufl.inner(xs[0]**2+xs[1]**3, vs) * ufl.dx)
projection = dolfinx.fem.LinearProblem(a_p, L_p)
initial = projection.solve()
fle = dolfinx.io.XDMFFile(MPI.COMM_WORLD, '/tmp/field.xdmf', 'w')
fle.write_mesh(mesh) # mesh
fle.write_function(initial) # initial field distribution
# vector space
uv = ufl.TrialFunction(Vv)
vv = ufl.TestFunction(Vv)
xv = ufl.SpatialCoordinate(Vv)
# $a={u_v}\cdot{v_v}$
# $L=\left(\nabla{f_{init}}\right)\cdot{v_v}$
a_p = (ufl.inner(uv, vv) * ufl.dx)
L_p = (ufl.inner(ufl.grad(initial), vv) * ufl.dx)
projection = dolfinx.fem.LinearProblem(a_p, L_p)
u = projection.solve()
ux, uy, uz = u.split()
fle.write_function(ux) # field Fx
fle.write_function(uy) # field Fy
fle.write_function(uz) # field Fx
fle.close()
I used dolfinx.io.XDMFFile.write_function
to write field components to the XDMF file. Then I tried to visualize a vector field in paraview using this method. However, it didn’t produce any results.
I’ve asked paraview community about this problem and I was told that field components need to be in the same data block in order to be combined into vector field.
Is it possible to write field components into the same data block in XDMF file? Alternitevly, is there any other way to combine vector field components into the vector filed in paraview?