Mercurial > repos > public > sbplib
comparison +scheme/Elastic2dVariableAnisotropic.m @ 1207:05a01f77d0e3 feature/poroelastic
Swap indices and fix bug in ElasticVariableAnisotropic
author | Martin Almquist <malmquist@stanford.edu> |
---|---|
date | Fri, 20 Sep 2019 14:57:02 -0700 |
parents | 687515778437 |
children | 7f427275bc9c |
comparison
equal
deleted
inserted
replaced
1205:3258dca12af8 | 1207:05a01f77d0e3 |
---|---|
138 d1_0{i} = ops{i}.d1_l; | 138 d1_0{i} = ops{i}.d1_l; |
139 d1_m{i} = ops{i}.d1_r; | 139 d1_m{i} = ops{i}.d1_r; |
140 end | 140 end |
141 | 141 |
142 %====== Assemble full operators ======== | 142 %====== Assemble full operators ======== |
143 I_dim = speye(dim, dim); | |
143 RHO = spdiag(rho); | 144 RHO = spdiag(rho); |
144 obj.RHO = RHO; | 145 obj.RHO = RHO; |
145 obj.RHOi = inv(RHO); | 146 obj.RHOi = inv(RHO); |
147 obj.RHOi_kron = kron(obj.RHOi, I_dim); | |
146 | 148 |
147 obj.D1 = cell(dim,1); | 149 obj.D1 = cell(dim,1); |
148 obj.D2 = cell(dim,dim,dim); | 150 obj.D2 = cell(dim,dim,dim); |
149 | 151 |
150 % D1 | 152 % D1 |
162 e_scalar_w = e_l{1}; | 164 e_scalar_w = e_l{1}; |
163 e_scalar_e = e_r{1}; | 165 e_scalar_e = e_r{1}; |
164 e_scalar_s = e_l{2}; | 166 e_scalar_s = e_l{2}; |
165 e_scalar_n = e_r{2}; | 167 e_scalar_n = e_r{2}; |
166 | 168 |
167 I_dim = speye(dim, dim); | |
168 e_w = kron(e_scalar_w, I_dim); | 169 e_w = kron(e_scalar_w, I_dim); |
169 e_e = kron(e_scalar_e, I_dim); | 170 e_e = kron(e_scalar_e, I_dim); |
170 e_s = kron(e_scalar_s, I_dim); | 171 e_s = kron(e_scalar_s, I_dim); |
171 e_n = kron(e_scalar_n, I_dim); | 172 e_n = kron(e_scalar_n, I_dim); |
172 | 173 |
190 e2_s = (e_scalar_s'*E{2}')'; | 191 e2_s = (e_scalar_s'*E{2}')'; |
191 e2_n = (e_scalar_n'*E{2}')'; | 192 e2_n = (e_scalar_n'*E{2}')'; |
192 | 193 |
193 | 194 |
194 % D2 | 195 % D2 |
195 for i = 1:dim | 196 for j = 1:dim |
196 for k = 2:dim | 197 for k = 1:dim |
197 for l = 2:dim | 198 for l = 1:dim |
198 obj.D2{i,k,l} = sparse(m_tot); | 199 obj.D2{j,k,l} = sparse(m_tot,m_tot); |
199 end | 200 end |
200 end | 201 end |
201 end | 202 end |
202 ind = grid.funcToMatrix(g, 1:m_tot); | 203 ind = grid.funcToMatrix(g, 1:m_tot); |
203 | 204 |
204 k = 1; | 205 k = 1; |
205 for r = 1:m(2) | 206 for r = 1:m(2) |
206 p = ind(:,r); | 207 p = ind(:,r); |
207 for i = 1:dim | 208 for j = 1:dim |
208 for l = 1:dim | 209 for l = 1:dim |
209 coeff = C{i,k,k,l}; | 210 coeff = C{k,j,k,l}; |
210 D_kk = D2{1}(coeff(p)); | 211 D_kk = D2{1}(coeff(p)); |
211 obj.D2{i,k,l}(p,p) = D_kk; | 212 obj.D2{j,k,l}(p,p) = D_kk; |
212 end | 213 end |
213 end | 214 end |
214 end | 215 end |
215 | 216 |
216 k = 2; | 217 k = 2; |
217 for r = 1:m(1) | 218 for r = 1:m(1) |
218 p = ind(r,:); | 219 p = ind(r,:); |
219 for i = 1:dim | 220 for j = 1:dim |
220 for l = 1:dim | 221 for l = 1:dim |
221 coeff = C{i,k,k,l}; | 222 coeff = C{k,j,k,l}; |
222 D_kk = D2{2}(coeff(p)); | 223 D_kk = D2{2}(coeff(p)); |
223 obj.D2{i,k,l}(p,p) = D_kk; | 224 obj.D2{j,k,l}(p,p) = D_kk; |
224 end | 225 end |
225 end | 226 end |
226 end | 227 end |
227 | 228 |
228 % Quadratures | 229 % Quadratures |
236 | 237 |
237 % Differentiation matrix D (without SAT) | 238 % Differentiation matrix D (without SAT) |
238 D2 = obj.D2; | 239 D2 = obj.D2; |
239 D1 = obj.D1; | 240 D1 = obj.D1; |
240 D = sparse(dim*m_tot,dim*m_tot); | 241 D = sparse(dim*m_tot,dim*m_tot); |
241 d = @kroneckerDelta; % Kronecker delta | |
242 db = @(i,j) 1-d(i,j); % Logical not of Kronecker delta | |
243 for i = 1:dim | 242 for i = 1:dim |
244 for j = 1:dim | 243 for j = 1:dim |
245 for k = 1:dim | 244 for k = 1:dim |
246 for l = 1:dim | 245 for l = 1:dim |
247 D = D + E{i}*inv(RHO)*( d(j,k)*D2{i,k,l}*E{l}' +... | 246 if i == k |
248 db(j,k)*D1{j}*C_mat{i,j,k,l}*D1{k}*E{l}' ... | 247 D = D + E{j}*D2{j,k,l}*E{l}'; |
249 ); | 248 else |
249 D = D + E{j}*D1{i}*C_mat{i,j,k,l}*D1{k}*E{l}'; | |
250 end | |
250 end | 251 end |
251 end | 252 end |
252 end | 253 end |
253 end | 254 end |
255 D = obj.RHOi_kron*D; | |
254 obj.D = D; | 256 obj.D = D; |
255 %=========================================%' | 257 %=========================================%' |
256 | 258 |
257 % Numerical traction operators for BC. | 259 % Numerical traction operators for BC. |
258 % | 260 % |
286 T_r{j}{i,l} = sparse(m_tot, n_r); | 288 T_r{j}{i,l} = sparse(m_tot, n_r); |
287 | 289 |
288 % Derivative direction k | 290 % Derivative direction k |
289 for k = 1:dim | 291 for k = 1:dim |
290 T_l{j}{i,l} = T_l{j}{i,l} ... | 292 T_l{j}{i,l} = T_l{j}{i,l} ... |
291 - (e_l{j}'*C_mat{i,j,k,l}*D1{k})'; | 293 - (e_l{j}'*C_mat{j,i,k,l}*D1{k})'; |
292 T_r{j}{i,l} = T_r{j}{i,l} ... | 294 T_r{j}{i,l} = T_r{j}{i,l} ... |
293 + (e_r{j}'*C_mat{i,j,k,l}*D1{k})'; | 295 + (e_r{j}'*C_mat{j,i,k,l}*D1{k})'; |
294 end | 296 end |
295 tau_l{j}{i} = tau_l{j}{i} + (T_l{j}{i,l}'*E{l}')'; | 297 tau_l{j}{i} = tau_l{j}{i} + (T_l{j}{i,l}'*E{l}')'; |
296 tau_r{j}{i} = tau_r{j}{i} + (T_r{j}{i,l}'*E{l}')'; | 298 tau_r{j}{i} = tau_r{j}{i} + (T_r{j}{i,l}'*E{l}')'; |
297 end | 299 end |
298 end | 300 end |
342 obj.tau_e = (e_e'*e1_e*obj.tau1_e')' + (e_e'*e2_e*obj.tau2_e')'; | 344 obj.tau_e = (e_e'*e1_e*obj.tau1_e')' + (e_e'*e2_e*obj.tau2_e')'; |
343 obj.tau_s = (e_s'*e1_s*obj.tau1_s')' + (e_s'*e2_s*obj.tau2_s')'; | 345 obj.tau_s = (e_s'*e1_s*obj.tau1_s')' + (e_s'*e2_s*obj.tau2_s')'; |
344 obj.tau_n = (e_n'*e1_n*obj.tau1_n')' + (e_n'*e2_n*obj.tau2_n')'; | 346 obj.tau_n = (e_n'*e1_n*obj.tau1_n')' + (e_n'*e2_n*obj.tau2_n')'; |
345 | 347 |
346 % Kroneckered norms and coefficients | 348 % Kroneckered norms and coefficients |
347 obj.RHOi_kron = kron(obj.RHOi, I_dim); | |
348 obj.Hi_kron = kron(obj.Hi, I_dim); | 349 obj.Hi_kron = kron(obj.Hi, I_dim); |
349 | 350 |
350 % Misc. | 351 % Misc. |
351 obj.m = m; | 352 obj.m = m; |
352 obj.h = h; | 353 obj.h = h; |
433 % (Otherwise it's not symmetric.) | 434 % (Otherwise it's not symmetric.) |
434 for i = dComps | 435 for i = dComps |
435 Z = sparse(m_tot, m_tot); | 436 Z = sparse(m_tot, m_tot); |
436 for l = 1:dim | 437 for l = 1:dim |
437 for k = 1:dim | 438 for k = 1:dim |
438 Z = Z + nu(l)*C{i,l,k,j}*nu(k); | 439 Z = Z + nu(l)*C{l,i,k,j}*nu(k); |
439 end | 440 end |
440 end | 441 end |
441 Z = -tuning*dim/h11*Z; | 442 Z = -tuning*dim/h11*Z; |
442 X = Z; | 443 X = Z; |
443 closure = closure + E{i}*RHOi*Hi*X'*e*H_gamma*(e'*E{j}' ); | 444 closure = closure + E{i}*RHOi*Hi*X'*e*H_gamma*(e'*E{j}' ); |
534 Y = 1/2*T_u{j,i}'; | 535 Y = 1/2*T_u{j,i}'; |
535 Z_u = sparse(m_int, m_int); | 536 Z_u = sparse(m_int, m_int); |
536 Z_v = sparse(m_int, m_int); | 537 Z_v = sparse(m_int, m_int); |
537 for l = 1:dim | 538 for l = 1:dim |
538 for k = 1:dim | 539 for k = 1:dim |
539 Z_u = Z_u + e_u'*nu_u(l)*C_u{i,l,k,j}*nu_u(k)*e_u; | 540 Z_u = Z_u + e_u'*nu_u(l)*C_u{l,i,k,j}*nu_u(k)*e_u; |
540 Z_v = Z_v + e_v'*nu_v(l)*C_v{i,l,k,j}*nu_v(k)*e_v; | 541 Z_v = Z_v + e_v'*nu_v(l)*C_v{l,i,k,j}*nu_v(k)*e_v; |
541 end | 542 end |
542 end | 543 end |
543 Z = -tuning*dim*( 1/(4*h11_u)*Z_u + 1/(4*h11_v)*Z_v ); | 544 Z = -tuning*dim*( 1/(4*h11_u)*Z_u + 1/(4*h11_v)*Z_v ); |
544 X = Y + Z*e_u'; | 545 X = Y + Z*e_u'; |
545 closure = closure + E_u{i}*X'*H_gamma*e_u'*E_u{j}'; | 546 closure = closure + E_u{i}*X'*H_gamma*e_u'*E_u{j}'; |