Mercurial > repos > public > sbplib
diff +scheme/ViscoElastic2d.m @ 1313:a4c8bf2371f3 feature/poroelastic
Add viscoelastic fault interface
author | Martin Almquist <malmquist@stanford.edu> |
---|---|
date | Wed, 22 Jul 2020 15:35:25 -0700 |
parents | 6d64b57caf46 |
children | 58df4a35fe43 |
line wrap: on
line diff
--- a/+scheme/ViscoElastic2d.m Tue Jul 21 21:07:37 2020 -0700 +++ b/+scheme/ViscoElastic2d.m Wed Jul 22 15:35:25 2020 -0700 @@ -411,94 +411,85 @@ % u denotes the solution in the own domain % v denotes the solution in the neighbour domain - u = obj; v = neighbour_scheme; - % Operators, u side - e_u = u.getBoundaryOperatorForScalarField('e', boundary); - en_u = u.getBoundaryOperator('en', boundary); - tau_n_u = u.getBoundaryOperator('tau_n', boundary); - h11_u = u.getBorrowing(boundary); - n_u = u.getNormal(boundary); + dim = obj.dim; - C_u = u.C; - Ji_u = u.Ji; - s_u = spdiag(u.(['s_' boundary])); - m_tot_u = u.grid.N(); + n = u.getNormal(boundary); + H_gamma = u.getBoundaryQuadratureForScalarField(boundary); + e = u.getBoundaryOperatorForScalarField('e', boundary); - % Operators, v side - e_v = v.getBoundaryOperatorForScalarField('e', neighbour_boundary); - en_v = v.getBoundaryOperator('en', neighbour_boundary); - tau_n_v = v.getBoundaryOperator('tau_n', neighbour_boundary); - h11_v = v.getBorrowing(neighbour_boundary); - n_v = v.getNormal(neighbour_boundary); + ev = v.getBoundaryOperatorForScalarField('e', neighbour_boundary); - C_v = v.C; - Ji_v = v.Ji; - s_v = spdiag(v.(['s_' neighbour_boundary])); - m_tot_v = v.grid.N(); - - % Operators that are only required for own domain - Hi = u.E{1}*inv(u.H)*u.E{1}' + u.E{2}*inv(u.H)*u.E{2}'; - RHOi = u.E{1}*inv(u.RHO)*u.E{1}' + u.E{2}*inv(u.RHO)*u.E{2}'; + H = u.H; + RHO = u.RHO; + ETA = u.ETA; + C = u.C; + Eu = u.Eu; + eU = u.eU; + eGamma = u.eGamma; + Egamma = u.Egamma; - % Shared operators - H_gamma = u.getBoundaryQuadratureForScalarField(boundary); - dim = u.dim; + CV = v.C; + Ev = v.Eu; + eV = v.eU; + eGammaV = v.eGamma; + nV = v.getNormal(neighbour_boundary); - % Preallocate - [~, m_int] = size(H_gamma); - closure = sparse(dim*m_tot_u, dim*m_tot_u); - penalty = sparse(dim*m_tot_u, dim*m_tot_v); - - % Continuity of normal displacement, term 1: The symmetric term - Z_u = sparse(m_int, m_int); - Z_v = sparse(m_int, m_int); + % Reduce stiffness tensors to boundary size for i = 1:dim for j = 1:dim - for l = 1:dim - for k = 1:dim - Z_u = Z_u + n_u{i}*n_u{j}*e_u'*Ji_u*C_u{i,j,k,l}*e_u*n_u{k}*n_u{l}; - Z_v = Z_v + n_v{i}*n_v{j}*e_v'*Ji_v*C_v{i,j,k,l}*e_v*n_v{k}*n_v{l}; + for k = 1:dim + for l = 1:dim + C{i,j,k,l} = e'*C{i,j,k,l}*e; + CV{i,j,k,l} = ev'*CV{i,j,k,l}*ev; end end end end - Z = -tuning*dim*( 1/(4*h11_u)*s_u*Z_u + 1/(4*h11_v)*s_v*Z_v ); - closure = closure + en_u*H_gamma*Z*en_u'; - penalty = penalty + en_u*H_gamma*Z*en_v'; - - % Continuity of normal displacement, term 2: The symmetrizing term - closure = closure + 1/2*tau_n_u*H_gamma*en_u'; - penalty = penalty + 1/2*tau_n_u*H_gamma*en_v'; - - % Continuity of normal traction - closure = closure - 1/2*en_u*H_gamma*tau_n_u'; - penalty = penalty + 1/2*en_u*H_gamma*tau_n_v'; - - % Multiply all normal component terms by inverse of density x quadraure - closure = RHOi*Hi*closure; - penalty = RHOi*Hi*penalty; + % Get elastic closure and penalty + [closure, penalty] = obj.elasticObj.interface(boundary, v.elasticObj, neighbour_boundary, type); + closure = Eu*closure*Eu'; + penalty = Eu*penalty*Ev'; % ---- Tangential tractions are imposed just like traction BC ------ - closure = closure + obj.boundary_condition(boundary, {'t', 't'}); - - end + % We only need the viscous part + closure_tangential = obj.boundary_condition(boundary, {'t', 't'}); + closure = closure + closure_tangential*Egamma*Egamma'; - % Returns h11 for the boundary specified by the string boundary. - % op -- string - function h11 = getBorrowing(obj, boundary) - assertIsMember(boundary, {'w', 'e', 's', 'n'}) + % ------ Coupling of normal component ----------- + % Add viscous part of traction coupling + for i = 1:dim + for j = 1:dim + for k = 1:dim + for l = 1:dim + for m = 1:dim + closure = closure + 1/2*eU{m}*( (RHO*H)\(e*n{m}*H_gamma*n{j}*n{i}*C{i,j,k,l}*e'*eGamma{k,l}') ); + penalty = penalty - 1/2*eU{m}*( (RHO*H)\(e*n{m}*H_gamma*nV{j}*nV{i}*CV{i,j,k,l}*ev'*eGammaV{k,l}') ); + end + end + end + end + end - switch boundary - case {'w','e'} - h11 = obj.refObj.h11{1}; - case {'s', 'n'} - h11 = obj.refObj.h11{2}; + % Add penalty to strain rate eq + for i = 1:dim + for j = 1:dim + for k = 1:dim + for l = 1:dim + for m = 1:dim + closure = closure - 1/2*eGamma{i,j}*( (H*ETA)\(e*n{l}*n{k}*C{i,j,k,l}*H_gamma*n{m}*e'*eU{m}') ); + penalty = penalty - 1/2*eGamma{i,j}*( (H*ETA)\(e*n{l}*n{k}*C{i,j,k,l}*H_gamma*nV{m}*ev'*eV{m}') ); + end + end + end + end end + %------------------------------------------------- + end % Returns the outward unit normal vector for the boundary specified by the string boundary. @@ -523,7 +514,7 @@ assertIsMember(boundary, {'w', 'e', 's', 'n'}) assertIsMember(op, {'e', 'e1', 'e2', 'tau', 'tau1', 'tau2', 'en', 'et', 'tau_n', 'tau_t'}) - o = obj.([op, '_', boundary]); + o = obj.elasticObj.([op, '_', boundary]); end