CFD Online Discussion Forums

CFD Online Discussion Forums (
-   OpenFOAM Programming & Development (
-   -   Magnitude of a tensor (

mmkr825 February 19, 2013 10:06

Magnitude of a tensor
Dear all,
I would like to share your opinion on my doubt.

- The rate of strain tensor is written as(if i have not understand wrongly):


- According to linear algebra the magnitude of any tensor S is:

|S|=sqrt(2S:S) .........................(2)

- According to Eq. (2) the magnitude of rate of strain tensor is:

|E| = sqrt(2E:E). ..............................(3)

= sqrt(2*(E_ij*E_ij))...................... (4)

- In OpenFOAM notation the magnitude of rate of strain tensor can be written as:


But for the testing purpose i defined a Tensor Q as [1 0 0 0 0.8 0 0 0 0.5]. According to Eq. (2), it's magnitude is 1.944222. But the OpenFOAM is giving 1.3747727.
So the definition of the magnitude of tensor according to OpenFOAM is:

|S| = sqrt(S:S)=sqrt(S_ij*S_ij)...........................(6)
Which contradicts Eq. (2).

Can any one clarify my doubt and how to write rate of strain tensor in OpenFOAM notation. Thanks in advance.

Mallikarjuna Reddy

fumiya February 20, 2013 10:54


As you wrote, the magnitude of a tensor is defined in OpenFOAM as eq.(6).
This is also described in the programmer's guide p-16.


mmkr825 February 20, 2013 12:17

Hi Fumiya
Thanks for quick response. But in most of the books the shear rate is written as
|E| = sqrt(2E:E)

where rate of strain tensor is: E=symm(grad(U))=1/2[grad(U)+grad(U)^T]

So according to OpenFOAM notation, the shear rate will be

|E| = sqrt(E:E) = sqrt(magSqr(symm(fvc::grad(U))))

Could you please clarify whether this notation is correct or not.

Mallikarjuna Reddy

anishtain4 February 20, 2013 17:32

I don't understand why the magnitude of tensor should be twice its double contraction?
As a simple oppose example I can name vectors which are first order tensor and its magnitude would be sqrt(Ux^2+Uy^2+Uz^2). Still you may have shear stress right as:
|E| = sqrt(E:E) = sqrt(2*magSqr(symm(fvc::grad(U))))

rudolf.hellmuth February 9, 2015 10:06

I have the same question here.

In viscosityModel.C, strain rate is defined as

Foam::tmp<Foam::volScalarField> Foam::viscosityModel::strainRate() const
    return sqrt(2.0)*mag(symm(fvc::grad(U_)));

In TensorI.H, symmetric part is defined as

template<class Cmpt>
inline SymmTensor<Cmpt> symm(const Tensor<Cmpt>& t)
    return SymmTensor<Cmpt>
        t.xx(), 0.5*(t.xy() + t.yx()), 0.5*(t.xz() + t.zx()),
                t.yy(),                0.5*(t.yz() + t.zy()),

Unfortunately, I couldn't find where mag(symmTensor T) is defined. :confused: However, the programmer's guide (v2.3.1) defines tensor magnitude as
mag(T) = sqrt(T : T) .
By trusting the programmer's guide, shouldn't the strain rate be defined as
E = mag(symm(grad(U))) ,
instead of
E = sqrt(2.0)*mag(symm(grad(U))) ?
Why is this sqrt(2) there?

Nucleophobe August 14, 2015 18:36


Originally Posted by rudolf.hellmuth (Post 531082)
Why is this sqrt(2) there?

Greetings, Rudolf.

I'm a few months late here, but I think you have asked an important question. I worked this out once before but forgot my conclusion, so it's worth revisiting.

First, consider the definition of the (scalar) strain rate in 2D:
gamma_dot = U/y

Now, we would like a way to calculate the scalar strain rate in 3D tensor notation which will give us the same result. For instance, imagine a Couette flow, where:

grad(U) = 
0    U/y    0
0    0      0
0    0      0

Therefore, the strain rate tensor is equal to:

E = 1/2[grad(U)+grad(U)^T]
E =
0            0.5 * U/y    0
0.5 * U/y    0            0
0            0            0

If we compute sqrt(E:E), we get:

= sqrt( (0.5 * U/y)^2 + (0.5 * U/y)^2)
= sqrt( 0.5 * (U/y)^2)
= sqrt(2)/2 * U/y

That's not right, because it doesn't agree with the 2D result (U/y). What we want is sqrt(2 E:E):

gamma_dot = sqrt(2 E:E)
= sqrt( 2 * ((0.5 * U/y)^2 + (0.5 * U/y)^2) )
= sqrt( (U/y)^2)
= U/y

So, at least based on this sanity check, it looks like the OpenFOAM definition for the scalar strain rate is correct. Does that make sense?

Does anyone else have references that provide further comments on the definition of the scalar strain rate in 3D tensor notation? Is it common to define the magnitude of a tensor A as |A| = sqrt(2 A:A)?

P.S. See also this thread:

rudolf.hellmuth August 16, 2015 08:57

This is still a mystery for me. I've got to the same point as you have. I cannot prove the equality in a reasonable way, just by the sanity check.

I've got to these relations with Einstein's notation:

mag(grad(u)) = sqrt( (du_i/dx_j)^2 )

mag(grad(E)) = 0.5 * sqrt( (du_i/dx_j + du_j/dx_i)^2 )
mag(grad(E)) = 0.5 * sqrt( (du_i/dx_j) ^2 + 2*(du_i/dx_j)*(du_j/dx_i) + (du_j/dx_i)^2 )

There is another thing, the more rational way of normalizing the shear rate at any reference frame is to use the second invariant of the strain rate tensor

II = tr(EE) = tr(E) = E:E

rudolf.hellmuth August 21, 2015 12:52

I think that I might have figure out the confusion here.

The magnitude of a tensor is:
mag(T) = sqrt(T:T) = sqrt(tr(TT))

In the case of the strain rate, that is valid as well. However, the strain rate tensor is used for obtaining a scalar named absolute shear rate G, which is used as an analogy to the unidimensional shear rate \dot{\gamma} = dv/dx used in viscosity tests. This is done because viscosity tests are always unidimensional, but the rheological properties are extrapolated to 3D cases. This is done from the energy dissipation function

phi = tau : grad(v)


tau = 2*mu*E

In simple shear flow

phi = mu*grad(v):grad(v) = mu*\dot{\gamma}*\dot{\gamma}

I have done the derivation of E:grad(v). It is lengthy, but it resulted in

E:grad(v) = E:E - 1/3*div(v)*div(v)

The second part of the right had side accounts the compressibility. It is zero in incompressible cases.

I think that they consider

phi = mu * (2*E:E) = mu * G*G

which yields

G = sqrt(2*E:E) = sqrt(2) * mag(symm(grad(v)))

I might be wrong in some of my statements. I haven't found any literature directly comparing G and E.


All times are GMT -4. The time now is 01:49.