comparison +scheme/Elastic2dVariableAnisotropic.m @ 1206:6b203030fb37 feature/poroelastic

Fix performance (full matrices) issues in ElasticVariableAnisotropic
author Martin Almquist <malmquist@stanford.edu>
date Sun, 15 Sep 2019 14:39:42 -0700
parents 687515778437
children 7f427275bc9c
comparison
equal deleted inserted replaced
1205:3258dca12af8 1206:6b203030fb37
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
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 i = 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{i,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
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 j == k
248 db(j,k)*D1{j}*C_mat{i,j,k,l}*D1{k}*E{l}' ... 247 D = D + E{i}*D2{i,k,l}*E{l}';
249 ); 248 else
249 D = D + E{i}*D1{j}*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 %
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;