40 namespace surfaceWriters
59 Foam::Ostream& Foam::surfaceWriters::nastranWriter::writeKeyword
69 void Foam::surfaceWriters::nastranWriter::writeCoord
87 writeKeyword(os,
"GRID") << separator_;
89 os.setf(std::ios_base::right);
91 writeValue(os, pointI+1) << separator_;
92 writeValue(os,
"") << separator_;
93 writeValue(os, pt.x()) << separator_;
94 writeValue(os, pt.y()) << separator_;
98 case fieldFormat::SHORT :
100 os <<
setw(8) << pt.z() <<
nl;
101 os.unsetf(std::ios_base::right);
105 case fieldFormat::LONG :
108 os.unsetf(std::ios_base::right);
109 writeKeyword(os,
"");
110 os.setf(std::ios_base::right);
112 writeValue(os, pt.z()) <<
nl;
116 case fieldFormat::FREE :
118 writeValue(os, pt.z()) <<
nl;
123 os.unsetf(std::ios_base::right);
127 void Foam::surfaceWriters::nastranWriter::writeFace
130 const word& faceType,
150 writeKeyword(os, faceType) << separator_;
152 os.setf(std::ios_base::right);
154 writeValue(os, elemId) << separator_;
155 writeValue(os, propId);
157 switch (writeFormat_)
159 case fieldFormat::SHORT :
161 for (
const label pointi : facePts)
163 writeValue(os, pointi + 1);
169 case fieldFormat::LONG :
173 writeValue(os, facePts[i] + 1);
177 os.unsetf(std::ios_base::right);
178 writeKeyword(os,
"");
179 os.setf(std::ios_base::right);
186 case fieldFormat::FREE :
188 for (
const label pointi : facePts)
191 writeValue(os, pointi + 1);
199 os.unsetf(std::ios_base::right);
203 void Foam::surfaceWriters::nastranWriter::writeGeometry
206 const meshedSurf& surf,
208 DynamicList<face>& decompFaces
212 const faceList& faces = surf.faces();
214 const labelList& elemIds = surf.faceIds();
217 bool useOrigFaceIds = (elemIds.size() == faces.size());
222 for (
const auto&
f : faces)
226 useOrigFaceIds =
false;
241 writeCoord(os,
points[pointi]*geometryScale_, pointi);
245 decompOffsets.resize(faces.size()+1);
248 decompOffsets[0] = 0;
257 const face&
f = faces[facei];
262 elemId = elemIds[facei];
266 const label propId = 1 + (facei < zones.size() ? zones[facei] : 0);
270 writeFace(os,
"CTRIA3",
f, ++elemId, propId);
272 else if (
f.size() == 4)
274 writeFace(os,
"CQUAD4",
f, ++elemId, propId);
279 f.triangles(
points, decompFaces);
283 label decompi = decompOffsets[facei];
284 decompi < decompFaces.size();
292 decompFaces[decompi],
300 decompOffsets[facei+1] = decompFaces.size();
305 Foam::Ostream& Foam::surfaceWriters::nastranWriter::writeFooter
308 const meshedSurf& surf
314 if (pidsUsed.empty())
316 pidsUsed.resize(1,
Zero);
319 for (
auto pid : pidsUsed)
321 writeKeyword(os,
"PSHELL") << separator_;
322 writeValue(os,
pid+1);
324 for (label i = 0; i < 7; ++i)
338 writeKeyword(os,
"MAT1") << separator_;
341 for (label i = 0; i < 7; ++i)
382 geometryScale_(options.
getOrDefault<scalar>(
"scale", 1)),
386 if (writeFormat_ == fieldFormat::FREE)
416 open(surf, outputPath, parallel);
431 open(
points, faces, outputPath, parallel);
444 if (useTimeDir() && !
timeName().empty())
447 outputFile = outputPath_.
path() /
timeName() / outputPath_.name();
449 outputFile.
ext(
"nas");
453 Info<<
"Writing nastran geometry to " << outputFile <<
endl;
469 os <<
"TITLE=OpenFOAM " << outputPath_.
name()
472 <<
"BEGIN BULK" <<
nl;
477 writeGeometry(os, surf, decompOffsets, decompFaces);
479 writeFooter(os, surf)