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;