getfem-users
[Top][All Lists]

## Re: [Getfem-users] Questions about user-defined strain energy

 From: yves . renard Subject: Re: [Getfem-users] Questions about user-defined strain energy Date: Thu, 26 May 2022 10:17:54 +0200 (CEST)

Dear David,

I do not see any reason why your _expression_ for the Mooney-Rivlin hyper elastic law would give a different result than the brick. At least if of cours you keep the
incompressible brick
(note that using sqr(expr) instead of pow(expr,2) is slightly more efficient).

Concerning the plane strain approximation, it is a priori possible to do this in GWFL, yes. You can define a 3D matrix from your 2D gradient and use the 3D hyperelastic law.

For the computation of the Von Mises stress from the potential, it is a little bit more tricky because the automatic differentiation of Getfem will give you the directional derivative (in the direction of the test function). So may be it is possible to extract the components with a specific choice of test functions, but it could be not so easy ... I never done that. Unfortunately it is preferable to give the _expression_ of the law in term of stress tensor directly.

Best regards,

Yves

De: "David Danan" <daviddanan9021@gmail.com>
À: "getfem-users" <getfem-users@nongnu.org>
Envoyé: Lundi 23 Mai 2022 13:41:14
Objet: [Getfem-users] Questions about user-defined strain energy

Dear Getfem-users,

to check whether i understand correctly the implementation (and because it's actually much clearer in my code that way), i am trying to replace some predefined bricks for strain energy by the equivalent version using GWFL.
For that, i have several questions

First question
For instance
lawname = 'SaintVenant Kirchhoff'
clambda,cmu = params["clambda"],params["cmu"]
idBrick=model.add_finite_strain_elasticity_brick(mim, lawname, 'u', 'paramsSVK')
becomes
clambda,cmu = params["clambda"],params["cmu"]

And the results seems to be the same.
However, for the incompressible Mooney Rivlin strain energy case, it does not behave as i expected

Using the example there as a basis in a 3D case
https://github.com/getfem-doc/getfem/blob/master/interface/tests/python/demo_nonlinear_elasticity.py
and after some simplifications

I have tried to replace the last line in
lawname = 'Incompressible Mooney Rivlin'
model.add_finite_strain_elasticity_brick(mim, lawname, 'u', 'paramsIMR')
By this
Which was exactly the same, of course. Next, i have tried to replace it by these lines
model.add_nonlinear_generic_assembly_brick(mim, "paramsIMR(1)* ( Matrix_j1(Right_Cauchy_Green(F)) - 3 )+ paramsIMR(2)* ( Matrix_j2(Right_Cauchy_Green(F)) - 3 )")
Which failed to converge

I thought this _expression_ was consistent with the implementation of Mooney_Rivlin_hyperelastic_law::strain_energy and the compute_invariants here
and the documentation
https://getfem.org/userdoc/model_nonlinear_elasticity.html?highlight=finite%20strain
But, clearly, i am missing something. Could you explain what I am doing wrong?

Second question
In a 2D case, i would like to be able to use either a plane strain approximation based on a given strain energy _expression_ in 3D.
In the implementation, it is nicely done in  scalar_type plane_strain_hyperelastic_law::strain_energy there

Is it possible to do the same using the GWFL?

Third question
I would like to be able to compute the von-mises field for any strain energy function.

If It is an existing brick, the method
md.compute_finite_strain_elasticity_Von_Mises(lawname, 'u', 'params', mfdu)
will do the trick just fine.

If it's not the case, i guess i can use something akin to the actual implementation of compute_finite_strain_elasticity_Von_Mises

std::string expr = "sqrt(3/2)*Norm(Deviator(Cauchy_stress_from_PK2("
+ adapted_lawname + "_PK2(Grad_" + varname + "," + params + "),Grad_"
+ varname + ")))";
ga_interpolation_Lagrange_fem(md, expr, mf_vm, VM, rg);
}

combined with local_projection to get the value at the elements.
The question is: is it possible to compute Piola Kirchhoff 2 from the strain energy within the GWFL _expression_ given to local_projection?
I have the impression it's the only thing i need to be able to do what i want.
Let W be a strain energy function and E be the Green-Lagrange tensor (defined as macros, let's say), is `Diff(W, E)` doing exactly what i am expecting for this purpose?
If it's not the case, is there another way to do it?

Thank you in advance,
kind regards,
David.

reply via email to