Skip to content

Commit 0b14452

Browse files
authored
Merge pull request #142 from peter-nekrasov/flexural-waves
added +flex2d, tests and demos
2 parents 096a173 + a913837 commit 0b14452

18 files changed

+2482
-2
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
function [cf1,cf2] = besseldiff_etc_pscoefs(nterms)
2+
% powerseries coefficients for J_0 - 1 and the other series in
3+
% definition of Y_0
4+
%
5+
% these are both series with the terms z^2,z^4,z^6,..z^(2*nterms)
6+
%
7+
% cf1 are power series coeffs of even terms (excluding constant)
8+
% for J_0(z) - 1
9+
%
10+
% cf2 are power series coeffs for the similar series
11+
% z^2/4 - (1+1/2)*(z^2/4)^2/(2!)^2 + (1+1/2+1/3)*(z^2/4)^3/(3!)^2 - ...
12+
%
13+
% which appears in the power series for H_0(z)
14+
15+
sum1 = 0;
16+
fac1 = 1;
17+
pow1 = 1;
18+
19+
cf1 = zeros(nterms,1);
20+
cf2 = zeros(nterms,1);
21+
sgn = 1;
22+
23+
for j = 1:nterms
24+
fac1 = fac1/(j*j);
25+
sum1 = sum1 + 1.0/j;
26+
pow1 = pow1*0.25;
27+
cf1(j) = -sgn*pow1*fac1;
28+
cf2(j) = sgn*sum1*pow1*fac1;
29+
sgn = -sgn;
30+
end
31+
32+
end
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
function [cf1,cf2] = besselkikdiff_etc_pscoefs(nterms)
2+
% powerseries coefficients for J_0(kz)-J_0(ikz) and the other series in
3+
% definition of Y_0(kz)-Y_0(ikz)
4+
%
5+
% these are both series with the terms z^2,z^6,z^10,..z^(4*nterms-2)
6+
%
7+
% cf1 are power series coeffs of these terms for J_0(z)-J_0(iz)
8+
%
9+
% cf2 are power series coeffs for the similar series
10+
% z^2/4 + (1+1/2+1/3)*(z^2/4)^3/(3!)^2 + (1+1/2+1/3+1/4+1/5)*(z^2/4)^5/(5!)^2 + ...
11+
%
12+
% which appears in the power series for Y_0(z)-Y_0(iz)
13+
14+
sum1 = 0;
15+
fac1 = 2;
16+
pow1 = 1;
17+
18+
cf1 = zeros(nterms,1);
19+
cf2 = zeros(nterms,1);
20+
21+
for j = 1:nterms
22+
fac1 = fac1/((2*j-1)*(2*j-1));
23+
sum1 = sum1 + 1.0/(2*j-1);
24+
pow1 = pow1*0.25;
25+
cf1(j) = -pow1*fac1;
26+
cf2(j) = sum1*pow1*fac1;
27+
fac1 = fac1/((2*j)*(2*j));
28+
sum1 = sum1 + 1.0/(2*j);
29+
pow1 = pow1*0.25;
30+
end
31+
32+
end

chunkie/+chnk/+flex2d/bhgreen.m

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
function [val,grad,hess,der3,der4,der5] = bhgreen(src,targ)
2+
%BHGREEN evaluate the difference of the
3+
% Helmholtz Green function and the modified Helmholtz Green function
4+
% for the given sources and targets, i.e.
5+
%
6+
% G(x,y) = |x-y|^2 log |x-y| / 8*pi
7+
%
8+
% - grad(:,:,1) has G_{x1}, grad(:,:,2) has G_{x2}
9+
% - hess(:,:,1) has G_{x1x1}, hess(:,:,2) has G_{x1x2},
10+
% hess(:,:,3) has G_{x2x2}
11+
% - der3 has the third derivatives in the order G_{x1x1x1}, G_{x1x1x2},
12+
% G_{x1x2x2}, G_{x2x2x2}
13+
% - der4 has the fourth derivatives in the order G_{x1x1x1x1},
14+
% G_{x1x1x1x2}, G_{x1x1x2x2}, G_{x1x2x2x2}, G_{x2x2x2x2}
15+
%
16+
% derivatives are on the *target* variables
17+
%
18+
% input:
19+
%
20+
% src - (2,ns) array of source locations
21+
% targ - (2,nt) array of target locations
22+
%
23+
24+
[~,ns] = size(src);
25+
[~,nt] = size(targ);
26+
27+
xs = repmat(src(1,:),nt,1);
28+
ys = repmat(src(2,:),nt,1);
29+
30+
xt = repmat(targ(1,:).',1,ns);
31+
yt = repmat(targ(2,:).',1,ns);
32+
33+
dx = xt-xs;
34+
dy = yt-ys;
35+
36+
dx2 = dx.*dx;
37+
dx3 = dx2.*dx;
38+
dx4 = dx3.*dx;
39+
dx5 = dx4.*dx;
40+
41+
dy2 = dy.*dy;
42+
dy3 = dy2.*dy;
43+
dy4 = dy3.*dy;
44+
dy5 = dy4.*dy;
45+
46+
r2 = dx2 + dy2;
47+
r = sqrt(r2);
48+
rm1 = 1./r;
49+
rm2 = rm1.*rm1;
50+
rm3 = rm1.*rm2;
51+
rm4 = rm1.*rm3;
52+
rm5 = rm1.*rm4;
53+
54+
% get value and r derivatives
55+
56+
[g0,g1,g21,g321,g4321,g54321] = r2logr_rders(r);
57+
58+
% evaluate potential and derivatives
59+
60+
if nargout > 0
61+
val = g0;
62+
end
63+
if nargout > 1
64+
grad(:,:,1) = dx.*g1.*rm1;
65+
grad(:,:,2) = dy.*g1.*rm1;
66+
end
67+
if nargout > 2
68+
hess(:,:,1) = dx2.*g21.*rm2+g1.*rm1;
69+
hess(:,:,2) = dx.*dy.*g21.*rm2;
70+
hess(:,:,3) = dy2.*g21.*rm2+g1.*rm1;
71+
end
72+
if nargout > 3
73+
der3(:,:,1) = dx3.*g321.*rm3+3*dx.*g21.*rm2;
74+
der3(:,:,2) = dx2.*dy.*g321.*rm3 + ...
75+
dy.*g21.*rm2;
76+
der3(:,:,3) = dx.*dy2.*g321.*rm3 + ...
77+
dx.*g21.*rm2;
78+
der3(:,:,4) = dy3.*g321.*rm3+3*dy.*g21.*rm2;
79+
end
80+
81+
if nargout > 4
82+
der4(:,:,1) = dx4.*g4321.*rm4 + ...
83+
6*dx2.*g321.*rm3 + ...
84+
3*g21.*rm2;
85+
der4(:,:,2) = dx3.*dy.*g4321.*rm4 + ...
86+
3*dx.*dy.*g321.*rm3;
87+
der4(:,:,3) = dx2.*dy2.*g4321.*rm4 + ...
88+
g321.*rm1 + g21.*rm2;
89+
der4(:,:,4) = dx.*dy3.*g4321.*rm4 + ...
90+
3*dx.*dy.*g321.*rm3;
91+
der4(:,:,5) = dy4.*g4321.*rm4 + ...
92+
6*dy2.*g321.*rm3 + ...
93+
3*g21.*rm2;
94+
end
95+
96+
if nargout > 5
97+
der5(:,:,1) = dx5.*g54321.*rm5 + 10*dx3.*g4321.*rm4 + 15*dx.*g321.*rm3;
98+
der5(:,:,2) = dy.*(dx4.*g54321.*rm5+6*dx2.*g4321.*rm4 + 3*g321.*rm3);
99+
der5(:,:,3) = dy2.*(dx3.*g54321.*rm5+2*dx.*g4321.*rm4) + dx.*(g4321.*rm2 + 3*g321.*rm3);
100+
der5(:,:,4) = dx2.*(dy3.*g54321.*rm5+2*dy.*g4321.*rm4) + dy.*(g4321.*rm2 + 3*g321.*rm3);
101+
der5(:,:,5) = dx.*dy4.*g54321.*rm5+6*dx.*dy2.*g4321.*rm4 + 3*dx.*g321.*rm3;
102+
der5(:,:,6) = dy5.*(g54321).*rm5 + ...
103+
dy3.*(10*g4321).*rm4 + dy.*(15*g321).*rm3;
104+
end
105+
106+
end
107+
108+
function [g0,g1,g21,g321,g4321,g54321] = r2logr_rders(r)
109+
% g0 = g
110+
% g1 = g'
111+
% g21 = g'' - g'/r
112+
% g321 = g''' - 3*g''/r + 3g'/r^2 = g''' - 3*g21/r
113+
% g4321 = g'''' - 6*g'''/r + 15*g''/r^2 - 15*g'/r^3
114+
% = g''''- 6 g321/r - 3 g21/r^2
115+
% g54321 = g''''' - 10g''''/r + 45g'''/r^2 -105g''/r^3 + 105g'/r^4
116+
% = g5 - 10g4321/r - 15 g321/r^2
117+
118+
o8p = 1/(8*pi);
119+
120+
%
121+
122+
r2 = r.*r;
123+
r2d1 = 2*r;
124+
125+
rm1 = 1./r;
126+
rm2 = rm1.*rm1;
127+
rm3 = rm2.*rm1;
128+
rm4 = rm3.*rm1;
129+
rm5 = rm4.*rm1;
130+
131+
logr = log(r);
132+
133+
g0 = o8p*(logr.*r2);
134+
g1 = o8p*(logr.*r2d1 + r2.*rm1);
135+
g21 = o8p*(2*r2d1.*rm1 - 2*r2.*rm2);
136+
g321 = o8p*(-6*r2d1.*rm2 + 8*r2.*rm3);
137+
g4321 = o8p*(32*r2d1.*rm3 - 48*r2.*rm4);
138+
g54321 = o8p*(- 240*r2d1.*rm4 + 384*r2.*rm5);
139+
140+
end
141+
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
function [v] = even_pseval(cf,x)
2+
% evaluates an even power series with no constant term
3+
% with coefficients given in cf.
4+
%
5+
% x can be an array
6+
7+
x2 = x.*x;
8+
9+
xp = x2;
10+
11+
v = zeros(size(x));
12+
13+
nterms = length(cf);
14+
for j = 1:nterms
15+
v = v + cf(j)*xp;
16+
xp = xp.*x2;
17+
end

0 commit comments

Comments
 (0)