// example29.edp, from file chapt3/convects.edp // speedup of example28.edp // With Discontinuous Galerkin border C(t=0, 2*pi) { x=cos(t); y=sin(t); }; mesh Th = buildmesh(C(100)); fespace Vh(Th,P1dc); Vh w, ccold, v1 = y, v2 = -x, cc = exp(-10*( (x-0.3)^2 + (y-0.3)^2) ); real u, alpha=0.5, dt = 0.05; macro n()(N.x*v1 + N.y*v2) // // the same DG very much faster varf aadual(cc, w) = int2d(Th)( (cc/dt + (v1*dx(cc) + v2*dy(cc)) )*w ) + intalledges(Th)( (1-nTonEdge)*w*( alpha*abs(n) - n/2 )*jump(cc) ); varf bbdual(ccold, w) = - int2d(Th)( ccold*w/dt); real [int] viso=[-0.1, 0, 0.5, 0.1, 0.5, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.9, 1]; bool reuseMatrix = false; matrix AA = aadual(Vh,Vh); matrix BB = bbdual(Vh,Vh); set (AA, init=reuseMatrix, solver=UMFPACK); Vh rhs=0; for (real t=0; t< 2*pi ; t+=dt) { ccold = cc; rhs[] = BB * ccold[]; cc[] = AA^-1 * rhs[]; reuseMatrix = true; plot(cc, fill=true, dim=3, viso=viso, cmm="t="+t + ", min=" + cc[].min + ", max=" + cc[].max); }; plot(cc,wait=true,fill=false,value=true,viso=viso, cmm="example29, min=" + cc[].min + ", max=" + cc[].max);