From 95c37c0cbb6c953dca8df2e416750ee9ba865bd3 Mon Sep 17 00:00:00 2001 From: Andrew Heather Date: Tue, 4 Apr 2017 12:41:35 +0100 Subject: [PATCH 01/12] ENH: Updated second-order restart for thermo fields --- .../basic/heThermo/heThermo.C | 35 ++++-- .../basic/heThermo/heThermo.H | 9 +- .../basic/psiThermo/hePsiThermo.C | 106 ++++++++++------- .../basic/psiThermo/hePsiThermo.H | 14 ++- .../basic/rhoThermo/heRhoThermo.C | 110 +++++++++++------- .../basic/rhoThermo/heRhoThermo.H | 14 ++- 6 files changed, 186 insertions(+), 102 deletions(-) diff --git a/src/thermophysicalModels/basic/heThermo/heThermo.C b/src/thermophysicalModels/basic/heThermo/heThermo.C index c06ffb75d7..cb10d720e9 100644 --- a/src/thermophysicalModels/basic/heThermo/heThermo.C +++ b/src/thermophysicalModels/basic/heThermo/heThermo.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 | + \\/ M anipulation | Copyright (C) 2015-2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -52,11 +52,16 @@ heBoundaryCorrection(volScalarField& h) template -void Foam::heThermo::init() +void Foam::heThermo::init +( + const volScalarField& p, + const volScalarField& T, + volScalarField& he +) { - scalarField& heCells = he_.primitiveFieldRef(); - const scalarField& pCells = this->p_; - const scalarField& TCells = this->T_; + scalarField& heCells = he.primitiveFieldRef(); + const scalarField& pCells = p.primitiveField(); + const scalarField& TCells = T.primitiveField(); forAll(heCells, celli) { @@ -64,19 +69,25 @@ void Foam::heThermo::init() this->cellMixture(celli).HE(pCells[celli], TCells[celli]); } - volScalarField::Boundary& heBf = he_.boundaryFieldRef(); + volScalarField::Boundary& heBf = he.boundaryFieldRef(); forAll(heBf, patchi) { - heBf[patchi] == he + heBf[patchi] == this->he ( - this->p_.boundaryField()[patchi], - this->T_.boundaryField()[patchi], + p.boundaryField()[patchi], + T.boundaryField()[patchi], patchi ); } - this->heBoundaryCorrection(he_); + this->heBoundaryCorrection(he); + + // Note: T does not have oldTime + if (p.nOldTimes() > 0) + { + init(p.oldTime(), T.oldTime(), he.oldTime()); + } } @@ -112,7 +123,7 @@ Foam::heThermo::heThermo this->heBoundaryBaseTypes() ) { - init(); + init(this->p_, this->T_, he_); } @@ -146,7 +157,7 @@ Foam::heThermo::heThermo this->heBoundaryBaseTypes() ) { - init(); + init(this->p_, this->T_, he_); } diff --git a/src/thermophysicalModels/basic/heThermo/heThermo.H b/src/thermophysicalModels/basic/heThermo/heThermo.H index 7967cc44cc..02b0ad419e 100644 --- a/src/thermophysicalModels/basic/heThermo/heThermo.H +++ b/src/thermophysicalModels/basic/heThermo/heThermo.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2015-2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -77,7 +77,12 @@ private: //- Initialize heThermo - void init(); + void init + ( + const volScalarField& p, + const volScalarField& T, + volScalarField& he + ); public: diff --git a/src/thermophysicalModels/basic/psiThermo/hePsiThermo.C b/src/thermophysicalModels/basic/psiThermo/hePsiThermo.C index 71cc38498e..1765619767 100644 --- a/src/thermophysicalModels/basic/psiThermo/hePsiThermo.C +++ b/src/thermophysicalModels/basic/psiThermo/hePsiThermo.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2015-2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -28,15 +28,40 @@ License // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // template -void Foam::hePsiThermo::calculate() +void Foam::hePsiThermo::calculate +( + const volScalarField& p, + volScalarField& T, + volScalarField& he, + volScalarField& psi, + volScalarField& mu, + volScalarField& alpha, + const bool doOldTimes +) { - const scalarField& hCells = this->he_; - const scalarField& pCells = this->p_; + // Note: update oldTimes before current time so that if T.oldTime() is + // created from T, it starts from the unconverted T + if (doOldTimes && (p.nOldTimes() || T.nOldTimes())) + { + calculate + ( + p.oldTime(), + T.oldTime(), + he.oldTime(), + psi.oldTime(), + mu.oldTime(), + alpha.oldTime(), + true + ); + } - scalarField& TCells = this->T_.primitiveFieldRef(); - scalarField& psiCells = this->psi_.primitiveFieldRef(); - scalarField& muCells = this->mu_.primitiveFieldRef(); - scalarField& alphaCells = this->alpha_.primitiveFieldRef(); + const scalarField& hCells = he.primitiveField(); + const scalarField& pCells = p.primitiveField(); + + scalarField& TCells = T.primitiveFieldRef(); + scalarField& psiCells = psi.primitiveFieldRef(); + scalarField& muCells = mu.primitiveFieldRef(); + scalarField& alphaCells = alpha.primitiveFieldRef(); forAll(TCells, celli) { @@ -56,27 +81,16 @@ void Foam::hePsiThermo::calculate() alphaCells[celli] = mixture_.alphah(pCells[celli], TCells[celli]); } - volScalarField::Boundary& pBf = - this->p_.boundaryFieldRef(); + const volScalarField::Boundary& pBf = p.boundaryField(); + volScalarField::Boundary& TBf = T.boundaryFieldRef(); + volScalarField::Boundary& psiBf = psi.boundaryFieldRef(); + volScalarField::Boundary& heBf = he.boundaryFieldRef(); + volScalarField::Boundary& muBf = mu.boundaryFieldRef(); + volScalarField::Boundary& alphaBf = alpha.boundaryFieldRef(); - volScalarField::Boundary& TBf = - this->T_.boundaryFieldRef(); - - volScalarField::Boundary& psiBf = - this->psi_.boundaryFieldRef(); - - volScalarField::Boundary& heBf = - this->he().boundaryFieldRef(); - - volScalarField::Boundary& muBf = - this->mu_.boundaryFieldRef(); - - volScalarField::Boundary& alphaBf = - this->alpha_.boundaryFieldRef(); - - forAll(this->T_.boundaryField(), patchi) + forAll(pBf, patchi) { - fvPatchScalarField& pp = pBf[patchi]; + const fvPatchScalarField& pp = pBf[patchi]; fvPatchScalarField& pT = TBf[patchi]; fvPatchScalarField& ppsi = psiBf[patchi]; fvPatchScalarField& phe = heBf[patchi]; @@ -126,10 +140,16 @@ Foam::hePsiThermo::hePsiThermo : heThermo(mesh, phaseName) { - calculate(); - - // Switch on saving old time - this->psi_.oldTime(); + calculate + ( + this->p_, + this->T_, + this->he_, + this->psi_, + this->mu_, + this->alpha_, + true // Create old time fields + ); } @@ -145,20 +165,20 @@ Foam::hePsiThermo::~hePsiThermo() template void Foam::hePsiThermo::correct() { - if (debug) - { - InfoInFunction << endl; - } + DebugInFunction << endl; - // force the saving of the old-time values - this->psi_.oldTime(); + calculate + ( + this->p_, + this->T_, + this->he_, + this->psi_, + this->mu_, + this->alpha_, + false // No need to update old times + ); - calculate(); - - if (debug) - { - Info<< " Finished" << endl; - } + DebugInFunction << "Finished" << endl; } diff --git a/src/thermophysicalModels/basic/psiThermo/hePsiThermo.H b/src/thermophysicalModels/basic/psiThermo/hePsiThermo.H index ca5a89f73f..9b12c53ee7 100644 --- a/src/thermophysicalModels/basic/psiThermo/hePsiThermo.H +++ b/src/thermophysicalModels/basic/psiThermo/hePsiThermo.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2015-2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -55,11 +55,21 @@ class hePsiThermo // Private Member Functions //- Calculate the thermo variables - void calculate(); + void calculate + ( + const volScalarField& p, + volScalarField& T, + volScalarField& he, + volScalarField& psi, + volScalarField& mu, + volScalarField& alpha, + const bool doOldTimes + ); //- Construct as copy (not implemented) hePsiThermo(const hePsiThermo&); + public: //- Runtime type information diff --git a/src/thermophysicalModels/basic/rhoThermo/heRhoThermo.C b/src/thermophysicalModels/basic/rhoThermo/heRhoThermo.C index 9c889ac7f3..cc545d55e9 100644 --- a/src/thermophysicalModels/basic/rhoThermo/heRhoThermo.C +++ b/src/thermophysicalModels/basic/rhoThermo/heRhoThermo.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2015-2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -28,16 +28,43 @@ License // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // template -void Foam::heRhoThermo::calculate() +void Foam::heRhoThermo::calculate +( + const volScalarField& p, + volScalarField& T, + volScalarField& he, + volScalarField& psi, + volScalarField& rho, + volScalarField& mu, + volScalarField& alpha, + const bool doOldTimes +) { - const scalarField& hCells = this->he(); - const scalarField& pCells = this->p_; + // Note: update oldTimes before current time so that if T.oldTime() is + // created from T, it starts from the unconverted T + if (doOldTimes && (p.nOldTimes() || T.nOldTimes())) + { + calculate + ( + p.oldTime(), + T.oldTime(), + he.oldTime(), + psi.oldTime(), + rho.oldTime(), + mu.oldTime(), + alpha.oldTime(), + true + ); + } - scalarField& TCells = this->T_.primitiveFieldRef(); - scalarField& psiCells = this->psi_.primitiveFieldRef(); - scalarField& rhoCells = this->rho_.primitiveFieldRef(); - scalarField& muCells = this->mu_.primitiveFieldRef(); - scalarField& alphaCells = this->alpha_.primitiveFieldRef(); + const scalarField& hCells = he.primitiveField(); + const scalarField& pCells = p.primitiveField(); + + scalarField& TCells = T.primitiveFieldRef(); + scalarField& psiCells = psi.primitiveFieldRef(); + scalarField& rhoCells = rho.primitiveFieldRef(); + scalarField& muCells = mu.primitiveFieldRef(); + scalarField& alphaCells = alpha.primitiveFieldRef(); forAll(TCells, celli) { @@ -58,30 +85,17 @@ void Foam::heRhoThermo::calculate() alphaCells[celli] = mixture_.alphah(pCells[celli], TCells[celli]); } - volScalarField::Boundary& pBf = - this->p_.boundaryFieldRef(); + const volScalarField::Boundary& pBf = p.boundaryField(); + volScalarField::Boundary& TBf = T.boundaryFieldRef(); + volScalarField::Boundary& psiBf = psi.boundaryFieldRef(); + volScalarField::Boundary& rhoBf = rho.boundaryFieldRef(); + volScalarField::Boundary& heBf = he.boundaryFieldRef(); + volScalarField::Boundary& muBf = mu.boundaryFieldRef(); + volScalarField::Boundary& alphaBf = alpha.boundaryFieldRef(); - volScalarField::Boundary& TBf = - this->T_.boundaryFieldRef(); - - volScalarField::Boundary& psiBf = - this->psi_.boundaryFieldRef(); - - volScalarField::Boundary& rhoBf = - this->rho_.boundaryFieldRef(); - - volScalarField::Boundary& heBf = - this->he().boundaryFieldRef(); - - volScalarField::Boundary& muBf = - this->mu_.boundaryFieldRef(); - - volScalarField::Boundary& alphaBf = - this->alpha_.boundaryFieldRef(); - - forAll(this->T_.boundaryField(), patchi) + forAll(pBf, patchi) { - fvPatchScalarField& pp = pBf[patchi]; + const fvPatchScalarField& pp = pBf[patchi]; fvPatchScalarField& pT = TBf[patchi]; fvPatchScalarField& ppsi = psiBf[patchi]; fvPatchScalarField& prho = rhoBf[patchi]; @@ -134,7 +148,17 @@ Foam::heRhoThermo::heRhoThermo : heThermo(mesh, phaseName) { - calculate(); + calculate + ( + this->p_, + this->T_, + this->he_, + this->psi_, + this->rho_, + this->mu_, + this->alpha_, + true // Create old time fields + ); } @@ -150,17 +174,21 @@ Foam::heRhoThermo::~heRhoThermo() template void Foam::heRhoThermo::correct() { - if (debug) - { - InfoInFunction << endl; - } + DebugInFunction << endl; - calculate(); + calculate + ( + this->p_, + this->T_, + this->he_, + this->psi_, + this->rho_, + this->mu_, + this->alpha_, + false // No need to update old times + ); - if (debug) - { - Info<< " Finished" << endl; - } + DebugInFunction << "Finished" << endl; } diff --git a/src/thermophysicalModels/basic/rhoThermo/heRhoThermo.H b/src/thermophysicalModels/basic/rhoThermo/heRhoThermo.H index 7e2138d127..042e3c62e8 100644 --- a/src/thermophysicalModels/basic/rhoThermo/heRhoThermo.H +++ b/src/thermophysicalModels/basic/rhoThermo/heRhoThermo.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2015-2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -55,7 +55,17 @@ class heRhoThermo // Private Member Functions //- Calculate the thermo variables - void calculate(); + void calculate + ( + const volScalarField& p, + volScalarField& T, + volScalarField& he, + volScalarField& psi, + volScalarField& rho, + volScalarField& mu, + volScalarField& alpha, + const bool doOldTimes + ); //- Construct as copy (not implemented) heRhoThermo(const heRhoThermo&); From c13d59fa514d245f92233bfa135c05cd40861cb8 Mon Sep 17 00:00:00 2001 From: Andrew Heather Date: Tue, 4 Apr 2017 12:42:39 +0100 Subject: [PATCH 02/12] STYLE: updated debug message --- .../GeometricFields/GeometricField/GeometricField.C | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricField.C b/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricField.C index c985a3135f..9350649671 100644 --- a/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricField.C +++ b/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricField.C @@ -835,6 +835,17 @@ Foam::GeometricField::oldTime() const ), *this ); + + if (debug) + { + InfoInFunction + << "created old time field " << field0Ptr_->info() << endl; + + if (debug&2) + { + error::printStack(Info); + } + } } else { From 37b0d85dc494dc54af01503d1e4c1476caa5b54e Mon Sep 17 00:00:00 2001 From: Andrew Heather Date: Tue, 4 Apr 2017 12:50:42 +0100 Subject: [PATCH 03/12] ENH: Updated for setting of old time values --- .../ddtSchemes/backwardDdtScheme/backwardDdtScheme.C | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/finiteVolume/finiteVolume/ddtSchemes/backwardDdtScheme/backwardDdtScheme.C b/src/finiteVolume/finiteVolume/ddtSchemes/backwardDdtScheme/backwardDdtScheme.C index 641a645132..06676f037b 100644 --- a/src/finiteVolume/finiteVolume/ddtSchemes/backwardDdtScheme/backwardDdtScheme.C +++ b/src/finiteVolume/finiteVolume/ddtSchemes/backwardDdtScheme/backwardDdtScheme.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -58,7 +58,7 @@ template template scalar backwardDdtScheme::deltaT0_(const GeoField& vf) const { - if (vf.nOldTimes() < 2) + if (mesh().time().timeIndex() < 2) { return GREAT; } From 111c1d2d1293bbbc4415b5ffc714b643379bdcd2 Mon Sep 17 00:00:00 2001 From: Andrew Heather Date: Tue, 4 Apr 2017 12:51:35 +0100 Subject: [PATCH 04/12] ENH: Added include file to calculate the mechanical energy --- .../compressible/rhoPimpleFoam/createFields.H | 3 +-- .../cfdTools/general/include/createK.H | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 src/finiteVolume/cfdTools/general/include/createK.H diff --git a/applications/solvers/compressible/rhoPimpleFoam/createFields.H b/applications/solvers/compressible/rhoPimpleFoam/createFields.H index 8079428225..10ed80d25a 100644 --- a/applications/solvers/compressible/rhoPimpleFoam/createFields.H +++ b/applications/solvers/compressible/rhoPimpleFoam/createFields.H @@ -69,8 +69,7 @@ volScalarField dpdt dimensionedScalar("dpdt", p.dimensions()/dimTime, 0) ); -Info<< "Creating field kinetic energy K\n" << endl; -volScalarField K("K", 0.5*magSqr(U)); +#include "createK.H" #include "createMRF.H" diff --git a/src/finiteVolume/cfdTools/general/include/createK.H b/src/finiteVolume/cfdTools/general/include/createK.H new file mode 100644 index 0000000000..a51850a813 --- /dev/null +++ b/src/finiteVolume/cfdTools/general/include/createK.H @@ -0,0 +1,16 @@ +Info<< "Creating field kinetic energy K\n" << endl; +volScalarField K("K", 0.5*magSqr(U)); + +if (U.nOldTimes()) +{ + volVectorField* Uold = &U.oldTime(); + volScalarField* Kold = &K.oldTime(); + *Kold == 0.5*magSqr(*Uold); + + while (Uold->nOldTimes()) + { + Uold = &Uold->oldTime(); + Kold = &Kold->oldTime(); + *Kold == 0.5*magSqr(*Uold); + } +} From aecf9b911254754986d9a61fa5dc2b52ec450b36 Mon Sep 17 00:00:00 2001 From: sergio Date: Wed, 5 Apr 2017 18:17:30 -0700 Subject: [PATCH 05/12] Test on re-start backward time scheme. --- src/finiteVolume/fvMesh/fvMesh.C | 6 +++--- src/finiteVolume/fvMesh/fvMeshGeometry.C | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/finiteVolume/fvMesh/fvMesh.C b/src/finiteVolume/fvMesh/fvMesh.C index 2c667ac619..c473761690 100644 --- a/src/finiteVolume/fvMesh/fvMesh.C +++ b/src/finiteVolume/fvMesh/fvMesh.C @@ -197,9 +197,9 @@ void Foam::fvMesh::storeOldVol(const scalarField& V) "V0", time().timeName(), *this, - IOobject::NO_READ, - IOobject::NO_WRITE, - false + IOobject::READ_IF_PRESENT,//NO_READ, + IOobject::AUTO_WRITE, + true ), *this, dimVolume diff --git a/src/finiteVolume/fvMesh/fvMeshGeometry.C b/src/finiteVolume/fvMesh/fvMeshGeometry.C index c530ee0a9a..f5fd168cfa 100644 --- a/src/finiteVolume/fvMesh/fvMeshGeometry.C +++ b/src/finiteVolume/fvMesh/fvMeshGeometry.C @@ -258,9 +258,9 @@ const Foam::volScalarField::Internal& Foam::fvMesh::V00() const "V00", time().timeName(), *this, - IOobject::NO_READ, - IOobject::NO_WRITE, - false + IOobject::READ_IF_PRESENT,//NO_READ, + IOobject::AUTO_WRITE, + true ), V0() ); From 73460a2993f7916c574a0e17ebc2f6b988da0a9b Mon Sep 17 00:00:00 2001 From: sergio Date: Tue, 18 Apr 2017 14:04:27 -0700 Subject: [PATCH 06/12] Test on second order restart using backward time scheme --- .../compressible/rhoPimpleFoam/createFields.H | 7 +++++-- .../GeometricField/GeometricField.C | 3 ++- .../backwardDdtScheme/backwardDdtScheme.H | 18 ++---------------- src/finiteVolume/fvMesh/fvMesh.C | 6 +++--- src/finiteVolume/fvMesh/fvMeshGeometry.C | 5 +++-- 5 files changed, 15 insertions(+), 24 deletions(-) diff --git a/applications/solvers/compressible/rhoPimpleFoam/createFields.H b/applications/solvers/compressible/rhoPimpleFoam/createFields.H index 10ed80d25a..deaba4dd1f 100644 --- a/applications/solvers/compressible/rhoPimpleFoam/createFields.H +++ b/applications/solvers/compressible/rhoPimpleFoam/createFields.H @@ -35,7 +35,8 @@ volVectorField U IOobject::MUST_READ, IOobject::AUTO_WRITE ), - mesh + mesh, + true ); #include "compressibleCreatePhi.H" @@ -63,7 +64,9 @@ volScalarField dpdt ( "dpdt", runTime.timeName(), - mesh + mesh, + IOobject::READ_IF_PRESENT, + IOobject::AUTO_WRITE ), mesh, dimensionedScalar("dpdt", p.dimensions()/dimTime, 0) diff --git a/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricField.C b/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricField.C index 9350649671..ee0677ecbb 100644 --- a/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricField.C +++ b/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricField.C @@ -770,10 +770,11 @@ void Foam::GeometricField::storeOldTimes() const ) { storeOldTime(); + timeIndex_ = this->time().timeIndex(); } // Correct time index - timeIndex_ = this->time().timeIndex(); + //timeIndex_ = this->time().timeIndex(); } diff --git a/src/finiteVolume/finiteVolume/ddtSchemes/backwardDdtScheme/backwardDdtScheme.H b/src/finiteVolume/finiteVolume/ddtSchemes/backwardDdtScheme/backwardDdtScheme.H index af321f143f..abedc954a9 100644 --- a/src/finiteVolume/finiteVolume/ddtSchemes/backwardDdtScheme/backwardDdtScheme.H +++ b/src/finiteVolume/finiteVolume/ddtSchemes/backwardDdtScheme/backwardDdtScheme.H @@ -92,27 +92,13 @@ public: backwardDdtScheme(const fvMesh& mesh) : ddtScheme(mesh) - { - // Ensure the old-old-time cell volumes are available - // for moving meshes - if (mesh.moving()) - { - mesh.V00(); - } - } + {} //- Construct from mesh and Istream backwardDdtScheme(const fvMesh& mesh, Istream& is) : ddtScheme(mesh, is) - { - // Ensure the old-old-time cell volumes are available - // for moving meshes - if (mesh.moving()) - { - mesh.V00(); - } - } + {} // Member Functions diff --git a/src/finiteVolume/fvMesh/fvMesh.C b/src/finiteVolume/fvMesh/fvMesh.C index c473761690..f63acb9b5d 100644 --- a/src/finiteVolume/fvMesh/fvMesh.C +++ b/src/finiteVolume/fvMesh/fvMesh.C @@ -197,7 +197,7 @@ void Foam::fvMesh::storeOldVol(const scalarField& V) "V0", time().timeName(), *this, - IOobject::READ_IF_PRESENT,//NO_READ, + IOobject::NO_READ, IOobject::AUTO_WRITE, true ), @@ -281,8 +281,8 @@ Foam::fvMesh::fvMesh(const IOobject& io) time().timeName(), *this, IOobject::MUST_READ, - IOobject::NO_WRITE, - false + IOobject::AUTO_WRITE, + true ), *this ); diff --git a/src/finiteVolume/fvMesh/fvMeshGeometry.C b/src/finiteVolume/fvMesh/fvMeshGeometry.C index f5fd168cfa..a987398bb7 100644 --- a/src/finiteVolume/fvMesh/fvMeshGeometry.C +++ b/src/finiteVolume/fvMesh/fvMeshGeometry.C @@ -258,13 +258,14 @@ const Foam::volScalarField::Internal& Foam::fvMesh::V00() const "V00", time().timeName(), *this, - IOobject::READ_IF_PRESENT,//NO_READ, - IOobject::AUTO_WRITE, + IOobject::NO_READ, + IOobject::NO_WRITE, true ), V0() ); + // If V00 is used then V0 should be stored for restart V0Ptr_->writeOpt() = IOobject::AUTO_WRITE; } From bea9063bd358815bd71b44a4888f177df882f7ec Mon Sep 17 00:00:00 2001 From: mattijs Date: Thu, 15 Jun 2017 12:31:37 +0100 Subject: [PATCH 07/12] COMP: writeVTK: label64 compilation --- .../dataConversion/foamToVTK/foamVtkLagrangianWriter.C | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/utilities/postProcessing/dataConversion/foamToVTK/foamVtkLagrangianWriter.C b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamVtkLagrangianWriter.C index 959485fb19..b3c254c6f0 100644 --- a/applications/utilities/postProcessing/dataConversion/foamToVTK/foamVtkLagrangianWriter.C +++ b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamVtkLagrangianWriter.C @@ -100,7 +100,7 @@ void Foam::vtk::lagrangianWriter::writeVertsLegacy() for (label i=0; i < nParcels_; ++i) { - format().write(1); // Number of vertices for this cell (==1) + format().write(label(1)); // Number of vertices for this cell (==1) format().write(i); } format().flush(); From 2883311a23e5e6ca8f341217f7e768f940a6773d Mon Sep 17 00:00:00 2001 From: Andrew Heather Date: Thu, 15 Jun 2017 14:51:27 +0100 Subject: [PATCH 08/12] ENH: rhoPimple[DyM]Foam - updated treatment for dpdt --- .../compressible/rhoPimpleFoam/createFields.H | 18 ++---------------- .../cfdTools/compressible/createDpdt.H | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 16 deletions(-) create mode 100644 src/finiteVolume/cfdTools/compressible/createDpdt.H diff --git a/applications/solvers/compressible/rhoPimpleFoam/createFields.H b/applications/solvers/compressible/rhoPimpleFoam/createFields.H index deaba4dd1f..9d2307d418 100644 --- a/applications/solvers/compressible/rhoPimpleFoam/createFields.H +++ b/applications/solvers/compressible/rhoPimpleFoam/createFields.H @@ -35,8 +35,7 @@ volVectorField U IOobject::MUST_READ, IOobject::AUTO_WRITE ), - mesh, - true + mesh ); #include "compressibleCreatePhi.H" @@ -57,20 +56,7 @@ autoPtr turbulence ) ); -Info<< "Creating field dpdt\n" << endl; -volScalarField dpdt -( - IOobject - ( - "dpdt", - runTime.timeName(), - mesh, - IOobject::READ_IF_PRESENT, - IOobject::AUTO_WRITE - ), - mesh, - dimensionedScalar("dpdt", p.dimensions()/dimTime, 0) -); +#include "createDpdt.H" #include "createK.H" diff --git a/src/finiteVolume/cfdTools/compressible/createDpdt.H b/src/finiteVolume/cfdTools/compressible/createDpdt.H new file mode 100644 index 0000000000..7c73006924 --- /dev/null +++ b/src/finiteVolume/cfdTools/compressible/createDpdt.H @@ -0,0 +1,18 @@ +Info<< "Creating field dpdt\n" << endl; +volScalarField dpdt +( + IOobject + ( + "dpdt", + runTime.timeName(), + mesh, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + fvc::ddt(p) +); + +if (!thermo.dpdt()) +{ + dpdt == dimensionedScalar("0", dpdt.dimensions(), 0); +} From e0ae2c0b9f128d5431668fa25e700e5f9f9ea53a Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Tue, 20 Jun 2017 09:50:47 +0100 Subject: [PATCH 09/12] ENH: additional constructor and methods for axesRotation - provide single parameter constructor for which the rotation direction is determined based on the size/sign of the axis components. The direction is aligned with one of the global axes. - expose setTransform as a public method to allow the user to reset the axesRotation if desired. --- .../EulerCoordinateRotation.C | 52 ++-- .../EulerCoordinateRotation.H | 29 +- .../STARCDCoordinateRotation.C | 50 ++-- .../STARCDCoordinateRotation.H | 28 +- .../coordinateRotation/axesRotation.C | 283 ++++++++++-------- .../coordinateRotation/axesRotation.H | 90 +++--- .../coordinateRotation/coordinateRotation.C | 11 +- .../coordinateRotation/coordinateRotation.H | 7 +- .../coordinateRotationNew.C | 30 +- .../coordinateRotation/cylindrical.C | 79 +++-- .../coordinateRotation/cylindrical.H | 26 +- .../coordinateSystems/coordinateSystemNew.C | 5 +- 12 files changed, 338 insertions(+), 352 deletions(-) diff --git a/src/meshTools/coordinateSystems/coordinateRotation/EulerCoordinateRotation.C b/src/meshTools/coordinateSystems/coordinateRotation/EulerCoordinateRotation.C index 6d6e81d444..179836560a 100644 --- a/src/meshTools/coordinateSystems/coordinateRotation/EulerCoordinateRotation.C +++ b/src/meshTools/coordinateSystems/coordinateRotation/EulerCoordinateRotation.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -195,7 +195,17 @@ void Foam::EulerCoordinateRotation::calcTransform Foam::EulerCoordinateRotation::EulerCoordinateRotation() : R_(sphericalTensor::I), - Rtr_(R_) + Rtr_(sphericalTensor::I) +{} + + +Foam::EulerCoordinateRotation::EulerCoordinateRotation +( + const EulerCoordinateRotation& r +) +: + R_(r.R_), + Rtr_(r.Rtr_) {} @@ -206,7 +216,7 @@ Foam::EulerCoordinateRotation::EulerCoordinateRotation ) : R_(sphericalTensor::I), - Rtr_(R_) + Rtr_(sphericalTensor::I) { calcTransform ( @@ -227,7 +237,7 @@ Foam::EulerCoordinateRotation::EulerCoordinateRotation ) : R_(sphericalTensor::I), - Rtr_(R_) + Rtr_(sphericalTensor::I) { calcTransform(phiAngle, thetaAngle, psiAngle, inDegrees); } @@ -239,9 +249,9 @@ Foam::EulerCoordinateRotation::EulerCoordinateRotation ) : R_(sphericalTensor::I), - Rtr_(R_) + Rtr_(sphericalTensor::I) { - vector rotation(dict.lookup("rotation")); + const vector rotation(dict.lookup("rotation")); calcTransform ( @@ -259,36 +269,8 @@ Foam::EulerCoordinateRotation::EulerCoordinateRotation const objectRegistry& ) : - R_(sphericalTensor::I), - Rtr_(R_) -{ - vector rotation(dict.lookup("rotation")); - - calcTransform - ( - rotation.component(vector::X), - rotation.component(vector::Y), - rotation.component(vector::Z), - dict.lookupOrDefault("degrees", true) - ); -} - - -Foam::EulerCoordinateRotation::EulerCoordinateRotation -( - const EulerCoordinateRotation& r -) -: - R_(r.R_), - Rtr_(r.Rtr_) + EulerCoordinateRotation(dict) {} -void Foam::EulerCoordinateRotation::write(Ostream& os) const -{ - os.writeKeyword("e1") << e1() << token::END_STATEMENT << nl; - os.writeKeyword("e2") << e2() << token::END_STATEMENT << nl; - os.writeKeyword("e3") << e3() << token::END_STATEMENT << nl; -} - // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/meshTools/coordinateSystems/coordinateRotation/EulerCoordinateRotation.H b/src/meshTools/coordinateSystems/coordinateRotation/EulerCoordinateRotation.H index 984df3912d..53ee185b68 100644 --- a/src/meshTools/coordinateSystems/coordinateRotation/EulerCoordinateRotation.H +++ b/src/meshTools/coordinateSystems/coordinateRotation/EulerCoordinateRotation.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -91,7 +91,7 @@ class EulerCoordinateRotation const scalar phiAngle, const scalar thetaAngle, const scalar psiAngle, - const bool inDegrees=true + const bool inDegrees ); @@ -106,11 +106,14 @@ public: //- Construct null EulerCoordinateRotation(); + //- Construct as copy + EulerCoordinateRotation(const EulerCoordinateRotation& r); + //- Construct from rotation vector EulerCoordinateRotation ( const vector& phiThetaPsi, - const bool inDegrees=true + const bool inDegrees ); //- Construct from components of rotation vector @@ -119,17 +122,18 @@ public: const scalar phiAngle, const scalar thetaAngle, const scalar psiAngle, - const bool inDegrees=true + const bool inDegrees ); //- Construct from dictionary - EulerCoordinateRotation(const dictionary&); + explicit EulerCoordinateRotation(const dictionary& dict); - //- Construct from dictionary and mesh - EulerCoordinateRotation(const dictionary&, const objectRegistry&); - - //- Construct as copy - EulerCoordinateRotation(const EulerCoordinateRotation&); + //- Construct from dictionary and a registry (typically a mesh) + EulerCoordinateRotation + ( + const dictionary& dict, + const objectRegistry& unused + ); //- Return clone autoPtr clone() const @@ -226,11 +230,6 @@ public: // symmetrical tensor virtual symmTensor transformVector(const vector& st) const; - - // Write - - //- Write - virtual void write(Ostream&) const; }; diff --git a/src/meshTools/coordinateSystems/coordinateRotation/STARCDCoordinateRotation.C b/src/meshTools/coordinateSystems/coordinateRotation/STARCDCoordinateRotation.C index 24538ba057..e6a50a25d6 100644 --- a/src/meshTools/coordinateSystems/coordinateRotation/STARCDCoordinateRotation.C +++ b/src/meshTools/coordinateSystems/coordinateRotation/STARCDCoordinateRotation.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -147,6 +147,7 @@ Foam::symmTensor Foam::STARCDCoordinateRotation::transformVector return transformPrincipal(R_, st); } + // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // void Foam::STARCDCoordinateRotation::calcTransform @@ -195,7 +196,17 @@ void Foam::STARCDCoordinateRotation::calcTransform Foam::STARCDCoordinateRotation::STARCDCoordinateRotation() : R_(sphericalTensor::I), - Rtr_(R_) + Rtr_(sphericalTensor::I) +{} + + +Foam::STARCDCoordinateRotation::STARCDCoordinateRotation +( + const STARCDCoordinateRotation& r +) +: + R_(r.R_), + Rtr_(r.Rtr_) {} @@ -206,7 +217,7 @@ Foam::STARCDCoordinateRotation::STARCDCoordinateRotation ) : R_(sphericalTensor::I), - Rtr_(R_) + Rtr_(sphericalTensor::I) { calcTransform ( @@ -227,7 +238,7 @@ Foam::STARCDCoordinateRotation::STARCDCoordinateRotation ) : R_(sphericalTensor::I), - Rtr_(R_) + Rtr_(sphericalTensor::I) { calcTransform(rotZ, rotX, rotY, inDegrees); } @@ -239,9 +250,9 @@ Foam::STARCDCoordinateRotation::STARCDCoordinateRotation ) : R_(sphericalTensor::I), - Rtr_(R_) + Rtr_(sphericalTensor::I) { - vector rotation(dict.lookup("rotation")); + const vector rotation(dict.lookup("rotation")); calcTransform ( @@ -258,34 +269,9 @@ Foam::STARCDCoordinateRotation::STARCDCoordinateRotation const dictionary& dict, const objectRegistry& ) -{ - vector rotation(dict.lookup("rotation")); - - calcTransform - ( - rotation.component(vector::X), - rotation.component(vector::Y), - rotation.component(vector::Z), - dict.lookupOrDefault("degrees", true) - ); -} - - -Foam::STARCDCoordinateRotation::STARCDCoordinateRotation -( - const STARCDCoordinateRotation& r -) : - R_(r.R_), - Rtr_(r.Rtr_) + STARCDCoordinateRotation(dict) {} -void Foam::STARCDCoordinateRotation::write(Ostream& os) const -{ - os.writeKeyword("e1") << e1() << token::END_STATEMENT << nl; - os.writeKeyword("e2") << e2() << token::END_STATEMENT << nl; - os.writeKeyword("e3") << e3() << token::END_STATEMENT << nl; -} - // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/meshTools/coordinateSystems/coordinateRotation/STARCDCoordinateRotation.H b/src/meshTools/coordinateSystems/coordinateRotation/STARCDCoordinateRotation.H index e255070058..b76da859d1 100644 --- a/src/meshTools/coordinateSystems/coordinateRotation/STARCDCoordinateRotation.H +++ b/src/meshTools/coordinateSystems/coordinateRotation/STARCDCoordinateRotation.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -83,7 +83,7 @@ class STARCDCoordinateRotation const scalar rotZ, const scalar rotX, const scalar rotY, - const bool inDegrees=true + const bool inDegrees ); @@ -98,11 +98,14 @@ public: //- Construct null STARCDCoordinateRotation(); + //- Construct as copy + STARCDCoordinateRotation(const STARCDCoordinateRotation& r); + //- Construct from rotation vector STARCDCoordinateRotation ( const vector& rotZrotXrotY, - const bool inDegrees=true + const bool inDegrees ); //- Construct from components of rotation vector @@ -111,17 +114,19 @@ public: const scalar rotZ, const scalar rotX, const scalar rotY, - const bool inDegrees=true + const bool inDegrees ); //- Construct from dictionary - STARCDCoordinateRotation(const dictionary&); + explicit STARCDCoordinateRotation(const dictionary& dict); - //- Construct from dictionary and mesh - STARCDCoordinateRotation(const dictionary&, const objectRegistry&); + //- Construct from dictionary and a registry (typically a mesh) + STARCDCoordinateRotation + ( + const dictionary& dict, + const objectRegistry& unused + ); - //- Construct as copy - STARCDCoordinateRotation(const STARCDCoordinateRotation&); //- Return clone autoPtr clone() const @@ -218,11 +223,6 @@ public: // symmetrical tensor virtual symmTensor transformVector(const vector& st) const; - - // Write - - //- Write - virtual void write(Ostream&) const; }; diff --git a/src/meshTools/coordinateSystems/coordinateRotation/axesRotation.C b/src/meshTools/coordinateSystems/coordinateRotation/axesRotation.C index 313a51df49..b22c509c4d 100644 --- a/src/meshTools/coordinateSystems/coordinateRotation/axesRotation.C +++ b/src/meshTools/coordinateSystems/coordinateRotation/axesRotation.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -32,7 +32,12 @@ License namespace Foam { defineTypeNameAndDebug(axesRotation, 0); - addToRunTimeSelectionTable(coordinateRotation, axesRotation, dictionary); + addToRunTimeSelectionTable + ( + coordinateRotation, + axesRotation, + dictionary + ); addToRunTimeSelectionTable ( coordinateRotation, @@ -41,119 +46,13 @@ namespace Foam ); } -// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // - -void Foam::axesRotation::calcTransform -( - const vector& axis1, - const vector& axis2, - const axisOrder& order -) -{ - vector a = axis1/mag(axis1); - vector b = axis2; - - b = b - (b & a)*a; - - if (mag(b) < SMALL) - { - FatalErrorInFunction - << "axis1, axis2 appear co-linear: " - << axis1 << ", " << axis2 << endl - << abort(FatalError); - } - - b = b/mag(b); - vector c = a^b; - - tensor Rtr; - switch (order) - { - case e1e2: - { - Rtr = tensor(a, b, c); - break; - } - case e2e3: - { - Rtr = tensor(c, a, b); - break; - } - case e3e1: - { - Rtr = tensor(b, c, a); - break; - } - default: - { - FatalErrorInFunction - << "Unhandled axes specifictation" << endl - << abort(FatalError); - - Rtr = Zero; - break; - } - } - - // Global->local transformation - Rtr_ = Rtr; - - // Local->global transformation - R_ = Rtr.T(); -} - // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // Foam::axesRotation::axesRotation() : R_(sphericalTensor::I), - Rtr_(R_) -{} - - -Foam::axesRotation::axesRotation -( - const vector& axis, - const vector& dir -) -: - R_(sphericalTensor::I), - Rtr_(R_) -{ - calcTransform(axis, dir, e3e1); -} - - -Foam::axesRotation::axesRotation -( - const dictionary& dict -) -: - R_(sphericalTensor::I), - Rtr_(R_) -{ - operator=(dict); -} - - -Foam::axesRotation::axesRotation -( - const dictionary& dict, - const objectRegistry& obr -) -: - R_(sphericalTensor::I), - Rtr_(R_) -{ - operator=(dict); -} - - -Foam::axesRotation::axesRotation(const tensor& R) -: - R_(R), - Rtr_(R_.T()) + Rtr_(sphericalTensor::I) {} @@ -164,9 +63,145 @@ Foam::axesRotation::axesRotation(const axesRotation& r) {} +Foam::axesRotation::axesRotation(const tensor& R) +: + R_(R), + Rtr_(R_.T()) +{} + + +Foam::axesRotation::axesRotation +( + const vector& axis, + const vector& dir, + const axisOrder& order +) +: + R_(sphericalTensor::I), + Rtr_(sphericalTensor::I) +{ + setTransform(axis, dir, order); +} + + +Foam::axesRotation::axesRotation +( + const vector& axis +) +: + R_(sphericalTensor::I), + Rtr_(sphericalTensor::I) +{ + direction maxCmpt = 0, dirCmpt = 1; + + scalar maxVal = mag(axis[maxCmpt]); + bool negative = (axis[maxCmpt] < 0); + + for (direction cmpt = 1; cmpt < vector::nComponents; ++cmpt) + { + const scalar val = mag(axis[cmpt]); + + if (maxVal < val) + { + maxVal = val; + maxCmpt = cmpt; + dirCmpt = maxCmpt+1; + negative = (axis[cmpt] < 0); + + if (dirCmpt >= vector::nComponents) + { + dirCmpt = 0; + } + } + } + + vector dir = Zero; + dir.component(dirCmpt) = (negative ? -1 : 1); + + setTransform(axis, dir, E3_E1); +} + + +Foam::axesRotation::axesRotation +( + const dictionary& dict +) +: + R_(sphericalTensor::I), + Rtr_(sphericalTensor::I) +{ + operator=(dict); +} + + +Foam::axesRotation::axesRotation +( + const dictionary& dict, + const objectRegistry& +) +: + axesRotation(dict) +{} + // * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // +void Foam::axesRotation::setTransform +( + const vector& axis1, + const vector& axis2, + const axisOrder& order +) +{ + const vector a = axis1/mag(axis1); + vector b = axis2; + + b = b - (b & a)*a; + + if (mag(b) < SMALL) + { + FatalErrorInFunction + << "axis1, axis2 appear to be co-linear: " + << axis1 << ", " << axis2 << endl + << abort(FatalError); + } + + b = b/mag(b); + const vector c = a^b; + + // Global->local transformation + switch (order) + { + case E1_E2: + { + Rtr_ = tensor(a, b, c); + break; + } + case E2_E3: + { + Rtr_ = tensor(c, a, b); + break; + } + case E3_E1: + { + Rtr_ = tensor(b, c, a); + break; + } + default: + { + FatalErrorInFunction + << "Unhandled axes specification" << endl + << abort(FatalError); + + break; + } + } + + // Local->global transformation + R_ = Rtr_.T(); +} + + const Foam::tensorField& Foam::axesRotation::Tr() const { NotImplemented; @@ -263,34 +298,28 @@ Foam::symmTensor Foam::axesRotation::transformVector void Foam::axesRotation::operator=(const dictionary& dict) { - if (debug) - { - Pout<< "axesRotation::operator=(const dictionary&) : " - << "assign from " << dict << endl; - } - vector axis1, axis2; - axisOrder order(e3e1); if (dict.readIfPresent("e1", axis1) && dict.readIfPresent("e2", axis2)) { - order = e1e2; + setTransform(axis1, axis2, E1_E2); } - else if (dict.readIfPresent("e2", axis1)&& dict.readIfPresent("e3", axis2)) + else if (dict.readIfPresent("e2", axis1) && dict.readIfPresent("e3", axis2)) { - order = e2e3; + setTransform(axis1, axis2, E2_E3); } - else if (dict.readIfPresent("e3", axis1)&& dict.readIfPresent("e1", axis2)) + else if (dict.readIfPresent("e3", axis1) && dict.readIfPresent("e1", axis2)) { - order = e3e1; + setTransform(axis1, axis2, E3_E1); } else if (dict.found("axis") || dict.found("direction")) { // Both "axis" and "direction" are required // If one is missing the appropriate error message will be generated - order = e3e1; dict.lookup("axis") >> axis1; dict.lookup("direction") >> axis2; + + setTransform(axis1, axis2, E3_E1); } else { @@ -299,16 +328,6 @@ void Foam::axesRotation::operator=(const dictionary& dict) << "found " << exit(FatalError); } - - calcTransform(axis1, axis2, order); -} - - -void Foam::axesRotation::write(Ostream& os) const -{ - os.writeKeyword("e1") << e1() << token::END_STATEMENT << nl; - os.writeKeyword("e2") << e2() << token::END_STATEMENT << nl; - os.writeKeyword("e3") << e3() << token::END_STATEMENT << nl; } diff --git a/src/meshTools/coordinateSystems/coordinateRotation/axesRotation.H b/src/meshTools/coordinateSystems/coordinateRotation/axesRotation.H index 2f51342ba4..ca974fc0e9 100644 --- a/src/meshTools/coordinateSystems/coordinateRotation/axesRotation.H +++ b/src/meshTools/coordinateSystems/coordinateRotation/axesRotation.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -25,11 +25,12 @@ Class Foam::axesRotation Description - A coordinate rotation specified using global axis + A coordinate rotation specified using global axes The rotation is defined by a combination of vectors (e1/e2), (e2/e3) or (e3/e1). Any nonorthogonality will be absorbed into the second - vector. + vector. In terms of cylindrical coordinates, the 'axis' would + correspond to the \a z-axis and the 'direction' to the \a r-axis. \verbatim axesRotation @@ -66,6 +67,20 @@ class axesRotation : public coordinateRotation { +public: + + //- The order/combination of local axes for the axes-rotation definition + // Note that these follow the right-hand rule. + enum axisOrder + { + E1_E2, //!< The axis is X-dominant, the direction is Y-dominant + E2_E3, //!< The axis is Y-dominant, the direction is Z-dominant + E3_E1 //!< The axis is Z-dominant, the direction is X-dominant + }; + + +private: + // Private data //- Local-to-Global transformation tensor @@ -74,24 +89,6 @@ class axesRotation //- Global-to-Local transformation tensor tensor Rtr_; - //- The combination of local axes to be used - enum axisOrder - { - e1e2, - e2e3, - e3e1 - }; - - // Private Member Functions - - //- Calculate transformation tensor - void calcTransform - ( - const vector& axis1, - const vector& axis2, - const axisOrder& order = e3e1 - ); - public: @@ -103,20 +100,34 @@ public: //- Construct null axesRotation(); - //- Construct from 2 axes - axesRotation(const vector& axis, const vector& dir); + //- Construct as copy + axesRotation(const axesRotation& r); + + //- Construct from local to global rotation matrix + explicit axesRotation(const tensor& R); + + //- Construct from two axes (axis and direction) + axesRotation + ( + const vector& axis, + const vector& dir, + const axisOrder& order = E3_E1 + ); + + //- Construct from a single axis using a best-guess for the second axis + // For the best-guess, the largest component value and sign of the + // axis determines the direction orientation. + explicit axesRotation(const vector& axis); //- Construct from dictionary - axesRotation(const dictionary&); + explicit axesRotation(const dictionary& dict); - //- Construct from components - axesRotation(const tensor& R); - - //- Construct from dictionary and mesh - axesRotation(const dictionary&, const objectRegistry&); - - //- Construct as copy - axesRotation(const axesRotation&); + //- Construct from dictionary and a registry (typically a mesh) + axesRotation + ( + const dictionary& dict, + const objectRegistry& unused + ); //- Return clone autoPtr clone() const @@ -139,6 +150,14 @@ public: Rtr_ = sphericalTensor::I; } + //- Set the transformation tensors from two axes (axis and direction) + void setTransform + ( + const vector& axis1, + const vector& axis2, + const axisOrder& order = E3_E1 + ); + //- Update the rotation for a list of cells virtual void updateCells(const polyMesh&, const labelList&) {} @@ -216,13 +235,8 @@ public: // Member Operators //- Assign from dictionary - void operator=(const dictionary&); + void operator=(const dictionary& dict); - - // Write - - //- Write - virtual void write(Ostream&) const; }; diff --git a/src/meshTools/coordinateSystems/coordinateRotation/coordinateRotation.C b/src/meshTools/coordinateSystems/coordinateRotation/coordinateRotation.C index c9ac59b609..57565dbc45 100644 --- a/src/meshTools/coordinateSystems/coordinateRotation/coordinateRotation.C +++ b/src/meshTools/coordinateSystems/coordinateRotation/coordinateRotation.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -74,4 +74,13 @@ Foam::symmTensor Foam::coordinateRotation::transformPrincipal } + +void Foam::coordinateRotation::write(Ostream& os) const +{ + os.writeEntry("e1", e1()); + os.writeEntry("e2", e2()); + os.writeEntry("e3", e3()); +} + + // ************************************************************************* // diff --git a/src/meshTools/coordinateSystems/coordinateRotation/coordinateRotation.H b/src/meshTools/coordinateSystems/coordinateRotation/coordinateRotation.H index bab113c3d0..3a8396b509 100644 --- a/src/meshTools/coordinateSystems/coordinateRotation/coordinateRotation.H +++ b/src/meshTools/coordinateSystems/coordinateRotation/coordinateRotation.H @@ -123,7 +123,8 @@ public: //- Select constructed from dictionary and objectRegistry static autoPtr New ( - const dictionary& dict, const objectRegistry& obr + const dictionary& dict, + const objectRegistry& obr ); //- Select constructed from dictionary @@ -216,8 +217,8 @@ public: // Write - //- Write - virtual void write(Ostream&) const = 0; + //- Write coordinateRotation as e1,e2,e3 vectors + virtual void write(Ostream& os) const; }; diff --git a/src/meshTools/coordinateSystems/coordinateRotation/coordinateRotationNew.C b/src/meshTools/coordinateSystems/coordinateRotation/coordinateRotationNew.C index b1457329ff..feb473421c 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 | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -34,26 +34,15 @@ Foam::autoPtr Foam::coordinateRotation::New const objectRegistry& obr ) { - if (debug) - { - Pout<< "coordinateRotation::New" - "(const dictionary&, const objectRegistry&) : " - << "constructing coordinateRotation" - << endl; - } - const word rotType = dict.lookup("type"); - objectRegistryConstructorTable::iterator cstrIter = - objectRegistryConstructorTablePtr_->find(rotType); + auto cstrIter = objectRegistryConstructorTablePtr_->cfind(rotType); if (!cstrIter.found()) { FatalIOErrorInFunction(dict) - << "Unknown coordinateRotation type " - << rotType << nl << nl + << "Unknown coordinateRotation type " << rotType << nl << nl << "Valid coordinateRotation types are :" << nl - << "[default: axes ]" << objectRegistryConstructorTablePtr_->sortedToc() << exit(FatalIOError); } @@ -67,23 +56,14 @@ Foam::autoPtr Foam::coordinateRotation::New const dictionary& dict ) { - if (debug) - { - Pout<< "coordinateRotation::New(const dictionary&) : " - << "constructing coordinateRotation" - << endl; - } - const word rotType = dict.lookup("type"); - dictionaryConstructorTable::iterator cstrIter = - dictionaryConstructorTablePtr_->find(rotType); + auto cstrIter = dictionaryConstructorTablePtr_->cfind(rotType); if (!cstrIter.found()) { FatalIOErrorInFunction(dict) - << "Unknown coordinateRotation type " - << rotType << nl << nl + << "Unknown coordinateRotation type " << rotType << nl << nl << "Valid coordinateRotation types are :" << nl << dictionaryConstructorTablePtr_->sortedToc() << exit(FatalIOError); diff --git a/src/meshTools/coordinateSystems/coordinateRotation/cylindrical.C b/src/meshTools/coordinateSystems/coordinateRotation/cylindrical.C index 8a04eedeed..3ebc07d442 100644 --- a/src/meshTools/coordinateSystems/coordinateRotation/cylindrical.C +++ b/src/meshTools/coordinateSystems/coordinateRotation/cylindrical.C @@ -67,7 +67,7 @@ void Foam::cylindrical::init tensorField& R = Rptr_(); forAll(cells, i) { - label celli = cells[i]; + const label celli = cells[i]; vector dir = cc[celli] - origin_; dir /= mag(dir) + VSMALL; @@ -92,6 +92,40 @@ void Foam::cylindrical::init // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // +Foam::cylindrical::cylindrical(const cylindrical& r) +: + Rptr_(r.Rptr_, false), // clone + origin_(r.origin_), + e3_(r.e3_) +{} + + +Foam::cylindrical::cylindrical(const tensorField& R) +: + Rptr_(), + origin_(Zero), + e3_(Zero) +{ + Rptr_() = R; +} + + +Foam::cylindrical::cylindrical(const dictionary& dict) +: + Rptr_(), + origin_(), + e3_() +{ + FatalErrorInFunction + << " cylindrical can not be constructed from dictionary " + << " use the construtctor : " + "(" + " const dictionary&, const objectRegistry&" + ")" + << exit(FatalIOError); +} + + Foam::cylindrical::cylindrical ( const dictionary& dict, @@ -103,12 +137,9 @@ Foam::cylindrical::cylindrical e3_(Zero) { // If origin is specified in the coordinateSystem - if (dict.parent().found("origin")) - { - dict.parent().lookup("origin") >> origin_; - } + dict.parent().readIfPresent("origin", origin_); - // rotation axis + // Rotation axis dict.lookup("e3") >> e3_; init(obr); @@ -146,40 +177,6 @@ Foam::cylindrical::cylindrical } -Foam::cylindrical::cylindrical(const dictionary& dict) -: - Rptr_(), - origin_(), - e3_() -{ - FatalErrorInFunction - << " cylindrical can not be constructed from dictionary " - << " use the construtctor : " - "(" - " const dictionary&, const objectRegistry&" - ")" - << exit(FatalIOError); -} - - -Foam::cylindrical::cylindrical(const tensorField& R) -: - Rptr_(), - origin_(Zero), - e3_(Zero) -{ - Rptr_() = R; -} - - -Foam::cylindrical::cylindrical(const cylindrical& r) -: - Rptr_(r.Rptr_, false), // clone - origin_(r.origin_), - e3_(r.e3_) -{} - - // * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // @@ -360,7 +357,7 @@ Foam::symmTensor Foam::cylindrical::transformVector void Foam::cylindrical::write(Ostream& os) const { - os.writeKeyword("e3") << e3() << token::END_STATEMENT << nl; + os.writeEntry("e3", e3()); } diff --git a/src/meshTools/coordinateSystems/coordinateRotation/cylindrical.H b/src/meshTools/coordinateSystems/coordinateRotation/cylindrical.H index ff7f838420..2baca6682c 100644 --- a/src/meshTools/coordinateSystems/coordinateRotation/cylindrical.H +++ b/src/meshTools/coordinateSystems/coordinateRotation/cylindrical.H @@ -60,7 +60,7 @@ namespace Foam { /*---------------------------------------------------------------------------*\ - Class cylindrical Declaration + Class cylindrical Declaration \*---------------------------------------------------------------------------*/ class cylindrical @@ -96,13 +96,22 @@ public: // Constructors + //- Construct as copy + cylindrical(const cylindrical& r); + + //- Construct from tensor Field + explicit cylindrical(const tensorField& R); + + //- Construct from dictionary - for API compatibility only + explicit cylindrical(const dictionary& dict); + //- Construct from dictionary and objectRegistry - cylindrical(const dictionary&, const objectRegistry&); + cylindrical(const dictionary& dict, const objectRegistry& obr); //- Construct from components for all cells cylindrical ( - const objectRegistry&, + const objectRegistry& obr, const vector& axis, const point& origin ); @@ -110,21 +119,12 @@ public: //- Construct from components for list of cells cylindrical ( - const objectRegistry&, + const objectRegistry& obr, const vector& axis, const point& origin, const List