comparison +scheme/Hypsyst2dCurve.m @ 300:32f3ee81bc37 feature/hypsyst

A commit before i destroy everything
author Ylva Rydin <ylva.rydin@telia.com>
date Tue, 04 Oct 2016 16:25:38 +0200
parents 4d8d6eb0c116
children d9860ebc3148
comparison
equal deleted inserted replaced
299:4d8d6eb0c116 300:32f3ee81bc37
85 [X,Y] = ti.map(obj.xi,obj.eta); 85 [X,Y] = ti.map(obj.xi,obj.eta);
86 86
87 [x_xi,x_eta] = gridDerivatives(X,ops_xi.D1,ops_eta.D1); 87 [x_xi,x_eta] = gridDerivatives(X,ops_xi.D1,ops_eta.D1);
88 [y_xi,y_eta] = gridDerivatives(Y,ops_xi.D1, ops_eta.D1); 88 [y_xi,y_eta] = gridDerivatives(Y,ops_xi.D1, ops_eta.D1);
89 89
90 obj.X=reshape(X,m_xi*m_eta,1); 90 obj.X=reshape(X,m_tot,1);
91 obj.Y=reshape(Y,m_xi*m_eta,1); 91 obj.Y=reshape(Y,m_tot,1);
92 obj.X_xi=reshape(x_xi,m_xi*m_eta,1); 92 obj.X_xi=reshape(x_xi,m_tot,1);
93 obj.Y_xi=reshape(y_xi,m_xi*m_eta,1); 93 obj.Y_xi=reshape(y_xi,m_tot,1);
94 obj.X_eta=reshape(x_eta,m_xi*m_eta,1); 94 obj.X_eta=reshape(x_eta,m_tot,1);
95 obj.Y_eta=reshape(y_eta,m_xi*m_eta,1); 95 obj.Y_eta=reshape(y_eta,m_tot,1);
96 96
97 Ahat_evaluated = obj.evaluateCoefficientMatrix(obj.Ahat, obj.X, obj.Y,obj.X_eta,obj.Y_eta); 97 Ahat_evaluated = obj.evaluateCoefficientMatrix(obj.Ahat, obj.X, obj.Y,obj.X_eta,obj.Y_eta);
98 Bhat_evaluated = obj.evaluateCoefficientMatrix(obj.Bhat, obj.X, obj.Y,obj.X_xi,obj.Y_xi); 98 Bhat_evaluated = obj.evaluateCoefficientMatrix(obj.Bhat, obj.X, obj.Y,obj.X_xi,obj.Y_xi);
99 E_evaluated = obj.evaluateCoefficientMatrix(obj.E, obj.X, obj.Y,[],[]); 99 E_evaluated = obj.evaluateCoefficientMatrix(obj.E, obj.X, obj.Y,[],[]);
100 100
101 obj.m=m; 101 obj.m=m;
102 obj.h=[ops_xi.h ops_eta.h]; 102 obj.h=[ops_xi.h ops_eta.h];
103 obj.order=order; 103 obj.order=order;
104 obj.J=x_xi.*y_eta - x_eta.*y_xi; 104 obj.J=obj.X_xi.*obj.Y_eta - obj.X_eta.*obj.Y_xi;
105 obj.Ji =kr(I_n,spdiags(1./obj.J(:),0,m_xi*m_eta,m_xi*m_eta)); 105 obj.Ji =kr(I_n,spdiags(1./obj.J,0,m_tot,m_tot));
106 106
107 obj.D=obj.Ji*(-Ahat_evaluated*D1_xi-Bhat_evaluated*D1_eta)-E_evaluated; 107 obj.D=obj.Ji*(-Ahat_evaluated*D1_xi-Bhat_evaluated*D1_eta)-E_evaluated;
108 108
109 end 109 end
110 110
159 end 159 end
160 160
161 161
162 function [closure, penalty]=boundary_condition_char(obj,boundary) 162 function [closure, penalty]=boundary_condition_char(obj,boundary)
163 params=obj.params; 163 params=obj.params;
164 X=obj.X; Y=obj.Y;
164 xi=obj.xi; eta=obj.eta; 165 xi=obj.xi; eta=obj.eta;
165 side=max(length(xi),length(eta)); 166 side=max(length(xi),length(eta));
166 167
167 switch boundary 168 switch boundary
168 case {'w','W','west'} 169 case {'w','W','west'}
169 e_=obj.e_w; 170 e_=obj.e_w;
170 mat=obj.Ahat; 171 mat=obj.Ahat;
171 boundPos='l'; 172 boundPos='l';
172 Hi=obj.Hxii; 173 Hi=obj.Hxii;
173 [V,Vi,D,signVec]=obj.matrixDiag(mat,xi(1),eta,obj.X_eta(obj.index_w),obj.Y_eta(obj.index_w)); 174 [V,Vi,D,signVec]=obj.matrixDiag(mat,X(obj.index_w),Y(obj.index_w),obj.X_eta(obj.index_w),obj.Y_eta(obj.index_w));
174 case {'e','E','east'} 175 case {'e','E','east'}
175 e_=obj.e_e; 176 e_=obj.e_e;
176 mat=obj.Ahat; 177 mat=obj.Ahat;
177 boundPos='r'; 178 boundPos='r';
178 Hi=obj.Hxii; 179 Hi=obj.Hxii;
179 [V,Vi,D,signVec]=obj.matrixDiag(mat,xi(end),eta,obj.X_eta(obj.index_e),obj.Y_eta(obj.index_e)); 180 [V,Vi,D,signVec]=obj.matrixDiag(mat,X(obj.index_e),Y(obj.index_e),obj.X_eta(obj.index_e),obj.Y_eta(obj.index_e));
180 case {'s','S','south'} 181 case {'s','S','south'}
181 e_=obj.e_s; 182 e_=obj.e_s;
182 mat=obj.Bhat; 183 mat=obj.Bhat;
183 boundPos='l'; 184 boundPos='l';
184 Hi=obj.Hetai; 185 Hi=obj.Hetai;
185 [V,Vi,D,signVec]=obj.matrixDiag(mat,xi,eta(1),obj.X_xi(obj.index_s),obj.Y_xi(obj.index_s)); 186 [V,Vi,D,signVec]=obj.matrixDiag(mat,X(obj.index_s),Y(obj.index_s),obj.X_xi(obj.index_s),obj.Y_xi(obj.index_s));
186 case {'n','N','north'} 187 case {'n','N','north'}
187 e_=obj.e_n; 188 e_=obj.e_n;
188 mat=obj.Bhat; 189 mat=obj.Bhat;
189 boundPos='r'; 190 boundPos='r';
190 Hi=obj.Hetai; 191 Hi=obj.Hetai;
191 [V,Vi,D,signVec]=obj.matrixDiag(mat,xi,eta(end),obj.X_xi(obj.index_n),obj.Y_xi(obj.index_n)); 192 [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));
192 end 193 end
193 194
194 pos=signVec(1); zeroval=signVec(2); neg=signVec(3); 195 pos=signVec(1); zeroval=signVec(2); neg=signVec(3);
195 196
196 switch boundPos 197 switch boundPos
197 case {'l'} 198 case {'l'}
198 tau=sparse(obj.n*side,pos*side); 199 tau=sparse(obj.n*side,pos);
199 Vi_plus=Vi(1:pos*side,:); 200 Vi_plus=Vi(1:pos,:);
200 tau(1:pos*side,:)=-abs(D(1:pos*side,1:pos*side)); 201 tau(1:pos,:)=-abs(D(1:pos,1:pos));
201 closure=Hi*e_*V*tau*Vi_plus*e_'; 202 closure=Hi*e_*V*tau*Vi_plus*e_';
202 penalty=-Hi*e_*V*tau*Vi_plus; 203 penalty=-Hi*e_*V*tau*Vi_plus;
203 case {'r'} 204 case {'r'}
204 tau=sparse(obj.n*side,neg*side); 205 tau=sparse(obj.n*side,neg);
205 tau((pos+zeroval)*side+1:obj.n*side,:)=-abs(D((pos+zeroval)*side+1:obj.n*side,(pos+zeroval)*side+1:obj.n*side)); 206 tau((pos+zeroval)+1:obj.n*side,:)=-abs(D((pos+zeroval)+1:obj.n*side,(pos+zeroval)+1:obj.n*side));
206 Vi_minus=Vi((pos+zeroval)*side+1:obj.n*side,:); 207 Vi_minus=Vi((pos+zeroval)+1:obj.n*side,:);
207 closure=Hi*e_*V*tau*Vi_minus*e_'; 208 closure=Hi*e_*V*tau*Vi_minus*e_';
208 penalty=-Hi*e_*V*tau*Vi_minus; 209 penalty=-Hi*e_*V*tau*Vi_minus;
209 end 210 end
210 end 211 end
211 212
212 213
213 function [closure,penalty]=boundary_condition_general(obj,boundary,L) 214 function [closure,penalty]=boundary_condition_general(obj,boundary,L)
214 params=obj.params; 215 params=obj.params;
215 xi=obj.xi; eta=obj.eta; 216 X=obj.X; Y=obj.Y;
216 side=max(length(xi),length(eta)); 217 side=max(length(xi),length(eta));
217 218
218 switch boundary 219 switch boundary
219 case {'w','W','west'} 220 case {'w','W','west'}
220 e_=obj.e_w; 221 e_=obj.e_w;
221 mat=obj.Ahat; 222 mat=obj.Ahat;
222 boundPos='l'; 223 boundPos='l';
223 Hi=obj.Hxii; 224 Hi=obj.Hxii;
224 [V,Vi,D,signVec]=obj.matrixDiag(mat,xi(1),eta,obj.x_eta,obj.y_eta); 225 [V,Vi,D,signVec]=obj.matrixDiag(mat,X(obj.index_w),Y(obj.index_w),obj.X_eta(obj.index_w),obj.Y_eta(obj.index_w));
225 L=obj.evaluateCoefficientMatrix(L,xi(1),eta); 226 L=obj.evaluateCoefficientMatrix(L,X(obj.index_w),Y(obj.index_w));
226 case {'e','E','east'} 227 case {'e','E','east'}
227 e_=obj.e_e; 228 e_=obj.e_e;
228 mat=obj.Ahat; 229 mat=obj.Ahat;
229 boundPos='r'; 230 boundPos='r';
230 Hi=obj.Hxii; 231 Hi=obj.Hxii;
231 [V,Vi,D,signVec]=obj.matrixDiag(mat,xi(end),eta,obj.x_eta,obj.y_eta); 232 [V,Vi,D,signVec]=obj.matrixDiag(mat,X(obj.index_e),Y(obj.index_e),obj.X_eta(obj.index_e),obj.Y_eta(obj.index_e));
232 L=obj.evaluateCoefficientMatrix(L,xi(end),eta,[],[]); 233 L=obj.evaluateCoefficientMatrix(L,X(obj.index_e),Y(obj.index_e),[],[]);
233 case {'s','S','south'} 234 case {'s','S','south'}
234 e_=obj.e_s; 235 e_=obj.e_s;
235 mat=obj.Bhat; 236 mat=obj.Bhat;
236 boundPos='l'; 237 boundPos='l';
237 Hi=obj.Hetai; 238 Hi=obj.Hetai;
238 [V,Vi,D,signVec]=obj.matrixDiag(mat,xi,eta(1),obj.x_xi,obj.y_xi); 239 [V,Vi,D,signVec]=obj.matrixDiag(mat,X(obj.index_s),Y(obj.index_s),obj.X_xi(obj.index_s),obj.Y_xi(obj.index_s));
239 L=obj.evaluateCoefficientMatrix(L,xi,eta(1)); 240 L=obj.evaluateCoefficientMatrix(L,X(obj.index_s),Y(obj.index_s),[],[]);
240 case {'n','N','north'} 241 case {'n','N','north'}
241 e_=obj.e_n; 242 e_=obj.e_n;
242 mat=obj.Bhat; 243 mat=obj.Bhat;
243 boundPos='r'; 244 boundPos='r';
244 Hi=obj.Hetai; 245 Hi=obj.Hetai;
245 [V,Vi,D,signVec]=obj.matrixDiag(mat,xi,eta(end),obj.x_xi,obj.y_xi); 246 [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));
246 L=obj.evaluateCoefficientMatrix(L,xi,eta(end)); 247 L=obj.evaluateCoefficientMatrix(L,X(obj.index_n),Y(obj.index_n));
247 end 248 end
248 249
249 pos=signVec(1); zeroval=signVec(2); neg=signVec(3); 250 pos=signVec(1); zeroval=signVec(2); neg=signVec(3);
250 251
251 switch boundPos 252 switch boundPos
252 case {'l'} 253 case {'l'}
253 tau=sparse(obj.n*side,pos*side); 254 tau=sparse(obj.n*side,pos);
254 Vi_plus=Vi(1:pos*side,:); 255 Vi_plus=Vi(1:pos,:);
255 Vi_minus=Vi(pos*side+1:obj.n*side,:); 256 Vi_minus=Vi(pos+1:obj.n*side,:);
256 V_plus=V(:,1:pos*side); 257 V_plus=V(:,1:pos);
257 V_minus=V(:,(pos+zeroval)*side+1:obj.n*side); 258 V_minus=V(:,(pos+zeroval)+1:obj.n*side);
258 259
259 tau(1:pos*side,:)=-abs(D(1:pos*side,1:pos*side)); 260 tau(1:pos*side,:)=-abs(D(1:pos,1:pos));
260 R=-inv(L*V_plus)*(L*V_minus); 261 R=-inv(L*V_plus)*(L*V_minus);
261 closure=Hi*e_*V*tau*(Vi_plus-R*Vi_minus)*e_'; 262 closure=Hi*e_*V*tau*(Vi_plus-R*Vi_minus)*e_';
262 penalty=-Hi*e_*V*tau*inv(L*V_plus)*L; 263 penalty=-Hi*e_*V*tau*inv(L*V_plus)*L;
263 case {'r'} 264 case {'r'}
264 tau=sparse(obj.n*side,neg*side); 265 tau=sparse(obj.n*side,neg);
265 tau((pos+zeroval)*side+1:obj.n*side,:)=-abs(D((pos+zeroval)*side+1:obj.n*side,(pos+zeroval)*side+1:obj.n*side)); 266 tau((pos+zeroval)+1:obj.n*side,:)=-abs(D((pos+zeroval)+1:obj.n*side,(pos+zeroval)+1:obj.n*side));
266 Vi_plus=Vi(1:pos*side,:); 267 Vi_plus=Vi(1:pos,:);
267 Vi_minus=Vi((pos+zeroval)*side+1:obj.n*side,:); 268 Vi_minus=Vi((pos+zeroval)+1:obj.n*side,:);
268 269
269 V_plus=V(:,1:pos*side); 270 V_plus=V(:,1:pos);
270 V_minus=V(:,(pos+zeroval)*side+1:obj.n*side); 271 V_minus=V(:,(pos+zeroval)+1:obj.n*side);
271 R=-inv(L*V_minus)*(L*V_plus); 272 R=-inv(L*V_minus)*(L*V_plus);
272 closure=Hi*e_*V*tau*(Vi_minus-R*Vi_plus)*e_'; 273 closure=Hi*e_*V*tau*(Vi_minus-R*Vi_plus)*e_';
273 penalty=-Hi*e_*V*tau*inv(L*V_minus)*L; 274 penalty=-Hi*e_*V*tau*inv(L*V_minus)*L;
274 end 275 end
275 end 276 end
289 else 290 else
290 ys_=0; 291 ys_=0;
291 end 292 end
292 293
293 [V, D]=eig(mat(params,xs,ys,xs_,ys_)); 294 [V, D]=eig(mat(params,xs,ys,xs_,ys_));
294 xs=1;ys=1; xs_=x_(1); ys_=y_(1);
295 DD=eval(diag(D));
296
297 poseig=find(DD>0);
298 zeroeig=find(DD==0);
299 negeig=find(DD<0);
300 syms xs ys xs_ ys_ 295 syms xs ys xs_ ys_
301 DD=diag(D); 296
302
303 D=diag([DD(poseig);DD(zeroeig); DD(negeig)]);
304 V=[V(:,poseig) V(:,zeroeig) V(:,negeig)];
305 Vi=inv(V);
306 xs=x; 297 xs=x;
307 ys=y; 298 ys=y;
308 xs_=x_; 299 xs_=x_;
309 ys_=y_; 300 ys_=y_;
310 301
311 side=max(length(x),length(y)); 302 side=max(length(x),length(y));
312 Dret=zeros(obj.n,side*obj.n); 303 Dret=zeros(obj.n,side*obj.n);
313 Vret=zeros(obj.n,side*obj.n); 304 Vret=zeros(obj.n,side*obj.n);
314 Viret=zeros(obj.n,side*obj.n);
315 for ii=1:obj.n 305 for ii=1:obj.n
316 for jj=1:obj.n 306 for jj=1:obj.n
317 Dret(jj,(ii-1)*side+1:side*ii)=eval(D(jj,ii)); 307 Dret(jj,(ii-1)*side+1:side*ii)=eval(D(jj,ii));
318 Vret(jj,(ii-1)*side+1:side*ii)=eval(V(jj,ii)); 308 Vret(jj,(ii-1)*side+1:side*ii)=eval(V(jj,ii));
319 Viret(jj,(ii-1)*side+1:side*ii)=eval(Vi(jj,ii));
320 end 309 end
321 end 310 end
322 311
323 D=sparse(Dret); 312 D=sparse(Dret);
324 V=sparse(Vret); 313 V=sparse(Vret);
325 Vi=sparse(Viret);
326 V=obj.evaluateCoefficientMatrix(V,x,y,x_,y_); 314 V=obj.evaluateCoefficientMatrix(V,x,y,x_,y_);
327 D=obj.evaluateCoefficientMatrix(D,x,y,x_,y_); 315 D=obj.evaluateCoefficientMatrix(D,x,y,x_,y_);
328 Vi=obj.evaluateCoefficientMatrix(Vi,x,y,x_,y_); 316 DD=diag(D);
329 signVec=[length(poseig),length(zeroeig),length(negeig)]; 317
318 poseig=(DD>0);
319 zeroeig=(DD==0);
320 negeig=(DD<0);
321
322 D=diag([DD(poseig); DD(zeroeig); DD(negeig)]);
323 V=[V(:,poseig) V(:,zeroeig) V(:,negeig)];
324 Vi=inv(V);
325 signVec=[sum(poseig),sum(zeroeig),sum(negeig)];
330 end 326 end
331 327
332 end 328 end
333 end 329 end