    // Poisson's Equation
    // Example taken from https://doc.freefem.org/examples/misc.html

    // Parameters
    int nn = 20;
    real L = 1.;
    real H = 1.;
    real l = 0.5;
    real h = 0.5;

    func f = 1.;
    func g = 0.;

    int NAdapt = 10;

    // Mesh
    border b1(t=0, L){x=t; y=0;};
    border b2(t=0, h){x=L; y=t;};
    border b3(t=L, l){x=t; y=h;};
    border b4(t=h, H){x=l; y=t;};
    border b5(t=l, 0){x=t; y=H;};
    border b6(t=H, 0){x=0; y=t;};

    mesh Th = buildmesh(b1(nn*L) + b2(nn*h) + b3(nn*(L-l)) + b4(nn*(H-h)) + b5(nn*l) + b6(nn*H));

    // Fespace
    fespace Vh(Th, P1); // Change P1 to P2 to test P2 finite element
    Vh u, v;

    // Macro
    macro grad(u) [dx(u), dy(u)] //

    // Problem
    problem Poisson (u, v, solver=CG, eps=-1.e-6)
       = int2d(Th)(
            grad(u)' * grad(v)
       )
       + int2d(Th)(
            f * v
       )
       + on(b1, b2, b3, b4, b5, b6, u=g)
       ;

    // Mesh adaptation iterations
    real error = 0.1;
    real coef = 0.1^(1./5.);
    for (int i = 0; i < NAdapt; i++){
       // Solve
       Poisson;

       // Plot
       plot(Th, u);

       // Adaptmesh
       Th = adaptmesh(Th, u, inquire=1, err=error);
       error = error * coef;
    }