comparison +scheme/elasticShearVariable.m @ 669:17e62551cdc2 feature/poroelastic

Add Dirichlet condition. Symmetric, semi-definite matrix and MMS convergence working with variable coeff!
author Martin Almquist <malmquist@stanford.edu>
date Fri, 22 Dec 2017 14:16:17 +0100
parents ed853945ee99
children 9e1d2351f539
comparison
equal deleted inserted replaced
668:43ea848b6aa1 669:17e62551cdc2
13 13
14 D % Total operator 14 D % Total operator
15 D1 % First derivatives 15 D1 % First derivatives
16 D2 % Second derivatives 16 D2 % Second derivatives
17 H, Hi % Inner products 17 H, Hi % Inner products
18 phi % Borrowing constant for (d1 - e^T*D1) from R
19 gamma % Borrowing constant for d1 from M
20 H11 % First element of H
18 e_l, e_r 21 e_l, e_r
19 d1_l, d1_r % Normal derivatives at the boundary 22 d1_l, d1_r % Normal derivatives at the boundary
20 E % E{i}^T picks out component i 23 E % E{i}^T picks out component i
21 24
22 H_boundary % Boundary inner products 25 H_boundary % Boundary inner products
49 % 1D operators 52 % 1D operators
50 ops = cell(dim,1); 53 ops = cell(dim,1);
51 for i = 1:dim 54 for i = 1:dim
52 ops{i} = opSet(m(i), {0, L(i)}, order); 55 ops{i} = opSet(m(i), {0, L(i)}, order);
53 end 56 end
57
58 % Borrowing constants
59 beta = ops{1}.borrowing.R.delta_D;
60 obj.H11 = ops{1}.borrowing.H11;
61 obj.phi = beta/obj.H11;
62 obj.gamma = ops{1}.borrowing.M.d1;
54 63
55 I = cell(dim,1); 64 I = cell(dim,1);
56 D1 = cell(dim,1); 65 D1 = cell(dim,1);
57 D2 = cell(dim,1); 66 D2 = cell(dim,1);
58 H = cell(dim,1); 67 H = cell(dim,1);
208 H_gamma = obj.H_boundary{j}; 217 H_gamma = obj.H_boundary{j};
209 A = obj.A; 218 A = obj.A;
210 RHO = obj.RHO; 219 RHO = obj.RHO;
211 D1 = obj.D1; 220 D1 = obj.D1;
212 221
222 phi = obj.phi;
223 gamma = obj.gamma;
224 H11 = obj.H11;
225 h = obj.h;
226
213 switch type 227 switch type
214 % Dirichlet boundary condition 228 % Dirichlet boundary condition
215 case {'D','d','dirichlet'} 229 case {'D','d','dirichlet'}
216 error('Dirichlet not implemented')
217 tuning = 1.2; 230 tuning = 1.2;
218 % tuning = 20.2; 231 phi = obj.phi;
219 232
220 b1 = gamm*obj.lambda./obj.a11.^2; 233 closures = cell(obj.dim,1);
221 b2 = gamm*obj.lambda./obj.a22.^2; 234 penalties = cell(obj.dim,obj.dim);
222 235 % Loop over components
223 tau1 = tuning * spdiag(-1./b1 - 1./b2); 236 for i = 1:obj.dim
224 tau2 = 1; 237 H_gamma_i = obj.H_boundary{i};
225 238 sigma_ij = tuning*delta(i,j)*2/(gamma*h(j)) +...
226 tau = (tau1*e + tau2*d)*H_b; 239 tuning*delta_b(i,j)*(2/(H11*h(j)) + 2/(H11*h(j)*phi));
227 240
228 closure = obj.a*obj.Hi*tau*e'; 241 ci = E{i}*inv(RHO)*nj*Hi*...
229 penalty = -obj.a*obj.Hi*tau; 242 ( (e{j}*H_gamma*e{j}'*A*e{j}*d{j}')'*E{i}' + ...
230 243 delta(i,j)*(e{j}*H_gamma*e{j}'*A*e{j}*d{j}')'*E{j}' ...
244 ) ...
245 - sigma_ij*E{i}*inv(RHO)*Hi*A*e{j}*H_gamma*e{j}'*E{i}';
246
247 cj = E{j}*inv(RHO)*nj*Hi*...
248 ( delta_b(i,j)*(e{j}*H_gamma*e{j}'*A*D1{i})'*E{i}' ...
249 );
250
251 if isempty(closures{i})
252 closures{i} = ci;
253 else
254 closures{i} = closures{i} + ci;
255 end
256
257 if isempty(closures{j})
258 closures{j} = cj;
259 else
260 closures{j} = closures{j} + cj;
261 end
262
263 pii = - E{i}*inv(RHO)*nj*Hi*...
264 ( (H_gamma*e{j}'*A*e{j}*d{j}')' + ...
265 delta(i,j)*(H_gamma*e{j}'*A*e{j}*d{j}')' ...
266 ) ...
267 + sigma_ij*E{i}*inv(RHO)*Hi*A*e{j}*H_gamma;
268
269 pji = - E{j}*inv(RHO)*nj*Hi*...
270 ( delta_b(i,j)*(H_gamma*e{j}'*A*D1{i})' );
271
272 % Dummies
273 pij = - 0*E{i}*e{j};
274 pjj = - 0*E{j}*e{j};
275
276 if isempty(penalties{i,i})
277 penalties{i,i} = pii;
278 else
279 penalties{i,i} = penalties{i,i} + pii;
280 end
281
282 if isempty(penalties{j,i})
283 penalties{j,i} = pji;
284 else
285 penalties{j,i} = penalties{j,i} + pji;
286 end
287
288 if isempty(penalties{i,j})
289 penalties{i,j} = pij;
290 else
291 penalties{i,j} = penalties{i,j} + pij;
292 end
293
294 if isempty(penalties{j,j})
295 penalties{j,j} = pjj;
296 else
297 penalties{j,j} = penalties{j,j} + pjj;
298 end
299 end
300 [rows, cols] = size(closures{1});
301 closure = sparse(rows, cols);
302 for i = 1:obj.dim
303 closure = closure + closures{i};
304 end
305 penalty = penalties;
231 306
232 % Free boundary condition 307 % Free boundary condition
233 case {'F','f','Free','free'} 308 case {'F','f','Free','free'}
234 closures = cell(obj.dim,1); 309 closures = cell(obj.dim,1);
235 penalties = cell(obj.dim,1); 310 penalties = cell(obj.dim,1);