ENH: support fieldScale for more surface writers

This commit is contained in:
Mark Olesen
2020-09-08 15:06:56 +02:00
parent a9bf69b551
commit f8ffee8135
11 changed files with 129 additions and 30 deletions

View File

@ -56,7 +56,8 @@ Foam::surfaceWriters::boundaryDataWriter::boundaryDataWriter()
: :
surfaceWriter(), surfaceWriter(),
header_(true), header_(true),
streamOpt_() streamOpt_(),
fieldScale_()
{} {}
@ -71,7 +72,8 @@ Foam::surfaceWriters::boundaryDataWriter::boundaryDataWriter
( (
IOstream::formatEnum("format", options, IOstream::ASCII), IOstream::formatEnum("format", options, IOstream::ASCII),
IOstream::compressionEnum("compression", options) IOstream::compressionEnum("compression", options)
) ),
fieldScale_(options.subOrEmptyDict("fieldScale"))
{} {}
@ -188,12 +190,23 @@ Foam::fileName Foam::surfaceWriters::boundaryDataWriter::writeTemplate
const fileName outputFile(surfaceDir/timeName()/fieldName); const fileName outputFile(surfaceDir/timeName()/fieldName);
// Output scaling for the variable, but not for integer types.
// could also solve with clever templating
const scalar varScale =
(
std::is_integral<Type>::value
? scalar(1)
: fieldScale_.getOrDefault<scalar>(fieldName, 1)
);
// Dummy Time to use as objectRegistry // Dummy Time to use as objectRegistry
autoPtr<Time> dummyTimePtr(Time::New(argList::envGlobalPath())); autoPtr<Time> dummyTimePtr(Time::New(argList::envGlobalPath()));
// Geometry merge() implicit // Implicit geometry merge()
tmp<Field<Type>> tfield = mergeField(localValues); tmp<Field<Type>> tfield = mergeField(localValues) * varScale;
const meshedSurf& surf = surface(); const meshedSurf& surf = surface();

View File

@ -49,6 +49,7 @@ Description
header | Generate files with FoamFile header | no | true header | Generate files with FoamFile header | no | true
format | ascii/binary | no | ascii format | ascii/binary | no | ascii
compression | Use file compression | no | false compression | Use file compression | no | false
fieldScale | output field scaling (dictionary) | no | empty
\endtable \endtable
Typical way of working: Typical way of working:
@ -64,6 +65,10 @@ Description
boundaryData boundaryData
{ {
format binary; format binary;
fieldScale
{
"p.*" 0.01; // [Pa] -> [mbar]
}
} }
} }
surfaces surfaces
@ -148,6 +153,9 @@ class boundaryDataWriter
//- Output stream option //- Output stream option
IOstreamOption streamOpt_; IOstreamOption streamOpt_;
//- Output field scaling
const dictionary fieldScale_;
// Private Member Functions // Private Member Functions
@ -172,7 +180,7 @@ public:
boundaryDataWriter(); boundaryDataWriter();
//- Construct with some output options //- Construct with some output options
boundaryDataWriter(const dictionary& options); explicit boundaryDataWriter(const dictionary& options);
//- Construct from components //- Construct from components
boundaryDataWriter boundaryDataWriter

View File

@ -50,7 +50,8 @@ namespace surfaceWriters
Foam::surfaceWriters::foamWriter::foamWriter() Foam::surfaceWriters::foamWriter::foamWriter()
: :
surfaceWriter(), surfaceWriter(),
streamOpt_() streamOpt_(),
fieldScale_()
{} {}
@ -64,7 +65,8 @@ Foam::surfaceWriters::foamWriter::foamWriter
( (
IOstream::formatEnum("format", options, IOstream::ASCII), IOstream::formatEnum("format", options, IOstream::ASCII),
IOstream::compressionEnum("compression", options) IOstream::compressionEnum("compression", options)
) ),
fieldScale_(options.subOrEmptyDict("fieldScale"))
{} {}
@ -104,7 +106,7 @@ Foam::fileName Foam::surfaceWriters::foamWriter::write()
checkOpen(); checkOpen();
// Geometry: // Geometry:
// - rootdir/<TIME>/surfaceName/{points,faces} // - rootdir/<TIME>/surfaceName/{points,faces,faceCentres}
fileName surfaceDir = outputPath_; fileName surfaceDir = outputPath_;
if (useTimeDir() && !timeName().empty()) if (useTimeDir() && !timeName().empty())
@ -192,14 +194,30 @@ Foam::fileName Foam::surfaceWriters::foamWriter::writeTemplate
/ fieldName / fieldName
); );
// Output scaling for the variable, but not for integer types.
// could also solve with clever templating
const scalar varScale =
(
std::is_integral<Type>::value
? scalar(1)
: fieldScale_.getOrDefault<scalar>(fieldName, 1)
);
if (verbose_) if (verbose_)
{ {
Info<< "Writing field " << fieldName << " to " << surfaceDir << endl; Info<< "Writing field " << fieldName;
if (!equal(varScale, 1))
{
Info<< " (scaling " << varScale << ')';
}
Info<< " to " << surfaceDir << endl;
} }
// geometry merge() implicit // Implicit geometry merge()
tmp<Field<Type>> tfield = mergeField(localValues); tmp<Field<Type>> tfield = mergeField(localValues) * varScale;
if (Pstream::master()) if (Pstream::master())
{ {

View File

@ -37,6 +37,11 @@ Description
{ {
format ascii; format ascii;
compression true; compression true;
fieldScale
{
"p.*" 0.01; // [Pa] -> [mbar]
}
} }
} }
\endverbatim \endverbatim
@ -46,6 +51,7 @@ Description
Property | Description | Required | Default Property | Description | Required | Default
format | ascii/binary | no | ascii format | ascii/binary | no | ascii
compression | output file compression | no | false compression | output file compression | no | false
fieldScale | output field scaling (dictionary) | no | empty
\endtable \endtable
\heading Output file locations \heading Output file locations
@ -103,9 +109,12 @@ class foamWriter
{ {
// Private Data // Private Data
//- Output stream option //- Output stream option (default: IOstream::ASCII, uncompressed)
IOstreamOption streamOpt_; IOstreamOption streamOpt_;
//- Output field scaling
const dictionary fieldScale_;
// Private Member Functions // Private Member Functions

View File

@ -192,6 +192,7 @@ Foam::fileName Foam::surfaceWriters::nastranWriter::writeTemplate
Info<< " to " << outputFile << endl; Info<< " to " << outputFile << endl;
} }
// Emit any common warnings // Emit any common warnings
if (format == loadFormat::PLOAD2 && pTraits<Type>::nComponents != 1) if (format == loadFormat::PLOAD2 && pTraits<Type>::nComponents != 1)
{ {
@ -202,8 +203,8 @@ Foam::fileName Foam::surfaceWriters::nastranWriter::writeTemplate
} }
// geometry merge() implicit // Implicit geometry merge()
tmp<Field<Type>> tfield = mergeField(localValues); tmp<Field<Type>> tfield = mergeField(localValues) * varScale;
const meshedSurf& surf = surface(); const meshedSurf& surf = surface();
@ -294,7 +295,7 @@ Foam::fileName Foam::surfaceWriters::nastranWriter::writeTemplate
{ {
v += values[verti]; v += values[verti];
} }
v *= (varScale / f.size()); v /= f.size();
writeFaceValue(os, format, v, ++elemId); writeFaceValue(os, format, v, ++elemId);
} }
@ -310,7 +311,7 @@ Foam::fileName Foam::surfaceWriters::nastranWriter::writeTemplate
{ {
v += values[verti]; v += values[verti];
} }
v *= (varScale / f.size()); v /= f.size();
writeFaceValue(os, format, v, ++elemId); writeFaceValue(os, format, v, ++elemId);
} }
@ -327,7 +328,7 @@ Foam::fileName Foam::surfaceWriters::nastranWriter::writeTemplate
elemId = elemIds[facei]; elemId = elemIds[facei];
} }
const Type v(varScale * *valIter); const Type v(*valIter);
++valIter; ++valIter;
label nValues = label nValues =

View File

@ -152,8 +152,8 @@ Foam::fileName Foam::surfaceWriters::rawWriter::writeTemplate
} }
// geometry merge() implicit // Implicit geometry merge()
tmp<Field<Type>> tfield = mergeField(localValues); tmp<Field<Type>> tfield = mergeField(localValues) * varScale;
const meshedSurf& surf = surface(); const meshedSurf& surf = surface();
@ -194,7 +194,7 @@ Foam::fileName Foam::surfaceWriters::rawWriter::writeTemplate
forAll(values, elemi) forAll(values, elemi)
{ {
writePoint(os, points[elemi]*geometryScale_); writePoint(os, points[elemi]*geometryScale_);
writeData(os, values[elemi]*varScale); writeData(os, values[elemi]);
} }
} }
else else
@ -203,7 +203,7 @@ Foam::fileName Foam::surfaceWriters::rawWriter::writeTemplate
forAll(values, elemi) forAll(values, elemi)
{ {
writePoint(os, faces[elemi].centre(points)*geometryScale_); writePoint(os, faces[elemi].centre(points)*geometryScale_);
writeData(os, values[elemi]*varScale); writeData(os, values[elemi]);
} }
} }
} }

View File

@ -69,7 +69,8 @@ namespace Foam
Foam::surfaceWriters::starcdWriter::starcdWriter() Foam::surfaceWriters::starcdWriter::starcdWriter()
: :
surfaceWriter(), surfaceWriter(),
streamOpt_() streamOpt_(),
fieldScale_()
{} {}
@ -83,7 +84,8 @@ Foam::surfaceWriters::starcdWriter::starcdWriter
( (
IOstream::ASCII, IOstream::ASCII,
IOstream::compressionEnum("compression", options) IOstream::compressionEnum("compression", options)
) ),
fieldScale_(options.subOrEmptyDict("fieldScale"))
{} {}
@ -206,14 +208,30 @@ Foam::fileName Foam::surfaceWriters::starcdWriter::writeTemplate
outputFile /= fieldName + '_' + outputPath_.name(); outputFile /= fieldName + '_' + outputPath_.name();
outputFile.ext("usr"); outputFile.ext("usr");
// Output scaling for the variable, but not for integer types.
// could also solve with clever templating
const scalar varScale =
(
std::is_integral<Type>::value
? scalar(1)
: fieldScale_.getOrDefault<scalar>(fieldName, 1)
);
if (verbose_) if (verbose_)
{ {
Info<< "Writing field " << fieldName << " to " << outputFile << endl; Info<< "Writing field " << fieldName;
if (!equal(varScale, 1))
{
Info<< " (scaling " << varScale << ')';
}
Info<< " to " << outputFile << endl;
} }
// geometry merge() implicit // Implicit geometry merge()
tmp<Field<Type>> tfield = mergeField(localValues); tmp<Field<Type>> tfield = mergeField(localValues) * varScale;
const meshedSurf& surf = surface(); const meshedSurf& surf = surface();

View File

@ -34,6 +34,7 @@ Description
\table \table
Property | Description | Required | Default Property | Description | Required | Default
compression | Use file compression | no | false compression | Use file compression | no | false
fieldScale | output field scaling (dictionary) | no | empty
\endtable \endtable
The geometry is written via the MeshedSurfaceProxy, the fields The geometry is written via the MeshedSurfaceProxy, the fields
@ -100,6 +101,9 @@ class starcdWriter
//- Output stream option //- Output stream option
IOstreamOption streamOpt_; IOstreamOption streamOpt_;
//- Output field scaling
const dictionary fieldScale_;
// Private Member Functions // Private Member Functions

View File

@ -66,6 +66,7 @@ Foam::surfaceWriters::vtkWriter::vtkWriter()
surfaceWriter(), surfaceWriter(),
fmtType_(static_cast<unsigned>(vtk::formatType::INLINE_BASE64)), fmtType_(static_cast<unsigned>(vtk::formatType::INLINE_BASE64)),
precision_(IOstream::defaultPrecision()), precision_(IOstream::defaultPrecision()),
fieldScale_(),
writer_(nullptr) writer_(nullptr)
{} {}
@ -78,6 +79,7 @@ Foam::surfaceWriters::vtkWriter::vtkWriter
surfaceWriter(), surfaceWriter(),
fmtType_(static_cast<unsigned>(opts.fmt())), fmtType_(static_cast<unsigned>(opts.fmt())),
precision_(opts.precision()), precision_(opts.precision()),
fieldScale_(),
writer_(nullptr) writer_(nullptr)
{} {}
@ -93,6 +95,7 @@ Foam::surfaceWriters::vtkWriter::vtkWriter
( (
options.getOrDefault("precision", IOstream::defaultPrecision()) options.getOrDefault("precision", IOstream::defaultPrecision())
), ),
fieldScale_(options.subOrEmptyDict("fieldScale")),
writer_(nullptr) writer_(nullptr)
{ {
// format: ascii | binary // format: ascii | binary
@ -259,13 +262,30 @@ Foam::fileName Foam::surfaceWriters::vtkWriter::writeTemplate
// Open file, writing geometry (if required) // Open file, writing geometry (if required)
fileName outputFile = this->write(); fileName outputFile = this->write();
// Output scaling for the variable, but not for integer types.
// could also solve with clever templating
const scalar varScale =
(
std::is_integral<Type>::value
? scalar(1)
: fieldScale_.getOrDefault<scalar>(fieldName, 1)
);
if (verbose_) if (verbose_)
{ {
Info<< "Writing field " << fieldName << " to " << outputFile << endl; Info<< "Writing field " << fieldName;
if (!equal(varScale, 1))
{
Info<< " (scaling " << varScale << ')';
}
Info<< " to " << outputFile << endl;
} }
// geometry merge() implicit
tmp<Field<Type>> tfield = mergeField(localValues); // Implicit geometry merge()
tmp<Field<Type>> tfield = mergeField(localValues) * varScale;
if (Pstream::master() || !parallel_) if (Pstream::master() || !parallel_)
{ {

View File

@ -36,6 +36,7 @@ Description
format | ascii or binary format | no | binary format | ascii or binary format | no | binary
legacy | Legacy VTK output | no | false legacy | Legacy VTK output | no | false
precision | Write precision in ascii | no | same as IOstream precision | Write precision in ascii | no | same as IOstream
fieldScale | output field scaling (dictionary) | no | empty
\endtable \endtable
For example, For example,
@ -47,6 +48,10 @@ Description
format binary; format binary;
legacy false; legacy false;
precision 10; precision 10;
fieldScale
{
"p.*" 0.01; // [Pa] -> [mbar]
}
} }
} }
\endverbatim \endverbatim
@ -105,6 +110,9 @@ class vtkWriter
//- ASCII write precision //- ASCII write precision
unsigned precision_; unsigned precision_;
//- Output field scaling
const dictionary fieldScale_;
//- Backend writer - master only //- Backend writer - master only
autoPtr<Foam::vtk::surfaceWriter> writer_; autoPtr<Foam::vtk::surfaceWriter> writer_;

View File

@ -276,7 +276,7 @@ Foam::fileName Foam::surfaceWriters::x3dWriter::writeTemplate
const meshedSurf& surf = surface(); const meshedSurf& surf = surface();
// geometry merge() implicit // Implicit geometry merge()
tmp<Field<Type>> tfield = mergeField(localValues); tmp<Field<Type>> tfield = mergeField(localValues);
if (Pstream::master() || !parallel_) if (Pstream::master() || !parallel_)