From 5b29ff0e42df880955a88f85170adcbea0642dcd Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Tue, 8 Nov 2022 14:52:58 +0100 Subject: [PATCH] ENH: consolidate 'formatOptions' handling for coordSetWriter/surfaceWriter - replaced ad hoc handling of formatOptions with coordSetWriter and surfaceWriter helpers. Accompanying this change, it is now possible to specify "default" settings to be inherited, format-specific settings and have a similar layering with surface-specific overrides. - snappyHexMesh now conforms to setFormats Eg, formatOptions { default { verbose true; format binary; } vtk { precision 10; } } surfaces { surf1 { ... formatOptions { ensight { scale 1000; } } } } --- .../steadyParticleTracks/createControls.H | 5 -- src/functionObjects/field/Curle/Curle.C | 7 +- .../surfaceFieldValue/surfaceFieldValue.C | 8 +- .../forces/propellerInfo/propellerInfo.C | 18 +++-- .../utilities/areaWrite/areaWrite.C | 2 +- .../FacePostProcessing/FacePostProcessing.C | 11 ++- .../ParticleCollector/ParticleCollector.C | 9 +-- .../ParticleZoneInfo/ParticleZoneInfo.C | 22 +++--- .../coordSet/writers/common/coordSetWriter.C | 76 +++++++++++++++++++ .../coordSet/writers/common/coordSetWriter.H | 37 +++++++++ .../noiseModels/surfaceNoise/surfaceNoise.C | 6 +- .../sampledSet/sampledSets/sampledSets.C | 28 +++---- .../sampledSet/sampledSets/sampledSets.H | 9 +-- .../sampledSurfaces/sampledSurfaces.C | 22 +++--- .../sampledSurfaces/sampledSurfaces.H | 10 ++- src/surfMesh/writers/common/surfaceWriter.C | 76 +++++++++++++++++++ src/surfMesh/writers/common/surfaceWriter.H | 48 +++++++++++- .../angledDuct/implicit/system/sampling | 8 ++ .../rhoSimpleFoam/squareBend/system/sampling | 9 +++ .../simpleFoam/squareBend/system/sampling | 9 +++ 20 files changed, 336 insertions(+), 84 deletions(-) diff --git a/applications/utilities/postProcessing/lagrangian/steadyParticleTracks/createControls.H b/applications/utilities/postProcessing/lagrangian/steadyParticleTracks/createControls.H index 6b2f5183da..c4480b6491 100644 --- a/applications/utilities/postProcessing/lagrangian/steadyParticleTracks/createControls.H +++ b/applications/utilities/postProcessing/lagrangian/steadyParticleTracks/createControls.H @@ -15,10 +15,5 @@ wordRes acceptFields(propsDict.get("fields")); wordRes excludeFields; propsDict.readIfPresent("exclude", excludeFields); -const dictionary formatOptions -( - propsDict.subOrEmptyDict("formatOptions", keyType::LITERAL) -); - // ************************************************************************* // diff --git a/src/functionObjects/field/Curle/Curle.C b/src/functionObjects/field/Curle/Curle.C index 813d976130..9cdcbd3c35 100644 --- a/src/functionObjects/field/Curle/Curle.C +++ b/src/functionObjects/field/Curle/Curle.C @@ -161,11 +161,12 @@ bool Foam::functionObjects::Curle::read(const dictionary& dict) << abort(FatalIOError); } - const word surfaceType(dict.get("surfaceType")); + const word writerType = dict.get("surfaceType"); + surfaceWriterPtr_ = surfaceWriter::New ( - surfaceType, - dict.subOrEmptyDict("formatOptions").subOrEmptyDict(surfaceType) + writerType, + surfaceWriter::formatOptions(dict, writerType) ); // Use outputDir/TIME/surface-name diff --git a/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValue.C b/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValue.C index 33a2837ccd..5ddf3663c2 100644 --- a/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValue.C +++ b/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValue.C @@ -1138,14 +1138,14 @@ bool Foam::functionObjects::fieldValues::surfaceFieldValue::read if (writeFields_) { - const word formatName(dict.get("surfaceFormat")); + const word writerType = dict.get("surfaceFormat"); surfaceWriterPtr_.reset ( surfaceWriter::New ( - formatName, - dict.subOrEmptyDict("formatOptions").subOrEmptyDict(formatName) + writerType, + surfaceWriter::formatOptions(dict, writerType) ) ); @@ -1159,7 +1159,7 @@ bool Foam::functionObjects::fieldValues::surfaceFieldValue::read if (surfaceWriterPtr_->enabled()) { - Info<< " surfaceFormat = " << formatName << nl; + Info<< " surfaceFormat = " << writerType << nl; } else { diff --git a/src/functionObjects/forces/propellerInfo/propellerInfo.C b/src/functionObjects/forces/propellerInfo/propellerInfo.C index 96f120b79f..8ad3146a3b 100644 --- a/src/functionObjects/forces/propellerInfo/propellerInfo.C +++ b/src/functionObjects/forces/propellerInfo/propellerInfo.C @@ -355,16 +355,20 @@ void Foam::functionObjects::propellerInfo::setSampleDiskSurface points_ ); - // Surface writer - word surfWriterType; - if (sampleDiskDict.readIfPresent("surfaceWriter", surfWriterType)) - { - const auto writeOptions = sampleDiskDict.subOrEmptyDict("writeOptions"); + // Surface writer (keywords: surfaceWriter, writeOptions) + word writerType; + if (sampleDiskDict.readIfPresent("surfaceWriter", writerType)) + { surfaceWriterPtr_ = surfaceWriter::New ( - surfWriterType, - writeOptions.subOrEmptyDict(surfWriterType) + writerType, + surfaceWriter::formatOptions + ( + sampleDiskDict, + writerType, + "writeOptions" + ) ); // Use outputDir/TIME/surface-name diff --git a/src/functionObjects/utilities/areaWrite/areaWrite.C b/src/functionObjects/utilities/areaWrite/areaWrite.C index 1d82cf271c..6ef6ee820a 100644 --- a/src/functionObjects/utilities/areaWrite/areaWrite.C +++ b/src/functionObjects/utilities/areaWrite/areaWrite.C @@ -181,7 +181,7 @@ bool Foam::areaWrite::read(const dictionary& dict) const dictionary writerOptions ( - dict.subOrEmptyDict("formatOptions").subOrEmptyDict(writerType) + surfaceWriter::formatOptions(dict, writerType) ); for (const word& areaName : meshes_.keys()) diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/FacePostProcessing/FacePostProcessing.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/FacePostProcessing/FacePostProcessing.C index 95c76b94cb..f6970e42a9 100644 --- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/FacePostProcessing/FacePostProcessing.C +++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/FacePostProcessing/FacePostProcessing.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2017 OpenFOAM Foundation - Copyright (C) 2016-2021 OpenCFD Ltd. + Copyright (C) 2016-2022 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -198,8 +198,11 @@ void Foam::FacePostProcessing::write() auto writer = surfaceWriter::New ( surfaceFormat_, - this->coeffDict().subOrEmptyDict("formatOptions") - .subOrEmptyDict(surfaceFormat_) + surfaceWriter::formatOptions + ( + this->coeffDict(), + surfaceFormat_ + ) ); if (debug) @@ -254,7 +257,7 @@ Foam::FacePostProcessing::FacePostProcessing : CloudFunctionObject(dict, owner, modelName, typeName), faceZoneIDs_(), - surfaceFormat_(this->coeffDict().lookup("surfaceFormat")), + surfaceFormat_(this->coeffDict().getWord("surfaceFormat")), resetOnWrite_(this->coeffDict().getBool("resetOnWrite")), log_(this->coeffDict().getBool("log")), totalTime_(0.0), diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.C index 6c4c3aae34..6cfb6c04d3 100644 --- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.C +++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2012-2017 OpenFOAM Foundation - Copyright (C) 2015-2021 OpenCFD Ltd. + Copyright (C) 2015-2022 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -457,13 +457,12 @@ void Foam::ParticleCollector::write() << endl; - if (surfaceFormat_ != "none" && Pstream::master()) + if (Pstream::master() && surfaceFormat_ != "none") { auto writer = surfaceWriter::New ( surfaceFormat_, - this->coeffDict().subOrEmptyDict("formatOptions") - .subOrEmptyDict(surfaceFormat_) + surfaceWriter::formatOptions(this->coeffDict(), surfaceFormat_) ); if (debug) @@ -536,7 +535,7 @@ Foam::ParticleCollector::ParticleCollector ( this->coeffDict().getBool("negateParcelsOppositeNormal") ), - surfaceFormat_(this->coeffDict().lookup("surfaceFormat")), + surfaceFormat_(this->coeffDict().getWord("surfaceFormat")), totalTime_(0.0), mass_(), massTotal_(), diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleZoneInfo/ParticleZoneInfo.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleZoneInfo/ParticleZoneInfo.C index d01800976c..62d3888342 100644 --- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleZoneInfo/ParticleZoneInfo.C +++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleZoneInfo/ParticleZoneInfo.C @@ -196,17 +196,19 @@ Foam::ParticleZoneInfo::ParticleZoneInfo data_(), movedParticles_(), maxIDs_(Pstream::nProcs(), Zero), - writerPtr_ - ( - Pstream::master() - ? coordSetWriter::New - ( - this->coeffDict().getWord("writer"), - this->coeffDict().subOrEmptyDict("formatOptions") - ) - : nullptr - ) + writerPtr_(nullptr) { + if (Pstream::master()) + { + const word writerType = this->coeffDict().getWord("writer"); + + writerPtr_ = coordSetWriter::New + ( + writerType, + coordSetWriter::formatOptions(this->coeffDict(), writerType) + ); + } + writeFile::read(this->coeffDict()); const auto& cellZones = owner.mesh().cellZones(); diff --git a/src/meshTools/coordSet/writers/common/coordSetWriter.C b/src/meshTools/coordSet/writers/common/coordSetWriter.C index 37a813b27f..8f9e3789e6 100644 --- a/src/meshTools/coordSet/writers/common/coordSetWriter.C +++ b/src/meshTools/coordSet/writers/common/coordSetWriter.C @@ -78,6 +78,82 @@ Foam::word Foam::coordSetWriter::suffix } +Foam::dictionary Foam::coordSetWriter::formatOptions +( + const word& formatName, + std::initializer_list dicts +) +{ + dictionary options; + + // Default specification. Top-level and surface-specific + // - literal search only + for (const dictionary* dict : dicts) + { + if + ( + dict + && (dict = dict->findDict("default", keyType::LITERAL)) != nullptr + ) + { + options.merge(*dict); + } + } + + // Format specification. Top-level and surface-specific + // - allow REGEX search + for (const dictionary* dict : dicts) + { + if + ( + dict && !formatName.empty() + && (dict = dict->findDict(formatName)) != nullptr + ) + { + options.merge(*dict); + } + } + + return options; +} + + +Foam::dictionary Foam::coordSetWriter::formatOptions +( + const dictionary& dict, + const word& formatName, + const word& entryName +) +{ + return formatOptions + ( + formatName, + { + dict.findDict(entryName, keyType::LITERAL) + } + ); +} + + +Foam::dictionary Foam::coordSetWriter::formatOptions +( + const dictionary& dict, + const dictionary& setDict, + const word& formatName, + const word& entryName +) +{ + return formatOptions + ( + formatName, + { + dict.findDict(entryName, keyType::LITERAL), + setDict.findDict(entryName, keyType::LITERAL) + } + ); +} + + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // Foam::coordSetWriter::coordSetWriter() diff --git a/src/meshTools/coordSet/writers/common/coordSetWriter.H b/src/meshTools/coordSet/writers/common/coordSetWriter.H index a496903f1e..14befa5a1a 100644 --- a/src/meshTools/coordSet/writers/common/coordSetWriter.H +++ b/src/meshTools/coordSet/writers/common/coordSetWriter.H @@ -274,6 +274,16 @@ protected: //- No copy assignment void operator=(const coordSetWriter&) = delete; + //- Extract and merge 'default' + formatName from + //- top-level and set-specific formatOptions dictionaries + // + // \returns dictionary of merged formatOptions + static dictionary formatOptions + ( + const word& formatName, + std::initializer_list dicts + ); + public: @@ -302,6 +312,33 @@ public: ); + // Helpers + + //- Find "formatOptions" in a top-level dictionary. + //- Extract and merge 'default' + formatName values. + // + // \returns dictionary of merged formatOptions + static dictionary formatOptions + ( + const dictionary& dict, + const word& formatName, + const word& entryName = "formatOptions" + ); + + //- Find "formatOptions" in a top-level dictionary, + //- and in a set-specific dictionary. + //- Extract and merge 'default' + formatName values. + // + // \returns dictionary of merged formatOptions + static dictionary formatOptions + ( + const dictionary& dict, + const dictionary& setDict, + const word& formatName, + const word& entryName = "formatOptions" + ); + + // Selectors //- True if New is likely to succeed for this writeType diff --git a/src/randomProcesses/noise/noiseModels/surfaceNoise/surfaceNoise.C b/src/randomProcesses/noise/noiseModels/surfaceNoise/surfaceNoise.C index f4cf82f115..aaa0b2d03c 100644 --- a/src/randomProcesses/noise/noiseModels/surfaceNoise/surfaceNoise.C +++ b/src/randomProcesses/noise/noiseModels/surfaceNoise/surfaceNoise.C @@ -500,12 +500,14 @@ bool surfaceNoise::read(const dictionary& dict) readerType_ = dict.get("reader"); - const word writerType(dict.get("writer")); + // Surface writer (keywords: writer, writeOptions) + + const word writerType = dict.get("writer"); writerPtr_ = surfaceWriter::New ( writerType, - dict.subOrEmptyDict("writeOptions").subOrEmptyDict(writerType) + surfaceWriter::formatOptions(dict, writerType, "writeOptions") ); // Use outputDir/TIME/surface-name diff --git a/src/sampling/sampledSet/sampledSets/sampledSets.C b/src/sampling/sampledSet/sampledSets/sampledSets.C index cafe0ef330..64751857bd 100644 --- a/src/sampling/sampledSet/sampledSets/sampledSets.C +++ b/src/sampling/sampledSet/sampledSets/sampledSets.C @@ -58,22 +58,20 @@ namespace Foam Foam::autoPtr Foam::sampledSets::newWriter ( - word writeType, - const dictionary& formatOptions, + word writerType, + const dictionary& topDict, const dictionary& setDict ) { // Per-set adjustment - setDict.readIfPresent("setFormat", writeType); + setDict.readIfPresent("setFormat", writerType); - dictionary options = formatOptions.subOrEmptyDict(writeType); - - options.merge + return coordSetWriter::New ( - setDict.subOrEmptyDict("formatOptions").subOrEmptyDict(writeType) + writerType, + // Top-level/set-specific "formatOptions" + coordSetWriter::formatOptions(topDict, setDict, writerType) ); - - return coordSetWriter::New(writeType, options); } @@ -338,7 +336,7 @@ void Foam::sampledSets::initDict(const dictionary& dict, const bool initial) writers_.set ( seti, - newWriter(writeFormat_, writeFormatOptions_, subDict) + newWriter(writeFormat_, dict_, subDict) ); // Use outputDir/TIME/set-name @@ -396,7 +394,7 @@ void Foam::sampledSets::initDict(const dictionary& dict, const bool initial) writers_.set ( seti, - newWriter(writeFormat_, writeFormatOptions_, subDict) + newWriter(writeFormat_, dict_, subDict) ); // Use outputDir/TIME/set-name @@ -446,7 +444,6 @@ Foam::sampledSets::sampledSets searchEngine_(mesh_), samplePointScheme_(), writeFormat_(), - writeFormatOptions_(dict.subOrEmptyDict("formatOptions")), selectedFieldNames_(), writers_(), probeFilePtrs_(), @@ -484,7 +481,6 @@ Foam::sampledSets::sampledSets searchEngine_(mesh_), samplePointScheme_(), writeFormat_(), - writeFormatOptions_(dict.subOrEmptyDict("formatOptions")), selectedFieldNames_(), writers_(), probeFilePtrs_(), @@ -548,12 +544,6 @@ bool Foam::sampledSets::read(const dictionary& dict) probeFilePtrs_.clear(); } - // const dictionary formatOptions(dict.subOrEmptyDict("formatOptions")); - // Writer type and format options - // const word writerType = - // (eptr ? dict.get("setFormat") : word::null); - // writerType_ = (eptr ? dict.get("setFormat") : word::null); - initDict(dict, true); // Have some sets, so sort out which fields are needed and report diff --git a/src/sampling/sampledSet/sampledSets/sampledSets.H b/src/sampling/sampledSet/sampledSets/sampledSets.H index 4c41dadd01..76623ad911 100644 --- a/src/sampling/sampledSet/sampledSets/sampledSets.H +++ b/src/sampling/sampledSet/sampledSets/sampledSets.H @@ -184,9 +184,6 @@ class sampledSets //- Output format to use word writeFormat_; - //- Dictionary containing writer options - dictionary writeFormatOptions_; - // Output control @@ -221,9 +218,9 @@ class sampledSets //- A new coordSet writer, with per-set formatOptions static autoPtr newWriter ( - word writeType, - const dictionary& formatOptions, - const dictionary& surfDict + word writerType, + const dictionary& topDict, + const dictionary& setDict ); //- Perform sampling action with store/write diff --git a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.C b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.C index 6cdedf80be..9a1a9524b6 100644 --- a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.C +++ b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.C @@ -190,22 +190,20 @@ Foam::IOobjectList Foam::sampledSurfaces::preCheckFields() Foam::autoPtr Foam::sampledSurfaces::newWriter ( - word writeType, - const dictionary& formatOptions, + word writerType, + const dictionary& topDict, const dictionary& surfDict ) { // Per-surface adjustment - surfDict.readIfPresent("surfaceFormat", writeType); + surfDict.readIfPresent("surfaceFormat", writerType); - dictionary options = formatOptions.subOrEmptyDict(writeType); - - options.merge + return surfaceWriter::New ( - surfDict.subOrEmptyDict("formatOptions").subOrEmptyDict(writeType) + writerType, + // Top-level/surface-specific "formatOptions" + surfaceWriter::formatOptions(topDict, surfDict, writerType) ); - - return surfaceWriter::New(writeType, options); } @@ -305,8 +303,6 @@ bool Foam::sampledSurfaces::read(const dictionary& dict) const word writerType = (eptr ? dict.get("surfaceFormat") : word::null); - const dictionary formatOptions(dict.subOrEmptyDict("formatOptions")); - // Store on registry? const bool dfltStore = dict.getOrDefault("store", false); @@ -355,7 +351,7 @@ bool Foam::sampledSurfaces::read(const dictionary& dict) writers_.set ( surfi, - newWriter(writerType, formatOptions, surfDict) + newWriter(writerType, dict, surfDict) ); writers_[surfi].isPointData(surfs[surfi].isPointData()); @@ -417,7 +413,7 @@ bool Foam::sampledSurfaces::read(const dictionary& dict) writers_.set ( surfi, - newWriter(writerType, formatOptions, surfDict) + newWriter(writerType, dict, surfDict) ); writers_[surfi].isPointData(surfs[surfi].isPointData()); diff --git a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.H b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.H index ce4e00c99b..ec0ff59faa 100644 --- a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.H +++ b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.H @@ -62,9 +62,13 @@ Description formatOptions { + default + { + verbose true; + } vtk { - precision 10; + precision 10; } } @@ -222,8 +226,8 @@ class sampledSurfaces //- A new surfaceWriter, with per-surface formatOptions static autoPtr newWriter ( - word writeType, - const dictionary& formatOptions, + word writerType, + const dictionary& topDict, const dictionary& surfDict ); diff --git a/src/surfMesh/writers/common/surfaceWriter.C b/src/surfMesh/writers/common/surfaceWriter.C index 80c03939db..83fce91cd0 100644 --- a/src/surfMesh/writers/common/surfaceWriter.C +++ b/src/surfMesh/writers/common/surfaceWriter.C @@ -59,6 +59,82 @@ bool Foam::surfaceWriter::supportedType(const word& writeType) } +Foam::dictionary Foam::surfaceWriter::formatOptions +( + const word& formatName, + std::initializer_list dicts +) +{ + dictionary options; + + // Default specification. Top-level and surface-specific + // - literal search only + for (const dictionary* dict : dicts) + { + if + ( + dict + && (dict = dict->findDict("default", keyType::LITERAL)) != nullptr + ) + { + options.merge(*dict); + } + } + + // Format specification. Top-level and surface-specific + // - allow REGEX search + for (const dictionary* dict : dicts) + { + if + ( + dict && !formatName.empty() + && (dict = dict->findDict(formatName)) != nullptr + ) + { + options.merge(*dict); + } + } + + return options; +} + + +Foam::dictionary Foam::surfaceWriter::formatOptions +( + const dictionary& dict, + const word& formatName, + const word& entryName +) +{ + return formatOptions + ( + formatName, + { + dict.findDict(entryName, keyType::LITERAL) + } + ); +} + + +Foam::dictionary Foam::surfaceWriter::formatOptions +( + const dictionary& dict, + const dictionary& surfDict, + const word& formatName, + const word& entryName +) +{ + return formatOptions + ( + formatName, + { + dict.findDict(entryName, keyType::LITERAL), + surfDict.findDict(entryName, keyType::LITERAL) + } + ); +} + + Foam::autoPtr Foam::surfaceWriter::New(const word& writeType) { diff --git a/src/surfMesh/writers/common/surfaceWriter.H b/src/surfMesh/writers/common/surfaceWriter.H index e4d4e34578..aa2eadbe84 100644 --- a/src/surfMesh/writers/common/surfaceWriter.H +++ b/src/surfMesh/writers/common/surfaceWriter.H @@ -44,15 +44,21 @@ Description \verbatim formatOptions { - someFormat // Eg, ensight, vtk, etc + default { - verbose true; + verbose true; + commsType scheduled; + fieldLevel { "p.*" 1e5; // Absolute -> gauge [Pa] T 273.15; // [K] -> [C] U #eval{ 10/sqrt(3) }; // Uniform magU=10 } + } + + someFormat // Eg, ensight, vtk, etc + { fieldScale { "p.*" 0.01; // [Pa] -> [mbar] @@ -267,6 +273,17 @@ protected: } + //- Extract and merge 'default' + formatName from + //- top-level and surface-specific formatOptions dictionaries + // + // \returns dictionary of merged formatOptions + static dictionary formatOptions + ( + const word& formatName, + std::initializer_list dicts + ); + + public: // Public Data @@ -301,6 +318,33 @@ public: ); + // Helpers + + //- Find "formatOptions" in a top-level dictionary. + //- Extract and merge 'default' + formatName values. + // + // \returns dictionary of merged formatOptions + static dictionary formatOptions + ( + const dictionary& dict, + const word& formatName, + const word& entryName = "formatOptions" + ); + + //- Find "formatOptions" in a top-level dictionary, + //- and in a set-specific dictionary. + //- Extract and merge 'default' + formatName values. + // + // \returns dictionary of merged formatOptions + static dictionary formatOptions + ( + const dictionary& dict, + const dictionary& surfDict, + const word& formatName, + const word& entryName = "formatOptions" + ); + + // Selectors //- True if New is likely to succeed for this writeType diff --git a/tutorials/compressible/rhoPorousSimpleFoam/angledDuct/implicit/system/sampling b/tutorials/compressible/rhoPorousSimpleFoam/angledDuct/implicit/system/sampling index f11505626d..49193b552c 100644 --- a/tutorials/compressible/rhoPorousSimpleFoam/angledDuct/implicit/system/sampling +++ b/tutorials/compressible/rhoPorousSimpleFoam/angledDuct/implicit/system/sampling @@ -96,6 +96,14 @@ plane surfaceFormat vtk; + formatOptions + { + default + { + verbose true; + } + } + surfaces { zNormal diff --git a/tutorials/compressible/rhoSimpleFoam/squareBend/system/sampling b/tutorials/compressible/rhoSimpleFoam/squareBend/system/sampling index 7491c71fd7..fc8e4c9aa8 100644 --- a/tutorials/compressible/rhoSimpleFoam/squareBend/system/sampling +++ b/tutorials/compressible/rhoSimpleFoam/squareBend/system/sampling @@ -44,6 +44,15 @@ __surfaceFieldValue writeFields false; surfaceFormat vtk; + + formatOptions + { + default + { + verbose true; + } + } + // writeArea true; // resetOnStartUp true; diff --git a/tutorials/incompressible/simpleFoam/squareBend/system/sampling b/tutorials/incompressible/simpleFoam/squareBend/system/sampling index b83694d121..1532f79c6c 100644 --- a/tutorials/incompressible/simpleFoam/squareBend/system/sampling +++ b/tutorials/incompressible/simpleFoam/squareBend/system/sampling @@ -44,6 +44,15 @@ __surfaceFieldValue writeFields false; surfaceFormat vtk; + + formatOptions + { + default + { + verbose true; + } + } + // writeArea true; // resetOnStartUp true;