Mercurial > repos > public > sbplib
comparison +scheme/Schrodinger2dCurve.m @ 497:4905446f165e feature/quantumTriangles
Added 2D interface to shrodinger
author | Ylva Rydin <ylva.rydin@telia.com> |
---|---|
date | Sat, 25 Feb 2017 12:44:01 +0100 |
parents | 6b8297f66c91 |
children | 324c927d8b1d |
comparison
equal
deleted
inserted
replaced
496:437fad4a47e1 | 497:4905446f165e |
---|---|
18 Hiu, Hiv | 18 Hiu, Hiv |
19 D1_v, D1_u | 19 D1_v, D1_u |
20 D2_v, D2_u | 20 D2_v, D2_u |
21 Du, Dv | 21 Du, Dv |
22 x,y | 22 x,y |
23 | 23 b1, b2 |
24 b1_u,b2_v | |
25 DU, DV, DUU, DUV, DVU, DVV | |
26 | |
24 e_w, e_e, e_s, e_n | 27 e_w, e_e, e_s, e_n |
25 du_w, dv_w | 28 du_w, dv_w |
26 du_e, dv_e | 29 du_e, dv_e |
27 du_s, dv_s | 30 du_s, dv_s |
28 du_n, dv_n | 31 du_n, dv_n |
29 g_1, g_2 | 32 g_1, g_2 |
30 c | 33 c |
34 ind | |
35 t_up | |
36 | |
31 a11, a12, a22 | 37 a11, a12, a22 |
32 m_tot, m_u, m_v | 38 m_tot, m_u, m_v |
33 p,p_tau | 39 p |
34 Ji | 40 Ji |
35 end | 41 end |
36 | 42 |
37 methods | 43 methods |
38 function obj = Schrodinger2dCurve(g ,order, opSet,p,p_tau) | 44 function obj = Schrodinger2dCurve(g ,order, opSet,p) |
39 default_arg('opSet',@sbp.D2Variable); | 45 default_arg('opSet',@sbp.D2Variable); |
40 default_arg('c', 1); | 46 default_arg('c', 1); |
41 | 47 |
42 obj.p=p; | 48 obj.p=p; |
43 obj.p_tau=p_tau; | |
44 obj.c=1; | 49 obj.c=1; |
45 | 50 |
46 m = g.size(); | 51 m = g.size(); |
47 obj.m_u = m(1); | 52 obj.m_u = m(1); |
48 obj.m_v = m(2); | 53 obj.m_v = m(2); |
49 obj.m_tot = g.N(); | 54 obj.m_tot = g.N(); |
50 | 55 obj.grid=g; |
56 | |
51 h = g.scaling(); | 57 h = g.scaling(); |
52 h_u = h(1); | 58 h_u = h(1); |
53 h_v = h(2); | 59 h_v = h(2); |
54 | 60 |
55 % Operators | 61 % Operators |
78 d1_l_v = ops_v.d1_l; | 84 d1_l_v = ops_v.d1_l; |
79 d1_r_v = ops_v.d1_r; | 85 d1_r_v = ops_v.d1_r; |
80 | 86 |
81 obj.Du = kr(obj.D1_u,I_v); | 87 obj.Du = kr(obj.D1_u,I_v); |
82 obj.Dv = kr(I_u,obj.D1_v); | 88 obj.Dv = kr(I_u,obj.D1_v); |
83 | 89 |
84 obj.H = kr(H_u,H_v); | 90 obj.H = kr(H_u,H_v); |
85 obj.Hi = kr(Hi_u,Hi_v); | 91 obj.Hi = kr(Hi_u,Hi_v); |
86 obj.Hu = kr(H_u,I_v); | 92 obj.Hu = kr(H_u,I_v); |
87 obj.Hv = kr(I_u,H_v); | 93 obj.Hv = kr(I_u,H_v); |
88 obj.Hiu = kr(Hi_u,I_v); | 94 obj.Hiu = kr(Hi_u,I_v); |
89 obj.Hiv = kr(I_u,Hi_v); | 95 obj.Hiv = kr(I_u,Hi_v); |
90 | 96 |
91 obj.e_w = kr(e_l_u,I_v); | 97 obj.e_w = kr(e_l_u,I_v); |
92 obj.e_e = kr(e_r_u,I_v); | 98 obj.e_e = kr(e_r_u,I_v); |
93 obj.e_s = kr(I_u,e_l_v); | 99 obj.e_s = kr(I_u,e_l_v); |
94 obj.e_n = kr(I_u,e_r_v); | 100 obj.e_n = kr(I_u,e_r_v); |
95 obj.du_w = kr(d1_l_u,I_v); | 101 obj.du_w = kr(d1_l_u,I_v); |
98 obj.dv_e = (obj.e_e'*obj.Dv)'; | 104 obj.dv_e = (obj.e_e'*obj.Dv)'; |
99 obj.du_s = (obj.e_s'*obj.Du)'; | 105 obj.du_s = (obj.e_s'*obj.Du)'; |
100 obj.dv_s = kr(I_u,d1_l_v); | 106 obj.dv_s = kr(I_u,d1_l_v); |
101 obj.du_n = (obj.e_n'*obj.Du)'; | 107 obj.du_n = (obj.e_n'*obj.Du)'; |
102 obj.dv_n = kr(I_u,d1_r_v); | 108 obj.dv_n = kr(I_u,d1_r_v); |
103 | 109 |
104 % obj.x_u = x_u; | 110 obj.DUU = sparse(obj.m_tot); |
105 % obj.x_v = x_v; | 111 obj.DVV = sparse(obj.m_tot); |
106 % obj.y_u = y_u; | 112 obj.ind = grid.funcToMatrix(obj.grid, 1:obj.m_tot); |
107 % obj.y_v = y_v; | 113 |
108 | |
109 obj.m = m; | 114 obj.m = m; |
110 obj.h = [h_u h_v]; | 115 obj.h = [h_u h_v]; |
111 obj.order = order; | 116 obj.order = order; |
112 obj.grid = g; | 117 obj.D = @(t)obj.d_fun(t); |
113 | 118 obj.variable_update(0); |
114 | 119 end |
115 end | 120 |
116 | 121 function [D] = d_fun(obj,t) |
117 | 122 % obj.update_vairables(t); In driscretization? |
118 function [D ]= d_fun(obj,t) | 123 D = obj.Ji*(-1/2*(obj.b1*obj.Du-obj.b1_u+obj.Du*obj.b1) - 1/2*(obj.b2*obj.Dv - obj.b2_v +obj.Dv*obj.b2) + 1i*obj.c^2*(obj.DUU + obj.DUV + obj.DVU + obj.DVV)); |
119 % Metric derivatives | 124 |
120 ti = parametrization.Ti.points(obj.p.p1(t),obj.p.p2(t),obj.p.p3(t),obj.p.p4(t)); | 125 end |
121 ti_tau = parametrization.Ti.points(obj.p_tau.p1(t),obj.p_tau.p2(t),obj.p_tau.p3(t),obj.p_tau.p4(t)); | 126 |
122 | 127 |
123 lcoords=points(obj.grid); | 128 function [D ]= variable_update(obj,t) |
124 [obj.xm,obj.ym]= ti.map(lcoords(1:obj.m_v:end,1),lcoords(1:obj.m_u,2)); | 129 % Metric derivatives |
125 [x_tau,y_tau]= ti_tau.map(lcoords(1:obj.m_v:end,1),lcoords(1:obj.m_u,2)); | 130 if(obj.t_up == t) |
126 x = reshape(obj.xm,obj.m_tot,1); | 131 return |
127 y = reshape(obj.ym,obj.m_tot,1); | 132 else |
128 obj.x=x; | 133 ti = parametrization.Ti.points(obj.p{1}(t),obj.p{2}(t),obj.p{3}(t),obj.p{4}(t)); |
129 obj.y=y; | 134 ti_tau = parametrization.Ti.points(obj.p{5}(t),obj.p{6}(t),obj.p{7}(t),obj.p{8}(t)); |
130 | 135 |
131 x_tau = reshape(x_tau,obj.m_tot,1); | 136 lcoords=points(obj.grid); |
132 y_tau = reshape(y_tau,obj.m_tot,1); | 137 [obj.xm,obj.ym]= ti.map(lcoords(1:obj.m_v:end,1),lcoords(1:obj.m_u,2)); |
133 | 138 [x_tau,y_tau]= ti_tau.map(lcoords(1:obj.m_v:end,1),lcoords(1:obj.m_u,2)); |
134 x_u = obj.Du*x; | 139 x = reshape(obj.xm,obj.m_tot,1); |
135 x_v = obj.Dv*x; | 140 y = reshape(obj.ym,obj.m_tot,1); |
136 y_u = obj.Du*y; | 141 obj.x = x; |
137 y_v = obj.Dv*y; | 142 obj.y = y; |
138 | 143 |
139 J = x_u.*y_v - x_v.*y_u; | 144 x_tau = reshape(x_tau,obj.m_tot,1); |
140 a11 = 1./J.* (x_v.^2 + y_v.^2); | 145 y_tau = reshape(y_tau,obj.m_tot,1); |
141 a12 = -1./J .* (x_u.*x_v + y_u.*y_v); | 146 |
142 a22 = 1./J .* (x_u.^2 + y_u.^2); | 147 x_u = obj.Du*x; |
143 | 148 x_v = obj.Dv*x; |
144 obj.a11 = a11; | 149 y_u = obj.Du*y; |
145 obj.a12 = a12; | 150 y_v = obj.Dv*y; |
146 obj.a22 = a22; | 151 |
147 | 152 J = x_u.*y_v - x_v.*y_u; |
148 % Assemble full operators | 153 a11 = 1./J.* (x_v.^2 + y_v.^2); |
149 L_12 = spdiags(a12, 0, obj.m_tot, obj.m_tot); | 154 a12 = -1./J .* (x_u.*x_v + y_u.*y_v); |
150 Duv = obj.Du*L_12*obj.Dv; | 155 a22 = 1./J .* (x_u.^2 + y_u.^2); |
151 Dvu = obj.Dv*L_12*obj.Du; | 156 |
152 | 157 obj.a11 = a11; |
153 Duu = sparse(obj.m_tot); | 158 obj.a12 = a12; |
154 Dvv = sparse(obj.m_tot); | 159 obj.a22 = a22; |
155 ind = grid.funcToMatrix(obj.grid, 1:obj.m_tot); | 160 |
156 | 161 % Assemble full operators |
157 | 162 L_12 = spdiags(a12, 0, obj.m_tot, obj.m_tot); |
158 for i = 1:obj.m_v | 163 obj.DUV = obj.Du*L_12*obj.Dv; |
159 D = obj.D2_u(a11(ind(:,i))); | 164 obj.DVU = obj.Dv*L_12*obj.Du; |
160 p = ind(:,i); | 165 |
161 Duu(p,p) = D; | 166 |
167 for i = 1:obj.m_v | |
168 D = obj.D2_u(a11(obj.ind(:,i))); | |
169 p = obj.ind(:,i); | |
170 obj.DUU(p,p) = D; | |
171 end | |
172 | |
173 for i = 1:obj.m_u | |
174 D = obj.D2_v(a22(obj.ind(i,:))); | |
175 p = obj.ind(i,:); | |
176 obj.DVV(p,p) = D; | |
177 end | |
178 | |
179 Ji = spdiags(1./J, 0, obj.m_tot, obj.m_tot); | |
180 obj.Ji = Ji; | |
181 obj.g_1 = x_v.*y_tau-x_tau.*y_v; | |
182 obj.g_2 = x_tau.*y_u - y_tau.*x_u; | |
183 | |
184 obj.b1 = spdiags(obj.g_1, 0, obj.m_tot, obj.m_tot); | |
185 obj.b2 = spdiags(obj.g_2, 0, obj.m_tot, obj.m_tot); | |
186 | |
187 obj.b1_u = spdiags(obj.Du*obj.g_1, 0, obj.m_tot, obj.m_tot); | |
188 obj.b2_v = spdiags(obj.Dv*obj.g_2, 0, obj.m_tot, obj.m_tot); | |
189 obj.t_up=t; | |
162 end | 190 end |
163 | |
164 for i = 1:obj.m_u | |
165 D = obj.D2_v(a22(ind(i,:))); | |
166 p = ind(i,:); | |
167 Dvv(p,p) = D; | |
168 end | |
169 | |
170 Ji = spdiags(1./J, 0, obj.m_tot, obj.m_tot); | |
171 obj.Ji=Ji; | |
172 obj.g_1 = x_v.*y_tau-x_tau.*y_v; | |
173 obj.g_2 = x_tau.*y_u - y_tau.*x_u; | |
174 | |
175 b1 = spdiags(obj.g_1, 0, obj.m_tot, obj.m_tot); | |
176 b2 = spdiags(obj.g_2, 0, obj.m_tot, obj.m_tot); | |
177 | |
178 b1_u = spdiags(obj.Du*obj.g_1, 0, obj.m_tot, obj.m_tot); | |
179 b2_v = spdiags(obj.Dv*obj.g_2, 0, obj.m_tot, obj.m_tot); | |
180 | |
181 %Add the flux splitting | |
182 % D = Ji*(-b1*obj.Du -b2*obj.Dv + 1i*obj.c^2*(Duu + Duv + Dvu + Dvv)); | |
183 D = Ji*(-1/2*(b1*obj.Du-b1_u+obj.Du*b1) - 1/2*(b2*obj.Dv - b2_v +obj.Dv*b2) + 1i*obj.c^2*(Duu + Duv + Dvu + Dvv)); | |
184 | |
185 % obj.gamm_u = h_u*ops_u.borrowing.M.d1; | |
186 % obj.gamm_v = h_v*ops_v.borrowing.M.d1; | |
187 | |
188 end | 191 end |
189 | 192 |
190 % Closure functions return the opertors applied to the own doamin to close the boundary | 193 % Closure functions return the opertors applied to the own doamin to close the boundary |
191 % Penalty functions return the opertors to force the solution. In the case of an interface it returns the operator applied to the other doamin. | 194 % Penalty functions return the opertors to force the solution. In the case of an interface it returns the operator applied to the other doamin. |
192 % boundary is a string specifying the boundary e.g. 'l','r' or 'e','w','n','s'. | 195 % boundary is a string specifying the boundary e.g. 'l','r' or 'e','w','n','s'. |
193 % type is a string specifying the type of boundary condition if there are several. | 196 % type is a string specifying the type of boundary condition if there are several. |
194 % data is a function returning the data that should be applied at the boundary. | 197 % data is a function returning the data that should be applied at the boundary. |
195 % neighbour_scheme is an instance of Scheme that should be interfaced to. | 198 % neighbour_scheme is an instance of Scheme that should be interfaced to. |
196 % neighbour_boundary is a string specifying which boundary to interface to. | 199 % neighbour_boundary is a string specifying which boundary to interface to. |
197 function [closure, penalty] = boundary_condition(obj, boundary) | 200 function [closure, penalty] = boundary_condition(obj, boundary,~) |
198 [e, d_n, d_t, coeff_t, s, halfnorm_inv_n, halfnorm_inv_t, halfnorm_t,g] = obj.get_boundary_ops(boundary); | 201 [e, d_n, d_t, coeff_t, coeff_n s, halfnorm_inv_n, halfnorm_inv_t, halfnorm_t,g] = obj.get_boundary_ops(boundary); |
199 | 202 |
200 a_t = spdiag(coeff_t); | 203 a_t = spdiag(coeff_t); |
201 F = (s * d_n' + s * a_t*d_t')'; | 204 a_n = spdiag(coeff_n); |
205 F = (s * a_n *d_n' + s * a_t*d_t')'; | |
202 tau1 = 1; | 206 tau1 = 1; |
203 a = spdiag(g); | 207 a = spdiag(g); |
204 tau2 = (-1*s*a - abs(a))/4; | 208 tau2 = (-1*s*a - abs(a))/4; |
205 | 209 |
206 penalty_parameter_1 = 1*1i*halfnorm_inv_n*halfnorm_inv_t*F*e'*halfnorm_t*e; | 210 penalty_parameter_1 = @(t) 1*1i*halfnorm_inv_n*halfnorm_inv_t*F*e'*halfnorm_t*e; |
207 penalty_parameter_2 = halfnorm_inv_n*e*tau2; | 211 penalty_parameter_2 = @(t) halfnorm_inv_n*e*tau2; |
208 | 212 |
209 closure = obj.Ji*obj.c^2 * penalty_parameter_1*e' + obj.Ji* penalty_parameter_2*e'; | 213 closure = @(t) obj.Ji*obj.c^2 * penalty_parameter_1(t)*e' + obj.Ji* penalty_parameter_2(t)*e'; |
210 penalty = -obj.Ji*obj.c^2 * penalty_parameter_1*e'+ obj.Ji*penalty_parameter_2*e'; | 214 penalty = @(t) -obj.Ji*obj.c^2 * penalty_parameter_1(t)*e'+ obj.Ji*penalty_parameter_2(t)*e'; |
211 | 215 |
212 end | 216 end |
213 | 217 |
214 function [closure, penalty] = interface(obj,boundary,neighbour_scheme,neighbour_boundary) | 218 function [closure, penalty] = interface(obj,boundary,neighbour_scheme,neighbour_boundary) |
215 end | 219 % u denotes the solution in the own domain |
216 | 220 % v denotes the solution in the neighbour domain |
217 function [e, d_n, d_t, coeff_t, s, halfnorm_inv_n, halfnorm_inv_t, halfnorm_t,g, I] = get_boundary_ops(obj, boundary) | 221 [e_u, d_n_u, d_t_u, coeff_t_u, coeff_n_u,s_u, halfnorm_inv_u_n, halfnorm_inv_u_t, halfnorm_u_t,gamm_u, I_u] = obj.get_boundary_ops(boundary); |
222 [e_v, d_n_v, d_t_v, coeff_t_v, coeff_n_v s_v, halfnorm_inv_v_n, halfnorm_inv_v_t, halfnorm_v_t,gamm_v, I_v] = neighbour_scheme.get_boundary_ops(neighbour_boundary); | |
223 | |
224 a_n_u = spdiag(coeff_n_u); | |
225 a_t_u = spdiag(coeff_t_u); | |
226 a_n_v = spdiag(coeff_n_v); | |
227 a_t_v = spdiag(coeff_t_v); | |
228 | |
229 F_u = (s_u * a_n_u * d_n_u' + s_u * a_t_u*d_t_u')'; | |
230 F_v = (s_v * a_n_v * d_n_v' + s_v * a_t_v*d_t_v')'; | |
231 | |
232 a = spdiag(gamm_u); | |
233 | |
234 u = obj; | |
235 v = neighbour_scheme; | |
236 | |
237 tau = -1/2*1i; | |
238 sig = 1/2*1i; | |
239 gamm = (-1*s_u*a)/2; | |
240 | |
241 penalty_parameter_1 =@(t) halfnorm_inv_u_n*(e_u*tau + sig*halfnorm_inv_u_t*F_u*e_u'*halfnorm_u_t*e_u); | |
242 penalty_parameter_2 =@(t) halfnorm_inv_u_n * e_u * (-sig + gamm ); | |
243 | |
244 closure =@(t) obj.Ji*obj.c^2 * ( penalty_parameter_1(t)*e_u' + penalty_parameter_2(t)*F_u'); | |
245 penalty =@(t) obj.Ji*obj.c^2 * (-penalty_parameter_1(t)*e_v' + penalty_parameter_2(t)*F_v'); | |
246 end | |
247 | |
248 | |
249 function [e, d_n, d_t, coeff_t,coeff_n, s, halfnorm_inv_n, halfnorm_inv_t, halfnorm_t,g, I] = get_boundary_ops(obj, boundary) | |
218 | 250 |
219 % gridMatrix = zeros(obj.m(2),obj.m(1)); | 251 % gridMatrix = zeros(obj.m(2),obj.m(1)); |
220 % gridMatrix(:) = 1:numel(gridMatrix); | 252 % gridMatrix(:) = 1:numel(gridMatrix); |
221 | 253 |
222 ind = grid.funcToMatrix(obj.grid, 1:prod(obj.m)); | 254 ind = grid.funcToMatrix(obj.grid, 1:prod(obj.m)); |
228 d_t = obj.dv_w; | 260 d_t = obj.dv_w; |
229 s = -1; | 261 s = -1; |
230 | 262 |
231 I = ind(1,:); | 263 I = ind(1,:); |
232 coeff_t = obj.a12(I); | 264 coeff_t = obj.a12(I); |
265 coeff_n = obj.a11(I); | |
233 g=obj.g_1(I); | 266 g=obj.g_1(I); |
234 case 'e' | 267 case 'e' |
235 e = obj.e_e; | 268 e = obj.e_e; |
236 d_n = obj.du_e; | 269 d_n = obj.du_e; |
237 d_t = obj.dv_e; | 270 d_t = obj.dv_e; |
238 s = 1; | 271 s = 1; |
239 | 272 |
240 I = ind(end,:); | 273 I = ind(end,:); |
241 coeff_t = obj.a12(I); | 274 coeff_t = obj.a12(I); |
275 coeff_n = obj.a11(I); | |
242 g=obj.g_1(I); | 276 g=obj.g_1(I); |
243 case 's' | 277 case 's' |
244 e = obj.e_s; | 278 e = obj.e_s; |
245 d_n = obj.dv_s; | 279 d_n = obj.dv_s; |
246 d_t = obj.du_s; | 280 d_t = obj.du_s; |
247 s = -1; | 281 s = -1; |
248 | 282 |
249 I = ind(:,1)'; | 283 I = ind(:,1)'; |
250 coeff_t = obj.a12(I); | 284 coeff_t = obj.a12(I); |
285 coeff_n = obj.a11(I); | |
251 g=obj.g_2(I); | 286 g=obj.g_2(I); |
252 case 'n' | 287 case 'n' |
253 e = obj.e_n; | 288 e = obj.e_n; |
254 d_n = obj.dv_n; | 289 d_n = obj.dv_n; |
255 d_t = obj.du_n; | 290 d_t = obj.du_n; |
256 s = 1; | 291 s = 1; |
257 | 292 |
258 I = ind(:,end)'; | 293 I = ind(:,end)'; |
259 coeff_t = obj.a12(I); | 294 coeff_t = obj.a12(I); |
295 coeff_n = obj.a11(I); | |
260 g=obj.g_2(I); | 296 g=obj.g_2(I); |
261 otherwise | 297 otherwise |
262 error('No such boundary: boundary = %s',boundary); | 298 error('No such boundary: boundary = %s',boundary); |
263 end | 299 end |
264 | 300 |
276 end | 312 end |
277 | 313 |
278 function N = size(obj) | 314 function N = size(obj) |
279 N = prod(obj.m); | 315 N = prod(obj.m); |
280 end | 316 end |
281 | |
282 | |
283 end | 317 end |
284 end | 318 end |