comparison +scheme/Hypsyst2dCurve.m @ 352:9b3d7fc61a36 feature/hypsyst

Changed operator in Utux
author Ylva Rydin <ylva.rydin@telia.com>
date Thu, 10 Nov 2016 20:47:40 +0100
parents 5d5652fe826a
children 9d1fc984f40d
comparison
equal deleted inserted replaced
351:7cc3d5bd3692 352:9b3d7fc61a36
145 matVec=mat; 145 matVec=mat;
146 [rows,cols]=size(matVec); 146 [rows,cols]=size(matVec);
147 side=max(length(X),length(Y)); 147 side=max(length(X),length(Y));
148 cols=cols/side; 148 cols=cols/side;
149 end 149 end
150 ret=kron(ones(rows,cols),speye(side)); 150 ret=cell(rows,cols);
151 151
152 for ii=1:rows 152 for ii=1:rows
153 for jj=1:cols 153 for jj=1:cols
154 ret((ii-1)*side+1:ii*side,(jj-1)*side+1:jj*side)=diag(matVec(ii,(jj-1)*side+1:jj*side)); 154 ret{ii,jj}=diag(matVec(ii,(jj-1)*side+1:jj*side));
155 end 155 end
156 end 156 end
157 ret=cell2mat(ret);
157 end 158 end
158 159
159 160
160 function [closure, penalty]=boundary_condition_char(obj,boundary) 161 function [closure, penalty]=boundary_condition_char(obj,boundary)
161 params=obj.params; 162 params=obj.params;
257 eta_x=Ji*obj.Y_xi(obj.index_s); 258 eta_x=Ji*obj.Y_xi(obj.index_s);
258 eta_y=-Ji*obj.X_xi(obj.index_s); 259 eta_y=-Ji*obj.X_xi(obj.index_s);
259 L=obj.evaluateCoefficientMatrix(L,eta_x,eta_y,[],[]); 260 L=obj.evaluateCoefficientMatrix(L,eta_x,eta_y,[],[]);
260 side=max(length(xi)); 261 side=max(length(xi));
261 case {'n','N','north'} 262 case {'n','N','north'}
262 e_=obj.e_n; for ii=1:rows 263 e_=obj.e_n;
263 264
264 mat=obj.Bhat; 265 mat=obj.Bhat;
265 boundPos='r'; 266 boundPos='r';
266 Hi=obj.Hetai; 267 Hi=obj.Hetai;
267 [V,Vi,D,signVec]=obj.matrixDiag(mat,X(obj.index_n),Y(obj.index_n),obj.X_xi(obj.index_n),obj.Y_xi(obj.index_n)); 268 [V,Vi,D,signVec]=obj.matrixDiag(mat,X(obj.index_n),Y(obj.index_n),obj.X_xi(obj.index_n),obj.Y_xi(obj.index_n));
302 closure=Hi*e_*V*tau*(Vi_minus-R*Vi_plus)*e_'; 303 closure=Hi*e_*V*tau*(Vi_minus-R*Vi_plus)*e_';
303 penalty=-Hi*e_*V*tau*inv(L*V_minus)*L; 304 penalty=-Hi*e_*V*tau*inv(L*V_minus)*L;
304 end 305 end
305 end 306 end
306 307
307
308 function [V,Vi, D,signVec]=matrixDiag(obj,mat,x,y,x_,y_) 308 function [V,Vi, D,signVec]=matrixDiag(obj,mat,x,y,x_,y_)
309 params=obj.params; 309 params=obj.params;
310 syms xs ys 310 syms xs ys
311 if(sum(abs(x_))~=0) 311 if(sum(abs(x_))~=0)
312 syms xs_ 312 syms xs_
319 else 319 else
320 ys_=0; 320 ys_=0;
321 end 321 end
322 322
323 [V, D]=eig(mat(params,xs,ys,xs_,ys_)); 323 [V, D]=eig(mat(params,xs,ys,xs_,ys_));
324 Vi=inv(V);
324 syms xs ys xs_ ys_ 325 syms xs ys xs_ ys_
325 326
326 xs=x; 327 xs=x;
327 ys=y; 328 ys=y;
328 xs_=x_; 329 xs_=x_;
329 ys_=y_; 330 ys_=y_;
330 331
331 side=max(length(x),length(y)); 332 side=max(length(x),length(y));
332 Dret=zeros(obj.n,side*obj.n); 333 Dret=zeros(obj.n,side*obj.n);
333 Vret=zeros(obj.n,side*obj.n); 334 Vret=zeros(obj.n,side*obj.n);
335 Viret=zeros(obj.n,side*obj.n);
334 for ii=1:obj.n 336 for ii=1:obj.n
335 for jj=1:obj.n 337 for jj=1:obj.n
336 Dret(jj,(ii-1)*side+1:side*ii)=eval(D(jj,ii)); 338 Dret(jj,(ii-1)*side+1:side*ii)=eval(D(jj,ii));
337 Vret(jj,(ii-1)*side+1:side*ii)=eval(V(jj,ii)); 339 Vret(jj,(ii-1)*side+1:side*ii)=eval(V(jj,ii));
340 Viret(jj,(ii-1)*side+1:side*ii)=eval(Vi(jj,ii));
338 end 341 end
339 end 342 end
340 343
341 D=sparse(Dret); 344 D=sparse(Dret);
342 V=sparse(Vret); 345 V=sparse(Vret);
346 Vi=sparse(Viret);
343 V=obj.evaluateCoefficientMatrix(V,x,y,x_,y_); 347 V=obj.evaluateCoefficientMatrix(V,x,y,x_,y_);
344 D=obj.evaluateCoefficientMatrix(D,x,y,x_,y_); 348 D=obj.evaluateCoefficientMatrix(D,x,y,x_,y_);
349 Vi=obj.evaluateCoefficientMatrix(Vi,x,y,x_,y_);
345 DD=diag(D); 350 DD=diag(D);
346 351
347 poseig=(DD>0); 352 poseig=(DD>0);
348 zeroeig=(DD==0); 353 zeroeig=(DD==0);
349 negeig=(DD<0); 354 negeig=(DD<0);
350 355
351 D=diag([DD(poseig); DD(zeroeig); DD(negeig)]); 356 D=diag([DD(poseig); DD(zeroeig); DD(negeig)]);
352 V=[V(:,poseig) V(:,zeroeig) V(:,negeig)]; 357 V=[V(:,poseig) V(:,zeroeig) V(:,negeig)];
353 Vi=inv(V); 358 Vi=[Vi(poseig,:); Vi(zeroeig,:); Vi(negeig,:)];
354 signVec=[sum(poseig),sum(zeroeig),sum(negeig)]; 359 signVec=[sum(poseig),sum(zeroeig),sum(negeig)];
355 end 360 end
356
357 end 361 end
358 end 362 end