diff --git a/src/surfMesh/writers/nastran/nastranSurfaceWriter.C b/src/surfMesh/writers/nastran/nastranSurfaceWriter.C index 69d4ae84d44105db6456735cb74b4470026635e5..0df0e93d145d20835891c7d42d37bfdea40ddf4e 100644 --- a/src/surfMesh/writers/nastran/nastranSurfaceWriter.C +++ b/src/surfMesh/writers/nastran/nastranSurfaceWriter.C @@ -204,7 +204,8 @@ void Foam::surfaceWriters::nastranWriter::writeGeometry ( Ostream& os, const meshedSurf& surf, - List<faceList>& decomposedFaces + labelList& decompOffsets, + DynamicList<face>& decompFaces ) const { const pointField& points = surf.points(); @@ -213,9 +214,9 @@ void Foam::surfaceWriters::nastranWriter::writeGeometry // Write points - os << "$" << nl - << "$ Points" << nl - << "$" << nl; + os << token::DOLLAR << nl + << token::DOLLAR << token::SPACE << "Points" << nl + << token::DOLLAR << nl; forAll(points, pointi) { @@ -223,18 +224,19 @@ void Foam::surfaceWriters::nastranWriter::writeGeometry } // Write faces, with on-the-fly decomposition (triangulation) - decomposedFaces.clear(); - decomposedFaces.resize(faces.size()); + decompOffsets.resize(faces.size()+1); + decompFaces.clear(); - os << "$" << nl - << "$ Faces" << nl - << "$" << nl; + decompOffsets = 0; - label elemId = 0; // The element-id + os << token::DOLLAR << nl + << token::DOLLAR << token::SPACE << "Faces" << nl + << token::DOLLAR << nl; + + label elemId = 0; // The element-id forAll(faces, facei) { const face& f = faces[facei]; - faceList& decomp = decomposedFaces[facei]; // 1-offset for PID const label propId = 1 + (facei < zones.size() ? zones[facei] : 0); @@ -242,28 +244,36 @@ void Foam::surfaceWriters::nastranWriter::writeGeometry if (f.size() == 3) { writeFace(os, "CTRIA3", f, ++elemId, propId); - decomp.resize(1); - decomp[0] = f; } else if (f.size() == 4) { writeFace(os, "CQUAD4", f, ++elemId, propId); - decomp.resize(1); - decomp[0] = f; } else { - // Decompose poly face into tris - decomp.resize(f.nTriangles()); - - label nTri = 0; - f.triangles(points, nTri, decomp); - - for (const face& f2 : decomp) + // Decompose into tris + f.triangles(points, decompFaces); + + for + ( + label decompi = decompOffsets[facei]; + decompi < decompFaces.size(); + ++decompi + ) { - writeFace(os, "CTRIA3", f2, ++elemId, propId); + writeFace + ( + os, + "CTRIA3", + decompFaces[decompi], + ++elemId, + propId + ); } } + + // Update offsets + decompOffsets[facei+1] = decompFaces.size(); } } @@ -431,12 +441,14 @@ Foam::fileName Foam::surfaceWriters::nastranWriter::write() fileFormats::NASCore::setPrecision(os, writeFormat_); os << "TITLE=OpenFOAM " << outputPath_.name() - << " mesh" << nl - << "$" << nl + << token::SPACE << "mesh" << nl + << token::DOLLAR << nl << "BEGIN BULK" << nl; - List<faceList> decomposedFaces; - writeGeometry(os, surf, decomposedFaces); + labelList decompOffsets; + DynamicList<face> decompFaces; + + writeGeometry(os, surf, decompOffsets, decompFaces); writeFooter(os, surf) << "ENDDATA" << nl; diff --git a/src/surfMesh/writers/nastran/nastranSurfaceWriter.H b/src/surfMesh/writers/nastran/nastranSurfaceWriter.H index b27831174f49fec85f73f769af3229e2fde6a257..e2ddba4ac746b552c8f053a1d510a9659ce5f04e 100644 --- a/src/surfMesh/writers/nastran/nastranSurfaceWriter.H +++ b/src/surfMesh/writers/nastran/nastranSurfaceWriter.H @@ -155,12 +155,16 @@ private: const label propId //!< 1-based Property Id ) const; - //- Main driver to write the surface mesh geometry + //- Write the surface mesh geometry, tracking face decomposition + // + // \param decompOffsets begin/end offsets (size+1) into decompFaces + // \param decompFaces Non tri/quad decomposed into triangles void writeGeometry ( Ostream& os, const meshedSurf& surf, - List<faceList>& decomposedFaces + labelList& decompOffsets, + DynamicList<face>& decompFaces ) const; //- Write the formatted keyword to the output stream diff --git a/src/surfMesh/writers/nastran/nastranSurfaceWriterImpl.C b/src/surfMesh/writers/nastran/nastranSurfaceWriterImpl.C index 3b29d8a2c223c394865a7c38be81a8f73fe52cdd..d25c4e7fa8d9b66ab4d0b5fb7092ffd8cd5798f0 100644 --- a/src/surfMesh/writers/nastran/nastranSurfaceWriterImpl.C +++ b/src/surfMesh/writers/nastran/nastranSurfaceWriterImpl.C @@ -208,29 +208,69 @@ Foam::fileName Foam::surfaceWriters::nastranWriter::writeTemplate } os << "TITLE=OpenFOAM " << outputFile.name() - << " " << fieldName << " data" << nl - << "$" << nl + << token::SPACE << fieldName << " data" << nl; + + if (useTimeDir() && !timeName().empty()) + { + os << token::DOLLAR << nl + << token::DOLLAR << token::SPACE << "TIME " << timeName() << nl; + } + + os << token::DOLLAR << nl << "TIME " << timeValue << nl - << "$" << nl + << token::DOLLAR << nl << "BEGIN BULK" << nl; - List<faceList> decomposedFaces; - writeGeometry(os, surf, decomposedFaces); - os << "$" << nl - << "$ Field data" << nl - << "$" << nl; + // Regular faces + const faceList& faces = surf.faces(); + + // Additional bookkeeping for decomposing non tri/quad + labelList decompOffsets; + DynamicList<face> decompFaces; + + writeGeometry(os, surf, decompOffsets, decompFaces); + + os << token::DOLLAR << nl + << token::DOLLAR << token::SPACE + << "Field data" << nl + << token::DOLLAR << nl; label elemId = 0; if (this->isPointData()) { - for (const faceList& dFaces : decomposedFaces) + forAll(faces, facei) { - for (const face& f : dFaces) + const label beginElemId = elemId; + + // Any face decomposition + for + ( + label decompi = decompOffsets[facei]; + decompi < decompOffsets[facei+1]; + ++decompi + ) { + const face& f = decompFaces[decompi]; + Type v = Zero; + for (const label verti : f) + { + v += values[verti]; + } + v /= f.size(); + + writeFaceValue(os, format, v, ++elemId); + } + + // Face not decomposed + if (beginElemId == elemId) + { + const face& f = faces[facei]; + + Type v = Zero; for (const label verti : f) { v += values[verti]; @@ -245,12 +285,20 @@ Foam::fileName Foam::surfaceWriters::nastranWriter::writeTemplate { auto valIter = values.cbegin(); - for (const faceList& dFaces : decomposedFaces) + forAll(faces, facei) { - forAll(dFaces, facei) + label nValues = + max + ( + label(1), + (decompOffsets[facei+1] - decompOffsets[facei]) + ); + + while (nValues--) { writeFaceValue(os, format, *valIter, ++elemId); } + ++valIter; } }