User login


You are here

implementation of nonlinear fem

phunguyen's picture

Hello everybody,

 In the implementation of nonlinear FEM, there are two ways, namely the Voigt notation and the full matrix notation. Obviously, using Voigt notation, one only stores vector instead of matrix. So, by using the symmetry of the Cauchy and second Piola Kirchhoff stress tensors, it is always possible to implement nonlinear FEM using Voigt notation. 

 So, my question is why the full matrix implementation still exists? It is mentioned in the famous book of Ted Belytschko. Only due to historical reason or there are some advantages? 

BTW, could you please show me benchmark problems to test the implementation for hyperelasticty problems?

 Thanks a lot.



Voigt notation has the big computational advantage of requiring less memory. That's why it is used.  On the contrary, it has the disadvantage of being artificial. Storing a symmetric 2nd order stress tensor in a vector (6x1) or an asymmetric 2nd order stress tensor in a vector (9x1) is completely arbitrary and has no correlation to tensorial description in continuum mechanics.

If you have some differential equations and wanna solve them using FEM, you can directly implement your tensors using full matrix implementation. If you are using Voigt notation you have to reorder your matrices completely. If you are not interested in saving memory (but this is always very important) the last step is in vain. Moreover, it is an additional source of making mistakes.

Full matrix implementations have the disadvantage of storing data twice (many tensors are symmetric), however, normally you do not add a lot of tensors (with different magnitudes) to each other to have numerical problems out of that. 

In my opinion, Voigt notation is a bit obsolete. It originates from times, where computers were 10 times bigger and slower as nowadays. Code from commercial software packages (like Ansys or Abaqus) originated at that time and use Voigt notation.

However, computers can never be fast enough, so still nowadays it makes a lot of sense to use Voigt notation. 

Vinh Phu Nguyen,

I am not sure of your answer, but my first thoughts are that you should be able to use Voigt notation in all cases without body couples. Voigt notation is not an effect of linearity, so whenever the tensors used are of a form that is symmetric (indeed, there are stress- and strain-representing tensors for linear behaviour), you should be able to use it. 

Hopefully someone can give you a more sure answer.



Mandred Ulz,

I think you are wrong that Voigt notation is obsolete. We have made drastic gains in computing power, but we now use those gains to perform bigger, more detailed simulations. In the case of code to run large simulations, efficiency remains important.

In research involving new implementation, efficiency is often unimportant and the full-matrix representations are used for simplicity of implementation, but that does not mean Voigt notation does not have its place.

Just to set the record straight.  Voigt notation does not originate: "from times, where computers were 10 times bigger and slower as
nowadays. Code from commercial software packages (like Ansys or Abaqus)
originated at that time and use Voigt notation"

Voigt notation orginates from the works of Dr. Woldemar Voigt.  Dr Voigt was also the first to introduce the use and notion of tensors as we use them today.    For those interested in such historical issues, one can read the first introduction of Voigt notation in Dr. Voigt's classic text "Die fundamentalen physicalischen Eigenschaften der Krystalle".  This book is available on google books.  The publication date is 1898 -- a bit before the time of electronic computers at least! Some of Voigt's books have also been translated into English.

It is also interesting to note that Voigt ordered the shear as 4 -> 23 , 5 -> 31, 6 -> 12; whereas, many authors these days utilize the mapping 4 -> 12 , 5 -> 23, 6 -> 31.


Prof. Dr. Sanjay Govindjee
University of California, Berkeley

Thank you for the link. I knew about Woldemar Voigt before, but never tried to find out when and why he introduced that notation.

It's also important to note that memory is not the only issue here. You will solve all equations for more variables when not taking into account the symmetry. This can have a huge impact when solving tougher nonlinear material models.

I also find it alot more convenient to rewrite 4th order tensors to matrices, and 2nd order tensors to vectors when implementing the equations. Even if speed was not an issue, having to implement all operations for higher order tensors (or find code that will do it for me) would take alot more time than simply rewriting the tensors.Just having to implement the full 4th order elastic stiffness tensor would be to much of a headache for me.

 I find Voigt notation to be plauged by inconsistency. I do believe i've seen every combination of the off diagonal elements in Voigt vectors.

There is also alot of times when the off-diagonal elements in the strain are written as gamma12 = epsilon12+epsilon21 (and so on), but not the stress. Doing this leaves at least me with the question on how 4th order tensors should be written. In particular the fourth order symmetric identity tensor, typically used to construct the elastic stiffness tensor (usually Isym has it's last three diagonal elements as 0.5, something i find to be VERY bad practice, as it makes no sense other than in the stiffness tensor)

If i were to implement some material model, i would most likely choose to work with 6x1 (but not multiplying the off diagonal elements as described above). Implementing a strain/stress driven constitutive driver with 9x1 or 3x3 input, is to me like asking for bugs, as you will have a function prototype with redudant information thus giving undefined behaviour for bad input (i.e. when symmetric components in input do not match exactly). I'd also look carefully at the order of them, keeping it as Voigt ordered them, there is enough orginality there as it is!


Thanks for the reminder that memory savings are only one example of the computational expense savings in using Voight notation over the full matrix form when writing software. You are quite right.

I am not sure I see where you are coming from in your second paragraph. We are discussing models that are derived using continuum mechanics, where the quantities are described in full matrix form in their derivation. Implementing the algebra to handle these is rather obvious, especially if index notation is used, where nested for loops over all indices would be used and the equation for each element would be written. For Voigt notation, the algebra that applies is sometimes exotic, though trivial to determine.

Voigt notation does open the door to some different practices (the use of different orders, for example), so it is up to the engineer to keep his or her application consistent, as it is in the case of every convention. 

The issue of the off-diagonal elements is (I believe) peculiar to mechanics, and is somewhat odd. I would like to note, though, that the vector form of the shear stresses should not be written as the sum of the corresponding off-diagonal elements, i.e.

    \tau_{ij} \ne \sigma_{ij} + \sigma_{ji},\quad i\ne j,

even though

    \gamma_{ij} = \epsilon_{ij} + \epsilon_{ji} = 2\epsilon_{ij}.

I can think of a few reasons this might be the case, the most important to me being that it speaks to the equivalence of modern theory and classical methods. For whatever reasons, good or bad, these are the definitions. It would not be correct to double the shear stresses in Voigt form. (Of course, with consistency you could solve problems this way, but it would be pointless deviation from convention.)

The do not believe definition of the fourth-order identity tensor is not bad practice. When written out with respect to a Cartesian basis, its values might seem strange to you and me, but it is truly the identity tensor, i.e. the tensor that takes 2nd order tensors into themselves.

I didn't mean to say that it's not possible to implement the full tensor algebra, but simply having to type out the 81 components of the stiffness tensor sound like more work than to use Voigt notation to me, regardless if i want to optimize the code or not. Working with MATLAB or some LAPACK library Voigt notation comes in very handy, while 4th order does not.

My main issue with the Voigt notation was with the symmetric 4th order identity tensor, which definition becomes unclear due to the convention of (sometimes) using gamma in the strain vector, while the stress tensor always has single elements just like you said.

In order to use this expression to construct the elastic stiffness

 the symmetric identity is often set to have 0.5 at it's last three diagonal element to match the off-diagonal stress components. Doing so one must notice that Isym no longer has the correct interpretation. It would NOT truly be the same tensor when written out like this in a cartesian basis. It no longer brings a second order tensor to it's symmetric part since it divides the off diagonal elements. With 6x1 Voigt notation all vectors are of course symmetric in their representation.

Taking the derivative (often needed when calculating a jacobian in a constitutive driver)

then Isym would not have any 0.5 in voigt notation, it would be a 6x6 identity matrix regardless if you express the strain with gamma or epsilon only. Perhaps i have only had bad luck with the code and litterature i've studied, since 

But in the end i believe the easiest way to avoid these issues would be to simply not use gamma at all as it really doesn't help (it might make for cleaner expressions somewhere, but overall i'd say its more of a hassle when implementing).Since it seems to be just as common not to use gamma, i see no good reason to use it, unless you are contributing to existing code or literature, in which case consistency would be best.

I also wonder if you have any tips for typing in the LaTeX expressions I only copied your urls, and messing around with the urls in here was tedious (signs like + didn't want to work easily).

Thanks for clarifying what you meant. I now see what you mean about the identity tensor; I thought you were talking about something else. That is something nasty that comes up working with the engineering shear strain (gamma). I am not sure there are any reasons to use gamma to formulate mechincs problems other than historical ones, with the exception that gamma has the physical interpretation of being the change in angle and not half the change in angle. 


I picked up the trick for using LaTeX on iMechanica from this post , which offers the tip that you need to use "%2B" for a plus sign. I don't have any real tricks for making go extra-smooth.

Incidentally, there is a LaTeX module for Drupal called DruTeX. It might be interesting to know how feasible it is for it to be installed on iMechanica, which might allow more smooth including of LaTeX in posts.

phunguyen's picture

Thank you for your replies.

I think that both Voight notation and full matrix should be used in concert when we combine the total Lagrangian and updated Langrangian elements in the same code.



I believe Voigt notation is useful when you are implementing linear finite elements and  non-linear finite elements with small strain theory (i.e. material non-linearity).

If you are implementing finite strain FE, then using the full matrix is convenient, since it lets you derive the tangent matrices in a very elegant manner (both total and updated). The former might be somewhat cumbersome to derive and implement.



This is off the tangent of the topic that you guy are dicussing now. I'd like to introduce myself.  I have been working for Pratt & Whitney aircraft engine as structure engineer doing fracture mechanics, creep using ANSYS and the like for more than six years.

Are you intending to go back to VN after graduation? The reason that I am asking is that I am planning to perform engineering works for US and EU companies.  So I am pretty much interesting to find out how extensive our guys are involving with FEA in Vietnam? and getting them participating in application of this field particularly in aircraft structure.  Let's discuss more.  Regards, Tung Tran

phunguyen's picture

Could you please write to me via and introduce yourself in more details. We therefore can discuss about your plan. Do you know Prof. Nguyen Dang Hung? He is doing something similar in VN.

Looking forward to receiving your mail.



I have a question that is somehow related to the above comments. Namely, I was wondering if tangent moduli (or jacobian) for Newton iteration in nonlinear FEM  is always symmetrical? That is the partial derivation of stress with respect to strain. I am working on a problem and I seem to get unsymmetric tangent moduli, but I am not completely sure if I haven't made a mistake in the derivation or writing the code. The convergence is pretty good, so it seems to be correct, but I want to make sure that I am not breaking any "fundamental law" of symmetry. Can anybody comment on this issue?




WaiChing Sun's picture

If you use plasticity model with non associative flow rule, then the resultant tangential elastoplastic moduli does not hold major symmetry. If the moduli is expressed in Voigt notation, then it becomes a unsymmetric matrix. 

Thanks for that answer. I checked Zienkiewicz's book and he also mentions that but doesn't give any detail. Can you recomend any other reference giving more detail about the topic?

WaiChing Sun's picture

I think you can get the information you needed from the book written by Simo and Hughes (Computational Plasticity). Alternatively, imechanica also provides a link ( for the plasticity book written by Professor Jacob Lubliner. Suffice to say, the non-symmetry of the tangential elastoplastic tensor is  due to the fact that the plastic potential and yield function are not identical.  Notice that there are certainly more than possible causes that leads to nonsymmetric stiffness matrix, but non-assoicative flow is just one of them. Hope it helps.




Subscribe to Comments for "implementation of nonlinear fem"

Recent comments

More comments


Subscribe to Syndicate