openfoam/src/conversion/meshReader/meshReader.C

233 lines
5.3 KiB
C

/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
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 2 of the License, or (at your
option) any later version.
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
along with OpenFOAM; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
\*---------------------------------------------------------------------------*/
#include "meshReader.H"
#include "Time.H"
#include "polyMesh.H"
#include "faceSet.H"
#include "emptyPolyPatch.H"
#include "cellModeller.H"
#include "demandDrivenData.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
const Foam::cellModel* Foam::meshReader::unknownModel = Foam::cellModeller::
lookup
(
"unknown"
);
const Foam::cellModel* Foam::meshReader::tetModel = Foam::cellModeller::
lookup
(
"tet"
);
const Foam::cellModel* Foam::meshReader::pyrModel = Foam::cellModeller::
lookup
(
"pyr"
);
const Foam::cellModel* Foam::meshReader::prismModel = Foam::cellModeller::
lookup
(
"prism"
);
const Foam::cellModel* Foam::meshReader::hexModel = Foam::cellModeller::
lookup
(
"hex"
);
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
void Foam::meshReader::addCellZones(polyMesh& mesh) const
{
cellTable_.addCellZones(mesh, cellTableId_);
warnDuplicates("cellZones", mesh.cellZones().names());
}
void Foam::meshReader::addFaceZones(polyMesh& mesh) const
{
label nZone = monitoringSets_.size();
mesh.faceZones().setSize(nZone);
if (!nZone)
{
return;
}
nZone = 0;
for
(
HashTable<List<label>, word, string::hash>::const_iterator
iter = monitoringSets_.begin();
iter != monitoringSets_.end();
++iter
)
{
Info<< "faceZone " << nZone
<< " (size: " << iter().size() << ") name: "
<< iter.key() << endl;
mesh.faceZones().set
(
nZone,
new faceZone
(
iter.key(),
iter(),
List<bool>(iter().size(), false),
nZone,
mesh.faceZones()
)
);
nZone++;
}
mesh.faceZones().writeOpt() = IOobject::AUTO_WRITE;
warnDuplicates("faceZones", mesh.faceZones().names());
}
Foam::autoPtr<Foam::polyMesh> Foam::meshReader::mesh
(
const objectRegistry& registry
)
{
readGeometry();
Info<< "Creating a polyMesh" << endl;
createPolyCells();
Info<< "Number of internal faces: " << nInternalFaces_ << endl;
createPolyBoundary();
clearExtraStorage();
autoPtr<polyMesh> mesh
(
new polyMesh
(
IOobject
(
polyMesh::defaultRegion,
"constant",
registry
),
xferMove(points_),
xferMove(meshFaces_),
xferMove(cellPolys_)
)
);
// adding patches also checks the mesh
mesh().addPatches(polyBoundaryPatches(mesh));
warnDuplicates("boundaries", mesh().boundaryMesh().names());
addCellZones(mesh());
addFaceZones(mesh());
return mesh;
}
void Foam::meshReader::writeMesh
(
const polyMesh& mesh,
IOstream::streamFormat fmt
) const
{
mesh.removeFiles();
Info<< "Writing polyMesh" << endl;
mesh.writeObject
(
fmt,
IOstream::currentVersion,
IOstream::UNCOMPRESSED
);
writeAux(mesh);
}
void Foam::meshReader::clearExtraStorage()
{
cellFaces_.clear();
baffleFaces_.clear();
boundaryIds_.clear();
baffleIds_.clear();
deleteDemandDrivenData(pointCellsPtr_);
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::meshReader::meshReader
(
const fileName& fileOrPrefix,
const scalar scaleFactor
)
:
pointCellsPtr_(NULL),
nInternalFaces_(0),
patchStarts_(0),
patchSizes_(0),
interfaces_(0),
baffleIds_(0),
meshFaces_(0),
cellPolys_(0),
geometryFile_(fileOrPrefix),
scaleFactor_(scaleFactor),
points_(0),
origCellId_(0),
boundaryIds_(0),
patchTypes_(0),
patchNames_(0),
patchPhysicalTypes_(0),
cellFaces_(0),
baffleFaces_(0),
cellTableId_(0),
cellTable_()
{}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::meshReader::~meshReader()
{
deleteDemandDrivenData(pointCellsPtr_);
}
// ************************************************************************* //