This commit is contained in:
Matthias Hochsteger 2021-07-16 18:59:18 +02:00
parent 8687b540c6
commit cf3963a357
6 changed files with 6 additions and 277 deletions

View File

@ -1545,7 +1545,7 @@ namespace netgen
PrintMessage (1, "Delaunay meshing"); PrintMessage (1, "Delaunay meshing");
PrintMessage (3, "number of points: ", mesh.GetNP()); PrintMessage (3, "number of points: ", mesh.GetNP());
PushStatus ("Delaunay meshing"); // PushStatus ("Delaunay meshing");
NgArray<DelaunayTet> tempels; NgArray<DelaunayTet> tempels;
@ -1675,6 +1675,6 @@ namespace netgen
mesh.FindOpenElements(domainnr); mesh.FindOpenElements(domainnr);
mesh.Compress(); mesh.Compress();
PopStatus (); // PopStatus ();
} }
} }

View File

@ -130,7 +130,7 @@ namespace netgen
return lh; return lh;
} }
unique_ptr<LocalH> LocalH :: CopyRec ( const Box<3> & bbox, GradingBox *current ) unique_ptr<LocalH> LocalH :: Copy( const Box<3> & bbox )
{ {
static Timer t("LocalH::Copy with bounding box"); RegionTimer rt(t); static Timer t("LocalH::Copy with bounding box"); RegionTimer rt(t);
auto lh = make_unique<LocalH>(boundingbox, grading, dimension); auto lh = make_unique<LocalH>(boundingbox, grading, dimension);

View File

@ -99,7 +99,7 @@ namespace netgen
~LocalH(); ~LocalH();
/// ///
unique_ptr<LocalH> Copy(); unique_ptr<LocalH> Copy();
unique_ptr<LocalH> Copy( const Box<3> & bbox ) { return CopyRec(bbox, root); } unique_ptr<LocalH> Copy( const Box<3> & bbox );
/// ///
void Delete(); void Delete();
/// ///

View File

@ -399,274 +399,6 @@ namespace netgen
bool res = (mesh.CheckConsistentBoundary() != 0); bool res = (mesh.CheckConsistentBoundary() != 0);
if (res) if (res)
{
// mesh.Save("output.vol");
PrintError ("Surface mesh not consistent");
throw NgException ("Stop meshing since surface mesh not consistent");
}
}
// OptimizeVolume( md.mp, mesh );
}
void MeshDomain(Mesh & mesh3d, const MeshingParameters & c_mp, int k, const Identifications & identifications)
{
MeshingParameters mp = c_mp; // copy mp to change them here
NgArray<INDEX_2> connectednodes;
int oldne;
int meshed;
if(mp.only3D_domain_nr && mp.only3D_domain_nr !=k)
return;
if (multithread.terminate)
return;
PrintMessage (2, "");
PrintMessage (1, "Meshing subdomain ", k, " of ", mesh3d.GetNDomains());
(*testout) << "Meshing subdomain " << k << endl;
mp.maxh = min2 (mp.maxh, mesh3d.MaxHDomain(k));
mesh3d.CalcSurfacesOfNode();
mesh3d.FindOpenElements(k);
if (!mesh3d.GetNOpenElements())
return;
Box<3> domain_bbox( Box<3>::EMPTY_BOX );
for (SurfaceElementIndex sei = 0; sei < mesh3d.GetNSE(); sei++)
{
const Element2d & el = mesh3d[sei];
if (el.IsDeleted() ) continue;
if (mesh3d.GetFaceDescriptor(el.GetIndex()).DomainIn() == k ||
mesh3d.GetFaceDescriptor(el.GetIndex()).DomainOut() == k)
for (int j = 0; j < el.GetNP(); j++)
domain_bbox.Add (mesh3d[el[j]]);
}
domain_bbox.Increase (0.01 * domain_bbox.Diam());
for (int qstep = 0; qstep <= 3; qstep++)
// for (int qstep = 0; qstep <= 0; qstep++) // for hex-filling
{
if (qstep == 0 && !mp.try_hexes) continue;
// cout << "openquads = " << mesh3d.HasOpenQuads() << endl;
if (mesh3d.HasOpenQuads())
{
string rulefile = ngdir;
const char ** rulep = NULL;
switch (qstep)
{
case 0:
rulefile = "/Users/joachim/gitlab/netgen/rules/hexa.rls";
rulep = hexrules;
break;
case 1:
rulefile += "/rules/prisms2.rls";
rulep = prismrules2;
break;
case 2: // connect pyramid to triangle
rulefile += "/rules/pyramids2.rls";
rulep = pyramidrules2;
break;
case 3: // connect to vis-a-vis point
rulefile += "/rules/pyramids.rls";
rulep = pyramidrules;
break;
}
// Meshing3 meshing(rulefile);
Meshing3 meshing(rulep);
MeshingParameters mpquad = mp;
mpquad.giveuptol = 15;
mpquad.baseelnp = 4;
mpquad.starshapeclass = 1000;
mpquad.check_impossible = qstep == 1; // for prisms only (air domain in trafo)
// for (PointIndex pi = mesh3d.Points().Begin(); pi < mesh3d.Points().End(); pi++)
for (PointIndex pi : mesh3d.Points().Range())
meshing.AddPoint (mesh3d[pi], pi);
/*
mesh3d.GetIdentifications().GetPairs (0, connectednodes);
for (int i = 1; i <= connectednodes.Size(); i++)
meshing.AddConnectedPair (connectednodes.Get(i));
*/
// for (int nr = 1; nr <= identifications.GetMaxNr(); nr++)
// if (identifications.GetType(nr) != Identifications::PERIODIC)
// {
// identifications.GetPairs (nr, connectednodes);
// for (auto pair : connectednodes)
// meshing.AddConnectedPair (pair);
// }
for (int i = 1; i <= mesh3d.GetNOpenElements(); i++)
{
Element2d hel = mesh3d.OpenElement(i);
meshing.AddBoundaryElement (hel);
}
oldne = mesh3d.GetNE();
meshing.GenerateMesh (mesh3d, mpquad);
for (int i = oldne + 1; i <= mesh3d.GetNE(); i++)
mesh3d.VolumeElement(i).SetIndex (k);
(*testout)
<< "mesh has " << mesh3d.GetNE() << " prism/pyramid elements" << endl;
mesh3d.FindOpenElements(k);
}
}
if (mesh3d.HasOpenQuads())
{
PrintSysError ("mesh has still open quads");
throw NgException ("Stop meshing since too many attempts");
// return MESHING3_GIVEUP;
}
if (mp.delaunay && mesh3d.GetNOpenElements())
{
Meshing3 meshing((const char**)NULL);
mesh3d.FindOpenElements(k);
/*
for (PointIndex pi = mesh3d.Points().Begin(); pi < mesh3d.Points().End(); pi++)
meshing.AddPoint (mesh3d[pi], pi);
*/
for (PointIndex pi : mesh3d.Points().Range())
meshing.AddPoint (mesh3d[pi], pi);
for (int i = 1; i <= mesh3d.GetNOpenElements(); i++)
meshing.AddBoundaryElement (mesh3d.OpenElement(i));
oldne = mesh3d.GetNE();
meshing.Delaunay (mesh3d, k, mp);
for (int i = oldne + 1; i <= mesh3d.GetNE(); i++)
mesh3d.VolumeElement(i).SetIndex (k);
PrintMessage (3, mesh3d.GetNP(), " points, ",
mesh3d.GetNE(), " elements");
}
int cntsteps = 0;
if (mesh3d.GetNOpenElements())
do
{
if (multithread.terminate)
break;
mesh3d.FindOpenElements(k);
PrintMessage (5, mesh3d.GetNOpenElements(), " open faces");
cntsteps++;
if (cntsteps > mp.maxoutersteps)
throw NgException ("Stop meshing since too many attempts");
string rulefile = ngdir + "/tetra.rls";
PrintMessage (1, "start tetmeshing");
// Meshing3 meshing(rulefile);
Meshing3 meshing(tetrules);
NgArray<int, PointIndex::BASE> glob2loc(mesh3d.GetNP());
glob2loc = -1;
// for (PointIndex pi = mesh3d.Points().Begin(); pi < mesh3d.Points().End(); pi++)
for (PointIndex pi : mesh3d.Points().Range())
if (domain_bbox.IsIn (mesh3d[pi]))
glob2loc[pi] =
meshing.AddPoint (mesh3d[pi], pi);
for (int i = 1; i <= mesh3d.GetNOpenElements(); i++)
{
Element2d hel = mesh3d.OpenElement(i);
for (int j = 0; j < hel.GetNP(); j++)
hel[j] = glob2loc[hel[j]];
meshing.AddBoundaryElement (hel);
// meshing.AddBoundaryElement (mesh3d.OpenElement(i));
}
oldne = mesh3d.GetNE();
mp.giveuptol = 15 + 10 * cntsteps;
mp.sloppy = 5;
meshing.GenerateMesh (mesh3d, mp);
for (ElementIndex ei = oldne; ei < mesh3d.GetNE(); ei++)
mesh3d[ei].SetIndex (k);
mesh3d.CalcSurfacesOfNode();
mesh3d.FindOpenElements(k);
// teterrpow = 2;
if (mesh3d.GetNOpenElements() != 0)
{
meshed = 0;
PrintMessage (5, mesh3d.GetNOpenElements(), " open faces found");
MeshOptimize3d optmesh(mp);
const char * optstr = "mcmstmcmstmcmstmcm";
for (size_t j = 1; j <= strlen(optstr); j++)
{
mesh3d.CalcSurfacesOfNode();
mesh3d.FreeOpenElementsEnvironment(2);
mesh3d.CalcSurfacesOfNode();
switch (optstr[j-1])
{
case 'c': optmesh.CombineImprove(mesh3d, OPT_REST); break;
case 'd': optmesh.SplitImprove(mesh3d, OPT_REST); break;
case 's': optmesh.SwapImprove(mesh3d, OPT_REST); break;
case 't': optmesh.SwapImprove2(mesh3d, OPT_REST); break;
case 'm': mesh3d.ImproveMesh(mp, OPT_REST); break;
}
}
mesh3d.FindOpenElements(k);
PrintMessage (3, "Call remove problem");
RemoveProblem (mesh3d, k);
mesh3d.FindOpenElements(k);
}
else
{
meshed = 1;
PrintMessage (1, "Success !");
}
}
while (!meshed);
PrintMessage (1, mesh3d.GetNP(), " points, ",
mesh3d.GetNE(), " elements");
{
if(mp.only3D_domain_nr && mp.only3D_domain_nr !=k)
return;
PrintMessage (3, "Check subdomain ", k, " / ", mesh3d.GetNDomains());
mesh3d.FindOpenElements(k);
bool res = (mesh3d.CheckConsistentBoundary() != 0);
if (res)
{ {
PrintError ("Surface mesh not consistent"); PrintError ("Surface mesh not consistent");
throw NgException ("Stop meshing since surface mesh not consistent"); throw NgException ("Stop meshing since surface mesh not consistent");
@ -748,8 +480,7 @@ namespace netgen
if(mesh3d.GetNDomains()==0) if(mesh3d.GetNDomains()==0)
return MESHING3_OK; return MESHING3_OK;
// localh function is built for each domain separately in blockfill ( more efficient ) if (!mesh3d.HasLocalHFunction())
if (!mesh3d.HasLocalHFunction() && !mp.blockfill)
mesh3d.CalcLocalH(mp.grading); mesh3d.CalcLocalH(mp.grading);
auto md = DivideMesh(mesh3d, mp); auto md = DivideMesh(mesh3d, mp);

View File

@ -1189,6 +1189,7 @@ void Meshing3 :: BlockFillLocalH (Mesh & mesh,
} }
} }
while (changed); while (changed);
t1.Stop();
if (debugparam.slowchecks) if (debugparam.slowchecks)
(*testout) << "Blockfill with points: " << endl; (*testout) << "Blockfill with points: " << endl;

View File

@ -134,7 +134,6 @@ void ResetStatus()
void PushStatus(const MyStr& s) void PushStatus(const MyStr& s)
{ {
return;
msgstatus_stack.Append(new MyStr (s)); msgstatus_stack.Append(new MyStr (s));
SetStatMsg(s); SetStatMsg(s);
threadpercent_stack.Append(0); threadpercent_stack.Append(0);
@ -142,7 +141,6 @@ void PushStatus(const MyStr& s)
void PushStatusF(const MyStr& s) void PushStatusF(const MyStr& s)
{ {
return;
msgstatus_stack.Append(new MyStr (s)); msgstatus_stack.Append(new MyStr (s));
SetStatMsg(s); SetStatMsg(s);
threadpercent_stack.Append(0); threadpercent_stack.Append(0);
@ -151,7 +149,6 @@ void PushStatusF(const MyStr& s)
void PopStatus() void PopStatus()
{ {
return;
if (msgstatus_stack.Size()) if (msgstatus_stack.Size())
{ {
if (msgstatus_stack.Size() > 1) if (msgstatus_stack.Size() > 1)