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, "(u-rot(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_
(u-rot(phi)*(X-[xc;yc])).mult
will expand internally to something like
(u-rot(phi)*(X-[xc;yc])).Test_mult
+Test_u.mult
-((rot_der(phi)*(X-[xc;yc])).mult)*Test_phi
-((rot(phi)*([0;1])).mult)*Test_yc
BR
Kostas