mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: support fieldScale for more surface writers
This commit is contained in:
@ -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();
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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())
|
||||
{
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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 =
|
||||
|
||||
@ -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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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();
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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_)
|
||||
{
|
||||
|
||||
@ -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_;
|
||||
|
||||
|
||||
@ -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_)
|
||||
|
||||
Reference in New Issue
Block a user