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. >> >>