BUG: UListIO: byteSize overflowing on really big faceLists
[OpenFOAM-2.0.x.git] / applications / utilities / surface / surfaceMeshInfo / surfaceMeshInfo.C
blob08e6a99b38ee7f3069e350130fe4f671ee0136b2
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
9     This file is part of OpenFOAM.
11     OpenFOAM is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by
13     the Free Software Foundation, either version 3 of the License, or
14     (at your option) any later version.
16     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19     for more details.
21     You should have received a copy of the GNU General Public License
22     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
24 Application
25     surfaceMeshInfo
27 Description
28     Miscellaneous information about surface meshes
30 Usage
31     - surfaceMeshInfo surfaceFile [OPTION]
33     \param -areas \n
34     Report area for each face.
36     \param -scale \<scale\> \n
37     Specify a scaling factor when reading files.
39     \param -xml \n
40     Write output in XML format.
42 Note
43     The filename extensions are used to determine the file format type.
45     The XML-like output can be useful for extraction with other tools,
46     but either output format can be easily extracted with a simple sed
47     command:
48     \verbatim
49         surfaceMeshInfo surfaceFile -areas | \
50             sed -ne '/areas/,/:/{ /:/!p }'
52         surfaceMeshInfo surfaceFile -areas -xml | \
53             sed -ne '/<areas/,/</{ /</!p }'
54     \endverbatim
56 \*---------------------------------------------------------------------------*/
58 #include "argList.H"
59 #include "timeSelector.H"
60 #include "Time.H"
62 #include "UnsortedMeshedSurfaces.H"
64 using namespace Foam;
67 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
68 //  Main program:
70 int main(int argc, char *argv[])
72     argList::addNote
73     (
74         "information about surface meshes"
75     );
77     argList::noBanner();
78     argList::noParallel();
79     argList::validArgs.append("surfaceFile");
81     argList::addOption
82     (
83         "scale",
84         "factor",
85         "geometry scaling factor - default is 1"
86     );
87     argList::addBoolOption
88     (
89         "areas",
90         "display area of each face"
91     );
92     argList::addBoolOption
93     (
94         "xml",
95         "write output in XML format"
96     );
98     argList args(argc, argv);
99     Time runTime(args.rootPath(), args.caseName());
101     const fileName importName = args[1];
103     // check that reading is supported
104     if (!UnsortedMeshedSurface<face>::canRead(importName, true))
105     {
106         return 1;
107     }
109     const bool writeXML = args.optionFound("xml");
110     const bool writeAreas = args.optionFound("areas");
113     // use UnsortedMeshedSurface, not MeshedSurface to maintain ordering
114     UnsortedMeshedSurface<face> surf(importName);
116     scalar scaling = 0;
117     if (args.optionReadIfPresent("scale", scaling) && scaling > 0)
118     {
119         Info<< " -scale " << scaling << endl;
120         surf.scalePoints(scaling);
121     }
123     scalar areaTotal = 0;
125     if (writeXML)
126     {
127         Info<<"<?xml version='1.0' encoding='utf-8'?>" << nl
128             <<"<surfaceMeshInfo>" << nl
129             << "<npoints>" << surf.nPoints() << "</npoints>" << nl
130             << "<nfaces>"  << surf.size() << "</nfaces>" << nl;
132         if (writeAreas)
133         {
134             Info<<"<areas size='" << surf.size() << "'>" << nl;
135         }
136     }
137     else
138     {
139         Info<< "nPoints   : " << surf.nPoints() << nl
140             << "nFaces    : " << surf.size() << nl;
142         if (writeAreas)
143         {
144             Info<< "areas     : " << nl;
145         }
146     }
148     forAll(surf, faceI)
149     {
150         const scalar fArea(surf[faceI].mag(surf.points()));
151         areaTotal += fArea;
153         if (writeAreas)
154         {
155             Info<< fArea << nl;
156         }
157     }
159     if (writeXML)
160     {
161         if (writeAreas)
162         {
163             Info<<"</areas>" << nl;
164         }
166         Info<< "<area>" << areaTotal << "</area>" << nl
167             << "</surfaceMeshInfo>" << nl;
168     }
169     else
170     {
171         Info<< "area      : " << areaTotal << nl;
172     }
174     return 0;
177 // ************************************************************************* //