Skip to content

Commit 5df96f2

Browse files
committed
updating smoother
1 parent 4bb3f92 commit 5df96f2

File tree

4 files changed

+126
-68
lines changed

4 files changed

+126
-68
lines changed

chunkie/+chnk/+smoother/get_sigs.m

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
function [val,grad] = get_sigs(src_input,rt,sig0,dlam)
1+
function [val,grad] = get_sigs(umesh,rt,sig0,dlam)
22

3-
rc = src_input.centroids;
4-
dlens = src_input.lengths;
3+
rc = umesh.centroids;
4+
dlens = umesh.lengths;
55

66
[~,ns] = size(rc);
77
[~,nt] = size(rt);

chunkie/+chnk/+smoother/gpsi_all.m

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
hess(:,1,1) = eterm./(dr.*dr);
3434
hess(:,2,2) = eterm./(dr.*dr);
3535

36-
fact = -(2*dsigt.^2+dr.^2)./(dsigt.^2*dr.^2).*eterm;
36+
fact = -(2*dsigt.^2+dr.^2)./(dsigt.^2.*dr.^2).*eterm;
3737
hess(:,1,1) = hess(:,1,1) + (dx.*dx./dr.^2).*fact;
3838
hess(:,1,2) = hess(:,1,2) + (dx.*dy./dr.^2).*fact;
3939
hess(:,2,1) = hess(:,2,1) + (dx.*dy./dr.^2).*fact;
@@ -59,7 +59,7 @@
5959

6060

6161
fact = eterm./(dsigt.^3)/(2*pi);
62-
hess_sig(:,1) = -dx*fact;
63-
hess_sig(:,2) = -dy*fact;
62+
hess_sig(:,1) = -dx.*fact;
63+
hess_sig(:,2) = -dy.*fact;
6464

6565
end

chunkie/+chnk/+smoother/green.m

Lines changed: 59 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,62 @@
11
function [val,grad,hess,hess_sig] = green(rs,rt,dsigt)
2-
3-
[~,ns] = size(rs);
4-
[~,nt] = size(rt);
5-
6-
xs = repmat(rs(1,:),nt,1);
7-
ys = repmat(rs(2,:),nt,1);
8-
9-
xt = repmat(rt(1,:).',1,ns);
10-
yt = repmat(rt(2,:).',1,ns);
11-
dst = repmat(dsigt.',1,ns);
12-
13-
dx = xt-xs;
14-
dy = yt-ys;
15-
dr = sqrt(dx.^2+dy.^2);
16-
17-
sz = size(dx);
18-
dx = dx(:);
19-
dy = dy(:);
20-
dr = dr(:);
21-
dst = dst(:);
22-
23-
da = sqrt(2.0d0)*dsigt;
24-
z = dr./da;
25-
26-
iloc = find(z < 0.1);
27-
ifar = find(z >= 0.1);
28-
29-
vs = zeros(ns*nt,1);
30-
gs = zeros(ns*nt,2);
31-
hs = zeros(ns*nt,2,2);
32-
hsigs = zeros(ns*nt,2);
33-
34-
if (numel(iloc) ~=0)
35-
[vl,gl,hl,hsl] = chnk.smoother.gpsi_loc(dx,dy,dr,dst);
36-
vs(iloc) = vl;
37-
gs(iloc,:) = gl;
38-
hs(iloc,:,:) = hl;
39-
hsigs(iloc,:) = hsl;
40-
end
41-
if (numel(ifar) ~=0)
42-
[vf,gf,hf,hsf] = chnk.smoother.gpsi_all(dx,dy,dr,dsigt);
43-
vs(ifar) = vf;
44-
gs(ifar,:) = gf;
45-
hs(ifar,:,:) = hf;
46-
hsigs(ifar,:) = hsf;
47-
end
48-
49-
val = reshape(vs,sz);
50-
if (nargout > 1)
51-
grad = squeeze(reshape(gs,[sz,2]));
52-
end
53-
if (nargout > 2)
54-
hess = squeeze(reshape(hs,[sz,2,2]));
55-
end
56-
if (nargout > 3)
57-
hess_sig = squeeze(reshape(hsigs,[sz,2]));
58-
59-
end
2+
3+
[~,ns] = size(rs);
4+
[~,nt] = size(rt);
5+
6+
xs = repmat(rs(1,:),nt,1);
7+
ys = repmat(rs(2,:),nt,1);
8+
9+
xt = repmat(rt(1,:).',1,ns);
10+
yt = repmat(rt(2,:).',1,ns);
11+
dst = repmat(dsigt.',1,ns);
12+
13+
dx = xt-xs;
14+
dy = yt-ys;
15+
dr = sqrt(dx.^2+dy.^2);
16+
17+
sz = size(dx);
18+
dx = dx(:);
19+
dy = dy(:);
20+
dr = dr(:);
21+
dst = dst(:);
22+
23+
da = sqrt(2.0d0)*dst;
24+
z = dr./da;
25+
26+
iloc = find(z < 0.1);
27+
ifar = find(z >= 0.1);
28+
29+
vs = zeros(ns*nt,1);
30+
gs = zeros(ns*nt,2);
31+
hs = zeros(ns*nt,2,2);
32+
hsigs = zeros(ns*nt,2);
33+
34+
if (numel(iloc) ~=0)
35+
[vl,gl,hl,hsl] = chnk.smoother.gpsi_loc(dx(iloc), dy(iloc), ...
36+
dr(iloc), dst(iloc));
37+
vs(iloc) = vl;
38+
gs(iloc,:) = gl;
39+
hs(iloc,:,:) = hl;
40+
hsigs(iloc,:) = hsl;
41+
end
42+
if (numel(ifar) ~=0)
43+
[vf,gf,hf,hsf] = chnk.smoother.gpsi_all(dx(ifar), dy(ifar), ...
44+
dr(ifar), dst(ifar));
45+
vs(ifar) = vf;
46+
gs(ifar,:) = gf;
47+
hs(ifar,:,:) = hf;
48+
hsigs(ifar,:) = hsf;
49+
end
50+
51+
val = reshape(vs,sz);
52+
if (nargout > 1)
53+
grad = squeeze(reshape(gs,[sz,2]));
54+
end
55+
if (nargout > 2)
56+
hess = squeeze(reshape(hs,[sz,2,2]));
57+
end
58+
if (nargout > 3)
59+
hess_sig = squeeze(reshape(hsigs,[sz,2]));
60+
end
6061

6162
end

chunkie/+chnk/+smoother/smooth_curve.m

Lines changed: 61 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
nv = 3;
22
z = exp(1j*2*pi*(1:nv)/nv);
33
verts = [real(z); imag(z)];
4-
nchs = randi([1,10], 1, nv);
4+
nchs = 3*ones(nv,1);
55
k = 16;
66

77
kquad = 32;
@@ -10,7 +10,7 @@
1010

1111
umesh = chnk.smoother.get_umesh(verts);
1212
dmesh = chnk.smoother.get_mesh(umesh, nchs, k);
13-
qmesh = get_mesh(umesh, nchs, kquad);
13+
qmesh = chnk.smoother.get_mesh(umesh, nchs, kquad);
1414

1515
figure(1)
1616
clf
@@ -23,5 +23,62 @@
2323
clf
2424
plot(dmesh.r(1,:), dmesh.r(2,:),'k.'); hold on;
2525
axis equal;
26-
% quiver(dmesh.r(1,:), dmesh.r(2,:), dmesh.n(1,:), dmesh.n(2,:),'k');
27-
quiver(dmesh.r(1,:), dmesh.r(2,:), dmesh.pseudo_normals(1,:), dmesh.pseudo_normals(2,:),'r');
26+
quiver(dmesh.r(1,:), dmesh.r(2,:), dmesh.pseudo_normals(1,:), dmesh.pseudo_normals(2,:),'r');
27+
28+
29+
[~, nd] = size(dmesh.r);
30+
h = zeros(nd,1);
31+
n_newton = 5;
32+
33+
sig0 = sqrt(5)*max(umesh.lengths);
34+
lam = 10;
35+
36+
37+
ww = qmesh.wts(:).';
38+
dpx = dmesh.pseudo_normals(1,:).';
39+
dpy = dmesh.pseudo_normals(2,:).';
40+
41+
rnx = qmesh.n(1,:).';
42+
rny = qmesh.n(2,:).';
43+
44+
for i=1:n_newton
45+
rt = dmesh.r;
46+
rt(1,:) = rt(1,:) + (h.*dpx).';
47+
rt(2,:) = rt(2,:) + (h.*dpy).';
48+
49+
[sig, sig_grad] = chnk.smoother.get_sigs(umesh, rt, sig0, lam);
50+
[val, grad, hess, hess_sig] = chnk.smoother.green(qmesh.r, rt, sig);
51+
gx = grad(:,:,1);
52+
gy = grad(:,:,2);
53+
54+
phi = -(gx*(rnx.*qmesh.wts) + gy*(rny.*qmesh.wts)) - 0.5;
55+
56+
57+
h11 = hess(:,:,1,1).*ww;
58+
h12 = hess(:,:,1,2).*ww;
59+
h21 = hess(:,:,2,1).*ww;
60+
h22 = hess(:,:,2,2).*ww;
61+
62+
h1sig = hess_sig(:,:,1).*ww;
63+
h2sig = hess_sig(:,:,2).*ww;
64+
65+
dx1 = h11*rnx + h12*rny;
66+
dy1 = h21*rnx + h22*rny;
67+
68+
dx2 = h1sig*rnx + h2sig*rny;
69+
dy2 = dx2;
70+
71+
dsigx = sig_grad(:,1);
72+
dsigy = sig_grad(:,2);
73+
74+
dx2 = dx2.*dsigx;
75+
dy2 = dy2.*dsigy;
76+
77+
78+
dphidh = (dx1 + dx2).*dpx + (dy1 + dy2).*dpy;
79+
h = h - phi./dphidh;
80+
81+
figure(i)
82+
plot(rt(1,:), rt(2,:), 'k.')
83+
84+
end

0 commit comments

Comments
 (0)