Dear Firedrakers,


As an intermediate part of fluid-structure interaction problem, I would like to solve Laplace equation (with zero Neumann boundary conditions) on a subdomain of the full domain. For that reason I define the step function that is 1 in the subdomain of interest and 0 elsewhere. Multiplying LHS of the weak form (with trial function) by the step function causes a solver error. How can I correct it? Code and error listing are below.


Thank you,

Tomasz




from firedrake import *

nx = 17; ny = 8; Lx = 2.; Ly = 1.

mesh = RectangleMesh( nx, ny, Lx, Ly )
V = FunctionSpace( mesh, "CG", 1 )
V_DG0 = FunctionSpace( mesh, "DG", 0 )

def Heaviside( zero_on_left=True, Lp=0. ):
    sign = 1.
    if zero_on_left == False:
        sign = -1.
    Hx = Function( V_DG0 )
    Hx_expr = Expression( "0.5*(1.0 + copysign( 1.0, sign*(x[0]-Lp) ))",
                            sign=sign, Lp=Lp )
    Hx.interpolate(Hx_expr)
    return Hx;

I_f = Heaviside( zero_on_left=False, Lp=1. )

phi = Function( V )
trial = TrialFunction( V )
v = TestFunction( V )

a = dot( grad(trial), grad(v) ) * I_f * dx   # step function causes error here !!!
L = Function(V) * v * dx   # BTW can I put zero here in a simpler manner?

bc = DirichletBC( V, Expression( "sin(pi*x[1]/Ly)", Ly=Ly ), 1 )
solve( a==L, phi, bcs=bc )





Error listing:


...

Traceback (most recent call last):
  File "laplace_extended_domain.py", line 36, in <module>
    solve( a==L, phi, bcs=bc )
  File "/home/tommy/programs/firedrake/local/lib/python2.7/site-packages/firedrake/solving.py", line 120, in solve
    _solve_varproblem(*args, **kwargs)
  File "/home/tommy/programs/firedrake/local/lib/python2.7/site-packages/firedrake/solving.py", line 147, in _solve_varproblem
    solver.solve()
  File "<decorator-gen-295>", line 2, in solve
  File "/home/tommy/programs/firedrake/local/lib/python2.7/site-packages/pyop2/profiling.py", line 203, in wrapper
    return f(*args, **kwargs)
  File "/home/tommy/programs/firedrake/local/lib/python2.7/site-packages/firedrake/variational_solver.py", line 190, in solve
    solving_utils.check_snes_convergence(self.snes)
  File "/home/tommy/programs/firedrake/local/lib/python2.7/site-packages/firedrake/solving_utils.py", line 62, in check_snes_convergence
    %s""" % (snes.getIterationNumber(), msg))
RuntimeError: Nonlinear solve failed to converge after 0 nonlinear iterations.
Reason:
   Inner linear solve failed to converge after 0 iterations with reason: unknown reason (petsc4py enum incomplete?)