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