Mercurial > repos > public > sbplib
diff +scheme/Elastic2dVariable.m @ 1060:e40899094f20 feature/poroelastic
Elastic2dVariable: Clean up alpha in getBoundaryOperator. Add alpha1 and alpha2 as boundary operators.
author | Martin Almquist <malmquist@stanford.edu> |
---|---|
date | Sat, 26 Jan 2019 16:56:35 -0800 |
parents | d8ab528f10f6 |
children | 07d0caf915e4 |
line wrap: on
line diff
--- a/+scheme/Elastic2dVariable.m Sat Jan 26 15:38:58 2019 -0800 +++ b/+scheme/Elastic2dVariable.m Sat Jan 26 16:56:35 2019 -0800 @@ -549,27 +549,45 @@ % op -- string function o = getBoundaryOperator(obj, op, boundary) assertIsMember(boundary, {'w', 'e', 's', 'n'}) - assertIsMember(op, {'e', 'e1', 'e2', 'tau', 'tau1', 'tau2', 'alpha'}) + assertIsMember(op, {'e', 'e1', 'e2', 'tau', 'tau1', 'tau2', 'alpha', 'alpha1', 'alpha2'}) switch op case {'e', 'e1', 'e2', 'tau', 'tau1', 'tau2'} o = obj.([op, '_', boundary]); + % Yields vector-valued penalty strength given displacement BC on all components case 'alpha' - % alpha = alpha(i,j) is the penalty strength for displacement BC. - e = obj.getBoundaryOperatorForScalarField('e', boundary); - e_tot = obj.getBoundaryOperator('e', boundary); - alpha = obj.getBoundaryOperatorForScalarField('alpha', boundary); + e = obj.getBoundaryOperator('e', boundary); + e_scalar = obj.getBoundaryOperatorForScalarField('e', boundary); + alpha_scalar = obj.getBoundaryOperatorForScalarField('alpha', boundary); E = obj.E; - [m, n] = size(alpha{1,1}); - alpha_tot = sparse(m*obj.dim, n*obj.dim); + [m, n] = size(alpha_scalar{1,1}); + alpha = sparse(m*obj.dim, n*obj.dim); for i = 1:obj.dim for l = 1:obj.dim - alpha_tot = alpha_tot + (e_tot'*E{i}*e*alpha{i,l}'*E{l}')'; + alpha = alpha + (e'*E{i}*e_scalar*alpha_scalar{i,l}'*E{l}')'; end end - o = alpha_tot; + o = alpha; + + % Yields penalty strength for component 1 given displacement BC on all components + case 'alpha1' + alpha = obj.getBoundaryOperator('alpha', boundary); + e = obj.getBoundaryOperator('e', boundary); + e1 = obj.getBoundaryOperator('e1', boundary); + + alpha1 = (e1'*e*alpha')'; + o = alpha1; + + % Yields penalty strength for component 2 given displacement BC on all components + case 'alpha2' + alpha = obj.getBoundaryOperator('alpha', boundary); + e = obj.getBoundaryOperator('e', boundary); + e2 = obj.getBoundaryOperator('e2', boundary); + + alpha2 = (e2'*e*alpha')'; + o = alpha2; end end @@ -586,7 +604,9 @@ o = obj.(['e_scalar', '_', boundary]); case 'alpha' - % alpha = alpha(i,j) is the penalty strength for displacement BC. + + % alpha{i,j} is the penalty strength on component i due to + % displacement BC for component j. e = obj.getBoundaryOperatorForScalarField('e', boundary); LAMBDA = obj.LAMBDA; @@ -610,23 +630,24 @@ d = @kroneckerDelta; % Kronecker delta db = @(i,j) 1-d(i,j); % Logical not of Kronecker delta - alpha = cell(obj.dim, obj.dim); alpha_func = @(i,j) d(i,j)* a_lambda*LAMBDA ... + d(i,j)* a_mu_i*MU ... + db(i,j)*a_mu_ij*MU; + + alpha = cell(obj.dim, obj.dim); for i = 1:obj.dim for j = 1:obj.dim alpha{i,j} = d(i,j)*alpha_func(i,k)*e; end end - o = alpha; end end % Returns the boundary operator T_ij (cell format) for the boundary specified by the string boundary. + % Formula: tau_i = T_ij u_j % op -- string function T = getBoundaryTractionOperator(obj, boundary) assertIsMember(boundary, {'w', 'e', 's', 'n'})