Dear David, You can also try the contract operator instead of Trace if you want to get a vector directly:
Contract(A, i, j) stands for the contraction of tensor A with respect to its ith and jth indices. The first index is numbered 1. For instance, Contract(A, 1, 2) is equivalent to Trace(A) for a matrix A. BR Kostas On Wed, Jun 15, 2022 at 10:45 AM David Danan <daviddanan9...@gmail.com> wrote: > Dear Yves, > > No, i didn't think about trying that, thanks for the idea. > > I replaced the following expression (which failed) > 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") > by > newVal=gf.asm_generic(mim=mim, order=0, expression= > "Norm_sqr(Trace(Grad(clambda*Trace(Green_Lagrange_E)*Id(2)+2*cmu*Green_Lagrange_E)))", > model=model,region=-1) > > which also failed (Trace operator is for square matrices only) so i tried > that instead > newVal_x=gf.asm_generic(mim=mim, order=0, expression= > "Norm_sqr(Trace(Grad(clambda*Trace(Green_Lagrange_E)*Id(2)+2*cmu*Green_Lagrange_E)(1,:,:)))", > model=model,region=-1) > newVal_y=gf.asm_generic(mim=mim, order=0, expression= > "Norm_sqr(Trace(Grad(clambda*Trace(Green_Lagrange_E)*Id(2)+2*cmu*Green_Lagrange_E)(2,:,:)))", > model=model,region=-1) > It does run without error but does it seem consistent to you regarding the > indices, in particular ? > Here, the first line would be the computation of the integral over the > whole domain of the squared norm of the x-component of Div(S), where S is a > tensor, likewise for the second line for the y-component of Div(S). > Does it seem correct? > > Best regards, > David. > > > > Le mar. 14 juin 2022 à 18:57, <yves.ren...@insa-lyon.fr> a écrit : > >> Dear David, >> >> Did you try "Trace(Grad(Expr))" ? It works but with some limitations. >> >> Best regards, >> >> Yves >> >> ------------------------------ >> *De: *"David Danan" <daviddanan9...@gmail.com> >> *À: *"Yves Renard" <yves.ren...@insa-lyon.fr> >> *Envoyé: *Mardi 14 Juin 2022 18:44:05 >> *Objet: *Re: [Getfem-users] Questions about user-defined strain energy >> >> 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. >>>>>>>> >>>>>>>> >>