I think the earlier point about trying to do a point wise result is well taken but
extending on your idea I guess you also flag the dofs that make up the boundary,
The IND result appears to select the boundary dofs, fwiw.
load "msh3"
load "medit"
load "isoline"
load "mjm_dscope_freefem"
real szx=100;
real szy=100;
int nx=50;
int ny=50;
int nc=30;
real r=20;
real[int,int] cp(2,nc);
for(int i=0; i<nc; ++i)
{ real t=1.0*i/nc; cp(0,i)=r*cos(t*2.0*pi); cp(1,i)=r*sin(t*2.0*pi); }
border left(t=0, 1){x=-szx/2; y=szy*(t-.5);label=1; }
border top(t=0, 1){x=szx*(t-.5);y=szy/2; label=2; }
border right(t=0, 1){x=szx/2; y=-szy*(t-.5);label=3; }
border bottom(t=0, 1){x=-szx*(t-.5);y=-szy/2; label=4; }
border mycircle(t=0, 1){
P=Curve(cp, 0, nc-1, t);
label=5;
}// EOM
mesh Th = buildmesh(left(-ny)+top(-nx)+right(-nx)+bottom(-ny)+mycircle(nc));
//plot(Th);
//medit("mesh",Th);
fespace Vh(Th,P1);
Vh p,q,ind;
Vh T=x*x;
// https://community.freefem.org/t/rate-of-change-in-temperature-at-everypoint-on-a-heated-circle/2708/6
varf vIND(ind,q) = on(5, ind = 5 );
varf vHF(p,q) = on(5, p = N.x*dx(T) + N.y*dy(T));
Vh HF,IND;
IND[] = vIND(0,Vh,tgv=1);
HF[] = vHF(0,Vh,tgv=1);
cout << " n = "<<HF[].n<<endl;
cout << " ind = "<<IND[]<<endl;
//medit("ind",Th,IND);
/*
meshL Th1=Sline(1024,[x]);
fespace Mh(Th1,P1);
Mh asol=uh(x,x);
Mh anex=uex(x,x);
Mh diff=anex-asol; // =uex(x,x);
//mjmdscopeL(Th1,"names asol anex diff "+nn,asol,anex,diff,"asdf"); // warning do not forget ()
mjmdscopeL(Th1,"names asol anex diff "+nn,asol,anex,diff,"asdf"); // warning do not forget ()
*/
//mjmdscopeL(Th1,"names asol anex diff "+nn,asol,anex,diff); // warning do not forget ()