# APSG tutorial - Part 2

```
[1]:
```

```
from apsg import *
```

## Matrix like classes and tensors

**APSG** provides matrix-like classes to work with tensor quantities used commonly in structural geology analysis. It includes `DefGrad3`

and `VelGrad3`

for deformation and velocity gradient, `Stress3`

for stress tensor, `Ellipsoid`

for quadratic forms and `Ortensor3`

for orientation tensor. All these classes support common matrix mathematical operations and provide basic methods and properties.

All matrix-like objects could be created either by passing nested list or tuple or providing individual components to class method `from_comp`

```
[2]:
```

```
F = defgrad([[2, 0, 1], [0, 1, 0], [0, 0, 0.5]])
F
```

```
[2]:
```

```
DeformationGradient3
[[2. 0. 1. ]
[0. 1. 0. ]
[0. 0. 0.5]]
```

```
[3]:
```

```
F = defgrad.from_comp(xx=2, zz=0.5, xz=1)
F
```

```
[3]:
```

```
DeformationGradient3
[[2. 0. 1. ]
[0. 1. 0. ]
[0. 0. 0.5]]
```

For multiplifications of matrix or vectors we have to use matmul `@`

operator

```
[4]:
```

```
v = vec('z') # unit-length vector in direction af axis z
u = F @ v
u
```

```
[4]:
```

```
Vector3(1, 0, 0.5)
```

`I`

property returns inverse matrix

```
[5]:
```

```
F.I @ u
```

```
[5]:
```

```
Vector3(0, 0, 1)
```

To transpose matrix, we can use `T`

property and for multiplification we have to use `@`

operator

```
[6]:
```

```
F.T @ F
```

```
[6]:
```

```
DeformationGradient3
[[4. 0. 2. ]
[0. 1. 0. ]
[2. 0. 1.25]]
```

```
[7]:
```

```
v @ F.T @ F @ v
```

```
[7]:
```

```
1.25
```

Eigenvalues and eigenvectors could be obtained by methods `eigenvalues`

and `eigenvectors`

. Individual eigenvalues and eigen vectors could be accessed by properties `E1`

, `E2`

, `E3`

and `V1`

, `V2`

, `V3`

### Deformation gradient and rotations

Deformation gradient `DeformationGradient3`

could describe distorsion, dilation and rigid-body rotation. All **APSG** features provides `transform`

method which transform then using provided deformation gradient.

The rigid-body rotation could be either extracted from deformation gradient using `R`

method:

```
[8]:
```

```
R = F.R
R
```

```
[8]:
```

```
DeformationGradient3
[[ 0.928 0. 0.371]
[ 0. 1. 0. ]
[-0.371 0. 0.928]]
```

or could be created of one of the class methods like `from_axisangle`

, defining axis of rotation and angle

```
[9]:
```

```
R = defgrad.from_axisangle(lin(120, 50), 60)
R
```

```
[9]:
```

```
DeformationGradient3
[[ 0.552 -0.753 0.359]
[ 0.574 0.655 0.492]
[-0.605 -0.065 0.793]]
```

`from_two_vectors`

, where axis of rotation is perpendicular to both vectors and angle is angle of vectors

```
[10]:
```

```
R = defgrad.from_two_vectors(lin(120, 50), lin(270, 80))
R
```

```
[10]:
```

```
DeformationGradient3
[[ 0.938 0.074 0.339]
[ 0.186 0.718 -0.671]
[-0.294 0.692 0.66 ]]
```

```
[11]:
```

```
lin(120, 50).transform(R)
```

```
[11]:
```

```
L:270/80
```

or by `from_vectors_axis`

, where `axis`

do not need to by perpendicular to vectors. Note that rotation axis needs to be adjusted to provide correct rotation of vector.

```
[12]:
```

```
R = defgrad.from_vectors_axis(lin(45,30), lin(135, 30), lin(90, 70))
R
```

```
[12]:
```

```
DeformationGradient3
[[-0.393 -0.864 0.315]
[ 0.864 -0.23 0.448]
[-0.315 0.448 0.837]]
```

```
[13]:
```

```
lin(45,30).transform(R)
```

```
[13]:
```

```
L:135/30
```

```
[14]:
```

```
a, ang = R.axisangle()
print(lin(a), ang)
```

```
L:90/70 113.1157146919613
```

`from_two_pairs`

method, to describe rotation between two coordinate systems. Note that pair define X axis as lineation vector and Z axis as foliation vector.

```
[15]:
```

```
p1 = pair(150, 60, 90, 40)
p2 = pair(45, 30, 10, 25)
R = defgrad.from_two_pairs(p1, p2)
R
```

```
[15]:
```

```
DeformationGradient3
[[-0.071 0.97 0.234]
[-0.874 -0.174 0.453]
[ 0.48 -0.173 0.86 ]]
```

```
[16]:
```

```
p1.transform(R)
```

```
[16]:
```

```
P:45/30-10/25
```

#### Ellipsoid

In deformation analysis, the quadratic forms are represented by `Ellipsoid`

class. It could be used to represents either ellipsoid objects or finite strain ellipsoid.

It provides additional methods and properties including `lambda1`

, `lambda2`

and `lambda3`

for square-root of eigenvalues, Woodcock’s `shape`

and `strength`

, `k`

, `K`

, `d`

and `D`

for Flinn’s and Ramsay symmetries and intensities, `lode`

for Lode’s parameter etc. For more check documentation. Eigenvectors could be also represented by linear or planar features using properties `eigenlins`

and `eigenfols`

.

We can create `Ellipsoid`

object similarly to `Matrix3`

(note that only components of upper triangular part are available in `from_comp`

method due to matrix symmetry), or you can use aditional class methods `from_defgrad`

and `from_stretch`

.

```
[17]:
```

```
B = ellipsoid.from_defgrad(F) # Finger deformation tensor
B
```

```
[17]:
```

```
Ellipsoid
[[5. 0. 0.5 ]
[0. 1. 0. ]
[0.5 0. 0.25]]
(S1:2.25, S2:1, S3:0.445)
```

In above example, the Finger deformation tensor `B`

represents finite strain ellipsoid reulting from deformation described by deformation gradient `F`

. We can explore several parameters:

```
[18]:
```

```
print(f'Principal stretches: Sx={B.S1}, Sy={B.S2}, Sz={B.S3}')
print(f'Principal strain ratios: Rxy={B.Rxy}, Ryz={B.Ryz}')
print(f"Flinn's finite strain parameters: d={B.d}, k={B.k}")
print(f"Ramsay's finite strain parameters: d={B.D}, k={B.K}")
print(f"Woodcock's parameters: strength={B.strength}, shape={B.shape}")
print(f"Watterson's strain intesity: s{B.r}")
print(f"Nadai's natural octahedral unit shear: {B.goct}")
print(f"Nadai's natural octahedral unit strain: {B.eoct}")
print(f"Lode's parameter: {B.lode}")
```

```
Principal stretches: Sx=2.2476790206496235, Sy=1.0, Sz=0.44490338291762865
Principal strain ratios: Rxy=2.2476790206496235, Ryz=2.2476790206496235
Flinn's finite strain parameters: d=1.7644845924910786, k=1.0
Ramsay's finite strain parameters: d=1.3118699860194973, k=1.0
Woodcock's parameters: strength=1.6197962748565002, shape=1.0
Watterson's strain intesity: s3.495358041299247
Nadai's natural octahedral unit shear: 1.3225581202197996
Nadai's natural octahedral unit strain: 1.14536893009174
Lode's parameter: 0.0
```

```
[19]:
```

```
C = ellipsoid.from_defgrad(F, 'right') # Green's deformation tensor
C
```

```
[19]:
```

```
Ellipsoid
[[4. 0. 2. ]
[0. 1. 0. ]
[2. 0. 1.25]]
(S1:2.25, S2:1, S3:0.445)
```

```
[20]:
```

```
v @ C @ v
```

```
[20]:
```

```
1.25
```

#### Orientation tensor

`OrientationTensor3`

class represents orientation tensor of set of vectors, linear or planar features. In adition to `Ellipsoid`

methods and properties, it provides properties to describe orientation distribution, e.g. Vollmer’s `P`

, `G`

, `R`

and `B`

indexes, `Intensity`

for Lisle intensity index and `MAD`

for approximate angular deviation.

```
[21]:
```

```
l = linset.random_fisher(position=lin(120,40))
ot = l.ortensor()
# or
ot = ortensor.from_features(l)
ot
```

```
[21]:
```

```
OrientationTensor3
[[ 0.169 -0.226 -0.218]
[-0.226 0.423 0.37 ]
[-0.218 0.37 0.407]]
(S1:0.958, S2:0.214, S3:0.193)
```

```
[22]:
```

```
ot.eigenvalues()
```

```
[22]:
```

```
array([0.91691349, 0.04592418, 0.03716233])
```

```
[23]:
```

```
ot.eigenvectors()
```

```
[23]:
```

```
(Vector3(-0.387, 0.66, 0.644),
Vector3(0.194, -0.625, 0.756),
Vector3(0.901, 0.418, 0.114))
```

```
[24]:
```

```
ot.kind
```

```
[24]:
```

```
'L'
```

The instances of `Stress3`

, `Ellipsoid`

and `OrientationTensor3`

also provides `eigenlins`

and `eigenfols`

properties to represent principal axes and planes

```
[25]:
```

```
ot.eigenlins
```

```
[25]:
```

```
(L:120/40, L:287/49, L:25/7)
```

```
[26]:
```

```
ot.eigenfols
```

```
[26]:
```

```
(S:300/50, S:107/41, S:205/83)
```

```
[27]:
```

```
ot.strength, ot.shape
```

```
[27]:
```

```
(1.6028587004277868, 14.14302389342446)
```

```
[28]:
```

```
ot.k, ot.d
```

```
[28]:
```

```
(31.063343962312064, 3.4701087058410436)
```

```
[29]:
```

```
ot.K, ot.D
```

```
[29]:
```

```
(14.14302389342446, 2.252244853321263)
```

```
[30]:
```

```
ot.P, ot.G, ot.R
```

```
[30]:
```

```
(0.8709893116100177, 0.017523685957085658, 0.11148700243289719)
```

```
[31]:
```

```
ot.MAD
```

```
[31]:
```

```
16.75305404050666
```

```
[ ]:
```

```
```