
From:  Konstantinos Poulios 
Subject:  Re: Imposing a rolling condition 
Date:  Thu, 23 Jun 2022 12:09:25 +0200 
Dear Kostas,I eventually managed to compile the code, followed by the numerical test you were suggesting in your previous mail.In some cases, the code did not behave as I expected. Mainly, changing the force magnitude seemed to have no impact...Please find attached a few slides about my findings and questions.Thank you again for you help,Best regards,RaphaëlLe lun. 9 mai 2022 à 16:38, Konstantinos Poulios <logari81@googlemail.com> a écrit :Dear Raphaël,After Yves has now fixed this bug, I came back to your case. Before trying to solve your original question, I have prepared a version of the demo_wheel.py script (attached) where you can simulate the contact with friction between the two bodies for prescribed vertical displacement and rotation. Please recompile GetFEM with Yves' fix and then try to run the attached script to make sure it works.As an exercise you can then try to add the calculation of the moment Mz, and the reaction forces Fx and Fy to the attached script.Best regardsKostasOn Tue, Apr 19, 2022 at 3:18 PM Raphaël Meunier <raphael.meunier1@gmail.com> wrote:Dear Kostas,Thank you again for the kind answer.I tried the given script and it outputs an error message:Which does not help me towards finding the right answer.So, I tried to describe the settings of my experiment in the attached document. Please, feel free to ask if it is not clear enough.Thank you in advance,Best regards,Raphaël MeunierLe sam. 16 avr. 2022 à 19:09, Konstantinos Poulios <logari81@googlemail.com> a écrit :Dear Raphaël,It would help to have a description/sketch of the exact system you would like to model. But if I understood it correctly, you wanted to prescribe a constant force Fy in ydirection. If you introduce a degree of freedom yc for the vertical displacement, and you couple your wheel to yc, then you can easily apply a force on yc by multiplying the known force with the variation of yc. Dividing with area is needed only if you add this term inside an integral over an area "area". This is because the integral of a constant is just as multiplying the constant with the area of the integration domain. You could achieve the same without an integral using the "model.add_explicit_rhs" function on the yc variable with rhs value equal to Fy (or Fy, I do not remember exactly).Regarding the term"([Fx/area,0]*rot_der(phi))*(X[xc;yc])*Test_phi"I am not 100% sure about. This is the part based on intuition and some partial understanding of what you want to achieve. You can give it a try, but if it doesn't work please provide a proper sketch of your system so that I can help you with deriving this equilibrium condition correctly.BRKostasOn Fri, Apr 15, 2022 at 1:51 PM Raphaël Meunier <raphael.meunier1@gmail.com> wrote:Dear Kostas,
Thank you for your response. As my intuition is not as sharp as yours, I might need a few explanations:
 md.add_nonlinear_term(mim, "(urot(phi)*(X[xc;yc])).mult", HoleZone) > This order zero term seems pretty straightforward and much more readable than in my code
 md.add_linear_term(mim, "Fy/area*Test_yc", HoleZone) > No multiplier is involved in your formulation. Is this because we need to combine this term with the previous order 0 term ((rot(phi)*([0;1])).mult)*Test_yc (and check the sign) ?
 md.add_linear_term(mim, "([Fx/area,0]*rot_der(phi))*(X[xc;yc])*Test_phi", HoleZone) > Could you explain how do you come up with this term ?
 A more general question: Is it possible to formulate the whole condition as an order 0 term ?
Thanks in advance,Best regardsRaphaëlLe mer. 6 avr. 2022 à 23:14, Konstantinos Poulios <logari81@googlemail.com> a écrit :Dear Raphaël,Interesting question. Prescribing Fx is a bit strange condition. I haven't checked it, but I think something like this should work:md.add_initialized_data("Fx", 10.)
md.add_initialized_data("Fy", 100.)
md.add_initialized_data("xc", 0.)
md.add_variable("yc", 1)
md.set_variable("yc", yc)
md.add_variable("phi",1)
md.set_variable("phi", 0.)
md.add_fem_variable("u", mfu)
md.add_filtered_fem_variable("mult", mfu, HoleZone)
md.add_macro("rot(x)", "[cos(x)1,sin(x);sin(x),cos(x)1]")
md.add_macro("rot_der(x)", "[sin(x),cos(x);cos(x),sin(x)]")
md.add_initialized_data("area", gf.asm_generic(mim, 0, "1", HoleZone)) # Calculate the area of the region
md.add_nonlinear_term(mim, "(urot(phi)*(X[xc;yc])).mult", HoleZone)
md.add_linear_term(mim, "Fy/area*Test_yc", HoleZone) # check if a minus sign is needed
md.add_linear_term(mim, "([Fx/area,0]*rot_der(phi))*(X[xc;yc])*Test_phi", HoleZone) # check if a minus sign is needed
for time in [0,0.1,0.3,0.6,0.9]:
md.set_variable("xc", speed*time)
md.solve("noisy")A bit based on intuition but you can certainly learn something from analyzing this suggestion. Let us discuss it further if you cannot get it to work and have more questions. Try to avoid expressions like "speed*time" and "alpha*time" in your expressions, they seem too specific to constant velocities, they make the code more difficult to read, and they will not help you to generalize the code later. Just solve for positions/angles directly if that's what you want.FYI, the _expression_(urot(phi)*(X[xc;yc])).multwill expand internally to something like(urot(phi)*(X[xc;yc])).Test_mult
+Test_u.mult
((rot_der(phi)*(X[xc;yc])).mult)*Test_phi
((rot(phi)*([0;1])).mult)*Test_ycBRKostasOn Wed, Apr 6, 2022 at 4:54 PM Raphaël Meunier <raphael.meunier1@gmail.com> wrote:Dear GetfemUsers,I am trying to impose a rolling condition on a "tire". My work is directly inspired from the "Example of wheel in contact" tutorial. In this tutorial, one wants to prescribe the rim rigidity and the vertical force. From this, I just have to add a rolling condition. Specifically I want to find the rotation speed "alpha_rot" that enables me to impose some force Fx:gwfl_rot='lambda_D.Test_u + ([cos(alpha_rot*time),sin(alpha_rot*time);sin(alpha_rot*time),cos(alpha_rot*time)]*(X[0;y_c])(X[0;y_c])\
+ [speed*time;alpha_y]  u).Test_lambda_D +(lambda_D.[1;0] + Fx)*Test_alpha_rot + 1E6*alpha_rot*Test_alpha_rot'
gwfl_y='(lambda_D.[0;1] + Fy)*Test_alpha_y + 1E6*alpha_y*Test_alpha_y'
roll_gwfl=gwfl_y+gwfl_rot
idBrick = model.add_nonlinear_term(mim, roll_gwfl, HoleZone)Where alpha_rot and alpha_y are the "parameters" I am trying to find. This works for up to ten timesteps but then it diverges... I tried to use two multipliers instead of one which leads to worse results.Am I on the right track ? Is there a better way to achieve this ?Thanks in advance,Best regards,Raphaël
demo_wheel_contact.py
Description: Text Data
[Prev in Thread]  Current Thread  [Next in Thread] 