41 const UList<Face>& faceLst
46 if (!faceTraits<Face>::isTri())
48 for (
const auto&
f : faceLst)
60 <<
"Surface has " << nNonTris <<
'/' << faceLst.size()
61 <<
" non-triangulated faces - not writing!" <<
endl;
96 <<
"Cannot read file " << filename <<
nl 101 string line = this->getLineNoComment(is);
114 auto& pointLst = this->storedPoints();
115 auto& faceLst = this->storedFaces();
116 auto& zoneIds = this->storedZoneIds();
119 faceLst.resize(nElems);
120 zoneIds.resize(nElems);
126 line = this->getLineNoComment(is);
128 IStringStream lineStream(line);
133 pointLst[pointi] =
point(
x,
y, z);
141 line = this->getLineNoComment(is);
143 IStringStream lineStream(line);
147 edges[edgei] = edge(beg - 1,
end - 1);
155 label e0Label, e1Label, e2Label;
158 line = this->getLineNoComment(is);
160 IStringStream lineStream(line);
162 >> e0Label >> e1Label >> e2Label;
169 if (!lineStream.bad())
184 const edge& e0 = edges[e0Label - 1];
185 const edge& e1 = edges[e1Label - 1];
186 const edge& e2 = edges[e2Label - 1];
188 label common01 = e0.commonVertex(e1);
192 <<
"Edges 0 and 1 of triangle " << facei
193 <<
" do not share a point.\n" 194 <<
" edge0:" << e0 <<
nl 199 const label e0Far = e0.otherVertex(common01);
200 const label e1Far = e1.otherVertex(common01);
202 const label common12 = e1.commonVertex(e2);
206 <<
"Edges 1 and 2 of triangle " << facei
207 <<
" do not share a point.\n" 208 <<
" edge1:" << e1 <<
nl 212 const label e2Far = e2.otherVertex(common12);
215 if (common12 != e1Far || e2Far != e0Far)
218 <<
"Edges of triangle " << facei
219 <<
" reference more than three points.\n" 220 <<
" edge0:" << e0 <<
nl 221 <<
" edge1:" << e1 <<
nl 222 <<
" edge2:" << e2 <<
nl 226 faceLst[facei] = Face{e0Far, common01, e1Far};
227 zoneIds[facei] = zoneI;
231 List<surfZoneIdentifier> newZones(maxZone+1);
234 newZones[zonei] = surfZoneIdentifier
236 surfZoneIdentifier::defaultName(zonei),
241 this->storedZoneToc().transfer(newZones);
242 this->addZonesToFaces();
258 streamOpt.
format(IOstreamOption::ASCII);
267 : surfaceFormatsCore::oneZone(faceLst)
270 checkIfTriangulated(faceLst);
276 <<
"Cannot write file " << filename <<
nl 282 os <<
"# GTS file" <<
nl 287 os <<
"# " << zonei <<
" " 288 << zones[zonei].name() <<
nl;
292 os <<
"# nPoints nEdges nTriangles" <<
nl 293 << pointLst.
size() <<
' ' << surf.
nEdges() <<
' ' 298 for (
const point& pt : pointLst)
300 os << pt.x() <<
' ' << pt.y() <<
' ' << pt.z() <<
nl;
309 for (
const edge&
e : es)
311 os << meshPts[
e.start()] + 1 <<
' ' 312 << meshPts[
e.end()] + 1 <<
nl;
321 for (
const surfZone& zone : zones)
323 for (label nLocal = zone.size(); nLocal--; ++faceIndex)
325 const label facei = faceIndex;
329 os << fEdges[0] + 1 <<
' ' 330 << fEdges[1] + 1 <<
' ' 331 << fEdges[2] + 1 <<
' ' 350 streamOpt.
format(IOstreamOption::ASCII);
357 checkIfTriangulated(faceLst);
363 <<
"Cannot write file " << filename <<
nl 369 os <<
"# GTS file" <<
nl 374 os <<
"# " << zonei <<
" " 375 << zoneToc[zonei].name() <<
nl;
379 os <<
"# nPoints nEdges nTriangles" <<
nl 380 << pointLst.
size() <<
' ' << surf.
nEdges() <<
' ' 385 for (
const point& pt : pointLst)
387 os << pt.x() <<
' ' << pt.y() <<
' ' << pt.z() <<
nl;
396 for (
const edge&
e : es)
398 os << meshPts[
e.start()] + 1 <<
' ' 399 << meshPts[
e.end()] + 1 <<
nl;
409 os << fEdges[0] + 1 <<
' ' 410 << fEdges[1] + 1 <<
' ' 411 << fEdges[2] + 1 <<
' ' 412 << zoneIds[facei] <<
nl;
A surface geometry mesh, in which the surface zone information is conveyed by the 'zoneId' associated...
void size(const label n)
Older name for setAddressableSize.
A class for handling file names.
errorManipArg< error, int > exit(error &err, const int errNo=1)
error FatalError
Error stream (stdout output on all processes), with additional 'FOAM FATAL ERROR' header text and sta...
A list of keyword definitions, which are a keyword followed by a number of values (eg...
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Input/output from string buffers.
List< edge > edgeList
List of edge.
A surface geometry mesh with zone information, not to be confused with the similarly named surfaceMes...
Output to file stream, using an OSstream.
constexpr char nl
The newline '\n' character (0x0a)
Ostream & endl(Ostream &os)
Add newline and flush stream.
A simple container for options an IOstream can normally have.
List< labelList > labelListList
List of labelList.
const labelList & meshPoints() const
Return labelList of mesh points in patch.
label size() const
The surface size is the number of faces.
#define forAll(list, i)
Loop across all elements in list.
const dimensionedScalar e
Elementary charge.
const edgeList & edges() const
Return list of edges, address into LOCAL point list.
const Field< point_type > & points() const noexcept
Return reference to global points.
A 1D vector of objects of type <T>, where the size of the vector is known and can be used for subscri...
label nEdges() const
Number of edges in patch.
const List< Face > & surfFaces() const
Return const access to the faces.
virtual const labelList & zoneIds() const
Return const access to the zone ids.
constexpr auto end(C &c) -> decltype(c.end())
Return iterator to the end of the container c.
OBJstream os(runTime.globalPath()/outputName)
Input from file stream, using an ISstream.
const List< surfZoneIdentifier > & zoneToc() const
Return const access to the zone table-of-contents.
label size() const
The surface size is the number of faces.
vector point
Point is a vector.
Input from string buffer, using a ISstream. Always UNCOMPRESSED.
bool good() const noexcept
True if next operation might succeed.
const labelListList & faceEdges() const
Return face-edge addressing.
List< label > labelList
A List of labels.
const surfZoneList & surfZones() const
Const access to the surface zones.
streamFormat format() const noexcept
Get the current stream format.