Skip to content
Snippets Groups Projects
Commit 6387af94 authored by Mark OLESEN's avatar Mark OLESEN
Browse files

BUG: incorrect Nastran surface output and segmentation faults #1571

- indexing error in the output of values resulted in uniform output in
  most cases.

- allocation error for on-the-fly triangulation

ENH: changed decomposed storage from DynamicList to plain faceList for
clearer allocation control and better overhead
parent bdc3d457
No related branches found
No related tags found
No related merge requests found
...@@ -201,7 +201,7 @@ void Foam::nastranSurfaceWriter::writeGeometry ...@@ -201,7 +201,7 @@ void Foam::nastranSurfaceWriter::writeGeometry
( (
Ostream& os, Ostream& os,
const meshedSurf& surf, const meshedSurf& surf,
List<DynamicList<face>>& decomposedFaces List<faceList>& decomposedFaces
) const ) const
{ {
const pointField& points = surf.points(); const pointField& points = surf.points();
...@@ -219,9 +219,9 @@ void Foam::nastranSurfaceWriter::writeGeometry ...@@ -219,9 +219,9 @@ void Foam::nastranSurfaceWriter::writeGeometry
writeCoord(os, points[pointi], pointi); writeCoord(os, points[pointi], pointi);
} }
// Write faces // Write faces, with on-the-fly decomposition (triangulation)
decomposedFaces.clear(); decomposedFaces.clear();
decomposedFaces.setSize(faces.size()); decomposedFaces.resize(faces.size());
os << "$" << nl os << "$" << nl
<< "$ Faces" << nl << "$ Faces" << nl
...@@ -231,30 +231,34 @@ void Foam::nastranSurfaceWriter::writeGeometry ...@@ -231,30 +231,34 @@ void Foam::nastranSurfaceWriter::writeGeometry
forAll(faces, facei) forAll(faces, facei)
{ {
const face& f = faces[facei]; const face& f = faces[facei];
faceList& decomp = decomposedFaces[facei];
// 1-offset for PID // 1-offset for PID
const label PID = 1 + (facei < zones.size() ? zones[facei] : 0); const label PID = 1 + (facei < zones.size() ? zones[facei] : 0);
if (f.size() == 3) if (f.size() == 3)
{ {
writeFace(os, "CTRIA3", f, ++nFace, PID); writeFace(os, "CTRIA3", f, ++nFace, PID);
decomposedFaces[facei].append(f); decomp.resize(1);
decomp[0] = f;
} }
else if (f.size() == 4) else if (f.size() == 4)
{ {
writeFace(os, "CQUAD4", f, ++nFace, PID); writeFace(os, "CQUAD4", f, ++nFace, PID);
decomposedFaces[facei].append(f); decomp.resize(1);
decomp[0] = f;
} }
else else
{ {
// Decompose poly face into tris // Decompose poly face into tris
decomp.resize(f.nTriangles());
label nTri = 0; label nTri = 0;
faceList triFaces; f.triangles(points, nTri, decomp);
f.triangles(points, nTri, triFaces);
forAll(triFaces, trii) for (const face& f2 : decomp)
{ {
writeFace(os, "CTRIA3", triFaces[trii], ++nFace, PID); writeFace(os, "CTRIA3", f2, ++nFace, PID);
decomposedFaces[facei].append(triFaces[trii]);
} }
} }
} }
...@@ -384,7 +388,7 @@ Foam::fileName Foam::nastranSurfaceWriter::write ...@@ -384,7 +388,7 @@ Foam::fileName Foam::nastranSurfaceWriter::write
<< "$" << nl << "$" << nl
<< "BEGIN BULK" << nl; << "BEGIN BULK" << nl;
List<DynamicList<face>> decomposedFaces; List<faceList> decomposedFaces;
writeGeometry(os, surf, decomposedFaces); writeGeometry(os, surf, decomposedFaces);
writeFooter(os, surf) writeFooter(os, surf)
......
...@@ -130,7 +130,7 @@ private: ...@@ -130,7 +130,7 @@ private:
( (
Ostream& os, Ostream& os,
const meshedSurf& surf, const meshedSurf& surf,
List<DynamicList<face>>& decomposedFaces List<faceList>& decomposedFaces
) const; ) const;
//- Write the formatted keyword to the output stream //- Write the formatted keyword to the output stream
......
...@@ -187,7 +187,7 @@ Foam::fileName Foam::nastranSurfaceWriter::writeTemplate ...@@ -187,7 +187,7 @@ Foam::fileName Foam::nastranSurfaceWriter::writeTemplate
<< "$" << nl << "$" << nl
<< "BEGIN BULK" << nl; << "BEGIN BULK" << nl;
List<DynamicList<face>> decomposedFaces; List<faceList> decomposedFaces;
writeGeometry(os, surf, decomposedFaces); writeGeometry(os, surf, decomposedFaces);
os << "$" << nl os << "$" << nl
...@@ -198,7 +198,7 @@ Foam::fileName Foam::nastranSurfaceWriter::writeTemplate ...@@ -198,7 +198,7 @@ Foam::fileName Foam::nastranSurfaceWriter::writeTemplate
if (isNodeValues) if (isNodeValues)
{ {
for (const DynamicList<face>& dFaces : decomposedFaces) for (const faceList& dFaces : decomposedFaces)
{ {
for (const face& f : dFaces) for (const face& f : dFaces)
{ {
...@@ -216,12 +216,16 @@ Foam::fileName Foam::nastranSurfaceWriter::writeTemplate ...@@ -216,12 +216,16 @@ Foam::fileName Foam::nastranSurfaceWriter::writeTemplate
} }
else else
{ {
for (const DynamicList<face>& dFaces : decomposedFaces) auto valIter = values.cbegin();
for (const faceList& dFaces : decomposedFaces)
{ {
forAll(dFaces, facei) forAll(dFaces, facei)
{ {
writeFaceValue(os, format, values[facei], ++elemId); writeFaceValue(os, format, *valIter, ++elemId);
} }
++valIter;
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment