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(),
header_(true),
streamOpt_()
streamOpt_(),
fieldScale_()
{}
@ -71,7 +72,8 @@ Foam::surfaceWriters::boundaryDataWriter::boundaryDataWriter
(
IOstream::formatEnum("format", options, IOstream::ASCII),
IOstream::compressionEnum("compression", options)
)
),
fieldScale_(options.subOrEmptyDict("fieldScale"))
{}
@ -188,12 +190,23 @@ Foam::fileName Foam::surfaceWriters::boundaryDataWriter::writeTemplate
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
autoPtr<Time> dummyTimePtr(Time::New(argList::envGlobalPath()));
// Geometry merge() implicit
tmp<Field<Type>> tfield = mergeField(localValues);
// Implicit geometry merge()
tmp<Field<Type>> tfield = mergeField(localValues) * varScale;
const meshedSurf& surf = surface();

View File

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

View File

@ -50,7 +50,8 @@ namespace surfaceWriters
Foam::surfaceWriters::foamWriter::foamWriter()
:
surfaceWriter(),
streamOpt_()
streamOpt_(),
fieldScale_()
{}
@ -64,7 +65,8 @@ Foam::surfaceWriters::foamWriter::foamWriter
(
IOstream::formatEnum("format", options, IOstream::ASCII),
IOstream::compressionEnum("compression", options)
)
),
fieldScale_(options.subOrEmptyDict("fieldScale"))
{}
@ -104,7 +106,7 @@ Foam::fileName Foam::surfaceWriters::foamWriter::write()
checkOpen();
// Geometry:
// - rootdir/<TIME>/surfaceName/{points,faces}
// - rootdir/<TIME>/surfaceName/{points,faces,faceCentres}
fileName surfaceDir = outputPath_;
if (useTimeDir() && !timeName().empty())
@ -192,14 +194,30 @@ Foam::fileName Foam::surfaceWriters::foamWriter::writeTemplate
/ 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_)
{
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
tmp<Field<Type>> tfield = mergeField(localValues);
// Implicit geometry merge()
tmp<Field<Type>> tfield = mergeField(localValues) * varScale;
if (Pstream::master())
{

View File

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

View File

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

View File

@ -152,8 +152,8 @@ Foam::fileName Foam::surfaceWriters::rawWriter::writeTemplate
}
// geometry merge() implicit
tmp<Field<Type>> tfield = mergeField(localValues);
// Implicit geometry merge()
tmp<Field<Type>> tfield = mergeField(localValues) * varScale;
const meshedSurf& surf = surface();
@ -194,7 +194,7 @@ Foam::fileName Foam::surfaceWriters::rawWriter::writeTemplate
forAll(values, elemi)
{
writePoint(os, points[elemi]*geometryScale_);
writeData(os, values[elemi]*varScale);
writeData(os, values[elemi]);
}
}
else
@ -203,7 +203,7 @@ Foam::fileName Foam::surfaceWriters::rawWriter::writeTemplate
forAll(values, elemi)
{
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()
:
surfaceWriter(),
streamOpt_()
streamOpt_(),
fieldScale_()
{}
@ -83,7 +84,8 @@ Foam::surfaceWriters::starcdWriter::starcdWriter
(
IOstream::ASCII,
IOstream::compressionEnum("compression", options)
)
),
fieldScale_(options.subOrEmptyDict("fieldScale"))
{}
@ -206,14 +208,30 @@ Foam::fileName Foam::surfaceWriters::starcdWriter::writeTemplate
outputFile /= fieldName + '_' + outputPath_.name();
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_)
{
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;
const meshedSurf& surf = surface();

View File

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

View File

@ -66,6 +66,7 @@ Foam::surfaceWriters::vtkWriter::vtkWriter()
surfaceWriter(),
fmtType_(static_cast<unsigned>(vtk::formatType::INLINE_BASE64)),
precision_(IOstream::defaultPrecision()),
fieldScale_(),
writer_(nullptr)
{}
@ -78,6 +79,7 @@ Foam::surfaceWriters::vtkWriter::vtkWriter
surfaceWriter(),
fmtType_(static_cast<unsigned>(opts.fmt())),
precision_(opts.precision()),
fieldScale_(),
writer_(nullptr)
{}
@ -93,6 +95,7 @@ Foam::surfaceWriters::vtkWriter::vtkWriter
(
options.getOrDefault("precision", IOstream::defaultPrecision())
),
fieldScale_(options.subOrEmptyDict("fieldScale")),
writer_(nullptr)
{
// format: ascii | binary
@ -259,13 +262,30 @@ Foam::fileName Foam::surfaceWriters::vtkWriter::writeTemplate
// Open file, writing geometry (if required)
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_)
{
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_)
{

View File

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

View File

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