ENH: improved consistency of surface writers (#1232)

- remove writeGeometry() in favour of write() and make it pure virtual
  so that all writers must explicitly deal with it.

- establish proxy extension at construction time and treated as an
  invariant thereafter. This avoids potentially surprising changes in
  behaviour when writing.
This commit is contained in:
Mark Olesen 2019-03-11 15:09:03 +01:00 committed by Andrew Heather
parent 7a5e72978a
commit 773ec00d4b
14 changed files with 145 additions and 41 deletions

View File

@ -0,0 +1,3 @@
Test-surfaceWriter.C
EXE = $(FOAM_USER_APPBIN)/Test-surfaceWriter

View File

@ -0,0 +1,5 @@
EXE_INC = \
-I$(LIB_SRC)/surfMesh/lnInclude
EXE_LIBS = \
-lsurfMesh

View File

@ -0,0 +1,115 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2019 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 3 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, see <http://www.gnu.org/licenses/>.
Application
Test-surfaceWriter
Group
grpSurfaceUtilities
Description
Test surface writers.
Usage
\b Test-surfaceWriter inputFile outputFile
\*---------------------------------------------------------------------------*/
#include "argList.H"
#include "surfaceWriter.H"
#include "MeshedSurfaces.H"
using namespace Foam;
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
int main(int argc, char *argv[])
{
argList::addNote
(
"convert between surface formats, "
"but primarily for testing functionality\n"
"Normally use surfaceMeshConvert instead."
);
argList::noParallel();
argList::noFunctionObjects();
argList::addOption
(
"type",
"writerType"
);
argList::addArgument("inputFile");
argList::addArgument("outputFile");
#include "setRootCase.H"
const fileName importName = args[1];
const fileName exportName = args[2];
if (importName == exportName)
{
FatalErrorInFunction
<< "Output file " << exportName << " would overwrite input file."
<< exit(FatalError);
}
if (!MeshedSurface<face>::canRead(importName, true))
{
return 1;
}
const word writerType =
args.lookupOrDefault<word>("type", exportName.ext());
auto surfWriter = surfaceWriter::New(writerType);
{
MeshedSurface<face> surf(importName);
Info<< "Read surface:" << endl;
surf.writeStats(Info);
Info<< "Open " << exportName
<< " for writing with " << surfWriter->type() << nl;
surfWriter->open
(
surf.points(),
surf.surfFaces(),
exportName.lessExt(),
false // serial
);
surfWriter->write();
}
Info<< "\nEnd\n" << endl;
return 0;
}
// ************************************************************************* //

View File

@ -250,7 +250,7 @@ void Foam::mergeAndWrite
false // serial - already merged
);
writer.writeGeometry();
writer.write();
writer.clear();
}
}
@ -264,7 +264,7 @@ void Foam::mergeAndWrite
false // serial - already merged
);
writer.writeGeometry();
writer.write();
writer.clear();
}
}

View File

@ -560,7 +560,7 @@ bool Foam::sampledSurfaces::performAction(unsigned request)
// Write geometry if no fields would otherwise be written
if (!outWriter.nFields() || outWriter.separateGeometry())
{
outWriter.writeGeometry();
outWriter.write();
continue;
}

View File

@ -165,13 +165,12 @@ public:
//- Write surface geometry to file.
virtual fileName write(); // override
declareSurfaceWriterWriteMethod(label);
declareSurfaceWriterWriteMethod(scalar);
declareSurfaceWriterWriteMethod(vector);
declareSurfaceWriterWriteMethod(sphericalTensor);
declareSurfaceWriterWriteMethod(symmTensor);
declareSurfaceWriterWriteMethod(tensor);
declareSurfaceWriterWriteMethod(label);
declareSurfaceWriterWriteMethod(scalar);
declareSurfaceWriterWriteMethod(vector);
declareSurfaceWriterWriteMethod(sphericalTensor);
declareSurfaceWriterWriteMethod(symmTensor);
declareSurfaceWriterWriteMethod(tensor);
};

View File

@ -174,7 +174,7 @@ public:
// False if geometry and field must be in a single file
virtual bool separateGeometry() const;
//- Write single surface geometry to file.
//- Write surface geometry to file.
virtual fileName write(); // override
declareSurfaceWriterWriteMethod(label);

View File

@ -236,8 +236,6 @@ public:
// Member Functions
// Write
//- Write surface geometry to file.
virtual fileName write(); // override

View File

@ -114,6 +114,12 @@ void Foam::surfaceWriters::nullWriter::open(const fileName& outputPath)
{}
Foam::fileName Foam::surfaceWriters::nullWriter::write()
{
return fileName::null;
}
// Field writing methods
defineSurfaceWriterWriteFields(Foam::surfaceWriters::nullWriter);

View File

@ -102,7 +102,7 @@ public:
virtual bool enabled() const;
// Surface association
// Surface Association
//- Change association with a surface (no-op).
virtual void setSurface
@ -128,6 +128,8 @@ public:
// Write
virtual fileName write(); // override;
declareSurfaceWriterWriteMethod(label);
declareSurfaceWriterWriteMethod(scalar);
declareSurfaceWriterWriteMethod(vector);

View File

@ -93,16 +93,6 @@ Foam::surfaceWriters::proxyWriter::proxyWriter
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::surfaceWriters::proxyWriter::open
(
const fileName& outputPath
)
{
fileExtension_ = outputPath.ext();
surfaceWriter::open(outputPath);
}
Foam::fileName Foam::surfaceWriters::proxyWriter::write()
{
checkOpen();

View File

@ -119,23 +119,12 @@ public:
// Member Functions
// Capability
//- A separate file is required for geometry.
virtual bool separateGeometry() const
{
return true;
}
// Output
//- Open for output on specified path, using existing surface
virtual void open(const fileName& outputPath); // override
// Write
//- Write surface geometry to file.
virtual fileName write(); // override

View File

@ -146,7 +146,7 @@ public:
return true;
}
//- Write single surface geometry to file.
//- Write surface geometry to file.
virtual fileName write(); // override
declareSurfaceWriterWriteMethod(label);

View File

@ -462,11 +462,8 @@ public:
// Write
//- Write single surface geometry to file.
virtual fileName writeGeometry() const
{
return fileName::null;
}
//- Write separate surface geometry to file.
virtual fileName write() = 0;
#undef declareSurfaceWriterWriteMethod