Re: Elastic energy computation

63 views
Skip to first unread message
Message has been deleted

Seyed Ali Mohseni

unread,
Jan 16, 2017, 5:25:43 AM1/16/17
to deal.II User Group
Hi,

Is it possible to compute the elastic energy for a simple 2D cube before we solve the system?
Because I checked the displacement gradients and they are 0 due to having no solution probably.

Hence, I wonder how would someone be able to compute the elastic energy with the following formula:

psi = 0.5 * lambda * tr_eps * tr_eps + mu * tr_eps_2;

with 

tr_eps = trace(eps);
tr_eps_2 = trace(eps * eps);

Here eps is the strain tensor and lambda as well as mu are the lamé parameters, respectively.

In order to compute the strain tensor eps I need the displacement gradients:

 eps = 0.5 * (grad_u + transpose(grad_u));

And from what I checked, the get_strain() function from step-18 doesn't give me the same strain tensor. It seems more like a B-operator to me.

If I compute the elastic energy after I solved the system, how am I able to store the energy values for each cell, so I can have access to it all the time. 

From Timo Heister and Thomas Wick's phase-field crack examples I learned that they compute energy by means of the compute_energy() function, but it seems to me like they just output the value and it is not further used during computation.

Kind regards,
S. A. Mohseni 

Jean-Paul Pelteret

unread,
Jan 16, 2017, 6:15:51 AM1/16/17
to deal.II User Group
Dear Seyed,

There are two get_strain() functions in step-18. The first computes the symmetric part of the shape function gradients, and the second computes the small strain tensor.

To store the values of the energy at each quadrature point, you can simply modify the PointHistory class to suit your needs. In its current form, a stress history variable is already defined and updated for each evaluation point.

Regards,
Jean-Paul
Message has been deleted

Jean-Paul Pelteret

unread,
Jan 16, 2017, 7:31:09 AM1/16/17
to dea...@googlegroups.com
Dear Seyed,

These two things are very different, and cannot be compared with one another.

The “strain” in the assembly routine stems from the weak form, which is presented in the introduction to the tutorial. If one considers a variational approach, is coincides with the variation of the strain after computing the first variation of the virtual internal work. By contrast, the “strain” in the update_quadrature_point_history routine really is the actual physical strain associated with the approximated displacement field at that point. 

I would recommend reading through the introduction once more, because the distinction is explained there:

get_strain takes an object of type FEValues and indices i and q and returns the symmetric gradient, i.e. the strain, corresponding to shape function φi(xq), evaluated on the cell on which the FEValues object was last reinitialised

versus

On each quadrature point, compute the strain increment from the gradients, and multiply it by the stress-strain tensor to get the stress update.

Perhaps there’s some argument to be made that calling the first function “get_strains” is a bit misleading, but in my opinion the accompanying documentation does provide sufficient detail on what exactly it’s job is. We’ll see if we can improve on this.

Regards,
Jean-Paul

P.S.
It would be good if you’d stop deleting so many of your posts because the conversation becomes difficult to follow.

On 16 Jan 2017, at 12:53, 'Seyed Ali Mohseni' via deal.II User Group <dea...@googlegroups.com> wrote:

I checked the second one. It doesn't coincide with the strain tensor I obtain from the energy computation after I solve the system, e.g.

 - in GAUSS point 1 - 

ASSEMBLY STRAIN TENSOR
0 0.105662 
0.105662 0.211325 

ENERGY STRAIN TENSOR
 0.001081   -0.000738  
 -0.000738   -0.008525 

... etc.

How do you assume that it is the same strain tensor?

The PointHistory idea is very good. Thanks for remembering me ;)

Best regards,
Seyed Ali
 

--
The deal.II project is located at http://www.dealii.org/
For mailing list/forum options, see https://groups.google.com/d/forum/dealii?hl=en
---
You received this message because you are subscribed to a topic in the Google Groups "deal.II User Group" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/dealii/bXEGZIsKJrY/unsubscribe.
To unsubscribe from this group and all its topics, send an email to dealii+un...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Seyed Ali Mohseni

unread,
Jan 16, 2017, 9:28:36 AM1/16/17
to deal.II User Group
Thanks, I understand now. 

I just deleted the post, because I misunderstood what you meant earlier. 
I thought you are refering to the left eps_phi_i (first) and right eps_phi_j (second).

But you were talking about: 

template <int dim> inline SymmetricTensor<2,dim> get_strain (const std::vector<Tensor<1,dim> > &grad)

This function differs of course since it computes the strain based on the displacement gradients. This version I already computed, as I mentioned before.
I thought maybe you have some procedure to store the last converged displacements so we can use them for the computation of strains within the assembly routine.
This seems not easily possible due to the structure of deal.II. From what I understood we have to solve first before obtaining the "physical" strains.
Reply all
Reply to author
Forward
0 new messages