Mercurial > repos > public > sbplib
comparison +scheme/Hypsyst2d.m @ 301:d9860ebc3148 feature/hypsyst
HypsystCurve2D Seems to work (Converges with MMS)
author | Ylva Rydin <ylva.rydin@telia.com> |
---|---|
date | Wed, 05 Oct 2016 17:36:34 +0200 |
parents | cd30b22cee56 |
children | 9b3d7fc61a36 |
comparison
equal
deleted
inserted
replaced
300:32f3ee81bc37 | 301:d9860ebc3148 |
---|---|
126 | 126 |
127 | 127 |
128 function [closure, penalty]=boundary_condition_char(obj,boundary) | 128 function [closure, penalty]=boundary_condition_char(obj,boundary) |
129 params=obj.params; | 129 params=obj.params; |
130 x=obj.x; y=obj.y; | 130 x=obj.x; y=obj.y; |
131 side=max(length(x),length(y)); | 131 |
132 | |
133 switch boundary | 132 switch boundary |
134 case {'w','W','west'} | 133 case {'w','W','west'} |
135 e_=obj.e_w; | 134 e_=obj.e_w; |
136 mat=obj.A; | 135 mat=obj.A; |
137 boundPos='l'; | 136 boundPos='l'; |
138 Hi=obj.Hxi; | 137 Hi=obj.Hxi; |
139 [V,Vi,D,signVec]=obj.matrixDiag(mat,x(1),y); | 138 [V,Vi,D,signVec]=obj.matrixDiag(mat,x(1),y); |
139 side=max(length(y)); | |
140 case {'e','E','east'} | 140 case {'e','E','east'} |
141 e_=obj.e_e; | 141 e_=obj.e_e; |
142 mat=obj.A; | 142 mat=obj.A; |
143 boundPos='r'; | 143 boundPos='r'; |
144 Hi=obj.Hxi; | 144 Hi=obj.Hxi; |
145 [V,Vi,D,signVec]=obj.matrixDiag(mat,x(end),y); | 145 [V,Vi,D,signVec]=obj.matrixDiag(mat,x(end),y); |
146 side=max(length(y)); | |
146 case {'s','S','south'} | 147 case {'s','S','south'} |
147 e_=obj.e_s; | 148 e_=obj.e_s; |
148 mat=obj.B; | 149 mat=obj.B; |
149 boundPos='l'; | 150 boundPos='l'; |
150 Hi=obj.Hyi; | 151 Hi=obj.Hyi; |
151 [V,Vi,D,signVec]=obj.matrixDiag(mat,x,y(1)); | 152 [V,Vi,D,signVec]=obj.matrixDiag(mat,x,y(1)); |
153 side=max(length(x)); | |
152 case {'n','N','north'} | 154 case {'n','N','north'} |
153 e_=obj.e_n; | 155 e_=obj.e_n; |
154 mat=obj.B; | 156 mat=obj.B; |
155 boundPos='r'; | 157 boundPos='r'; |
156 Hi=obj.Hyi; | 158 Hi=obj.Hyi; |
157 [V,Vi,D,signVec]=obj.matrixDiag(mat,x,y(end)); | 159 [V,Vi,D,signVec]=obj.matrixDiag(mat,x,y(end)); |
160 side=max(length(x)); | |
158 end | 161 end |
159 | 162 |
160 pos=signVec(1); zeroval=signVec(2); neg=signVec(3); | 163 pos=signVec(1); zeroval=signVec(2); neg=signVec(3); |
161 | 164 |
162 switch boundPos | 165 switch boundPos |
163 case {'l'} | 166 case {'l'} |
164 tau=sparse(obj.n*side,pos*side); | 167 tau=sparse(obj.n*side,pos); |
165 Vi_plus=Vi(1:pos*side,:); | 168 Vi_plus=Vi(1:pos,:); |
166 tau(1:pos*side,:)=-abs(D(1:pos*side,1:pos*side)); | 169 tau(1:pos,:)=-abs(D(1:pos,1:pos)); |
167 closure=Hi*e_*V*tau*Vi_plus*e_'; | 170 closure=Hi*e_*V*tau*Vi_plus*e_'; |
168 penalty=-Hi*e_*V*tau*Vi_plus; | 171 penalty=-Hi*e_*V*tau*Vi_plus; |
169 case {'r'} | 172 case {'r'} |
170 tau=sparse(obj.n*side,neg*side); | 173 tau=sparse(obj.n*side,neg); |
171 tau((pos+zeroval)*side+1:obj.n*side,:)=-abs(D((pos+zeroval)*side+1:obj.n*side,(pos+zeroval)*side+1:obj.n*side)); | 174 tau((pos+zeroval)+1:obj.n*side,:)=-abs(D((pos+zeroval)+1:obj.n*side,(pos+zeroval)+1:obj.n*side)); |
172 Vi_minus=Vi((pos+zeroval)*side+1:obj.n*side,:); | 175 Vi_minus=Vi((pos+zeroval)+1:obj.n*side,:); |
173 closure=Hi*e_*V*tau*Vi_minus*e_'; | 176 closure=Hi*e_*V*tau*Vi_minus*e_'; |
174 penalty=-Hi*e_*V*tau*Vi_minus; | 177 penalty=-Hi*e_*V*tau*Vi_minus; |
175 end | 178 end |
176 end | 179 end |
177 | 180 |
178 | 181 |
179 function [closure,penalty]=boundary_condition_general(obj,boundary,L) | 182 function [closure,penalty]=boundary_condition_general(obj,boundary,L) |
180 params=obj.params; | 183 params=obj.params; |
181 x=obj.x; y=obj.y; | 184 x=obj.x; y=obj.y; |
182 side=max(length(x),length(y)); | |
183 | 185 |
184 switch boundary | 186 switch boundary |
185 case {'w','W','west'} | 187 case {'w','W','west'} |
186 e_=obj.e_w; | 188 e_=obj.e_w; |
187 mat=obj.A; | 189 mat=obj.A; |
188 boundPos='l'; | 190 boundPos='l'; |
189 Hi=obj.Hxi; | 191 Hi=obj.Hxi; |
190 [V,Vi,D,signVec]=obj.matrixDiag(mat,x(1),y); | 192 [V,Vi,D,signVec]=obj.matrixDiag(mat,x(1),y); |
191 L=obj.evaluateCoefficientMatrix(L,x(1),y); | 193 L=obj.evaluateCoefficientMatrix(L,x(1),y); |
194 side=max(length(y)); | |
192 case {'e','E','east'} | 195 case {'e','E','east'} |
193 e_=obj.e_e; | 196 e_=obj.e_e; |
194 mat=obj.A; | 197 mat=obj.A; |
195 boundPos='r'; | 198 boundPos='r'; |
196 Hi=obj.Hxi; | 199 Hi=obj.Hxi; |
197 [V,Vi,D,signVec]=obj.matrixDiag(mat,x(end),y); | 200 [V,Vi,D,signVec]=obj.matrixDiag(mat,x(end),y); |
198 L=obj.evaluateCoefficientMatrix(L,x(end),y); | 201 L=obj.evaluateCoefficientMatrix(L,x(end),y); |
202 side=max(length(y)); | |
199 case {'s','S','south'} | 203 case {'s','S','south'} |
200 e_=obj.e_s; | 204 e_=obj.e_s; |
201 mat=obj.B; | 205 mat=obj.B; |
202 boundPos='l'; | 206 boundPos='l'; |
203 Hi=obj.Hyi; | 207 Hi=obj.Hyi; |
204 [V,Vi,D,signVec]=obj.matrixDiag(mat,x,y(1)); | 208 [V,Vi,D,signVec]=obj.matrixDiag(mat,x,y(1)); |
205 L=obj.evaluateCoefficientMatrix(L,x,y(1)); | 209 L=obj.evaluateCoefficientMatrix(L,x,y(1)); |
210 side=max(length(x)); | |
206 case {'n','N','north'} | 211 case {'n','N','north'} |
207 e_=obj.e_n; | 212 e_=obj.e_n; |
208 mat=obj.B; | 213 mat=obj.B; |
209 boundPos='r'; | 214 boundPos='r'; |
210 Hi=obj.Hyi; | 215 Hi=obj.Hyi; |
211 [V,Vi,D,signVec]=obj.matrixDiag(mat,x,y(end)); | 216 [V,Vi,D,signVec]=obj.matrixDiag(mat,x,y(end)); |
212 L=obj.evaluateCoefficientMatrix(L,x,y(end)); | 217 L=obj.evaluateCoefficientMatrix(L,x,y(end)); |
218 side=max(length(x)); | |
213 end | 219 end |
214 | 220 |
215 pos=signVec(1); zeroval=signVec(2); neg=signVec(3); | 221 pos=signVec(1); zeroval=signVec(2); neg=signVec(3); |
216 | 222 |
217 switch boundPos | 223 switch boundPos |
218 case {'l'} | 224 case {'l'} |
219 tau=sparse(obj.n*side,pos*side); | 225 tau=sparse(obj.n*side,pos); |
220 Vi_plus=Vi(1:pos*side,:); | 226 Vi_plus=Vi(1:pos,:); |
221 Vi_minus=Vi(pos*side+1:obj.n*side,:); | 227 Vi_minus=Vi(pos+zeroval+1:obj.n*side,:); |
222 V_plus=V(:,1:pos*side); | 228 V_plus=V(:,1:pos); |
223 V_minus=V(:,(pos+zeroval)*side+1:obj.n*side); | 229 V_minus=V(:,(pos+zeroval)+1:obj.n*side); |
224 | 230 |
225 tau(1:pos*side,:)=-abs(D(1:pos*side,1:pos*side)); | 231 tau(1:pos,:)=-abs(D(1:pos,1:pos)); |
226 R=-inv(L*V_plus)*(L*V_minus); | 232 R=-inv(L*V_plus)*(L*V_minus); |
227 closure=Hi*e_*V*tau*(Vi_plus-R*Vi_minus)*e_'; | 233 closure=Hi*e_*V*tau*(Vi_plus-R*Vi_minus)*e_'; |
228 penalty=-Hi*e_*V*tau*inv(L*V_plus)*L; | 234 penalty=-Hi*e_*V*tau*inv(L*V_plus)*L; |
229 case {'r'} | 235 case {'r'} |
230 tau=sparse(obj.n*side,neg*side); | 236 tau=sparse(obj.n*side,neg); |
231 tau((pos+zeroval)*side+1:obj.n*side,:)=-abs(D((pos+zeroval)*side+1:obj.n*side,(pos+zeroval)*side+1:obj.n*side)); | 237 tau((pos+zeroval)+1:obj.n*side,:)=-abs(D((pos+zeroval)+1:obj.n*side,(pos+zeroval)+1:obj.n*side)); |
232 Vi_plus=Vi(1:pos*side,:); | 238 Vi_plus=Vi(1:pos,:); |
233 Vi_minus=Vi((pos+zeroval)*side+1:obj.n*side,:); | 239 Vi_minus=Vi((pos+zeroval)+1:obj.n*side,:); |
234 | 240 |
235 V_plus=V(:,1:pos*side); | 241 V_plus=V(:,1:pos); |
236 V_minus=V(:,(pos+zeroval)*side+1:obj.n*side); | 242 V_minus=V(:,(pos+zeroval)+1:obj.n*side); |
237 R=-inv(L*V_minus)*(L*V_plus); | 243 R=-inv(L*V_minus)*(L*V_plus); |
238 closure=Hi*e_*V*tau*(Vi_minus-R*Vi_plus)*e_'; | 244 closure=Hi*e_*V*tau*(Vi_minus-R*Vi_plus)*e_'; |
239 penalty=-Hi*e_*V*tau*inv(L*V_minus)*L; | 245 penalty=-Hi*e_*V*tau*inv(L*V_minus)*L; |
240 end | 246 end |
241 end | 247 end |
242 | 248 |
243 | 249 |
244 function [V,Vi, D,signVec]=matrixDiag(obj,mat,x,y) | 250 function [V,Vi, D,signVec]=matrixDiag(obj,mat,x,y) |
245 params=obj.params; | 251 params=obj.params; |
246 syms xs ys; | 252 syms xs ys |
247 [V, D]=eig(mat(params,xs,ys)); | 253 [V, D]=eig(mat(params,xs,ys)); |
248 xs=1;ys=1; | 254 xs=x; |
249 DD=eval(diag(D)); | 255 ys=y; |
250 | 256 |
251 poseig=find(DD>0); | |
252 zeroeig=find(DD==0); | |
253 negeig=find(DD<0); | |
254 syms xs ys | |
255 DD=diag(D); | |
256 | |
257 D=diag([DD(poseig);DD(zeroeig); DD(negeig)]); | |
258 V=[V(:,poseig) V(:,zeroeig) V(:,negeig)]; | |
259 xs=x; ys=y; | |
260 | |
261 side=max(length(x),length(y)); | 257 side=max(length(x),length(y)); |
262 Dret=zeros(obj.n,side*obj.n); | 258 Dret=zeros(obj.n,side*obj.n); |
263 Vret=zeros(obj.n,side*obj.n); | 259 Vret=zeros(obj.n,side*obj.n); |
264 for ii=1:obj.n | 260 for ii=1:obj.n |
265 for jj=1:obj.n | 261 for jj=1:obj.n |
267 Vret(jj,(ii-1)*side+1:side*ii)=eval(V(jj,ii)); | 263 Vret(jj,(ii-1)*side+1:side*ii)=eval(V(jj,ii)); |
268 end | 264 end |
269 end | 265 end |
270 | 266 |
271 D=sparse(Dret); | 267 D=sparse(Dret); |
272 V=sparse(normc(Vret)); | 268 V=sparse(Vret); |
273 V=obj.evaluateCoefficientMatrix(V,x,y); | 269 V=obj.evaluateCoefficientMatrix(V,x,y); |
274 D=obj.evaluateCoefficientMatrix(D,x,y); | 270 D=obj.evaluateCoefficientMatrix(D,x,y); |
271 DD=diag(D); | |
272 | |
273 poseig=(DD>0); | |
274 zeroeig=(DD==0); | |
275 negeig=(DD<0); | |
276 | |
277 D=diag([DD(poseig); DD(zeroeig); DD(negeig)]); | |
278 V=[V(:,poseig) V(:,zeroeig) V(:,negeig)]; | |
275 Vi=inv(V); | 279 Vi=inv(V); |
276 signVec=[length(poseig),length(zeroeig),length(negeig)]; | 280 signVec=[sum(poseig),sum(zeroeig),sum(negeig)]; |
277 end | 281 end |
278 | 282 |
279 end | 283 end |
280 end | 284 end |