Dear Yves,

this time, it's perfect, the test passed.
Thanks a lot!

The only question i have left now is the possibility to compute the
divergence of a tensor field ( arising from the gradient of an existing
variable in a model), any suggestions?

Best regards,
David.

Le mar. 14 juin 2022 à 13:59, Renard Yves <yves.ren...@insa-lyon.fr> a
écrit :

> Dear Danan,
>
> I made an additional correction. Normally the tangent term of matrix_j2 is
> ok now.
>
> Best regards,
>
> Yves
>
>
> Le 13/06/2022 à 17:37, David Danan a écrit :
>
> 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