Dear @frederichecht, @prj Sir,
I am trying to formulate the non-linear equation based on your suggestions and link provide before.
relevant problem by frederichecht
I am trying to solve the same problem base on the suggestion and adopted the procedure given by prj Problem link and Research problem by frederichecht.
but, unfortunately, the error at each iteration not decreasing after step passing.
Kindly Suggest me to fix it (Convergence ):
// all coefficient used in problem
real Ra = 1e6;
real Pr = 0.71;
real Da = 1e-5;
real pRaPr = Ra*Pr;
real dPrDa = Pr/Da;
real[int] aRa = [1e3];
int nn = 20;
real ccc = 1.5;//2.;
macro fff(x) ((1+tanh(ccc*(x*2-1))/tanh(ccc))/2)//
mesh Th=square(nn,nn,[x,(y*(1-x*0.0))]);
plot(Th,wait=1);
// finite element fespace
fespace Vh(Th,[P2,P2,P1,P2]);
Vh [u1, u2, p, T];
Vh [uw1, uw2, pw, Tw];
Vh [v1, v2, q, TT];
//macro list used in the problem
macro div(u1, u2) ( dx(u1) + dy (u2) ) //
macro grad( u ) [ dx(u), dy(u) ] //
macro Grad(u1, u2) [ grad(u1), grad(u2) ] //
macro Ugradv(u1, u2, v) ([ u1, u2 ]'* grad(v)) //
macro UgradV(u1,u2, v1, v2 ) [Ugradv(u1, u2, v1), Ugradv(u1, u2, v2)] //
problem porous( [ uw1, uw2, pw, Tw] , [ v1, v2, q, TT] ) =
int2d(Th)( UgradV(uw1, uw2, u1, u2)'*[v1, v2] +
UgradV(u1, u2, uw1, uw2)'*[v1, v2]
- q*div(uw1, uw2)
- pw*div(v1, v2)
+ Pr* (Grad(uw1, uw2): Grad(v1, v2))
+ dPrDa * [uw1, uw2]'*[v1, v2]
- pRaPr * v2*Tw
+Ugradv(uw1, uw2, T)* TT
+Ugradv(u1, u2, Tw)* TT
+ grad(Tw)'*grad(TT)
+ 1e-8 * pw* q)
- int2d(Th) ( UgradV(u1,u2,u1,u2)'* [v1, v2]
- q*div(u1, u2)
- p* div(v1, v2)
+Pr*(Grad(u1,u2):Grad(v1,v2))
+ dPrDa* [u1, u2]'*[v1, v2]
-pRaPr*(T*v2)
+Ugradv(u1, u2, T)*TT
+ grad(T)'*grad(TT)
+ 1e-8*p*q )
+ on(1, 2,3,4, uw1 =0, uw2 =0, pw =0 )
+ on(2,3, Tw = 0)
+ on(1, Tw = 1);
real err;
real tol = 1e-8;
bool Newton = true;
[u1, u2, p, T] =[0, 0, 0, 1];
for(int kkk=0; kkk<aRa.n; ++kkk)
{
for (int step = 0; step <100 ; ++step)
{
uw1[] = u1[];
uw2[] = u2[];
pw[] = p[];
Tw[] = T[];
// solving problem
porous;
u1[] = u1[] + uw1[];
u2[] = u2[] + uw2[];
p[] = p[] + pw[];
T[] = T[] + Tw[];
//plot([u1, u2], p, T, wait =1);
real Lu1 = u1[].l2, Lu2 = u2[].l2, Lp = p[].l2, LT = T[].l2;
err = uw1[].l2/Lu1 + uw2[].l2/Lu2 + pw[].l2/Lp + Tw[].l2/LT;
cout << "err value is"<< err<<endl;
if (err < tol) break;
if ( step >3 && err >10 ) break;
}
if(kkk==0) {
Th=square(nn,nn,[fff(x),fff(y)]);
// u1,u2,p,T privious mesh
[uw1,uw2,pw,Tw]=[0,0,0,0];// // up1,up2,pp,Tp
uw1[] = u1[];
uw2[] = u2[];
pw[] = p[];
Tw[] = T[];
// new mesh
[u1,u2,p,T]=[0,0,0,0];// // up1,up2,pp,Tp
u1[]=uw1[];
u2[] = uw2[];
p[] = pw[];
T[] = Tw[];
}
plot([u1,u2],T,wait=1,cmm="Ra ="+Ra);
}