Hello, I want to call multiple macros inside a loop but the macros only run at the first iteration and then they just get skipped every time they get called again.
I think the issue might be with the way I set up the macros
One of them follows bellow.
macro Elasticityfunc //
;
//Mesh
real 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=2;} // bottom of beam
border c(t=0, 2){x=10; y=t ;label=1;} // rigth beam
border d(t=0, 4){x=10-t; y=2; label=4;} // top beam
border d1(t=4, 5){x=10-t; y=2; label=3;} // Area where forces are applied
border d2(t=5,10) { x=10-t; y=2;label=4; };
real sigma = 0.29;
real gravity = 0;
mesh th = buildmesh(b(20) + c(5) + d(9) + a(5)+d1(2)+d2(9),fixeborder=1);
plot(th,wait=1);
//fespace Ph(th,P0); // constant par triangle
//Ph E;
// Fespace
fespace Vh(th, P2);
Vh uu, vv, w, s;
fespace Ph(th,P2);
Ph E;
real[int] Estart1(E.n);
{
ifstream Ein("E.txt");
Ein >> Estart1;
}
for(int i=0; i < E.n; i++){
E[](i) = Estart1(i);
}
// 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 F1=0;
func F2=-0.3;
func mu = E/(2*(1 + sigma));
func lambda = E*sigma/((1 + sigma)*(1 - 2*sigma));
//cout << "Lambda = " << lambda << endl;
//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
- int1d(th,3)( F1*w + F2*s )
+ on(1, uu=0, vv=0)
;
//cout << "Max displacement = " << uu[](386) << endl;
cout << "Max displacement = " << vv[].linfty << 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);
//Stiffness Matrix
varf bin(uu,vv) = int2d(th)(dx(uu) * dx(vv) + dy(uu) * dy(vv));
matrix K = bin(Vh, Vh);
real[int] U(uu.n * 2);
real[int] ux(uu.n);
real[int] uy(vv.n);
for(int i=0; i < K.n; i++){
U(2*i) = uu[](i);
U(2*i+1) = vv[](i);
ux(i) = uu[](i);
uy(i) = vv[](i);
}
real[int] f1(K.n);
real[int] f2(K.n);
f1 = K * ux;
f2 = K * uy;
real[int] F(K.n * 2);
for(int i=0; i < K.n; i++){
F(i) = f1(i);
F(2*i) = f2(i);
}
//for(int i=0; i < E.n; i++){
// E2(i) = E[](i);
//}
{ofstream fout("U.txt");
fout << U << endl;
}
{ofstream fout("ux.txt");
fout << ux << endl;
}
{ofstream fout("uy.txt");
fout << uy << endl;
}
{ofstream fout("f1.txt");
fout << f1;
}
{ofstream fout("f2.txt");
fout << f2 << endl;
}
//cout << "Result = " << K.n << endl;
{ofstream fout("Stiffness_matrix.matrix");
fout << K << endl;
}
//End