# doubleContraction

Below is a demonstration of the features of the doubleContraction function

## Contents

```clear; close all; clc;
```

## Syntax

C=doubleContraction(A,B,subContract);

## Description

This function performs a double contraction of two tensors A and B to produce the output tensor C. The tensors are either both 3x3 second order tensors or A is a 4th order 3x3x3x3 tensor. The optional 3rd input subContract defines the indices to contract over for 4th order tensors e.g. subContract=[1 2] would contract over the first 2 indices.

## Double contraction of a 2nd-order and a 2nd-order tensor

Creating an example tensor. Here a tensor A with all zeros except for the 3,3 component is created. Next a tensor B which, through double contraction, can "pick out" this scalar value is created. Finally the double contraction is performed illustrating this process.

```%Create example tensor A
A=zeros(3,3); A(3,3)=pi; %Zeros with Azz=A33=pi
R=euler2DCM([0.25*pi 0.25*pi 0]); %Rotation matrix
A=R*A*R' %Rotated version of A

% Create 'structure' tensor example B
b=[0 0 1]*R.'; %Rotated Z vector
B=b.'*b %Rotated "structure" tensor for vector b
```
```A =

1.5708   -1.1107    1.1107
-1.1107    0.7854   -0.7854
1.1107   -0.7854    0.7854

B =

0.5000   -0.3536    0.3536
-0.3536    0.2500   -0.2500
0.3536   -0.2500    0.2500

```

Double contraction using doubleContraction

```s=doubleContraction(A,B)
```
```s =

3.1416

```

## Double contraction of a 4th-order and a 2nd-order tensor

Example for Hooke's law of linear elasticity

```%Creating the 4th order linear elastic stiffness tensor
I=eye(3,3); %The 2nd order identity tensor
II1=dyadicProduct(I,I,1); %4th order base tensor 1
II3=dyadicProduct(I,I,3); %4th order base tensor 3

%Parameters for Hooke's law
mu=1; %The shear modulus
lambda=5; %The lambda lame parameter

%Compose stiffness tensor
C=lambda.*II1+2.*mu.*II3;

%Create strain tensor
E=rand(3,3); E=E*E'
```
```E =

1.0793    0.8967    1.4848
0.8967    0.8533    1.4394
1.4848    1.4394    2.4337

```

Double contraction using doubleContraction

```subContract=[3 4];
S=doubleContraction(C,E,subContract)
```
```S =

23.9903    1.7933    2.9697
1.7933   23.5381    2.8788
2.9697    2.8788   26.6990

```

## Using symbolic variables

Example for Hooke's law of linear elasticity

```%Creating the 4th order linear elastic stiffness tensor
I=eye(3,3); %The 2nd order identity tensor
II1=dyadicProduct(I,I,1); %4th order base tensor 1
II3=dyadicProduct(I,I,3); %4th order base tensor 3

%Parameters for Hooke's law
try
syms mu lambda
catch
mu=1; %The shear modulus
lambda=5; %The lambda lame parameter
end
%Compose stiffness tensor
C=lambda.*II1+2.*mu.*II3;

%Display Voigt mapped version
c=voigtMap(C)

%Create strain tensor
syms E1_1 E2_2 E3_3 E1_2 E1_3 E2_3;
E=[E1_1 E1_2 E1_3;...
E1_2 E2_2 E2_3;...
E1_3 E2_3 E3_3]
```
```
c =

[ lambda + 2*mu,        lambda,        lambda,  0,  0,  0]
[        lambda, lambda + 2*mu,        lambda,  0,  0,  0]
[        lambda,        lambda, lambda + 2*mu,  0,  0,  0]
[             0,             0,             0, mu,  0,  0]
[             0,             0,             0,  0, mu,  0]
[             0,             0,             0,  0,  0, mu]

E =

[ E1_1, E1_2, E1_3]
[ E1_2, E2_2, E2_3]
[ E1_3, E2_3, E3_3]

```

Double contraction using doubleContraction

```subContract=[3 4];
S=doubleContraction(C,E,subContract)
```
```
S =

[ E2_2*lambda + E3_3*lambda + E1_1*(lambda + 2*mu),                                        2*E1_2*mu,                                        2*E1_3*mu]
[                                        2*E1_2*mu, E1_1*lambda + E3_3*lambda + E2_2*(lambda + 2*mu),                                        2*E2_3*mu]
[                                        2*E1_3*mu,                                        2*E2_3*mu, E1_1*lambda + E2_2*lambda + E3_3*(lambda + 2*mu)]

``` GIBBON www.gibboncode.org

Kevin Mattheus Moerman, gibbon.toolbox@gmail.com

GIBBON footer text

GIBBON: The Geometry and Image-based Bioengineering add-On. A toolbox for image segmentation, image-based modeling, meshing, and finite element analysis.

Copyright (C) 2019 Kevin Mattheus Moerman

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.