I’ve been studying this documentation about calculating the stiffness matrix. When I use the boundary restrictions of my mesh I get an error saying:
We expected an unknown u=... of the problem
current line = 59
I have my code bellow. Also I would like to calculate the internal forces by using the equation F=K*U though because I used the elasticity to calculate the displacement I have two arrays of ux and uy while my displacement is a matrix. I know how to convert a finite element space to two arrays, is there any way to do the opposite so I can calculate F?
//macro Elasticityfunc(E1)
// Parameters
real E1 = 21.5;
real sigma = 0.29;
real gravity = 0;
// Mesh
int bottombeam = 2;
border a(t=2, 0){x=0; y=t ;label=1;} // left beam
border b(t=0, 10){x=t; y=0 ;label=bottombeam;} // bottom of beam
border c(t=0, 2){x=10; y=t ;label=1;} // rigth beam
border d(t=0, 10){x=10-t; y=2; label=3;} // top beam
real xp = 5,yp=1;
real[int,int] P=[[xp,yp]]; // add point (xp,yp) in a mesh ..
mesh th = buildmesh(b(20) + c(5) + d(20) + a(5),points=P,fixeborder=1);
plot(th,wait=1);
fespace Ph(th,P0); // constant par triangle
Ph E=E1;
// Fespace
fespace Vh(th, [P1, P1]);
Vh [uu, vv], [w, s];
// find midlle (xp,yp) dof
w[]=0:w[].n-1; // put dof number in array
int dof1=w(xp,yp)+0.5;
int dof2=s(xp,yp)+0.5;
assert( abs(dof1-w(xp,yp)) + abs(dof2-s(xp,yp)) < 1e-6);
cout << " dof "<< dof1 << " "<< dof2 << endl;
real[int] brhs(Vh.ndof); // the add rhs ..
brhs = 0;
brhs[dof2]= 10;
// Macro
real sqrt2 = sqrt(2.);
macro epsilon(u1, u2) [dx(u1), dy(u2), (dy(u1) + dx(u2))/sqrt2] // EOM
macro div(u, v) (dx(u) + dy(v)) // EOM
// Problem (with solve)
func mu = E/(2*(1 + sigma));
func lambda = E*sigma/((1 + sigma)*(1 - 2*sigma));
//Not used cout << "Lambda = " << lamda << endl;
//Not used cout << "Mu = " << mu << endl;
cout << "Gravity = " << gravity << endl;
solve Elasticity ([uu, vv], [w, s], solver=sparsesolver)
= int2d(th)(
lambda*div(w, s)*div(uu, vv)
+ 2.*mu*(epsilon(w, s)' * epsilon(uu, vv))
)
- int2d(th)(gravity*s)
+ brhs
+ on(1, uu=0, vv=0)
;
cout << "Max displacement = " << uu[].linfty << endl;
//Stiffness Matrix
varf bin(uu,vv) = int2d(th)(dx(uu) * dx(vv) + dy(uu) * dy(vv) ) + on (1, uu=0.0, vv=0.0 );
matrix an = bin(Vh, Vh);
//Print the matrices.
//cout << "\n";
//cout << " Matrix AD:\n";
//cout << " Stiffness matrix for system with Dirichlet conditions.\n";
//cout << "\n";
//cout << ad;
//cout << "\n";
//cout << " Matrix AN:\n";
//cout << " Stiffness matrix for system with Neumann conditions.\n";
//cout << "\n";
//cout << an;
//{ofstream fout("Stiffness_matrix.txt");
//fout << an << endl;
//}
//Plot
plot([uu, vv], wait=1);
//plot([uu, vv], wait=1, bb=[[-0.5, 2.5], [2.5, -0.5]]);
// Move mesh
mesh th1 = movemesh(th, [x+uu, y+vv]);
plot(th1, wait=1);