# How to Access Appropriate Triangles in the Mesh

Hi everyone!

I am not sure if I am implementing the correct code for this problem:

For my case, denote g1=\gamma, gdiv =\gamma. The domain \Omega lies inside the rectangular domain O, where \Gamma:=\partial\Omega. Denote T be the triangles inside the mesh and \mathcal{T}_h^O, be a quasi uniform mesh consisting of triangles of max diameter h on O and consider also the following :

• \mathcal{T}_h = \{T\in\mathcal{T}_h^O: T\cap \Omega\neq \emptyset \}
• \Omega_h = (\cup_{T\in\mathcal{T}_h}T), where its boundary is $Gamma_h$
• \mathcal{T}_h^\Gamma = \{T\in\mathcal{T}_h: T\cap \Gamma = \emptyset \}
• \Omega_h^\Gamma = (\cup_{T\in\mathcal{T}_h^\Gamma}T), where its internal boundary is \Gamma_h^i

My questions are:

• Is it possible to access the triangles defined on \Omega_h, \Omega_h^\Gamma, \Gamma_h and \Gamma_h^i?
• Which set satisfies the FreeFem command int1d(Th, levelset=phi)/int2d(Th, levelset=phi), where \Omega is the zero level set of \phi?

I really need to differentiate the integrals on these sets. I attempted to code the above variational formulation.

varf va1 (u, v) = int2d(Th,levelset=phi)(((dx(u) * dx(v)) + (dy(u)*dy(v))))
+ int1d(Th,levelset=phi)(g1*((dx(u)*dx(v)) + (dy(u)*dy(v))))
+ intalledges(Th)(delta*diam*(jump(dn(u))*jump(dn(v))));
varf va2 (yh1, zh1) = int1d(Th, levelset=phi)(gdiv*dx(yh1)*dx(zh1))
+ int1d(Th,levelset=phi)(g1*yh1*zh1);
varf va3 (yh2, zh2) = int1d(Th, levelset=phi)(gdiv*dy(yh2)*dy(zh2))
+ int1d(Th,levelset=phi)(g1*yh2*zh2);
varf va4 (yh1, zh2) = int1d(Th, levelset=phi)(gdiv*dx(yh1)*dy(zh2));
varf va5 (yh2, zh1) = int1d(Th, levelset=phi)(gdiv*dy(yh2)*dx(zh1));
varf va6 (yh1, v) = int1d(Th, levelset=phi)(g1*yh1*dx(v));
varf va7 (yh2, v) = int1d(Th, levelset=phi)(g1*yh2*dy(v));
varf va8 (u, zh1) = int1d(Th, levelset=phi)(g1*dx(v)*zh1);
varf va9 (u, zh2) = int1d(Th, levelset=phi)(g1*dy(v)*zh2);
varf vL1 (u, v) = int2d(Th,levelset=phi)(f*v)
+ int1d(Th,levelset=phi)(g*v);
varf vL2 (yh1, zh1) = int1d(Th,levelset=phi)(gdiv*f*dx(zh1));
varf vL3 (yh1, zh2) = int1d(Th,levelset=phi)(gdiv*f*dy(zh2));
varf vb (u, v) = int1d(Th,levelset=phi)(1.*v);

matrix A1 = va1(Vh, Vh);
matrix A2 = va2(Vh, Vh);
matrix A3 = va3(Vh, Vh);
matrix A4 = va4(Vh, Vh);
matrix A5 = va5(Vh, Vh);
matrix A6 = va6(Vh, Vh);
matrix A7 = va7(Vh, Vh);
matrix A8 = va8(Vh, Vh);
matrix A9 = va9(Vh, Vh);
real[int] b1 = vL1(0, Vh);
real[int] b2 = vL2(0, Vh);
real[int] b3 = vL3(0, Vh);

real[int] bb(3*p+1), xx(3*p+1), l(2*p+1);
bb = [b1, b2, b3, 0.0];

real[int] bd = vb(0, Vh);
real[int] B(3*p);
B(0:p-1)=bd;// rhs part for ut1
B(p:3*p-1)=0.0;     // rhs part for pt
verbosity=0;
// Block matrix
matrix A = [[A1,A6,A7], [A8,A2,A5], [A9,A4,A3]];
matrix<real> AA = [ [ A, B ], [ B', 0.0 ] ];
set(AA, solver=CG);
// Solve and set values
xx = AA^-1 * bb;
[u[],l] = xx;


I am not sure if this is the correct approximation of the solution u.
Thank you.

Hello, I don’t know if it will solve your problem, but to differenciate each triangle on my mesh, I do the following:

int globalH = 2;
mesh P = square(globalH,globalH);

int NbTriangles = P.nt; //number of triangles

fespace V0(P,P0);
V0 u0;

//---------------------------get triangle numbering
real[int] elemGlobal(NbTriangles);
for(int i = 0; i < NbTriangles; i++){
u0[][i] = i;
}