Mercurial > repos > public > sbplib
comparison +scheme/Hypsyst3dCurve.m @ 369:9d1fc984f40d feature/hypsyst
Added some comments and cleaned up the code a little
author | Ylva Rydin <ylva.rydin@telia.com> |
---|---|
date | Thu, 26 Jan 2017 09:57:24 +0100 |
parents | 53abf04f5e4e |
children | feebfca90080 459eeb99130f |
comparison
equal
deleted
inserted
replaced
368:53abf04f5e4e | 369:9d1fc984f40d |
---|---|
7 Yx, Zx, Xy, Zy, Xz, Yz %Grid values for boundary surfaces | 7 Yx, Zx, Xy, Zy, Xz, Yz %Grid values for boundary surfaces |
8 | 8 |
9 xi,eta,zeta | 9 xi,eta,zeta |
10 Xi, Eta, Zeta | 10 Xi, Eta, Zeta |
11 | 11 |
12 Eta_xi, Zeta_xi, Xi_eta, Zeta_eta, Xi_zeta, Eta_zeta | 12 Eta_xi, Zeta_xi, Xi_eta, Zeta_eta, Xi_zeta, Eta_zeta % Metric terms |
13 | 13 X_xi, X_eta, X_zeta,Y_xi,Y_eta,Y_zeta,Z_xi,Z_eta,Z_zeta % Metric terms |
14 X_xi, X_eta, X_zeta,Y_xi,Y_eta,Y_zeta,Z_xi,Z_eta,Z_zeta | |
15 | |
16 | |
17 metric_terms | |
18 | 14 |
19 order % Order accuracy for the approximation | 15 order % Order accuracy for the approximation |
20 | 16 |
21 D % non-stabalized scheme operator | 17 D % non-stabalized scheme operator |
22 Aevaluated, Bevaluated, Cevaluated, Eevaluated | 18 Aevaluated, Bevaluated, Cevaluated, Eevaluated % Numeric Coeffiecient matrices |
23 Ahat, Bhat, Chat, E | 19 Ahat, Bhat, Chat % Symbolic Transformed Coefficient matrices |
24 A,B,C | 20 A, B, C, E % Symbolic coeffiecient matrices |
25 | 21 |
26 J, Ji | 22 J, Ji % JAcobian and inverse Jacobian |
27 | 23 |
28 H % Discrete norm | 24 H % Discrete norm |
29 % Norms in the x, y and z directions | 25 % Norms in the x, y and z directions |
30 Hxii,Hetai,Hzetai, Hzi % Kroneckerd norms. 1'*Hx*v corresponds to integration in the x dir. | 26 Hxii,Hetai,Hzetai, Hzi % Kroneckerd norms. 1'*Hx*v corresponds to integration in the x dir. |
31 Hxi,Heta,Hzeta | 27 Hxi,Heta,Hzeta |
71 | 67 |
72 obj.xi = ops_xi.x; | 68 obj.xi = ops_xi.x; |
73 obj.eta = ops_eta.x; | 69 obj.eta = ops_eta.x; |
74 obj.zeta = ops_zeta.x; | 70 obj.zeta = ops_zeta.x; |
75 | 71 |
76 obj.Xi = kr(obj.xi,ones(m_eta,1),ones(m_zeta,1));%% Que pasa? | 72 obj.Xi = kr(obj.xi,ones(m_eta,1),ones(m_zeta,1)); |
77 obj.Eta = kr(ones(m_xi,1),obj.eta,ones(m_zeta,1)); | 73 obj.Eta = kr(ones(m_xi,1),obj.eta,ones(m_zeta,1)); |
78 obj.Zeta = kr(ones(m_xi,1),ones(m_eta,1),obj.zeta); | 74 obj.Zeta = kr(ones(m_xi,1),ones(m_eta,1),obj.zeta); |
79 | 75 |
80 | 76 |
81 [X,Y,Z] = ti.map(obj.Xi,obj.Eta,obj.Zeta); | 77 [X,Y,Z] = ti.map(obj.Xi,obj.Eta,obj.Zeta); |
125 obj.Y_eta = D1_eta*Y; | 121 obj.Y_eta = D1_eta*Y; |
126 obj.Y_zeta = D1_zeta*Y; | 122 obj.Y_zeta = D1_zeta*Y; |
127 obj.Z_xi = D1_xi*Z; | 123 obj.Z_xi = D1_xi*Z; |
128 obj.Z_eta = D1_eta*Z; | 124 obj.Z_eta = D1_eta*Z; |
129 obj.Z_zeta = D1_zeta*Z; | 125 obj.Z_zeta = D1_zeta*Z; |
130 | 126 |
131 obj.Ahat = @transform_coefficient_matrix; | 127 obj.Ahat = @transform_coefficient_matrix; |
132 obj.Bhat = @transform_coefficient_matrix; | 128 obj.Bhat = @transform_coefficient_matrix; |
133 obj.Chat = @transform_coefficient_matrix; | 129 obj.Chat = @transform_coefficient_matrix; |
134 obj.E = @(obj,x,y,z,~,~,~,~,~,~)E(obj,x,y,z); | 130 obj.E = @(obj,x,y,z,~,~,~,~,~,~)E(obj,x,y,z); |
135 | 131 |
144 alphaB = max(abs(eig(obj.Bhat(obj,obj.X(end), obj.Y(end),obj.Z(end), obj.X_zeta(end),obj.X_xi(end),obj.Y_zeta(end),obj.Y_xi(end),obj.Z_zeta(end),obj.Z_xi(end))))); | 140 alphaB = max(abs(eig(obj.Bhat(obj,obj.X(end), obj.Y(end),obj.Z(end), obj.X_zeta(end),obj.X_xi(end),obj.Y_zeta(end),obj.Y_xi(end),obj.Z_zeta(end),obj.Z_xi(end))))); |
145 alphaC = max(abs(eig(obj.Chat(obj,obj.X(end), obj.Y(end),obj.Z(end), obj.X_xi(end),obj.X_eta(end),obj.Y_xi(end),obj.Y_eta(end),obj.Z_xi(end),obj.Z_eta(end))))); | 141 alphaC = max(abs(eig(obj.Chat(obj,obj.X(end), obj.Y(end),obj.Z(end), obj.X_xi(end),obj.X_eta(end),obj.Y_xi(end),obj.Y_eta(end),obj.Z_xi(end),obj.Z_eta(end))))); |
146 | 142 |
147 Ap = (obj.Aevaluated+alphaA*I_N)/2; | 143 Ap = (obj.Aevaluated+alphaA*I_N)/2; |
148 Dmxi = kr(I_n, ops_xi.Dm, I_eta,I_zeta); | 144 Dmxi = kr(I_n, ops_xi.Dm, I_eta,I_zeta); |
149 diffSum=-Ap*Dmxi; | 145 diffSum = -Ap*Dmxi; |
150 clear Ap Dmxi | 146 clear Ap Dmxi |
151 | 147 |
152 Am = (obj.Aevaluated-alphaA*I_N)/2; | 148 Am = (obj.Aevaluated-alphaA*I_N)/2; |
153 obj.Aevaluated=[]; | 149 |
150 obj.Aevaluated = []; | |
154 Dpxi = kr(I_n, ops_xi.Dp, I_eta,I_zeta); | 151 Dpxi = kr(I_n, ops_xi.Dp, I_eta,I_zeta); |
155 temp=Am*Dpxi; | 152 temp = Am*Dpxi; |
156 diffSum=diffSum-temp; | 153 diffSum = diffSum-temp; |
157 clear Am Dpxi | 154 clear Am Dpxi |
158 | 155 |
159 Bp = (obj.Bevaluated+alphaB*I_N)/2; | 156 Bp = (obj.Bevaluated+alphaB*I_N)/2; |
160 Dmeta = kr(I_n, I_xi, ops_eta.Dm,I_zeta); | 157 Dmeta = kr(I_n, I_xi, ops_eta.Dm,I_zeta); |
161 temp=Bp*Dmeta; | 158 temp = Bp*Dmeta; |
162 diffSum=diffSum-temp; | 159 diffSum = diffSum-temp; |
163 clear Bp Dmeta | 160 clear Bp Dmeta |
164 | 161 |
165 Bm = (obj.Bevaluated-alphaB*I_N)/2; | 162 Bm = (obj.Bevaluated-alphaB*I_N)/2; |
166 obj.Bevaluated=[]; | 163 obj.Bevaluated = []; |
167 Dpeta = kr(I_n, I_xi, ops_eta.Dp,I_zeta); | 164 Dpeta = kr(I_n, I_xi, ops_eta.Dp,I_zeta); |
168 temp=Bm*Dpeta; | 165 temp = Bm*Dpeta; |
169 diffSum=diffSum-temp; | 166 diffSum = diffSum-temp; |
170 clear Bm Dpeta | 167 clear Bm Dpeta |
171 | |
172 | 168 |
173 Cp = (obj.Cevaluated+alphaC*I_N)/2; | 169 Cp = (obj.Cevaluated+alphaC*I_N)/2; |
174 Dmzeta = kr(I_n, I_xi, I_eta,ops_zeta.Dm); | 170 Dmzeta = kr(I_n, I_xi, I_eta,ops_zeta.Dm); |
175 temp=Cp*Dmzeta; | 171 temp = Cp*Dmzeta; |
176 diffSum=diffSum-temp; | 172 diffSum = diffSum-temp; |
177 clear Cp Dmzeta | 173 clear Cp Dmzeta |
178 | 174 |
179 Cm = (obj.Cevaluated-alphaC*I_N)/2; | 175 Cm = (obj.Cevaluated-alphaC*I_N)/2; |
180 clear I_N | 176 clear I_N |
181 obj.Cevaluated=[]; | 177 obj.Cevaluated = []; |
182 Dpzeta = kr(I_n, I_xi, I_eta,ops_zeta.Dp); | 178 Dpzeta = kr(I_n, I_xi, I_eta,ops_zeta.Dp); |
183 temp=Cm*Dpzeta; | 179 temp = Cm*Dpzeta; |
184 diffSum=diffSum-temp; | 180 diffSum = diffSum-temp; |
185 clear Cm Dpzeta temp | 181 clear Cm Dpzeta temp |
186 | |
187 | 182 |
188 obj.J = obj.X_xi.*obj.Y_eta.*obj.Z_zeta... | 183 obj.J = obj.X_xi.*obj.Y_eta.*obj.Z_zeta... |
189 +obj.X_zeta.*obj.Y_xi.*obj.Z_eta... | 184 +obj.X_zeta.*obj.Y_xi.*obj.Z_eta... |
190 +obj.X_eta.*obj.Y_zeta.*obj.Z_xi... | 185 +obj.X_eta.*obj.Y_zeta.*obj.Z_xi... |
191 -obj.X_xi.*obj.Y_zeta.*obj.Z_eta... | 186 -obj.X_xi.*obj.Y_zeta.*obj.Z_eta... |
194 | 189 |
195 obj.Ji = kr(I_n,spdiags(1./obj.J,0,m_tot,m_tot)); | 190 obj.Ji = kr(I_n,spdiags(1./obj.J,0,m_tot,m_tot)); |
196 obj.Eevaluated = obj.evaluateCoefficientMatrix(obj.E, obj.X, obj.Y,obj.Z,[],[],[],[],[],[]); | 191 obj.Eevaluated = obj.evaluateCoefficientMatrix(obj.E, obj.X, obj.Y,obj.Z,[],[],[],[],[],[]); |
197 | 192 |
198 obj.D = obj.Ji*diffSum-obj.Eevaluated; | 193 obj.D = obj.Ji*diffSum-obj.Eevaluated; |
199 otherwise | 194 |
200 D1_xi=kr(I_n,D1_xi); | 195 case 'standard' |
201 D1_eta=kr(I_n,D1_eta); | 196 D1_xi = kr(I_n,D1_xi); |
202 D1_zeta=kr(I_n,D1_zeta); | 197 D1_eta = kr(I_n,D1_eta); |
198 D1_zeta = kr(I_n,D1_zeta); | |
203 | 199 |
204 obj.J = obj.X_xi.*obj.Y_eta.*obj.Z_zeta... | 200 obj.J = obj.X_xi.*obj.Y_eta.*obj.Z_zeta... |
205 +obj.X_zeta.*obj.Y_xi.*obj.Z_eta... | 201 +obj.X_zeta.*obj.Y_xi.*obj.Z_eta... |
206 +obj.X_eta.*obj.Y_zeta.*obj.Z_xi... | 202 +obj.X_eta.*obj.Y_zeta.*obj.Z_xi... |
207 -obj.X_xi.*obj.Y_zeta.*obj.Z_eta... | 203 -obj.X_xi.*obj.Y_zeta.*obj.Z_eta... |
210 | 206 |
211 obj.Ji = kr(I_n,spdiags(1./obj.J,0,m_tot,m_tot)); | 207 obj.Ji = kr(I_n,spdiags(1./obj.J,0,m_tot,m_tot)); |
212 obj.Eevaluated = obj.evaluateCoefficientMatrix(obj.E, obj.X, obj.Y,obj.Z,[],[],[],[],[],[]); | 208 obj.Eevaluated = obj.evaluateCoefficientMatrix(obj.E, obj.X, obj.Y,obj.Z,[],[],[],[],[],[]); |
213 | 209 |
214 obj.D = obj.Ji*(-obj.Aevaluated*D1_xi-obj.Bevaluated*D1_eta -obj.Cevaluated*D1_zeta)-obj.Eevaluated; | 210 obj.D = obj.Ji*(-obj.Aevaluated*D1_xi-obj.Bevaluated*D1_eta -obj.Cevaluated*D1_zeta)-obj.Eevaluated; |
215 end | 211 otherwise |
212 error('Operator not supported') | |
213 end | |
214 | |
216 obj.Hxii = kr(I_n, ops_xi.HI, I_eta,I_zeta); | 215 obj.Hxii = kr(I_n, ops_xi.HI, I_eta,I_zeta); |
217 obj.Hetai = kr(I_n, I_xi, ops_eta.HI,I_zeta); | 216 obj.Hetai = kr(I_n, I_xi, ops_eta.HI,I_zeta); |
218 obj.Hzetai = kr(I_n, I_xi,I_eta, ops_zeta.HI); | 217 obj.Hzetai = kr(I_n, I_xi,I_eta, ops_zeta.HI); |
219 | 218 |
220 obj.index_w = (kr(ops_xi.e_l, O_eta,O_zeta)==1); | 219 obj.index_w = (kr(ops_xi.e_l, O_eta,O_zeta)==1); |
229 obj.e_s = kr(I_n, I_xi, ops_eta.e_l,I_zeta); | 228 obj.e_s = kr(I_n, I_xi, ops_eta.e_l,I_zeta); |
230 obj.e_n = kr(I_n, I_xi, ops_eta.e_r,I_zeta); | 229 obj.e_n = kr(I_n, I_xi, ops_eta.e_r,I_zeta); |
231 obj.e_b = kr(I_n, I_xi, I_eta, ops_zeta.e_l); | 230 obj.e_b = kr(I_n, I_xi, I_eta, ops_zeta.e_l); |
232 obj.e_t = kr(I_n, I_xi, I_eta, ops_zeta.e_r); | 231 obj.e_t = kr(I_n, I_xi, I_eta, ops_zeta.e_r); |
233 | 232 |
234 | |
235 | |
236 obj.Eta_xi = kr(obj.eta,ones(m_xi,1)); | 233 obj.Eta_xi = kr(obj.eta,ones(m_xi,1)); |
237 obj.Zeta_xi = kr(ones(m_eta,1),obj.zeta); | 234 obj.Zeta_xi = kr(ones(m_eta,1),obj.zeta); |
238 obj.Xi_eta = kr(obj.xi,ones(m_zeta,1)); | 235 obj.Xi_eta = kr(obj.xi,ones(m_zeta,1)); |
239 obj.Zeta_eta = kr(ones(m_xi,1),obj.zeta); | 236 obj.Zeta_eta = kr(ones(m_xi,1),obj.zeta); |
240 obj.Xi_zeta = kr(obj.xi,ones(m_eta,1)); | 237 obj.Xi_zeta = kr(obj.xi,ones(m_eta,1)); |
241 obj.Eta_zeta = kr(ones(m_zeta,1),obj.eta); | 238 obj.Eta_zeta = kr(ones(m_zeta,1),obj.eta); |
242 | |
243 end | 239 end |
244 | 240 |
245 function [ret] = transform_coefficient_matrix(obj,x,y,z,x_1,x_2,y_1,y_2,z_1,z_2) | 241 function [ret] = transform_coefficient_matrix(obj,x,y,z,x_1,x_2,y_1,y_2,z_1,z_2) |
246 ret = obj.A(obj,x,y,z).*(y_1.*z_2-z_1.*y_2); | 242 ret = obj.A(obj,x,y,z).*(y_1.*z_2-z_1.*y_2); |
247 ret = ret+obj.B(obj,x,y,z).*(x_2.*z_1-x_1.*z_2); | 243 ret = ret+obj.B(obj,x,y,z).*(x_2.*z_1-x_1.*z_2); |
274 | 270 |
275 function N = size(obj) | 271 function N = size(obj) |
276 N = obj.m; | 272 N = obj.m; |
277 end | 273 end |
278 | 274 |
275 % Evaluates the symbolic Coeffiecient matrix mat | |
279 function [ret] = evaluateCoefficientMatrix(obj,mat, X, Y, Z , x_1 , x_2 , y_1 , y_2 , z_1 , z_2) | 276 function [ret] = evaluateCoefficientMatrix(obj,mat, X, Y, Z , x_1 , x_2 , y_1 , y_2 , z_1 , z_2) |
280 params = obj.params; | 277 params = obj.params; |
281 side = max(length(X),length(Y)); | 278 side = max(length(X),length(Y)); |
282 if isa(mat,'function_handle') | 279 if isa(mat,'function_handle') |
283 [rows,cols] = size(mat(obj,0,0,0,0,0,0,0,0,0)); | 280 [rows,cols] = size(mat(obj,0,0,0,0,0,0,0,0,0)); |
293 matVec = mat; | 290 matVec = mat; |
294 [rows,cols] = size(matVec); | 291 [rows,cols] = size(matVec); |
295 side = max(length(X),length(Y)); | 292 side = max(length(X),length(Y)); |
296 cols = cols/side; | 293 cols = cols/side; |
297 end | 294 end |
298 matVec(abs(matVec)<10^(-10))=0; | 295 matVec(abs(matVec)<10^(-10)) = 0; |
299 ret = cell(rows,cols); | 296 ret = cell(rows,cols); |
300 | 297 |
301 | 298 for ii = 1:rows |
302 for ii=1:rows | 299 for jj = 1:cols |
303 for jj=1:cols | |
304 ret{ii,jj} = diag(matVec(ii,(jj-1)*side+1:jj*side)); | 300 ret{ii,jj} = diag(matVec(ii,(jj-1)*side+1:jj*side)); |
305 end | 301 end |
306 end | 302 end |
307 | |
308 ret = cell2mat(ret); | 303 ret = cell2mat(ret); |
309 | 304 end |
310 end | |
311 | |
312 | 305 |
313 function [BM] = boundary_matrices(obj,boundary) | 306 function [BM] = boundary_matrices(obj,boundary) |
314 params = obj.params; | 307 params = obj.params; |
315 BM.boundary = boundary; | 308 BM.boundary = boundary; |
316 switch boundary | 309 switch boundary |
391 BM.x_1,BM.x_2,BM.y_1,BM.y_2,BM.z_1,BM.z_2); | 384 BM.x_1,BM.x_2,BM.y_1,BM.y_2,BM.z_1,BM.z_2); |
392 BM.side = sum(BM.index); | 385 BM.side = sum(BM.index); |
393 BM.pos = signVec(1); BM.zeroval=signVec(2); BM.neg=signVec(3); | 386 BM.pos = signVec(1); BM.zeroval=signVec(2); BM.neg=signVec(3); |
394 end | 387 end |
395 | 388 |
396 | 389 % Characteristic boundary condition |
397 function [closure, penalty]=boundary_condition_char(obj,BM) | 390 function [closure, penalty] = boundary_condition_char(obj,BM) |
398 side = BM.side; | 391 side = BM.side; |
399 pos = BM.pos; | 392 pos = BM.pos; |
400 neg = BM.neg; | 393 neg = BM.neg; |
401 zeroval = BM.zeroval; | 394 zeroval = BM.zeroval; |
402 V = BM.V; | 395 V = BM.V; |
403 Vi = BM.Vi; | 396 Vi = BM.Vi; |
404 Hi = BM.Hi; | 397 Hi = BM.Hi; |
405 D = BM.D; | 398 D = BM.D; |
406 e_ = BM.e_; | 399 e_ = BM.e_; |
407 | |
408 | 400 |
409 switch BM.boundpos | 401 switch BM.boundpos |
410 case {'l'} | 402 case {'l'} |
411 tau = sparse(obj.n*side,pos); | 403 tau = sparse(obj.n*side,pos); |
412 Vi_plus = Vi(1:pos,:); | 404 Vi_plus = Vi(1:pos,:); |
420 closure = Hi*e_*V*tau*Vi_minus*e_'; | 412 closure = Hi*e_*V*tau*Vi_minus*e_'; |
421 penalty = -Hi*e_*V*tau*Vi_minus; | 413 penalty = -Hi*e_*V*tau*Vi_minus; |
422 end | 414 end |
423 end | 415 end |
424 | 416 |
425 | 417 % General boundary condition in the form Lu=g(x) |
426 function [closure,penalty]=boundary_condition_general(obj,BM,boundary,L) | 418 function [closure,penalty] = boundary_condition_general(obj,BM,boundary,L) |
427 side = BM.side; | 419 side = BM.side; |
428 pos = BM.pos; | 420 pos = BM.pos; |
429 neg = BM.neg; | 421 neg = BM.neg; |
430 zeroval = BM.zeroval; | 422 zeroval = BM.zeroval; |
431 V = BM.V; | 423 V = BM.V; |
470 closure = Hi*e_*V*tau*(Vi_minus-R*Vi_plus)*e_'; | 462 closure = Hi*e_*V*tau*(Vi_minus-R*Vi_plus)*e_'; |
471 penalty = -Hi*e_*V*tau*inv(L*V_minus)*L; | 463 penalty = -Hi*e_*V*tau*inv(L*V_minus)*L; |
472 end | 464 end |
473 end | 465 end |
474 | 466 |
475 | 467 % Function that diagonalizes a symbolic matrix A as A=V*D*Vi |
468 % D is a diagonal matrix with the eigenvalues on A on the diagonal sorted by their sign | |
469 % [d+ ] | |
470 % D = [ d0 ] | |
471 % [ d-] | |
472 % signVec is a vector specifying the number of possitive, zero and negative eigenvalues of D | |
476 function [V,Vi, D,signVec] = matrixDiag(obj,mat,x,y,z,x_1,x_2,y_1,y_2,z_1,z_2) | 473 function [V,Vi, D,signVec] = matrixDiag(obj,mat,x,y,z,x_1,x_2,y_1,y_2,z_1,z_2) |
477 params = obj.params; | 474 params = obj.params; |
478 eps = 10^(-10); | 475 eps = 10^(-10); |
479 if(sum(abs(x_1))>eps) | 476 if(sum(abs(x_1))>eps) |
480 syms x_1s | 477 syms x_1s |
514 end | 511 end |
515 | 512 |
516 syms xs ys zs | 513 syms xs ys zs |
517 [V, D] = eig(mat(obj,xs,ys,zs,x_1s,x_2s,y_1s,y_2s,z_1s,z_2s)); | 514 [V, D] = eig(mat(obj,xs,ys,zs,x_1s,x_2s,y_1s,y_2s,z_1s,z_2s)); |
518 Vi = inv(V); | 515 Vi = inv(V); |
519 % syms x_1s x_2s y_1s y_2s z_1s z_2s | |
520 xs = x; | 516 xs = x; |
521 ys = y; | 517 ys = y; |
522 zs = z; | 518 zs = z; |
523 x_1s = x_1; | 519 x_1s = x_1; |
524 x_2s = x_2; | 520 x_2s = x_2; |