|
| 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 | + |
0 commit comments