SMESHsurfaceFormat.C 3.93 KB
Newer Older
Mark Olesen's avatar
Mark Olesen committed
1
2
3
4
/*---------------------------------------------------------------------------*\
  =========                 |
  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
   \\    /   O peration     |
5
    \\  /    A nd           | Copyright (C) 1991-2010 OpenCFD Ltd.
Mark Olesen's avatar
Mark Olesen committed
6
7
8
9
10
     \\/     M anipulation  |
-------------------------------------------------------------------------------
License
    This file is part of OpenFOAM.

11
12
13
14
    OpenFOAM is free software: you can redistribute it and/or modify it
    under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
Mark Olesen's avatar
Mark Olesen committed
15
16
17
18
19
20
21

    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    for more details.

    You should have received a copy of the GNU General Public License
22
    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
Mark Olesen's avatar
Mark Olesen committed
23
24
25

\*---------------------------------------------------------------------------*/

26
#include "SMESHsurfaceFormat.H"
Mark Olesen's avatar
Mark Olesen committed
27
28
29
30
#include "clock.H"
#include "IFstream.H"
#include "OFstream.H"
#include "Ostream.H"
Mark Olesen's avatar
Mark Olesen committed
31

32
33
// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //

34
35
template<class Face>
Foam::fileFormats::SMESHsurfaceFormat<Face>::SMESHsurfaceFormat()
36
37
{}

Andrew Heather's avatar
Andrew Heather committed
38

39
40
// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //

41
42
template<class Face>
void Foam::fileFormats::SMESHsurfaceFormat<Face>::write
43
(
Mark Olesen's avatar
Mark Olesen committed
44
45
    const fileName& filename,
    const MeshedSurfaceProxy<Face>& surf
46
47
)
{
Mark Olesen's avatar
Mark Olesen committed
48
49
50
    const pointField& pointLst = surf.points();
    const List<Face>&  faceLst = surf.faces();
    const List<label>& faceMap = surf.faceMap();
51

Mark Olesen's avatar
Mark Olesen committed
52
53
    const List<surfZone>& zones =
    (
54
        surf.surfZones().empty()
55
      ? surfaceFormatsCore::oneZone(faceLst)
56
      : surf.surfZones()
Mark Olesen's avatar
Mark Olesen committed
57
    );
Mark Olesen's avatar
Mark Olesen committed
58

Mark Olesen's avatar
Mark Olesen committed
59
    const bool useFaceMap = (surf.useFaceMap() && zones.size() > 1);
Mark Olesen's avatar
Mark Olesen committed
60
61


Mark Olesen's avatar
Mark Olesen committed
62
63
64
65
66
67
68
69
70
71
72
    OFstream os(filename);
    if (!os.good())
    {
        FatalErrorIn
        (
            "fileFormats::SMESHsurfaceFormat::write"
            "(const fileName&, const MeshedSurfaceProxy<Face>&)"
        )
            << "Cannot open file for writing " << filename
            << exit(FatalError);
    }
Mark Olesen's avatar
Mark Olesen committed
73

74

Mark Olesen's avatar
Mark Olesen committed
75
76
77
78
    // Write header
    os  << "# tetgen .smesh file written " << clock::dateTime().c_str() << nl
        << "# <points count=\"" << pointLst.size() << "\">" << nl
        << pointLst.size() << " 3" << nl;    // 3: dimensions
79

Mark Olesen's avatar
Mark Olesen committed
80
81
82
83
84
85
86
87
88
89
    // Write vertex coords
    forAll(pointLst, ptI)
    {
        const point& pt = pointLst[ptI];

        os  << ptI << ' ' << pt.x() << ' ' << pt.y() << ' ' << pt.z() << nl;
    }
    os  << "# </points>" << nl
        << nl
        << "# <faces count=\"" << faceLst.size() << "\">" << endl;
Mark Olesen's avatar
Mark Olesen committed
90

Mark Olesen's avatar
Mark Olesen committed
91
    os  << faceLst.size() << " 1" << endl;   // one attribute: zone number
Mark Olesen's avatar
Mark Olesen committed
92

Mark Olesen's avatar
Mark Olesen committed
93

Mark Olesen's avatar
Mark Olesen committed
94
    label faceIndex = 0;
Mark Olesen's avatar
Mark Olesen committed
95
    forAll(zones, zoneI)
Mark Olesen's avatar
Mark Olesen committed
96
    {
Mark Olesen's avatar
Mark Olesen committed
97
        const surfZone& zone = zones[zoneI];
Mark Olesen's avatar
Mark Olesen committed
98

Mark Olesen's avatar
Mark Olesen committed
99
100
101
        if (useFaceMap)
        {
            forAll(zone, localFaceI)
Mark Olesen's avatar
Mark Olesen committed
102
            {
Mark Olesen's avatar
Mark Olesen committed
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
                const Face& f = faceLst[faceMap[faceIndex++]];

                os << f.size();
                forAll(f, fp)
                {
                    os << ' ' << f[fp];
                }
                os << ' ' << zoneI << endl;
            }
        }
        else
        {
            forAll(zones[zoneI], localFaceI)
            {
                const Face& f = faceLst[faceIndex++];

                os << f.size();
                forAll(f, fp)
                {
                    os << ' ' << f[fp];
                }
                os << ' ' << zoneI << endl;
Mark Olesen's avatar
Mark Olesen committed
125
126
127
128
            }
        }
    }

Mark Olesen's avatar
Mark Olesen committed
129
130
131
132
133
134
135
    // write tail

    os  << "# </faces>" << nl
        << nl
        << "# no holes or regions:" << nl
        << '0' << nl        // holes
        << '0' << endl;     // regions
Mark Olesen's avatar
Mark Olesen committed
136
137
}

Mark Olesen's avatar
Mark Olesen committed
138

Mark Olesen's avatar
Mark Olesen committed
139
// ************************************************************************* //