diff --git a/src/functionObjects/field/fluxSummary/fluxSummary.C b/src/functionObjects/field/fluxSummary/fluxSummary.C index 616470cc21981cf02a6d353bea09ae551334a110..a3dcaa6c74be13a4d375e4cebc8e0acdc6855859 100644 --- a/src/functionObjects/field/fluxSummary/fluxSummary.C +++ b/src/functionObjects/field/fluxSummary/fluxSummary.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2015-2017 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2015-2019 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- | Copyright (C) 2015 OpenFOAM Foundation @@ -131,19 +131,20 @@ void Foam::functionObjects::fluxSummary::initialiseSurface DynamicList<boolList>& faceFlip ) const { - const surfMesh* sPtr = mesh_.findObject<surfMesh>(surfName); - if (!sPtr) + const surfMesh* surfptr = mesh_.cfindObject<surfMesh>(surfName); + + if (!surfptr) { FatalErrorInFunction << "Unable to find surface " << surfName - << ". Valid surfaces are: " << mesh_.sortedNames<surfMesh>() - << '.' + << ". Valid surfaces: " + << mesh_.sortedNames<surfMesh>() << nl << exit(FatalError); } names.append(surfName); - directions.append(Zero); // dummy value - faceFlip.append(boolList(0)); // no flip-map + directions.append(Zero); // dummy value + faceFlip.append(boolList()); // no flip-map } @@ -156,17 +157,18 @@ void Foam::functionObjects::fluxSummary::initialiseSurfaceAndDirection DynamicList<boolList>& faceFlip ) const { - const surfMesh* sPtr = mesh_.findObject<surfMesh>(surfName); - if (!sPtr) + const surfMesh* surfptr = mesh_.cfindObject<surfMesh>(surfName); + + if (!surfptr) { FatalErrorInFunction << "Unable to find surface " << surfName - << ". Valid surfaces are: " << mesh_.sortedNames<surfMesh>() - << '.' + << ". Valid surfaces: " + << mesh_.sortedNames<surfMesh>() << nl << exit(FatalError); } - const surfMesh& s = *sPtr; + const surfMesh& s = *surfptr; const vector refDir = dir/(mag(dir) + ROOTVSMALL); names.append(surfName); @@ -198,8 +200,8 @@ void Foam::functionObjects::fluxSummary::initialiseFaceZone const word& faceZoneName, DynamicList<word>& names, DynamicList<vector>& directions, - DynamicList<List<label>>& faceID, - DynamicList<List<label>>& facePatchID, + DynamicList<labelList>& faceID, + DynamicList<labelList>& facePatchID, DynamicList<boolList>& faceFlip ) const { @@ -208,7 +210,8 @@ void Foam::functionObjects::fluxSummary::initialiseFaceZone { FatalErrorInFunction << "Unable to find faceZone " << faceZoneName - << ". Valid faceZones are: " << mesh_.faceZones().names() + << ". Valid zones: " + << mesh_.faceZones().sortedNames() << nl << exit(FatalError); } const faceZone& fZone = mesh_.faceZones()[zonei]; @@ -287,8 +290,8 @@ void Foam::functionObjects::fluxSummary::initialiseFaceZoneAndDirection const vector& dir, DynamicList<word>& names, DynamicList<vector>& directions, - DynamicList<List<label>>& faceID, - DynamicList<List<label>>& facePatchID, + DynamicList<labelList>& faceID, + DynamicList<labelList>& facePatchID, DynamicList<boolList>& faceFlip ) const { @@ -299,7 +302,8 @@ void Foam::functionObjects::fluxSummary::initialiseFaceZoneAndDirection { FatalErrorInFunction << "Unable to find faceZone " << faceZoneName - << ". Valid faceZones are: " << mesh_.faceZones().names() + << ". Valid zones: " + << mesh_.faceZones().sortedNames() << nl << exit(FatalError); } const faceZone& fZone = mesh_.faceZones()[zonei]; @@ -393,8 +397,8 @@ void Foam::functionObjects::fluxSummary::initialiseCellZoneAndDirection const vector& dir, DynamicList<word>& names, DynamicList<vector>& directions, - DynamicList<List<label>>& faceID, - DynamicList<List<label>>& facePatchID, + DynamicList<labelList>& faceID, + DynamicList<labelList>& facePatchID, DynamicList<boolList>& faceFlip ) const { @@ -405,7 +409,8 @@ void Foam::functionObjects::fluxSummary::initialiseCellZoneAndDirection { FatalErrorInFunction << "Unable to find cellZone " << cellZoneName - << ". Valid zones are: " << mesh_.cellZones().names() + << ". Valid zones: " + << mesh_.cellZones().sortedNames() << nl << exit(FatalError); } @@ -781,67 +786,29 @@ bool Foam::functionObjects::fluxSummary::surfaceModeWrite() } -// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // - -Foam::functionObjects::fluxSummary::fluxSummary -( - const word& name, - const Time& runTime, - const dictionary& dict -) -: - fvMeshFunctionObject(name, runTime, dict), - writeFile(obr_, name), - mode_(mdFaceZone), - scaleFactor_(1), - phiName_("phi"), - zoneNames_(), - faceID_(), - facePatchID_(), - faceFlip_(), - filePtrs_(), - tolerance_(0.8) -{ - read(dict); -} - - -// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // - -Foam::functionObjects::fluxSummary::~fluxSummary() -{} - - -// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // - -bool Foam::functionObjects::fluxSummary::read(const dictionary& dict) +bool Foam::functionObjects::fluxSummary::update() { - fvMeshFunctionObject::read(dict); - writeFile::read(dict); - - mode_ = modeTypeNames_.get("mode", dict); - phiName_ = dict.lookupOrDefault<word>("phi", "phi"); - scaleFactor_ = dict.lookupOrDefault<scalar>("scaleFactor", 1.0); - tolerance_ = dict.lookupOrDefault<scalar>("tolerance", 0.8); + if (!needsUpdate_) + { + return false; + } - // Initialise with capacity of 10 faceZones - DynamicList<word> faceZoneName(10); - DynamicList<vector> refDir(faceZoneName.capacity()); - DynamicList<List<label>> faceID(faceZoneName.capacity()); - DynamicList<List<label>> facePatchID(faceZoneName.capacity()); - DynamicList<boolList> faceFlips(faceZoneName.capacity()); + // Initialise with capacity == number of input names + DynamicList<word> faceZoneName(zoneNames_.size()); + DynamicList<vector> refDir(faceZoneName.capacity()); + DynamicList<labelList> faceID(faceZoneName.capacity()); + DynamicList<labelList> facePatchID(faceZoneName.capacity()); + DynamicList<boolList> faceFlips(faceZoneName.capacity()); switch (mode_) { case mdFaceZone: { - wordList zones(dict.get<wordList>("faceZones")); - - forAll(zones, i) + forAll(zoneNames_, zonei) { initialiseFaceZone ( - zones[i], + zoneNames_[zonei], faceZoneName, refDir, // fill with dummy value faceID, @@ -853,15 +820,12 @@ bool Foam::functionObjects::fluxSummary::read(const dictionary& dict) } case mdFaceZoneAndDirection: { - List<Tuple2<word, vector>> zoneAndDirection; - dict.readEntry("faceZoneAndDirection", zoneAndDirection); - - forAll(zoneAndDirection, i) + forAll(zoneNames_, zonei) { initialiseFaceZoneAndDirection ( - zoneAndDirection[i].first(), - zoneAndDirection[i].second(), + zoneNames_[zonei], + zoneDirections_[zonei], faceZoneName, refDir, faceID, @@ -873,15 +837,12 @@ bool Foam::functionObjects::fluxSummary::read(const dictionary& dict) } case mdCellZoneAndDirection: { - List<Tuple2<word, vector>> zoneAndDirection; - dict.readEntry("cellZoneAndDirection", zoneAndDirection); - - forAll(zoneAndDirection, i) + forAll(zoneNames_, zonei) { initialiseCellZoneAndDirection ( - zoneAndDirection[i].first(), - zoneAndDirection[i].second(), + zoneNames_[zonei], + zoneDirections_[zonei], faceZoneName, refDir, faceID, @@ -893,13 +854,11 @@ bool Foam::functionObjects::fluxSummary::read(const dictionary& dict) } case mdSurface: { - wordList surfs(dict.get<wordList>("surfaces")); - - forAll(surfs, i) + forAll(zoneNames_, zonei) { initialiseSurface ( - surfs[i], + zoneNames_[zonei], faceZoneName, refDir, faceFlips @@ -909,15 +868,12 @@ bool Foam::functionObjects::fluxSummary::read(const dictionary& dict) } case mdSurfaceAndDirection: { - List<Tuple2<word, vector>> surfAndDirection; - dict.readEntry("surfaceAndDirection", surfAndDirection); - - forAll(surfAndDirection, i) + forAll(zoneNames_, zonei) { initialiseSurfaceAndDirection ( - surfAndDirection[i].first(), - surfAndDirection[i].second(), + zoneNames_[zonei], + zoneDirections_[zonei], faceZoneName, refDir, faceFlips @@ -925,12 +881,8 @@ bool Foam::functionObjects::fluxSummary::read(const dictionary& dict) } break; } - default: - { - FatalIOErrorInFunction(dict) - << "unhandled enumeration " << modeTypeNames_[mode_] - << abort(FatalIOError); - } + + // Compiler warning if we forgot an enumeration } zoneNames_.transfer(faceZoneName); @@ -962,7 +914,7 @@ bool Foam::functionObjects::fluxSummary::read(const dictionary& dict) if (writeToFile()) { - filePtrs_.setSize(zoneNames_.size()); + filePtrs_.resize(zoneNames_.size()); forAll(filePtrs_, zonei) { @@ -978,6 +930,118 @@ bool Foam::functionObjects::fluxSummary::read(const dictionary& dict) } } + Info<< endl; + + needsUpdate_ = false; + + return true; +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::functionObjects::fluxSummary::fluxSummary +( + const word& name, + const Time& runTime, + const dictionary& dict +) +: + fvMeshFunctionObject(name, runTime, dict), + writeFile(obr_, name), + needsUpdate_(true), + mode_(mdFaceZone), + scaleFactor_(1), + phiName_("phi"), + zoneNames_(), + zoneDirections_(), + faceID_(), + facePatchID_(), + faceFlip_(), + filePtrs_(), + tolerance_(0.8) +{ + read(dict); +} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +bool Foam::functionObjects::fluxSummary::read(const dictionary& dict) +{ + fvMeshFunctionObject::read(dict); + writeFile::read(dict); + + needsUpdate_ = true; + mode_ = modeTypeNames_.get("mode", dict); + phiName_ = dict.lookupOrDefault<word>("phi", "phi"); + scaleFactor_ = dict.lookupOrDefault<scalar>("scaleFactor", 1.0); + tolerance_ = dict.lookupOrDefault<scalar>("tolerance", 0.8); + + zoneNames_.clear(); + zoneDirections_.clear(); + + List<Tuple2<word, vector>> nameAndDirection; + + switch (mode_) + { + case mdFaceZone: + { + dict.readEntry("faceZones", zoneNames_); + break; + } + case mdFaceZoneAndDirection: + { + dict.readEntry("faceZoneAndDirection", nameAndDirection); + break; + } + case mdCellZoneAndDirection: + { + dict.readEntry("cellZoneAndDirection", nameAndDirection); + break; + } + case mdSurface: + { + dict.readEntry("surfaces", zoneNames_); + break; + } + case mdSurfaceAndDirection: + { + dict.readEntry("surfaceAndDirection", nameAndDirection); + break; + } + default: + { + FatalIOErrorInFunction(dict) + << "unhandled enumeration " << modeTypeNames_[mode_] + << abort(FatalIOError); + } + } + + + // Split name/vector into separate lists + if (nameAndDirection.size()) + { + zoneNames_.resize(nameAndDirection.size()); + zoneDirections_.resize(nameAndDirection.size()); + + label zonei = 0; + + for (const Tuple2<word, vector>& nameDirn : nameAndDirection) + { + zoneNames_[zonei] = nameDirn.first(); + zoneDirections_[zonei] = nameDirn.second(); + ++zonei; + } + + nameAndDirection.clear(); + } + + + Info<< type() << ' ' << name() << " (" + << modeTypeNames_[mode_] << ") with selection:\n " + << flatOutput(zoneNames_) << endl; + return !zoneNames_.empty(); } @@ -1033,6 +1097,8 @@ bool Foam::functionObjects::fluxSummary::execute() bool Foam::functionObjects::fluxSummary::write() { + update(); + if (isSurfaceMode()) { return surfaceModeWrite(); diff --git a/src/functionObjects/field/fluxSummary/fluxSummary.H b/src/functionObjects/field/fluxSummary/fluxSummary.H index 3a5086d86c08f52a98bc4230a27ff81accc44643..ac04c519c29a7481f129e2faae5269222f94408b 100644 --- a/src/functionObjects/field/fluxSummary/fluxSummary.H +++ b/src/functionObjects/field/fluxSummary/fluxSummary.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2015-2016 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2015-2019 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- | Copyright (C) 2015 OpenFOAM Foundation @@ -92,7 +92,6 @@ SourceFiles #include "writeFile.H" #include "vector.H" #include "DynamicList.H" -#include "boolList.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -102,6 +101,7 @@ class dimensionSet; namespace functionObjects { + /*---------------------------------------------------------------------------*\ Class fluxSummary Declaration \*---------------------------------------------------------------------------*/ @@ -131,7 +131,10 @@ public: protected: - // Protected data + // Protected Data + + //- Track if the surface needs an update + bool needsUpdate_; //- Mode for face determination modeType mode_; @@ -148,11 +151,14 @@ protected: //- Region (zone/surface) names List<word> zoneNames_; + //- Region (zone/surface) directions + List<vector> zoneDirections_; + //- Face IDs - List<List<label>> faceID_; + List<labelList> faceID_; //- Face patch IDs - List<List<label>> facePatchID_; + List<labelList> facePatchID_; //- Face flip map signs List<boolList> faceFlip_; @@ -203,8 +209,8 @@ protected: const word& faceZoneName, DynamicList<word>& names, DynamicList<vector>& dir, - DynamicList<List<label>>& faceID, - DynamicList<List<label>>& facePatchID, + DynamicList<labelList>& faceID, + DynamicList<labelList>& facePatchID, DynamicList<boolList>& faceFlip ) const; @@ -215,8 +221,8 @@ protected: const vector& refDir, DynamicList<word>& names, DynamicList<vector>& dir, - DynamicList<List<label>>& faceID, - DynamicList<List<label>>& facePatchID, + DynamicList<labelList>& faceID, + DynamicList<labelList>& facePatchID, DynamicList<boolList>& faceFlip ) const; @@ -227,14 +233,18 @@ protected: const vector& refDir, DynamicList<word>& names, DynamicList<vector>& dir, - DynamicList<List<label>>& faceID, - DynamicList<List<label>>& facePatchID, + DynamicList<labelList>& faceID, + DynamicList<labelList>& facePatchID, DynamicList<boolList>& faceFlip ) const; //- Calculate the total area for the surface or derived faceZone scalar totalArea(const label idx) const; + //- Initialise - after read(), before write() + bool update(); + + //- Output file header information virtual void writeFileHeader ( @@ -272,7 +282,7 @@ public: //- Destructor - virtual ~fluxSummary(); + virtual ~fluxSummary() = default; // Member Functions