annotate diracDiscr.m @ 1236:3722c2579818 feature/dirac_discr

Attempt to factor out a function for finding indecies of the source
author Jonatan Werpers <jonatan@werpers.com>
date Wed, 20 Nov 2019 00:10:30 +0100
parents 48c9a83260c8
children 6e4cc4b66de0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1229
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
1
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
2 function d = diracDiscr(x_s, x, m_order, s_order, H)
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
3 % n-dimensional delta function
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
4 % x_s: source point coordinate vector, e.g. [x, y] or [x, y, z].
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
5 % x: cell array of grid point column vectors for each dimension.
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
6 % m_order: Number of moment conditions
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
7 % s_order: Number of smoothness conditions
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
8 % H: cell array of 1D norm matrices
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
9
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
10 dim = length(x_s);
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
11 d_1D = cell(dim,1);
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
12
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
13 % If 1D, non-cell input is accepted
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
14 if dim == 1 && ~iscell(x)
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
15 d = diracDiscr1D(x_s, x, m_order, s_order, H);
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
16
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
17 else
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
18 for i = 1:dim
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
19 d_1D{i} = diracDiscr1D(x_s(i), x{i}, m_order, s_order, H{i});
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
20 end
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
21
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
22 d = d_1D{dim};
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
23 for i = dim-1: -1: 1
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
24 % Perform outer product, transpose, and then turn into column vector
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
25 d = (d_1D{i}*d')';
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
26 d = d(:);
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
27 end
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
28 end
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
29
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
30 end
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
31
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
32
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
33 % Helper function for 1D delta functions
1232
52d774e69b1f Clean up diracDiscr, remove obsolete tests.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1229
diff changeset
34 function ret = diracDiscr1D(x_s , x , m_order, s_order, H)
1229
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
35
1232
52d774e69b1f Clean up diracDiscr, remove obsolete tests.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1229
diff changeset
36 m = length(x);
1229
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
37
1232
52d774e69b1f Clean up diracDiscr, remove obsolete tests.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1229
diff changeset
38 % Return zeros if x0 is outside grid
52d774e69b1f Clean up diracDiscr, remove obsolete tests.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1229
diff changeset
39 if(x_s < x(1) || x_s > x(end) )
1229
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
40
1232
52d774e69b1f Clean up diracDiscr, remove obsolete tests.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1229
diff changeset
41 ret = zeros(size(x));
1229
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
42
1232
52d774e69b1f Clean up diracDiscr, remove obsolete tests.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1229
diff changeset
43 else
52d774e69b1f Clean up diracDiscr, remove obsolete tests.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1229
diff changeset
44 fnorm = diag(H);
52d774e69b1f Clean up diracDiscr, remove obsolete tests.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1229
diff changeset
45 tot_order = m_order+s_order; %This is equiv. to the number of equations solved for
52d774e69b1f Clean up diracDiscr, remove obsolete tests.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1229
diff changeset
46 S = [];
52d774e69b1f Clean up diracDiscr, remove obsolete tests.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1229
diff changeset
47 M = [];
1229
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
48
1232
52d774e69b1f Clean up diracDiscr, remove obsolete tests.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1229
diff changeset
49 % Get interior grid spacing
52d774e69b1f Clean up diracDiscr, remove obsolete tests.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1229
diff changeset
50 middle = floor(m/2);
52d774e69b1f Clean up diracDiscr, remove obsolete tests.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1229
diff changeset
51 h = x(middle+1) - x(middle);
1229
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
52
1236
3722c2579818 Attempt to factor out a function for finding indecies of the source
Jonatan Werpers <jonatan@werpers.com>
parents: 1235
diff changeset
53 index = sourceIndecies(x_s, x, tot_order, h)
1229
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
54
1236
3722c2579818 Attempt to factor out a function for finding indecies of the source
Jonatan Werpers <jonatan@werpers.com>
parents: 1235
diff changeset
55 polynomial = (x(index)-x(index(1)))/(x(index(end))-x(index(1)));
3722c2579818 Attempt to factor out a function for finding indecies of the source
Jonatan Werpers <jonatan@werpers.com>
parents: 1235
diff changeset
56 x_0 = (x_s-x(index(1)))/(x(index(end))-x(index(1)));
3722c2579818 Attempt to factor out a function for finding indecies of the source
Jonatan Werpers <jonatan@werpers.com>
parents: 1235
diff changeset
57 norm = fnorm(index)/h;
1229
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
58
1232
52d774e69b1f Clean up diracDiscr, remove obsolete tests.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1229
diff changeset
59 h_polynomial = polynomial(2)-polynomial(1);
1236
3722c2579818 Attempt to factor out a function for finding indecies of the source
Jonatan Werpers <jonatan@werpers.com>
parents: 1235
diff changeset
60 b = zeros(tot_order,1);
1229
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
61
1232
52d774e69b1f Clean up diracDiscr, remove obsolete tests.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1229
diff changeset
62 for i = 1:m_order
52d774e69b1f Clean up diracDiscr, remove obsolete tests.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1229
diff changeset
63 b(i,1) = x_0^(i-1);
52d774e69b1f Clean up diracDiscr, remove obsolete tests.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1229
diff changeset
64 end
1229
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
65
1236
3722c2579818 Attempt to factor out a function for finding indecies of the source
Jonatan Werpers <jonatan@werpers.com>
parents: 1235
diff changeset
66 for i = 1:tot_order
1232
52d774e69b1f Clean up diracDiscr, remove obsolete tests.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1229
diff changeset
67 for j = 1:m_order
52d774e69b1f Clean up diracDiscr, remove obsolete tests.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1229
diff changeset
68 M(j,i) = polynomial(i)^(j-1)*h_polynomial*norm(i);
52d774e69b1f Clean up diracDiscr, remove obsolete tests.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1229
diff changeset
69 end
1229
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
70 end
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
71
1236
3722c2579818 Attempt to factor out a function for finding indecies of the source
Jonatan Werpers <jonatan@werpers.com>
parents: 1235
diff changeset
72 for i = 1:tot_order
1232
52d774e69b1f Clean up diracDiscr, remove obsolete tests.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1229
diff changeset
73 for j = 1:s_order
52d774e69b1f Clean up diracDiscr, remove obsolete tests.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1229
diff changeset
74 S(j,i) = (-1)^(i-1)*polynomial(i)^(j-1);
52d774e69b1f Clean up diracDiscr, remove obsolete tests.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1229
diff changeset
75 end
1229
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
76 end
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
77
1232
52d774e69b1f Clean up diracDiscr, remove obsolete tests.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1229
diff changeset
78 A = [M;S];
1229
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
79
1232
52d774e69b1f Clean up diracDiscr, remove obsolete tests.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1229
diff changeset
80 d = A\b;
52d774e69b1f Clean up diracDiscr, remove obsolete tests.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1229
diff changeset
81 ret = x*0;
52d774e69b1f Clean up diracDiscr, remove obsolete tests.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1229
diff changeset
82 ret(index) = d/h*h_polynomial;
52d774e69b1f Clean up diracDiscr, remove obsolete tests.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1229
diff changeset
83 end
1229
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
84
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
85 end
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
86
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
87
1236
3722c2579818 Attempt to factor out a function for finding indecies of the source
Jonatan Werpers <jonatan@werpers.com>
parents: 1235
diff changeset
88 function I = sourceIndecies(x_s, x, tot_order, h)
3722c2579818 Attempt to factor out a function for finding indecies of the source
Jonatan Werpers <jonatan@werpers.com>
parents: 1235
diff changeset
89 % Find the indices that are within range of of the point source location
3722c2579818 Attempt to factor out a function for finding indecies of the source
Jonatan Werpers <jonatan@werpers.com>
parents: 1235
diff changeset
90 I = find(tot_order*h/2 >= abs(x-x_s));
1229
86ee5648e384 Add multi-d dirac discretization with tests
Martin Almquist <malmquist@stanford.edu>
parents:
diff changeset
91
1236
3722c2579818 Attempt to factor out a function for finding indecies of the source
Jonatan Werpers <jonatan@werpers.com>
parents: 1235
diff changeset
92 if length(I) > tot_order
3722c2579818 Attempt to factor out a function for finding indecies of the source
Jonatan Werpers <jonatan@werpers.com>
parents: 1235
diff changeset
93 if length(I) == tot_order + 2
3722c2579818 Attempt to factor out a function for finding indecies of the source
Jonatan Werpers <jonatan@werpers.com>
parents: 1235
diff changeset
94 I = I(2:end-1);
3722c2579818 Attempt to factor out a function for finding indecies of the source
Jonatan Werpers <jonatan@werpers.com>
parents: 1235
diff changeset
95 elseif length(I) == tot_order + 1
3722c2579818 Attempt to factor out a function for finding indecies of the source
Jonatan Werpers <jonatan@werpers.com>
parents: 1235
diff changeset
96 I = I(1:end-1);
3722c2579818 Attempt to factor out a function for finding indecies of the source
Jonatan Werpers <jonatan@werpers.com>
parents: 1235
diff changeset
97 end
3722c2579818 Attempt to factor out a function for finding indecies of the source
Jonatan Werpers <jonatan@werpers.com>
parents: 1235
diff changeset
98 elseif length(I) < tot_order
3722c2579818 Attempt to factor out a function for finding indecies of the source
Jonatan Werpers <jonatan@werpers.com>
parents: 1235
diff changeset
99 if x_s < x(1) + ceil(tot_order/2)*h;
3722c2579818 Attempt to factor out a function for finding indecies of the source
Jonatan Werpers <jonatan@werpers.com>
parents: 1235
diff changeset
100 I = 1:tot_order;
3722c2579818 Attempt to factor out a function for finding indecies of the source
Jonatan Werpers <jonatan@werpers.com>
parents: 1235
diff changeset
101 elseif x_s > x(end) - ceil(tot_order/2)*h;
3722c2579818 Attempt to factor out a function for finding indecies of the source
Jonatan Werpers <jonatan@werpers.com>
parents: 1235
diff changeset
102 I = length(x)-tot_order+1:length(x);
3722c2579818 Attempt to factor out a function for finding indecies of the source
Jonatan Werpers <jonatan@werpers.com>
parents: 1235
diff changeset
103 else
3722c2579818 Attempt to factor out a function for finding indecies of the source
Jonatan Werpers <jonatan@werpers.com>
parents: 1235
diff changeset
104 if I(end) < length(x)
3722c2579818 Attempt to factor out a function for finding indecies of the source
Jonatan Werpers <jonatan@werpers.com>
parents: 1235
diff changeset
105 I = [I; I(end)+1];
3722c2579818 Attempt to factor out a function for finding indecies of the source
Jonatan Werpers <jonatan@werpers.com>
parents: 1235
diff changeset
106 else
3722c2579818 Attempt to factor out a function for finding indecies of the source
Jonatan Werpers <jonatan@werpers.com>
parents: 1235
diff changeset
107 I = [I(1)-1; I];
3722c2579818 Attempt to factor out a function for finding indecies of the source
Jonatan Werpers <jonatan@werpers.com>
parents: 1235
diff changeset
108 end
3722c2579818 Attempt to factor out a function for finding indecies of the source
Jonatan Werpers <jonatan@werpers.com>
parents: 1235
diff changeset
109 end
3722c2579818 Attempt to factor out a function for finding indecies of the source
Jonatan Werpers <jonatan@werpers.com>
parents: 1235
diff changeset
110 end
3722c2579818 Attempt to factor out a function for finding indecies of the source
Jonatan Werpers <jonatan@werpers.com>
parents: 1235
diff changeset
111 end