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);
133 pointLst[pointi] =
point(
x,
y, z);
141 line = this->getLineNoComment(is);
147 edges[edgei] =
edge(beg - 1, end - 1);
155 label e0Label, e1Label, e2Label;
158 line = this->getLineNoComment(is);
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];
192 <<
"Edges 0 and 1 of triangle " << facei
193 <<
" do not share a point.\n"
194 <<
" edge0:" << e0 <<
nl
206 <<
"Edges 1 and 2 of triangle " << facei
207 <<
" do not share a point.\n"
208 <<
" edge1:" << e1 <<
nl
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;
236 surfZoneIdentifier::defaultName(zonei),
241 this->storedZoneToc().transfer(newZones);
242 this->addZonesToFaces();
258 streamOpt.
format(IOstream::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;
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(IOstream::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;
Input/output from string buffers.
Input from file stream, using an ISstream.
The IOstreamOption is a simple container for options an IOstream can normally have.
streamFormat format() const noexcept
Get the current stream format.
bool good() const noexcept
True if next operation might succeed.
bool bad() const noexcept
True if stream is corrupted.
Input from string buffer, using a ISstream. Always UNCOMPRESSED.
A surface geometry mesh with zone information, not to be confused with the similarly named surfaceMes...
const surfZoneList & surfZones() const
Const access to the surface zones.
label size() const
The surface size is the number of faces.
const List< Face > & surfFaces() const
Return const access to the faces.
Output to file stream, using an OSstream.
label nEdges() const
Number of edges in patch.
const edgeList & edges() const
Return list of edges, address into LOCAL point list.
const labelList & meshPoints() const
Return labelList of mesh points in patch.
const Field< point_type > & points() const noexcept
Return reference to global points.
const labelListList & faceEdges() const
Return face-edge addressing.
virtual bool read()
Re-read model coefficients if they have changed.
A 1D vector of objects of type <T>, where the size of the vector is known and can be used for subscri...
void size(const label n)
Older name for setAddressableSize.
A surface geometry mesh, in which the surface zone information is conveyed by the 'zoneId' associated...
virtual const labelList & zoneIds() const
Return const access to the zone ids.
label size() const
The surface size is the number of faces.
const List< surfZoneIdentifier > & zoneToc() const
Return const access to the zone table-of-contents.
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
An edge is a list of two point labels. The functionality it provides supports the discretisation on a...
label otherVertex(const label pointLabel) const
Given the point label for one vertex, return the other one.
label commonVertex(const edge &other) const
Return vertex common with other edge or -1 on failure.
A class for handling file names.
virtual bool write()
Write the output fields.
Identifies a surface patch/zone by name and index, with optional geometric type.
A surface zone on a MeshedSurface.
Base class for mesh zones.
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
OBJstream os(runTime.globalPath()/outputName)
const labelList nEdges(UPstream::listGatherValues< label >(aMesh.nEdges()))
Ostream & endl(Ostream &os)
Add newline and flush stream.
errorManipArg< error, int > exit(error &err, const int errNo=1)
constexpr char nl
The newline '\n' character (0x0a)
#define forAll(list, i)
Loop across all elements in list.