Hi, I use dolfin’s version 2019.2.0.dev0
My MWE is:
# aa.py
import numpy as np
from dolfin import *
comm = MPI.comm_world
rank = comm.Get_rank()
mesh = UnitSquareMesh(MPI.comm_self, 12, 12)
V = FunctionSpace(mesh, 'P', 1)
tol = 1e-8
subd = AutoSubDomain(lambda x: x[0] <= .5+tol)
markers = MeshFunction('size_t', mesh, 2, 0)
subd.mark(markers, 1)
subm1 = SubMesh(mesh, subd)
subm2 = MeshView.create(markers, 1)
subm3 = UnitSquareMesh(MPI.comm_self, 6, 12)
subV1 = FunctionSpace(subm1, 'P', 1)
subV2 = FunctionSpace(subm2, 'P', 1)
subV3 = FunctionSpace(subm3, 'P', 1)
mask1 = subm1.data().array("parent_vertex_indices", 0)
mask2 = subm2.topology().mapping()[mesh.id()].vertex_map()
k1 = Function(subV1)
k2 = Function(subV2)
k3 = Function(subV3)
try:
k1.vector()[:] = np.random.rand(len(mask1))
except:
if rank == 0: print('submesh error')
try:
k2.vector()[:] = np.random.rand(len(mask2))
except:
if rank == 0: print('meshview error')
try:
k3.vector()[:] = np.random.rand(len(mask1))
except:
if rank == 0: print('meshchunk error')
If I run it in parallel with mpirun -n 4 python3 aa.py
, I will get the output:
submesh error
meshview error
That is, only the last one out of 3 assignment operations does not raise an error: the error of a size mismatch - left-hand side and right-hand side arrays. (The thing is, that some parts of the original mesh are distributed among processes). But if the code snippets with SubMesh
and MeshView
do meaningfully the same things, the last approach (a.k.a. “meshchunk” as I called it) is different. To make it similar to its two counterparts I could save the instance of SubMesh
or MeshView
to a file and then recreate it via via setting an appropriate communicator in Mesh
class and reading the mesh from the file. However, I find this ‘workaround’ unreliable. Thus, I’d like to know if I am mistaken and there is a way to do it right (to resolve the issue I marked in bold italic)? Or it is a bug and it was fixed in some other versions?