Dear Yves,

i gave it a try, recompiled the master version available at
https://git.savannah.nongnu.org/cgit/getfem.git/commit/ with your last fix
but it still fails to converge, unfortunately.

I have tested this with the program enclosed in the third email in this
thread, it seems there is still an issue as far as i can tell.

Best regards,
David.

Le lun. 13 juin 2022 à 15:52, Renard Yves <yves.ren...@insa-lyon.fr> a
écrit :

> Dear Danan and Kostas,
>
> I had a rapid check to the implementation of Mooney-Rivlin hyperelastic
> law and matrix_j2 operators in getfem_nonlinear_elasticity.cc
>
> I do not see any difference between the implementation and the expression
> in the documentation (
> https://getfem.org/userdoc/model_nonlinear_elasticity.html#some-recalls-on-finite-strain-elasticity)
> for the Mooney-Rivlin law. However, it seems to me that a (det) is missing
> in the matrix_j2 gradient expression. I committed a fix. Could you try
> again if there is still a difference between the use of Mooney-Rivlin law
> and its expression using matrix_j2 ?
>
> Best regards,
>
> Yves
>
>
> Le 05/06/2022 à 20:01, David Danan a écrit :
>
> Dear Kostas,
>
> once again, thank you for pointing out where the problem is!
> As soon as i have some time, it would be a pleasure to have a look and
> trying to fix this. Thanks a lot!
>
> Regarding the question in my second message in this thread about the
> computation of the divergence of a tensor field, arising from the gradient
> of an existing variable in a model, do you have any idea?
>
> BR,
> David.
>
>
>
> Le sam. 28 mai 2022 à 22:10, Konstantinos Poulios <logar...@googlemail.com>
> a écrit :
>
>> I see now that Yves has left a comment "to be verified":
>>
>>     // Second derivative
>>     void second_derivative(const arg_list &args, size_type, size_type,
>>                            base_tensor &result) const { // To be verified
>>
>> in the second derivative of matrix_j2_operator in
>> getfem_nonlinear_elasticity.cc, so maybe you can help by checking/fixing
>> this.
>>
>> BR
>> Kostas
>>
>>
>>
>> On Sat, May 28, 2022 at 10:05 PM Konstantinos Poulios <
>> logar...@googlemail.com> wrote:
>>
>>> Dear David,
>>>
>>> It works for me with
>>>         model.add_nonlinear_generic_assembly_brick(mim,
>>>                           "paramsIMR(1)* ( Matrix_j1(F*F') - 3 )\
>>>                           + paramsIMR(2)* (
>>> Matrix_i2(F*F')*pow(Det(F*F'),-2/3) - 3 )")
>>> so you must have hit a bug in Matrix_j2.
>>>
>>> BR
>>> Kostas
>>>
>>> On Sat, May 28, 2022 at 4:42 PM David Danan <daviddanan9...@gmail.com>
>>> wrote:
>>>
>>>> Dear Yves,
>>>>
>>>> first, thanks for your detailed answers!
>>>>
>>>> For the first question, at this point, i guess it's much more
>>>> convenient at this point to share a script containing a minimal (not)
>>>> working test regarding this difference.
>>>> I have kept the incompressibility brick in both cases.
>>>>
>>>> For the second question, it seems clear, thanks.
>>>> For the third question, providing the expression of the stress tensor
>>>> directly instead is fine by me, it's not very difficult using the
>>>> invariants already available in the GWFL combined with some macro.
>>>>
>>>> While i am at it, i have another question.
>>>> It is somehow related to the one in the following thread but for the
>>>> divergence of a tensor field
>>>> https://lists.nongnu.org/archive/html/getfem-users/2015-03/msg00009.html
>>>>
>>>> I would like to check the satisfaction of the equilibrium equation
>>>> (i.e. div(P) + f0, where Pi is a stress tensor and f0 is a volumic force).
>>>> To do so, i gave it a try without volumic forces
>>>>     value=gf.asm_generic(mim=mim, order=0, expression=
>>>> "Norm_sqr(Div(clambda*Trace(Green_Lagrange_E)*Id(2)+2*cmu*Green_Lagrange_E))",
>>>> model=model,region=-1)
>>>> where Green_Lagrange_E is a macro defined by
>>>>     model.add_macro("epsilon", "(Grad_u+(Grad_u)')/2")
>>>>     model.add_macro("Green_Lagrange_E", "epsilon+ (Grad_u)'*Grad_u/2")
>>>> but it failed (Error in macro expansion. Only variable name are allowed
>>>> for macro parameter preceded by Grad_ Hess_ Test_ or Test2_ prefixes)
>>>>
>>>> Next, i tried to check whether i could at least apply the Div operator
>>>> to Grad_u directly instead, like that
>>>>     value=gf.asm_generic(mim=mim, order=0, expression=
>>>> "Norm_sqr(Div(Grad_u))", model=model,region=-1)
>>>> but it also failed, Grad_u was not recognized.
>>>>
>>>> Is there a way to do that? I see that it's possible to have access to
>>>> the hessian of the model variables; is rebuilding div(P) from the hessian
>>>> the only way to compute this quantity?
>>>> Best regards,
>>>>
>>>> David.
>>>>
>>>>
>>>> Le jeu. 26 mai 2022 à 10:17, <yves.ren...@insa-lyon.fr> a écrit :
>>>>
>>>>> 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
>>>>> md.add_finite_strain_incompressibility_brick(mim, 'u', 'p')
>>>>> (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" <daviddanan9...@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"]
>>>>> model.add_initialized_data('paramsSVK', [clambda, cmu])
>>>>> idBrick=model.add_finite_strain_elasticity_brick(mim, lawname, 'u',
>>>>> 'paramsSVK')
>>>>> becomes
>>>>> clambda,cmu = params["clambda"],params["cmu"]
>>>>> model.add_initialized_data('paramsSVK', [clambda, cmu])
>>>>> idBrick=model.add_nonlinear_generic_assembly_brick(mim,
>>>>> "(paramsSVK(1)/2)*pow(Trace(Green_Lagrange_E),2)+paramsSVK(2)*Trace(Green_Lagrange_E'*Green_Lagrange_E)"
>>>>> )
>>>>>
>>>>> 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_initialized_data('paramsIMR', [1,1])
>>>>> model.add_finite_strain_elasticity_brick(mim, lawname, 'u',
>>>>> 'paramsIMR')
>>>>> By this
>>>>> model.add_nonlinear_generic_assembly_brick(mim, 
>>>>> "Incompressible_Mooney_Rivlin_potential(Grad_u,
>>>>> [paramsIMR(1);paramsIMR(2)])")
>>>>> Which was exactly the same, of course. Next, i have tried to replace
>>>>> it by these lines
>>>>> model.add_macro("F", "Grad_u+Id(3)")
>>>>> 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
>>>>>
>>>>> http://download-mirror.savannah.gnu.org/releases/getfem/doc/getfem_reference/getfem__nonlinear__elasticity_8cc_source.html
>>>>> 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
>>>>>
>>>>> http://download-mirror.savannah.gnu.org/releases/getfem/doc/getfem_reference/getfem__nonlinear__elasticity_8cc_source.html
>>>>>
>>>>> 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
>>>>> <http://download-mirror.savannah.gnu.org/releases/getfem/doc/getfem_reference/namespacegetfem.html#a9166bc2065a4f2b5633e2e933ec3e693>
>>>>>
>>>>>   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