add missing ingredient to tag faces for preserving/reconstructing face ids (surfnr, bcnr, domin, domout) via FaceDescriptor

This commit is contained in:
Bryn Lloyd 2019-03-04 14:46:11 +01:00
parent 0d83ea01cd
commit 0be72fb374
2 changed files with 82 additions and 10 deletions

View File

@ -241,9 +241,52 @@ namespace nglib
}
DLL_HEADER void Ng_ClearFaceDescriptors (Ng_Mesh * ng_mesh)
{
Mesh * mesh = (Mesh*)ng_mesh;
mesh->ClearFaceDescriptors();
}
DLL_HEADER int Ng_AddFaceDescriptor (Ng_Mesh * ng_mesh, int surfnr, int domin, int domout, int bcp)
{
Mesh * mesh = (Mesh*)ng_mesh;
int nfd = mesh->GetNFD();
int faceind = 0;
for (int j = 1; j <= nfd; j++)
{
if (mesh->GetFaceDescriptor(j).SurfNr() == surfnr
&& mesh->GetFaceDescriptor(j).BCProperty() == bcp
&& mesh->GetFaceDescriptor(j).DomainIn() == domin
&& mesh->GetFaceDescriptor(j).DomainOut() == domout)
{
faceind = j;
break;
}
}
if (!faceind)
{
faceind = mesh->AddFaceDescriptor (FaceDescriptor(surfnr, domin, domout, 0));
mesh->GetFaceDescriptor(faceind).SetBCProperty (bcp);
}
return faceind;
}
DLL_HEADER void Ng_SetupFacedescriptors (Ng_Mesh * mesh, int maxbc)
{
Mesh * m = (Mesh*)mesh;
m->ClearFaceDescriptors();
for (int i = 1; i <= maxbc; i++)
m->AddFaceDescriptor (FaceDescriptor (i, 0, 0, i));
}
// Manually add a surface element of a given type to an existing mesh object
DLL_HEADER void Ng_AddSurfaceElement (Ng_Mesh * mesh, Ng_Surface_Element_Type et,
int * pi, int domain)
int * pi, int facenr)
{
int n = 3;
switch (et)
@ -263,7 +306,7 @@ namespace nglib
Mesh * m = (Mesh*)mesh;
Element2d el (n);
el.SetIndex (domain);
el.SetIndex (facenr);
for (int i=0; i<n; ++i)
el.PNum(i+1) = pi[i];
m->AddSurfaceElement (el);
@ -338,11 +381,23 @@ namespace nglib
}
DLL_HEADER bool Ng_GetFaceDescriptor (Ng_Mesh * mesh, int facenr, int &surfnr, int &domin, int &domout, int &bcp)
{
Mesh * m = (Mesh*)mesh;
if (facenr <= m->GetNFD())
{
surfnr = m->GetFaceDescriptor(facenr).SurfNr();
domin = m->GetFaceDescriptor(facenr).DomainIn();
domout = m->GetFaceDescriptor(facenr).DomainOut();
bcp = m->GetFaceDescriptor(facenr).BCProperty();
return true;
}
return false;
}
// Return the surface element at a given index "pi"
DLL_HEADER Ng_Surface_Element_Type
Ng_GetSurfaceElement (Ng_Mesh * mesh, int num, int * pi, int * domain)
Ng_GetSurfaceElement (Ng_Mesh * mesh, int num, int * pi, int * facenr)
{
const Element2d & el = ((Mesh*)mesh)->SurfaceElement(num);
for (int i = 1; i <= el.GetNP(); i++)
@ -365,8 +420,8 @@ namespace nglib
default:
et = NG_TRIG; break; // for the compiler
}
if (domain)
*domain = el.GetIndex();
if (facenr)
*facenr = el.GetIndex();
return et;
}

View File

@ -370,6 +370,22 @@ DLL_HEADER void Ng_AddPoint (Ng_Mesh * mesh, double * x);
*/
DLL_HEADER void Ng_AddLockedPoint(Ng_Mesh * mesh, int pi);
/*! \brief Remove any existing face descriptors
*/
DLL_HEADER int Ng_AddFaceDescriptor (Ng_Mesh * ng_mesh, int surfnr, int domin, int domout, int bcp);
/*! \brief Remove any existing face descriptors
*/
DLL_HEADER void Ng_ClearFaceDescriptors (Ng_Mesh * ng_mesh);
/*! \brief Generate simple facedescriptors, with facenr==bc, from 1...maxbc
*/
DLL_HEADER void Ng_SetupFacedescriptors(Ng_Mesh * mesh, int maxbc);
/*! \brief Add a surface element to a given Netgen Mesh Structure
This function allows the top-level code to directly add individual
@ -389,8 +405,9 @@ DLL_HEADER void Ng_AddLockedPoint(Ng_Mesh * mesh, int pi);
#Ng_Surface_Element_Type
\param pi Pointer to an array of integers containing the indices of the
points which constitute the surface element being added
\param facenr Index of face descriptor. Used e.g. to attach boundary condition types to surface elements
*/
DLL_HEADER void Ng_AddSurfaceElement (Ng_Mesh * mesh, Ng_Surface_Element_Type et, int * pi, int domain=1);
DLL_HEADER void Ng_AddSurfaceElement (Ng_Mesh * mesh, Ng_Surface_Element_Type et, int * pi, int facenr=1);
/*! \brief Add a volume element to a given Netgen Mesh Structure
@ -597,10 +614,12 @@ DLL_HEADER int Ng_GetNE (Ng_Mesh * mesh);
DLL_HEADER void Ng_GetPoint (Ng_Mesh * mesh, int num, double * x);
// return bcp and surfnr for specified face descriptor (facenr)
DLL_HEADER bool Ng_GetFaceDescriptor (Ng_Mesh * mesh, int facenr, int &surfnr, int &domin, int &domout, int &bcp);
// return surface and volume element in pi
DLL_HEADER Ng_Surface_Element_Type
Ng_GetSurfaceElement (Ng_Mesh * mesh, int num, int * pi, int * domain = nullptr);
Ng_GetSurfaceElement (Ng_Mesh * mesh, int num, int * pi, int * facenr = nullptr);
DLL_HEADER Ng_Volume_Element_Type
Ng_GetVolumeElement (Ng_Mesh * mesh, int num, int * pi, int * domain = nullptr);
@ -655,8 +674,6 @@ DLL_HEADER Ng_Result Ng_GenerateMesh_2D (Ng_Geometry_2D * geom,
Ng_Meshing_Parameters * mp);
// functions added to make Optimize2d mesh accessible from nglib
DLL_HEADER void Ng_SetupFacedescriptors(Ng_Mesh * mesh, int maxdomnr);
DLL_HEADER void Ng_AddTriangle_2D(Ng_Mesh * mesh, int pi1, int pi2, int pi3, int matnum = 1);
DLL_HEADER Ng_Result Ng_OptimizeMesh_2D(Ng_Mesh *mesh, Ng_Meshing_Parameters * mp);