diff --git a/applications/test/coordinateSystem/Make/files b/applications/test/coordinateSystem/Make/files new file mode 100644 index 0000000000000000000000000000000000000000..d20def6640118d03ccca9dc3060ea07f0db044f1 --- /dev/null +++ b/applications/test/coordinateSystem/Make/files @@ -0,0 +1,3 @@ +Test-coordinateSystem.C + +EXE = $(FOAM_USER_APPBIN)/Test-coordinateSystem diff --git a/applications/test/coordinateSystem/Make/options b/applications/test/coordinateSystem/Make/options new file mode 100644 index 0000000000000000000000000000000000000000..54c035b8f55d183c1ad02bc372398feceaf31718 --- /dev/null +++ b/applications/test/coordinateSystem/Make/options @@ -0,0 +1,5 @@ +EXE_INC = \ + -I$(LIB_SRC)/meshTools/lnInclude + +EXE_LIBS = \ + -lmeshTools diff --git a/applications/test/coordinateSystem/Test-coordinateSystem.C b/applications/test/coordinateSystem/Test-coordinateSystem.C new file mode 100644 index 0000000000000000000000000000000000000000..3f68919a520079264ae8052af3c3a9adefd9f4e4 --- /dev/null +++ b/applications/test/coordinateSystem/Test-coordinateSystem.C @@ -0,0 +1,108 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2018 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Application + Test-coordinateSystem + +Description + Expand coordinate system definitions + +\*---------------------------------------------------------------------------*/ + +#include "argList.H" +#include "coordinateSystem.H" +#include "Fstream.H" +#include "IOstreams.H" + +using namespace Foam; + +void doTest(const dictionary& dict) +{ + Info<< dict.dictName() << dict << nl; + + // Could fail? + const bool throwingIOError = FatalIOError.throwExceptions(); + const bool throwingError = FatalError.throwExceptions(); + try + { + coordinateSystem cs1(dict.dictName(), dict); + + coordinateSystem cs2; + + // Move assign + cs2 = std::move(cs1); + + // Info<<cs2 << nl; + cs2.writeDict(Info, true); + Info<< nl; + } + catch (Foam::IOerror& err) + { + Info<< "Caught FatalIOError " << err << nl << endl; + } + catch (Foam::error& err) + { + Info<< "Caught FatalError " << err << nl << endl; + } + FatalError.throwExceptions(throwingError); + FatalIOError.throwExceptions(throwingIOError); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +// Main program: + +int main(int argc, char *argv[]) +{ + argList::noParallel(); + argList::addArgument("dict .. dictN"); + argList args(argc, argv, false, true); + + if (args.size() <= 1) + { + Info<<"no coordinateSystem dictionaries to expand" << nl; + } + else + { + for (label argi=1; argi < args.size(); ++argi) + { + const string& dictFile = args[argi]; + IFstream is(dictFile); + + dictionary inputDict(is); + + forAllConstIters(inputDict, iter) + { + if (iter().isDict()) + { + doTest(iter().dict()); + } + } + } + } + + return 0; +} + + +// ************************************************************************* // diff --git a/applications/test/coordinateSystem/testDict1 b/applications/test/coordinateSystem/testDict1 new file mode 100644 index 0000000000000000000000000000000000000000..8cfb8e9805d34ed3a35101b1179c7d41205bfe7b --- /dev/null +++ b/applications/test/coordinateSystem/testDict1 @@ -0,0 +1,112 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object testDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// Rotate 90 deg around x: y -> z, z -> -y + +rot_x90_axesRotation +{ + origin (0 0 0); + coordinateRotation + { + type axesRotation; + e1 (1 0 0); + e3 (0 -1 0); + } +} + +rot_x90_euler +{ + origin (0 0 0); + coordinateRotation + { + type EulerRotation; + rotation (0 90 0); // z-x'-z'' + } +} + + +// Rotate 45 deg around z: x -> (1 1 0), y = (-1 1 0) + +rot_z45_axesRotation +{ + origin (0 0 0); + coordinateRotation + { + type axesRotation; + e1 (1 1 0); + e3 (0 0 1); + } +} + +rot_z45_euler +{ + origin (0 0 0); + coordinateRotation + { + type EulerRotation; + rotation (45 0 0); // z-x'-z'' + } +} + + +// Rotate -45 deg around z: x -> (1 -1 0), y = (1 1 0) +rot_zm45_axesRotation +{ + origin (0 0 0); + coordinateRotation + { + type axesRotation; + e1 (1 -1 0); + e3 (0 0 1); + } +} + +rot_zm45_euler +{ + origin (0 0 0); + coordinateRotation + { + type EulerRotation; + rotation (-45 0 0); // z-x'-z'' + } +} + + +// Null transforms + +null_axesRotation +{ + origin (0 0 0); + coordinateRotation + { + type axesRotation; + e1 (1 0 0); + e3 (0 0 1); + } +} + +null_euler +{ + origin (0 0 0); + coordinateRotation + { + type EulerRotation; + rotation (0 0 0); // z-x'-z'' + } +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.C b/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.C index 1181566deaec0e4abd9e25848be68dceda9a5f51..5106fd4c442e3b9e71dfbb2fd4268da8a4cdf833 100644 --- a/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.C +++ b/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.C @@ -829,7 +829,9 @@ bool Foam::functionObjectList::read() { // Bit of trickery to get the original message err.write(Warning, false); - InfoInFunction << nl << endl; + InfoInFunction << nl + << "--> while loading function object '" << key << "'" + << nl << endl; } // Restore previous exception throwing state diff --git a/src/functionObjects/forces/forces/forces.C b/src/functionObjects/forces/forces/forces.C index 84015def879d2fa54d0e94f30419d99b178232f6..681ac2b2514c6f793849e7d18e07e8b51efd3f8a 100644 --- a/src/functionObjects/forces/forces/forces.C +++ b/src/functionObjects/forces/forces/forces.C @@ -876,6 +876,7 @@ bool Foam::functionObjects::forces::read(const dictionary& dict) } coordSys_.clear(); + localSystem_ = false; // Centre of rotation for moment calculations // specified directly, from coordinate system, or implicitly (0 0 0) diff --git a/src/functionObjects/forces/forces/forces.H b/src/functionObjects/forces/forces/forces.H index d8998412583a27feb52e1442ad01ae341b6768b1..4a27514c6abe370f742caab8329c7759c057539e 100644 --- a/src/functionObjects/forces/forces/forces.H +++ b/src/functionObjects/forces/forces/forces.H @@ -111,8 +111,12 @@ Note coordinateSystem { origin (0 0 0); - e3 (0 0 1); - e1 (1 0 0); + coordinateRotation + { + type axesRotation; + e3 (0 0 1); + e1 (1 0 0); + } } \endverbatim diff --git a/src/fvOptions/sources/interRegion/interRegionExplicitPorositySource/interRegionExplicitPorositySource.H b/src/fvOptions/sources/interRegion/interRegionExplicitPorositySource/interRegionExplicitPorositySource.H index 36884d260bd300c62587f48c77707d4ef8962df6..9ffc92ddc7506f00dc297055285c0000ab4b8704 100644 --- a/src/fvOptions/sources/interRegion/interRegionExplicitPorositySource/interRegionExplicitPorositySource.H +++ b/src/fvOptions/sources/interRegion/interRegionExplicitPorositySource/interRegionExplicitPorositySource.H @@ -43,8 +43,13 @@ Description coordinateSystem { - e1 (0.70710678 0.70710678 0); - e2 (0 0 1); + origin (0 0 0); + coordinateRotation + { + type axesRotation; + e1 (0.70710678 0.70710678 0); + e2 (0 0 1); + } } } } diff --git a/src/meshTools/coordinateSystems/coordinateRotation/coordinateRotationNew.C b/src/meshTools/coordinateSystems/coordinateRotation/coordinateRotationNew.C index a1e939abad048d9783b563567dcd66d091f1a947..f9ed1f1e00f051de25cb8fcf38cc90a31931794b 100644 --- a/src/meshTools/coordinateSystems/coordinateRotation/coordinateRotationNew.C +++ b/src/meshTools/coordinateSystems/coordinateRotation/coordinateRotationNew.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation - \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | Copyright (C) 2017-2018 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -34,16 +34,16 @@ Foam::autoPtr<Foam::coordinateRotation> Foam::coordinateRotation::New const objectRegistry& obr ) { - const word rotType = dict.lookup("type"); + const word modelType(dict.get<word>("type")); - auto cstrIter = objectRegistryConstructorTablePtr_->cfind(rotType); + auto cstrIter = objectRegistryConstructorTablePtr_->cfind(modelType); if (!cstrIter.found()) { FatalIOErrorInFunction(dict) - << "Unknown coordinateRotation type " << rotType << nl << nl - << "Valid coordinateRotation types :" << nl - << objectRegistryConstructorTablePtr_->sortedToc() + << "Unknown coordinateRotation type " << modelType << nl << nl + << "Valid types: " + << flatOutput(objectRegistryConstructorTablePtr_->sortedToc()) << exit(FatalIOError); } @@ -56,16 +56,16 @@ Foam::autoPtr<Foam::coordinateRotation> Foam::coordinateRotation::New const dictionary& dict ) { - const word rotType = dict.lookup("type"); + const word modelType(dict.get<word>("type")); - auto cstrIter = dictionaryConstructorTablePtr_->cfind(rotType); + auto cstrIter = dictionaryConstructorTablePtr_->cfind(modelType); if (!cstrIter.found()) { FatalIOErrorInFunction(dict) - << "Unknown coordinateRotation type " << rotType << nl << nl - << "Valid coordinateRotation types :" << nl - << dictionaryConstructorTablePtr_->sortedToc() + << "Unknown coordinateRotation type " << modelType << nl << nl + << "Valid types: " + << flatOutput(dictionaryConstructorTablePtr_->sortedToc()) << exit(FatalIOError); } diff --git a/src/meshTools/coordinateSystems/coordinateSystem.C b/src/meshTools/coordinateSystems/coordinateSystem.C index cb638dd4530e928c706f5a1323357a4b9bc61867..5ec436197423e97c00e4eb3f764c12e635c59cb7 100644 --- a/src/meshTools/coordinateSystems/coordinateSystem.C +++ b/src/meshTools/coordinateSystems/coordinateSystem.C @@ -147,9 +147,21 @@ Foam::coordinateSystem::coordinateSystem { const entry* entryPtr = dict.lookupEntryPtr(typeName_(), false, false); - // non-dictionary entry is a lookup into global coordinateSystems - if (entryPtr && !entryPtr->isDict()) + if (!entryPtr) { + // No 'coordinateSystem' entry + init(dict, obr); + } + else if (entryPtr->isDict()) + { + // 'coordinateSystem' as dictionary entry - use it + init(entryPtr->dict(), obr); + } + else + { + // 'coordinateSystem' as non-dictionary entry + // - this is a lookup into global coordinateSystems + keyType key(entryPtr->stream()); const coordinateSystems& lst = coordinateSystems::New(obr); @@ -170,15 +182,11 @@ Foam::coordinateSystem::coordinateSystem << exit(FatalError); } - // copy coordinateSystem, but assign the name as the typeName + // Copy from coordinateSystem, but assign the name as the typeName // to avoid strange things in writeDict() operator=(lst[index]); name_ = typeName_(); } - else - { - init(dict, obr); - } } @@ -202,7 +210,7 @@ Foam::dictionary Foam::coordinateSystem::dict(bool ignoreType) const dict.add("name", name_); - // only write type for derived types + // Only write type for derived types if (!ignoreType && type() != typeName_()) { dict.add("type", type()); @@ -296,8 +304,6 @@ void Foam::coordinateSystem::transfer(coordinateSystem& cs) note_ = std::move(cs.note_); origin_ = std::move(cs.origin_); R_ = std::move(cs.R_); - - cs.clear(); } @@ -340,7 +346,16 @@ void Foam::coordinateSystem::operator=(const coordinateSystem& cs) name_ = cs.name_; note_ = cs.note_; origin_ = cs.origin_; - R_ = cs.R_.clone(); + + // Some extra safety + if (cs.R_.valid()) + { + R_ = cs.R_.clone(); + } + else + { + R_.reset(new axesRotation(sphericalTensor::I)); + } } void Foam::coordinateSystem::operator=(coordinateSystem&& cs) @@ -349,38 +364,27 @@ void Foam::coordinateSystem::operator=(coordinateSystem&& cs) } -void Foam::coordinateSystem::init(const dictionary& rhs) +void Foam::coordinateSystem::init(const dictionary& dict) { - rhs.lookup("origin") >> origin_; + dict.lookup("origin") >> origin_; note_.clear(); - rhs.readIfPresent("note", note_); - R_ = coordinateRotation::New(rhs.subDict("coordinateRotation")); + dict.readIfPresent("note", note_); + R_ = coordinateRotation::New(dict.subDict("coordinateRotation")); } void Foam::coordinateSystem::init ( - const dictionary& rhs, + const dictionary& dict, const objectRegistry& obr ) { - if (debug) - { - Pout<< "coordinateSystem::operator=" - "(" - "const dictionary&, " - "const objectRegistry&" - ") : " - << "assign from " << rhs << endl; - } - - rhs.lookup("origin") >> origin_; + dict.lookup("origin") >> origin_; // The 'note' entry is optional note_.clear(); - rhs.readIfPresent("note", note_); - - R_ = coordinateRotation::New(rhs.subDict("coordinateRotation"), obr); + dict.readIfPresent("note", note_); + R_ = coordinateRotation::New(dict.subDict("coordinateRotation"), obr); } diff --git a/src/meshTools/coordinateSystems/coordinateSystem.H b/src/meshTools/coordinateSystems/coordinateSystem.H index 52ee69f1d347345e18035412debd124b351b556f..d47608b392e3d79eb5162a34e0252e3ce9f25029 100644 --- a/src/meshTools/coordinateSystems/coordinateSystem.H +++ b/src/meshTools/coordinateSystems/coordinateSystem.H @@ -76,7 +76,7 @@ SourceFiles namespace Foam { -// Forward declaration of friend functions and operators +// Forward declarations class coordinateSystem; @@ -101,7 +101,8 @@ class coordinateSystem //- Origin point origin_; - //- Local-to-Global transformation tensor + //- Local-to-Global transformation tensor. + // May be invalid after a move assignment or transfer autoPtr<coordinateRotation> R_; @@ -110,11 +111,11 @@ protected: // Protected Member Functions //- Convert from local coordinate system to the global Cartesian system - // with optional translation for the origin + //- with optional translation for the origin virtual vector localToGlobal(const vector&, bool translate) const; //- Convert from local coordinate system to the global Cartesian system - // with optional translation for the origin + //- with optional translation for the origin virtual tmp<vectorField> localToGlobal ( const vectorField&, @@ -122,11 +123,11 @@ protected: ) const; //- Convert from global Cartesian system to the local coordinate system - // with optional translation for the origin + //- with optional translation for the origin virtual vector globalToLocal(const vector&, bool translate) const; //- Convert from global Cartesian system to the local coordinate system - // with optional translation for the origin + //- with optional translation for the origin virtual tmp<vectorField> globalToLocal ( const vectorField&, @@ -134,10 +135,10 @@ protected: ) const; //- Init from dict and obr - void init(const dictionary&); + void init(const dictionary& dict); //- Init from dictionary - void init(const dictionary&, const objectRegistry&); + void init(const dictionary& dict, const objectRegistry& obr); public: @@ -182,18 +183,18 @@ public: ); //- Construct from dictionary with a given name - coordinateSystem(const word& name, const dictionary&); + coordinateSystem(const word& name, const dictionary& dict); //- Construct from dictionary with default name - coordinateSystem(const dictionary&); + explicit coordinateSystem(const dictionary& dict); //- Construct from dictionary (default name) // With the ability to reference global coordinateSystems - coordinateSystem(const objectRegistry&, const dictionary&); + coordinateSystem(const objectRegistry& obr, const dictionary& dict); //- Construct from Istream // The Istream contains a word followed by a dictionary - coordinateSystem(Istream&); + coordinateSystem(Istream& is); //- Return clone @@ -322,10 +323,10 @@ public: // Write //- Write - virtual void write(Ostream&) const; + virtual void write(Ostream& os) const; //- Write dictionary - void writeDict(Ostream&, bool subDict=true) const; + void writeDict(Ostream& os, bool subDict=true) const; // Transformations @@ -396,7 +397,7 @@ public: void operator=(coordinateSystem&& cs); - // friend Operators + // Friend Operators friend bool operator!= ( @@ -407,7 +408,11 @@ public: // IOstream Operators - friend Ostream& operator<<(Ostream&, const coordinateSystem&); + friend Ostream& operator<< + ( + Ostream& os, + const coordinateSystem& cs + ); }; diff --git a/src/meshTools/coordinateSystems/coordinateSystemNew.C b/src/meshTools/coordinateSystems/coordinateSystemNew.C index bb4c5e9138f0da0f8b7c30357c493c2253d5b013..9f0fd188663fdb6df7e38ec8125032c95cbaf24f 100644 --- a/src/meshTools/coordinateSystems/coordinateSystemNew.C +++ b/src/meshTools/coordinateSystems/coordinateSystemNew.C @@ -35,9 +35,9 @@ Foam::autoPtr<Foam::coordinateSystem> Foam::coordinateSystem::New ) { const dictionary& coordDict = dict.subDict(typeName_()); - const word coordType = coordDict.lookup("type"); + const word modelType(coordDict.get<word>("type")); - auto cstrIter = dictionaryConstructorTablePtr_->cfind(coordType); + auto cstrIter = dictionaryConstructorTablePtr_->cfind(modelType); if (!cstrIter.found()) { @@ -45,9 +45,9 @@ Foam::autoPtr<Foam::coordinateSystem> Foam::coordinateSystem::New ( dict ) << "Unknown coordinateSystem type " - << coordType << nl << nl - << "Valid coordinateSystem types :" << nl - << dictionaryConstructorTablePtr_->sortedToc() + << modelType << nl << nl + << "Valid types: " + << flatOutput(dictionaryConstructorTablePtr_->sortedToc()) << exit(FatalIOError); }