11 Nov 2007

Official Asymptote example – advection

 (Compiled with Asymptote version 2.14svn-r5318)
/* This code comes from The Official Asymptote Gallery */

size(0,22cm);

texpreamble("
\usepackage{bm}
\def\v{\bm}
\def\grad{\v\nabla}
\def\cross{{\v\times}}
\def\curl{\grad\cross}
\def\del{\nabla}
");

defaultpen(fontsize(10pt));

real margin=1.5mm;

object IC=draw("initial condition $\v U_0$",box,(0,1),
margin,black,FillDraw(palegray));
object Adv0=draw("Lagrangian state $\v U(t)$",ellipse,(1,1),
margin,red,FillDraw(palered));
object Adv=draw("Lagrangian prediction $\v U(t+\tau)$",ellipse,(1,0),
margin,red,FillDraw(palered));
object AdvD=draw("diffused parcels",ellipse,(1.8,1),
margin,red,FillDraw(palered));
object Ur=draw("rearranged $\v \widetilde U$",box,(0,0),
margin,orange+gray,FillDraw(paleyellow));
object Ui=draw("interpolated $\v \widetilde U$",box,(1,-1),
margin,blue,FillDraw(paleblue));
object Crank=draw("${\cal L}^{-1}(-\tau){\cal L}(\tau)\v \widetilde U$",
box,(0.5,-1),margin,blue,FillDraw(paleblue));
object CrankR=draw("${\cal L}^{-1}(-\tau){\cal L}(\tau)\v \widetilde U$",
box,(0,-1),margin,orange+gray,FillDraw(paleyellow));
object Urout=draw(minipage("\center{Lagrangian rearranged solution~$\v U_R$}",
100pt),box,(0,-2),margin,orange+gray,
FillDraw(paleyellow));
object Diff=draw("$\v D\del^2 \v \widetilde U$",box,(0.75,-1.5),
margin,blue,FillDraw(paleblue));
object UIout=draw(minipage("\center{semi-Lagrangian solution~$\v U_I$}",80pt),
box,(0.5,-2),margin,FillDraw(palered+paleyellow));
object psi=draw("$\psi=\del^{-2}\omega$",box,(1.6,-1),
margin,darkgreen,FillDraw(palegreen));
object vel=draw("$\v v=\v{\hat z} \cross\grad\psi$",box,(1.6,-0.5),
margin,darkgreen,FillDraw(palegreen));

add(new void(frame f, transform t) {
pair padv=0.5*(point(Adv0,S,t)+point(Adv,N,t));
picture pic;
draw(pic,"initialize",point(IC,E,t)--point(Adv0,W,t),RightSide,Arrow,
PenMargin);
draw(pic,minipage("\flushright{advect: Runge-Kutta}",80pt),
point(Adv0,S,t)--point(Adv,N,t),RightSide,red,Arrow,PenMargin);
draw(pic,Label("Lagrange $\rightarrow$ Euler",0.45),
point(Adv,W,t)--point(Ur,E,t),5LeftSide,orange+gray,
Arrow,PenMargin);
draw(pic,"Lagrange $\rightarrow$ Euler",point(Adv,S,t)--point(Ui,N,t),
RightSide,blue,Arrow,PenMargin);
draw(pic,point(Adv,E,t)--(point(AdvD,S,t).x,point(Adv,E,t).y),red,
Arrow(Relative(0.7)),PenMargin);
draw(pic,minipage("\flushleft{diffuse: multigrid Crank--Nicholson}",80pt),
point(Ui,W,t)--point(Crank,E,t),5N,blue,MidArrow,PenMargin);
draw(pic,minipage("\flushleft{diffuse: multigrid Crank--Nicholson}",80pt),
point(Ur,S,t)--point(CrankR,N,t),LeftSide,orange+gray,Arrow,PenMargin);
draw(pic,"output",point(CrankR,S,t)--point(Urout,N,t),RightSide,
orange+gray,Arrow,PenMargin);
draw(pic,point(Ui,S,t)--point(Diff,N,t),blue,MidArrow,PenMargin);
draw(pic,point(Crank,S,t)--point(Diff,N,t),blue,MidArrow,PenMargin);
label(pic,"subtract",point(Diff,N,t),12N,blue);
draw(pic,Label("Euler $\rightarrow$ Lagrange",0.5),
point(Diff,E,t)--(point(AdvD,S,t).x,point(Diff,E,t).y)--
(point(AdvD,S,t).x,point(Adv,E,t).y),RightSide,blue,
Arrow(position=1.5),PenMargin);
dot(pic,(point(AdvD,S,t).x,point(Adv,E,t).y),red);
draw(pic,(point(AdvD,S,t).x,point(Adv,E,t).y)--point(AdvD,S,t),red,Arrow,
PenMargin);
draw(pic,"output",point(Crank,S,t)--point(UIout,N,t),RightSide,brown,Arrow,
PenMargin);
draw(pic,Label("$t+\tau\rightarrow t$",0.45),
point(AdvD,W,t)--point(Adv0,E,t),2.5LeftSide,red,Arrow,PenMargin);
draw(pic,point(psi,N,t)--point(vel,S,t),darkgreen,Arrow,PenMargin);
draw(pic,Label("self-advection",4.5),point(vel,N,t)--
arc((point(vel,N,t).x,point(Adv,E,t).y),5,270,90)--
(point(vel,N,t).x,padv.y)--
padv,LeftSide,darkgreen,Arrow,PenMargin);
draw(pic,Label("multigrid",0.5,S),point(Ui,E,t)--point(psi,W,t),darkgreen,
Arrow,PenMargin);

add(f,pic.fit());
});



Étiquettes :