Skip to content

Parametrizations and conversions

Which five numbers describe a transversely isotropic material, how to move between the conventions, and how to go in and out of the Kelvin–Mandel matrix. The matrices themselves are on TI parametrizations.

The three TI conventions

ConstructorExtractorParametersBuilds
tens_TIarg_TIstiffness or compliance
tens_TI_engarg_TI_engcompliance
tens_TI_Hoenigarg_TI_Hoenigcompliance

All three take the symmetry axis as their last argument and return a TensTI{4,T,5}.

julia
using TensND, LinearAlgebra

n = [0.0, 0.0, 1.0]
𝕊 = tens_TI_eng(9.0, 140.0, 0.40, 0.30, 4.6, n)   # a carbon/epoxy ply, GPa
= inv(𝕊)
arg_TI_eng(𝕊)
(9.0, 140.0, 0.4000000000000001, 0.3, 4.6)

Converting between them

Conversion is a round trip through the tensor: build with one constructor, read with another extractor. Because all three produce the same object, the conversion is exact rather than fitted.

julia
arg_TI(𝕊)          # the same compliance, in component form
(0.1111111111111111, -0.04444444444444445, -0.002142857142857143, 0.007142857142857143, 0.05434782608695653)
julia
arg_TI_Hoenig(𝕊)   # and in dimensionless Hoenig ratios
(9.0, 0.4000000000000001, 0.019285714285714288, 15.555555555555557, 1.431111111111111)

is the axial-to-transverse modulus ratio and the shear anisotropy; an isotropic material sits at    with  .

The engineering and Hoenig forms build a compliance

tens_TI_eng and tens_TI_Hoenig return , not . To get the stiffness, invert — which is exact and stays in the class:

julia
= inv(tens_TI_eng(E₁, E₃, ν₁₂, ν₃₁, G₃₁, n))

Applying arg_TI_eng to a stiffness returns numbers that are not the engineering constants of that material.

Walpole coefficients

get_ℓ reads the six classical coefficients, get_ℓ8 all eight. Stiffness and compliance are inverse in the synthetic algebra, so their   blocks are inverse matrices and their reciprocal:

julia
ℓC, ℓS = get_ℓ(ℂ), get_ℓ(𝕊)
LC = [ℓC[1] ℓC[3]; ℓC[4] ℓC[2]]
LS = [ℓS[1] ℓS[3]; ℓS[4] ℓS[2]]
round.(LC * LS, digits = 12)
2×2 Matrix{Float64}:
 1.0  0.0
 0.0  1.0
julia
round(ℓC[5] * ℓS[5], digits = 12), round(ℓC[6] * ℓS[6], digits = 12)
(1.0, 1.0)

Kelvin–Mandel round trips

FunctionDirection
KMtensor → matrix, canonical frame
KM_materialTensOrtho → matrix, material frame
inv_KMmatrix → tensor
julia
KM(ℂ)
6×6 Matrix{Float64}:
 10.8618    4.4332     4.58849  0.0  0.0  0.0
  4.4332   10.8618     4.58849  0.0  0.0  0.0
  4.58849   4.58849  142.753    0.0  0.0  0.0
  0.0       0.0        0.0      9.2  0.0  0.0
  0.0       0.0        0.0      0.0  9.2  0.0
  0.0       0.0        0.0      0.0  0.0  6.42857
julia
norm(get_array(inv_KM(KM(ℂ))) - get_array(ℂ))
0.0

Parameters from a matrix, and back

Four exported aliases give direct access to the projection kernels, for when a   matrix is the natural input — coming from a file, an experiment or another library:

FunctionDoes
ti_params_from_KM(C) 
KM_from_ti_params(ℓ…)the five coefficients →  
ortho_params_from_KM(C)  → the nine
KM_from_ortho_params(C…)the nine constants →  

They assume the matrix is expressed in the frame where the symmetry axis is (respectively the material frame), and they project: given a matrix that is not exactly of the class, they return the closest one.

julia
ti_params_from_KM(KM(ℂ))
(142.75309541150764, 15.294974508375821, 6.489108115768755, 6.42857142857143, 9.200000000000001)
julia
norm(KM_from_ti_params(ti_params_from_KM(KM(ℂ))...) - KM(ℂ))
1.9860273225978185e-15

For a matrix in an arbitrary frame, use proj_tens instead — it handles the rotation. See Projection.