diff --git a/src/surfMesh/writers/nastran/nastranSurfaceWriter.C b/src/surfMesh/writers/nastran/nastranSurfaceWriter.C index fcfae7d7607ce66c8ea266735d27ce2c03a667a8..c59436fb1ffcae7a709fe95fbdbc44228464860c 100644 --- a/src/surfMesh/writers/nastran/nastranSurfaceWriter.C +++ b/src/surfMesh/writers/nastran/nastranSurfaceWriter.C @@ -238,7 +238,7 @@ void Foam::surfaceWriters::nastranWriter::writeGeometry forAll(points, pointi) { - writeCoord(os, points[pointi], pointi); + writeCoord(os, points[pointi]*geometryScale_, pointi); } // Write faces, with on-the-fly decomposition (triangulation) @@ -357,7 +357,8 @@ Foam::surfaceWriters::nastranWriter::nastranWriter() surfaceWriter(), writeFormat_(fieldFormat::SHORT), fieldMap_(), - scale_(1), + geometryScale_(1), + fieldScale_(), separator_() {} @@ -378,7 +379,8 @@ Foam::surfaceWriters::nastranWriter::nastranWriter ) ), fieldMap_(), - scale_(options.lookupOrDefault<scalar>("scale", 1)), + geometryScale_(options.getOrDefault<scalar>("scale", 1)), + fieldScale_(options.subOrEmptyDict("fieldScale")), separator_() { if (writeFormat_ == fieldFormat::FREE) diff --git a/src/surfMesh/writers/nastran/nastranSurfaceWriter.H b/src/surfMesh/writers/nastran/nastranSurfaceWriter.H index e2ddba4ac746b552c8f053a1d510a9659ce5f04e..a56169167bedfef3e549d2a9aee33f4d2b055fb6 100644 --- a/src/surfMesh/writers/nastran/nastranSurfaceWriter.H +++ b/src/surfMesh/writers/nastran/nastranSurfaceWriter.H @@ -35,7 +35,8 @@ Description Property | Description | Required | Default fields | field pairs for PLOAD2, PLOAD4 | yes | format | short / long / free | no | long - scale | output scaling | no | 1 + scale | output geometry scaling | no | 1 + fieldScale | output field scaling (dictionary) | no | empty \endtable For example, @@ -50,8 +51,14 @@ Description (pMean PLOAD2) (p PLOAD4) ); + format free; // format type - scale 2.0; // output scaling + + scale 1000; // [m] -> [mm] + fieldScale + { + "p.*" 0.01; // [Pa] -> [mbar] + } } } \endverbatim @@ -81,6 +88,9 @@ Description `-- surfaceName1.{nas} \endverbatim +Note + Output variable scaling does not apply to integer types such as Ids. + SourceFiles nastranSurfaceWriter.C nastranSurfaceWriterImpl.C @@ -128,8 +138,11 @@ private: //- Mapping from field name to data format enumeration HashTable<loadFormat> fieldMap_; - //- Scale to apply to values (default = 1.0) - scalar scale_; + //- Output geometry scaling + const scalar geometryScale_; + + //- Output field scaling + const dictionary fieldScale_; //- Separator used for free format word separator_; diff --git a/src/surfMesh/writers/nastran/nastranSurfaceWriterImpl.C b/src/surfMesh/writers/nastran/nastranSurfaceWriterImpl.C index 56fee26250114c0cd0503aefd1376352f084d019..bcffc522e3047040ca55c6e4804143a9f401267c 100644 --- a/src/surfMesh/writers/nastran/nastranSurfaceWriterImpl.C +++ b/src/surfMesh/writers/nastran/nastranSurfaceWriterImpl.C @@ -171,8 +171,15 @@ Foam::fileName Foam::surfaceWriters::nastranWriter::writeTemplate outputFile.ext("nas"); - // Currently the same scaling for all variables - const scalar varScale = scale_; + // 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_) { diff --git a/src/surfMesh/writers/raw/rawSurfaceWriter.C b/src/surfMesh/writers/raw/rawSurfaceWriter.C index 93b6f34d6445ebc60e6fbf751e34e4096e914f09..d9df17180e7a4212e7a7eac98a4774b0c1d641b8 100644 --- a/src/surfMesh/writers/raw/rawSurfaceWriter.C +++ b/src/surfMesh/writers/raw/rawSurfaceWriter.C @@ -47,7 +47,7 @@ namespace surfaceWriters // * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * // -namespace Foam +namespace { // Emit x,y,z static inline void writePoint(Foam::Ostream& os, const Foam::point& p) @@ -55,7 +55,7 @@ namespace Foam os << p.x() << ' ' << p.y() << ' ' << p.z(); } -} // End namespace Foam +} // End anonymous namespace // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -72,7 +72,9 @@ defineSurfaceWriterWriteFields(Foam::surfaceWriters::rawWriter); Foam::surfaceWriters::rawWriter::rawWriter() : surfaceWriter(), - streamOpt_() + streamOpt_(), + geometryScale_(1), + fieldScale_() {} @@ -86,7 +88,9 @@ Foam::surfaceWriters::rawWriter::rawWriter ( IOstream::ASCII, IOstream::compressionEnum("compression", options) - ) + ), + geometryScale_(options.getOrDefault<scalar>("scale", 1)), + fieldScale_(options.subOrEmptyDict("fieldScale")) {} @@ -164,7 +168,7 @@ Foam::fileName Foam::surfaceWriters::rawWriter::write() // Write faces centres for (const face& f : faces) { - writePoint(os, f.centre(points)); + writePoint(os, f.centre(points)*geometryScale_); os << nl; } diff --git a/src/surfMesh/writers/raw/rawSurfaceWriter.H b/src/surfMesh/writers/raw/rawSurfaceWriter.H index a3a8f128981c374530bdbe3f508170e4c5a3cc68..0672acdd62c8a865f8d6caffdd6d36a75acc638f 100644 --- a/src/surfMesh/writers/raw/rawSurfaceWriter.H +++ b/src/surfMesh/writers/raw/rawSurfaceWriter.H @@ -34,6 +34,8 @@ Description \table Property | Description | Required | Default compression | Use file compression | no | false + scale | output geometry scaling | no | 1 + fieldScale | output field scaling (dictionary) | no | empty \endtable For example, @@ -43,6 +45,12 @@ Description raw { compression on; + + scale 1000; // [m] -> [mm] + fieldScale + { + "p.*" 0.01; // [Pa] -> [mbar] + } } } \endverbatim @@ -97,6 +105,12 @@ class rawWriter //- Output stream option IOstreamOption streamOpt_; + //- Output geometry scaling + const scalar geometryScale_; + + //- Output field scaling + const dictionary fieldScale_; + // Private Member Functions diff --git a/src/surfMesh/writers/raw/rawSurfaceWriterImpl.C b/src/surfMesh/writers/raw/rawSurfaceWriterImpl.C index 57df22a775e39a100464fb0fa3567fcba9989893..c6d1a8175c1f25b06b7e24f5d68ca319fce12841 100644 --- a/src/surfMesh/writers/raw/rawSurfaceWriterImpl.C +++ b/src/surfMesh/writers/raw/rawSurfaceWriterImpl.C @@ -130,9 +130,25 @@ Foam::fileName Foam::surfaceWriters::rawWriter::writeTemplate outputFile /= fieldName + '_' + outputPath_.name(); outputFile.ext("raw"); + + // 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; } @@ -177,8 +193,8 @@ Foam::fileName Foam::surfaceWriters::rawWriter::writeTemplate // Node values forAll(values, elemi) { - writePoint(os, points[elemi]); - writeData(os, values[elemi]); + writePoint(os, points[elemi]*geometryScale_); + writeData(os, values[elemi]*varScale); } } else @@ -186,8 +202,8 @@ Foam::fileName Foam::surfaceWriters::rawWriter::writeTemplate // Face values forAll(values, elemi) { - writePoint(os, faces[elemi].centre(points)); - writeData(os, values[elemi]); + writePoint(os, faces[elemi].centre(points)*geometryScale_); + writeData(os, values[elemi]*varScale); } } }