mesh Th=square(10,10);
fespace Xh(Th,P2),Mh(Th,P1);
Xh u1,u2,v1,v2;
Mh p,q,ppp; ///pppはworking pressure
varf bx(u1,q) = int2d(Th)( (dx(u1)*q));
varf by(u1,q) = int2d(Th)( (dy(u1)*q));
varf a(u1,u2)= int2d(Th)( dx(u1)*dx(u2) + dy(u1)*dy(u2) )
+ on(1,2,4,u1=0) + on(3,u1=1) ; //境界条件
matrix A= a(Xh,Xh,solver=CG);
matrix Bx= bx(Xh,Mh);
matrix By= by(Xh,Mh);
Xh bc1; bc1[] = a(0,Xh);
Xh bcx=1,bcy=0;
Xh b;
func real[int] divup(real[int] & pp)
{
int verb=verbosity;
verbosity=0;
b[] = Bx'*pp; b[] += bc1[] .*bcx[]; u1[] = A^-1*b[]; //u1(pp)を計算
b[] = By'*pp; b[] += bc1[] .*bcy[]; u2[] = A^-1*b[]; //u2(pp)を計算
ppp[] = Bx*u1[];
ppp[] += By*u2[];
verbosity=verb;
return ppp[] ;
};
p=0;q=0;u1=0;v1=0;
LinearCG(divup,p[],q[],eps=1.e-6,nbiter=50); //共役勾配法を呼ぶ
divup(p[]);
plot([u1,u2],p,wait=1,value=true,coef=0.1);