Parallel mesh refinement leads to corrupted solution when using read_checkpoint

Hi there.

I have the following problem. I’m trying to use write / read_checkpoint to load solutions back into Python in order to do some post-processing. This works fine in serial but in parallel my solutions return corrupted. After some debugging I found that my local mesh refinement function is causing the problem. The solutions can be loaded in Paraview fine but loading them back into Python using read_checkpoint leads to corruption. The refine() function seems to be the issue.

Any help?

Here is the main code:

from fenics import *

set_log_active(False)

a=1000

nx = 60
ny = 120
centrex = 0
centrey = 0.01*a
radius = 0.00229*a

x0 = 0
y0 = 0
x1 = 0.03*a
y1 = 0.06*a

def refiner(mesh, LEFT):
    cell_markers = MeshFunction("bool", mesh, mesh.topology().dim())
    cell_markers.set_all(False)
    for cell in cells(mesh):
        for facet in facets(cell): 
            for vertex in vertices(facet):
                if (vertex.point().array()[0] <= LEFT): 
                    cell_markers[cell] = True 
    mesh = refine(mesh, cell_markers)
    return mesh

def mesh_selector(mesh):
    mesh = refiner(mesh, 0.01*a)
    return mesh

mesh = RectangleMesh(Point(x0, y0), Point(x1, y1), nx, ny, 'left')
eps = Constant((2.5/6)*mesh.hmin())
mesh = mesh_selector(mesh)

dist = Expression('sqrt((pow((x[0]-A),2))+(pow((x[1]-B),2)))-r', degree=2, A=centrex, B=centrey, r=radius)
dist2 = Expression('(1/(1+exp((dist/eps))))', degree=2, eps=eps, dist=dist)

V = FunctionSpace(mesh, 'CG', 2)
phi0 = interpolate(dist2, V)

with XDMFFile("test/phi.xdmf") as outfile:
    outfile.write_checkpoint(phi0, "phi",0, append=False) 

Here is the code I use to read in:

import matplotlib.pyplot as plt
fig = plt.figure(num=None, figsize=(8, 16), dpi=100,
                 facecolor='w', edgecolor='k')
ax1 = fig.add_subplot(1, 2, 1)
phi0=Function(V)
with XDMFFile('test/phi.xdmf') as infile:
    infile.read_checkpoint(phi0, "phi", 0)
plot(phi0)
ax1 = fig.add_subplot(1, 2, 2)
plot(interpolate(dist2, V))

Here is the result of that code:

I don’t have the bandwidth to try your code, but could your issue be related to this: Different result in serial and parallel run - #4 by nate ?

2 Likes

Hi Nate. This was indeed the solution I was looking for. Thank you very much.

1 Like