Simple FEM-BEM coupling for the Helmholtz equation with FEniCSx

Background

For this problem, you will need FEniCSx installed alongside Bempp. If FEniCSx is not available on your system you can use the Docker image from bempp.com

In this tutorial, we will solve the problem of a wave travelling through a unit cube, $\Omega = [0,1]^3$ with different material parameters inside and outside the domain. The incident wave is given by

$$ u^\text{inc}(\mathbf{x})=\mathrm{e}^{\mathrm{i} k \mathbf{x}\cdot\mathbf{d}}, $$

where $\mathbf{x}=(x,y,z)$ and $\mathbf{d}$ is the direction of the incident wave. In the implementation we use, $\mathbf{d} = \frac{1}{\sqrt{3}}(1,1,1)$.

The PDE is

$$ \Delta u + n(\mathbf{x})^2 k^2 u = 0, \quad \text{ in } \Omega\\ \Delta u + k^2 u = 0, \quad \text{ in } \mathbb{R}^3 \backslash \Omega $$

In this example, we use

$$ n(\mathbf{x}) = 0.5 $$

Since the interior wavenumber is constant one could have also used a BEM/BEM coupling approach. However, here we demonstrate the use of FEM for the interior problem using the FEniCSx finite element package.

FEM Part

In $\Omega$, the FEM part is formulated as

$$ \int_\Omega \nabla u\cdot\nabla v -k^2\int_\Omega n^2uv - \int_{d\Omega} v\frac{\partial u}{\partial \nu} = 0, $$

or

$$ \langle\nabla u,\nabla v\rangle_\Omega - k^2\langle n^2u,v\rangle_\Omega - \langle \lambda,v\rangle_\Gamma=0, $$

where $\lambda=\frac{\partial u}{\partial \nu}$.

Later, we will write this as the following operator equation

$$ \mathsf{A}u-k^2 \mathsf{M}u-\mathsf{M}_\Gamma \lambda = 0 $$

BEM Part

In $\mathbb{R}^3 \backslash \Omega$, we let $u = u^\text{inc}+u^\text{s}$, where $u^\text{inc}$ is the incident wave and $u^\text{s}$ is the scattered wave. As given in Integral equation methods in scattering theory by Colton & Kress,

$$ 0 = \mathcal{K}u^\text{inc}-\mathcal{V}\frac{\partial u^{inc}}{\partial \nu},\\[2mm] u^\text{s} = \mathcal{K}u^\text{s}-\mathcal{V}\frac{\partial u^{s}}{\partial \nu}, $$

where $\mathcal{K}$ and $\mathcal{V}$ are the double single layer potential operators. Adding these, we get

$$ u^\text{s} = \mathcal{K}u-\mathcal{V}\lambda. $$

This representation formula will be used to find $u^\text{s}$ for plotting later.

Taking the trace on the boundary gives

$$ u-u^\text{inc} = \left(\tfrac{1}{2}\mathsf{Id}+\mathsf{K}\right)u -\mathsf{V}\lambda. $$

This rearranges to

$$ u^\text{inc} = \left(\tfrac{1}{2}\mathsf{Id}-\mathsf{K}\right)u+\mathsf{V}\lambda. $$

Full Formulation

The full blocked formulation is

$$ \begin{bmatrix} \mathsf{A}-k^2 \mathsf{M} & -\mathsf{M}_\Gamma\\ \tfrac{1}{2}\mathsf{Id}-\mathsf{K} & \mathsf{V} \end{bmatrix} \begin{bmatrix} u\\ \lambda \end{bmatrix}=\begin{bmatrix} 0\\ u^\text{inc} \end{bmatrix}. $$

This formulation is not stable for all frequencies due to the possibility of interior resonances. But it is sufficient for this example and serves as a blueprint for more complex formulations.

Implementation

We begin by importing Dolfinx (the FEniCSx python library), UFL (FEniCS's unified form language), MPI, Bempp and NumPy.

In [1]:
import dolfinx
import dolfinx.geometry
import ufl
from mpi4py import MPI
import bempp.api
import numpy as np

Next, we set the wavenumber k and the direction d of the incoming wave.

In [2]:
k = 6.
d = np.array([1., 1., 1])
d /= np.linalg.norm(d)

We create a Dolfin mesh. Later, the boundary mesh will be extracted from this.

A mesh could be created from a file changing this line to mesh = dolfin.Mesh('/path/to/file.xml').

In [3]:
mesh = dolfinx.UnitCubeMesh(MPI.COMM_WORLD, 10, 10, 10)

Next, we make the Dolfin and Bempp function spaces.

The function fenics_to_bempp_trace_data will extract the trace space from the Dolfin space and create the matrix trace_matrix, which maps between the dofs (degrees of freedom) in Dolfin and Bempp.

In [4]:
from bempp.api.external import fenicsx

fenics_space = dolfinx.FunctionSpace(mesh, ("CG", 1))
trace_space, trace_matrix = \
    fenicsx.fenics_to_bempp_trace_data(fenics_space)
bempp_space = bempp.api.function_space(trace_space.grid, "DP", 0)

fem_size = fenics_space.dofmap.index_map.size_global
bem_size = bempp_space.global_dof_count

print("FEM dofs: {0}".format(fem_size))
print("BEM dofs: {0}".format(bem_size))
INFO:bempp:Created grid with id c8ce5f52-7d2c-4a7b-8127-ae6c4c774573. Elements: 1200. Edges: 1800. Vertices: 602
TIMING:bempp:Grid.__init__ : 3.452e+00s
TIMING:bempp:_compute_p1_dof_map : 1.514e+00s
TIMING:bempp:p1_continuous_function_space : 1.521e+00s
TIMING:bempp:p0_discontinuous_function_space : 8.383e-04s
FEM dofs: 1331
BEM dofs: 1200

We create the boundary operators that we need.

In [5]:
id_op = bempp.api.operators.boundary.sparse.identity(
    trace_space, bempp_space, bempp_space)
mass = bempp.api.operators.boundary.sparse.identity(
    bempp_space, bempp_space, trace_space)
dlp = bempp.api.operators.boundary.helmholtz.double_layer(
    trace_space, bempp_space, bempp_space, k)
slp = bempp.api.operators.boundary.helmholtz.single_layer(
    bempp_space, bempp_space, bempp_space, k)

We create the Dolfin function spaces and the function (or in this case constant) n.

In [6]:
u = ufl.TrialFunction(fenics_space)
v = ufl.TestFunction(fenics_space)
n = 0.5

We make the vectors on the right hand side of the formulation.

In [7]:
@bempp.api.complex_callable
def u_inc(x, n, domain_index, result):
    result[0] = np.exp(1j * k * np.dot(x, d))
u_inc = bempp.api.GridFunction(bempp_space, fun=u_inc)

# The rhs from the FEM
rhs_fem = np.zeros(fem_size)
# The rhs from the BEM
rhs_bem = u_inc.projections(bempp_space)
# The combined rhs
rhs = np.concatenate([rhs_fem, rhs_bem])

We are now ready to create a BlockedLinearOperator containing all four parts of the discretisation of $$ \begin{bmatrix} \mathsf{A}-k^2 \mathsf{M} & -\mathsf{M}_\Gamma\\ \tfrac{1}{2}\mathsf{Id}-\mathsf{K} & \mathsf{V} \end{bmatrix}. $$

In [8]:
from bempp.api.assembly.blocked_operator import BlockedDiscreteOperator
from scipy.sparse.linalg.interface import LinearOperator
blocks = [[None,None],[None,None]]

trace_op = LinearOperator(trace_matrix.shape, lambda x:trace_matrix @ x)

A = fenicsx.FenicsOperator((ufl.inner(ufl.grad(u), ufl.grad(v)) - k**2 * n**2 * ufl.inner(u, v)) * ufl.dx)

blocks[0][0] = A.weak_form()
blocks[0][1] = -trace_matrix.T * mass.weak_form().to_sparse()
blocks[1][0] = (.5 * id_op - dlp).weak_form() * trace_op
blocks[1][1] = slp.weak_form()

blocked = BlockedDiscreteOperator(np.array(blocks))
TIMING:bempp:Start operation: 
TIMING:bempp:Finished Operation: : 3.2153611183166504s
TIMING:bempp:assemble_sparse : 3.217e+00s
TIMING:bempp:Start operation: 
TIMING:bempp:Finished Operation: : 2.544266700744629s
TIMING:bempp:assemble_sparse : 2.545e+00s
TIMING:bempp:Start operation: Regular assembler:helmholtz_double_layer_boundary:opencl
INFO:bempp:OpenCL CPU Device set to: pthread-Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz
TIMING:bempp:Finished Operation: Regular assembler:helmholtz_double_layer_boundary:opencl: 1.7337913513183594s
TIMING:bempp:Start operation: Singular assembler:helmholtz_double_layer_boundary:opencl
TIMING:bempp:Finished Operation: Singular assembler:helmholtz_double_layer_boundary:opencl: 0.5207102298736572s
TIMING:bempp:Start operation: Regular assembler:helmholtz_single_layer_boundary:opencl
TIMING:bempp:Finished Operation: Regular assembler:helmholtz_single_layer_boundary:opencl: 1.0467305183410645s
TIMING:bempp:Start operation: Singular assembler:helmholtz_single_layer_boundary:opencl
TIMING:bempp:Finished Operation: Singular assembler:helmholtz_single_layer_boundary:opencl: 0.49677538871765137s

Next, we solve the system, then split the solution into the parts assosiated with u and λ. For an efficient solve, preconditioning is required.

In [9]:
from bempp.api.assembly.discrete_boundary_operator import InverseSparseDiscreteBoundaryOperator
from scipy.sparse.linalg import LinearOperator

# Compute the sparse inverse of the Helmholtz operator
# Although it is not a boundary operator we can use
# the SparseInverseDiscreteBoundaryOperator function from
# BEM++ to turn its LU decomposition into a linear operator.
P1 = InverseSparseDiscreteBoundaryOperator(
    blocked[0,0].to_sparse().tocsc())

# For the Laplace slp we use a simple mass matrix preconditioner. 
# This is sufficient for smaller low-frequency problems.
P2 = InverseSparseDiscreteBoundaryOperator(
    bempp.api.operators.boundary.sparse.identity(
        bempp_space, bempp_space, bempp_space).weak_form())

# Create a block diagonal preconditioner object using the Scipy LinearOperator class
def apply_prec(x):
    """Apply the block diagonal preconditioner"""
    m1 = P1.shape[0]
    m2 = P2.shape[0]
    n1 = P1.shape[1]
    n2 = P2.shape[1]
    
    res1 = P1.dot(x[:n1])
    res2 = P2.dot(x[n1:])
    return np.concatenate([res1, res2])

p_shape = (P1.shape[0] + P2.shape[0], P1.shape[1] + P2.shape[1])
P = LinearOperator(p_shape, apply_prec, dtype=np.dtype('complex128'))

# Create a callback function to count the number of iterations
it_count = 0
def count_iterations(x):
    global it_count
    it_count += 1

from scipy.sparse.linalg import gmres
soln, info = gmres(blocked, rhs, M=P, callback=count_iterations)

soln_fem = soln[:fem_size]
soln_bem = soln[fem_size:]

print("Number of iterations: {0}".format(it_count))
TIMING:bempp:_Solver.__init__ : 2.485e-02s
TIMING:bempp:Start operation: 
TIMING:bempp:Finished Operation: : 1.1819589138031006s
TIMING:bempp:assemble_sparse : 1.184e+00s
WARNING:py.warnings:/usr/lib/python3/dist-packages/scipy/sparse/linalg/dsolve/linsolve.py:296: SparseEfficiencyWarning: splu requires CSC matrix format
  warn('splu requires CSC matrix format', SparseEfficiencyWarning)

TIMING:bempp:_Solver.__init__ : 3.294e-03s
TIMING:bempp:_Solver.solve : 2.603e-03s
TIMING:bempp:_Solver.solve : 3.290e-05s
TIMING:bempp:_Solver.solve : 3.338e-05s
TIMING:bempp:_Solver.solve : 8.276e-04s
TIMING:bempp:_Solver.solve : 8.810e-04s
TIMING:bempp:_Solver.solve : 2.587e-04s
TIMING:bempp:_Solver.solve : 1.340e-04s
TIMING:bempp:_Solver.solve : 1.208e-03s
TIMING:bempp:_Solver.solve : 8.800e-04s
TIMING:bempp:_Solver.solve : 2.425e-04s
TIMING:bempp:_Solver.solve : 2.391e-04s
TIMING:bempp:_Solver.solve : 1.192e-03s
TIMING:bempp:_Solver.solve : 8.972e-04s
TIMING:bempp:_Solver.solve : 2.308e-04s
TIMING:bempp:_Solver.solve : 2.244e-04s
TIMING:bempp:_Solver.solve : 1.179e-03s
TIMING:bempp:_Solver.solve : 8.926e-04s
TIMING:bempp:_Solver.solve : 2.258e-04s
TIMING:bempp:_Solver.solve : 2.530e-04s
TIMING:bempp:_Solver.solve : 1.243e-03s
TIMING:bempp:_Solver.solve : 9.072e-04s
TIMING:bempp:_Solver.solve : 2.186e-04s
TIMING:bempp:_Solver.solve : 1.905e-04s
TIMING:bempp:_Solver.solve : 1.084e-03s
TIMING:bempp:_Solver.solve : 9.575e-04s
TIMING:bempp:_Solver.solve : 3.076e-05s
TIMING:bempp:_Solver.solve : 2.680e-04s
TIMING:bempp:_Solver.solve : 9.916e-04s
TIMING:bempp:_Solver.solve : 1.271e-03s
TIMING:bempp:_Solver.solve : 1.290e-04s
TIMING:bempp:_Solver.solve : 1.674e-04s
TIMING:bempp:_Solver.solve : 1.214e-03s
TIMING:bempp:_Solver.solve : 9.804e-04s
TIMING:bempp:_Solver.solve : 3.219e-05s
TIMING:bempp:_Solver.solve : 3.099e-05s
TIMING:bempp:_Solver.solve : 9.716e-04s
TIMING:bempp:_Solver.solve : 7.665e-04s
TIMING:bempp:_Solver.solve : 1.566e-04s
TIMING:bempp:_Solver.solve : 1.156e-04s
TIMING:bempp:_Solver.solve : 1.028e-03s
TIMING:bempp:_Solver.solve : 1.048e-03s
TIMING:bempp:_Solver.solve : 1.366e-04s
TIMING:bempp:_Solver.solve : 1.922e-04s
TIMING:bempp:_Solver.solve : 1.075e-03s
TIMING:bempp:_Solver.solve : 1.153e-03s
TIMING:bempp:_Solver.solve : 1.676e-04s
TIMING:bempp:_Solver.solve : 1.938e-04s
TIMING:bempp:_Solver.solve : 1.096e-03s
TIMING:bempp:_Solver.solve : 9.286e-04s
TIMING:bempp:_Solver.solve : 9.680e-05s
TIMING:bempp:_Solver.solve : 1.898e-04s
TIMING:bempp:_Solver.solve : 1.013e-03s
TIMING:bempp:_Solver.solve : 9.339e-04s
TIMING:bempp:_Solver.solve : 1.729e-04s
TIMING:bempp:_Solver.solve : 1.745e-04s
TIMING:bempp:_Solver.solve : 1.074e-03s
TIMING:bempp:_Solver.solve : 8.385e-04s
TIMING:bempp:_Solver.solve : 1.476e-04s
TIMING:bempp:_Solver.solve : 1.962e-04s
TIMING:bempp:_Solver.solve : 1.004e-03s
TIMING:bempp:_Solver.solve : 1.191e-03s
TIMING:bempp:_Solver.solve : 1.345e-04s
TIMING:bempp:_Solver.solve : 1.667e-04s
TIMING:bempp:_Solver.solve : 1.216e-03s
TIMING:bempp:_Solver.solve : 8.729e-04s
TIMING:bempp:_Solver.solve : 1.292e-04s
TIMING:bempp:_Solver.solve : 1.559e-04s
TIMING:bempp:_Solver.solve : 9.711e-04s
TIMING:bempp:_Solver.solve : 8.779e-04s
TIMING:bempp:_Solver.solve : 1.321e-04s
TIMING:bempp:_Solver.solve : 1.857e-04s
TIMING:bempp:_Solver.solve : 1.228e-03s
TIMING:bempp:_Solver.solve : 8.600e-04s
TIMING:bempp:_Solver.solve : 1.309e-04s
TIMING:bempp:_Solver.solve : 1.640e-04s
TIMING:bempp:_Solver.solve : 9.894e-04s
TIMING:bempp:_Solver.solve : 9.060e-04s
TIMING:bempp:_Solver.solve : 1.671e-04s
TIMING:bempp:_Solver.solve : 2.706e-04s
TIMING:bempp:_Solver.solve : 1.153e-03s
TIMING:bempp:_Solver.solve : 7.885e-04s
TIMING:bempp:_Solver.solve : 1.364e-04s
TIMING:bempp:_Solver.solve : 2.036e-04s
TIMING:bempp:_Solver.solve : 9.329e-04s
TIMING:bempp:_Solver.solve : 9.768e-04s
TIMING:bempp:_Solver.solve : 1.335e-04s
TIMING:bempp:_Solver.solve : 1.578e-04s
TIMING:bempp:_Solver.solve : 9.742e-04s
TIMING:bempp:_Solver.solve : 8.216e-04s
TIMING:bempp:_Solver.solve : 1.314e-04s
TIMING:bempp:_Solver.solve : 1.636e-04s
TIMING:bempp:_Solver.solve : 9.387e-04s
TIMING:bempp:_Solver.solve : 8.545e-04s
TIMING:bempp:_Solver.solve : 3.242e-05s
TIMING:bempp:_Solver.solve : 1.965e-04s
TIMING:bempp:_Solver.solve : 9.096e-04s
TIMING:bempp:_Solver.solve : 8.411e-04s
TIMING:bempp:_Solver.solve : 1.564e-04s
TIMING:bempp:_Solver.solve : 1.407e-04s
TIMING:bempp:_Solver.solve : 9.649e-04s
TIMING:bempp:_Solver.solve : 8.235e-04s
TIMING:bempp:_Solver.solve : 1.719e-04s
TIMING:bempp:_Solver.solve : 1.581e-04s
TIMING:bempp:_Solver.solve : 9.449e-04s
TIMING:bempp:_Solver.solve : 9.179e-04s
TIMING:bempp:_Solver.solve : 1.583e-04s
TIMING:bempp:_Solver.solve : 1.473e-04s
TIMING:bempp:_Solver.solve : 8.063e-04s
TIMING:bempp:_Solver.solve : 9.191e-04s
TIMING:bempp:_Solver.solve : 2.220e-04s
TIMING:bempp:_Solver.solve : 1.483e-04s
TIMING:bempp:_Solver.solve : 9.310e-04s
TIMING:bempp:_Solver.solve : 1.012e-03s
TIMING:bempp:_Solver.solve : 1.302e-04s
TIMING:bempp:_Solver.solve : 1.152e-04s
TIMING:bempp:_Solver.solve : 8.609e-04s
TIMING:bempp:_Solver.solve : 8.743e-04s
TIMING:bempp:_Solver.solve : 3.338e-05s
TIMING:bempp:_Solver.solve : 2.022e-04s
TIMING:bempp:_Solver.solve : 7.946e-04s
TIMING:bempp:_Solver.solve : 1.317e-03s
TIMING:bempp:_Solver.solve : 1.807e-04s
TIMING:bempp:_Solver.solve : 6.413e-05s
TIMING:bempp:_Solver.solve : 1.010e-03s
TIMING:bempp:_Solver.solve : 1.074e-03s
TIMING:bempp:_Solver.solve : 1.519e-04s
TIMING:bempp:_Solver.solve : 1.464e-04s
TIMING:bempp:_Solver.solve : 8.152e-04s
TIMING:bempp:_Solver.solve : 8.495e-04s
TIMING:bempp:_Solver.solve : 1.750e-04s
TIMING:bempp:_Solver.solve : 2.885e-05s
TIMING:bempp:_Solver.solve : 1.019e-03s
TIMING:bempp:_Solver.solve : 8.304e-04s
TIMING:bempp:_Solver.solve : 2.909e-05s
TIMING:bempp:_Solver.solve : 2.623e-05s
TIMING:bempp:_Solver.solve : 7.467e-04s
TIMING:bempp:_Solver.solve : 1.166e-03s
TIMING:bempp:_Solver.solve : 3.982e-05s
TIMING:bempp:_Solver.solve : 3.505e-05s
TIMING:bempp:_Solver.solve : 7.129e-04s
TIMING:bempp:_Solver.solve : 8.085e-04s
TIMING:bempp:_Solver.solve : 3.266e-05s
TIMING:bempp:_Solver.solve : 3.123e-05s
TIMING:bempp:_Solver.solve : 7.393e-04s
TIMING:bempp:_Solver.solve : 7.834e-04s
TIMING:bempp:_Solver.solve : 2.298e-04s
TIMING:bempp:_Solver.solve : 1.037e-04s
TIMING:bempp:_Solver.solve : 9.568e-04s
TIMING:bempp:_Solver.solve : 9.155e-04s
TIMING:bempp:_Solver.solve : 3.123e-05s
TIMING:bempp:_Solver.solve : 2.956e-05s
TIMING:bempp:_Solver.solve : 6.881e-04s
TIMING:bempp:_Solver.solve : 8.810e-04s
TIMING:bempp:_Solver.solve : 3.028e-05s
TIMING:bempp:_Solver.solve : 2.861e-05s
TIMING:bempp:_Solver.solve : 6.635e-04s
TIMING:bempp:_Solver.solve : 9.358e-04s
TIMING:bempp:_Solver.solve : 3.910e-05s
TIMING:bempp:_Solver.solve : 3.099e-05s
TIMING:bempp:_Solver.solve : 7.758e-04s
TIMING:bempp:_Solver.solve : 8.059e-04s
TIMING:bempp:_Solver.solve : 1.156e-04s
TIMING:bempp:_Solver.solve : 1.330e-04s
TIMING:bempp:_Solver.solve : 7.875e-04s
TIMING:bempp:_Solver.solve : 7.737e-04s
TIMING:bempp:_Solver.solve : 3.052e-05s
TIMING:bempp:_Solver.solve : 2.646e-05s
TIMING:bempp:_Solver.solve : 6.828e-04s
TIMING:bempp:_Solver.solve : 1.284e-03s
TIMING:bempp:_Solver.solve : 3.982e-05s
TIMING:bempp:_Solver.solve : 3.886e-05s
TIMING:bempp:_Solver.solve : 8.783e-04s
TIMING:bempp:_Solver.solve : 1.065e-03s
TIMING:bempp:_Solver.solve : 3.099e-05s
TIMING:bempp:_Solver.solve : 2.813e-05s
TIMING:bempp:_Solver.solve : 7.150e-04s
TIMING:bempp:_Solver.solve : 9.940e-04s
TIMING:bempp:_Solver.solve : 3.147e-05s
TIMING:bempp:_Solver.solve : 2.766e-05s
TIMING:bempp:_Solver.solve : 7.133e-04s
TIMING:bempp:_Solver.solve : 8.228e-04s
TIMING:bempp:_Solver.solve : 2.909e-05s
TIMING:bempp:_Solver.solve : 2.575e-05s
TIMING:bempp:_Solver.solve : 6.821e-04s
TIMING:bempp:_Solver.solve : 7.975e-04s
TIMING:bempp:_Solver.solve : 1.431e-04s
TIMING:bempp:_Solver.solve : 1.299e-04s
TIMING:bempp:_Solver.solve : 7.699e-04s
TIMING:bempp:_Solver.solve : 8.125e-04s
TIMING:bempp:_Solver.solve : 1.333e-04s
TIMING:bempp:_Solver.solve : 1.321e-04s
TIMING:bempp:_Solver.solve : 7.551e-04s
TIMING:bempp:_Solver.solve : 9.153e-04s
TIMING:bempp:_Solver.solve : 3.123e-05s
TIMING:bempp:_Solver.solve : 3.052e-05s
TIMING:bempp:_Solver.solve : 7.625e-04s
TIMING:bempp:_Solver.solve : 7.913e-04s
TIMING:bempp:_Solver.solve : 3.099e-05s
TIMING:bempp:_Solver.solve : 3.076e-05s
TIMING:bempp:_Solver.solve : 7.832e-04s
TIMING:bempp:_Solver.solve : 9.110e-04s
TIMING:bempp:_Solver.solve : 3.028e-05s
TIMING:bempp:_Solver.solve : 2.885e-05s
TIMING:bempp:_Solver.solve : 6.731e-04s
TIMING:bempp:_Solver.solve : 7.787e-04s
TIMING:bempp:_Solver.solve : 1.178e-04s
TIMING:bempp:_Solver.solve : 1.371e-04s
TIMING:bempp:_Solver.solve : 7.672e-04s
TIMING:bempp:_Solver.solve : 8.984e-04s
TIMING:bempp:_Solver.solve : 1.154e-04s
TIMING:bempp:_Solver.solve : 1.299e-04s
TIMING:bempp:_Solver.solve : 7.405e-04s
TIMING:bempp:_Solver.solve : 1.014e-03s
TIMING:bempp:_Solver.solve : 3.099e-05s
TIMING:bempp:_Solver.solve : 1.905e-04s
TIMING:bempp:_Solver.solve : 7.696e-04s
TIMING:bempp:_Solver.solve : 9.317e-04s
TIMING:bempp:_Solver.solve : 2.980e-05s
TIMING:bempp:_Solver.solve : 2.646e-05s
TIMING:bempp:_Solver.solve : 6.814e-04s
TIMING:bempp:_Solver.solve : 1.054e-03s
TIMING:bempp:_Solver.solve : 3.958e-05s
TIMING:bempp:_Solver.solve : 1.614e-04s
TIMING:bempp:_Solver.solve : 8.748e-04s
TIMING:bempp:_Solver.solve : 8.898e-04s
TIMING:bempp:_Solver.solve : 3.171e-05s
TIMING:bempp:_Solver.solve : 2.742e-05s
TIMING:bempp:_Solver.solve : 7.162e-04s
TIMING:bempp:_Solver.solve : 8.552e-04s
TIMING:bempp:_Solver.solve : 3.123e-05s
TIMING:bempp:_Solver.solve : 7.629e-05s
TIMING:bempp:_Solver.solve : 7.591e-04s
TIMING:bempp:_Solver.solve : 1.103e-03s
TIMING:bempp:_Solver.solve : 2.885e-05s
TIMING:bempp:_Solver.solve : 2.670e-05s
TIMING:bempp:_Solver.solve : 6.757e-04s
TIMING:bempp:_Solver.solve : 9.403e-04s
TIMING:bempp:_Solver.solve : 3.386e-05s
TIMING:bempp:_Solver.solve : 3.004e-05s
TIMING:bempp:_Solver.solve : 7.639e-04s
TIMING:bempp:_Solver.solve : 8.948e-04s
TIMING:bempp:_Solver.solve : 2.313e-04s
TIMING:bempp:_Solver.solve : 1.936e-04s
TIMING:bempp:_Solver.solve : 1.116e-03s
TIMING:bempp:_Solver.solve : 7.756e-04s
TIMING:bempp:_Solver.solve : 3.028e-05s
TIMING:bempp:_Solver.solve : 2.718e-05s
TIMING:bempp:_Solver.solve : 7.844e-04s
TIMING:bempp:_Solver.solve : 1.004e-03s
TIMING:bempp:_Solver.solve : 8.106e-05s
TIMING:bempp:_Solver.solve : 2.789e-05s
TIMING:bempp:_Solver.solve : 7.961e-04s
TIMING:bempp:_Solver.solve : 8.743e-04s
TIMING:bempp:_Solver.solve : 2.933e-05s
TIMING:bempp:_Solver.solve : 1.931e-04s
TIMING:bempp:_Solver.solve : 8.113e-04s
TIMING:bempp:_Solver.solve : 9.673e-04s
TIMING:bempp:_Solver.solve : 2.980e-05s
TIMING:bempp:_Solver.solve : 5.364e-05s
TIMING:bempp:_Solver.solve : 7.625e-04s
TIMING:bempp:_Solver.solve : 7.482e-04s
TIMING:bempp:_Solver.solve : 2.909e-05s
TIMING:bempp:_Solver.solve : 2.694e-05s
TIMING:bempp:_Solver.solve : 7.658e-04s
TIMING:bempp:_Solver.solve : 7.985e-04s
TIMING:bempp:_Solver.solve : 3.743e-05s
TIMING:bempp:_Solver.solve : 2.766e-05s
TIMING:bempp:_Solver.solve : 7.753e-04s
TIMING:bempp:_Solver.solve : 1.381e-03s
TIMING:bempp:_Solver.solve : 3.314e-05s
TIMING:bempp:_Solver.solve : 3.552e-05s
TIMING:bempp:_Solver.solve : 7.865e-04s
TIMING:bempp:_Solver.solve : 1.002e-03s
TIMING:bempp:_Solver.solve : 3.338e-05s
TIMING:bempp:_Solver.solve : 3.219e-05s
TIMING:bempp:_Solver.solve : 8.779e-04s
TIMING:bempp:_Solver.solve : 1.071e-03s
TIMING:bempp:_Solver.solve : 2.980e-05s
TIMING:bempp:_Solver.solve : 2.599e-05s
TIMING:bempp:_Solver.solve : 6.752e-04s
TIMING:bempp:_Solver.solve : 1.159e-03s
TIMING:bempp:_Solver.solve : 3.386e-05s
TIMING:bempp:_Solver.solve : 3.028e-05s
TIMING:bempp:_Solver.solve : 7.625e-04s
TIMING:bempp:_Solver.solve : 1.010e-03s
TIMING:bempp:_Solver.solve : 6.747e-05s
TIMING:bempp:_Solver.solve : 5.937e-05s
TIMING:bempp:_Solver.solve : 9.420e-04s
TIMING:bempp:_Solver.solve : 8.259e-04s
TIMING:bempp:_Solver.solve : 2.956e-05s
TIMING:bempp:_Solver.solve : 2.599e-05s
TIMING:bempp:_Solver.solve : 6.890e-04s
TIMING:bempp:_Solver.solve : 8.676e-04s
TIMING:bempp:_Solver.solve : 2.933e-05s
TIMING:bempp:_Solver.solve : 2.575e-05s
TIMING:bempp:_Solver.solve : 7.906e-04s
TIMING:bempp:_Solver.solve : 9.704e-04s
TIMING:bempp:_Solver.solve : 2.956e-05s
TIMING:bempp:_Solver.solve : 2.694e-05s
TIMING:bempp:_Solver.solve : 6.683e-04s
TIMING:bempp:_Solver.solve : 7.670e-04s
TIMING:bempp:_Solver.solve : 2.813e-05s
TIMING:bempp:_Solver.solve : 2.575e-05s
TIMING:bempp:_Solver.solve : 6.487e-04s
TIMING:bempp:_Solver.solve : 1.050e-03s
TIMING:bempp:_Solver.solve : 3.219e-05s
TIMING:bempp:_Solver.solve : 2.837e-05s
TIMING:bempp:_Solver.solve : 7.055e-04s
TIMING:bempp:_Solver.solve : 9.456e-04s
TIMING:bempp:_Solver.solve : 3.910e-05s
TIMING:bempp:_Solver.solve : 3.290e-05s
TIMING:bempp:_Solver.solve : 7.801e-04s
TIMING:bempp:_Solver.solve : 1.014e-03s
TIMING:bempp:_Solver.solve : 2.813e-05s
TIMING:bempp:_Solver.solve : 2.599e-05s
TIMING:bempp:_Solver.solve : 7.193e-04s
TIMING:bempp:_Solver.solve : 8.996e-04s
TIMING:bempp:_Solver.solve : 1.199e-04s
TIMING:bempp:_Solver.solve : 1.156e-04s
TIMING:bempp:_Solver.solve : 7.031e-04s
TIMING:bempp:_Solver.solve : 7.637e-04s
TIMING:bempp:_Solver.solve : 2.980e-05s
TIMING:bempp:_Solver.solve : 2.742e-05s
TIMING:bempp:_Solver.solve : 7.741e-04s
TIMING:bempp:_Solver.solve : 7.689e-04s
TIMING:bempp:_Solver.solve : 2.766e-05s
TIMING:bempp:_Solver.solve : 2.575e-05s
TIMING:bempp:_Solver.solve : 6.800e-04s
TIMING:bempp:_Solver.solve : 1.248e-03s
TIMING:bempp:_Solver.solve : 1.805e-04s
TIMING:bempp:_Solver.solve : 3.028e-05s
TIMING:bempp:_Solver.solve : 7.985e-04s
TIMING:bempp:_Solver.solve : 8.991e-04s
TIMING:bempp:_Solver.solve : 3.290e-05s
TIMING:bempp:_Solver.solve : 2.069e-04s
TIMING:bempp:_Solver.solve : 8.328e-04s
TIMING:bempp:_Solver.solve : 8.013e-04s
TIMING:bempp:_Solver.solve : 3.004e-05s
TIMING:bempp:_Solver.solve : 2.599e-05s
TIMING:bempp:_Solver.solve : 7.248e-04s
TIMING:bempp:_Solver.solve : 9.654e-04s
TIMING:bempp:_Solver.solve : 3.052e-05s
TIMING:bempp:_Solver.solve : 2.837e-05s
TIMING:bempp:_Solver.solve : 6.781e-04s
TIMING:bempp:_Solver.solve : 8.404e-04s
TIMING:bempp:_Solver.solve : 5.388e-05s
TIMING:bempp:_Solver.solve : 1.266e-04s
TIMING:bempp:_Solver.solve : 7.939e-04s
TIMING:bempp:_Solver.solve : 8.543e-04s
TIMING:bempp:_Solver.solve : 2.718e-05s
TIMING:bempp:_Solver.solve : 2.646e-05s
TIMING:bempp:_Solver.solve : 6.206e-04s
TIMING:bempp:_Solver.solve : 8.314e-04s
TIMING:bempp:_Solver.solve : 1.214e-04s
TIMING:bempp:_Solver.solve : 1.163e-04s
TIMING:bempp:_Solver.solve : 7.126e-04s
TIMING:bempp:_Solver.solve : 7.923e-04s
TIMING:bempp:_Solver.solve : 2.885e-05s
TIMING:bempp:_Solver.solve : 1.779e-04s
TIMING:bempp:_Solver.solve : 8.543e-04s
TIMING:bempp:_Solver.solve : 7.830e-04s
TIMING:bempp:_Solver.solve : 1.476e-04s
TIMING:bempp:_Solver.solve : 1.469e-04s
TIMING:bempp:_Solver.solve : 8.256e-04s
TIMING:bempp:_Solver.solve : 7.710e-04s
TIMING:bempp:_Solver.solve : 2.956e-05s
TIMING:bempp:_Solver.solve : 2.670e-05s
TIMING:bempp:_Solver.solve : 8.707e-04s
TIMING:bempp:_Solver.solve : 9.985e-04s
TIMING:bempp:_Solver.solve : 3.004e-05s
TIMING:bempp:_Solver.solve : 2.694e-05s
TIMING:bempp:_Solver.solve : 6.664e-04s
TIMING:bempp:_Solver.solve : 9.685e-04s
TIMING:bempp:_Solver.solve : 2.837e-05s
TIMING:bempp:_Solver.solve : 2.718e-05s
TIMING:bempp:_Solver.solve : 7.331e-04s
TIMING:bempp:_Solver.solve : 9.124e-04s
TIMING:bempp:_Solver.solve : 3.076e-05s
TIMING:bempp:_Solver.solve : 2.646e-05s
TIMING:bempp:_Solver.solve : 6.707e-04s
TIMING:bempp:_Solver.solve : 8.008e-04s
TIMING:bempp:_Solver.solve : 3.147e-05s
TIMING:bempp:_Solver.solve : 2.670e-05s
TIMING:bempp:_Solver.solve : 6.807e-04s
TIMING:bempp:_Solver.solve : 7.713e-04s
TIMING:bempp:_Solver.solve : 2.861e-05s
TIMING:bempp:_Solver.solve : 2.766e-05s
TIMING:bempp:_Solver.solve : 8.893e-04s
TIMING:bempp:_Solver.solve : 8.109e-04s
TIMING:bempp:_Solver.solve : 5.388e-05s
TIMING:bempp:_Solver.solve : 2.933e-05s
TIMING:bempp:_Solver.solve : 7.088e-04s
TIMING:bempp:_Solver.solve : 9.913e-04s
TIMING:bempp:_Solver.solve : 3.099e-05s
TIMING:bempp:_Solver.solve : 1.893e-04s
TIMING:bempp:_Solver.solve : 9.179e-04s
TIMING:bempp:_Solver.solve : 8.721e-04s
TIMING:bempp:_Solver.solve : 2.885e-05s
TIMING:bempp:_Solver.solve : 2.575e-05s
TIMING:bempp:_Solver.solve : 7.043e-04s
TIMING:bempp:_Solver.solve : 7.699e-04s
TIMING:bempp:_Solver.solve : 2.909e-05s
TIMING:bempp:_Solver.solve : 2.646e-05s
TIMING:bempp:_Solver.solve : 6.700e-04s
TIMING:bempp:_Solver.solve : 8.259e-04s
TIMING:bempp:_Solver.solve : 3.028e-05s
TIMING:bempp:_Solver.solve : 2.317e-04s
TIMING:bempp:_Solver.solve : 9.050e-04s
TIMING:bempp:_Solver.solve : 7.606e-04s
TIMING:bempp:_Solver.solve : 2.885e-05s
TIMING:bempp:_Solver.solve : 2.623e-05s
TIMING:bempp:_Solver.solve : 6.416e-04s
TIMING:bempp:_Solver.solve : 1.021e-03s
TIMING:bempp:_Solver.solve : 3.314e-05s
TIMING:bempp:_Solver.solve : 2.410e-04s
TIMING:bempp:_Solver.solve : 9.196e-04s
TIMING:bempp:_Solver.solve : 7.873e-04s
TIMING:bempp:_Solver.solve : 3.052e-05s
TIMING:bempp:_Solver.solve : 2.670e-05s
TIMING:bempp:_Solver.solve : 7.713e-04s
TIMING:bempp:_Solver.solve : 8.078e-04s
TIMING:bempp:_Solver.solve : 1.566e-04s
TIMING:bempp:_Solver.solve : 1.392e-04s
TIMING:bempp:_Solver.solve : 8.557e-04s
TIMING:bempp:_Solver.solve : 7.634e-04s
TIMING:bempp:_Solver.solve : 2.837e-05s
TIMING:bempp:_Solver.solve : 2.575e-05s
TIMING:bempp:_Solver.solve : 6.127e-04s
TIMING:bempp:_Solver.solve : 9.358e-04s
TIMING:bempp:_Solver.solve : 3.219e-05s
TIMING:bempp:_Solver.solve : 3.004e-05s
TIMING:bempp:_Solver.solve : 7.930e-04s
TIMING:bempp:_Solver.solve : 8.845e-04s
TIMING:bempp:_Solver.solve : 1.106e-04s
TIMING:bempp:_Solver.solve : 1.678e-04s
TIMING:bempp:_Solver.solve : 9.129e-04s
TIMING:bempp:_Solver.solve : 8.597e-04s
TIMING:bempp:_Solver.solve : 3.004e-05s
TIMING:bempp:_Solver.solve : 2.670e-05s
TIMING:bempp:_Solver.solve : 1.089e-03s
TIMING:bempp:_Solver.solve : 8.030e-04s
TIMING:bempp:_Solver.solve : 3.147e-05s
TIMING:bempp:_Solver.solve : 2.260e-04s
TIMING:bempp:_Solver.solve : 9.875e-04s
TIMING:bempp:_Solver.solve : 8.254e-04s
TIMING:bempp:_Solver.solve : 2.980e-05s
TIMING:bempp:_Solver.solve : 1.886e-04s
TIMING:bempp:_Solver.solve : 7.875e-04s
TIMING:bempp:_Solver.solve : 8.574e-04s
TIMING:bempp:_Solver.solve : 2.980e-05s
TIMING:bempp:_Solver.solve : 2.789e-05s
TIMING:bempp:_Solver.solve : 7.846e-04s
TIMING:bempp:_Solver.solve : 8.905e-04s
TIMING:bempp:_Solver.solve : 5.770e-05s
TIMING:bempp:_Solver.solve : 7.892e-05s
TIMING:bempp:_Solver.solve : 7.753e-04s
TIMING:bempp:_Solver.solve : 8.838e-04s
TIMING:bempp:_Solver.solve : 1.109e-04s
TIMING:bempp:_Solver.solve : 1.447e-04s
TIMING:bempp:_Solver.solve : 7.291e-04s
TIMING:bempp:_Solver.solve : 9.143e-04s
TIMING:bempp:_Solver.solve : 1.495e-04s
TIMING:bempp:_Solver.solve : 1.504e-04s
TIMING:bempp:_Solver.solve : 8.612e-04s
TIMING:bempp:_Solver.solve : 7.725e-04s
TIMING:bempp:_Solver.solve : 2.956e-05s
TIMING:bempp:_Solver.solve : 1.674e-04s
TIMING:bempp:_Solver.solve : 7.346e-04s
TIMING:bempp:_Solver.solve : 8.109e-04s
TIMING:bempp:_Solver.solve : 2.909e-05s
TIMING:bempp:_Solver.solve : 2.766e-05s
TIMING:bempp:_Solver.solve : 7.334e-04s
TIMING:bempp:_Solver.solve : 8.266e-04s
TIMING:bempp:_Solver.solve : 3.052e-05s
TIMING:bempp:_Solver.solve : 3.242e-05s
TIMING:bempp:_Solver.solve : 7.696e-04s
TIMING:bempp:_Solver.solve : 8.099e-04s
TIMING:bempp:_Solver.solve : 1.256e-04s
TIMING:bempp:_Solver.solve : 1.121e-04s
TIMING:bempp:_Solver.solve : 7.157e-04s
TIMING:bempp:_Solver.solve : 7.975e-04s
TIMING:bempp:_Solver.solve : 1.366e-04s
TIMING:bempp:_Solver.solve : 1.233e-04s
TIMING:bempp:_Solver.solve : 7.782e-04s
TIMING:bempp:_Solver.solve : 7.451e-04s
TIMING:bempp:_Solver.solve : 2.742e-05s
TIMING:bempp:_Solver.solve : 2.789e-05s
TIMING:bempp:_Solver.solve : 7.544e-04s
TIMING:bempp:_Solver.solve : 9.091e-04s
TIMING:bempp:_Solver.solve : 3.409e-05s
TIMING:bempp:_Solver.solve : 2.837e-05s
TIMING:bempp:_Solver.solve : 7.663e-04s
TIMING:bempp:_Solver.solve : 8.328e-04s
TIMING:bempp:_Solver.solve : 2.980e-05s
TIMING:bempp:_Solver.solve : 2.813e-05s
TIMING:bempp:_Solver.solve : 7.994e-04s
TIMING:bempp:_Solver.solve : 9.403e-04s
TIMING:bempp:_Solver.solve : 2.861e-05s
TIMING:bempp:_Solver.solve : 5.794e-05s
TIMING:bempp:_Solver.solve : 1.014e-03s
TIMING:bempp:_Solver.solve : 1.041e-03s
TIMING:bempp:_Solver.solve : 3.552e-05s
TIMING:bempp:_Solver.solve : 2.670e-05s
TIMING:bempp:_Solver.solve : 6.859e-04s
TIMING:bempp:_Solver.solve : 7.877e-04s
TIMING:bempp:_Solver.solve : 2.885e-05s
TIMING:bempp:_Solver.solve : 6.056e-05s
TIMING:bempp:_Solver.solve : 7.474e-04s
TIMING:bempp:_Solver.solve : 8.681e-04s
TIMING:bempp:_Solver.solve : 2.885e-05s
TIMING:bempp:_Solver.solve : 2.503e-05s
TIMING:bempp:_Solver.solve : 7.019e-04s
TIMING:bempp:_Solver.solve : 8.023e-04s
TIMING:bempp:_Solver.solve : 2.980e-05s
TIMING:bempp:_Solver.solve : 2.544e-04s
TIMING:bempp:_Solver.solve : 8.557e-04s
TIMING:bempp:_Solver.solve : 8.774e-04s
TIMING:bempp:_Solver.solve : 2.980e-05s
TIMING:bempp:_Solver.solve : 2.575e-05s
TIMING:bempp:_Solver.solve : 6.733e-04s
TIMING:bempp:_Solver.solve : 8.707e-04s
TIMING:bempp:_Solver.solve : 2.885e-05s
TIMING:bempp:_Solver.solve : 2.599e-05s
TIMING:bempp:_Solver.solve : 7.441e-04s
TIMING:bempp:_Solver.solve : 7.961e-04s
TIMING:bempp:_Solver.solve : 1.431e-04s
TIMING:bempp:_Solver.solve : 1.075e-04s
TIMING:bempp:_Solver.solve : 8.585e-04s
TIMING:bempp:_Solver.solve : 8.388e-04s
TIMING:bempp:_Solver.solve : 2.980e-05s
TIMING:bempp:_Solver.solve : 2.077e-04s
TIMING:bempp:_Solver.solve : 7.350e-04s
TIMING:bempp:_Solver.solve : 9.706e-04s
TIMING:bempp:_Solver.solve : 3.028e-05s
TIMING:bempp:_Solver.solve : 2.072e-04s
TIMING:bempp:_Solver.solve : 8.371e-04s
TIMING:bempp:_Solver.solve : 8.144e-04s
TIMING:bempp:_Solver.solve : 2.956e-05s
TIMING:bempp:_Solver.solve : 2.575e-05s
TIMING:bempp:_Solver.solve : 6.566e-04s
TIMING:bempp:_Solver.solve : 8.376e-04s
TIMING:bempp:_Solver.solve : 3.767e-05s
TIMING:bempp:_Solver.solve : 7.629e-05s
TIMING:bempp:_Solver.solve : 8.314e-04s
TIMING:bempp:_Solver.solve : 7.715e-04s
TIMING:bempp:_Solver.solve : 1.252e-04s
TIMING:bempp:_Solver.solve : 1.321e-04s
TIMING:bempp:_Solver.solve : 7.391e-04s
TIMING:bempp:_Solver.solve : 1.102e-03s
TIMING:bempp:_Solver.solve : 2.980e-05s
TIMING:bempp:_Solver.solve : 2.670e-05s
TIMING:bempp:_Solver.solve : 7.222e-04s
TIMING:bempp:_Solver.solve : 9.072e-04s
TIMING:bempp:_Solver.solve : 3.052e-05s
TIMING:bempp:_Solver.solve : 7.939e-05s
TIMING:bempp:_Solver.solve : 1.105e-03s
TIMING:bempp:_Solver.solve : 8.852e-04s
TIMING:bempp:_Solver.solve : 1.209e-04s
TIMING:bempp:_Solver.solve : 1.409e-04s
TIMING:bempp:_Solver.solve : 7.353e-04s
TIMING:bempp:_Solver.solve : 8.545e-04s
TIMING:bempp:_Solver.solve : 3.076e-05s
TIMING:bempp:_Solver.solve : 2.646e-05s
TIMING:bempp:_Solver.solve : 7.460e-04s
TIMING:bempp:_Solver.solve : 7.846e-04s
TIMING:bempp:_Solver.solve : 2.837e-05s
TIMING:bempp:_Solver.solve : 2.670e-05s
TIMING:bempp:_Solver.solve : 6.840e-04s
TIMING:bempp:_Solver.solve : 1.024e-03s
TIMING:bempp:_Solver.solve : 3.481e-05s
TIMING:bempp:_Solver.solve : 2.837e-05s
TIMING:bempp:_Solver.solve : 1.011e-03s
TIMING:bempp:_Solver.solve : 8.836e-04s
TIMING:bempp:_Solver.solve : 3.409e-05s
TIMING:bempp:_Solver.solve : 3.099e-05s
TIMING:bempp:_Solver.solve : 7.524e-04s
TIMING:bempp:_Solver.solve : 8.304e-04s
TIMING:bempp:_Solver.solve : 1.159e-04s
TIMING:bempp:_Solver.solve : 1.442e-04s
TIMING:bempp:_Solver.solve : 7.365e-04s
TIMING:bempp:_Solver.solve : 8.807e-04s
TIMING:bempp:_Solver.solve : 1.700e-04s
TIMING:bempp:_Solver.solve : 2.742e-05s
TIMING:bempp:_Solver.solve : 8.399e-04s
TIMING:bempp:_Solver.solve : 8.776e-04s
TIMING:bempp:_Solver.solve : 2.933e-05s
TIMING:bempp:_Solver.solve : 2.599e-05s
TIMING:bempp:_Solver.solve : 6.721e-04s
TIMING:bempp:_Solver.solve : 1.028e-03s
TIMING:bempp:_Solver.solve : 2.956e-05s
TIMING:bempp:_Solver.solve : 2.646e-05s
TIMING:bempp:_Solver.solve : 7.219e-04s
TIMING:bempp:_Solver.solve : 8.123e-04s
TIMING:bempp:_Solver.solve : 1.709e-04s
TIMING:bempp:_Solver.solve : 1.123e-04s
TIMING:bempp:_Solver.solve : 8.078e-04s
TIMING:bempp:_Solver.solve : 8.316e-04s
TIMING:bempp:_Solver.solve : 1.166e-04s
TIMING:bempp:_Solver.solve : 1.328e-04s
TIMING:bempp:_Solver.solve : 7.341e-04s
TIMING:bempp:_Solver.solve : 8.926e-04s
TIMING:bempp:_Solver.solve : 1.616e-04s
TIMING:bempp:_Solver.solve : 1.342e-04s
TIMING:bempp:_Solver.solve : 7.768e-04s
TIMING:bempp:_Solver.solve : 7.553e-04s
TIMING:bempp:_Solver.solve : 1.092e-04s
TIMING:bempp:_Solver.solve : 1.409e-04s
TIMING:bempp:_Solver.solve : 7.980e-04s
TIMING:bempp:_Solver.solve : 8.533e-04s
TIMING:bempp:_Solver.solve : 7.772e-05s
TIMING:bempp:_Solver.solve : 2.599e-05s
TIMING:bempp:_Solver.solve : 7.429e-04s
TIMING:bempp:_Solver.solve : 9.735e-04s
TIMING:bempp:_Solver.solve : 3.004e-05s
TIMING:bempp:_Solver.solve : 2.034e-04s
TIMING:bempp:_Solver.solve : 8.402e-04s
TIMING:bempp:_Solver.solve : 8.748e-04s
TIMING:bempp:_Solver.solve : 1.204e-04s
TIMING:bempp:_Solver.solve : 1.400e-04s
TIMING:bempp:_Solver.solve : 7.346e-04s
TIMING:bempp:_Solver.solve : 8.864e-04s
TIMING:bempp:_Solver.solve : 3.290e-05s
TIMING:bempp:_Solver.solve : 2.067e-04s
TIMING:bempp:_Solver.solve : 8.714e-04s
TIMING:bempp:_Solver.solve : 7.923e-04s
TIMING:bempp:_Solver.solve : 1.223e-04s
TIMING:bempp:_Solver.solve : 1.254e-04s
TIMING:bempp:_Solver.solve : 7.582e-04s
TIMING:bempp:_Solver.solve : 8.876e-04s
TIMING:bempp:_Solver.solve : 2.813e-05s
TIMING:bempp:_Solver.solve : 2.575e-05s
TIMING:bempp:_Solver.solve : 8.633e-04s
TIMING:bempp:_Solver.solve : 8.719e-04s
TIMING:bempp:_Solver.solve : 1.130e-04s
TIMING:bempp:_Solver.solve : 1.366e-04s
TIMING:bempp:_Solver.solve : 7.782e-04s
TIMING:bempp:_Solver.solve : 8.402e-04s
TIMING:bempp:_Solver.solve : 2.837e-05s
TIMING:bempp:_Solver.solve : 2.623e-05s
TIMING:bempp:_Solver.solve : 6.719e-04s
TIMING:bempp:_Solver.solve : 8.302e-04s
TIMING:bempp:_Solver.solve : 3.076e-05s
TIMING:bempp:_Solver.solve : 2.718e-05s
TIMING:bempp:_Solver.solve : 7.412e-04s
TIMING:bempp:_Solver.solve : 7.615e-04s
TIMING:bempp:_Solver.solve : 2.885e-05s
TIMING:bempp:_Solver.solve : 1.683e-04s
TIMING:bempp:_Solver.solve : 7.601e-04s
TIMING:bempp:_Solver.solve : 1.001e-03s
TIMING:bempp:_Solver.solve : 3.266e-05s
TIMING:bempp:_Solver.solve : 2.885e-05s
TIMING:bempp:_Solver.solve : 7.408e-04s
TIMING:bempp:_Solver.solve : 8.438e-04s
TIMING:bempp:_Solver.solve : 2.980e-05s
TIMING:bempp:_Solver.solve : 2.623e-05s
TIMING:bempp:_Solver.solve : 7.393e-04s
TIMING:bempp:_Solver.solve : 8.175e-04s
TIMING:bempp:_Solver.solve : 2.766e-05s
TIMING:bempp:_Solver.solve : 1.469e-04s
TIMING:bempp:_Solver.solve : 6.795e-04s
TIMING:bempp:_Solver.solve : 9.582e-04s
TIMING:bempp:_Solver.solve : 2.909e-05s
TIMING:bempp:_Solver.solve : 2.575e-05s
TIMING:bempp:_Solver.solve : 7.069e-04s
TIMING:bempp:_Solver.solve : 7.644e-04s
TIMING:bempp:_Solver.solve : 2.789e-05s
TIMING:bempp:_Solver.solve : 2.599e-05s
TIMING:bempp:_Solver.solve : 6.888e-04s
TIMING:bempp:_Solver.solve : 8.492e-04s
TIMING:bempp:_Solver.solve : 2.933e-05s
TIMING:bempp:_Solver.solve : 2.646e-05s
TIMING:bempp:_Solver.solve : 7.894e-04s
TIMING:bempp:_Solver.solve : 8.767e-04s
TIMING:bempp:_Solver.solve : 2.789e-05s
TIMING:bempp:_Solver.solve : 2.327e-04s
TIMING:bempp:_Solver.solve : 9.317e-04s
TIMING:bempp:_Solver.solve : 7.668e-04s
TIMING:bempp:_Solver.solve : 2.837e-05s
TIMING:bempp:_Solver.solve : 2.623e-05s
TIMING:bempp:_Solver.solve : 6.886e-04s
TIMING:bempp:_Solver.solve : 8.273e-04s
TIMING:bempp:_Solver.solve : 3.004e-05s
TIMING:bempp:_Solver.solve : 2.670e-05s
TIMING:bempp:_Solver.solve : 7.353e-04s
TIMING:bempp:_Solver.solve : 8.230e-04s
TIMING:bempp:_Solver.solve : 1.190e-04s
TIMING:bempp:_Solver.solve : 1.605e-04s
TIMING:bempp:_Solver.solve : 8.678e-04s
TIMING:bempp:_Solver.solve : 8.283e-04s
TIMING:bempp:_Solver.solve : 1.221e-04s
TIMING:bempp:_Solver.solve : 1.402e-04s
TIMING:bempp:_Solver.solve : 7.391e-04s
TIMING:bempp:_Solver.solve : 9.961e-04s
TIMING:bempp:_Solver.solve : 2.956e-05s
TIMING:bempp:_Solver.solve : 2.885e-05s
TIMING:bempp:_Solver.solve : 7.477e-04s
TIMING:bempp:_Solver.solve : 9.437e-04s
TIMING:bempp:_Solver.solve : 2.837e-05s
TIMING:bempp:_Solver.solve : 2.551e-05s
TIMING:bempp:_Solver.solve : 6.814e-04s
TIMING:bempp:_Solver.solve : 1.156e-03s
TIMING:bempp:_Solver.solve : 3.219e-05s
TIMING:bempp:_Solver.solve : 2.043e-04s
TIMING:bempp:_Solver.solve : 8.123e-04s
TIMING:bempp:_Solver.solve : 8.984e-04s
TIMING:bempp:_Solver.solve : 1.557e-04s
TIMING:bempp:_Solver.solve : 1.249e-04s
TIMING:bempp:_Solver.solve : 7.737e-04s
TIMING:bempp:_Solver.solve : 8.090e-04s
TIMING:bempp:_Solver.solve : 2.956e-05s
TIMING:bempp:_Solver.solve : 1.972e-04s
TIMING:bempp:_Solver.solve : 7.770e-04s
TIMING:bempp:_Solver.solve : 8.225e-04s
TIMING:bempp:_Solver.solve : 2.394e-04s
TIMING:bempp:_Solver.solve : 2.933e-05s
TIMING:bempp:_Solver.solve : 1.014e-03s
TIMING:bempp:_Solver.solve : 9.124e-04s
TIMING:bempp:_Solver.solve : 1.113e-04s
TIMING:bempp:_Solver.solve : 1.342e-04s
TIMING:bempp:_Solver.solve : 7.157e-04s
TIMING:bempp:_Solver.solve : 8.974e-04s
TIMING:bempp:_Solver.solve : 2.837e-05s
TIMING:bempp:_Solver.solve : 2.148e-04s
TIMING:bempp:_Solver.solve : 8.397e-04s
TIMING:bempp:_Solver.solve : 7.880e-04s
TIMING:bempp:_Solver.solve : 2.813e-05s
TIMING:bempp:_Solver.solve : 2.575e-05s
TIMING:bempp:_Solver.solve : 6.855e-04s
TIMING:bempp:_Solver.solve : 9.236e-04s
TIMING:bempp:_Solver.solve : 3.576e-05s
TIMING:bempp:_Solver.solve : 3.147e-05s
TIMING:bempp:_Solver.solve : 7.629e-04s
TIMING:bempp:_Solver.solve : 8.502e-04s
TIMING:bempp:_Solver.solve : 2.885e-05s
TIMING:bempp:_Solver.solve : 2.129e-04s
TIMING:bempp:_Solver.solve : 8.337e-04s
TIMING:bempp:_Solver.solve : 9.201e-04s
TIMING:bempp:_Solver.solve : 2.885e-05s
TIMING:bempp:_Solver.solve : 2.980e-05s
TIMING:bempp:_Solver.solve : 7.441e-04s
TIMING:bempp:_Solver.solve : 8.171e-04s
TIMING:bempp:_Solver.solve : 2.980e-05s
TIMING:bempp:_Solver.solve : 2.623e-05s
TIMING:bempp:_Solver.solve : 6.809e-04s
TIMING:bempp:_Solver.solve : 7.994e-04s
TIMING:bempp:_Solver.solve : 9.131e-05s
TIMING:bempp:_Solver.solve : 1.366e-04s
TIMING:bempp:_Solver.solve : 8.008e-04s
TIMING:bempp:_Solver.solve : 8.862e-04s
TIMING:bempp:_Solver.solve : 2.956e-05s
TIMING:bempp:_Solver.solve : 3.145e-04s
TIMING:bempp:_Solver.solve : 1.088e-03s
TIMING:bempp:_Solver.solve : 7.896e-04s
TIMING:bempp:_Solver.solve : 3.195e-05s
TIMING:bempp:_Solver.solve : 1.004e-04s
TIMING:bempp:_Solver.solve : 1.154e-03s
TIMING:bempp:_Solver.solve : 8.876e-04s
TIMING:bempp:_Solver.solve : 2.933e-05s
TIMING:bempp:_Solver.solve : 2.623e-05s
TIMING:bempp:_Solver.solve : 9.277e-04s
TIMING:bempp:_Solver.solve : 9.077e-04s
TIMING:bempp:_Solver.solve : 2.933e-05s
TIMING:bempp:_Solver.solve : 2.861e-05s
TIMING:bempp:_Solver.solve : 7.095e-04s
TIMING:bempp:_Solver.solve : 9.389e-04s
TIMING:bempp:_Solver.solve : 3.290e-05s
TIMING:bempp:_Solver.solve : 2.127e-04s
TIMING:bempp:_Solver.solve : 8.843e-04s
TIMING:bempp:_Solver.solve : 9.282e-04s
TIMING:bempp:_Solver.solve : 2.718e-05s
TIMING:bempp:_Solver.solve : 2.670e-05s
TIMING:bempp:_Solver.solve : 6.180e-04s
TIMING:bempp:_Solver.solve : 9.253e-04s
TIMING:bempp:_Solver.solve : 2.933e-05s
TIMING:bempp:_Solver.solve : 2.742e-05s
TIMING:bempp:_Solver.solve : 7.198e-04s
TIMING:bempp:_Solver.solve : 8.132e-04s
TIMING:bempp:_Solver.solve : 2.885e-05s
TIMING:bempp:_Solver.solve : 2.623e-05s
TIMING:bempp:_Solver.solve : 6.266e-04s
TIMING:bempp:_Solver.solve : 9.935e-04s
TIMING:bempp:_Solver.solve : 3.505e-05s
TIMING:bempp:_Solver.solve : 3.004e-05s
TIMING:bempp:_Solver.solve : 7.300e-04s
TIMING:bempp:_Solver.solve : 8.905e-04s
TIMING:bempp:_Solver.solve : 2.933e-05s
TIMING:bempp:_Solver.solve : 2.837e-05s
TIMING:bempp:_Solver.solve : 7.117e-04s
TIMING:bempp:_Solver.solve : 9.747e-04s
TIMING:bempp:_Solver.solve : 2.956e-05s
TIMING:bempp:_Solver.solve : 2.742e-05s
TIMING:bempp:_Solver.solve : 6.325e-04s
TIMING:bempp:_Solver.solve : 1.001e-03s
TIMING:bempp:_Solver.solve : 3.004e-05s
TIMING:bempp:_Solver.solve : 1.588e-04s
TIMING:bempp:_Solver.solve : 7.246e-04s
TIMING:bempp:_Solver.solve : 8.693e-04s
TIMING:bempp:_Solver.solve : 2.837e-05s
TIMING:bempp:_Solver.solve : 5.102e-05s
TIMING:bempp:_Solver.solve : 7.000e-04s
TIMING:bempp:_Solver.solve : 9.401e-04s
TIMING:bempp:_Solver.solve : 3.099e-05s
TIMING:bempp:_Solver.solve : 2.837e-05s
TIMING:bempp:_Solver.solve : 7.117e-04s
TIMING:bempp:_Solver.solve : 7.513e-04s
TIMING:bempp:_Solver.solve : 3.648e-05s
TIMING:bempp:_Solver.solve : 2.789e-05s
TIMING:bempp:_Solver.solve : 7.908e-04s
TIMING:bempp:_Solver.solve : 7.832e-04s
TIMING:bempp:_Solver.solve : 3.004e-05s
TIMING:bempp:_Solver.solve : 2.813e-05s
TIMING:bempp:_Solver.solve : 6.981e-04s
TIMING:bempp:_Solver.solve : 9.274e-04s
TIMING:bempp:_Solver.solve : 3.171e-05s
TIMING:bempp:_Solver.solve : 2.980e-05s
TIMING:bempp:_Solver.solve : 7.205e-04s
TIMING:bempp:_Solver.solve : 7.789e-04s
TIMING:bempp:_Solver.solve : 3.004e-05s
TIMING:bempp:_Solver.solve : 2.670e-05s
TIMING:bempp:_Solver.solve : 6.397e-04s
TIMING:bempp:_Solver.solve : 8.433e-04s
TIMING:bempp:_Solver.solve : 2.933e-05s
TIMING:bempp:_Solver.solve : 2.742e-05s
TIMING:bempp:_Solver.solve : 6.897e-04s
TIMING:bempp:_Solver.solve : 7.684e-04s
TIMING:bempp:_Solver.solve : 3.076e-05s
TIMING:bempp:_Solver.solve : 1.335e-04s
TIMING:bempp:_Solver.solve : 7.365e-04s
TIMING:bempp:_Solver.solve : 9.315e-04s
TIMING:bempp:_Solver.solve : 2.885e-05s
TIMING:bempp:_Solver.solve : 2.742e-05s
TIMING:bempp:_Solver.solve : 6.349e-04s
TIMING:bempp:_Solver.solve : 9.620e-04s
TIMING:bempp:_Solver.solve : 3.076e-05s
TIMING:bempp:_Solver.solve : 2.885e-05s
TIMING:bempp:_Solver.solve : 6.733e-04s
TIMING:bempp:_Solver.solve : 7.966e-04s
TIMING:bempp:_Solver.solve : 2.956e-05s
TIMING:bempp:_Solver.solve : 2.718e-05s
TIMING:bempp:_Solver.solve : 6.642e-04s
TIMING:bempp:_Solver.solve : 7.730e-04s
TIMING:bempp:_Solver.solve : 2.885e-05s
TIMING:bempp:_Solver.solve : 2.029e-04s
TIMING:bempp:_Solver.solve : 1.004e-03s
TIMING:bempp:_Solver.solve : 8.471e-04s
TIMING:bempp:_Solver.solve : 2.980e-05s
TIMING:bempp:_Solver.solve : 4.292e-05s
TIMING:bempp:_Solver.solve : 1.043e-03s
TIMING:bempp:_Solver.solve : 8.552e-04s
TIMING:bempp:_Solver.solve : 2.885e-05s
TIMING:bempp:_Solver.solve : 2.694e-05s
TIMING:bempp:_Solver.solve : 6.399e-04s
TIMING:bempp:_Solver.solve : 9.432e-04s
TIMING:bempp:_Solver.solve : 3.171e-05s
TIMING:bempp:_Solver.solve : 2.861e-05s
TIMING:bempp:_Solver.solve : 6.921e-04s
TIMING:bempp:_Solver.solve : 9.501e-04s
TIMING:bempp:_Solver.solve : 2.980e-05s
TIMING:bempp:_Solver.solve : 1.996e-04s
TIMING:bempp:_Solver.solve : 8.960e-04s
TIMING:bempp:_Solver.solve : 9.127e-04s
TIMING:bempp:_Solver.solve : 3.195e-05s
TIMING:bempp:_Solver.solve : 2.742e-05s
TIMING:bempp:_Solver.solve : 6.196e-04s
TIMING:bempp:_Solver.solve : 9.675e-04s
TIMING:bempp:_Solver.solve : 2.909e-05s
TIMING:bempp:_Solver.solve : 3.099e-05s
TIMING:bempp:_Solver.solve : 7.041e-04s
TIMING:bempp:_Solver.solve : 8.624e-04s
TIMING:bempp:_Solver.solve : 2.837e-05s
TIMING:bempp:_Solver.solve : 2.694e-05s
TIMING:bempp:_Solver.solve : 6.201e-04s
TIMING:bempp:_Solver.solve : 9.489e-04s
TIMING:bempp:_Solver.solve : 2.885e-05s
TIMING:bempp:_Solver.solve : 1.636e-04s
TIMING:bempp:_Solver.solve : 7.329e-04s
TIMING:bempp:_Solver.solve : 8.171e-04s
TIMING:bempp:_Solver.solve : 2.837e-05s
TIMING:bempp:_Solver.solve : 2.501e-04s
TIMING:bempp:_Solver.solve : 9.875e-04s
TIMING:bempp:_Solver.solve : 7.746e-04s
TIMING:bempp:_Solver.solve : 2.909e-05s
TIMING:bempp:_Solver.solve : 9.131e-05s
TIMING:bempp:_Solver.solve : 8.180e-04s
TIMING:bempp:_Solver.solve : 9.394e-04s
TIMING:bempp:_Solver.solve : 1.562e-04s
TIMING:bempp:_Solver.solve : 1.459e-04s
TIMING:bempp:_Solver.solve : 8.969e-04s
TIMING:bempp:_Solver.solve : 8.383e-04s
TIMING:bempp:_Solver.solve : 2.980e-05s
TIMING:bempp:_Solver.solve : 2.742e-05s
TIMING:bempp:_Solver.solve : 6.540e-04s
TIMING:bempp:_Solver.solve : 8.056e-04s
TIMING:bempp:_Solver.solve : 2.956e-05s
TIMING:bempp:_Solver.solve : 2.670e-05s
TIMING:bempp:_Solver.solve : 7.679e-04s
TIMING:bempp:_Solver.solve : 7.539e-04s
TIMING:bempp:_Solver.solve : 3.052e-05s
TIMING:bempp:_Solver.solve : 2.813e-05s
TIMING:bempp:_Solver.solve : 7.370e-04s
TIMING:bempp:_Solver.solve : 7.710e-04s
TIMING:bempp:_Solver.solve : 2.956e-05s
TIMING:bempp:_Solver.solve : 1.636e-04s
TIMING:bempp:_Solver.solve : 7.601e-04s
TIMING:bempp:_Solver.solve : 9.363e-04s
TIMING:bempp:_Solver.solve : 2.956e-05s
TIMING:bempp:_Solver.solve : 2.861e-05s
TIMING:bempp:_Solver.solve : 7.267e-04s
TIMING:bempp:_Solver.solve : 8.826e-04s
TIMING:bempp:_Solver.solve : 2.909e-05s
TIMING:bempp:_Solver.solve : 2.718e-05s
TIMING:bempp:_Solver.solve : 6.533e-04s
TIMING:bempp:_Solver.solve : 1.088e-03s
TIMING:bempp:_Solver.solve : 3.171e-05s
TIMING:bempp:_Solver.solve : 1.659e-04s
TIMING:bempp:_Solver.solve : 7.603e-04s
TIMING:bempp:_Solver.solve : 8.311e-04s
TIMING:bempp:_Solver.solve : 2.837e-05s
TIMING:bempp:_Solver.solve : 2.766e-05s
TIMING:bempp:_Solver.solve : 6.685e-04s
TIMING:bempp:_Solver.solve : 8.574e-04s
TIMING:bempp:_Solver.solve : 2.933e-05s
TIMING:bempp:_Solver.solve : 3.028e-05s
TIMING:bempp:_Solver.solve : 8.593e-04s
TIMING:bempp:_Solver.solve : 9.232e-04s
TIMING:bempp:_Solver.solve : 2.909e-05s
TIMING:bempp:_Solver.solve : 2.646e-05s
TIMING:bempp:_Solver.solve : 6.733e-04s
TIMING:bempp:_Solver.solve : 8.557e-04s
TIMING:bempp:_Solver.solve : 1.099e-04s
TIMING:bempp:_Solver.solve : 1.299e-04s
TIMING:bempp:_Solver.solve : 7.119e-04s
TIMING:bempp:_Solver.solve : 9.627e-04s
TIMING:bempp:_Solver.solve : 3.004e-05s
TIMING:bempp:_Solver.solve : 2.069e-04s
TIMING:bempp:_Solver.solve : 8.409e-04s
TIMING:bempp:_Solver.solve : 8.721e-04s
TIMING:bempp:_Solver.solve : 2.909e-05s
TIMING:bempp:_Solver.solve : 2.766e-05s
TIMING:bempp:_Solver.solve : 8.075e-04s
TIMING:bempp:_Solver.solve : 8.121e-04s
TIMING:bempp:_Solver.solve : 3.076e-05s
TIMING:bempp:_Solver.solve : 2.694e-05s
TIMING:bempp:_Solver.solve : 6.752e-04s
TIMING:bempp:_Solver.solve : 9.019e-04s
TIMING:bempp:_Solver.solve : 3.052e-05s
TIMING:bempp:_Solver.solve : 2.789e-05s
TIMING:bempp:_Solver.solve : 7.117e-04s
TIMING:bempp:_Solver.solve : 9.451e-04s
TIMING:bempp:_Solver.solve : 1.514e-04s
TIMING:bempp:_Solver.solve : 1.497e-04s
TIMING:bempp:_Solver.solve : 9.933e-04s
TIMING:bempp:_Solver.solve : 9.003e-04s
TIMING:bempp:_Solver.solve : 1.552e-04s
TIMING:bempp:_Solver.solve : 2.670e-05s
TIMING:bempp:_Solver.solve : 9.794e-04s
TIMING:bempp:_Solver.solve : 8.979e-04s
TIMING:bempp:_Solver.solve : 2.837e-05s
TIMING:bempp:_Solver.solve : 2.599e-05s
TIMING:bempp:_Solver.solve : 7.212e-04s
TIMING:bempp:_Solver.solve : 8.316e-04s
TIMING:bempp:_Solver.solve : 2.933e-05s
TIMING:bempp:_Solver.solve : 2.646e-05s
TIMING:bempp:_Solver.solve : 6.638e-04s
TIMING:bempp:_Solver.solve : 9.694e-04s
TIMING:bempp:_Solver.solve : 1.874e-04s
TIMING:bempp:_Solver.solve : 1.414e-04s
TIMING:bempp:_Solver.solve : 8.824e-04s
TIMING:bempp:_Solver.solve : 8.874e-04s
TIMING:bempp:_Solver.solve : 3.171e-05s
TIMING:bempp:_Solver.solve : 2.575e-05s
TIMING:bempp:_Solver.solve : 6.621e-04s
TIMING:bempp:_Solver.solve : 9.360e-04s
TIMING:bempp:_Solver.solve : 2.861e-05s
TIMING:bempp:_Solver.solve : 2.742e-05s
TIMING:bempp:_Solver.solve : 6.599e-04s
TIMING:bempp:_Solver.solve : 9.828e-04s
TIMING:bempp:_Solver.solve : 3.529e-05s
TIMING:bempp:_Solver.solve : 2.718e-05s
TIMING:bempp:_Solver.solve : 6.821e-04s
TIMING:bempp:_Solver.solve : 7.772e-04s
TIMING:bempp:_Solver.solve : 1.502e-04s
TIMING:bempp:_Solver.solve : 1.342e-04s
TIMING:bempp:_Solver.solve : 7.856e-04s
TIMING:bempp:_Solver.solve : 9.468e-04s
TIMING:bempp:_Solver.solve : 2.933e-05s
TIMING:bempp:_Solver.solve : 2.646e-05s
TIMING:bempp:_Solver.solve : 7.041e-04s
TIMING:bempp:_Solver.solve : 7.648e-04s
TIMING:bempp:_Solver.solve : 2.933e-05s
TIMING:bempp:_Solver.solve : 2.551e-05s
TIMING:bempp:_Solver.solve : 6.568e-04s
TIMING:bempp:_Solver.solve : 8.907e-04s
TIMING:bempp:_Solver.solve : 3.147e-05s
TIMING:bempp:_Solver.solve : 1.426e-04s
TIMING:bempp:_Solver.solve : 8.092e-04s
TIMING:bempp:_Solver.solve : 9.015e-04s
TIMING:bempp:_Solver.solve : 3.433e-05s
TIMING:bempp:_Solver.solve : 2.861e-05s
TIMING:bempp:_Solver.solve : 7.112e-04s
TIMING:bempp:_Solver.solve : 7.842e-04s
TIMING:bempp:_Solver.solve : 2.956e-05s
TIMING:bempp:_Solver.solve : 2.789e-05s
TIMING:bempp:_Solver.solve : 6.449e-04s
TIMING:bempp:_Solver.solve : 8.721e-04s
TIMING:bempp:_Solver.solve : 3.028e-05s
TIMING:bempp:_Solver.solve : 2.718e-05s
TIMING:bempp:_Solver.solve : 6.337e-04s
TIMING:bempp:_Solver.solve : 7.844e-04s
TIMING:bempp:_Solver.solve : 2.837e-05s
TIMING:bempp:_Solver.solve : 2.694e-05s
TIMING:bempp:_Solver.solve : 6.328e-04s
TIMING:bempp:_Solver.solve : 8.619e-04s
TIMING:bempp:_Solver.solve : 2.956e-05s
TIMING:bempp:_Solver.solve : 2.789e-05s
TIMING:bempp:_Solver.solve : 7.644e-04s
TIMING:bempp:_Solver.solve : 8.283e-04s
TIMING:bempp:_Solver.solve : 1.605e-04s
TIMING:bempp:_Solver.solve : 1.631e-04s
TIMING:bempp:_Solver.solve : 1.110e-03s
TIMING:bempp:_Solver.solve : 7.739e-04s
TIMING:bempp:_Solver.solve : 3.004e-05s
TIMING:bempp:_Solver.solve : 2.694e-05s
TIMING:bempp:_Solver.solve : 6.695e-04s
TIMING:bempp:_Solver.solve : 7.908e-04s
TIMING:bempp:_Solver.solve : 3.147e-05s
TIMING:bempp:_Solver.solve : 2.766e-05s
TIMING:bempp:_Solver.solve : 7.350e-04s
TIMING:bempp:_Solver.solve : 8.740e-04s
TIMING:bempp:_Solver.solve : 2.813e-05s
TIMING:bempp:_Solver.solve : 2.599e-05s
TIMING:bempp:_Solver.solve : 6.585e-04s
TIMING:bempp:_Solver.solve : 9.217e-04s
TIMING:bempp:_Solver.solve : 2.646e-05s
TIMING:bempp:_Solver.solve : 2.599e-05s
TIMING:bempp:_Solver.solve : 6.382e-04s
TIMING:bempp:_Solver.solve : 9.277e-04s
TIMING:bempp:_Solver.solve : 3.123e-05s
TIMING:bempp:_Solver.solve : 2.885e-05s
TIMING:bempp:_Solver.solve : 7.150e-04s
TIMING:bempp:_Solver.solve : 9.112e-04s
TIMING:bempp:_Solver.solve : 2.980e-05s
TIMING:bempp:_Solver.solve : 2.718e-05s
TIMING:bempp:_Solver.solve : 6.676e-04s
TIMING:bempp:_Solver.solve : 9.582e-04s
TIMING:bempp:_Solver.solve : 3.076e-05s
TIMING:bempp:_Solver.solve : 2.766e-05s
TIMING:bempp:_Solver.solve : 6.936e-04s
TIMING:bempp:_Solver.solve : 8.311e-04s
TIMING:bempp:_Solver.solve : 2.837e-05s
TIMING:bempp:_Solver.solve : 2.575e-05s
TIMING:bempp:_Solver.solve : 6.919e-04s
TIMING:bempp:_Solver.solve : 8.330e-04s
TIMING:bempp:_Solver.solve : 1.481e-04s
TIMING:bempp:_Solver.solve : 1.342e-04s
TIMING:bempp:_Solver.solve : 8.111e-04s
TIMING:bempp:_Solver.solve : 8.171e-04s
TIMING:bempp:_Solver.solve : 1.671e-04s
TIMING:bempp:_Solver.solve : 1.531e-04s
TIMING:bempp:_Solver.solve : 8.595e-04s
TIMING:bempp:_Solver.solve : 7.720e-04s
TIMING:bempp:_Solver.solve : 1.142e-04s
TIMING:bempp:_Solver.solve : 1.256e-04s
TIMING:bempp:_Solver.solve : 7.246e-04s
TIMING:bempp:_Solver.solve : 8.538e-04s
TIMING:bempp:_Solver.solve : 2.885e-05s
TIMING:bempp:_Solver.solve : 2.000e-04s
TIMING:bempp:_Solver.solve : 8.044e-04s
TIMING:bempp:_Solver.solve : 9.112e-04s
TIMING:bempp:_Solver.solve : 2.861e-05s
TIMING:bempp:_Solver.solve : 2.599e-05s
TIMING:bempp:_Solver.solve : 6.788e-04s
TIMING:bempp:_Solver.solve : 9.756e-04s
TIMING:bempp:_Solver.solve : 3.242e-05s
TIMING:bempp:_Solver.solve : 3.099e-05s
TIMING:bempp:_Solver.solve : 9.980e-04s
TIMING:bempp:_Solver.solve : 8.419e-04s
TIMING:bempp:_Solver.solve : 2.956e-05s
TIMING:bempp:_Solver.solve : 2.005e-04s
TIMING:bempp:_Solver.solve : 8.228e-04s
TIMING:bempp:_Solver.solve : 7.663e-04s
TIMING:bempp:_Solver.solve : 2.909e-05s
TIMING:bempp:_Solver.solve : 3.242e-05s
TIMING:bempp:_Solver.solve : 6.719e-04s
TIMING:bempp:_Solver.solve : 9.720e-04s
TIMING:bempp:_Solver.solve : 3.123e-05s
TIMING:bempp:_Solver.solve : 1.769e-04s
TIMING:bempp:_Solver.solve : 7.579e-04s
TIMING:bempp:_Solver.solve : 8.426e-04s
TIMING:bempp:_Solver.solve : 2.909e-05s
TIMING:bempp:_Solver.solve : 1.822e-04s
TIMING:bempp:_Solver.solve : 7.722e-04s
TIMING:bempp:_Solver.solve : 9.813e-04s
TIMING:bempp:_Solver.solve : 2.956e-05s
TIMING:bempp:_Solver.solve : 2.742e-05s
TIMING:bempp:_Solver.solve : 6.967e-04s
TIMING:bempp:_Solver.solve : 8.464e-04s
TIMING:bempp:_Solver.solve : 1.926e-04s
TIMING:bempp:_Solver.solve : 2.694e-05s
TIMING:bempp:_Solver.solve : 8.197e-04s
TIMING:bempp:_Solver.solve : 8.035e-04s
TIMING:bempp:_Solver.solve : 3.219e-05s
TIMING:bempp:_Solver.solve : 2.813e-05s
TIMING:bempp:_Solver.solve : 7.024e-04s
TIMING:bempp:_Solver.solve : 8.850e-04s
TIMING:bempp:_Solver.solve : 2.956e-05s
TIMING:bempp:_Solver.solve : 2.694e-05s
TIMING:bempp:_Solver.solve : 8.922e-04s
TIMING:bempp:_Solver.solve : 8.266e-04s
TIMING:bempp:_Solver.solve : 4.697e-05s
TIMING:bempp:_Solver.solve : 2.718e-05s
TIMING:bempp:_Solver.solve : 7.942e-04s
TIMING:bempp:_Solver.solve : 8.368e-04s
TIMING:bempp:_Solver.solve : 2.980e-05s
TIMING:bempp:_Solver.solve : 2.575e-05s
TIMING:bempp:_Solver.solve : 7.305e-04s
TIMING:bempp:_Solver.solve : 8.373e-04s
TIMING:bempp:_Solver.solve : 1.242e-04s
TIMING:bempp:_Solver.solve : 1.469e-04s
TIMING:bempp:_Solver.solve : 7.470e-04s
TIMING:bempp:_Solver.solve : 8.626e-04s
TIMING:bempp:_Solver.solve : 1.595e-04s
TIMING:bempp:_Solver.solve : 1.640e-04s
TIMING:bempp:_Solver.solve : 9.151e-04s
TIMING:bempp:_Solver.solve : 1.066e-03s
TIMING:bempp:_Solver.solve : 1.893e-04s
TIMING:bempp:_Solver.solve : 1.204e-04s
TIMING:bempp:_Solver.solve : 8.221e-04s
TIMING:bempp:_Solver.solve : 9.294e-04s
TIMING:bempp:_Solver.solve : 1.266e-04s
TIMING:bempp:_Solver.solve : 1.159e-04s
TIMING:bempp:_Solver.solve : 7.150e-04s
TIMING:bempp:_Solver.solve : 8.457e-04s
TIMING:bempp:_Solver.solve : 2.909e-05s
TIMING:bempp:_Solver.solve : 2.623e-05s
TIMING:bempp:_Solver.solve : 7.491e-04s
TIMING:bempp:_Solver.solve : 8.650e-04s
TIMING:bempp:_Solver.solve : 8.726e-05s
TIMING:bempp:_Solver.solve : 1.953e-04s
TIMING:bempp:_Solver.solve : 8.335e-04s
TIMING:bempp:_Solver.solve : 7.718e-04s
TIMING:bempp:_Solver.solve : 1.278e-04s
TIMING:bempp:_Solver.solve : 1.190e-04s
TIMING:bempp:_Solver.solve : 7.644e-04s
TIMING:bempp:_Solver.solve : 8.132e-04s
TIMING:bempp:_Solver.solve : 1.228e-04s
TIMING:bempp:_Solver.solve : 1.106e-04s
TIMING:bempp:_Solver.solve : 7.172e-04s
TIMING:bempp:_Solver.solve : 8.841e-04s
TIMING:bempp:_Solver.solve : 3.004e-05s
TIMING:bempp:_Solver.solve : 2.670e-05s
TIMING:bempp:_Solver.solve : 6.576e-04s
TIMING:bempp:_Solver.solve : 9.015e-04s
TIMING:bempp:_Solver.solve : 3.099e-05s
TIMING:bempp:_Solver.solve : 2.813e-05s
TIMING:bempp:_Solver.solve : 6.807e-04s
TIMING:bempp:_Solver.solve : 8.509e-04s
TIMING:bempp:_Solver.solve : 2.861e-05s
TIMING:bempp:_Solver.solve : 2.623e-05s
TIMING:bempp:_Solver.solve : 6.573e-04s
TIMING:bempp:_Solver.solve : 7.787e-04s
TIMING:bempp:_Solver.solve : 1.211e-04s
TIMING:bempp:_Solver.solve : 1.113e-04s
TIMING:bempp:_Solver.solve : 7.091e-04s
TIMING:bempp:_Solver.solve : 1.092e-03s
TIMING:bempp:_Solver.solve : 3.123e-05s
TIMING:bempp:_Solver.solve : 2.599e-05s
TIMING:bempp:_Solver.solve : 6.456e-04s
TIMING:bempp:_Solver.solve : 7.997e-04s
TIMING:bempp:_Solver.solve : 2.837e-05s
TIMING:bempp:_Solver.solve : 2.503e-05s
TIMING:bempp:_Solver.solve : 6.387e-04s
TIMING:bempp:_Solver.solve : 9.711e-04s
TIMING:bempp:_Solver.solve : 2.980e-05s
TIMING:bempp:_Solver.solve : 2.623e-05s
TIMING:bempp:_Solver.solve : 7.052e-04s
TIMING:bempp:_Solver.solve : 7.899e-04s
TIMING:bempp:_Solver.solve : 2.742e-05s
TIMING:bempp:_Solver.solve : 2.151e-04s
TIMING:bempp:_Solver.solve : 7.806e-04s
TIMING:bempp:_Solver.solve : 7.870e-04s
TIMING:bempp:_Solver.solve : 2.885e-05s
TIMING:bempp:_Solver.solve : 2.623e-05s
TIMING:bempp:_Solver.solve : 6.444e-04s
TIMING:bempp:_Solver.solve : 9.627e-04s
TIMING:bempp:_Solver.solve : 3.099e-05s
TIMING:bempp:_Solver.solve : 4.959e-05s
TIMING:bempp:_Solver.solve : 9.801e-04s
TIMING:bempp:_Solver.solve : 8.984e-04s
TIMING:bempp:_Solver.solve : 2.956e-05s
TIMING:bempp:_Solver.solve : 2.742e-05s
TIMING:bempp:_Solver.solve : 7.408e-04s
TIMING:bempp:_Solver.solve : 8.373e-04s
TIMING:bempp:_Solver.solve : 2.837e-05s
TIMING:bempp:_Solver.solve : 2.623e-05s
TIMING:bempp:_Solver.solve : 6.433e-04s
TIMING:bempp:_Solver.solve : 7.827e-04s
TIMING:bempp:_Solver.solve : 2.813e-05s
TIMING:bempp:_Solver.solve : 2.551e-05s
TIMING:bempp:_Solver.solve : 6.697e-04s
TIMING:bempp:_Solver.solve : 7.706e-04s
TIMING:bempp:_Solver.solve : 2.909e-05s
TIMING:bempp:_Solver.solve : 2.437e-04s
TIMING:bempp:_Solver.solve : 1.010e-03s
TIMING:bempp:_Solver.solve : 8.979e-04s
TIMING:bempp:_Solver.solve : 3.457e-05s
TIMING:bempp:_Solver.solve : 2.766e-05s
TIMING:bempp:_Solver.solve : 7.634e-04s
TIMING:bempp:_Solver.solve : 8.512e-04s
TIMING:bempp:_Solver.solve : 2.837e-05s
TIMING:bempp:_Solver.solve : 2.646e-05s
TIMING:bempp:_Solver.solve : 6.588e-04s
TIMING:bempp:_Solver.solve : 8.893e-04s
TIMING:bempp:_Solver.solve : 3.147e-05s
TIMING:bempp:_Solver.solve : 1.979e-04s
TIMING:bempp:_Solver.solve : 8.154e-04s
TIMING:bempp:_Solver.solve : 8.168e-04s
TIMING:bempp:_Solver.solve : 1.175e-04s
TIMING:bempp:_Solver.solve : 1.011e-04s
TIMING:bempp:_Solver.solve : 7.098e-04s
TIMING:bempp:_Solver.solve : 7.584e-04s
TIMING:bempp:_Solver.solve : 2.837e-05s
TIMING:bempp:_Solver.solve : 2.623e-05s
TIMING:bempp:_Solver.solve : 6.442e-04s
TIMING:bempp:_Solver.solve : 7.563e-04s
TIMING:bempp:_Solver.solve : 2.861e-05s
TIMING:bempp:_Solver.solve : 2.220e-04s
TIMING:bempp:_Solver.solve : 8.397e-04s
TIMING:bempp:_Solver.solve : 8.721e-04s
TIMING:bempp:_Solver.solve : 2.956e-05s
TIMING:bempp:_Solver.solve : 2.663e-04s
TIMING:bempp:_Solver.solve : 9.387e-04s
TIMING:bempp:_Solver.solve : 9.401e-04s
TIMING:bempp:_Solver.solve : 1.290e-04s
TIMING:bempp:_Solver.solve : 1.152e-04s
TIMING:bempp:_Solver.solve : 7.501e-04s
TIMING:bempp:_Solver.solve : 8.378e-04s
TIMING:bempp:_Solver.solve : 2.861e-05s
TIMING:bempp:_Solver.solve : 2.933e-05s
TIMING:bempp:_Solver.solve : 8.886e-04s
TIMING:bempp:_Solver.solve : 8.478e-04s
TIMING:bempp:_Solver.solve : 2.766e-05s
TIMING:bempp:_Solver.solve : 2.575e-05s
TIMING:bempp:_Solver.solve : 8.099e-04s
TIMING:bempp:_Solver.solve : 1.044e-03s
TIMING:bempp:_Solver.solve : 5.722e-05s
TIMING:bempp:_Solver.solve : 1.850e-04s
TIMING:bempp:_Solver.solve : 9.687e-04s
TIMING:bempp:_Solver.solve : 8.442e-04s
TIMING:bempp:_Solver.solve : 2.837e-05s
TIMING:bempp:_Solver.solve : 2.575e-05s
TIMING:bempp:_Solver.solve : 7.226e-04s
TIMING:bempp:_Solver.solve : 1.020e-03s
TIMING:bempp:_Solver.solve : 2.909e-05s
TIMING:bempp:_Solver.solve : 2.718e-05s
TIMING:bempp:_Solver.solve : 1.040e-03s
TIMING:bempp:_Solver.solve : 9.012e-04s
TIMING:bempp:_Solver.solve : 1.404e-04s
TIMING:bempp:_Solver.solve : 2.613e-04s
TIMING:bempp:_Solver.solve : 1.100e-03s
TIMING:bempp:_Solver.solve : 7.753e-04s
TIMING:bempp:_Solver.solve : 1.228e-04s
TIMING:bempp:_Solver.solve : 1.481e-04s
TIMING:bempp:_Solver.solve : 8.848e-04s
TIMING:bempp:_Solver.solve : 8.173e-04s
TIMING:bempp:_Solver.solve : 2.837e-05s
TIMING:bempp:_Solver.solve : 2.670e-05s
TIMING:bempp:_Solver.solve : 7.241e-04s
TIMING:bempp:_Solver.solve : 8.817e-04s
TIMING:bempp:_Solver.solve : 1.194e-04s
TIMING:bempp:_Solver.solve : 1.543e-04s
TIMING:bempp:_Solver.solve : 8.168e-04s
TIMING:bempp:_Solver.solve : 8.566e-04s
TIMING:bempp:_Solver.solve : 2.885e-05s
TIMING:bempp:_Solver.solve : 1.998e-04s
TIMING:bempp:_Solver.solve : 7.658e-04s
TIMING:bempp:_Solver.solve : 8.221e-04s
TIMING:bempp:_Solver.solve : 1.285e-04s
TIMING:bempp:_Solver.solve : 1.445e-04s
TIMING:bempp:_Solver.solve : 8.807e-04s
TIMING:bempp:_Solver.solve : 7.823e-04s
TIMING:bempp:_Solver.solve : 3.004e-05s
TIMING:bempp:_Solver.solve : 1.431e-04s
TIMING:bempp:_Solver.solve : 8.276e-04s
TIMING:bempp:_Solver.solve : 9.208e-04s
TIMING:bempp:_Solver.solve : 5.603e-05s
TIMING:bempp:_Solver.solve : 2.344e-04s
TIMING:bempp:_Solver.solve : 1.054e-03s
TIMING:bempp:_Solver.solve : 9.265e-04s
TIMING:bempp:_Solver.solve : 2.885e-05s
TIMING:bempp:_Solver.solve : 2.694e-05s
TIMING:bempp:_Solver.solve : 7.012e-04s
TIMING:bempp:_Solver.solve : 9.289e-04s
TIMING:bempp:_Solver.solve : 3.195e-05s
TIMING:bempp:_Solver.solve : 2.027e-04s
TIMING:bempp:_Solver.solve : 8.304e-04s
TIMING:bempp:_Solver.solve : 1.013e-03s
TIMING:bempp:_Solver.solve : 3.052e-05s
TIMING:bempp:_Solver.solve : 2.131e-04s
TIMING:bempp:_Solver.solve : 8.588e-04s
TIMING:bempp:_Solver.solve : 7.641e-04s
TIMING:bempp:_Solver.solve : 2.789e-05s
TIMING:bempp:_Solver.solve : 2.527e-05s
TIMING:bempp:_Solver.solve : 7.172e-04s
TIMING:bempp:_Solver.solve : 8.199e-04s
TIMING:bempp:_Solver.solve : 1.307e-04s
TIMING:bempp:_Solver.solve : 1.152e-04s
TIMING:bempp:_Solver.solve : 7.522e-04s
TIMING:bempp:_Solver.solve : 8.307e-04s
TIMING:bempp:_Solver.solve : 2.909e-05s
TIMING:bempp:_Solver.solve : 2.623e-05s
TIMING:bempp:_Solver.solve : 6.917e-04s
TIMING:bempp:_Solver.solve : 9.966e-04s
TIMING:bempp:_Solver.solve : 1.533e-04s
TIMING:bempp:_Solver.solve : 1.421e-04s
TIMING:bempp:_Solver.solve : 8.097e-04s
Number of iterations: 312

Next, we make Dolfinx and Bempp functions from the solution.

In [10]:
# Store the real part of the FEM solution
u = dolfinx.Function(fenics_space)
u.vector[:] = np.ascontiguousarray(np.real(soln_fem))

# Solution function with dirichlet data on the boundary
dirichlet_data = trace_matrix * soln_fem
dirichlet_fun = bempp.api.GridFunction(trace_space, coefficients=dirichlet_data)

# Solution function with Neumann data on the boundary
neumann_fun = bempp.api.GridFunction(bempp_space, coefficients=soln_bem)

We now evaluate the solution on the slice $z=0.5$ and plot it. For the exterior domain, we use the respresentation formula

$$ u^\text{s} = \mathcal{K}u-\mathcal{V}\frac{\partial u}{\partial \nu} $$

to evaluate the solution.

In [17]:
# The next command ensures that plots are shown within the IPython notebook
%matplotlib inline

Nx=200
Ny=200
xmin, xmax, ymin, ymax=[-1,3,-1,3]
plot_grid = np.mgrid[xmin:xmax:Nx*1j,ymin:ymax:Ny*1j]
points = np.vstack((plot_grid[0].ravel(),
                    plot_grid[1].ravel(),
                    np.array([0.5]*plot_grid[0].size)))
plot_me = np.zeros(points.shape[1], dtype=np.complex128)

x,y,z = points
bem_x = np.logical_not((x>0) * (x<1) * (y>0) * (y<1) * (z>0) * (z<1))

slp_pot= bempp.api.operators.potential.helmholtz.single_layer(
    bempp_space, points[:, bem_x], k)
dlp_pot= bempp.api.operators.potential.helmholtz.double_layer(
    trace_space, points[:, bem_x], k)

plot_me[bem_x] += np.exp(1j * k * (points[0, bem_x] * d[0] \
                                 + points[1, bem_x] * d[1] \
                                 + points[2, bem_x] * d[2]))
plot_me[bem_x] += dlp_pot.evaluate(dirichlet_fun).flat
plot_me[bem_x] -= slp_pot.evaluate(neumann_fun).flat

fem_points = points[:, np.logical_not(bem_x)].transpose()
tree = dolfinx.geometry.BoundingBoxTree(mesh, 3)
entities = []
for point in fem_points:
    entities.append(dolfinx.geometry.compute_closest_entity(tree, point, mesh)[0])
fem_val = u.eval(fem_points, entities)

plot_me[np.logical_not(bem_x)] += fem_val.T[0]

plot_me = plot_me.reshape((Nx, Ny))

plot_me = plot_me.transpose()[::-1]

# Plot the image
from matplotlib import pyplot as plt
fig=plt.figure(figsize=(10, 8))
plt.imshow(np.real(plot_me), extent=[xmin, xmax, ymin, ymax])
plt.xlabel('x')
plt.ylabel('y')
plt.colorbar()
plt.title("FEM-BEM Coupling for Helmholtz")
plt.show()