So instead of fixing the left edge by saying
on(4, u = 0, v =0)
I want to assign a force that depends on the displacement. That is a simple string force with a high stiffness coefficient.
This was my attempt:
// Parameters
real E = 2230e6;
real nu = 0.4;
real f = 10e4;
real k = 1e6;
// Mesh
mesh Th = square(5, 2, [x,y * 0.5]);
// Fespace
fespace Vh(Th, P2);
Vh u, v, vold, uold;
Vh uu, vv;
Vh sxx, syy, sxy;
Vh rx, ry;
// Macro
real sqrt2=sqrt(2.);
macro epsilon(u1,u2) [dx(u1),dy(u2),(dy(u1)+dx(u2))/sqrt2] //
// The sqrt2 is because we want: epsilon(u1,u2)'* epsilon(v1,v2) = epsilon(u): epsilon(v)
macro div(u,v) ( dx(u)+dy(v) ) //
for (int i = 0; i < Th.nv; i++){
uold[](i) = Th(i).x;
vold[](i) = Th(i).y;
}
// Problem
real mu= E/(2*(1+nu));
real lambda = E*nu/((1+nu)*(1-2*nu));
solve lame([u, v, uold, vold], [uu, vv])
= int2d(Th)(
lambda * div(u, v) * div(uu, vv)
+ 2.*mu * ( epsilon(u,v)' * epsilon(uu,vv) )
)
- int1d(Th, 2)(
f*uu
)
- int1d(Th, 4)([k * 1000 * (u - uold), k * (v - vold)]' * [uu, vv])
// + on(4, u=0)
// + on(4, u=0)
// + on(1, v=0)
;
But it does not seem to work, for some reason. Is there any other way to do this? I don’t seem to be able to figure it out.