Asymptote/Command/graph/vectorfield

Draw a vectorfield along a path:

void vectorfield(picture pic=<default>, path g, int n, path vector(real), real arrowsize=<default>, real arrowlength=<default>, pen p=<default>);

Example:

import graph;
defaultpen(0.5);
size(400,200);

real arrowsize=1.5mm;
real arrowlength=15;

vector ampere=new path(real x){
    return (0,0)--arrowlength*(-1)*(2-3*cos(2*pi*x)^2)*(cos(2*pi*x),sin(2*pi*x))
;
};

vector tait=new path(real x){
    return (0,0)--arrowlength*(-1)*(-cos(2*pi*x),sin(2*pi*x));
};

vector grassmann=new path(real x){
    return (0,0)--arrowlength*(-1)*(0,sin(2*pi*x));
};

path p=unitcircle;
int n=24;
pen celmpen=currentpen+2;
path cell=(-0.4,0)--(0.4,0);

draw(p);
vectorfield(p,n,ampere,arrowsize);
draw(cell,celmpen,Arrow(4));
draw(shift(0,-1)*cell,celmpen,Arrow(4));
dot((0,0));
dot((0,-1));

label("Amp\`ere",(0,-1),S);

p=shift(3,0)*p;
cell=shift(3,0)*cell;
draw(p);

vectorfield(p,n,grassmann,arrowsize);
dot((3,0));
dot((3,-1));
label("Grassmann",(3,-1),S);
draw(cell,celmpen,Arrow(4));
draw(shift(0,-1)*cell,celmpen,Arrow(4));

p=shift(3,0)*p;
cell=shift(3,0)*cell;
draw(p);

vectorfield(p,n,tait,arrowsize);
dot((6,0));
dot((6,-1));
label("Tait",(6,-1),S);
draw(cell,celmpen,Arrow(4));
draw(shift(0,-1)*cell,celmpen,Arrow(4));