comparison diracDiscr.m @ 837:43a1c3ac07b1 feature/poroelastic

Make diracDiscr work for n dimensions. Add tests up to 3D.
author Martin Almquist <malmquist@stanford.edu>
date Wed, 05 Sep 2018 18:09:18 -0700
parents 049e4c6fa630
children c70131daaa6e 60c875c18de3
comparison
equal deleted inserted replaced
836:049e4c6fa630 837:43a1c3ac07b1
1 function ret = diracDiscr(x_0in , x , m_order, s_order, H, h) 1
2 function d = diracDiscr(x_s, x, m_order, s_order, H)
3 % n-dimensional delta function
4 % x_s: source point coordinate vector, e.g. [x, y] or [x, y, z].
5 % x: cell array of grid point column vectors for each dimension.
6 % m_order: Number of moment conditions
7 % s_order: Number of smoothness conditions
8 % H: cell array of 1D norm matrices
9
10 dim = length(x_s);
11 d_1D = cell(dim,1);
12
13 % If 1D, non-cell input is accepted
14 if dim == 1 && ~iscell(x)
15 d = diracDiscr1D(x_s, x, m_order, s_order, H);
16
17 else
18 for i = 1:dim
19 d_1D{i} = diracDiscr1D(x_s(i), x{i}, m_order, s_order, H{i});
20 end
21
22 d = d_1D{dim};
23 for i = dim-1: -1: 1
24 % Perform outer product, transpose, and then turn into column vector
25 d = (d_1D{i}*d')';
26 d = d(:);
27 end
28 end
29
30 end
31
32
33 % Helper function for 1D delta functions
34 function ret = diracDiscr1D(x_0in , x , m_order, s_order, H)
2 35
3 m = length(x); 36 m = length(x);
4 37
5 % Return zeros if x0 is outside grid 38 % Return zeros if x0 is outside grid
6 if(x_0in < x(1) || x_0in > x(end) ) 39 if(x_0in < x(1) || x_0in > x(end) )
12 fnorm = diag(H); 45 fnorm = diag(H);
13 eta = abs(x-x_0in); 46 eta = abs(x-x_0in);
14 tot = m_order+s_order; 47 tot = m_order+s_order;
15 S = []; 48 S = [];
16 M = []; 49 M = [];
17 50
18 % Get interior grid spacing 51 % Get interior grid spacing
19 middle = floor(m/2); 52 middle = floor(m/2);
20 h = x(middle+1) - x(middle); 53 h = x(middle+1) - x(middle);
21 54
22 poss = find(tot*h/2 >= eta); 55 poss = find(tot*h/2 >= eta);
51 end 84 end
52 pol = (x(poss)-x(poss(1)))/(x(poss(end))-x(poss(1))); 85 pol = (x(poss)-x(poss(1)))/(x(poss(end))-x(poss(1)));
53 x_0 = (x_0in-x(poss(1)))/(x(poss(end))-x(poss(1))); 86 x_0 = (x_0in-x(poss(1)))/(x(poss(end))-x(poss(1)));
54 norm = fnorm(poss)/h; 87 norm = fnorm(poss)/h;
55 index = poss; 88 index = poss;
56 89
57 % Interior 90 % Interior
58 else 91 else
59 pol = (x(poss)-x(poss(1)))/(x(poss(end))-x(poss(1))); 92 pol = (x(poss)-x(poss(1)))/(x(poss(end))-x(poss(1)));
60 x_0 = (x_0in-x(poss(1)))/(x(poss(end))-x(poss(1))); 93 x_0 = (x_0in-x(poss(1)))/(x(poss(end))-x(poss(1)));
61 norm = fnorm(poss)/h; 94 norm = fnorm(poss)/h;
62 index = poss; 95 index = poss;
63 end 96 end