Dear all,
Grid partitioning can lead to the problem of reordering the same vector. How can I obtain this index?(global to local map?)
My question is :
How can I extract rows belonging to u from vector b while running in parallel?
The smallest example is as follows:
from mpi4py import MPI
try:
from petsc4py import PETSc
import dolfinx
if not dolfinx.has_petsc:
print("This demo requires DOLFINx to be compiled with PETSc enabled.")
exit(0)
except ModuleNotFoundError:
print("This demo requires petsc4py.")
exit(0)
import numpy as np
import ufl
from basix.ufl import element, mixed_element
from dolfinx import default_real_type, fem, la
from dolfinx.fem import (
Constant,
Function,
dirichletbc,
extract_function_spaces,
form,
functionspace,
locate_dofs_topological,
)
from dolfinx.fem.petsc import assemble_matrix_block, assemble_vector_block
from dolfinx.io import XDMFFile
from dolfinx.mesh import CellType, create_rectangle, locate_entities_boundary
from ufl import div, dx, grad, inner
from dolfinx.fem.petsc import (apply_lifting, assemble_matrix_block, assemble_vector_block,
create_vector_block, set_bc,create_matrix_block,create_matrix,create_vector)
comm = MPI.COMM_WORLD
rank=MPI.COMM_WORLD.Get_rank()
size = comm.Get_size()
msh = create_rectangle(
MPI.COMM_WORLD, [np.array([0, 0]), np.array([1, 1])], [32, 32], CellType.triangle
)
P2 = element("Lagrange", msh.basix_cell(), 2, shape=(msh.geometry.dim,), dtype=default_real_type)
P1 = element("Lagrange", msh.basix_cell(), 1, dtype=default_real_type)
V, Q = functionspace(msh, P2), functionspace(msh, P1)
noslip = np.zeros(msh.geometry.dim, dtype=PETSc.ScalarType)
# Define variational problem
(u, p) = ufl.TrialFunction(V), ufl.TrialFunction(Q)
(v, q) = ufl.TestFunction(V), ufl.TestFunction(Q)
x = ufl.SpatialCoordinate(msh)
f1=ufl.as_vector([x[0],x[1]])
f2=ufl.as_vector([x[1]**2,x[0]**2])
a = form([[inner(grad(u), grad(v)) * dx, inner(p, div(v)) * dx], [inner(div(u), q) * dx, None]])
L = form([inner(f1, v) * dx, inner(f1, v) * dx])
bb= create_vector_block(L)
assemble_vector_block(bb, L, a, bcs=[])
ccb=bb.getArray()[:]
print(f'rank{rank} size is {len(ccb)} ,values is',ccb)