2.   The Strain Tensor

Initial rules and definitions (Automatically Initialized)

Needs["TensorCalculus4`Tensorial`"]

Needs["TContinuumMechanics2`TContinuumMechanics`"] <br />

numequ = 1 ;

oldflavors = IndexFlavors ;

ClearIndexFlavor/@oldflavors ;

DeclareIndexFlavor[{black, Black}, {red, Red}, {green, ForestGreen}, {star, SuperStar}, {blue, Blue}, {hat, OverHat}, {tilde, OverTilde}, {bar, OverBar}]

DeclareBaseIndices[{1, 2, 3}] ;

DefineTensorShortcuts[{{bv1, bv2, u, dx}, 1}, {{metric1, metric2, γ, ζ, strain, strain§}, 2}] ;

DefineTensorShortcuts[{{, ê, u, dx}, 1}, {{g, ℊ, γ, ζ, ℰ, ℰ§}, 2}] ;

Using special characters :
It is convenient to specify important and frequently used tensors like basis vectors, metric tensors, strain,.. to use special characters. However, it may be tedious to have to go to the palette "CompleteCharacters" or to "Copy and Paste" each time we need such a character. Then the solution is to define in the shortcuts an simple alias for each notation ( like bv1 for e ).

bv1 =  ;

bv2 = ê ;

metric1 = g ;

metric2 = ℊ ;

strain = ℰ ;

strain§ = ℰ§ ;

bv1d[i]

d[i]

_i^i

_i^i

Black, Red or Blue Basis

We consider a body with a system of coordinates x_ i^i attached permanently to each point of it. So these coordinates are conserved during the deformation of the body. These coordinates are called particle coordinates or convected coordinates.
A line element of a given body before deformation in the red basis _ i^i is given by :

d = dxu[i] d[i]//ToFlavor[red, black]

dx_i^i _i^i

or with the short notation :

d = dxu[i] d[i]//ToFlavor[red]

dx_i^i _i^i

with the square of its length :

d2 = d . (d/.i->j)//EvaluateDotProducts[ , g, False]

dx_i^i dx_j^j g_ (ij)^(ij)

After deformation, the line element connecting the same material points is different in length and direction and may be written, where {ê_ i^i} are the vectors into which the original basis {_ i^i} is deformed

dâ = dxu[i] êd[i]//ToFlavor[red, black]

dx_i^i ê_i^i

dâ2 = dâ . (dâ/.i->j)//EvaluateDotProducts[ ê, ℊ, False]

dx_i^i dx_j^j ℊ_ (ij)^(ij)

The deformation is then characterized by  the quantities γ_ (i  j)^(i  j)

(*2.1*)ResultFrame[res21 = γdd[red @ i, red @ j] -> (dâ2 - d2)/(dxu[red @ i] dxu[red @ j])//Simplify]

      γ_ (ij)^(ij) → -g_ (ij)^(ij) + ℊ_ (ij)^(ij)       (2.1)

Question : is γ_ (i  j)^(i  j) a tensor ? To check this we have to perfom a basis change. We write da and in a new "blue" basis.

d = dxu[i] d[i]//ToFlavor[blue, black]

dâ = dxu[i] êd[i]//ToFlavor[blue, black]

dx_i^i _i^i

dx_i^i ê_i^i

Of course the basis change is common to both systems e and ê because we are using convected coordinates (there are no difference between x_ i^i and Overscript[x,^] _ i^i):

u[red @ j] . d[blue @ i]//EvaluateDotProducts[ , β] ;

d[blue @ i] == d[red @ j] %

êu[red @ j] . êd[blue @ i]//EvaluateDotProducts[ ê, β] ;

êd[blue @ i] == êd[red @ j] %

_i^i == _j^j β_ (ji)^(ji)

ê_i^i == ê_j^j β_ (ji)^(ji)

Therefore by the basis change β_ (j  i)^(j  i) , γ_ (i  j)^(i  j) transforms like a tensor.

u[red @ i] . d[blue @ i]//EvaluateDotProducts[ , β]

u[red @ j] . d[blue @ j]//EvaluateDotProducts[ , β]

γdd[blue @ i, blue @ j] == γdd[red @ i, red @ j] % * %%

%//KroneckerAbsorb[β]

β_ (ii)^(ii)

β_ (jj)^(jj)

γ_ (ij)^(ij) == β_ (ii)^(ii) β_ (jj)^(jj) γ_ (ij)^(ij)

True

The Strain Tensor (γ or E)

The strain tensor is defined by    γ_ (i  j)^(i  j)=ℊ_ (i  j)^(i  j)-g_ (i  j)^(i  j)
which corresponds to the degree of deformation :  (dâ.dâda.da) = γ_ (ij)^(ij)dx_ i^i dx_ j^j

straindd[i_, j_] := (êd[i] . êd[j]/.BasisDotProductRules[ê, ℊ]) - (d[i] . d[j]/.BasisDotProductRules[, g])

straindd[red @ i, red @ j]

-g_ (ij)^(ij) + ℊ_ (ij)^(ij)

The strain is a symmetric tensor like the metric.

Now, we want to calculate the strain tensor from the covariant components of the metric tensor :

strainuu[i_, j_] := (êu[i] . êu[j]/.BasisDotProductRules[ê, ℊ]) - (u[i] . u[j]/.BasisDotProductRules[, g])

ζuu[i, j] == strainuu[i, j]//ToFlavor[red, black]

ζ_ (ij)^(ij) == -g_ (ij)^(ij) + ℊ_ (ij)^(ij)

Using the fact that ℊ_ (ij)^(ij) ℊ_ (jk)^(jk)= ℊ_ (ik)^(ik)  is a Kronecker δ _ (ik)^(ik), we can calculate ζ_ (i  j)^(i  j). From the definitions of ζ_ (i  j)^(i  j) and γ_ (i  j)^(i  j),

((guu[red @ i, red @ j] + ζuu[red @ i, red @ j]) (gdd[red @ j, red @ k] + γdd[red @ j, red @ k])//Expand//MetricSimplify[g]) - gud[red @ i, red @ k] == 0

γ_ (ik)^(ik) + ζ_ (ik)^(ik) + γ_ (jk)^(jk) ζ_ (ij)^(ij) == 0

Neglecting the second order term   γ_ (jk)^(jk) ζ_ (ij)^(ij):

%/.ζuu[red @ i, red @ j] γdd[red @ j, red @ k] ->0

γ_ (ik)^(ik) + ζ_ (ik)^(ik) == 0

Both γ and ζ are tensors, so that we have the relation :

(%[[1]] guu[red @ k, red @ j]//Expand//MetricSimplify[g]) == 0

γ_ (ij)^(ij) + ζ_ (ij)^(ij) == 0

       -γ_ (ij)^(ij) == -g_ (ij)^(ij) + ℊ_ (ij)^(ij)       (2.2)

γ_ (ij)^(ij) do not correspond to raising the indices g_ (k  i)^(k  i) g_ (l  j)^(l  j) γ_ (k  l)^(k  l) (but to its opposite)

The deformation tensor γ_ (i  j)^(i  j) is completely described when, for each point s of the body, we know the displacement vector u, which extend from the position before deformation to that occupied by the same material point after deformation.

The displacement can be written :

 = u[red @ i] ud[red @ i]

u_i^i _i^i

To simplify the problem in a first approch, we consider rectilinear coordinate systems x_ i^i, in which the basis vectors are constant  (and for that we define ConstantBasisRules[e_])

ConstantBasisRules[basis_] := {PartialD[Tensor[basis, {i_}, {Void}], j_] :>0, <br />PartialD[Tensor[basis, {Void}, {i_}], j_] :>0} ;

PartialD[u[red @ i], red @ j]/.ConstantBasisRules[]

0

d := PartialD[, red @ j] dxu[red @ j]/.ConstantBasisRules[]

d

u_i^i_ (, j) dx_j^j _i^i

d=. ; dâ=.

 + dâ == d +  + d ;

ruledâ = Solve[%, dâ][[1]]

{dâ→d + u_i^i_ (, j) dx_j^j _i^i}

d = d[red @ k] dxu[red @ k]

dx_k^k _k^k

dâ1 = dâ/.ruledâ

dâ2 = dâ1/.{i->h, j->l, k->m}

dx_k^k _k^k + u_i^i_ (, j) dx_j^j _i^i

dx_m^m _m^m + u_h^h_ (, l) dx_l^l _h^h

dâ1 . dâ2//EvaluateDotProducts[ , g, False]

%/.{k→i1, l→j1, j→i1, m→j1}//Factor

dâu2 = %/.{i→k, i1→i, j1→j}//KroneckerAbsorb[g]

dx_k^k dx_m^m g_ (km)^(km) + u_h^h_ (, l) dx_k^k dx_l^l g_ (kh)^(kh) + u_i^i_ (, j) dx_j^j dx_m^m g_ (im)^(im) + u_h^h_ (, l) u_i^i_ (, j) dx_j^j dx_l^l g_ (ih)^(ih)

dx_i1^i1 dx_j1^j1 (g_ (i1j1)^(i1j1) + u_h^h_ (, j1) g_ (i1h)^(i1h) + u_i^i_ (, i1) g_ (ij1)^(ij1) + u_h^h_ (, j1) u_i^i_ (, i1) g_ (ih)^(ih))

dx_i^i dx_j^j (u_i^i_ (, j) + u_j^j_ (, i) + g_ (ij)^(ij) + u_h^h_ (, j) u_k^k_ (, i) g_ (kh)^(kh))

Now using the definition of the strain tensor γ_ (ij)^(ij)dx_i^i dx_j^j= dâ.dâ –  da.da = dâu2 – da2

res = γdd[red @ i, red @ j] == ((dâu2 - d2)//MetricSimplify[g]//Factor)/(dxu[red @ i] dxu[red @ j])

γ_ (ij)^(ij) == u_i^i_ (, j) + u_j^j_ (, i) + u_h^h_ (, j) u_k^k_ (, i) g_ (kh)^(kh)

Taking into account that g_ (k  h)^(k  h)is a constant, this gives

(*2.3*)ResultFrame[res23 = res/.guu[red @ k, red @ h] PartialD[ud[red @ h], red @ j] →PartialD[uu[red @ k], red @ j] ]

      γ_ (ij)^(ij) == u_i^i_ (, j) + u_j^j_ (, i) + u_k^k_ (, i) u_k^k_ (, j)       (2.3)

which has the correct i⇔j symmetry ( u_h^h_ (, j) u_k^k_ (, i) g_ (kh)^(kh) is symmetrical). The last term which is quadratic in the displacement can be neglected for sufficiently small displacement. Then we have simply

(*2.4*)ResultFrame[res24 = γdd[red @ i, red @ j] == PartialD[ud[red @ i], red @ j] + PartialD[ud[red @ j], red @ i] ]

      γ_ (ij)^(ij) == u_i^i_ (, j) + u_j^j_ (, i)       (2.4)

In practice we shall prefer in the following as a measure of the strain the tensor   ℰ_ (ij)^(ij)= γ_ (ij)^(ij)/2

ℰ§dd[i_, j_] := (PartialD[ud[red @ i], red @ j] + PartialD[ud[red @ j], red @ i])/2<br /><br />(*2.5*)

ResultFrame[res25 = ℰdd[red @ i, red @ j] == ℰ§dd[red @ i, red @ j]]

      ℰ_ (ij)^(ij) == 1/2 (u_i^i_ (, j) + u_j^j_ (, i))       (2.5)

ClearTensorShortcuts[{{, ê, u, dx}, 1}, {{g, ℊ, γ, ζ, ℰ, ℰ§}, 2}] ;

ClearTensorShortcuts[{{bv1, bv2, u, dx}, 1}, {{metric1, metric2, γ, ζ, strain, strain§}, 2}] ;


Created by Mathematica  (November 27, 2007) Valid XHTML 1.1!