Skip to content

Commit 490a542

Browse files
authored
Merge pull request #152 from fastalgorithms/removable-quad
Removable quad
2 parents c8bbc13 + 70c4a13 commit 490a542

File tree

5 files changed

+92
-1
lines changed

5 files changed

+92
-1
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
function [xs0, ws0] = getremovablequad(k, nfac)
2+
%CHNK.QUADGGQ.GETREMOVABLEQUAD returns a quadrature
3+
% for integrating piecewise smooth quadrature, where the rule
4+
% on each panel is upsampled by a factor of nfac, i.e.
5+
% an order nfac*k quadrature rule is used on both panels
6+
7+
if nargin < 2
8+
nfac = 1;
9+
end
10+
11+
12+
kover = ceil(k*nfac);
13+
[xleg, wleg, ~, ~] = lege.exps(k);
14+
if kover == k
15+
xover = xleg;
16+
wover = wleg;
17+
else
18+
[xover, wover, ~, ~] = lege.exps(kover);
19+
end
20+
21+
xover01 = (xover+1)/2;
22+
wover01 = wover/2;
23+
24+
xs0 = cell(k,1);
25+
ws0 = cell(k,1);
26+
for i=1:k
27+
xn = xleg(i);
28+
xls = xover01*(xn+1)-1;
29+
wls = wover01*(xn+1);
30+
xrs = xover01*(1-xn)+xn;
31+
wrs = wover01*(1-xn);
32+
xs0{i} = [xls; xrs];
33+
ws0{i} = [wls; wrs];
34+
end
35+
36+
end
37+

chunkie/+chnk/+quadggq/setup.m

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
% [[[---------------------------]-------------------]-------------------]
1212
% type = 'log' 'pv' 'hs'
1313
%
14+
% f_{0}(x) + abs|x-x_{j}|*f_{1}(x)
15+
% type = 'removable'
16+
%
1417
% where the f_i are polynomials of order 2*k
1518
%
1619
% input:
@@ -39,6 +42,8 @@
3942
[xs0,wts0] = chnk.quadggq.gethqsuppquad(k,1);
4043
elseif strcmpi(type,'hs')
4144
[xs0,wts0] = chnk.quadggq.gethqsuppquad(k,2);
45+
elseif strcmpi(type,'removable')
46+
[xs0,wts0] = chnk.quadggq.getremovablequad(k,1);
4247
end
4348
ainterp1 = lege.matrin(k,xs1);
4449

@@ -58,4 +63,4 @@
5863
auxquad.wts0 = wts0;
5964
auxquad.ainterp1 = ainterp1;
6065
auxquad.ainterps0 = ainterps0;
61-
66+

chunkie/@kernel/helm1d.m

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
function obj = helm1d(type, zk, coefs)
2+
%KERNEL.HELM2D Construct the Helmholtz kernel.
3+
% KERNEL.HELM2D('s', ZK) or KERNEL.HELM2D('single', ZK) constructs the
4+
% single-layer Helmholtz kernel with wavenumber ZK.
5+
%
6+
%
7+
% See also CHNK.HELM2D.KERN.
8+
9+
if ( nargin < 1 )
10+
error('Missing Helmholtz kernel type.');
11+
end
12+
13+
if ( nargin < 2 )
14+
error('Missing Helmholtz wavenumber.');
15+
end
16+
17+
obj = kernel();
18+
obj.name = 'helmholtz1d';
19+
obj.params.zk = zk;
20+
obj.opdims = [1 1];
21+
22+
switch lower(type)
23+
24+
case {'s', 'single'}
25+
obj.type = 's';
26+
obj.eval = @(s,t) chnk.helm1d.kern(zk, s, t, 's');
27+
obj.fmm = [];
28+
obj.sing = 'removable';
29+
30+
otherwise
31+
error('Unknown Helmholtz kernel type ''%s''.', type);
32+
33+
end
34+
35+
end

chunkie/@kernel/kernel.m

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
% 'laplace' ('lap', 'l') 's', 'd', 'sp', 'c'
1111
% 'helmholtz' ('helm', 'h') 's', 'd', 'sp', 'dp', 'c'
1212
% 'cp'
13+
% 'helmholtz1d' ('helm1d', 'h1d') 's'
1314
% 'helmholtz difference' 's', 'd', 'sp', 'dp'
1415
% ('helmdiff', 'hdiff', 'helm_diff')
1516
% 'elasticity' ('elast', 'e') 's', 'strac', 'd', 'dalt'
@@ -100,6 +101,8 @@
100101
obj = kernel.lap2d(varargin{:});
101102
case {'helmholtz', 'helm', 'h'}
102103
obj = kernel.helm2d(varargin{:});
104+
case {'helmholtz1d', 'helm1d', 'h1d'}
105+
obj = kernel.helm1d(varargin{:});
103106
case {'helmholtz difference', 'helmdiff', 'hdiff', 'helm_diff'}
104107
obj = kernel.helm2ddiff(varargin{:});
105108
case {'stokes', 'stok', 's'}
@@ -157,6 +160,7 @@
157160

158161
obj = lap2d(varargin);
159162
obj = helm2d(varargin);
163+
obj = helm1d(varargin);
160164
obj = helm2ddiff(varargin);
161165
obj = stok2d(varargin);
162166
obj = elast2d(varargin);

chunkie/chunkermat.m

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
% is not defined by the kernel object. Supported
3131
% types are:
3232
% smooth => smooth kernels
33+
% removable => piecewise smooth kernels
3334
% log => logarithmically singular kernels or
3435
% smooth times log + smooth
3536
% pv => principal value singular kernels + log
@@ -379,6 +380,15 @@
379380
auxquads = chnk.quadggq.setup(k,type);
380381
opts.auxquads.ggqlog = auxquads;
381382
end
383+
elseif strcmpi(sing, 'removable')
384+
type = 'removable';
385+
if (isfield(opts,'auxquads') && isfield(opts.auxquads,'ggqremovable'))
386+
auxquads = opts.auxquads.ggqremovable;
387+
else
388+
k = chnkr.k;
389+
auxquads = chnk.quadggq.setup(k, type);
390+
opts.auxquads.ggqremovable = auxquads;
391+
end
382392
elseif strcmpi(singi,'log')
383393
type = 'log';
384394
if (isfield(opts,'auxquads') &&isfield(opts.auxquads,'ggqlog'))

0 commit comments

Comments
 (0)