Mercurial > repos > public > sbplib
annotate +parametrization/Ti.m @ 1037:2d7ba44340d0 feature/burgers1d
Pass scheme specific parameters as cell array. This will enabale constructDiffOps to be more general. In addition, allow for schemes returning function handles as diffOps, which is currently how non-linear schemes such as Burgers1d are implemented.
author | Vidar Stiernström <vidar.stiernstrom@it.uu.se> |
---|---|
date | Fri, 18 Jan 2019 09:02:02 +0100 |
parents | edb1d60b0b77 |
children |
rev | line source |
---|---|
0 | 1 classdef Ti |
2 properties | |
3 gs % {4}Curve | |
4 S % FunctionHandle(u,v) | |
5 end | |
6 | |
7 methods | |
8 % TODO function to label boundary names. | |
9 % function to find largest and smallest delta h in the grid. Maybe shouldnt live here | |
10 function obj = Ti(C1,C2,C3,C4) | |
11 obj.gs = {C1,C2,C3,C4}; | |
12 | |
13 g1 = C1.g; | |
14 g2 = C2.g; | |
15 g3 = C3.g; | |
16 g4 = C4.g; | |
17 | |
18 A = g1(0); | |
19 B = g2(0); | |
20 C = g3(0); | |
21 D = g4(0); | |
22 | |
23 function o = S_fun(u,v) | |
633
6f4eb3da8978
Flip input and outputs if they are columnvectors.
Jonatan Werpers <jonatan@werpers.com>
parents:
632
diff
changeset
|
24 if isrow(u) && isrow(v) |
6f4eb3da8978
Flip input and outputs if they are columnvectors.
Jonatan Werpers <jonatan@werpers.com>
parents:
632
diff
changeset
|
25 flipped = false; |
6f4eb3da8978
Flip input and outputs if they are columnvectors.
Jonatan Werpers <jonatan@werpers.com>
parents:
632
diff
changeset
|
26 else |
6f4eb3da8978
Flip input and outputs if they are columnvectors.
Jonatan Werpers <jonatan@werpers.com>
parents:
632
diff
changeset
|
27 flipped = true; |
6f4eb3da8978
Flip input and outputs if they are columnvectors.
Jonatan Werpers <jonatan@werpers.com>
parents:
632
diff
changeset
|
28 u = u'; |
6f4eb3da8978
Flip input and outputs if they are columnvectors.
Jonatan Werpers <jonatan@werpers.com>
parents:
632
diff
changeset
|
29 v = v'; |
6f4eb3da8978
Flip input and outputs if they are columnvectors.
Jonatan Werpers <jonatan@werpers.com>
parents:
632
diff
changeset
|
30 end |
6f4eb3da8978
Flip input and outputs if they are columnvectors.
Jonatan Werpers <jonatan@werpers.com>
parents:
632
diff
changeset
|
31 |
0 | 32 x1 = g1(u); |
33 x2 = g2(v); | |
34 x3 = g3(1-u); | |
35 x4 = g4(1-v); | |
633
6f4eb3da8978
Flip input and outputs if they are columnvectors.
Jonatan Werpers <jonatan@werpers.com>
parents:
632
diff
changeset
|
36 |
0 | 37 o1 = (1-v).*x1(1,:) + u.*x2(1,:) + v.*x3(1,:) + (1-u).*x4(1,:) ... |
632
d98d9c79573f
Switch to elementwise multiplication where it was not used
Jonatan Werpers <jonatan@werpers.com>
parents:
544
diff
changeset
|
38 -((1-u).*(1-v).*A(1,:) + u.*(1-v).*B(1,:) + u.*v.*C(1,:) + (1-u).*v.*D(1,:)); |
0 | 39 o2 = (1-v).*x1(2,:) + u.*x2(2,:) + v.*x3(2,:) + (1-u).*x4(2,:) ... |
632
d98d9c79573f
Switch to elementwise multiplication where it was not used
Jonatan Werpers <jonatan@werpers.com>
parents:
544
diff
changeset
|
40 -((1-u).*(1-v).*A(2,:) + u.*(1-v).*B(2,:) + u.*v.*C(2,:) + (1-u).*v.*D(2,:)); |
0 | 41 |
633
6f4eb3da8978
Flip input and outputs if they are columnvectors.
Jonatan Werpers <jonatan@werpers.com>
parents:
632
diff
changeset
|
42 if ~flipped |
6f4eb3da8978
Flip input and outputs if they are columnvectors.
Jonatan Werpers <jonatan@werpers.com>
parents:
632
diff
changeset
|
43 o = [o1;o2]; |
6f4eb3da8978
Flip input and outputs if they are columnvectors.
Jonatan Werpers <jonatan@werpers.com>
parents:
632
diff
changeset
|
44 else |
6f4eb3da8978
Flip input and outputs if they are columnvectors.
Jonatan Werpers <jonatan@werpers.com>
parents:
632
diff
changeset
|
45 o = [o1'; o2']; |
6f4eb3da8978
Flip input and outputs if they are columnvectors.
Jonatan Werpers <jonatan@werpers.com>
parents:
632
diff
changeset
|
46 end |
0 | 47 end |
48 | |
49 obj.S = @S_fun; | |
50 end | |
51 | |
272
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
52 % Does this funciton make sense? |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
53 % Should it always be eval? |
0 | 54 function [X,Y] = map(obj,u,v) |
55 default_arg('v',u); | |
56 | |
57 if isscalar(u) | |
58 u = linspace(0,1,u); | |
59 end | |
60 | |
61 if isscalar(v) | |
62 v = linspace(0,1,v); | |
63 end | |
64 | |
65 S = obj.S; | |
66 | |
67 nu = length(u); | |
68 nv = length(v); | |
69 | |
70 X = zeros(nv,nu); | |
71 Y = zeros(nv,nu); | |
72 | |
73 u = rowVector(u); | |
74 v = rowVector(v); | |
75 | |
76 for i = 1:nv | |
77 p = S(u,v(i)); | |
78 X(i,:) = p(1,:); | |
79 Y(i,:) = p(2,:); | |
80 end | |
81 end | |
82 | |
272
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
83 % Evaluate S for each pair of u and v, |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
84 % Return same shape as u |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
85 function [x, y] = eval(obj, u, v) |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
86 x = zeros(size(u)); |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
87 y = zeros(size(u)); |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
88 |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
89 for i = 1:numel(u) |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
90 p = obj.S(u(i), v(i)); |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
91 x(i) = p(1,:); |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
92 y(i) = p(2,:); |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
93 end |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
94 end |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
95 |
0 | 96 function h = plot(obj,nu,nv) |
97 S = obj.S; | |
98 | |
99 default_arg('nv',nu) | |
100 | |
101 u = linspace(0,1,nu); | |
102 v = linspace(0,1,nv); | |
103 | |
104 m = 100; | |
105 | |
106 X = zeros(nu+nv,m); | |
107 Y = zeros(nu+nv,m); | |
108 | |
109 | |
110 t = linspace(0,1,m); | |
111 for i = 1:nu | |
112 p = S(u(i),t); | |
113 X(i,:) = p(1,:); | |
114 Y(i,:) = p(2,:); | |
115 end | |
116 | |
117 for i = 1:nv | |
118 p = S(t,v(i)); | |
119 X(i+nu,:) = p(1,:); | |
120 Y(i+nu,:) = p(2,:); | |
121 end | |
122 | |
123 h = line(X',Y'); | |
124 end | |
125 | |
126 | |
127 function h = show(obj,nu,nv) | |
128 default_arg('nv',nu) | |
129 S = obj.S; | |
130 | |
131 if(nu>2 || nv>2) | |
773
edb1d60b0b77
Return line handles from show methods in Def and Ti
Jonatan Werpers <jonatan@werpers.com>
parents:
633
diff
changeset
|
132 h.grid = obj.plot(nu,nv); |
edb1d60b0b77
Return line handles from show methods in Def and Ti
Jonatan Werpers <jonatan@werpers.com>
parents:
633
diff
changeset
|
133 set(h.grid,'Color',[0 0.4470 0.7410]); |
0 | 134 end |
135 | |
773
edb1d60b0b77
Return line handles from show methods in Def and Ti
Jonatan Werpers <jonatan@werpers.com>
parents:
633
diff
changeset
|
136 h.border = obj.plot(2,2); |
edb1d60b0b77
Return line handles from show methods in Def and Ti
Jonatan Werpers <jonatan@werpers.com>
parents:
633
diff
changeset
|
137 set(h.border,'Color',[0.8500 0.3250 0.0980]); |
edb1d60b0b77
Return line handles from show methods in Def and Ti
Jonatan Werpers <jonatan@werpers.com>
parents:
633
diff
changeset
|
138 set(h.border,'LineWidth',2); |
0 | 139 end |
140 | |
141 | |
142 % TRANSFORMATIONS | |
143 function ti = translate(obj,a) | |
144 gs = obj.gs; | |
145 | |
146 for i = 1:length(gs) | |
147 new_gs{i} = gs{i}.translate(a); | |
148 end | |
149 | |
248
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
150 ti = parametrization.Ti(new_gs{:}); |
0 | 151 end |
152 | |
153 % Mirrors the Ti so that the resulting Ti is still left handed. | |
154 % (Corrected by reversing curves and switching e and w) | |
155 function ti = mirror(obj, a, b) | |
156 gs = obj.gs; | |
157 | |
158 new_gs = cell(1,4); | |
159 | |
160 new_gs{1} = gs{1}.mirror(a,b).reverse(); | |
161 new_gs{3} = gs{3}.mirror(a,b).reverse(); | |
162 new_gs{2} = gs{4}.mirror(a,b).reverse(); | |
163 new_gs{4} = gs{2}.mirror(a,b).reverse(); | |
164 | |
248
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
165 ti = parametrization.Ti(new_gs{:}); |
0 | 166 end |
167 | |
168 function ti = rotate(obj,a,rad) | |
169 gs = obj.gs; | |
170 | |
171 for i = 1:length(gs) | |
172 new_gs{i} = gs{i}.rotate(a,rad); | |
173 end | |
174 | |
248
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
175 ti = parametrization.Ti(new_gs{:}); |
0 | 176 end |
177 | |
178 function ti = rotate_edges(obj,n); | |
179 new_gs = cell(1,4); | |
180 for i = 0:3 | |
181 new_i = mod(i - n,4); | |
182 new_gs{new_i+1} = obj.gs{i+1}; | |
183 end | |
248
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
184 ti = parametrization.Ti(new_gs{:}); |
0 | 185 end |
186 end | |
187 | |
188 methods(Static) | |
189 function obj = points(p1, p2, p3, p4) | |
248
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
190 g1 = parametrization.Curve.line(p1,p2); |
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
191 g2 = parametrization.Curve.line(p2,p3); |
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
192 g3 = parametrization.Curve.line(p3,p4); |
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
193 g4 = parametrization.Curve.line(p4,p1); |
0 | 194 |
248
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
195 obj = parametrization.Ti(g1,g2,g3,g4); |
0 | 196 end |
197 | |
544
433ccb5d2f0f
Add Ti parametrization of rectangle
Jonatan Werpers <jonatan@werpers.com>
parents:
332
diff
changeset
|
198 function obj = rectangle(a, b) |
433ccb5d2f0f
Add Ti parametrization of rectangle
Jonatan Werpers <jonatan@werpers.com>
parents:
332
diff
changeset
|
199 p1 = a; |
433ccb5d2f0f
Add Ti parametrization of rectangle
Jonatan Werpers <jonatan@werpers.com>
parents:
332
diff
changeset
|
200 p2 = [b(1), a(2)]; |
433ccb5d2f0f
Add Ti parametrization of rectangle
Jonatan Werpers <jonatan@werpers.com>
parents:
332
diff
changeset
|
201 p3 = b; |
433ccb5d2f0f
Add Ti parametrization of rectangle
Jonatan Werpers <jonatan@werpers.com>
parents:
332
diff
changeset
|
202 p4 = [a(1), b(2)]; |
433ccb5d2f0f
Add Ti parametrization of rectangle
Jonatan Werpers <jonatan@werpers.com>
parents:
332
diff
changeset
|
203 |
433ccb5d2f0f
Add Ti parametrization of rectangle
Jonatan Werpers <jonatan@werpers.com>
parents:
332
diff
changeset
|
204 obj = parametrization.Ti.points(p1,p2,p3,p4); |
433ccb5d2f0f
Add Ti parametrization of rectangle
Jonatan Werpers <jonatan@werpers.com>
parents:
332
diff
changeset
|
205 end |
433ccb5d2f0f
Add Ti parametrization of rectangle
Jonatan Werpers <jonatan@werpers.com>
parents:
332
diff
changeset
|
206 |
332
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
207 % Like the constructor but allows inputing line curves as 2-cell arrays: |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
208 % example: parametrization.Ti.linesAndCurves(g1, g2, {a, b} g4) |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
209 function obj = linesAndCurves(C1, C2, C3, C4) |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
210 C = {C1, C2, C3, C4}; |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
211 c = cell(1,4); |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
212 |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
213 for i = 1:4 |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
214 if ~iscell(C{i}) |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
215 c{i} = C{i}; |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
216 else |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
217 c{i} = parametrization.Curve.line(C{i}{:}); |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
218 end |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
219 end |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
220 |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
221 obj = parametrization.Ti(c{:}); |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
222 end |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
223 |
0 | 224 function label(varargin) |
225 if nargin == 2 && ischar(varargin{2}) | |
226 label_impl(varargin{:}); | |
227 else | |
228 for i = 1:length(varargin) | |
229 label_impl(varargin{i},inputname(i)); | |
230 end | |
231 end | |
232 | |
233 | |
234 function label_impl(ti,str) | |
235 S = ti.S; | |
236 | |
237 pc = S(0.5,0.5); | |
238 | |
239 margin = 0.1; | |
240 pw = S( margin, 0.5); | |
241 pe = S(1-margin, 0.5); | |
242 ps = S( 0.5, margin); | |
243 pn = S( 0.5, 1-margin); | |
244 | |
245 | |
246 ti.show(2,2); | |
248
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
247 parametrization.place_label(pc,str); |
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
248 parametrization.place_label(pw,'w'); |
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
249 parametrization.place_label(pe,'e'); |
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
250 parametrization.place_label(ps,'s'); |
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
251 parametrization.place_label(pn,'n'); |
0 | 252 end |
253 end | |
254 end | |
255 end |