From ce3d79de1c67ebfa0b47dc4bf8a8bacc7ae2e14d Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Tue, 10 Mar 2009 01:37:06 +0100 Subject: [PATCH] surfMesh changes - can read MeshedSurface, UnsortedMeshedSurface from surfMesh/ - can write surfMesh in any third-party format --- .../surfaceMeshConvertTesting.C | 19 ++- src/surfMesh/MeshedSurface/MeshedSurface.C | 55 +++++-- src/surfMesh/MeshedSurface/MeshedSurface.H | 16 +- src/surfMesh/MeshedSurface/MeshedSurfaceIO.C | 2 +- src/surfMesh/MeshedSurface/MeshedSurfaceNew.C | 4 +- .../MeshedSurface/MeshedSurfaceZones.C | 25 +-- .../MeshedSurfaceProxy/MeshedSurfaceProxy.C | 148 +++++++++++++++--- .../MeshedSurfaceProxy/MeshedSurfaceProxy.H | 21 +-- .../UnsortedMeshedSurface.C | 109 +++++++++++-- .../UnsortedMeshedSurface.H | 19 +-- src/surfMesh/surfMesh/surfMesh.H | 7 +- .../surfaceFormats/surfaceFormatsCore.C | 118 ++------------ .../surfaceFormats/surfaceFormatsCore.H | 33 ++-- 13 files changed, 337 insertions(+), 239 deletions(-) diff --git a/applications/utilities/surface/surfaceMeshConvertTesting/surfaceMeshConvertTesting.C b/applications/utilities/surface/surfaceMeshConvertTesting/surfaceMeshConvertTesting.C index daece06c1d..f245e4088b 100644 --- a/applications/utilities/surface/surfaceMeshConvertTesting/surfaceMeshConvertTesting.C +++ b/applications/utilities/surface/surfaceMeshConvertTesting/surfaceMeshConvertTesting.C @@ -278,6 +278,14 @@ int main(int argc, char *argv[]) Info<< "runTime.timeName() = " << runTime.timeName() << endl; + Info<< "write MeshedSurface 'yetAnother' via proxy as surfMesh" + << endl; + surf.write + ( + runTime, + "yetAnother" + ); + surfMesh surfIn ( IOobject @@ -291,7 +299,16 @@ int main(int argc, char *argv[]) ); - Info<< "surfIn = " << surfIn.nFaces() << endl; + MeshedSurface surfIn2(runTime, "foobar"); + + Info<<"surfIn2 = " << surfIn2.size() << endl; + + Info<< "surfIn = " << surfIn.size() << endl; + + + Info<< "writing surfMesh as obj = oldSurfIn.obj" << endl; + surfIn.write("oldSurfIn.obj"); + Info<< "runTime.instance() = " << runTime.instance() << endl; diff --git a/src/surfMesh/MeshedSurface/MeshedSurface.C b/src/surfMesh/MeshedSurface/MeshedSurface.C index 0a1440ff1f..8bcab42089 100644 --- a/src/surfMesh/MeshedSurface/MeshedSurface.C +++ b/src/surfMesh/MeshedSurface/MeshedSurface.C @@ -28,8 +28,6 @@ License #include "UnsortedMeshedSurface.H" #include "MeshedSurfaceProxy.H" #include "mergePoints.H" -#include "IFstream.H" -#include "OFstream.H" #include "Time.H" #include "ListOps.H" #include "polyBoundaryMesh.H" @@ -140,12 +138,7 @@ void Foam::MeshedSurface::write if (supported.found(ext)) { - MeshedSurfaceProxy - ( - surf.points(), - surf.faces(), - surf.surfZones() - ).write(name); + MeshedSurfaceProxy(surf).write(name); } else { @@ -367,11 +360,37 @@ Foam::MeshedSurface::MeshedSurface(const fileName& name) template -Foam::MeshedSurface::MeshedSurface(const Time& d, const word& surfName) +Foam::MeshedSurface::MeshedSurface +( + const Time& t, + const word& surfName +) : ParentType(List(), pointField()) { - read(this->findMeshFile(d, surfName)); + surfMesh mesh + ( + IOobject + ( + "dummyName", + t.timeName(), + t, + IOobject::MUST_READ, + IOobject::NO_WRITE, + false + ), + surfName + ); + + // same face type as surfMesh + MeshedSurface surf + ( + xferMove(mesh.storedPoints()), + xferMove(mesh.storedFaces()), + xferMove(mesh.storedZones()) + ); + + this->transcribe(surf); } @@ -1133,11 +1152,11 @@ bool Foam::MeshedSurface::read template void Foam::MeshedSurface::write ( - const Time& d, + const Time& t, const word& surfName ) const { - write(findMeshFile(d, surfName)); + MeshedSurfaceProxy(*this).write(t, surfName); } // * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // @@ -1153,6 +1172,18 @@ void Foam::MeshedSurface::operator=(const MeshedSurface& surf) } +template +Foam::MeshedSurface::operator +Foam::MeshedSurfaceProxy() const +{ + return MeshedSurfaceProxy + ( + this->points(), + this->faces(), + this->surfZones() + ); +} + // * * * * * * * * * * * * * * * Friend Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // diff --git a/src/surfMesh/MeshedSurface/MeshedSurface.H b/src/surfMesh/MeshedSurface/MeshedSurface.H index 51701bc499..5677233e0b 100644 --- a/src/surfMesh/MeshedSurface/MeshedSurface.H +++ b/src/surfMesh/MeshedSurface/MeshedSurface.H @@ -85,14 +85,9 @@ class MeshedSurface public PrimitivePatch, public fileFormats::surfaceFormatsCore { - // friends despite different faces - template - friend class MeshedSurface; - - // friends despite different faces - template - friend class UnsortedMeshedSurface; - + // friends - despite different face representationsx + template friend class MeshedSurface; + template friend class UnsortedMeshedSurface; friend class surfMesh; private: @@ -232,7 +227,7 @@ public: //- Construct from file name (uses extension to determine type) MeshedSurface(const fileName&, const word& ext); - //- Construct from objectRegistry + //- Construct from database MeshedSurface(const Time&, const word& surfName=""); // Declare run-time constructor selection table @@ -437,6 +432,9 @@ public: void operator=(const MeshedSurface&); + //- Conversion operator to MeshedSurfaceProxy + operator MeshedSurfaceProxy() const; + }; diff --git a/src/surfMesh/MeshedSurface/MeshedSurfaceIO.C b/src/surfMesh/MeshedSurface/MeshedSurfaceIO.C index bdf7c28c80..93069a5d8c 100644 --- a/src/surfMesh/MeshedSurface/MeshedSurfaceIO.C +++ b/src/surfMesh/MeshedSurface/MeshedSurfaceIO.C @@ -34,7 +34,7 @@ template void Foam::MeshedSurface::writeStats(Ostream& os) const { os << "points : " << this->points().size() << nl; - if (this->isTri()) + if (MeshedSurface::isTri()) { os << "triangles : " << this->size() << nl; } diff --git a/src/surfMesh/MeshedSurface/MeshedSurfaceNew.C b/src/surfMesh/MeshedSurface/MeshedSurfaceNew.C index cd3f238c62..bdaae876a1 100644 --- a/src/surfMesh/MeshedSurface/MeshedSurfaceNew.C +++ b/src/surfMesh/MeshedSurface/MeshedSurfaceNew.C @@ -51,7 +51,7 @@ Foam::MeshedSurface::New(const fileName& name, const word& ext) if (supported.found(ext)) { // create indirectly - autoPtr > surf(new MeshedSurface); + autoPtr< MeshedSurface > surf(new MeshedSurface); surf().transfer(FriendType::New(name, ext)()); return surf; @@ -70,7 +70,7 @@ Foam::MeshedSurface::New(const fileName& name, const word& ext) << exit(FatalError); } - return autoPtr >(cstrIter()(name)); + return autoPtr< MeshedSurface >(cstrIter()(name)); } diff --git a/src/surfMesh/MeshedSurface/MeshedSurfaceZones.C b/src/surfMesh/MeshedSurface/MeshedSurfaceZones.C index 6b5915070f..a31e8d6314 100644 --- a/src/surfMesh/MeshedSurface/MeshedSurfaceZones.C +++ b/src/surfMesh/MeshedSurface/MeshedSurfaceZones.C @@ -26,11 +26,6 @@ License #include "MeshedSurface.H" -// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // -// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * // -// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // -// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // -// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // template @@ -38,7 +33,7 @@ void Foam::MeshedSurface::checkZones() { // extra safety, ensure we have at some zones // and they cover all the faces - fix start silently - surfZoneList& zones = storedZones(); + surfZoneList& zones = this->storedZones(); if (zones.size()) { label count = 0; @@ -48,25 +43,25 @@ void Foam::MeshedSurface::checkZones() count += zones[zoneI].size(); } - if (count < size()) + if (count < this->size()) { WarningIn ( "MeshedSurface::checkZones()\n" ) - << "more faces " << size() << " than zones " << count + << "more faces " << this->size() << " than zones " << count << " ... extending final zone" << endl; - zones[zones.size()-1].size() += count - size(); + zones[zones.size()-1].size() += count - this->size(); } - else if (count > size()) + else if (count > this->size()) { FatalErrorIn ( "MeshedSurface::checkZones()\n" ) - << "more zones " << count << " than faces " << size() + << "more zones " << count << " than faces " << this->size() << exit(FatalError); } } @@ -101,7 +96,7 @@ void Foam::MeshedSurface::sortFacesAndStore List newFaces(faceMap.size()); forAll(faceMap, faceI) { - // use transfer to recover memory if possible + // use transfer to recover memory where possible newFaces[faceI].transfer(oldFaces[faceMap[faceI]]); } this->storedFaces().transfer(newFaces); @@ -205,10 +200,4 @@ void Foam::MeshedSurface::removeZones() } -// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // -// * * * * * * * * * * * * * * * Friend Functions * * * * * * * * * * * * * // -// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - // ************************************************************************* // diff --git a/src/surfMesh/MeshedSurfaceProxy/MeshedSurfaceProxy.C b/src/surfMesh/MeshedSurfaceProxy/MeshedSurfaceProxy.C index 95b7bb911c..0246b40dcf 100644 --- a/src/surfMesh/MeshedSurfaceProxy/MeshedSurfaceProxy.C +++ b/src/surfMesh/MeshedSurfaceProxy/MeshedSurfaceProxy.C @@ -25,9 +25,11 @@ License \*---------------------------------------------------------------------------*/ #include "MeshedSurfaceProxy.H" +#include "MeshedSurface.H" #include "Time.H" #include "surfMesh.H" -#include "MeshedSurface.H" +#include "OFstream.H" +#include "ListOps.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // @@ -86,6 +88,127 @@ void Foam::MeshedSurfaceProxy::write } +template +void Foam::MeshedSurfaceProxy::write +( + const Time& t, + const word& surfName +) const +{ + // the surface name to be used + word name(surfName.size() ? surfName : surfaceRegistry::defaultName); + + if (debug) + { + Info<< "MeshedSurfaceProxy::write" + "(const Time&, const word&) : " + "writing to " << name + << endl; + } + + + // the local location + const fileName objectDir + ( + t.timePath()/surfaceRegistry::subInstance/name/surfMesh::meshSubDir + ); + + if (!isDir(objectDir)) + { + mkDir(objectDir); + } + + + // write surfMesh/points + { + pointIOField io + ( + IOobject + ( + "points", + t.timeName(), + surfMesh::meshSubDir, + t, + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ) + ); + + OFstream os(objectDir/io.name()); + io.writeHeader(os); + + os << this->points(); + + os << "\n\n" + "// ************************************************************************* //\n"; + } + + + // write surfMesh/faces + { + faceIOList io + ( + IOobject + ( + "faces", + t.timeName(), + surfMesh::meshSubDir, + t, + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ) + ); + + OFstream os(objectDir/io.name()); + io.writeHeader(os); + + if (this->useFaceMap()) + { + // this is really a bit annoying (and wasteful) but no other way + os << reorder(this->faceMap(), this->faces()); + } + else + { + os << this->faces(); + } + + os << "\n\n" + "// ************************************************************************* //\n"; + } + + + // write surfMesh/surfZones + { + surfZoneIOList io + ( + IOobject + ( + "surfZones", + t.timeName(), + surfMesh::meshSubDir, + t, + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ) + ); + + OFstream os(objectDir/io.name()); + io.writeHeader(os); + + os << this->surfZones(); + + os << "\n\n" + "// ************************************************************************* //" + << endl; + } + +} + + + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // template @@ -104,19 +227,6 @@ Foam::MeshedSurfaceProxy::MeshedSurfaceProxy {} -template -Foam::MeshedSurfaceProxy::MeshedSurfaceProxy -( - const MeshedSurface& surf -) -: - points_(surf.points()), - faces_(surf.faces()), - zones_(surf.surfZones()), - faceMap_(List