How to get the solution obatained by fenics as a vector if it is possible ?
Consider the following minimal example:
from dolfin import *
mesh = UnitSquareMesh(2, 2)
V = FunctionSpace(mesh, "CG", 2)
dof_coordinates = V.tabulate_dof_coordinates()
expr = Expression("x[0]", degree=1)
uh = Function(V)
uh.interpolate(expr)
print(dof_coordinates)
print(uh.vector().get_local())
Thank you so much for your answer
Mustapha
Hello,
i tried but the problem is how to get uh vector from the solution u obtained by: solve(a == f, u, bc) without using expression “expr = Expression(“x[0]”, degree=1)”?
Thank you
print(u.vector().get_local())
yes, but it does not work for 2D!! i want to store the coefficients in a vector
Please make a minimal example, as your original question is not clear on what kind of vector you would like to use. What you can do is to get each of the components of a VectorFunctionSpace
by collapsing each of its components.
from dolfin import *
import numpy as np
mesh = UnitSquareMesh(10, 10)
V = VectorFunctionSpace(mesh, "CG", 1)
u = Function(V)
u.interpolate(Expression(("3*x[0]", "2*x[1]"), degree=1))
num_dofs_per_component = int(V.dim()/V.num_sub_spaces())
num_sub_spaces = V.num_sub_spaces()
print(num_dofs_per_component, num_sub_spaces)
vector = np.zeros((num_sub_spaces, num_dofs_per_component))
for i in range(num_sub_spaces):
vector[i] = u.sub(i, deepcopy=True).vector().get_local()
x = V.sub(0).collapse().tabulate_dof_coordinates()
vector = vector.T
for coord, vec in zip(x, vector):
print(coord, vec)
Ok, thank you. I solved the problem.
Mustapha
Hi, is there a way to do this in parallel as well? If I try: mpirun -n 2 python fenics_example.py
, where fenics_example.py is your working example I get the following error:
File "fenics_example.py", line 19, in <module>
vector[i] = u.sub(0).sub(i, deepcopy=True).vector().get_local()
ValueError: could not broadcast input array from shape (62,) into shape (121,)
Traceback (most recent call last):
File "fenics_example.py", line 19, in <module>
vector[i] = u.sub(0).sub(i, deepcopy=True).vector().get_local()
ValueError: could not broadcast input array from shape (59,) into shape (121,)
Replace
with
num_dofs_per_component = int(len(u.vector().get_local())/V.num_sub_spaces())
I am trying to reproduce the result for a mixed function space. I am interested only on the vector on the first function space. This code runs, is it also correct?
from dolfin import *
import numpy as np
mesh = UnitSquareMesh(10, 10)
V = VectorElement("CG", mesh.ufl_cell(),1)
M = MixedElement([V,V])
VV = FunctionSpace(mesh, M)
# V = VectorFunctionSpace(mesh, "CG", 1)
u = Function(VV)
expr = Expression(("3*x[0]", "2*x[1]"), degree=1)
u0 = interpolate(expr, VV.sub(0).collapse())
u1 = interpolate(expr, VV.sub(1).collapse())
assign(u, [u0,u1])
num_dofs_per_component = int(len(u.sub(0, deepcopy=True).vector().get_local())/VV.sub(0).num_sub_spaces())
# num_dofs_per_component = int(VV.sub(0).dim()/VV.sub(0).num_sub_spaces())
num_sub_spaces = VV.sub(0).num_sub_spaces()
print(num_dofs_per_component, num_sub_spaces)
# print(VV.sub(0).sub(0).dim(), 2)
vector = np.zeros((num_sub_spaces, num_dofs_per_component))
for i in range(num_sub_spaces):
vector[i] = u.sub(0).sub(i, deepcopy=True).vector().get_local()
x = VV.sub(0).sub(0).collapse().tabulate_dof_coordinates()
vector = vector.T
for coord, vec in zip(x, vector):
print(coord, vec)
I think it is correct, but it would be easier to do:
vel= u.sub(0,deepcopy=True)
and treat vel
and vel.function_space()
as above.
thanks ,but i already do this and i recieve a message like that:
“ZeroDivisionError: division by zero” i don’t know how can i do
Without a minimal code no one can give you any guidance