Boundary Value Problems on Chunkgraphs
The solution and behavior of integral equations on chunkgraphs
differs from that on chunkers in one major way, the solutions
on domains with corners and multiple junctions tend to be singular
and require additional care for their accurate computation.
For concreteness, suppose that \(\Gamma\) is the boundary described via a
chunkgraph, and consider the following second kind integral equation
for a density \(\sigma\)
If \((0,0)\) is a vertex on \(\Gamma\), then for \(x\in \Gamma\) in the vicinity of the corner, \(\sigma\) is well-approximated by functions of the form \(|r|^{\mu} \log{r}^{\eta}\) where \(r=|x|\), \(\mu \in \mathbb{C}\) with \(\textrm{Re}(\mu) > -1\) and \(\eta \in \mathbb{R} \geq 0\). For example, for the Laplace and Helmholtz Neumann boundary value problem, \(\mu \in \mathbb{R} > -1/2\). The approximation of such functions with Gauss-Legendre panel based discretizations to a tolearance of \(\varepsilon\) could require a dyadic grid in the vicinity of the corner with the smallest panel scaling as \(O(1/\varepsilon^2)\).
There are several standard approaches which compress the interactions in the vicinity of the corner with the rest of the boundary. In chunkIE, we use the Recursively compressed inverse preconditioning (RCIP) approach for addressing this issue, since it is robust, capable of achieving high accuracy, kernel indpendent and requires only a quadrature rule for handling the near singular nature of the kernel ignoring the singular behavior of the density. Briefly, it constructs an effective matrix of interaction corresponding to the two panels in the vicinity of the corner, by recursively compressing the corner interactions on a heirarchy of dyadic grids. While a dyadic mesh is used to construct the effective matrix of interaction, the density \(\sigma\) is described by its samples on two Gauss-Legendre panels in the vicinity of the corner. For a detailed description of the RCIP method, see the wonderful tutorial by Johan Helsing who has been the chief architect of the RCIP approach, [Hel2012].
However, the chunkIE user does not have to worry about all of these
issues and the routines chunkermat and chunkerkerneval
can be seamlessly used for chunkgraphs with only a minor caveat,
discussed in the note below.
Note
The integral equation must be appropriately scaled to ensure that
it is of the form \((I + K)\) as opposed to \(\alpha I + K\) for \(\alpha \neq 1\).
The current implementation of the corner compression scheme,
RCIP, requires this scaling for solving integral equations on
chunkgraphs. This restriction will soon be lifted in an upcoming release
of chunkIE, but is required as of the current version.
A Sound Hard Scattering Problem with Corners
Consider the Helmholtz Neumann scattering problem in the exterior of a domain with corners. As before, in such a scattering problem, an incident field \(u^{\textrm{inc}}\) is specified in the exterior of the object and the scattered field \(u^{\textrm{scat}}\) is determined so that the total field \(u = u^{\textrm{inc}} + u^{\textrm{scat}}\) satisfies the following PDE:
The Green function for the Helmholtz equation is
This Green function can be used to define single and double layer potential operators
A robust choice for the layer potential representation for this problem is a right preconditioned combined field layer potential, which is a linear combination of the single and double layer potentials:
with \(\alpha in \mathbb{R}\) typically chosen to be \(|k|\) and \(\beta = -4.0/(2 + i \alpha)\). See [Bru2009] for a detailed discussion on the benefits of using this particular representation for the Helmholtz Neumann boundary value problem. The seemingly weird scaling of the integral representation is to ensure that the eventual integral equation is of the form \((I+K)\).
Then, imposing the boundary conditions on this representation results in the equation
where \(S_{k}'\) and \(D_{k}'\) represent the normal derivatives of the single and double layer potentials respectively, and we have used the exterior jump condition for \(S_{k}'\) and used Calderon identities to express \(D_{ik}'S_{ik}\) in terms of the identity operator and \(S_{ik}'S_{ik}'\). As before, the integrals in the operators restricted to the boundary must sometimes be interpreted in the principal value or Hadamard finite-part sense. The above is a second kind integral equation and is invertible. The integral equation as written requires operator composition and RCIP in chunkIE does not support such operator compositions. However, this is easily remedied by setting \(-[S_{ik}\sigma](x) + \tau(x) = 0\), and \(-[S_{ik}'\sigma](x) + \mu(x) = 0\) to obtain the following system of equations for \(\sigma, \tau, and \mu\):
Recall that the kernel class in chunkIE, also allows for the easy
specification of such a matrix of kernels either manually
or by reinvoking the constructor on a matrix of objects
where each entry of the matrix is a kernel itself.
Thus implementing this problem remains relatively straightforward as illustrated below:
% planewave direction
kvec = [0;8];
zk = norm(kvec);
% make vertices
narms = 5;
rots = exp(1i*2*pi*(1:narms)/narms);
verts = zeros(2,2*narms);
radi = 1;
rado = 5;
for i = 1:narms
verts(:,2*i-1) = radi*[real(rots(i));imag(rots(i))];
verts(:,2*i) = rado*[real(rots(i));imag(rots(i))];
end
nverts = size(verts,2);
edge2verts = [1:nverts;circshift(1:nverts,-1)];
% curve parameters
amp = -0.5;
frq = 5;
% define curve for each edge
fchnks = cell(2*narms,1);
for i = 1:narms
% odd edges are straight
fchnks{2*i-1} = [];
% even edges are curved
fchnks{2*i} = @(t) sinearc(t,amp,frq);
end
cparams = [];
cparams.maxchunklen = min(4.0/zk,.5);
[cgrph] = chunkgraph(verts,edge2verts,fchnks,cparams);
%% Define system
% define kernels
Sk = kernel('helmholtz', 's', zk);
Skp = kernel('helmholtz', 'sprime', zk);
Dk = kernel('helmholtz', 'd', zk);
% combined field uses modified-Helmholtz kernels
Sik = kernel('helmholtz', 's', 1i*zk);
Sikp = kernel('helmholtz', 'sprime', 1i*zk);
Dkdiff = kernel('helmdiff', 'dprime', [zk 1i*zk]);
Z = kernel.zeros();
alpha = 1;
c1 = -1/(0.5 + 1i*alpha*0.25);
c2 = -1i*alpha/(0.5 + 1i*alpha*0.25);
c3 = -1;
% define a matrix valued kernel, which corresponds to unpacking the
% composition of operators
K = [ c1*Skp c2*Dkdiff c2*Sikp ;
c3*Sik Z Z ;
c3*Sikp Z Z ];
K = kernel(K);
Keval = c1*kernel([Sk 1i*alpha*Dk Z]);
npts = cgrph.npt;
nsys = K.opdims(1)*npts;
start = tic;
A = chunkermat(cgrph, K) + eye(nsys);
tmat = toc(start)
%% solve system
% Set up boundary data
sources = [4;1];
strengths = 1;
rhs = zeros(nsys,1);
% get Neumann boundary data
rhs_n = -sum(kvec(:).*cgrph.n(:,:),1).*planewave(kvec(:),cgrph.r(:,:));
% only first row of K is physical
rhs(1:K.opdims(1):end) = rhs_n(:);
% solve
start = tic;
sol = gmres(A, rhs, [], 1e-13, 200);
tsolve = toc(start)
%% compute field
L = 2*rado;
x1 = linspace(-L,L,300);
[xx,yy] = meshgrid(x1,x1);
targs = [xx(:).'; yy(:).'];
ntargs = size(targs,2);
% identify points in computational domain
in = chunkerinterior(cgrph,{x1,x1});
out = ~in;
% get incoming solution
uin = nan(size(xx));
uin(out) = planewave(kvec(:),targs(:,out));
% get solution
opts = [];
opts.forcesmooth = false;
uscat = nan(size(xx));
uscat(out) = chunkerkerneval(cgrph,Keval,sol,targs(:,out),opts);
utot = uin + uscat;
%% make plots
umax = max(abs(utot(:)));
figure(2);clf
h = pcolor(xx,yy,imag(utot)); set(h,'EdgeColor','none'); colorbar
colormap(redblue); clim([-umax,umax]);
hold on
plot(cgrph,'k')
axis equal
title('$u^{\textrm{tot}}$','Interpreter','latex','FontSize',12)
Mixed Boundary Conditions
Singularities arise solutions to PDEs and related integral equations when different parts of the boundary impose different boundary conditions. For simplicity, consider the following Laplace mixed boundary value problem for the potential \(u\) on a domain \(\Omega\) with boundary \(\Gamma\),
where \(\Gamma_{D}\) and \(\Gamma_{N}\) are a partition of the boundary,
i.e. \(\Gamma = \Gamma_{D} \cup \Gamma_{N}\), with
\(\Gamma_{D} \cup \Gamma_{N} = (0,0)\). Then as above, the solution
to the PDE and the associated integral equation is singular in the vicinity
of the origin and can be well-approximated by functions of the form
\(r^{\mu} \log(r)^{\eta}\) with \(\mu \in \mathbb{R} > -1/2\), and \(\eta \geq 0\).
This singular behavior persists even when the boundary is smooth across
the origin. Thus, to handle such mixed boundary value problems, it is
essential to use chunkgraphs instead of chunkers
to define such boundary value problems, with a vertex introduced
at every point at which the boundary conditions change.
Recall that the Green function for the Laplace equation is
The standard choice for solving such a mixed boundary value problem is to use a single layer potential on \(\Gamma_{N}\) and a double layer potential on \(\Gamma_{D}\),
where
On imposing the boundary conditions, we get the following system of integral equations for \(\sigma_{D}\) and \(\sigma_{N}\)
where \(S'\) and \(D'\) are restrictions of the normal derivatives of \(S\) and \(D\) respectively.
Here is an example illustrating a mixed boundary value problem on a star-shaped domain:
narms = 5;
amp = 0.3;
verts = [1+amp, -1+amp; 0, 0];
fchnks = @(t) starfish(t, narms, amp);
cparams = cell(2,1);
cparams{1}.ta = 0;
cparams{1}.tb = pi;
cparams{1}.maxchunklen = 0.1;
cparams{2}.ta = -pi;
cparams{2}.tb = 0;
cparams{2}.maxchunklen = 0.1;
edgesendverts = [1 2; 2 1];
cgrph = chunkgraph(verts, edgesendverts, fchnks, cparams);
%% Setup kernels
S = 2*kernel('lap', 's');
D = (-2)*kernel('lap', 'd');
Sp = 2*kernel('lap', 'sprime');
Dp = (-2)*kernel('lap', 'dprime');
K(2,2) = kernel();
K(1,1) = D;
K(1,2) = S;
K(2,1) = Dp;
K(2,2) = Sp;
Keval(1,2) = kernel();
Keval(1,1) = D;
Keval(1,2) = S;
%% Build matrix
A = chunkermat(cgrph, K);
A = A + eye(size(A,1));
%% Build test boundary data;
rhs = zeros(cgrph.npt,1);
npt1 = cgrph.echnks(1).npt;
rng(1);
rhs(1:npt1) = real(exp(1j*40*cgrph.echnks(1).r(1,:))*exp(1j*2*pi*rand)).';
rhs(npt1+1:end) = real(exp(1j*43*cgrph.echnks(2).r(1,:))*exp(1j*2*pi*rand)).';
sig = A \ rhs;
%% Postprocess
% define targets
x1 = linspace(-1-amp,1+amp,300);
[xx,yy] = meshgrid(x1,x1);
targs = [xx(:).'; yy(:).'];
% identify points in computational domain
in = chunkerinterior(cgrph,{x1,x1});
uu = chunkerkerneval(cgrph, Keval, sig, targs);
u = nan(size(xx(:)));
u(in) = uu(in);
figure(1)
clf
plot(cgrph, 'LineWidth', 2);
hold on;
pcolor(xx, yy, reshape(u, size(xx))); shading interp
axis equal tight
Helsing, Johan. “Solving integral equations on piecewise smooth boundaries using the RCIP method: a tutorial.” arXiv preprint 1207.6737 (2012)
Bruno, Oscar, Tim Elling, and Catilin Turc. “Regularized integral equations and fast high‐order solvers for sound‐hard acoustic scattering problems.” International Journal for Numerical Methods in Engineering 91, no. 10 (2012): 1045-1072.