diff --git a/applications/utilities/mesh/generation/blockMesh/curvedEdges/arcEdge.C b/applications/utilities/mesh/generation/blockMesh/curvedEdges/arcEdge.C index a83154ad56e65ba908f0fa072d480fbd2650e626..886281274b6f1a859db28bcd81d192e08062f3bc 100644 --- a/applications/utilities/mesh/generation/blockMesh/curvedEdges/arcEdge.C +++ b/applications/utilities/mesh/generation/blockMesh/curvedEdges/arcEdge.C @@ -30,8 +30,7 @@ Description #include "arcEdge.H" #include "mathematicalConstants.H" - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +#include "addToRunTimeSelectionTable.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // @@ -40,8 +39,7 @@ namespace Foam defineTypeNameAndDebug(arcEdge, 0); // Add the curvedEdge constructor functions to the hash tables - curvedEdge::addIstreamConstructorToTable<arcEdge> - addArcEdgeIstreamConstructorToTable_; + addToRunTimeSelectionTable(curvedEdge, arcEdge, Istream); } diff --git a/applications/utilities/mesh/generation/blockMesh/curvedEdges/curvedEdge.C b/applications/utilities/mesh/generation/blockMesh/curvedEdges/curvedEdge.C index c9d31ef6a189939208bc706bd0a427775124b600..6a2d41a83e31af8d938cfb8bc1a4bccdffd532b7 100644 --- a/applications/utilities/mesh/generation/blockMesh/curvedEdges/curvedEdge.C +++ b/applications/utilities/mesh/generation/blockMesh/curvedEdges/curvedEdge.C @@ -41,26 +41,7 @@ namespace Foam // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // defineTypeNameAndDebug(curvedEdge, 0); - -// Define the constructor function hash tables -HashTable<curvedEdge::IstreamConstructorPtr_>* - curvedEdge::IstreamConstructorTablePtr_; - - -// Hash table Constructor called from the table add functions. - -void curvedEdge::constructTables() -{ - static bool constructed = false; - - if (!constructed) - { - curvedEdge::IstreamConstructorTablePtr_ - = new HashTable<curvedEdge::IstreamConstructorPtr_>; - - constructed = true; - } -} +defineRunTimeSelectionTable(curvedEdge, Istream); // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // @@ -117,10 +98,11 @@ autoPtr<curvedEdge> curvedEdge::New(const pointField& points, Istream& is) word curvedEdgeType(is); - HashTable<IstreamConstructorPtr_>::iterator curvedEdgeConstructorIter = - IstreamConstructorTablePtr_->find(curvedEdgeType); + IstreamConstructorTable::iterator cstrIter = + IstreamConstructorTablePtr_ + ->find(curvedEdgeType); - if (curvedEdgeConstructorIter == IstreamConstructorTablePtr_->end()) + if (cstrIter == IstreamConstructorTablePtr_->end()) { FatalErrorIn("curvedEdge::New(const pointField&, Istream&)") << "Unknown curvedEdge type " << curvedEdgeType << endl << endl @@ -129,7 +111,7 @@ autoPtr<curvedEdge> curvedEdge::New(const pointField& points, Istream& is) << abort(FatalError); } - return autoPtr<curvedEdge>(curvedEdgeConstructorIter()(points, is)); + return autoPtr<curvedEdge>(cstrIter()(points, is)); } @@ -177,7 +159,6 @@ Ostream& operator<<(Ostream& os, const curvedEdge& p) } - // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam diff --git a/applications/utilities/mesh/generation/blockMesh/curvedEdges/curvedEdge.H b/applications/utilities/mesh/generation/blockMesh/curvedEdges/curvedEdge.H index c568180d73dc7352d1d40a85c7c0b9e6b20f20e8..5ecf489d38818e2030080246e02f1ca07f5cd919 100644 --- a/applications/utilities/mesh/generation/blockMesh/curvedEdges/curvedEdge.H +++ b/applications/utilities/mesh/generation/blockMesh/curvedEdges/curvedEdge.H @@ -63,51 +63,23 @@ protected: public: - // Constructor Hash tables - - //- Construct from Istream function pointer type - typedef autoPtr<curvedEdge> (*IstreamConstructorPtr_) - (const pointField&, Istream&); - - //- Construct from Istream function pointer table pointer - static HashTable<IstreamConstructorPtr_>* - IstreamConstructorTablePtr_; - - - // Hash table constructor classes and functions - - //- Hash table Constructor. - // Must be called from the table add functions below. - static void constructTables(); + //- Runtime type information + TypeName("curvedEdge"); - //- Class to add constructor from Istream to Hash table - template<class curvedEdgeType> - class addIstreamConstructorToTable - { - public: + // Declare run-time constructor selection tables - static autoPtr<curvedEdge> New + declareRunTimeSelectionTable + ( + autoPtr, + curvedEdge, + Istream, ( const pointField& points, Istream& is - ) - { - return autoPtr<curvedEdge>(new curvedEdgeType(points, is)); - } - - addIstreamConstructorToTable() - { - curvedEdge::constructTables(); - - curvedEdge::IstreamConstructorTablePtr_ - ->insert(curvedEdgeType::typeName, New); - } - }; - - - //- Runtime type information - TypeName("curvedEdge"); + ), + (points, is) + ); // Constructors diff --git a/applications/utilities/mesh/generation/blockMesh/curvedEdges/polySplineEdge.C b/applications/utilities/mesh/generation/blockMesh/curvedEdges/polySplineEdge.C index f4581ed338e2ba79ce96fa4ec48f3c27abfad7fc..7263f7184362126d8bb094cfe6cafa205d3e3d2d 100644 --- a/applications/utilities/mesh/generation/blockMesh/curvedEdges/polySplineEdge.C +++ b/applications/utilities/mesh/generation/blockMesh/curvedEdges/polySplineEdge.C @@ -26,6 +26,7 @@ License #include "polySplineEdge.H" #include "BSpline.H" +#include "addToRunTimeSelectionTable.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // @@ -34,8 +35,7 @@ namespace Foam defineTypeNameAndDebug(polySplineEdge, 0); // Add the curvedEdge constructor functions to the hash tables - curvedEdge::addIstreamConstructorToTable<polySplineEdge> - addPolySplineEdgeIstreamConstructorToTable_; + addToRunTimeSelectionTable(curvedEdge, polySplineEdge, Istream); } diff --git a/applications/utilities/mesh/generation/blockMesh/curvedEdges/polySplineEdge.H b/applications/utilities/mesh/generation/blockMesh/curvedEdges/polySplineEdge.H index d71685782d2694911b11cdc49fc195411ce3fabd..1f59d5bf8e71ebf77603ff69d9e0764073648896 100644 --- a/applications/utilities/mesh/generation/blockMesh/curvedEdges/polySplineEdge.H +++ b/applications/utilities/mesh/generation/blockMesh/curvedEdges/polySplineEdge.H @@ -92,7 +92,7 @@ public: ); //- Construct from Istream setting pointsList - polySplineEdge(const pointField& points,Istream& is); + polySplineEdge(const pointField& points, Istream& is); // Destructor diff --git a/applications/utilities/mesh/generation/blockMesh/curvedEdges/simpleSplineEdge.C b/applications/utilities/mesh/generation/blockMesh/curvedEdges/simpleSplineEdge.C index 8fe13aefe0b9e20193ad5240f831310d55a8cc11..b45f0ea3c29a68a63573a4838e74fba7456731aa 100644 --- a/applications/utilities/mesh/generation/blockMesh/curvedEdges/simpleSplineEdge.C +++ b/applications/utilities/mesh/generation/blockMesh/curvedEdges/simpleSplineEdge.C @@ -27,9 +27,8 @@ Description \*---------------------------------------------------------------------------*/ -#include "error.H" - #include "simpleSplineEdge.H" +#include "addToRunTimeSelectionTable.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -39,10 +38,8 @@ namespace Foam // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // defineTypeNameAndDebug(simpleSplineEdge, 0); +addToRunTimeSelectionTable(curvedEdge, simpleSplineEdge, Istream); -// Add the curvedEdge constructor functions to the hash tables -curvedEdge::addIstreamConstructorToTable<simpleSplineEdge> - addSimpleSplineEdgeIstreamConstructorToTable_; // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // diff --git a/applications/utilities/postProcessing/sampling/probeLocations/probeLocations.C b/applications/utilities/postProcessing/sampling/probeLocations/probeLocations.C index 6e9ee2f228690de91729390ff9ab93eb500ce6cd..18ba96c4f1919cdb9687d53b7109755f6203fb37 100644 --- a/applications/utilities/postProcessing/sampling/probeLocations/probeLocations.C +++ b/applications/utilities/postProcessing/sampling/probeLocations/probeLocations.C @@ -39,10 +39,12 @@ using namespace Foam; int main(int argc, char *argv[]) { timeSelector::addOptions(); +# include "addRegionOption.H" + # include "setRootCase.H" # include "createTime.H" instantList timeDirs = timeSelector::select0(runTime, args); -# include "createMesh.H" +# include "createNamedMesh.H" IOprobes sniff ( diff --git a/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/processor/processorPolyPatch.C b/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/processor/processorPolyPatch.C index 00091293fa7cdb23283b3951acd5cff96af38d8f..70eafc70a88d8c4ed96982789ae03e8f916fc193 100644 --- a/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/processor/processorPolyPatch.C +++ b/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/processor/processorPolyPatch.C @@ -143,7 +143,7 @@ void Foam::processorPolyPatch::initGeometry() ( Pstream::blocking, neighbProcNo(), - 3*(sizeof(label) + size()*sizeof(vector) + sizeof(float)) + 3*(sizeof(label) + size()*sizeof(vector) + sizeof(scalar)) ); toNeighbProc @@ -163,7 +163,7 @@ void Foam::processorPolyPatch::calcGeometry() ( Pstream::blocking, neighbProcNo(), - 3*(sizeof(label) + size()*sizeof(vector) + sizeof(float)) + 3*(sizeof(label) + size()*sizeof(vector) + sizeof(scalar)) ); fromNeighbProc >> neighbFaceCentres_ diff --git a/src/fvMotionSolver/Make/files b/src/fvMotionSolver/Make/files index a49366e8adcaf17b46d2aa170c03ae4eb72b3f6b..41f31c0ecc79dd3972e667e08041002a0e9099ae 100644 --- a/src/fvMotionSolver/Make/files +++ b/src/fvMotionSolver/Make/files @@ -1,5 +1,6 @@ fvMotionSolvers/fvMotionSolver/fvMotionSolver.C fvMotionSolvers/velocity/laplacian/velocityLaplacianFvMotionSolver.C +fvMotionSolvers/displacement/displacementFvMotionSolver/displacementFvMotionSolver.C fvMotionSolvers/displacement/interpolation/displacementInterpolationFvMotionSolver.C fvMotionSolvers/displacement/laplacian/displacementLaplacianFvMotionSolver.C fvMotionSolvers/displacement/SBRStress/displacementSBRStressFvMotionSolver.C diff --git a/src/fvMotionSolver/fvMotionSolvers/displacement/SBRStress/displacementSBRStressFvMotionSolver.C b/src/fvMotionSolver/fvMotionSolvers/displacement/SBRStress/displacementSBRStressFvMotionSolver.C index 68f7280c19057c926fced877339a380ee8b4c199..8c536691819eebc97682f036ab9cdfc842d25508 100644 --- a/src/fvMotionSolver/fvMotionSolvers/displacement/SBRStress/displacementSBRStressFvMotionSolver.C +++ b/src/fvMotionSolver/fvMotionSolvers/displacement/SBRStress/displacementSBRStressFvMotionSolver.C @@ -55,25 +55,10 @@ namespace Foam Foam::displacementSBRStressFvMotionSolver::displacementSBRStressFvMotionSolver ( const polyMesh& mesh, - Istream& + Istream& is ) : - fvMotionSolver(mesh), - points0_ - ( - pointIOField - ( - IOobject - ( - "points", - time().constant(), - polyMesh::meshSubDir, - mesh, - IOobject::MUST_READ, - IOobject::NO_WRITE - ) - ) - ), + displacementFvMotionSolver(mesh, is), pointDisplacement_ ( IOobject @@ -132,7 +117,7 @@ Foam::displacementSBRStressFvMotionSolver::curPoints() const tmp<pointField> tcurPoints ( - points0_ + pointDisplacement_.internalField() + points0() + pointDisplacement_.internalField() ); twoDCorrectPoints(tcurPoints()); @@ -208,63 +193,7 @@ void Foam::displacementSBRStressFvMotionSolver::updateMesh const mapPolyMesh& mpm ) { - fvMotionSolver::updateMesh(mpm); - - // Map points0_ - // Map points0_. Bit special since we somehow have to come up with - // a sensible points0 position for introduced points. - // Find out scaling between points0 and current points - - // Get the new points either from the map or the mesh - const pointField& points = - ( - mpm.hasMotionPoints() - ? mpm.preMotionPoints() - : fvMesh_.points() - ); - - // Note: boundBox does reduce - const vector span0 = boundBox(points0_).span(); - const vector span = boundBox(points).span(); - - vector scaleFactors(cmptDivide(span0, span)); - - pointField newPoints0(mpm.pointMap().size()); - - forAll(newPoints0, pointI) - { - label oldPointI = mpm.pointMap()[pointI]; - - if (oldPointI >= 0) - { - label masterPointI = mpm.reversePointMap()[oldPointI]; - - if (masterPointI == pointI) - { - newPoints0[pointI] = points0_[oldPointI]; - } - else - { - // New point. Assume motion is scaling. - newPoints0[pointI] = points0_[oldPointI] + cmptMultiply - ( - scaleFactors, - points[pointI]-points[masterPointI] - ); - } - } - else - { - FatalErrorIn - ( - "displacementSBRStressFvMotionSolver::updateMesh" - "(const mapPolyMesh& mpm)" - ) << "Cannot work out coordinates of introduced vertices." - << " New vertex " << pointI << " at coordinate " - << points[pointI] << exit(FatalError); - } - } - points0_.transfer(newPoints0); + displacementFvMotionSolver::updateMesh(mpm); // Update diffusivity. Note two stage to make sure old one is de-registered // before creating/registering new one. diff --git a/src/fvMotionSolver/fvMotionSolvers/displacement/SBRStress/displacementSBRStressFvMotionSolver.H b/src/fvMotionSolver/fvMotionSolvers/displacement/SBRStress/displacementSBRStressFvMotionSolver.H index 740fed7e7b708325b7260fd4b5e4350a2ecbc150..766025cf8609043c7c582baa8c1a1120a68b7b71 100644 --- a/src/fvMotionSolver/fvMotionSolvers/displacement/SBRStress/displacementSBRStressFvMotionSolver.H +++ b/src/fvMotionSolver/fvMotionSolvers/displacement/SBRStress/displacementSBRStressFvMotionSolver.H @@ -37,7 +37,7 @@ SourceFiles #ifndef displacementSBRStressFvMotionSolver_H #define displacementSBRStressFvMotionSolver_H -#include "fvMotionSolver.H" +#include "displacementFvMotionSolver.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -53,13 +53,10 @@ class motionDiffusivity; class displacementSBRStressFvMotionSolver : - public fvMotionSolver + public displacementFvMotionSolver { // Private data - //- Reference point field - pointField points0_; - //- Point motion field mutable pointVectorField pointDisplacement_; @@ -105,12 +102,6 @@ public: // Member Functions - //- Return reference to the reference field - const pointField& points0() const - { - return points0_; - } - //- Return reference to the point motion displacement field pointVectorField& pointDisplacement() { diff --git a/src/fvMotionSolver/fvMotionSolvers/displacement/displacementFvMotionSolver/displacementFvMotionSolver.C b/src/fvMotionSolver/fvMotionSolvers/displacement/displacementFvMotionSolver/displacementFvMotionSolver.C new file mode 100644 index 0000000000000000000000000000000000000000..aee52c717ce6d7bf6f685ef8a2fac395f65807ba --- /dev/null +++ b/src/fvMotionSolver/fvMotionSolvers/displacement/displacementFvMotionSolver/displacementFvMotionSolver.C @@ -0,0 +1,146 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +\*---------------------------------------------------------------------------*/ + +#include "displacementFvMotionSolver.H" +#include "addToRunTimeSelectionTable.H" +#include "mapPolyMesh.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ +// defineTypeNameAndDebug(displacementFvMotionSolver, 0); +// +// addToRunTimeSelectionTable +// ( +// fvMotionSolver, +// displacementFvMotionSolver, +// dictionary +// ); +} + + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::displacementFvMotionSolver:: +displacementFvMotionSolver +( + const polyMesh& mesh, + Istream& +) +: + fvMotionSolver(mesh), + points0_ + ( + pointIOField + ( + IOobject + ( + "points", + mesh.time().constant(), + polyMesh::meshSubDir, + mesh, + IOobject::MUST_READ, + IOobject::NO_WRITE, + false + ) + ) + ) +{} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::displacementFvMotionSolver::~displacementFvMotionSolver() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::displacementFvMotionSolver::updateMesh(const mapPolyMesh& mpm) +{ + fvMotionSolver::updateMesh(mpm); + + // Map points0_. Bit special since we somehow have to come up with + // a sensible points0 position for introduced points. + // Find out scaling between points0 and current points + + // Get the new points either from the map or the mesh + const pointField& points = + ( + mpm.hasMotionPoints() + ? mpm.preMotionPoints() + : fvMesh_.points() + ); + + // Note: boundBox does reduce + const vector span0 = boundBox(points0_).span(); + const vector span = boundBox(points).span(); + + vector scaleFactors(cmptDivide(span0, span)); + + pointField newPoints0(mpm.pointMap().size()); + + forAll(newPoints0, pointI) + { + label oldPointI = mpm.pointMap()[pointI]; + + if (oldPointI >= 0) + { + label masterPointI = mpm.reversePointMap()[oldPointI]; + + if (masterPointI == pointI) + { + newPoints0[pointI] = points0_[oldPointI]; + } + else + { + // New point. Assume motion is scaling. + newPoints0[pointI] = points0_[oldPointI] + cmptMultiply + ( + scaleFactors, + points[pointI]-points[masterPointI] + ); + } + } + else + { + FatalErrorIn + ( + "displacementLaplacianFvMotionSolver::updateMesh" + "(const mapPolyMesh& mpm)" + ) << "Cannot work out coordinates of introduced vertices." + << " New vertex " << pointI << " at coordinate " + << points[pointI] << exit(FatalError); + } + } + points0_.transfer(newPoints0); +} + + +// ************************************************************************* // diff --git a/src/fvMotionSolver/fvMotionSolvers/displacement/displacementFvMotionSolver/displacementFvMotionSolver.H b/src/fvMotionSolver/fvMotionSolvers/displacement/displacementFvMotionSolver/displacementFvMotionSolver.H new file mode 100644 index 0000000000000000000000000000000000000000..aedd15f7044c8053b0e6dcbc4dc9d18e0799cc30 --- /dev/null +++ b/src/fvMotionSolver/fvMotionSolvers/displacement/displacementFvMotionSolver/displacementFvMotionSolver.H @@ -0,0 +1,114 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Class + Foam::displacementFvMotionSolver.H + +Description + Base class for fvMotionSolvers which calculate displacement. + +SourceFiles + displacementFvMotionSolver.C + +\*---------------------------------------------------------------------------*/ + +#ifndef displacementFvMotionSolver_H +#define displacementFvMotionSolver_H + +#include "fvMotionSolver.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class displacementFvMotionSolver Declaration +\*---------------------------------------------------------------------------*/ + +class displacementFvMotionSolver +: + public fvMotionSolver +{ + // Private data + + //- Reference point field + pointField points0_; + + + // Private Member Functions + + //- Disallow default bitwise copy construct + displacementFvMotionSolver + ( + const displacementFvMotionSolver& + ); + + //- Disallow default bitwise assignment + void operator=(const displacementFvMotionSolver&); + + +public: + + //- Runtime type information + TypeName("displacementInterpolation"); + + + // Constructors + + //- Construct from polyMesh and data stream + displacementFvMotionSolver + ( + const polyMesh&, + Istream& msDataUnused + ); + + + // Destructor + + ~displacementFvMotionSolver(); + + + // Member Functions + + //- Return reference to the reference field + const pointField& points0() const + { + return points0_; + } + + //- Update topology + virtual void updateMesh(const mapPolyMesh&); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/fvMotionSolver/fvMotionSolvers/displacement/interpolation/displacementInterpolationFvMotionSolver.C b/src/fvMotionSolver/fvMotionSolvers/displacement/interpolation/displacementInterpolationFvMotionSolver.C index 178d1d1b2a4d116d0401b3a3e9b7d4f684d734ce..cdd5a999ec1290068d5fb02c141830c419a28c53 100644 --- a/src/fvMotionSolver/fvMotionSolvers/displacement/interpolation/displacementInterpolationFvMotionSolver.C +++ b/src/fvMotionSolver/fvMotionSolvers/displacement/interpolation/displacementInterpolationFvMotionSolver.C @@ -58,26 +58,10 @@ Foam::displacementInterpolationFvMotionSolver:: displacementInterpolationFvMotionSolver ( const polyMesh& mesh, - Istream& + Istream& is ) : - fvMotionSolver(mesh), - points0_ - ( - pointIOField - ( - IOobject - ( - "points", - mesh.time().constant(), - polyMesh::meshSubDir, - mesh, - IOobject::MUST_READ, - IOobject::NO_WRITE, - false - ) - ) - ), + displacementFvMotionSolver(mesh, is), dynamicMeshCoeffs_ ( IOdictionary @@ -174,7 +158,7 @@ displacementInterpolationFvMotionSolver forAll(fz().meshPoints(), localI) { label pointI = fz().meshPoints()[localI]; - const scalar coord = points0_[pointI][dir]; + const scalar coord = points0()[pointI][dir]; minCoord = min(minCoord, coord); maxCoord = max(maxCoord, coord); } @@ -198,7 +182,7 @@ displacementInterpolationFvMotionSolver zoneCoordinates[zoneCoordinates.size()-1] += SMALL; // Check if we have static min and max mesh bounds - const scalarField meshCoords = points0_.component(dir); + const scalarField meshCoords = points0().component(dir); scalar minCoord = gMin(meshCoords); scalar maxCoord = gMax(meshCoords); @@ -288,7 +272,7 @@ displacementInterpolationFvMotionSolver "displacementInterpolationFvMotionSolver::" "displacementInterpolationFvMotionSolver" "(const polyMesh&, Istream&)" - ) << "Did not find point " << points0_[pointI] + ) << "Did not find point " << points0()[pointI] << " coordinate " << meshCoords[pointI] << " in ranges " << rangeToCoord << abort(FatalError); @@ -344,18 +328,18 @@ Foam::displacementInterpolationFvMotionSolver:: Foam::tmp<Foam::pointField> Foam::displacementInterpolationFvMotionSolver::curPoints() const { - if (mesh().nPoints() != points0_.size()) + if (mesh().nPoints() != points0().size()) { FatalErrorIn ( "displacementInterpolationFvMotionSolver::curPoints() const" ) << "The number of points in the mesh seems to have changed." << endl - << "In constant/polyMesh there are " << points0_.size() + << "In constant/polyMesh there are " << points0().size() << " points; in the current mesh there are " << mesh().nPoints() << " points." << exit(FatalError); } - tmp<pointField> tcurPoints(new pointField(points0_)); + tmp<pointField> tcurPoints(new pointField(points0())); pointField& curPoints = tcurPoints(); // Interpolate the diplacement of the face zones. @@ -413,68 +397,4 @@ Foam::displacementInterpolationFvMotionSolver::curPoints() const } -void Foam::displacementInterpolationFvMotionSolver::updateMesh -( - const mapPolyMesh& mpm -) -{ - fvMotionSolver::updateMesh(mpm); - - // Map points0_. Bit special since we somehow have to come up with - // a sensible points0 position for introduced points. - // Find out scaling between points0 and current points - - // Get the new points either from the map or the mesh - const pointField& points = - ( - mpm.hasMotionPoints() - ? mpm.preMotionPoints() - : fvMesh_.points() - ); - - // Note: boundBox does reduce - const vector span0 = boundBox(points0_).span(); - const vector span = boundBox(points).span(); - - vector scaleFactors(cmptDivide(span0, span)); - - pointField newPoints0(mpm.pointMap().size()); - - forAll(newPoints0, pointI) - { - label oldPointI = mpm.pointMap()[pointI]; - - if (oldPointI >= 0) - { - label masterPointI = mpm.reversePointMap()[oldPointI]; - - if (masterPointI == pointI) - { - newPoints0[pointI] = points0_[oldPointI]; - } - else - { - // New point. Assume motion is scaling. - newPoints0[pointI] = points0_[oldPointI] + cmptMultiply - ( - scaleFactors, - points[pointI]-points[masterPointI] - ); - } - } - else - { - FatalErrorIn - ( - "displacementLaplacianFvMotionSolver::updateMesh" - "(const mapPolyMesh& mpm)" - ) << "Cannot work out coordinates of introduced vertices." - << " New vertex " << pointI << " at coordinate " - << points[pointI] << exit(FatalError); - } - } - points0_.transfer(newPoints0); -} - - // ************************************************************************* // diff --git a/src/fvMotionSolver/fvMotionSolvers/displacement/interpolation/displacementInterpolationFvMotionSolver.H b/src/fvMotionSolver/fvMotionSolvers/displacement/interpolation/displacementInterpolationFvMotionSolver.H index cd7438df06ac46f04697f5bbc0754f5a4ed43cda..d67886ac3c9c5f478343a7957718ca5720ea4775 100644 --- a/src/fvMotionSolver/fvMotionSolvers/displacement/interpolation/displacementInterpolationFvMotionSolver.H +++ b/src/fvMotionSolver/fvMotionSolvers/displacement/interpolation/displacementInterpolationFvMotionSolver.H @@ -48,7 +48,7 @@ SourceFiles #ifndef displacementInterpolationFvMotionSolver_H #define displacementInterpolationFvMotionSolver_H -#include "fvMotionSolver.H" +#include "displacementFvMotionSolver.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -61,13 +61,10 @@ namespace Foam class displacementInterpolationFvMotionSolver : - public fvMotionSolver + public displacementFvMotionSolver { // Private data - //- Reference point field - pointField points0_; - //- Additional settings for motion solver dictionary dynamicMeshCoeffs_; @@ -130,21 +127,12 @@ public: // Member Functions - //- Return reference to the reference field - const pointField& points0() const - { - return points0_; - } - //- Return point location obtained from the current motion field virtual tmp<pointField> curPoints() const; //- Solve for motion virtual void solve() {} - - //- Update topology - virtual void updateMesh(const mapPolyMesh&); }; diff --git a/src/fvMotionSolver/fvMotionSolvers/displacement/laplacian/displacementLaplacianFvMotionSolver.C b/src/fvMotionSolver/fvMotionSolvers/displacement/laplacian/displacementLaplacianFvMotionSolver.C index a979feebb3e8973906dcf7c3aa0c0d7bddbc3319..e57a17cce9baa0d341c724ce801832b1ea0717e2 100644 --- a/src/fvMotionSolver/fvMotionSolvers/displacement/laplacian/displacementLaplacianFvMotionSolver.C +++ b/src/fvMotionSolver/fvMotionSolvers/displacement/laplacian/displacementLaplacianFvMotionSolver.C @@ -53,26 +53,10 @@ namespace Foam Foam::displacementLaplacianFvMotionSolver::displacementLaplacianFvMotionSolver ( const polyMesh& mesh, - Istream& + Istream& is ) : - fvMotionSolver(mesh), - points0_ - ( - pointIOField - ( - IOobject - ( - "points", - time().constant(), - polyMesh::meshSubDir, - mesh, - IOobject::MUST_READ, - IOobject::NO_WRITE, - false - ) - ) - ), + displacementFvMotionSolver(mesh, is), pointDisplacement_ ( IOobject @@ -186,7 +170,7 @@ Foam::displacementLaplacianFvMotionSolver::curPoints() const } pointLocation_().internalField() = - points0_ + points0() + pointDisplacement_.internalField(); pointLocation_().correctBoundaryConditions(); @@ -198,7 +182,7 @@ Foam::displacementLaplacianFvMotionSolver::curPoints() const forAll(pz, i) { - pointLocation_()[pz[i]] = points0_[pz[i]]; + pointLocation_()[pz[i]] = points0()[pz[i]]; } } @@ -210,7 +194,7 @@ Foam::displacementLaplacianFvMotionSolver::curPoints() const { tmp<pointField> tcurPoints ( - points0_ + pointDisplacement_.internalField() + points0() + pointDisplacement_.internalField() ); // Implement frozen points @@ -220,7 +204,7 @@ Foam::displacementLaplacianFvMotionSolver::curPoints() const forAll(pz, i) { - tcurPoints()[pz[i]] = points0_[pz[i]]; + tcurPoints()[pz[i]] = points0()[pz[i]]; } } @@ -257,74 +241,7 @@ void Foam::displacementLaplacianFvMotionSolver::updateMesh const mapPolyMesh& mpm ) { - fvMotionSolver::updateMesh(mpm); - - // Map points0_. Bit special since we somehow have to come up with - // a sensible points0 position for introduced points. - // Find out scaling between points0 and current points - - // Get the new points either from the map or the mesh - const pointField& points = - ( - mpm.hasMotionPoints() - ? mpm.preMotionPoints() - : fvMesh_.points() - ); - - // Note: boundBox does reduce - const vector span0 = boundBox(points0_).span(); - const vector span = boundBox(points).span(); - - vector scaleFactors(cmptDivide(span0, span)); - - pointField newPoints0(mpm.pointMap().size()); - - forAll(newPoints0, pointI) - { - label oldPointI = mpm.pointMap()[pointI]; - - if (oldPointI >= 0) - { - label masterPointI = mpm.reversePointMap()[oldPointI]; - - if (masterPointI == pointI) - { - newPoints0[pointI] = points0_[oldPointI]; - } - else - { - // New point. Assume motion is scaling. - newPoints0[pointI] = points0_[oldPointI] + cmptMultiply - ( - scaleFactors, - points[pointI]-points[masterPointI] - ); - } - } - else - { - FatalErrorIn - ( - "displacementLaplacianFvMotionSolver::updateMesh" - "(const mapPolyMesh& mpm)" - ) << "Cannot work out coordinates of introduced vertices." - << " New vertex " << pointI << " at coordinate " - << points[pointI] << exit(FatalError); - } - } - points0_.transfer(newPoints0); - - if (debug & 2) - { - OFstream str(time().timePath()/"points0.obj"); - Pout<< "displacementLaplacianFvMotionSolver :" - << " Writing points0_ to " << str.name() << endl; - - forAll(points0_, pointI) - { - meshTools::writeOBJ(str, points0_[pointI]); - } - } + displacementFvMotionSolver::updateMesh(mpm); // Update diffusivity. Note two stage to make sure old one is de-registered // before creating/registering new one. diff --git a/src/fvMotionSolver/fvMotionSolvers/displacement/laplacian/displacementLaplacianFvMotionSolver.H b/src/fvMotionSolver/fvMotionSolvers/displacement/laplacian/displacementLaplacianFvMotionSolver.H index 67ed89c40fb29967e1023234e45af9705d059161..6ba0c01e320b2e4a7ceb41cda6d28bcabcc872d7 100644 --- a/src/fvMotionSolver/fvMotionSolvers/displacement/laplacian/displacementLaplacianFvMotionSolver.H +++ b/src/fvMotionSolver/fvMotionSolvers/displacement/laplacian/displacementLaplacianFvMotionSolver.H @@ -37,7 +37,7 @@ SourceFiles #ifndef displacementLaplacianFvMotionSolver_H #define displacementLaplacianFvMotionSolver_H -#include "fvMotionSolver.H" +#include "displacementFvMotionSolver.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -53,13 +53,10 @@ class motionDiffusivity; class displacementLaplacianFvMotionSolver : - public fvMotionSolver + public displacementFvMotionSolver { // Private data - //- Reference point field - pointField points0_; - //- Point motion field mutable pointVectorField pointDisplacement_; @@ -113,13 +110,6 @@ public: // Member Functions - - //- Return reference to the reference field - const pointField& points0() const - { - return points0_; - } - //- Return reference to the point motion displacement field pointVectorField& pointDisplacement() { diff --git a/src/fvMotionSolver/pointPatchFields/derived/surfaceSlipDisplacement/surfaceSlipDisplacementPointPatchVectorField.C b/src/fvMotionSolver/pointPatchFields/derived/surfaceSlipDisplacement/surfaceSlipDisplacementPointPatchVectorField.C index 68e0151f85e6b48c664a51a7fcc6dfa467ea73e4..8c310481d7c5ae20dfda44ff7e402437cf2f4b7a 100644 --- a/src/fvMotionSolver/pointPatchFields/derived/surfaceSlipDisplacement/surfaceSlipDisplacementPointPatchVectorField.C +++ b/src/fvMotionSolver/pointPatchFields/derived/surfaceSlipDisplacement/surfaceSlipDisplacementPointPatchVectorField.C @@ -29,7 +29,7 @@ License #include "Time.H" #include "transformField.H" #include "fvMesh.H" -#include "displacementLaplacianFvMotionSolver.H" +#include "displacementFvMotionSolver.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -52,129 +52,24 @@ const NamedEnum<surfaceSlipDisplacementPointPatchVectorField::followMode, 3> surfaceSlipDisplacementPointPatchVectorField::followModeNames_; -// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // - -surfaceSlipDisplacementPointPatchVectorField:: -surfaceSlipDisplacementPointPatchVectorField -( - const pointPatch& p, - const DimensionedField<vector, pointMesh>& iF -) -: - pointPatchVectorField(p, iF), - projectMode_(NEAREST), - projectDir_(vector::zero), - wedgePlane_(-1) -{} - - -surfaceSlipDisplacementPointPatchVectorField:: -surfaceSlipDisplacementPointPatchVectorField -( - const pointPatch& p, - const DimensionedField<vector, pointMesh>& iF, - const dictionary& dict -) -: - pointPatchVectorField(p, iF, dict), - surfacesDict_(dict.subDict("geometry")), - projectMode_(followModeNames_.read(dict.lookup("followMode"))), - projectDir_(dict.lookup("projectDirection")), - wedgePlane_(readLabel(dict.lookup("wedgePlane"))), - frozenPointsZone_(dict.lookup("frozenPointsZone")) -{} - - -surfaceSlipDisplacementPointPatchVectorField:: -surfaceSlipDisplacementPointPatchVectorField -( - const surfaceSlipDisplacementPointPatchVectorField& ppf, - const pointPatch& p, - const DimensionedField<vector, pointMesh>& iF, - const pointPatchFieldMapper& -) -: - pointPatchVectorField(p, iF), - surfacesDict_(ppf.surfacesDict()), - projectMode_(ppf.projectMode()), - projectDir_(ppf.projectDir()), - wedgePlane_(ppf.wedgePlane()), - frozenPointsZone_(ppf.frozenPointsZone()) -{} - - -surfaceSlipDisplacementPointPatchVectorField:: -surfaceSlipDisplacementPointPatchVectorField -( - const surfaceSlipDisplacementPointPatchVectorField& ppf -) -: - pointPatchVectorField(ppf), - surfacesDict_(ppf.surfacesDict()), - projectMode_(ppf.projectMode()), - projectDir_(ppf.projectDir()), - wedgePlane_(ppf.wedgePlane()), - frozenPointsZone_(ppf.frozenPointsZone()) -{} - - -surfaceSlipDisplacementPointPatchVectorField:: -surfaceSlipDisplacementPointPatchVectorField -( - const surfaceSlipDisplacementPointPatchVectorField& ppf, - const DimensionedField<vector, pointMesh>& iF -) -: - pointPatchVectorField(ppf, iF), - surfacesDict_(ppf.surfacesDict()), - projectMode_(ppf.projectMode()), - projectDir_(ppf.projectDir()), - wedgePlane_(ppf.wedgePlane()), - frozenPointsZone_(ppf.frozenPointsZone()) -{} - - -// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // - -const searchableSurfaces& -surfaceSlipDisplacementPointPatchVectorField::surfaces() const -{ - if (surfacesPtr_.empty()) - { - surfacesPtr_.reset - ( - new searchableSurfaces - ( - IOobject - ( - "abc", // dummy name - db().time().constant(), // directory - "triSurface", // instance - db().time(), // registry - IOobject::MUST_READ, - IOobject::NO_WRITE - ), - surfacesDict_ - ) - ); - } - return surfacesPtr_(); -} - +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // -void surfaceSlipDisplacementPointPatchVectorField::evaluate +void surfaceSlipDisplacementPointPatchVectorField::calcProjection ( - const Pstream::commsTypes commsType -) + vectorField& displacement +) const { const polyMesh& mesh = patch().boundaryMesh().mesh()(); + const pointField& localPoints = patch().localPoints(); + const labelList& meshPoints = patch().meshPoints(); - // const scalar deltaT = mesh.time().deltaT().value(); + //const scalar deltaT = mesh.time().deltaT().value(); // Construct large enough vector in direction of projectDir so // we're guaranteed to hit something. - const scalar projectLen = mesh.bounds().mag(); + //- Per point projection vector: + const scalar projectLen = mag(mesh.bounds().max()-mesh.bounds().min()); // For case of fixed projection vector: vector projectVec; @@ -184,18 +79,11 @@ void surfaceSlipDisplacementPointPatchVectorField::evaluate projectVec = projectLen*n; } - //- Per point projection vector: - - const pointField& localPoints = patch().localPoints(); - const labelList& meshPoints = patch().meshPoints(); - - vectorField displacement(this->patchInternalField()); - // Get fixed points (bit of a hack) const pointZone* zonePtr = NULL; - if (frozenPointsZone_.size()) + if (frozenPointsZone_.size() > 0) { const pointZoneMesh& pZones = mesh.pointZones(); @@ -207,23 +95,22 @@ void surfaceSlipDisplacementPointPatchVectorField::evaluate } // Get the starting locations from the motionSolver - const displacementLaplacianFvMotionSolver& motionSolver = - mesh.lookupObject<displacementLaplacianFvMotionSolver> + const displacementFvMotionSolver& motionSolver = + mesh.lookupObject<displacementFvMotionSolver> ( "dynamicMeshDict" ); const pointField& points0 = motionSolver.points0(); -//XXXXXX - - pointField start(meshPoints.size()); forAll(start, i) { start[i] = points0[meshPoints[i]] + displacement[i]; } + label nNotProjected = 0; + if (projectMode_ == NEAREST) { List<pointIndexHit> nearest; @@ -251,10 +138,15 @@ void surfaceSlipDisplacementPointPatchVectorField::evaluate } else { - Pout<< " point:" << meshPoints[i] - << " coord:" << localPoints[i] - << " did not find any surface within " << projectLen - << endl; + nNotProjected++; + + if (debug) + { + Pout<< " point:" << meshPoints[i] + << " coord:" << localPoints[i] + << " did not find any surface within " << projectLen + << endl; + } } } } @@ -307,7 +199,7 @@ void surfaceSlipDisplacementPointPatchVectorField::evaluate rightHit ); } - + List<pointIndexHit> leftHit; { labelList leftSurf; @@ -380,17 +272,154 @@ void surfaceSlipDisplacementPointPatchVectorField::evaluate } else { - Pout<< " point:" << meshPoints[i] - << " coord:" << localPoints[i] - << " did not find any intersection between ray from " - << start[i]-projectVecs[i] - << " to " << start[i]+projectVecs[i] - << endl; + nNotProjected++; + + if (debug) + { + Pout<< " point:" << meshPoints[i] + << " coord:" << localPoints[i] + << " did not find any intersection between" + << " ray from " << start[i]-projectVecs[i] + << " to " << start[i]+projectVecs[i] << endl; + } } } } } + reduce(nNotProjected, sumOp<label>()); + + if (nNotProjected > 0) + { + Info<< "surfaceSlipDisplacement :" + << " on patch " << patch().name() + << " did not project " << nNotProjected + << " out of " << returnReduce(localPoints.size(), sumOp<label>()) + << " points." << endl; + } +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +surfaceSlipDisplacementPointPatchVectorField:: +surfaceSlipDisplacementPointPatchVectorField +( + const pointPatch& p, + const DimensionedField<vector, pointMesh>& iF +) +: + pointPatchVectorField(p, iF), + projectMode_(NEAREST), + projectDir_(vector::zero), + wedgePlane_(-1) +{} + + +surfaceSlipDisplacementPointPatchVectorField:: +surfaceSlipDisplacementPointPatchVectorField +( + const pointPatch& p, + const DimensionedField<vector, pointMesh>& iF, + const dictionary& dict +) +: + pointPatchVectorField(p, iF, dict), + surfacesDict_(dict.subDict("geometry")), + projectMode_(followModeNames_.read(dict.lookup("followMode"))), + projectDir_(dict.lookup("projectDirection")), + wedgePlane_(readLabel(dict.lookup("wedgePlane"))), + frozenPointsZone_(dict.lookupOrDefault("frozenPointsZone", word::null)) +{} + + +surfaceSlipDisplacementPointPatchVectorField:: +surfaceSlipDisplacementPointPatchVectorField +( + const surfaceSlipDisplacementPointPatchVectorField& ppf, + const pointPatch& p, + const DimensionedField<vector, pointMesh>& iF, + const pointPatchFieldMapper& +) +: + pointPatchVectorField(p, iF), + surfacesDict_(ppf.surfacesDict()), + projectMode_(ppf.projectMode()), + projectDir_(ppf.projectDir()), + wedgePlane_(ppf.wedgePlane()), + frozenPointsZone_(ppf.frozenPointsZone()) +{} + + +surfaceSlipDisplacementPointPatchVectorField:: +surfaceSlipDisplacementPointPatchVectorField +( + const surfaceSlipDisplacementPointPatchVectorField& ppf +) +: + pointPatchVectorField(ppf), + surfacesDict_(ppf.surfacesDict()), + projectMode_(ppf.projectMode()), + projectDir_(ppf.projectDir()), + wedgePlane_(ppf.wedgePlane()), + frozenPointsZone_(ppf.frozenPointsZone()) +{} + + +surfaceSlipDisplacementPointPatchVectorField:: +surfaceSlipDisplacementPointPatchVectorField +( + const surfaceSlipDisplacementPointPatchVectorField& ppf, + const DimensionedField<vector, pointMesh>& iF +) +: + pointPatchVectorField(ppf, iF), + surfacesDict_(ppf.surfacesDict()), + projectMode_(ppf.projectMode()), + projectDir_(ppf.projectDir()), + wedgePlane_(ppf.wedgePlane()), + frozenPointsZone_(ppf.frozenPointsZone()) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +const searchableSurfaces& +surfaceSlipDisplacementPointPatchVectorField::surfaces() const +{ + if (surfacesPtr_.empty()) + { + surfacesPtr_.reset + ( + new searchableSurfaces + ( + IOobject + ( + "abc", // dummy name + db().time().constant(), // directory + "triSurface", // instance + db().time(), // registry + IOobject::MUST_READ, + IOobject::NO_WRITE + ), + surfacesDict_ + ) + ); + } + return surfacesPtr_(); +} + + +void surfaceSlipDisplacementPointPatchVectorField::evaluate +( + const Pstream::commsTypes commsType +) +{ + vectorField displacement(this->patchInternalField()); + + // Calculate displacement to project points onto surface + calcProjection(displacement); + // Get internal field to insert values into Field<vector>& iF = const_cast<Field<vector>&>(this->internalField()); @@ -412,8 +441,11 @@ void surfaceSlipDisplacementPointPatchVectorField::write(Ostream& os) const << token::END_STATEMENT << nl; os.writeKeyword("wedgePlane") << wedgePlane_ << token::END_STATEMENT << nl; - os.writeKeyword("frozenPointsZone") << frozenPointsZone_ - << token::END_STATEMENT << nl; + if (frozenPointsZone_ != word::null) + { + os.writeKeyword("frozenPointsZone") << frozenPointsZone_ + << token::END_STATEMENT << nl; + } } diff --git a/src/fvMotionSolver/pointPatchFields/derived/surfaceSlipDisplacement/surfaceSlipDisplacementPointPatchVectorField.H b/src/fvMotionSolver/pointPatchFields/derived/surfaceSlipDisplacement/surfaceSlipDisplacementPointPatchVectorField.H index d74ca862e2df53112db5daa3eed9ec9319fc134a..9edb42ac0d8764334c014267bbdbb327bb808596 100644 --- a/src/fvMotionSolver/pointPatchFields/derived/surfaceSlipDisplacement/surfaceSlipDisplacementPointPatchVectorField.H +++ b/src/fvMotionSolver/pointPatchFields/derived/surfaceSlipDisplacement/surfaceSlipDisplacementPointPatchVectorField.H @@ -107,6 +107,9 @@ private: // Private Member Functions + //- Calculate displacement to project onto surface + void calcProjection(vectorField& displacement) const; + //- Disallow default bitwise assignment void operator=(const surfaceSlipDisplacementPointPatchVectorField&); diff --git a/src/meshTools/indexedOctree/indexedOctree.C b/src/meshTools/indexedOctree/indexedOctree.C index 9b065c36ac7f686cc39fd421a3015c93b4c360e2..2131c3aaf6ef936fcf18bbe8f4cc39ffcdde93c5 100644 --- a/src/meshTools/indexedOctree/indexedOctree.C +++ b/src/meshTools/indexedOctree/indexedOctree.C @@ -824,8 +824,10 @@ Foam::direction Foam::indexedOctree<Type>::getFace } -// Traverse a node. If intersects a triangle return first intersection point. -// Else return the bounxing box face hit: +// Traverse a node. If intersects a triangle return first intersection point: +// hitInfo.index = index of shape +// hitInfo.point = point on shape +// Else return a miss and the bounding box face hit: // hitInfo.point = coordinate of intersection of ray with bounding box // faceID = index of bounding box face template <class Type> @@ -918,10 +920,10 @@ void Foam::indexedOctree<Type>::traverseNode { faceID = 0; - WarningIn("indexedOctree<Type>::traverseNode") + FatalErrorIn("indexedOctree<Type>::traverseNode(..)") << "Did not hit side of box " << subBb << " with ray from " << start << " to " << end - << endl; + << abort(FatalError); } else { @@ -936,10 +938,10 @@ void Foam::indexedOctree<Type>::traverseNode { faceID = 0; - WarningIn("indexedOctree<Type>::traverseNode") + FatalErrorIn("indexedOctree<Type>::traverseNode(..)") << "Did not hit side of box " << subBb << " with ray from " << start << " to " << end - << endl; + << abort(FatalError); } else { diff --git a/src/sampling/probes/probes.C b/src/sampling/probes/probes.C index 91c588c6d3ef1128ca0d7f47325f092cd027c0a8..5a6686aad04b6c7a5e17169f42bdcd91a92e3360 100644 --- a/src/sampling/probes/probes.C +++ b/src/sampling/probes/probes.C @@ -182,15 +182,24 @@ bool Foam::probes::checkFieldTypes() if (Pstream::master()) { fileName probeDir; + + fileName probeSubDir = name_; + + if (obr_.name() != polyMesh::defaultRegion) + { + probeSubDir = probeSubDir/obr_.name(); + } + probeSubDir = probeSubDir/obr_.time().timeName(); + if (Pstream::parRun()) { // Put in undecomposed case // (Note: gives problems for distributed data running) - probeDir = obr_.time().path()/".."/name_/obr_.time().timeName(); + probeDir = obr_.time().path()/".."/probeSubDir; } else { - probeDir = obr_.time().path()/name_/obr_.time().timeName(); + probeDir = obr_.time().path()/probeSubDir; } // Close the file if any fields have been removed. diff --git a/src/sampling/sampledSurface/isoSurface/isoSurface.H b/src/sampling/sampledSurface/isoSurface/isoSurface.H index dbe8ae85018d68494e22b4bd53329c4dc6d445b2..3ab45629d1004c0d0fabc618a4ae7f33a6cf1d00 100644 --- a/src/sampling/sampledSurface/isoSurface/isoSurface.H +++ b/src/sampling/sampledSurface/isoSurface/isoSurface.H @@ -439,8 +439,8 @@ public: return triPointMergeMap_; } - //- Interpolates cCoords,pCoords. Takes the original fields - // used to create the iso surface. + //- Interpolates cCoords,pCoords. Uses the references to the original + // fields used to create the iso surface. template <class Type> tmp<Field<Type> > interpolate ( diff --git a/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.C b/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.C index 017117370d1979ab8b5cc9ce0b712a378ac9a6dd..c2f32da1b6b37dcf300486475bcba68980975cb5 100644 --- a/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.C +++ b/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.C @@ -153,6 +153,16 @@ void Foam::sampledIsoSurface::getIsoFields() const } } + + // If averaging redo the volField. Can only be done now since needs the + // point field. + if (average_) + { + storedVolFieldPtr_.reset(average(fvm, *pointFieldPtr_).ptr()); + volFieldPtr_ = storedVolFieldPtr_.operator->(); + } + + if (debug) { Info<< "sampledIsoSurface::getIsoField() : volField " @@ -241,6 +251,20 @@ void Foam::sampledIsoSurface::getIsoFields() const pointSubFieldPtr_ = storedPointSubFieldPtr_.operator->(); } + + + // If averaging redo the volField. Can only be done now since needs the + // point field. + if (average_) + { + storedVolSubFieldPtr_.reset + ( + average(subFvm, *pointSubFieldPtr_).ptr() + ); + volSubFieldPtr_ = storedVolSubFieldPtr_.operator->(); + } + + if (debug) { Info<< "sampledIsoSurface::getIsoField() : volSubField " @@ -394,68 +418,33 @@ bool Foam::sampledIsoSurface::updateGeometry() const surfPtr_.clear(); facesPtr_.clear(); - if (average_) + if (subMeshPtr_.valid()) { - if (subMeshPtr_.valid()) - { - surfPtr_.reset - ( - new isoSurface - ( - average(subMeshPtr_().subMesh(), *pointSubFieldPtr_), - *pointSubFieldPtr_, - isoVal_, - regularise_, - mergeTol_ - ) - ); - } - else - { - surfPtr_.reset + surfPtr_.reset + ( + new isoSurface ( - new isoSurface - ( - average(fvm, *pointFieldPtr_), - *pointFieldPtr_, - isoVal_, - regularise_, - mergeTol_ - ) - ); - } + *volSubFieldPtr_, + *pointSubFieldPtr_, + isoVal_, + regularise_, + mergeTol_ + ) + ); } else { - if (subMeshPtr_.valid()) - { - surfPtr_.reset - ( - new isoSurface - ( - *volSubFieldPtr_, - *pointSubFieldPtr_, - isoVal_, - regularise_, - mergeTol_ - ) - ); - } - else - { - surfPtr_.reset + surfPtr_.reset + ( + new isoSurface ( - new isoSurface - ( - *volFieldPtr_, - *pointFieldPtr_, - //average(pointMesh::New(mesh()), *volFieldPtr_), - isoVal_, - regularise_, - mergeTol_ - ) - ); - } + *volFieldPtr_, + *pointFieldPtr_, + isoVal_, + regularise_, + mergeTol_ + ) + ); } diff --git a/src/thermophysicalModels/radiation/Make/files b/src/thermophysicalModels/radiation/Make/files index 9b385e8a5675a2cb704020f20a6d9649f1a840e8..4e7fb1b11cbaab0879b316bb76a2bde95eb4fa0d 100644 --- a/src/thermophysicalModels/radiation/Make/files +++ b/src/thermophysicalModels/radiation/Make/files @@ -1,13 +1,15 @@ /* Radiation constants */ radiationConstants/radiationConstants.C - /* Radiation model */ radiationModel/radiationModel/radiationModel.C radiationModel/radiationModel/newRadiationModel.C radiationModel/noRadiation/noRadiation.C radiationModel/P1/P1.C - +radiationModel/fvDOM/fvDOM/fvDOM.C +radiationModel/fvDOM/radiativeIntensityRay/radiativeIntensityRay.C +radiationModel/fvDOM/blackBodyEmission/blackBodyEmission.C +radiationModel/fvDOM/absorptionCoeffs/absorptionCoeffs.C /* Scatter model */ submodels/scatterModel/scatterModel/scatterModel.C @@ -21,11 +23,14 @@ submodels/absorptionEmissionModel/absorptionEmissionModel/newAbsorptionEmissionM submodels/absorptionEmissionModel/noAbsorptionEmission/noAbsorptionEmission.C submodels/absorptionEmissionModel/constantAbsorptionEmission/constantAbsorptionEmission.C submodels/absorptionEmissionModel/binaryAbsorptionEmission/binaryAbsorptionEmission.C +submodels/absorptionEmissionModel/greyMeanAbsorptionEmission/greyMeanAbsorptionEmission.C +submodels/absorptionEmissionModel/wideBandAbsorptionEmission/wideBandAbsorptionEmission.C /* Boundary conditions */ derivedFvPatchFields/MarshakRadiation/MarshakRadiationMixedFvPatchScalarField.C derivedFvPatchFields/MarshakRadiationFixedT/MarshakRadiationFixedTMixedFvPatchScalarField.C - +derivedFvPatchFields/greyDiffusiveRadiation/greyDiffusiveRadiationMixedFvPatchScalarField.C +derivedFvPatchFields/wideBandDiffusiveRadiation/wideBandDiffusiveRadiationMixedFvPatchScalarField.C LIB = $(FOAM_LIBBIN)/libradiation diff --git a/src/thermophysicalModels/radiation/Make/options b/src/thermophysicalModels/radiation/Make/options index 31643f8150d84cd09d3ad0af0b22eb84303a4ba8..98956f2b6dbcf83ff7d0dcd2b20a2c9783c225af 100644 --- a/src/thermophysicalModels/radiation/Make/options +++ b/src/thermophysicalModels/radiation/Make/options @@ -1,6 +1,9 @@ EXE_INC = \ -I$(LIB_SRC)/finiteVolume/lnInclude \ - -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude + -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \ + -I$(LIB_SRC)/thermophysicalModels/combustion/lnInclude \ + -I$(LIB_SRC)/OpenFOAM/lnInclude \ + -I radiationModel/fvDOM/interpolationLookUpTable LIB_LIBS = \ -lfiniteVolume diff --git a/src/thermophysicalModels/radiation/derivedFvPatchFields/greyDiffusiveRadiation/greyDiffusiveRadiationMixedFvPatchScalarField.C b/src/thermophysicalModels/radiation/derivedFvPatchFields/greyDiffusiveRadiation/greyDiffusiveRadiationMixedFvPatchScalarField.C new file mode 100644 index 0000000000000000000000000000000000000000..e7daa58aaf1c209ec0d69d5e2bf43a8438a6da98 --- /dev/null +++ b/src/thermophysicalModels/radiation/derivedFvPatchFields/greyDiffusiveRadiation/greyDiffusiveRadiationMixedFvPatchScalarField.C @@ -0,0 +1,273 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +\*---------------------------------------------------------------------------*/ + +#include "greyDiffusiveRadiationMixedFvPatchScalarField.H" +#include "addToRunTimeSelectionTable.H" +#include "fvPatchFieldMapper.H" +#include "volFields.H" + +#include "fvDOM.H" +#include "radiationConstants.H" +#include "mathematicalConstants.H" + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::radiation::greyDiffusiveRadiationMixedFvPatchScalarField:: +greyDiffusiveRadiationMixedFvPatchScalarField +( + const fvPatch& p, + const DimensionedField<scalar, volMesh>& iF +) +: + mixedFvPatchScalarField(p, iF), + TName_("undefinedT"), + emissivity_(0.0), + rayId_(0), + lambdaId_(0) +{ + refValue() = 0.0; + refGrad() = 0.0; + valueFraction() = 1.0; +} + + +Foam::radiation::greyDiffusiveRadiationMixedFvPatchScalarField:: +greyDiffusiveRadiationMixedFvPatchScalarField +( + const greyDiffusiveRadiationMixedFvPatchScalarField& ptf, + const fvPatch& p, + const DimensionedField<scalar, volMesh>& iF, + const fvPatchFieldMapper& mapper +) +: + mixedFvPatchScalarField(ptf, p, iF, mapper), + TName_(ptf.TName_), + emissivity_(ptf.emissivity_), + rayId_(ptf.rayId_), + lambdaId_(ptf.lambdaId_) +{} + + +Foam::radiation::greyDiffusiveRadiationMixedFvPatchScalarField:: +greyDiffusiveRadiationMixedFvPatchScalarField +( + const fvPatch& p, + const DimensionedField<scalar, volMesh>& iF, + const dictionary& dict +) +: + mixedFvPatchScalarField(p, iF), + TName_(dict.lookup("T")), + emissivity_(readScalar(dict.lookup("emissivity"))), + rayId_(-1), + lambdaId_(-1) +{ + const scalarField& Tp = + patch().lookupPatchField<volScalarField, scalar>(TName_); + + refValue() = + emissivity_*4.0*radiation::sigmaSB.value()*pow4(Tp) + /Foam::mathematicalConstant::pi; + + refGrad() = 0.0; + + if (dict.found("value")) + { + fvPatchScalarField::operator= + ( + scalarField("value", dict, p.size()) + ); + } + else + { + fvPatchScalarField::operator=(refValue()); + } +} + + +Foam::radiation::greyDiffusiveRadiationMixedFvPatchScalarField:: +greyDiffusiveRadiationMixedFvPatchScalarField +( + const greyDiffusiveRadiationMixedFvPatchScalarField& ptf +) +: + mixedFvPatchScalarField(ptf), + TName_(ptf.TName_), + emissivity_(ptf.emissivity_), + rayId_(ptf.rayId_), + lambdaId_(ptf.lambdaId_) +{} + + +Foam::radiation::greyDiffusiveRadiationMixedFvPatchScalarField:: +greyDiffusiveRadiationMixedFvPatchScalarField +( + const greyDiffusiveRadiationMixedFvPatchScalarField& ptf, + const DimensionedField<scalar, volMesh>& iF +) +: + mixedFvPatchScalarField(ptf, iF), + TName_(ptf.TName_), + emissivity_(ptf.emissivity_), + rayId_(ptf.rayId_), + lambdaId_(ptf.lambdaId_) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::radiation::greyDiffusiveRadiationMixedFvPatchScalarField:: +updateCoeffs() +{ + if (this->updated()) + { + return; + } + + const scalarField& Tp = + patch().lookupPatchField<volScalarField, scalar>(TName_); + + const fvDOM& dom = db().lookupObject<fvDOM>("radiationProperties"); + + const label patchI = patch().index(); + + if (dom.nLambda() == 1) + { + if (rayId_ == -1) + { + for (label rayI=0; rayI < dom.nRay(); rayI++) + { + for (label lambdaI=0; lambdaI < dom.nLambda(); lambdaI++) + { + const volScalarField& radiationField = + dom.IRayLambda(rayI, lambdaI); + if + ( + &(radiationField.internalField()) + == &dimensionedInternalField() + ) + { + rayId_ = rayI; + lambdaId_ = lambdaI; + break; + } + } + } + } + } + else + { + FatalErrorIn + ( + "Foam::radiation::" + "greyDiffusiveRadiationMixedFvPatchScalarField::" + "updateCoeffs" + ) << " a grey boundary condition is used with a non-grey" + << "absorption model" + << exit(FatalError); + } + + scalarField& Iw = *this; + vectorField n = patch().Sf()/patch().magSf(); + + radiativeIntensityRay& ray = + const_cast<radiativeIntensityRay&>(dom.IRay(rayId_)); + + ray.Qr().boundaryField()[patchI] += Iw*(-n & ray.dAve()); + + forAll(Iw, faceI) + { + scalar Ir = 0.0; + + for (label rayI=0; rayI < dom.nRay(); rayI++) + { + const vector& d = dom.IRay(rayI).d(); + + const scalarField& Iface = + dom.IRay(rayI).ILambda(lambdaId_).boundaryField()[patchI]; + + if ((-n[faceI] & d) < 0.0) // qin into the wall + { + const vector& dAve = dom.IRay(rayI).dAve(); + Ir += Iface[faceI]*mag(n[faceI] & dAve); + } + } + + const vector& d = dom.IRay(rayId_).d(); + + if ((-n[faceI] & d) > 0.) //direction out of the wall + { + refGrad()[faceI] = 0.0; + valueFraction()[faceI] = 1.0; + refValue()[faceI] = + ( + Ir*(1.0 - emissivity_) + + emissivity_*radiation::sigmaSB.value()*pow4(Tp[faceI]) + ) + /mathematicalConstant::pi; + + } + else //direction into the wall + { + valueFraction()[faceI] = 0.0; + refGrad()[faceI] = 0.0; + refValue()[faceI] = 0.0; //not used + } + } + + mixedFvPatchScalarField::updateCoeffs(); +} + + +void Foam::radiation::greyDiffusiveRadiationMixedFvPatchScalarField::write +( + Ostream& os +) const +{ + fvPatchScalarField::write(os); + os.writeKeyword("T") << TName_ << token::END_STATEMENT << nl; + os.writeKeyword("emissivity") << emissivity_ << token::END_STATEMENT << nl; + writeEntry("value", os); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace radiation +{ + makePatchTypeField + ( + fvPatchScalarField, + greyDiffusiveRadiationMixedFvPatchScalarField + ); +} +} + + +// ************************************************************************* // diff --git a/src/thermophysicalModels/radiation/derivedFvPatchFields/greyDiffusiveRadiation/greyDiffusiveRadiationMixedFvPatchScalarField.H b/src/thermophysicalModels/radiation/derivedFvPatchFields/greyDiffusiveRadiation/greyDiffusiveRadiationMixedFvPatchScalarField.H new file mode 100644 index 0000000000000000000000000000000000000000..f236f8be15078e743f171a63eee36b48b74d1961 --- /dev/null +++ b/src/thermophysicalModels/radiation/derivedFvPatchFields/greyDiffusiveRadiation/greyDiffusiveRadiationMixedFvPatchScalarField.H @@ -0,0 +1,190 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Class + Foam::greyDiffusiveRadiationMixedFvPatchScalarField + +Description + Radiation temperature specified + +SourceFiles + greyDiffusiveRadiationMixedFvPatchScalarField.C + +\*---------------------------------------------------------------------------*/ + +#ifndef greyDiffusiveRadiationMixedFvPatchScalarField_H +#define greyDiffusiveRadiationMixedFvPatchScalarField_H + +#include "mixedFvPatchFields.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace radiation +{ +/*---------------------------------------------------------------------------*\ + Class greyDiffusiveRadiationMixedFvPatchScalarField Declaration +\*---------------------------------------------------------------------------*/ + +class greyDiffusiveRadiationMixedFvPatchScalarField +: + public mixedFvPatchScalarField +{ + // Private data + + //- Name of temperature field + word TName_; + + //- Emissivity + scalar emissivity_; + + //- Ray index + label rayId_; + + //- Wavelength index + label lambdaId_; + + +public: + + //- Runtime type information + TypeName("greyDiffusiveRadiation"); + + + // Constructors + + //- Construct from patch and internal field + greyDiffusiveRadiationMixedFvPatchScalarField + ( + const fvPatch&, + const DimensionedField<scalar, volMesh>& + ); + + //- Construct from patch, internal field and dictionary + greyDiffusiveRadiationMixedFvPatchScalarField + ( + const fvPatch&, + const DimensionedField<scalar, volMesh>&, + const dictionary& + ); + + //- Construct by mapping given a + // greyDiffusiveRadiationMixedFvPatchScalarField onto a new patch + greyDiffusiveRadiationMixedFvPatchScalarField + ( + const greyDiffusiveRadiationMixedFvPatchScalarField&, + const fvPatch&, + const DimensionedField<scalar, volMesh>&, + const fvPatchFieldMapper& + ); + + //- Construct as copy + greyDiffusiveRadiationMixedFvPatchScalarField + ( + const greyDiffusiveRadiationMixedFvPatchScalarField& + ); + + //- Construct and return a clone + virtual tmp<fvPatchScalarField> clone() const + { + return tmp<fvPatchScalarField> + ( + new greyDiffusiveRadiationMixedFvPatchScalarField(*this) + ); + } + + //- Construct as copy setting internal field reference + greyDiffusiveRadiationMixedFvPatchScalarField + ( + const greyDiffusiveRadiationMixedFvPatchScalarField&, + const DimensionedField<scalar, volMesh>& + ); + + //- Construct and return a clone setting internal field reference + virtual tmp<fvPatchScalarField> clone + ( + const DimensionedField<scalar, volMesh>& iF + ) const + { + return tmp<fvPatchScalarField> + ( + new greyDiffusiveRadiationMixedFvPatchScalarField(*this, iF) + ); + } + + + // Member functions + + // Access + + //- Return the temperature field name + const word& TName() const + { + return TName_; + } + + //- Return reference to the temperature field name to allow + // adjustment + word& TName() + { + return TName_; + } + + //- Return the emissivity + const scalar& emissivity() const + { + return emissivity_; + } + + //- Return reference to the emissivity to allow adjustment + scalar& emissivity() + { + return emissivity_; + } + + + // Evaluation functions + + //- Update the coefficients associated with the patch field + virtual void updateCoeffs(); + + + // I-O + + //- Write + virtual void write(Ostream&) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/thermophysicalModels/radiation/derivedFvPatchFields/wideBandDiffusiveRadiation/wideBandDiffusiveRadiationMixedFvPatchScalarField.C b/src/thermophysicalModels/radiation/derivedFvPatchFields/wideBandDiffusiveRadiation/wideBandDiffusiveRadiationMixedFvPatchScalarField.C new file mode 100644 index 0000000000000000000000000000000000000000..eb65337acabf0b09cfda0fa0229ec0339fa52302 --- /dev/null +++ b/src/thermophysicalModels/radiation/derivedFvPatchFields/wideBandDiffusiveRadiation/wideBandDiffusiveRadiationMixedFvPatchScalarField.C @@ -0,0 +1,269 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +\*---------------------------------------------------------------------------*/ + +#include "wideBandDiffusiveRadiationMixedFvPatchScalarField.H" +#include "addToRunTimeSelectionTable.H" +#include "fvPatchFieldMapper.H" +#include "volFields.H" + +#include "fvDOM.H" +#include "wideBandAbsorptionEmission.H" +#include "radiationConstants.H" +#include "mathematicalConstants.H" + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::radiation::wideBandDiffusiveRadiationMixedFvPatchScalarField:: +wideBandDiffusiveRadiationMixedFvPatchScalarField +( + const fvPatch& p, + const DimensionedField<scalar, volMesh>& iF +) +: + mixedFvPatchScalarField(p, iF), + TName_("undefinedT"), + emissivity_(0.0), + rayId_(0), + lambdaId_(0) +{ + refValue() = 0.0; + refGrad() = 0.0; + valueFraction() = 1.0; +} + + +Foam::radiation::wideBandDiffusiveRadiationMixedFvPatchScalarField:: +wideBandDiffusiveRadiationMixedFvPatchScalarField +( + const wideBandDiffusiveRadiationMixedFvPatchScalarField& ptf, + const fvPatch& p, + const DimensionedField<scalar, volMesh>& iF, + const fvPatchFieldMapper& mapper +) +: + mixedFvPatchScalarField(ptf, p, iF, mapper), + TName_(ptf.TName_), + emissivity_(ptf.emissivity_), + rayId_(ptf.rayId_), + lambdaId_(ptf.lambdaId_) +{} + + +Foam::radiation::wideBandDiffusiveRadiationMixedFvPatchScalarField:: +wideBandDiffusiveRadiationMixedFvPatchScalarField +( + const fvPatch& p, + const DimensionedField<scalar, volMesh>& iF, + const dictionary& dict +) +: + mixedFvPatchScalarField(p, iF), + TName_(dict.lookup("T")), + emissivity_(readScalar(dict.lookup("emissivity"))), + rayId_(0), + lambdaId_(0) +{ + const scalarField& Tp = + patch().lookupPatchField<volScalarField, scalar>(TName_); + + refValue() = + emissivity_*4.0*radiation::sigmaSB.value()*pow4(Tp) + /Foam::mathematicalConstant::pi; + refGrad() = 0.0; + + if (dict.found("value")) + { + fvPatchScalarField::operator= + ( + scalarField("value", dict, p.size()) + ); + } + else + { + fvPatchScalarField::operator=(refValue()); + } +} + + +Foam::radiation::wideBandDiffusiveRadiationMixedFvPatchScalarField:: +wideBandDiffusiveRadiationMixedFvPatchScalarField +( + const wideBandDiffusiveRadiationMixedFvPatchScalarField& ptf +) +: + mixedFvPatchScalarField(ptf), + TName_(ptf.TName_), + emissivity_(ptf.emissivity_), + rayId_(ptf.rayId_), + lambdaId_(ptf.lambdaId_) +{} + + +Foam::radiation::wideBandDiffusiveRadiationMixedFvPatchScalarField:: +wideBandDiffusiveRadiationMixedFvPatchScalarField +( + const wideBandDiffusiveRadiationMixedFvPatchScalarField& ptf, + const DimensionedField<scalar, volMesh>& iF +) +: + mixedFvPatchScalarField(ptf, iF), + TName_(ptf.TName_), + emissivity_(ptf.emissivity_), + rayId_(ptf.rayId_), + lambdaId_(ptf.lambdaId_) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::radiation::wideBandDiffusiveRadiationMixedFvPatchScalarField:: +updateCoeffs() +{ + if (this->updated()) + { + return; + } + + const fvDOM& dom = db().lookupObject<fvDOM>("radiationProperties"); + + const label patchI = patch().index(); + + if (dom.nLambda() > 1) + { + if (rayId_ == -1) + { + for (label rayI=0; rayI < dom.nRay(); rayI++) + { + for (label lambdaI=0; lambdaI < dom.nLambda(); lambdaI++) + { + const volScalarField& radiationField = + dom.IRayLambda(rayI, lambdaI); + if + ( + &(radiationField.internalField()) + ==&dimensionedInternalField() + ) + { + rayId_ = rayI; + lambdaId_ = lambdaI; + break; + } + } + } + } + } + else + { + FatalErrorIn + ( + "Foam::radiation::" + "wideBandDiffusiveRadiationMixedFvPatchScalarField::" + "updateCoeffs" + ) << " a Non-grey boundary condition is used with a grey" + << "absorption model" << nl << exit(FatalError); + } + + scalarField& Iw = *this; + vectorField n = patch().Sf()/patch().magSf(); + + radiativeIntensityRay& ray = + const_cast<radiativeIntensityRay&>(dom.IRay(rayId_)); + + ray.Qr().boundaryField()[patchI] += Iw*(-n & ray.dAve()); + + const scalarField Eb = + dom.blackBody().bLambda(lambdaId_).boundaryField()[patchI]; + + forAll(Iw, faceI) + { + scalar Ir = 0.0; + for (label rayI=0; rayI < dom.nRay(); rayI++) + { + const vector& d = dom.IRay(rayI).d(); + + const scalarField& Iface = + dom.IRay(rayI).ILambda(lambdaId_).boundaryField()[patchI]; + + if ((-n[faceI] & d) < 0.0) // qin into the wall + { + const vector& dAve = dom.IRay(rayI).dAve(); + Ir = Ir + Iface[faceI]*mag(n[faceI] & dAve); + } + } + + const vector& d = dom.IRay(rayId_).d(); + + if ((-n[faceI] & d) > 0.0) //direction out of the wall + { + refGrad()[faceI] = 0.0; + valueFraction()[faceI] = 1.0; + refValue()[faceI] = + ( + Ir*(1.0 - emissivity_) + + emissivity_*Eb[faceI] + ) + /mathematicalConstant::pi; + } + else //direction into the wall + { + valueFraction()[faceI] = 0.0; + refGrad()[faceI] = 0.0; + refValue()[faceI] = 0.0; //not used + } + } + + mixedFvPatchScalarField::updateCoeffs(); +} + + +void Foam::radiation::wideBandDiffusiveRadiationMixedFvPatchScalarField::write +( + Ostream& os +) const +{ + fvPatchScalarField::write(os); + os.writeKeyword("T") << TName_ << token::END_STATEMENT << nl; + os.writeKeyword("emissivity") << emissivity_ << token::END_STATEMENT << nl; + writeEntry("value", os); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace radiation +{ + makePatchTypeField + ( + fvPatchScalarField, + wideBandDiffusiveRadiationMixedFvPatchScalarField + ); +} +} + + +// ************************************************************************* // diff --git a/src/thermophysicalModels/radiation/derivedFvPatchFields/wideBandDiffusiveRadiation/wideBandDiffusiveRadiationMixedFvPatchScalarField.H b/src/thermophysicalModels/radiation/derivedFvPatchFields/wideBandDiffusiveRadiation/wideBandDiffusiveRadiationMixedFvPatchScalarField.H new file mode 100644 index 0000000000000000000000000000000000000000..3ff3990786563d87bfbb26f1625935e09587769c --- /dev/null +++ b/src/thermophysicalModels/radiation/derivedFvPatchFields/wideBandDiffusiveRadiation/wideBandDiffusiveRadiationMixedFvPatchScalarField.H @@ -0,0 +1,193 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Class + Foam::wideBandDiffusiveRadiationMixedFvPatchScalarField + +Description + Radiation temperature specified + +SourceFiles + wideBandDiffusiveRadiationMixedFvPatchScalarField.C + +\*---------------------------------------------------------------------------*/ + +#ifndef wideBandDiffusiveRadiationMixedFvPatchScalarField_H +#define wideBandDiffusiveRadiationMixedFvPatchScalarField_H + +#include "mixedFvPatchFields.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace radiation +{ +/*---------------------------------------------------------------------------*\ + Class wideBandDiffusiveRadiationMixedFvPatchScalarField Declaration +\*---------------------------------------------------------------------------*/ + +class wideBandDiffusiveRadiationMixedFvPatchScalarField +: + public mixedFvPatchScalarField +{ + // Private data + + //- Name of temperature field + word TName_; + + //- Emissivity + scalar emissivity_; + + //- Ray index + label rayId_; + + //- Wavelength index + label lambdaId_; + + //- Radiative heat flux on walls. + scalarField qr_; + + +public: + + //- Runtime type information + TypeName("wideBandDiffusiveRadiation"); + + + // Constructors + + //- Construct from patch and internal field + wideBandDiffusiveRadiationMixedFvPatchScalarField + ( + const fvPatch&, + const DimensionedField<scalar, volMesh>& + ); + + //- Construct from patch, internal field and dictionary + wideBandDiffusiveRadiationMixedFvPatchScalarField + ( + const fvPatch&, + const DimensionedField<scalar, volMesh>&, + const dictionary& + ); + + //- Construct by mapping given GreyDiffusiveRadiationMixedFvPatchField + // onto a new patch + wideBandDiffusiveRadiationMixedFvPatchScalarField + ( + const wideBandDiffusiveRadiationMixedFvPatchScalarField&, + const fvPatch&, + const DimensionedField<scalar, volMesh>&, + const fvPatchFieldMapper& + ); + + //- Construct as copy + wideBandDiffusiveRadiationMixedFvPatchScalarField + ( + const wideBandDiffusiveRadiationMixedFvPatchScalarField& + ); + + //- Construct and return a clone + virtual tmp<fvPatchScalarField> clone() const + { + return tmp<fvPatchScalarField> + ( + new wideBandDiffusiveRadiationMixedFvPatchScalarField(*this) + ); + } + + //- Construct as copy setting internal field reference + wideBandDiffusiveRadiationMixedFvPatchScalarField + ( + const wideBandDiffusiveRadiationMixedFvPatchScalarField&, + const DimensionedField<scalar, volMesh>& + ); + + //- Construct and return a clone setting internal field reference + virtual tmp<fvPatchScalarField> clone + ( + const DimensionedField<scalar, volMesh>& iF + ) const + { + return tmp<fvPatchScalarField> + ( + new wideBandDiffusiveRadiationMixedFvPatchScalarField(*this, iF) + ); + } + + + // Member functions + + // Access + + //- Return the temperature field name + const word& TName() const + { + return TName_; + } + + //- Return reference to the temperature field name to allow + // adjustment + word& TName() + { + return TName_; + } + + //- Return the emissivity + const scalar& emissivity() const + { + return emissivity_; + } + + //- Return reference to the emissivity to allow adjustment + scalar& emissivity() + { + return emissivity_; + } + + + // Evaluation functions + + //- Update the coefficients associated with the patch field + virtual void updateCoeffs(); + + + // I-O + + //- Write + virtual void write(Ostream&) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/thermophysicalModels/radiation/radiationModel/P1/P1.C b/src/thermophysicalModels/radiation/radiationModel/P1/P1.C index 8679ac2861eafd5ecd7a794a25fea4f6516ed5ce..dee96292927b8c0032fd5ab2400cfb77c1b78611 100644 --- a/src/thermophysicalModels/radiation/radiationModel/P1/P1.C +++ b/src/thermophysicalModels/radiation/radiationModel/P1/P1.C @@ -50,9 +50,9 @@ namespace Foam } } + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // -// Construct from components Foam::radiation::P1::P1(const volScalarField& T) : radiationModel(typeName, T), @@ -133,12 +133,8 @@ bool Foam::radiation::P1::read() } -void Foam::radiation::P1::correct() +void Foam::radiation::P1::calculate() { - if (!radiation_) - { - return; - } a_ = absorptionEmission_->a(); e_ = absorptionEmission_->e(); E_ = absorptionEmission_->E(); diff --git a/src/thermophysicalModels/radiation/radiationModel/P1/P1.H b/src/thermophysicalModels/radiation/radiationModel/P1/P1.H index 7215664cf7b95e8e3104e68223874011022adb12..c0249e28dbd592828a21fc78e18a2d4a501bd1eb 100644 --- a/src/thermophysicalModels/radiation/radiationModel/P1/P1.H +++ b/src/thermophysicalModels/radiation/radiationModel/P1/P1.H @@ -59,7 +59,6 @@ class P1 : public radiationModel { - // Private data //- Incident radiation / [W/m2] @@ -97,18 +96,17 @@ public: // Destructor - - ~P1(); + virtual ~P1(); // Member functions // Edit - //- Update radiationSource varible - void correct(); + //- Solve radiation equation(s) + void calculate(); - //- Read radiationProperties dictionary + //- Read radiation properties dictionary bool read(); diff --git a/src/thermophysicalModels/radiation/radiationModel/fvDOM/absorptionCoeffs/absorptionCoeffs.C b/src/thermophysicalModels/radiation/radiationModel/fvDOM/absorptionCoeffs/absorptionCoeffs.C new file mode 100644 index 0000000000000000000000000000000000000000..3452797b3eb23f61faf17dc2d07f56be7cf7f820 --- /dev/null +++ b/src/thermophysicalModels/radiation/radiationModel/fvDOM/absorptionCoeffs/absorptionCoeffs.C @@ -0,0 +1,110 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +\*---------------------------------------------------------------------------*/ + +#include "absorptionCoeffs.H" +#include "IOstreams.H" + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::radiation::absorptionCoeffs::absorptionCoeffs(Istream& is) +: + Tcommon_(readScalar(is)), + Tlow_(readScalar(is)), + Thigh_(readScalar(is)), + invTemp_(readBool(is)) +{ + for (label coefLabel=0; absorptionCoeffs::nCoeffs_; coefLabel++) + { + is >> highACoeffs_[coefLabel]; + } + + for (label coefLabel=0; absorptionCoeffs::nCoeffs_; coefLabel++) + { + is >> lowACoeffs_[coefLabel]; + } +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * // + +Foam::radiation::absorptionCoeffs::~absorptionCoeffs() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::radiation::absorptionCoeffs::checkT(const scalar T) const +{ + if (T < Tlow_ || T > Thigh_) + { + FatalErrorIn + ( + "absorptionCoeffs::checkT(const scalar T) const" + ) << "attempt to use absCoeff out of temperature range:" << nl + << " " << Tlow_ << " -> " << Thigh_ << "; T = " << T + << nl << abort(FatalError); + } +} + + +const Foam::radiation::absorptionCoeffs::coeffArray& +Foam::radiation::absorptionCoeffs::coeffs +( + const scalar T +) const +{ + checkT(T); + + if (T < Tcommon_) + { + return lowACoeffs_; + } + else + { + return highACoeffs_; + } +} + + +void Foam::radiation::absorptionCoeffs::initialise(Istream&) +{ + absorptionCoeffs(Istream); +} + + +void Foam::radiation::absorptionCoeffs::initialise(const dictionary& dict) +{ + dict.lookup("Tcommon") >> Tcommon_; + dict.lookup("Tlow") >> Tlow_; + dict.lookup("Tlow") >> Thigh_; + dict.lookup("invTemp") >> invTemp_; + + dict.lookup("loTcoeffs") >> lowACoeffs_; + dict.lookup("hiTcoeffs") >> highACoeffs_; +} + + +// ************************************************************************* // diff --git a/src/thermophysicalModels/radiation/radiationModel/fvDOM/absorptionCoeffs/absorptionCoeffs.H b/src/thermophysicalModels/radiation/radiationModel/fvDOM/absorptionCoeffs/absorptionCoeffs.H new file mode 100644 index 0000000000000000000000000000000000000000..1a79e310b908f435d1c23ea41fd2a8355d46bc15 --- /dev/null +++ b/src/thermophysicalModels/radiation/radiationModel/fvDOM/absorptionCoeffs/absorptionCoeffs.H @@ -0,0 +1,146 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Class + Foam::janafThermo + +Description + Absorption coefficients class used in greyMeanAbsorptionEmission and + wideBandAbsorptionEmission + +SourceFiles + absorptionCoeffs.C + +\*---------------------------------------------------------------------------*/ + +#ifndef absorptionCoeffs_H +#define absorptionCoeffs_H + +#include "List.H" +#include "IOstreams.H" +#include "IOdictionary.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +namespace Foam +{ +namespace radiation +{ + +/*---------------------------------------------------------------------------*\ + Class absorptionCoeffs Declaration +\*---------------------------------------------------------------------------*/ + +class absorptionCoeffs +{ +public: + + // Public data members + + static const int nCoeffs_ = 6; + typedef FixedList<scalar, nCoeffs_> coeffArray; + + +private: + + // Private data + + // Temperature limits of applicability for functions + + scalar Tcommon_; + + scalar Tlow_; + + scalar Thigh_; + + + // Polynomial using inverse temperatures + bool invTemp_; + + coeffArray highACoeffs_; + coeffArray lowACoeffs_; + + + // Private member functions + + //- Check given temperature is within the range of the fitted coeffs + void checkT(const scalar T) const; + + +public: + + // Constructors + + //- Construct from Istream + absorptionCoeffs(Istream&); + + // Null constructor + absorptionCoeffs() + {} + + + // Destructor + ~absorptionCoeffs(); + + + // Member functions + + //- Return the coefficients corresponding to the given temperature + const coeffArray& coeffs(const scalar T) const; + + // Initialise from a dictionary + void initialise(const dictionary&); + + // Initialise from an Istream + void initialise(Istream&); + + + // Access Functions + + inline bool invTemp() const; + + inline scalar Tcommon() const; + + inline scalar Tlow() const; + + inline scalar Thigh() const; + + inline const coeffArray& highACoeffs() const; + + inline const coeffArray& lowACoeffs() const; +}; + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam +} // End namespace radiation + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "absorptionCoeffsI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/thermophysicalModels/radiation/radiationModel/fvDOM/absorptionCoeffs/absorptionCoeffsI.H b/src/thermophysicalModels/radiation/radiationModel/fvDOM/absorptionCoeffs/absorptionCoeffsI.H new file mode 100644 index 0000000000000000000000000000000000000000..c7759db4772a908cbc4f7b8ce8640436f5c8125b --- /dev/null +++ b/src/thermophysicalModels/radiation/radiationModel/fvDOM/absorptionCoeffs/absorptionCoeffsI.H @@ -0,0 +1,65 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +\*---------------------------------------------------------------------------*/ + +inline bool Foam::radiation::absorptionCoeffs::invTemp() const +{ + return invTemp_; +} + + +inline Foam::scalar Foam::radiation::absorptionCoeffs::Tcommon() const +{ + return Tcommon_; +} + + +inline Foam::scalar Foam::radiation::absorptionCoeffs::Tlow() const +{ + return Tlow_; +} + + +inline Foam::scalar Foam::radiation::absorptionCoeffs::Thigh() const +{ + return Thigh_; +} + + +inline const Foam::radiation::absorptionCoeffs::coeffArray& +Foam::radiation::absorptionCoeffs::highACoeffs() const +{ + return highACoeffs_; +} + + +inline const Foam::radiation::absorptionCoeffs::coeffArray& +Foam::radiation::absorptionCoeffs::lowACoeffs() const +{ + return lowACoeffs_; +} + + +// ************************************************************************* // diff --git a/src/thermophysicalModels/radiation/radiationModel/fvDOM/blackBodyEmission/blackBodyEmission.C b/src/thermophysicalModels/radiation/radiationModel/fvDOM/blackBodyEmission/blackBodyEmission.C new file mode 100644 index 0000000000000000000000000000000000000000..39d02831bb412fccd9d75678e8850167a8955bdb --- /dev/null +++ b/src/thermophysicalModels/radiation/radiationModel/fvDOM/blackBodyEmission/blackBodyEmission.C @@ -0,0 +1,143 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +\*---------------------------------------------------------------------------*/ + +#include "blackBodyEmission.H" +#include "dimensionedConstants.H" + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::radiation::blackBodyEmission::blackBodyEmission +( + const fileName& name, + const word& instance, + const label nLambda, + const volScalarField& T +) +: + blackBodyEmissiveTable_(name, instance, T.mesh()), + C1_("C1",dimensionSet(1, 4, 3, 0, 0, 0, 0), 3.7419e-16), + C2_("C2",dimensionSet(0, 1, 0, 1, 0, 0, 0), 14.388e-6), + bLambda_(nLambda), + T_(T) +{ + forAll(bLambda_, lambdaI) + { + bLambda_.set + ( + lambdaI, + new volScalarField + ( + IOobject + ( + "bLambda_" + Foam::name(lambdaI) , + T.mesh().time().timeName(), + T.mesh(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + radiation::sigmaSB*pow4(T) + ) + ); + + } +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::radiation::blackBodyEmission::~blackBodyEmission() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +Foam::scalar Foam::radiation::blackBodyEmission::fLambdaT +( + const scalar lambdaT +) const +{ + return blackBodyEmissiveTable_.lookUp(lambdaT*1.0e6)[1]; +} + + +Foam::tmp<Foam::volScalarField> +Foam::radiation::blackBodyEmission::EbDeltaLambdaT +( + const volScalarField& T, + const Vector2D<scalar>& band +) const +{ + tmp<volScalarField> Eb + ( + new volScalarField + ( + IOobject + ( + "Eb", + T.mesh().time().timeName(), + T.mesh(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + radiation::sigmaSB*pow4(T) + ) + ); + + + if (band == Vector2D<scalar>::one) + { + return Eb; + } + else + { + forAll(T, i) + { + scalar T1 = fLambdaT(band[1]*T[i]); + scalar T2 = fLambdaT(band[0]*T[i]); + dimensionedScalar fLambdaDelta + ( + "fLambdaDelta", + dimless, + T1 - T2 + ); + Eb()[i] = Eb()[i]*fLambdaDelta.value(); + } + return Eb; + } +} + + +void Foam::radiation::blackBodyEmission::correct +( + const label lambdaI, + const Vector2D<scalar>& band +) +{ + bLambda_[lambdaI] = EbDeltaLambdaT(T_, band); +} + + +// ************************************************************************* // diff --git a/src/thermophysicalModels/radiation/radiationModel/fvDOM/blackBodyEmission/blackBodyEmission.H b/src/thermophysicalModels/radiation/radiationModel/fvDOM/blackBodyEmission/blackBodyEmission.H new file mode 100644 index 0000000000000000000000000000000000000000..d21582938f53b5c50974e2576186daf089a9403a --- /dev/null +++ b/src/thermophysicalModels/radiation/radiationModel/fvDOM/blackBodyEmission/blackBodyEmission.H @@ -0,0 +1,143 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Class + Foam::radiation::blackBodyEmission + +Description + Class black body emission + +SourceFiles + blackBodyEmission.C + +\*---------------------------------------------------------------------------*/ + +#ifndef blackModyEmission_H +#define blackModyEmission_H + +#include "volFields.H" +#include "dimensionedScalar.H" +#include "mathematicalConstants.H" +#include "radiationConstants.H" +#include "interpolationLookUpTable.H" +#include "Vector2D.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace radiation +{ + +/*---------------------------------------------------------------------------*\ + Class blackBodyEmission Declaration +\*---------------------------------------------------------------------------*/ + +class blackBodyEmission +{ + // Private data + + mutable interpolationLookUpTable<scalar> blackBodyEmissiveTable_; + + //- Constant C1 + const dimensionedScalar C1_; + + //- Constant C2 + const dimensionedScalar C2_; + + // Ptr List for black body emission energy field for each wavelength + PtrList<volScalarField> bLambda_; + + // Reference to the temperature field + const volScalarField& T_; + + + // Private member functions + + scalar fLambdaT(const scalar lambdaT) const; + + +public: + + // Constructors + + //- Construct from components + blackBodyEmission + ( + const fileName& name, + const word& instance, + const label nLambda, + const volScalarField& T + ); + + + // Destructor + ~blackBodyEmission(); + + + // Member functions + + // Access + + //- Black body spectrum + inline const volScalarField& bLambda(const label lambdaI) const + { + return bLambda_[lambdaI]; + } + + //- Spectral emission for the black body at T and lambda + inline dimensionedScalar EblambdaT + ( + const dimensionedScalar& T, + const scalar lambda + ) const + { + return (C1_/(pow5(lambda)*(exp(C2_/(lambda*T)) - 1.0))); + } + + //- Integral energy at T from lambda1 to lambda2 + tmp<Foam::volScalarField> EbDeltaLambdaT + ( + const volScalarField& T, + const Vector2D<scalar>& band + ) const; + + + // Edit + + // Update black body emission + void correct(const label lambdaI, const Vector2D<scalar>& band); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam +} // End namespace radiation + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/thermophysicalModels/radiation/radiationModel/fvDOM/blackBodyEmission/blackBodyEmissivePower b/src/thermophysicalModels/radiation/radiationModel/fvDOM/blackBodyEmission/blackBodyEmissivePower new file mode 100644 index 0000000000000000000000000000000000000000..c0151b436a5687682ae39788b6e02f5ec1b58a39 --- /dev/null +++ b/src/thermophysicalModels/radiation/radiationModel/fvDOM/blackBodyEmission/blackBodyEmissivePower @@ -0,0 +1,174 @@ +171 +( +1000 0.00032 +1100 0.00091 +1200 0.00213 +1300 0.00432 +1400 0.00779 +1500 0.01285 +1600 0.01972 +1700 0.02853 +1800 0.03934 +1900 0.05210 +2000 0.06672 +2100 0.08305 +2200 0.10088 +2300 0.12002 +2400 0.14025 +2500 0.16135 +2600 0.18311 +2700 0.20535 +2800 0.22788 +2900 0.25055 +3000 0.27322 +3100 0.29576 +3200 0.31809 +3300 0.34009 +3400 0.36172 +3500 0.38290 +3600 0.40359 +3700 0.42375 +3800 0.44336 +3900 0.46240 +4000 0.48085 +4100 0.49872 +4200 0.51599 +4300 0.53267 +4400 0.54877 +4500 0.56429 +4600 0.57925 +4700 0.59366 +4800 0.60753 +4900 0.62088 +5000 0.63372 +5100 0.64606 +5200 0.65794 +5300 0.66935 +5400 0.68033 +5500 0.69087 +5600 0.70101 +5700 0.71076 +5800 0.72012 +5900 0.72913 +6000 0.73778 +6100 0.74610 +6200 0.75410 +6300 0.76180 +6400 0.76920 +6500 0.77631 +6600 0.78316 +6700 0.78975 +6800 0.79609 +6900 0.80219 +7000 0.80807 +7100 0.81373 +7200 0.81918 +7300 0.82443 +7400 0.82949 +7500 0.83436 +7600 0.83906 +7700 0.84359 +7800 0.84796 +7900 0.85218 +8000 0.85625 +8100 0.86017 +8200 0.86396 +8300 0.86762 +8400 0.87115 +8500 0.87456 +8600 0.87786 +8700 0.88105 +8800 0.88413 +8900 0.88711 +9000 0.88999 +9100 0.89277 +9200 0.89547 +9300 0.89807 +9400 0.90060 +9500 0.90304 +9600 0.90541 +9700 0.90770 +9800 0.90992 +9900 0.91207 +10000 0.91415 +10200 0.91813 +10400 0.92188 +10600 0.92540 +10800 0.92872 +11000 0.93184 +11200 0.93479 +11400 0.93758 +11600 0.94021 +11800 0.94270 +12000 0.94505 +12200 0.94728 +12400 0.94939 +12600 0.95139 +12800 0.95329 +13000 0.95509 +13200 0.95680 +13400 0.95843 +13600 0.95998 +13800 0.96145 +14000 0.96285 +14200 0.96418 +14400 0.96546 +14600 0.96667 +14800 0.96783 +15000 0.96893 +15200 0.96999 +15400 0.97100 +15600 0.97196 +15800 0.97288 +16000 0.97377 +16200 0.97461 +16400 0.97542 +16600 0.97620 +16800 0.97694 +17000 0.97765 +17200 0.97834 +17400 0.97899 +17600 0.97962 +17800 0.98023 +18000 0.98080 +18200 0.98137 +18400 0.98191 +18600 0.98243 +18900 0.98293 +19000 0.98340 +19200 0.98387 +19400 0.98431 +19600 0.98474 +19800 0.98515 +20000 0.98555 +21000 0.98735 +22000 0.98886 +23000 0.99014 +24000 0.99123 +25000 0.99217 +26000 0.99297 +27000 0.99367 +28000 0.99429 +29000 0.99482 +30000 0.99529 +31000 0.99571 +32000 0.99607 +33000 0.99640 +34000 0.99669 +35000 0.99695 +35000 0.99719 +36000 0.99740 +37000 0.99759 +38000 0.99776 +39000 0.99792 +40000 0.99806 +41000 0.99819 +42000 0.99831 +43000 0.99842 +44000 0.99851 +45000 0.99861 +46000 0.99869 +47000 0.99877 +48000 0.99884 +49000 0.99890 +) \ No newline at end of file diff --git a/src/thermophysicalModels/radiation/radiationModel/fvDOM/fvDOM/fvDOM.C b/src/thermophysicalModels/radiation/radiationModel/fvDOM/fvDOM/fvDOM.C new file mode 100644 index 0000000000000000000000000000000000000000..af3b14ebb027b1ea700e2af91355baf3ccd01104 --- /dev/null +++ b/src/thermophysicalModels/radiation/radiationModel/fvDOM/fvDOM/fvDOM.C @@ -0,0 +1,372 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +\*---------------------------------------------------------------------------*/ + +#include "fvDOM.H" +#include "addToRunTimeSelectionTable.H" +#include "fvm.H" + +#include "absorptionEmissionModel.H" +#include "scatterModel.H" +#include "mathematicalConstants.H" +#include "radiationConstants.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + namespace radiation + { + defineTypeNameAndDebug(fvDOM, 0); + + addToRunTimeSelectionTable + ( + radiationModel, + fvDOM, + dictionary + ); + } +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::radiation::fvDOM::fvDOM(const volScalarField& T) +: + radiationModel(typeName, T), + G_ + ( + IOobject + ( + "G", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_, + dimensionedScalar("G", dimMass/pow3(dimTime), 0.0) + ), + Qr_ + ( + IOobject + ( + "Qr", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + mesh_, + dimensionedScalar("Qr", dimMass/pow3(dimTime), 0.0) + ), + a_ + ( + IOobject + ( + "a", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + mesh_, + dimensionedScalar("a", dimless/dimLength, 0.0) + ), + e_ + ( + IOobject + ( + "e", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_, + dimensionedScalar("a", dimless/dimLength, 0.0) + ), + E_ + ( + IOobject + ( + "E", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_, + dimensionedScalar("E", dimMass/dimLength/pow3(dimTime), 0.0) + ), + nTheta_(readLabel(coeffs_.lookup("nTheta"))), + nPhi_(readLabel(coeffs_.lookup("nPhi"))), + nRay_(0), + nLambda_(absorptionEmission_->nBands()), + aLambda_(nLambda_), + blackBody_ + ( + fileName("blackBodyEmissivePower"), + mesh_.time().constant(), + nLambda_, + T + ), + IRay_(0), + convergence_(coeffs_.lookupOrDefault<scalar>("convergence", 0.0)) +{ + if (mesh_.nSolutionD() == 3) //3D + { + IRay_.setSize(4*nPhi_*nTheta_); + nRay_ = 4*nPhi_*nTheta_; + scalar deltaPhi = mathematicalConstant::pi/(2.0*nPhi_); + scalar deltaTheta = mathematicalConstant::pi/nTheta_; + label i = 0; + for (label n = 1; n <= nTheta_; n++) + { + for (label m = 1; m <= 4*nPhi_; m++) + { + scalar thetai = (2.0*n - 1.0)*deltaTheta/2.0; + scalar phii = (2.0*m - 1.0)*deltaPhi/2.0; + IRay_.set + ( + i, + new radiativeIntensityRay + ( + *this, + mesh_, + phii, + thetai, + deltaPhi, + deltaTheta, + nLambda_, + absorptionEmission_, + blackBody_ + ) + ); + i++; + } + } + } + else + { + if (mesh_.nSolutionD() == 2) //2D (X & Y) + { + scalar thetai = mathematicalConstant::pi/2.0; + scalar deltaTheta = mathematicalConstant::pi; + IRay_.setSize(4*nPhi_); + nRay_ = 4*nPhi_; + scalar deltaPhi = mathematicalConstant::pi/(2.0*nPhi_); + label i = 0; + for (label m = 1; m <= 4*nPhi_; m++) + { + scalar phii = (2.0*m - 1.0)*deltaPhi/2.0; + IRay_.set + ( + i, + new radiativeIntensityRay + ( + *this, + mesh_, + phii, + thetai, + deltaPhi, + deltaTheta, + nLambda_, + absorptionEmission_, + blackBody_ + ) + ); + i++; + } + } + else //1D (X) + { + scalar thetai = mathematicalConstant::pi/2.0; + scalar deltaTheta = mathematicalConstant::pi; + IRay_.setSize(2); + nRay_ = 2; + scalar deltaPhi = mathematicalConstant::pi; + label i = 0; + for (label m = 1; m <= 2; m++) + { + scalar phii = (2.0*m - 1.0)*deltaPhi/2.0; + IRay_.set + ( + i, + new radiativeIntensityRay + ( + *this, + mesh_, + phii, + thetai, + deltaPhi, + deltaTheta, + nLambda_, + absorptionEmission_, + blackBody_ + ) + ); + i++; + } + + } + } + + + // Construct absorption field for each wavelength + forAll(aLambda_, lambdaI) + { + aLambda_.set + ( + lambdaI, + new volScalarField + ( + IOobject + ( + "aLambda_" + Foam::name(lambdaI) , + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + a_ + ) + ); + } +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::radiation::fvDOM::~fvDOM() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +bool Foam::radiation::fvDOM::read() +{ + if (radiationModel::read()) + { + // nothing to read + +// coeffs_.lookup("nTheta") >> nTheta_; +// coeffs_.lookup("nPhi") >> nPhi_; + + return true; + } + else + { + return false; + } +} + + +void Foam::radiation::fvDOM::calculate() +{ + absorptionEmission_->correct(a_, aLambda_); + + updateBlackBodyEmission(); + + scalar maxResidual = 0.0; + label radIter = 0; + do + { + radIter++; + forAll(IRay_, rayI) + { + maxResidual = 0.0; + scalar maxBandResidual = IRay_[rayI].correct(); + maxResidual = max(maxBandResidual, maxResidual); + } + + Info << "Radiation solver iter: " << radIter << endl; + + } while(maxResidual > convergence_); + + updateG(); +} + + +Foam::tmp<Foam::volScalarField> Foam::radiation::fvDOM::Rp() const +{ + return tmp<volScalarField> + ( + new volScalarField + ( + IOobject + ( + "Rp", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ), + 4.0*a_*radiation::sigmaSB //absorptionEmission_->a() + ) + ); +} + + +Foam::tmp<Foam::DimensionedField<Foam::scalar, Foam::volMesh> > +Foam::radiation::fvDOM::Ru() const +{ + + const DimensionedField<scalar, volMesh>& G = + G_.dimensionedInternalField(); + const DimensionedField<scalar, volMesh> E = + absorptionEmission_->ECont()().dimensionedInternalField(); + const DimensionedField<scalar, volMesh> a = + a_.dimensionedInternalField(); //absorptionEmission_->aCont()() + + return a*G - 4.0*E; +} + + +void Foam::radiation::fvDOM::updateBlackBodyEmission() +{ + for (label j=0; j < nLambda_; j++) + { + blackBody_.correct(j, absorptionEmission_->bands(j)); + } +} + + +void Foam::radiation::fvDOM::updateG() +{ + G_ = dimensionedScalar("zero",dimMass/pow3(dimTime), 0.0); + Qr_ = dimensionedScalar("zero",dimMass/pow3(dimTime), 0.0); + + forAll(IRay_, rayI) + { + IRay_[rayI].addIntensity(); + G_ += IRay_[rayI].I()*IRay_[rayI].omega(); + Qr_ += IRay_[rayI].Qr(); + } +} + + +// ************************************************************************* // diff --git a/src/thermophysicalModels/radiation/radiationModel/fvDOM/fvDOM/fvDOM.H b/src/thermophysicalModels/radiation/radiationModel/fvDOM/fvDOM/fvDOM.H new file mode 100644 index 0000000000000000000000000000000000000000..3cbd9214067ddd2564ac9d34ef28f3f9fa623275 --- /dev/null +++ b/src/thermophysicalModels/radiation/radiationModel/fvDOM/fvDOM/fvDOM.H @@ -0,0 +1,227 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Class + Foam::radiation::fvDOM + +Description + + Finite Volume Discrete Ordinary Method. Solves the RTE equation for n + directions in a participating media, not including scatter. + + Available absorption models: + greyMeanAbsoprtionEmission + wideBandAbsorptionEmission + + i.e. dictionary + fvDOMCoeffs + { + Nphi 1; // azimuthal angles in PI/2 on X-Y.(from Y to X) + Ntheta 2; // polar angles in P1 (from Z to X-Y plane) + convergence 1e-4; // convergence criteria for radiation iteration + } + + nFlowIterPerRadIter 1; // Number of flow iterations per radiation + iteration + + The total number of solid angles is 4*Nphi*Ntheta. + + In 1D the direction of the rays is X (Nphi and Ntheta are ignored) + In 2D the direction of the rays is on X-Y plane (only Nphi is considered) + In 3D (Nphi and Ntheta are considered) + +SourceFiles + fvDOM.C + +\*---------------------------------------------------------------------------*/ + +#ifndef radiationModelfvDOM_H +#define radiationModelfvDOM_H + +#include "radiativeIntensityRay.H" +#include "radiationModel.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace radiation +{ + +/*---------------------------------------------------------------------------*\ + Class fvDOM Declaration +\*---------------------------------------------------------------------------*/ + +class fvDOM +: + public radiationModel +{ + // Private data + + //- Incident radiation [W/m2] + volScalarField G_; + + //- Total radiative heat flux [W/m2] + volScalarField Qr_; + + //- Total absorption coefficient [1/m] + volScalarField a_; + + //- Total emission coefficient [1/m] + volScalarField e_; + + //- Emission contribution [Kg/m/s^3] + volScalarField E_; + + //- Number of solid angles in theta + label nTheta_; + + //- Number of solid angles in phi + label nPhi_ ; + + //- Total number of rays (1 per direction) + label nRay_; + + //- Number of wavelength bands + label nLambda_; + + //- Wavelength total absorption coefficient [1/m] + PtrList<volScalarField> aLambda_; + + //- Black body + blackBodyEmission blackBody_; + + //- List of pointers to radiative intensity rays + PtrList<radiativeIntensityRay> IRay_; + + //- Convergence criterion + scalar convergence_; + + + // Private member functions + + //- Disallow default bitwise copy construct + fvDOM(const fvDOM&); + + //- Disallow default bitwise assignment + void operator=(const fvDOM&); + + //- Update Absorption Coefficients +// void updateAbsorptionCoeffs(void); + + //- Update nlack body emission + void updateBlackBodyEmission(); + + +public: + + //- Runtime type information + TypeName("fvDOM"); + + + // Constructors + + //- Construct from components + fvDOM(const volScalarField& T); + + + //- Destructor + virtual ~fvDOM(); + + + // Member functions + + // Edit + + //- Solve radiation equation(s) + void calculate(); + + //- Read radiation properties dictionary + bool read(); + + //- Update G and calculate total heat flux on boundary + void updateG(); + + //- Source term component (for power of T^4) + virtual tmp<volScalarField> Rp() const; + + //- Source term component (constant) + virtual tmp<DimensionedField<scalar, volMesh> > Ru() const; + + + // Access + + //- Ray intensity for rayI + inline const radiativeIntensityRay& IRay(const label rayI) const; + + //- Ray intensity for rayI and lambda bandwidth + inline const volScalarField& IRayLambda + ( + const label rayI, + const label lambdaI + ) const; + + //- Number of angles in theta + inline label nTheta() const; + + //- Number of angles in phi + inline label nPhi() const; + + //- Number of rays + inline label nRay() const; + + //- Number of wavelengths + inline label nLambda() const; + + // Const access to total absorption coefficient + inline const volScalarField& a() const; + + // Const access to wavelength total absorption coefficient + inline const volScalarField& aLambda(const label lambdaI) const; + + // Const access to incident radiation field + inline const volScalarField& G() const; + + // Const access to total radiative heat flux field + inline const volScalarField& Qr() const; + + // Const access to black body + inline const blackBodyEmission& blackBody() const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "fvDOMI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace radiation +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/thermophysicalModels/radiation/radiationModel/fvDOM/fvDOM/fvDOMI.H b/src/thermophysicalModels/radiation/radiationModel/fvDOM/fvDOM/fvDOMI.H new file mode 100644 index 0000000000000000000000000000000000000000..594b5bee0ac72a6dde43be556d2d616813353e4a --- /dev/null +++ b/src/thermophysicalModels/radiation/radiationModel/fvDOM/fvDOM/fvDOMI.H @@ -0,0 +1,103 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +\*---------------------------------------------------------------------------*/ + +inline const Foam::radiation::radiativeIntensityRay& +Foam::radiation::fvDOM::IRay(const label rayI) const +{ + return IRay_[rayI]; +} + + +inline const Foam::volScalarField& +Foam::radiation::fvDOM::IRayLambda +( + const label rayI, + const label lambdaI +) const +{ + return IRay_[rayI].ILambda(lambdaI); +} + + +inline Foam::label Foam::radiation::fvDOM::nTheta() const +{ + return nTheta_; +} + + +inline Foam::label Foam::radiation::fvDOM::nPhi() const +{ + return nPhi_; +} + + +inline Foam::label Foam::radiation::fvDOM::nRay() const +{ + return nRay_; +} + + +inline Foam::label Foam::radiation::fvDOM::nLambda() const +{ + return nLambda_; +} + + +inline const Foam::volScalarField& Foam::radiation::fvDOM::a() const +{ + return a_; +} + + +inline const Foam::volScalarField& Foam::radiation::fvDOM::aLambda +( + const label lambdaI +) const +{ + return aLambda_[lambdaI]; +} + + +inline const Foam::volScalarField& Foam::radiation::fvDOM::G() const +{ + return G_; +} + + +inline const Foam::volScalarField& Foam::radiation::fvDOM::Qr() const +{ + return Qr_; +} + + +inline const Foam::radiation::blackBodyEmission& +Foam::radiation::fvDOM::blackBody() const +{ + return blackBody_; +} + + +// ************************************************************************* // diff --git a/src/thermophysicalModels/radiation/radiationModel/fvDOM/interpolationLookUpTable/interpolationLookUpTable.C b/src/thermophysicalModels/radiation/radiationModel/fvDOM/interpolationLookUpTable/interpolationLookUpTable.C new file mode 100755 index 0000000000000000000000000000000000000000..e9e28658c476f0e6b9e95e5c17d98f186859dcd6 --- /dev/null +++ b/src/thermophysicalModels/radiation/radiationModel/fvDOM/interpolationLookUpTable/interpolationLookUpTable.C @@ -0,0 +1,521 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +\*---------------------------------------------------------------------------*/ + +#include "IFstream.H" + +// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // + +template <class Type> +Foam::label Foam::interpolationLookUpTable <Type>::index +( + const List<scalar>& indices, + const bool lastDim +) const +{ + label totalindex = 0; + + for (int i = 0; i < dim_.size() - 1; i++) + { + label dim = 1; + for (int j = i + 1; j < dim_.size(); j++) + { + dim *=(dim_[j]+1); + } + + totalindex += + dim + *min + ( + max(label((indices[i] - min_[i])/delta_[i]), 0), + dim_[i] + ); + } + + if (lastDim) + { + label iLastdim = dim_.size() - 1; + totalindex += Foam::min + ( + max + ( + label((indices[iLastdim] - min_[iLastdim])/delta_[iLastdim]), + 0 + ), + dim_[iLastdim] + ); + } + + return totalindex; +} + + +template <class Type> +Foam::label Foam::interpolationLookUpTable <Type>::index +( + const scalar indice +) const +{ + label i = 0; + label totalIndex = + Foam::min + ( + Foam::max + ( + label((indice - min_[i])/delta_[i]), + 0 + ), + dim_[i] + ); + + return totalIndex; +} + + +template<class Type> +bool Foam::interpolationLookUpTable<Type>::checkRange +( + const scalar lookUpValue, + const label interfield +) const +{ + if (lookUpValue >= min_[interfield] && lookUpValue <= max_[interfield]) + { + return true; + } + else + { + return false; + } +} + + +template<class Type> +Foam::scalar Foam::interpolationLookUpTable<Type>::interpolate +( + const label lo, + const label hi, + const scalar lookUpValue, + const label ofield, + const label interfield +) const +{ + if + ( + List<scalarField>::operator[](interfield).operator[](hi) + != List<scalarField>::operator[](interfield).operator[](lo) + ) + { + scalar output + ( + List<scalarField>::operator[](ofield).operator[](lo) + + ( + List<scalarField>::operator[](ofield).operator[](hi) + - List<scalarField>::operator[](ofield).operator[](lo) + ) + *( + lookUpValue + - List<scalarField>::operator[](interfield).operator[](lo) + ) + /( + List<scalarField>::operator[](interfield).operator[](hi) + - List<scalarField>::operator[](interfield).operator[](lo) + ) + ); + return output; + } + else + { + return List<scalarField>::operator[](ofield).operator[](lo); + } +} + + +template<class Type> +void Foam::interpolationLookUpTable<Type>::dimensionTable() +{ + min_.setSize(entries_.size()); + dim_.setSize(entries_.size()); + delta_.setSize(entries_.size()); + max_.setSize(entries_.size()); + entryIndices_.setSize(entries_.size()); + outputIndices_.setSize(output_.size()); + label index = 0; + label tableDim = 1; + + forAll(entries_,i) + { + dim_[i] = readLabel(entries_[i].lookup("N")); + max_[i] = readScalar(entries_[i].lookup("max")); + min_[i] = readScalar(entries_[i].lookup("min")); + delta_[i] = (max_[i] - min_[i])/dim_[i]; + tableDim *= (dim_[i] + 1); + fieldIndices_.insert(entries_[i].lookup("name"),index); + entryIndices_[i] = index; + index++; + } + + forAll(output_,i) + { + fieldIndices_.insert(output_[i].lookup("name"),index); + outputIndices_[i] = index; + index++; + } + + List<scalarField>& internal = *this; + + internal.setSize(entries_.size() + output_.size()); + + interpOutput_.setSize(entries_.size() + output_.size()); + + forAll(internal, i) + { + internal[i].setSize(tableDim); + } +} + + +template<class Type> +void Foam::interpolationLookUpTable<Type>::readTable +( + const word& instance, + const fvMesh& mesh +) +{ + IOdictionary control + ( + IOobject + ( + fileName_, + instance, + mesh, + IOobject::MUST_READ, + IOobject::NO_WRITE + ) + ); + + control.lookup("fields") >> entries_; + control.lookup("output") >> output_; + control.lookup("values") >> *this; + + dimensionTable(); + + check(); + + if (this->size() == 0) + { + FatalErrorIn + ( + "Foam::interpolationLookUpTable<Type>::readTable()" + ) << "table is empty" << nl + << exit(FatalError); + } +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +template<class Type> +Foam::interpolationLookUpTable<Type>::interpolationLookUpTable() +: + List<scalarField >(), + fileName_("fileNameIsUndefined") +{} + + +template<class Type> +Foam::interpolationLookUpTable<Type>::interpolationLookUpTable +( + const fileName& fn, const word& instance, const fvMesh& mesh +) +: + List<scalarField >(), + fileName_(fn), + dim_(0), + min_(0), + delta_(0.0), + max_(0.0), + entries_(0), + output_(0), + entryIndices_(0), + outputIndices_(0), + interpOutput_(0) +{ + readTable(instance, mesh); +} + + +template<class Type> +Foam::interpolationLookUpTable<Type>::interpolationLookUpTable +( + const interpolationLookUpTable& interpTable +) +: + List<scalarField >(interpTable), + fileName_(interpTable.fileName_), + entryIndices_(interpTable.entryIndices_), + outputIndices_(interpTable.outputIndices_), + dim_(interpTable.dim_), + min_(interpTable.min_), + delta_(interpTable.delta_), + max_(interpTable.max_), + entries_(0), + output_(0), + interpOutput_(interpTable.interpOutput_) +{} + + +template<class Type> +Foam::interpolationLookUpTable<Type>::interpolationLookUpTable +( + const dictionary& dict +) +: + List<scalarField >(), + fileName_(fileName(dict.lookup("fileName")).expand()), + dim_(0), + min_(0.0), + delta_(0.0), + max_(0.0), + entries_(dict.lookup("fields")), + output_(dict.lookup("output")), + entryIndices_(0), + outputIndices_(0), + fieldIndices_(0), + interpOutput_(0) +{ + dimensionTable(); +} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +template<class Type> +void Foam::interpolationLookUpTable<Type>::check() const +{ +// check order in the first dimension. + + scalar prevValue = List<scalarField >::operator[](0).operator[](0); + label dim = 1 ; + for (int j = 1; j < dim_.size(); j++) + { + dim *=(dim_[j]+1); + } + + for (label i = 1; i < dim_[0]; i++) + { + label index = i*dim; + const scalar currValue = + List<scalarField >::operator[](0).operator[](index); + + // avoid duplicate values (divide-by-zero error) + if (currValue <= prevValue) + { + FatalErrorIn + ( + "Foam::interpolationLookUpTable<Type>::checkOrder() const" + ) << "out-of-order value: " + << currValue << " at index " << index << nl + << exit(FatalError); + } + prevValue = currValue; + } +} + + +template<class Type> +void Foam::interpolationLookUpTable<Type>::write +( + Ostream& os, + const fileName& fn, + const word& instance, + const fvMesh& mesh +) const +{ + IOdictionary control + ( + IOobject + ( + fn, + instance, + mesh, + IOobject::NO_READ, + IOobject::NO_WRITE + ) + ); + + control.writeHeader(os); + + os.writeKeyword("fields"); + os << entries_ << token::END_STATEMENT << nl; + + os.writeKeyword("output"); + os << output_ << token::END_STATEMENT << nl; + + if (this->size() == 0) + { + FatalErrorIn + ( + "Foam::interpolationTable<Type>::write()" + ) << "table is empty" << nl + << exit(FatalError); + } + os.writeKeyword("values"); + os << *this << token::END_STATEMENT << nl; +} + + +// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // + +template<class Type> +Foam::scalarField& +Foam::interpolationLookUpTable<Type>::operator[](const label i) +{ + label ii = i; + label n = this->size(); + + if (n <= 1) + { + FatalErrorIn + ( + "Foam::interpolationLookUpTable<Type>::operator[]" + "(const label) const" + ) << "table has (" << n << ") columns" << nl + << exit(FatalError); + } + else if (ii < 0) + { + FatalErrorIn + ( + "Foam::interpolationLookUpTable<Type>::operator[]" + "(const label) const" + ) << "index (" << ii << ") underflow" << nl + << exit(FatalError); + } + else if (ii > n) + { + FatalErrorIn + ( + "Foam::interpolationLookUpTable<Type>::operator[]" + "(const label) const" + ) << "index (" << ii << ") overflow" << nl + << exit(FatalError); + } + + return List<scalarField >::operator[](ii); +} + + +template<class Type> +const Foam::scalarField& +Foam::interpolationLookUpTable<Type>::operator[](const label i) const +{ + label ii = i; + label n = this->size(); + + if (n <= 1) + { + FatalErrorIn + ( + "Foam::interpolationLookUpTable<Type>::operator[]" + "(const label) const" + ) << "table has (" << n << ") columns" << nl + << exit(FatalError); + } + else if (ii < 0) + { + FatalErrorIn + ( + "Foam::interpolationLookUpTable<Type>::operator[]" + "(const label) const" + ) << "index (" << ii << ") underflow" << nl + << exit(FatalError); + } + + else if (ii > n) + { + FatalErrorIn + ( + "Foam::interpolationLookUpTable<Type>::operator[]" + "(const label) const" + ) << "index (" << ii << ") overflow" << nl + << exit(FatalError); + } + + return List<scalarField >::operator[](ii); +} + + +template<class Type> +bool Foam::interpolationLookUpTable<Type>::found(const word& fieldName) const +{ + return fieldIndices_.found(fieldName); +} + + +template<class Type> +const Foam::scalarList& +Foam::interpolationLookUpTable<Type>::lookUp(const scalar retvals) +{ + const label lo = index(retvals); + findHi(lo, retvals); + return interpOutput_; +} + + +template<class Type> +void Foam::interpolationLookUpTable<Type>::findHi +( + const label lo, + const scalar retvals +) +{ + forAll(outputIndices_,j) + { + scalar tmp = 0; + label ofield = outputIndices_[j]; + scalar baseValue = List<scalarField>::operator[](ofield).operator[](lo); + + forAll(entryIndices_,i) + { + if (checkRange(retvals,entryIndices_[i])) + { + label dim = 1; + + label hi = Foam::min(lo + dim, (*this)[0].size() - 1); + + tmp += interpolate(lo, hi, retvals, ofield, entryIndices_[i]) + - baseValue; + } + interpOutput_[entryIndices_[i]] = retvals; + } + + tmp += baseValue; + interpOutput_[outputIndices_[j]] = tmp; + } +} + + +// ************************************************************************* // diff --git a/src/thermophysicalModels/radiation/radiationModel/fvDOM/interpolationLookUpTable/interpolationLookUpTable.H b/src/thermophysicalModels/radiation/radiationModel/fvDOM/interpolationLookUpTable/interpolationLookUpTable.H new file mode 100755 index 0000000000000000000000000000000000000000..d2518d4e02e75d787518e76f95a2f906f5d43128 --- /dev/null +++ b/src/thermophysicalModels/radiation/radiationModel/fvDOM/interpolationLookUpTable/interpolationLookUpTable.H @@ -0,0 +1,234 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Class + Foam::interpolationLookUpTable + +Description + A list of lists. Interpolates based on the first dimension. + The values must be positive and monotonically increasing in each dimension + +Note + - Accessing an empty list results in an error. + - Accessing a list with a single element always returns the same value. + +SourceFiles + interpolationLookUpTable.C + +\*---------------------------------------------------------------------------*/ + +#ifndef interpolationLookUpTable_H +#define interpolationLookUpTable_H + +#include "List.H" +#include "ListOps.H" +#include "scalarField.H" +#include "HashTable.H" +#include "IOdictionary.H" +#include "fvCFD.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class interpolationLookUpTable Declaration +\*---------------------------------------------------------------------------*/ + +template<class Type> +class interpolationLookUpTable +: + public List<scalarField> +{ +private: + + // Private data + + //- File name + fileName fileName_; + + //- Table dimensions + List<label> dim_; + + //- Min on each dimension + List<scalar> min_; + + //- Deltas on each dimension + List<scalar> delta_; + + //- Maximum on each dimension + List<scalar> max_; + + //- Dictionary entries + List<dictionary> entries_; + + //- Output dictionaries + List<dictionary> output_; + + //- Input indices from the look up table + List<label> entryIndices_; + + //- Output Indeces from the Look Up Table + List<label> outputIndices_; + + //- Field names and indices + HashTable<label> fieldIndices_; + + //- Output list containing input and interpolation values of outputs + List<scalar> interpOutput_; + + + // Private Member Functions + + //- Read the table of data from file + void readTable(const word& instance, const fvMesh& mesh); + + //- Dimension table from dictionaries input and output + void dimensionTable(); + + //- Find table index by scalarList + label index(const List<scalar>&, const bool lastDim=true) const; + + //- Find table index by scalar + label index(const scalar) const; + + //- Check range of lookup value + bool checkRange(const scalar, const label) const; + + //- Interpolate function return an scalar + scalar interpolate + ( + const label lo, + const label hi, + const scalar lookUpValue, + const label ofield, + const label interfield + ) const; + + // Check list is monotonically increasing + void check() const; + + // find hi index, interpolate and populate interpOutput_ + void findHi(const label lo, const scalar retvals); + + +public: + + // Constructors + + //- Construct null + interpolationLookUpTable(); + + //- Construct given the name of the file containing the table of data + interpolationLookUpTable + ( + const fileName& fn, + const word& instance, + const fvMesh& mesh + ); + + //- Construct from dictionary + interpolationLookUpTable(const dictionary& dict); + + //- Construct copy + interpolationLookUpTable(const interpolationLookUpTable& interpTable); + + + // Member Functions + + //- Return true if the filed exists in the table + bool found(const word& fieldName) const; + + //- Return the output list given a single input scalar + const List<scalar>& lookUp(const scalar); + + //- Write Look Up Table to filename. + void write + ( + Ostream& os, + const fileName& fn, + const word& instance, + const fvMesh& mesh + ) const; + + + // Access + + //- Return the index of a field by name + inline label findFieldIndex(const word& fieldName) const; + + //- Return const access to the output dictionaries + inline const List<dictionary>& output() const; + + //- Return const access tp the dictionary entries + inline const List<dictionary>& entries() const; + + //- Return const access to the list of min dimensions + inline const List<scalar>& min() const; + + //- Return const access to the list of dimensions + inline const List<label>& dim() const; + + //- Return const access to the deltas in each dimension + inline const List<scalar>& delta() const; + + //- Return const access to the list of max dimensions + inline const List<scalar>& max() const; + + //- Return const access to the table name + inline word tableName() const; + + + // Member Operators + + //- Return an element of constant List<scalar, Type> + const scalarField& operator[](const label) const; + + //- Return an element of List<scalar, Type> + scalarField& operator[](const label); + +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "interpolationLookUpTableI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + + +#ifdef NoRepository +# include "interpolationLookUpTable.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/thermophysicalModels/radiation/radiationModel/fvDOM/interpolationLookUpTable/interpolationLookUpTableI.H b/src/thermophysicalModels/radiation/radiationModel/fvDOM/interpolationLookUpTable/interpolationLookUpTableI.H new file mode 100644 index 0000000000000000000000000000000000000000..5829db3148e534ecdbcaaeb797427426db55acd0 --- /dev/null +++ b/src/thermophysicalModels/radiation/radiationModel/fvDOM/interpolationLookUpTable/interpolationLookUpTableI.H @@ -0,0 +1,93 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +\*---------------------------------------------------------------------------*/ + +template<class Type> +inline Foam::label +Foam::interpolationLookUpTable<Type>::findFieldIndex +( + const word& fieldName +) const +{ + return fieldIndices_[fieldName]; +} + + +template<class Type> +inline const Foam::List<Foam::dictionary>& +Foam::interpolationLookUpTable<Type>::output() const +{ + return output_; +} + + +template<class Type> +inline const Foam::List<Foam::dictionary>& +Foam::interpolationLookUpTable<Type>::entries() const +{ + return entries_; +} + + +template<class Type> +inline const Foam::List<Foam::scalar>& +Foam::interpolationLookUpTable<Type>::min() const +{ + return min_; +} + + +template<class Type> +inline const Foam::List<Foam::label>& +Foam::interpolationLookUpTable<Type>::dim() const +{ + return dim_; +} + + +template<class Type> +inline const Foam::List<Foam::scalar>& +Foam::interpolationLookUpTable<Type>::delta() const +{ + return delta_; +} + + +template<class Type> +inline const Foam::List<Foam::scalar>& +Foam::interpolationLookUpTable<Type>::max() const +{ + return max_; +} + + +template<class Type> +inline Foam::word Foam::interpolationLookUpTable<Type>::tableName() const +{ + return fileName_.name(); +} + + +// ************************************************************************* // diff --git a/src/thermophysicalModels/radiation/radiationModel/fvDOM/radiativeIntensityRay/radiativeIntensityRay.C b/src/thermophysicalModels/radiation/radiationModel/fvDOM/radiativeIntensityRay/radiativeIntensityRay.C new file mode 100644 index 0000000000000000000000000000000000000000..96090a3ef27c7e8f9f285d81e5379dad8fb4b6dd --- /dev/null +++ b/src/thermophysicalModels/radiation/radiationModel/fvDOM/radiativeIntensityRay/radiativeIntensityRay.C @@ -0,0 +1,222 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +\*---------------------------------------------------------------------------*/ + +#include "radiativeIntensityRay.H" +#include "fvm.H" +#include "fvDOM.H" + +#include "absorptionEmissionModel.H" +#include "scatterModel.H" +#include "mathematicalConstants.H" +#include "radiationConstants.H" +#include "radiationModel.H" +#include "Vector2D.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +Foam::label Foam::radiation::radiativeIntensityRay::rayId = 0; + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::radiation::radiativeIntensityRay::radiativeIntensityRay +( + const fvDOM& dom, + const fvMesh& mesh, + const scalar phi, + const scalar theta, + const scalar deltaPhi, + const scalar deltaTheta, + const label nLambda, + const absorptionEmissionModel& absorptionEmission, + const blackBodyEmission& blackBody +) +: + dom_(dom), + mesh_(mesh), + absorptionEmission_(absorptionEmission), + blackBody_(blackBody), + I_ + ( + IOobject + ( + "I" + name(rayId), + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_, + dimensionedScalar("I", dimMass/pow3(dimTime), 0.0) + ), + Qr_ + ( + IOobject + ( + "Qr" + name(rayId), + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_, + dimensionedScalar("Qr", dimMass/pow3(dimTime), 0.0) + ), + d_(vector::zero), + dAve_(vector::zero), + theta_(theta), + phi_(phi), + omega_(0.0), + nLambda_(nLambda), + ILambda_(nLambda) +{ + scalar sinTheta = Foam::sin(theta); + scalar cosTheta = Foam::cos(theta); + scalar sinPhi = Foam::sin(phi); + scalar cosPhi = Foam::cos(phi); + + omega_ = 2.0*sinTheta*Foam::sin(deltaTheta/2.0)*deltaPhi; + d_ = vector(sinTheta*sinPhi, sinTheta*cosPhi, cosTheta); + dAve_ = vector + ( + sinPhi + *Foam::sin(0.5*deltaPhi) + *(deltaTheta - Foam::cos(2.0*theta) + *Foam::sin(deltaTheta)), + cosPhi + *Foam::sin(0.5*deltaPhi) + *(deltaTheta - Foam::cos(2.0*theta) + *Foam::sin(deltaTheta)), + 0.5*deltaPhi*Foam::sin(2.0*theta)*Foam::sin(deltaTheta) + ); + + forAll(ILambda_, i) + { + IOobject IHeader + ( + "ILambda_" + name(rayId) + "_" + name(i), + mesh_.time().timeName(), + mesh_, + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ); + + // check if field exists and can be read + if (IHeader.headerOk()) + { + ILambda_.set + ( + i, + new volScalarField(IHeader, mesh_) + ); + } + else + { + volScalarField IDefault + ( + IOobject + ( + "IDefault", + mesh_.time().timeName(), + mesh_, + IOobject::MUST_READ, + IOobject::NO_WRITE + ), + mesh_ + ); + + ILambda_.set + ( + i, + new volScalarField(IHeader, IDefault) + ); + } + } + rayId++; +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::radiation::radiativeIntensityRay::~radiativeIntensityRay() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +Foam::scalar Foam::radiation::radiativeIntensityRay::correct() +{ + // reset boundary heat flux to zero + Qr_ = dimensionedScalar("zero", dimMass/pow3(dimTime), 0.0); + + scalar maxResidual = -GREAT; + + forAll(ILambda_, lambdaI) + { + const volScalarField& k = dom_.aLambda(lambdaI); + + surfaceScalarField Ji = dAve_ & mesh_.Sf(); + + fvScalarMatrix IiEq + ( + fvm::div(Ji, ILambda_[lambdaI], " div(Ji,Ii_h)") + + fvm::Sp(k*omega_, ILambda_[lambdaI]) + == + 1.0/Foam::mathematicalConstant::pi + *( + k*omega_*blackBody_.bLambda(lambdaI) + + absorptionEmission_.ECont(lambdaI) + ) + ); + + IiEq.relax(); + + scalar eqnResidual = solve + ( + IiEq, + mesh_.solver("Ii") + ).initialResidual(); + + maxResidual = max(eqnResidual, maxResidual); + + } + + return maxResidual; +} + + +void Foam::radiation::radiativeIntensityRay::addIntensity() +{ + I_ = dimensionedScalar("zero", dimMass/pow3(dimTime), 0.0); + + forAll(ILambda_, lambdaI) + { + I_ += absorptionEmission_.addIntensity(lambdaI, ILambda_[lambdaI]); + } +} + + +// ************************************************************************* // diff --git a/src/thermophysicalModels/radiation/radiationModel/fvDOM/radiativeIntensityRay/radiativeIntensityRay.H b/src/thermophysicalModels/radiation/radiationModel/fvDOM/radiativeIntensityRay/radiativeIntensityRay.H new file mode 100644 index 0000000000000000000000000000000000000000..27fbf1bc71ca8bc6023a997b31a701b201d4b1c1 --- /dev/null +++ b/src/thermophysicalModels/radiation/radiationModel/fvDOM/radiativeIntensityRay/radiativeIntensityRay.H @@ -0,0 +1,203 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Class + Foam::radiation::radiativeIntensityRay + +Description + Radiation intensity for a ray in a given direction + +SourceFiles + radiativeIntensityRay.C + +\*---------------------------------------------------------------------------*/ + +#ifndef radiativeIntensityRay_H +#define radiativeIntensityRay_H + +#include "absorptionEmissionModel.H" +#include "blackBodyEmission.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace radiation +{ + +// Forward declaration of classes +class fvDOM; + +/*---------------------------------------------------------------------------*\ + Class radiativeIntensityRay Declaration +\*---------------------------------------------------------------------------*/ + +class radiativeIntensityRay +{ + // Private data + + //- Refence to the owner fvDOM object + const fvDOM& dom_; + + //- Reference to the mesh + const fvMesh& mesh_; + + //- Absorption/emission model + const absorptionEmissionModel& absorptionEmission_; + + //- Black body + const blackBodyEmission& blackBody_; + + //- Total radiative intensity / [W/m2] + volScalarField I_; + + //- Total radiative heat flux on boundary + volScalarField Qr_; + + //- Direction + vector d_; + + //- Average direction vector inside the solid angle + vector dAve_; + + //- Theta angle + scalar theta_; + + //- Phi angle + scalar phi_; + + //- Solid angle + scalar omega_; + + //- Number of wavelengths/bands + label nLambda_; + + //- List of pointers to radiative intensity fields for given wavelengths + PtrList<volScalarField> ILambda_; + + //- Global ray id - incremented in constructor + static label rayId; + + + // Private member functions + + //- Disallow default bitwise copy construct + radiativeIntensityRay(const radiativeIntensityRay&); + + //- Disallow default bitwise assignment + void operator=(const radiativeIntensityRay&); + + +public: + + // Constructors + + //- Construct form components + radiativeIntensityRay + ( + const fvDOM& dom, + const fvMesh& mesh, + const scalar phi, + const scalar theta, + const scalar deltaPhi, + const scalar deltaTheta, + const label lambda, + const absorptionEmissionModel& absEmmModel_, + const blackBodyEmission& blackBody + ); + + + // Destructor + ~radiativeIntensityRay(); + + + // Member functions + + // Edit + + //- Update radiative intensity on i direction + scalar correct(); + + //- Initialise the ray in i direction + void init + ( + const scalar phi, + const scalar theta, + const scalar deltaPhi, + const scalar deltaTheta, + const scalar lambda + ); + + //- Add radiative intensities from all the bands + void addIntensity(); + + + // Access + + //- Return intensity + inline const volScalarField& I() const; + + //- Return const access to the boundary heat flux + inline const volScalarField& Qr() const; + + //- Return non-const access to the boundary heat flux + inline volScalarField& Qr(); + + //- Return direction + inline const vector& d() const; + + //- Return the average vector inside the solid angle + inline const vector& dAve() const; + + //- Return the number of bands + inline scalar nLambda() const; + + //- Return the phi angle + inline scalar phi() const; + + //- Return the theta angle + inline scalar theta() const; + + //- Return the solid angle + inline scalar omega() const; + + //- Return the radiative intensity for a given wavelength + inline const volScalarField& ILambda(const label lambdaI) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace radiation +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "radiativeIntensityRayI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/thermophysicalModels/radiation/radiationModel/fvDOM/radiativeIntensityRay/radiativeIntensityRayI.H b/src/thermophysicalModels/radiation/radiationModel/fvDOM/radiativeIntensityRay/radiativeIntensityRayI.H new file mode 100644 index 0000000000000000000000000000000000000000..0efd423a6dc08efb6a113900e5ac8c6f43b44874 --- /dev/null +++ b/src/thermophysicalModels/radiation/radiationModel/fvDOM/radiativeIntensityRay/radiativeIntensityRayI.H @@ -0,0 +1,90 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +\*---------------------------------------------------------------------------*/ + +inline const Foam::volScalarField& Foam::radiation::radiativeIntensityRay::I() const +{ + return I_; +} + + +inline const Foam::volScalarField& Foam::radiation::radiativeIntensityRay::Qr() const +{ + return Qr_; +} + + +inline Foam::volScalarField& Foam::radiation::radiativeIntensityRay::Qr() +{ + return Qr_; +} + + +inline const Foam::vector& Foam::radiation::radiativeIntensityRay::d() const +{ + return d_; +} + + +inline const Foam::vector& Foam::radiation::radiativeIntensityRay::dAve() const +{ + return dAve_; +} + + +inline Foam::scalar Foam::radiation::radiativeIntensityRay::nLambda() const +{ + return nLambda_; +} + + +inline Foam::scalar Foam::radiation::radiativeIntensityRay::phi() const +{ + return phi_; +} + + +inline Foam::scalar Foam::radiation::radiativeIntensityRay::theta() const +{ + return theta_; +} + + +inline Foam::scalar Foam::radiation::radiativeIntensityRay::omega() const +{ + return omega_; +} + + +inline const Foam::volScalarField& Foam::radiation::radiativeIntensityRay::ILambda +( + const label lambdaI +) const +{ + return ILambda_[lambdaI]; +} + + +// ************************************************************************* // diff --git a/src/thermophysicalModels/radiation/radiationModel/noRadiation/noRadiation.C b/src/thermophysicalModels/radiation/radiationModel/noRadiation/noRadiation.C index ca814fe305a7fca33ce3fe564e35b49ffb12dfcd..fc6fbc549a3e3237ba7238436db5dbc8f93e2d8f 100644 --- a/src/thermophysicalModels/radiation/radiationModel/noRadiation/noRadiation.C +++ b/src/thermophysicalModels/radiation/radiationModel/noRadiation/noRadiation.C @@ -50,10 +50,9 @@ namespace Foam // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // -// Construct from components Foam::radiation::noRadiation::noRadiation(const volScalarField& T) : - radiationModel(typeName, T) + radiationModel(T) {} @@ -71,7 +70,7 @@ bool Foam::radiation::noRadiation::read() } -void Foam::radiation::noRadiation::correct() +void Foam::radiation::noRadiation::calculate() { // Do nothing } diff --git a/src/thermophysicalModels/radiation/radiationModel/noRadiation/noRadiation.H b/src/thermophysicalModels/radiation/radiationModel/noRadiation/noRadiation.H index f94617e8fc2ad9e0dcb8b79c22f82c590e253a80..2527ab1211fac521aa8d55b8fb4a4b90ca873316 100644 --- a/src/thermophysicalModels/radiation/radiationModel/noRadiation/noRadiation.H +++ b/src/thermophysicalModels/radiation/radiationModel/noRadiation/noRadiation.H @@ -54,7 +54,6 @@ class noRadiation : public radiationModel { - // Private member functions //- Disallow default bitwise copy construct @@ -76,17 +75,16 @@ public: noRadiation(const volScalarField& T); - // Destructor - - ~noRadiation(); + //- Destructor + virtual ~noRadiation(); // Member functions // Edit - //- Update radiation source - void correct(); + //- Solve radiation equation(s) + void calculate(); //- Read radiationProperties dictionary bool read(); diff --git a/src/thermophysicalModels/radiation/radiationModel/radiationModel/newRadiationModel.C b/src/thermophysicalModels/radiation/radiationModel/radiationModel/newRadiationModel.C index 9822578114692dcfbcd05db74144e421eae87507..c7840d9433599e97c0435390dc694b1fb134676f 100644 --- a/src/thermophysicalModels/radiation/radiationModel/radiationModel/newRadiationModel.C +++ b/src/thermophysicalModels/radiation/radiationModel/radiationModel/newRadiationModel.C @@ -52,8 +52,8 @@ autoPtr<radiationModel> radiationModel::New IOobject ( "radiationProperties", - T.time().constant(), - T.db(), + T.mesh().time().constant(), + T.mesh().objectRegistry::db(), IOobject::MUST_READ, IOobject::NO_WRITE ) @@ -75,7 +75,7 @@ autoPtr<radiationModel> radiationModel::New "radiationModel::New(const volScalarField&)" ) << "Unknown radiationModel type " << radiationModelTypeName << nl << nl - << "Valid radiationModel types are :" << nl + << "Valid radiationModel types are:" << nl << dictionaryConstructorTablePtr_->toc() << exit(FatalError); } @@ -86,7 +86,7 @@ autoPtr<radiationModel> radiationModel::New // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -} // End namespace radiation +} // End radiation } // End namespace Foam // ************************************************************************* // diff --git a/src/thermophysicalModels/radiation/radiationModel/radiationModel/radiationModel.C b/src/thermophysicalModels/radiation/radiationModel/radiationModel/radiationModel.C index adc5c53558d63697d7220a54692e283329eabfe3..131221c308e3a74dcecf93b88af6a0bb45f9d872 100644 --- a/src/thermophysicalModels/radiation/radiationModel/radiationModel/radiationModel.C +++ b/src/thermophysicalModels/radiation/radiationModel/radiationModel/radiationModel.C @@ -43,6 +43,30 @@ namespace Foam // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // +Foam::radiation::radiationModel::radiationModel(const volScalarField& T) +: + IOdictionary + ( + IOobject + ( + "radiationProperties", + T.time().constant(), + T.mesh().objectRegistry::db(), + IOobject::MUST_READ, + IOobject::NO_WRITE + ) + ), + mesh_(T.mesh()), + time_(T.time()), + T_(T), + radiation_(false), + coeffs_(dictionary::null), + solverFreq_(0), + absorptionEmission_(NULL), + scatter_(NULL) +{} + + Foam::radiation::radiationModel::radiationModel ( const word& type, @@ -55,18 +79,22 @@ Foam::radiation::radiationModel::radiationModel ( "radiationProperties", T.time().constant(), - T.db(), + T.mesh().objectRegistry::db(), IOobject::MUST_READ, IOobject::NO_WRITE ) ), - T_(T), mesh_(T.mesh()), + time_(T.time()), + T_(T), radiation_(lookup("radiation")), - radiationModelCoeffs_(subDict(type + "Coeffs")), + coeffs_(subDict(type + "Coeffs")), + solverFreq_(readLabel(lookup("solverFreq"))), absorptionEmission_(absorptionEmissionModel::New(*this, mesh_)), scatter_(scatterModel::New(*this, mesh_)) -{} +{ + solverFreq_ = max(1, solverFreq_); +} // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * // @@ -82,7 +110,7 @@ bool Foam::radiation::radiationModel::read() if (regIOobject::read()) { lookup("radiation") >> radiation_; - radiationModelCoeffs_ = subDict(type() + "Coeffs"); + coeffs_ = subDict(type() + "Coeffs"); return true; } @@ -93,6 +121,20 @@ bool Foam::radiation::radiationModel::read() } +void Foam::radiation::radiationModel::correct() +{ + if (!radiation_) + { + return; + } + + if ((time_.timeIndex() == 0) || (time_.timeIndex() % solverFreq_ == 0)) + { + calculate(); + } +} + + Foam::tmp<Foam::fvScalarMatrix> Foam::radiation::radiationModel::Sh ( basicThermo& thermo diff --git a/src/thermophysicalModels/radiation/radiationModel/radiationModel/radiationModel.H b/src/thermophysicalModels/radiation/radiationModel/radiationModel/radiationModel.H index 4fc4e25c43874d656a5e620150f5e37e5ac920ed..4d01dee1cf158d11c2ce49b21cf3d16aa3934d6c 100644 --- a/src/thermophysicalModels/radiation/radiationModel/radiationModel/radiationModel.H +++ b/src/thermophysicalModels/radiation/radiationModel/radiationModel/radiationModel.H @@ -28,7 +28,6 @@ Namespace Description Namespace for radiation modelling - Class Foam::radiation::radiationModel @@ -49,6 +48,7 @@ SourceFiles #include "volFields.H" #include "basicThermo.H" #include "fvMatrices.H" +#include "blackBodyEmission.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -57,33 +57,40 @@ namespace Foam namespace radiation { +// Forward declaration of classes class absorptionEmissionModel; class scatterModel; /*---------------------------------------------------------------------------*\ - Class radiationModel Declaration + Class radiationModel Declaration \*---------------------------------------------------------------------------*/ class radiationModel : public IOdictionary { - protected: // Protected data + //- Reference to the mesh database + const fvMesh& mesh_; + + //- Reference to the time database + const Time& time_; + //- Reference to the temperature field const volScalarField& T_; - //- Reference to the mesh - const fvMesh& mesh_; - //- Model specific dictionary input parameters Switch radiation_; //- Radiation model dictionary - dictionary radiationModelCoeffs_; + dictionary coeffs_; + + //- Radiation solver frequency - number flow solver iterations per + // radiation solver iteration + label solverFreq_; // References to the radiation sub-models @@ -128,34 +135,32 @@ public: // Constructors + //- Null constructor + radiationModel(const volScalarField& T); + //- Construct from components - radiationModel - ( - const word& type, - const volScalarField& T - ); + radiationModel(const word& type, const volScalarField& T); // Selectors //- Return a reference to the selected radiation model - static autoPtr<radiationModel> New - ( - const volScalarField& T - ); - + static autoPtr<radiationModel> New(const volScalarField& T); - // Destructor - virtual ~radiationModel(); + //- Destructor + virtual ~radiationModel(); // Member Functions // Edit + //- Main update/correction routine + virtual void correct(); + //- Solve radiation equation(s) - virtual void correct() = 0; + virtual void calculate() = 0; //- Read radiationProperties dictionary virtual bool read() = 0; @@ -170,10 +175,7 @@ public: virtual tmp<DimensionedField<scalar, volMesh> > Ru() const = 0; //- Enthalpy source term - virtual tmp<fvScalarMatrix> Sh - ( - basicThermo& thermo - ) const; + virtual tmp<fvScalarMatrix> Sh(basicThermo& thermo) const; }; diff --git a/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/absorptionEmissionModel/absorptionEmissionModel.C b/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/absorptionEmissionModel/absorptionEmissionModel.C index 84e65549ee43abcd85a09721a6b917dd860043ce..f67d0d33891781435ec8fcbd97d4301eea711b60 100644 --- a/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/absorptionEmissionModel/absorptionEmissionModel.C +++ b/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/absorptionEmissionModel/absorptionEmissionModel.C @@ -59,14 +59,14 @@ Foam::radiation::absorptionEmissionModel::~absorptionEmissionModel() // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // Foam::tmp<Foam::volScalarField> -Foam::radiation::absorptionEmissionModel::a() const +Foam::radiation::absorptionEmissionModel::a(const label bandI) const { - return aDisp() + aCont(); + return aDisp(bandI) + aCont(bandI); } Foam::tmp<Foam::volScalarField> -Foam::radiation::absorptionEmissionModel::aCont() const +Foam::radiation::absorptionEmissionModel::aCont(const label bandI) const { return tmp<volScalarField> ( @@ -89,7 +89,7 @@ Foam::radiation::absorptionEmissionModel::aCont() const Foam::tmp<Foam::volScalarField> -Foam::radiation::absorptionEmissionModel::aDisp() const +Foam::radiation::absorptionEmissionModel::aDisp(const label bandI) const { return tmp<volScalarField> ( @@ -112,14 +112,14 @@ Foam::radiation::absorptionEmissionModel::aDisp() const Foam::tmp<Foam::volScalarField> -Foam::radiation::absorptionEmissionModel::e() const +Foam::radiation::absorptionEmissionModel::e(const label bandI) const { - return eDisp() + eCont(); + return eDisp(bandI) + eCont(bandI); } Foam::tmp<Foam::volScalarField> -Foam::radiation::absorptionEmissionModel::eCont() const +Foam::radiation::absorptionEmissionModel::eCont(const label bandI) const { return tmp<volScalarField> ( @@ -142,7 +142,7 @@ Foam::radiation::absorptionEmissionModel::eCont() const Foam::tmp<Foam::volScalarField> -Foam::radiation::absorptionEmissionModel::eDisp() const +Foam::radiation::absorptionEmissionModel::eDisp(const label bandI) const { return tmp<volScalarField> ( @@ -165,14 +165,14 @@ Foam::radiation::absorptionEmissionModel::eDisp() const Foam::tmp<Foam::volScalarField> -Foam::radiation::absorptionEmissionModel::E() const +Foam::radiation::absorptionEmissionModel::E(const label bandI) const { - return EDisp() + ECont(); + return EDisp(bandI) + ECont(bandI); } Foam::tmp<Foam::volScalarField> -Foam::radiation::absorptionEmissionModel::ECont() const +Foam::radiation::absorptionEmissionModel::ECont(const label bandI) const { return tmp<volScalarField> ( @@ -195,7 +195,7 @@ Foam::radiation::absorptionEmissionModel::ECont() const Foam::tmp<Foam::volScalarField> -Foam::radiation::absorptionEmissionModel::EDisp() const +Foam::radiation::absorptionEmissionModel::EDisp(const label bandI) const { return tmp<volScalarField> ( @@ -217,4 +217,45 @@ Foam::radiation::absorptionEmissionModel::EDisp() const } +Foam::label Foam::radiation::absorptionEmissionModel::nBands() const +{ + return pTraits<label>::one; +} + + +const Foam::Vector2D<Foam::scalar>& +Foam::radiation::absorptionEmissionModel::bands(const label n) const +{ + return Vector2D<scalar>::one; +} + + +bool Foam::radiation::absorptionEmissionModel::isGrey() const +{ + return false; +} + + +Foam::tmp<Foam::volScalarField> +Foam::radiation::absorptionEmissionModel::addIntensity +( + const label rayI, + const volScalarField& ILambda +) const +{ + return ILambda; +} + + +void Foam::radiation::absorptionEmissionModel::correct +( + volScalarField& a, + PtrList<volScalarField>& aj +) const +{ + a.internalField() = this->a(); + aj[0].internalField() = a.internalField(); +} + + // ************************************************************************* // diff --git a/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/absorptionEmissionModel/absorptionEmissionModel.H b/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/absorptionEmissionModel/absorptionEmissionModel.H index 25596ba4376cf5cb44dba2a68fbf17af91d9e8c7..d7a0230b16a7ee6ca45ebc1ddce3ad8292276234 100644 --- a/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/absorptionEmissionModel/absorptionEmissionModel.H +++ b/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/absorptionEmissionModel/absorptionEmissionModel.H @@ -38,6 +38,7 @@ Description #include "autoPtr.H" #include "runTimeSelectionTables.H" #include "volFields.H" +#include "Vector2D.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -95,57 +96,94 @@ public: //- Selector - - static autoPtr<absorptionEmissionModel> New - ( - const dictionary& dict, - const fvMesh& mesh - ); + static autoPtr<absorptionEmissionModel> New + ( + const dictionary& dict, + const fvMesh& mesh + ); //- Destructor - - virtual ~absorptionEmissionModel(); + virtual ~absorptionEmissionModel(); // Member Functions // Access + //- Reference to the mesh + inline const fvMesh& mesh() const + { + return mesh_; + } + + //- Reference to the dictionary + inline const dictionary& dict() const + { + return dict_; + } + + // Absorption coefficient //- Absorption coefficient (net) - virtual tmp<volScalarField> a() const; + virtual tmp<volScalarField> a(const label bandI = 0) const; //- Absorption coefficient for continuous phase - virtual tmp<volScalarField> aCont() const; + virtual tmp<volScalarField> aCont(const label bandI = 0) const; //- Absorption coefficient for dispersed phase - virtual tmp<volScalarField> aDisp() const; + virtual tmp<volScalarField> aDisp(const label bandI = 0) const; // Emission coefficient //- Emission coefficient (net) - virtual tmp<volScalarField> e() const; + virtual tmp<volScalarField> e(const label bandI = 0) const; //- Return emission coefficient for continuous phase - virtual tmp<volScalarField> eCont() const; + virtual tmp<volScalarField> eCont(const label bandI = 0) const; //- Return emission coefficient for dispersed phase - virtual tmp<volScalarField> eDisp() const; + virtual tmp<volScalarField> eDisp(const label bandI = 0) const; // Emission contribution //- Emission contribution (net) - virtual tmp<volScalarField> E() const; + virtual tmp<volScalarField> E(const label bandI = 0) const; //- Emission contribution for continuous phase - virtual tmp<volScalarField> ECont() const; + virtual tmp<volScalarField> ECont(const label bandI = 0) const; //- Emission contribution for dispersed phase - virtual tmp<volScalarField> EDisp() const; + virtual tmp<volScalarField> EDisp(const label bandI = 0) const; + + + //- Const access to the number of bands - defaults to 1 for grey + // absorption/emission + virtual label nBands() const; + + //- Const access to the bands - defaults to Vector2D::one for grey + // absorption/emission + virtual const Vector2D<scalar>& bands(const label n) const; + + //- Flag for whether the absorption/emission is for a grey gas + virtual bool isGrey() const; + + //- Add radiative intensity for ray i + virtual tmp<volScalarField> addIntensity + ( + const label rayI, + const volScalarField& ILambda + ) const; + + //- Correct absorption coefficients + virtual void correct + ( + volScalarField& a, + PtrList<volScalarField>& aj + ) const; }; diff --git a/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/binaryAbsorptionEmission/binaryAbsorptionEmission.H b/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/binaryAbsorptionEmission/binaryAbsorptionEmission.H index 4aab30405fa6ee8c1f6645815a627d5b19718aba..68ad204b84a3dab0d32d02ab65937fc5e7bee28d 100644 --- a/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/binaryAbsorptionEmission/binaryAbsorptionEmission.H +++ b/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/binaryAbsorptionEmission/binaryAbsorptionEmission.H @@ -53,7 +53,6 @@ class binaryAbsorptionEmission : public absorptionEmissionModel { - // Private data //- Coefficients dictionary @@ -83,8 +82,7 @@ public: // Destructor - - ~binaryAbsorptionEmission(); + virtual ~binaryAbsorptionEmission(); // Member Operators diff --git a/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/constantAbsorptionEmission/constantAbsorptionEmission.C b/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/constantAbsorptionEmission/constantAbsorptionEmission.C index 1ab215c6b7fee4679587db4f9cbf2ca841b96515..8809bf03d8dbbc4e3423ea85b6f849de8833cb33 100644 --- a/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/constantAbsorptionEmission/constantAbsorptionEmission.C +++ b/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/constantAbsorptionEmission/constantAbsorptionEmission.C @@ -70,7 +70,7 @@ Foam::radiation::constantAbsorptionEmission::~constantAbsorptionEmission() // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // Foam::tmp<Foam::volScalarField> -Foam::radiation::constantAbsorptionEmission::aCont() const +Foam::radiation::constantAbsorptionEmission::aCont(const label bandI) const { tmp<volScalarField> ta ( @@ -95,7 +95,7 @@ Foam::radiation::constantAbsorptionEmission::aCont() const Foam::tmp<Foam::volScalarField> -Foam::radiation::constantAbsorptionEmission::eCont() const +Foam::radiation::constantAbsorptionEmission::eCont(const label bandI) const { tmp<volScalarField> te ( @@ -120,7 +120,7 @@ Foam::radiation::constantAbsorptionEmission::eCont() const Foam::tmp<Foam::volScalarField> -Foam::radiation::constantAbsorptionEmission::ECont() const +Foam::radiation::constantAbsorptionEmission::ECont(const label bandI) const { tmp<volScalarField> tE ( diff --git a/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/constantAbsorptionEmission/constantAbsorptionEmission.H b/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/constantAbsorptionEmission/constantAbsorptionEmission.H index 3c54ce29c2eb83d86ba15ebd8b917f2c37ce9a73..f4e7656b027b9f2a42ca7fe16d07251956975205 100644 --- a/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/constantAbsorptionEmission/constantAbsorptionEmission.H +++ b/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/constantAbsorptionEmission/constantAbsorptionEmission.H @@ -54,7 +54,6 @@ class constantAbsorptionEmission : public absorptionEmissionModel { - // Private data //- Absorption model dictionary @@ -87,8 +86,7 @@ public: // Destructor - - ~constantAbsorptionEmission(); + virtual ~constantAbsorptionEmission(); // Member Operators @@ -98,19 +96,27 @@ public: // Absorption coefficient //- Absorption coefficient for continuous phase - tmp<volScalarField> aCont() const; + tmp<volScalarField> aCont(const label bandI = 0) const; // Emission coefficient //- Emission coefficient for continuous phase - tmp<volScalarField> eCont() const; + tmp<volScalarField> eCont(const label bandI = 0) const; // Emission contribution //- Emission contribution for continuous phase - tmp<volScalarField> ECont() const; + tmp<volScalarField> ECont(const label bandI = 0) const; + + + // Member Functions + + inline bool isGrey() const + { + return true; + } }; diff --git a/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/greyMeanAbsorptionEmission/greyMeanAbsorptionEmission.C b/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/greyMeanAbsorptionEmission/greyMeanAbsorptionEmission.C new file mode 100644 index 0000000000000000000000000000000000000000..96eb031fdd0991d13734e333963f3ef43c592c67 --- /dev/null +++ b/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/greyMeanAbsorptionEmission/greyMeanAbsorptionEmission.C @@ -0,0 +1,272 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +\*---------------------------------------------------------------------------*/ + +#include "greyMeanAbsorptionEmission.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + namespace radiation + { + defineTypeNameAndDebug(greyMeanAbsorptionEmission, 0); + + addToRunTimeSelectionTable + ( + absorptionEmissionModel, + greyMeanAbsorptionEmission, + dictionary + ); + } +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::radiation::greyMeanAbsorptionEmission::greyMeanAbsorptionEmission +( + const dictionary& dict, + const fvMesh& mesh +) +: + absorptionEmissionModel(dict, mesh), + coeffsDict_((dict.subDict(typeName + "Coeffs"))), + speciesNames_(0), + specieIndex_(0), + lookUpTable_ + ( + fileName(coeffsDict_.lookup("lookUpTableFileName")), + mesh.time().constant(), + mesh + ), + thermo_(mesh.lookupObject<basicThermo>("thermophysicalProperties")), + EhrrCoeff_(readScalar(coeffsDict_.lookup("EhrrCoeff"))), + Yj_(nSpecies_) +{ + label nFunc = 0; + const dictionary& functionDicts = dict.subDict(typeName + "Coeffs"); + + forAllConstIter(dictionary, functionDicts, iter) + { + // safety: + if (!iter().isDict()) + { + continue; + } + const word& key = iter().keyword(); + speciesNames_.insert(key, nFunc); + const dictionary& dict = iter().dict(); + coeffs_[nFunc].initialise(dict); + nFunc++; + } + + // Check that all the species on the dictionary are present in the + // look-up table and save the corresponding indices of the look-up table + + label j = 0; + forAllConstIter(HashTable<label>, speciesNames_, iter) + { + if (mesh.foundObject<volScalarField>("ft")) + { + if (lookUpTable_.found(iter.key())) + { + label index = lookUpTable_.findFieldIndex(iter.key()); + + Info<< "specie: " << iter.key() << " found on look-up table " + << " with index: " << index << endl; + + specieIndex_[iter()] = index; + } + else if (mesh.foundObject<volScalarField>(iter.key())) + { + volScalarField& Y = + const_cast<volScalarField&> + ( + mesh.lookupObject<volScalarField>(iter.key()) + ); + Yj_.set(j, &Y); + specieIndex_[iter()] = 0; + j++; + Info<< "specie: " << iter.key() << " is being solved" << endl; + } + else + { + FatalErrorIn + ( + "Foam::radiation::greyMeanAbsorptionEmission(const" + "dictionary& dict, const fvMesh& mesh)" + ) << "specie: " << iter.key() + << " is neither in look-up table: " + << lookUpTable_.tableName() + << " nor is being solved" << nl + << exit(FatalError); + } + } + else + { + FatalErrorIn + ( + "Foam::radiation::greyMeanAbsorptionEmission(const" + "dictionary& dict, const fvMesh& mesh)" + ) << "specie ft is not present " << nl + << exit(FatalError); + + } + } +} + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::radiation::greyMeanAbsorptionEmission::~greyMeanAbsorptionEmission() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +Foam::tmp<Foam::volScalarField> +Foam::radiation::greyMeanAbsorptionEmission::aCont(const label bandI) const +{ + const volScalarField& T = thermo_.T(); + const volScalarField& p = thermo_.p(); + const volScalarField& ft = mesh_.lookupObject<volScalarField>("ft"); + + label nSpecies = speciesNames_.size(); + + tmp<volScalarField> ta + ( + new volScalarField + ( + IOobject + ( + "a", + mesh().time().timeName(), + mesh(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh(), + dimensionedScalar("a", dimless/dimLength, 0.0) + ) + ); + + scalarField& a = ta().internalField(); + + forAll(a, i) + { + const List<scalar>& species = lookUpTable_.lookUp(ft[i]); + + for (label n=0; n<nSpecies; n++) + { + label l = 0; + scalar Yipi = 0; + if (specieIndex_[n] != 0) + { + //moles x pressure [atm] + Yipi = species[specieIndex_[n]]*p[i]*9.869231e-6; + } + else + { + // mass fraction + Yipi = Yj_[l][i]; + l++; + } + + const absorptionCoeffs::coeffArray& b = coeffs_[n].coeffs(T[i]); + + scalar Ti = T[i]; + // negative temperature exponents + if (coeffs_[n].invTemp()) + { + Ti = 1./T[i]; + } + a[i]+= + Yipi + *( + ((((b[5]*Ti + b[4])*Ti + b[3])*Ti + b[2])*Ti + b[1])*Ti + + b[0] + ); + } + } + return ta; +} + + +Foam::tmp<Foam::volScalarField> +Foam::radiation::greyMeanAbsorptionEmission::eCont(const label bandI) const +{ + tmp<volScalarField> e + ( + new volScalarField + ( + IOobject + ( + "e", + mesh().time().timeName(), + mesh(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh(), + dimensionedScalar("e", dimless/dimLength, 0.0) + ) + ); + + return e; +} + + +Foam::tmp<Foam::volScalarField> +Foam::radiation::greyMeanAbsorptionEmission::ECont(const label bandI) const +{ + tmp<volScalarField> E + ( + new volScalarField + ( + IOobject + ( + "E", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_, + dimensionedScalar("E", dimMass/dimLength/pow3(dimTime), 0.0) + ) + ); + + if (mesh_.foundObject<volScalarField>("hrr")) + { + const volScalarField& hrr = mesh_.lookupObject<volScalarField>("hrr"); + E().internalField() = EhrrCoeff_*hrr.internalField(); + } + + return E; +} + + +// ************************************************************************* // diff --git a/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/greyMeanAbsorptionEmission/greyMeanAbsorptionEmission.H b/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/greyMeanAbsorptionEmission/greyMeanAbsorptionEmission.H new file mode 100644 index 0000000000000000000000000000000000000000..7eaf936ec5a2f1bd38869665390e4a66a00c3a60 --- /dev/null +++ b/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/greyMeanAbsorptionEmission/greyMeanAbsorptionEmission.H @@ -0,0 +1,207 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Class + Foam::radiation::greyMeanAbsorptionEmission + +Description + greyMeanAbsorptionEmission radiation absorption and emission coefficients + for continuous phase + + The coefficients for the species in the Look up table have to be specified + for use in moles x P [atm], i.e. (k[i] = species[i]*p*9.869231e-6). + + The coefficients for CO and soot or any other added are multiplied by the + respective mass fraction being solved + + All the species in the dictionary need either to be in the look-up table or + being solved. Conversely, all the species solved do not need to be included + in the calculation of the absorption coefficient + + The names of the species in the absorption dictionary must match exactly the + name in the look-up table or the name of the field being solved + + The look-up table ("speciesTable") file should be in constant + + i.e. dictionary + + LookUpTableFileName "speciesTable"; + + EhrrCoeff 0.0; + + CO2 + { + Tcommon 300.; // Common Temp + invTemp true; // Is the polynomial using inverse temperature? + Tlow 300.; // Low Temp + Thigh 2500.; // High Temp + + loTcoeffs // coeffs for T < Tcommon + ( + 0 // a0 + + 0 // a1*T + + 0 // a2*T^(+/-)2 + + 0 // a3*T^(+/-)3 + + 0 // a4*T^(+/-)4 + + 0 // a5*T^(+/-)5 + + ); + hiTcoeffs // coeffs for T > Tcommon + ( + 18.741 + -121.31e3 + 273.5e6 + -194.05e9 + 56.31e12 + -5.8169e15 + ); + + } + +SourceFiles + greyMeanAbsorptionEmission.C + +\*---------------------------------------------------------------------------*/ + +#ifndef greyMeanAbsorptionEmission_H +#define greyMeanAbsorptionEmission_H + +#include "interpolationLookUpTable.H" +#include "absorptionEmissionModel.H" +#include "HashTable.H" +#include "absorptionCoeffs.H" +#include "basicThermo.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace radiation +{ + +/*---------------------------------------------------------------------------*\ + Class constantAbsorptionEmission Declaration +\*---------------------------------------------------------------------------*/ + +class greyMeanAbsorptionEmission +: + public absorptionEmissionModel +{ +public: + + // Public data + + // - Maximum number of species considered for absorptivity + static const int nSpecies_ = 5; + + // Absorption Coefficients + absorptionCoeffs coeffs_[nSpecies_]; + + +private: + + // Private data + + //- Absorption model dictionary + dictionary coeffsDict_; + + //- Hash table of species names + HashTable<label> speciesNames_; + + // Indices of species in the look-up table + FixedList<label, nSpecies_> specieIndex_; + + // Look-up table of species related to ft + mutable interpolationLookUpTable<scalar> lookUpTable_; + + // Thermo package + const basicThermo& thermo_; + + //- Emission constant coefficient + const scalar EhrrCoeff_; + + //- Pointer list of species in the registry involved in the absorption + UPtrList<volScalarField> Yj_; + + +public: + + //- Runtime type information + TypeName("greyMeanAbsorptionEmission"); + + + // Constructors + + //- Construct from components + greyMeanAbsorptionEmission + ( + const dictionary& dict, + const fvMesh& mesh + ); + + + // Destructor + virtual ~greyMeanAbsorptionEmission(); + + + // Member Operators + + // Access + + // Absorption coefficient + + //- Absorption coefficient for continuous phase + tmp<volScalarField> aCont(const label bandI = 0) const; + + + // Emission coefficient + + //- Emission coefficient for continuous phase + tmp<volScalarField> eCont(const label bandI = 0) const; + + + // Emission contribution + + //- Emission contribution for continuous phase + tmp<volScalarField> ECont(const label bandI = 0) const; + + + // Member Functions + + inline bool isGrey() const + { + return true; + } +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace radiation +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/noAbsorptionEmission/noAbsorptionEmission.H b/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/noAbsorptionEmission/noAbsorptionEmission.H index 5e978e862e30ceab36db476a8e308e069816f22e..0010dc98fe5f7babbe81ec47ab948ddc8b39bb42 100644 --- a/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/noAbsorptionEmission/noAbsorptionEmission.H +++ b/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/noAbsorptionEmission/noAbsorptionEmission.H @@ -71,8 +71,7 @@ public: // Destructor - - ~noAbsorptionEmission(); + virtual ~noAbsorptionEmission(); }; diff --git a/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/wideBandAbsorptionEmission/wideBandAbsorptionEmission.C b/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/wideBandAbsorptionEmission/wideBandAbsorptionEmission.C new file mode 100644 index 0000000000000000000000000000000000000000..6a3f2907060d53fbc5cf069c6a21afd65a9be766 --- /dev/null +++ b/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/wideBandAbsorptionEmission/wideBandAbsorptionEmission.C @@ -0,0 +1,320 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +\*---------------------------------------------------------------------------*/ + +#include "wideBandAbsorptionEmission.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + namespace radiation + { + defineTypeNameAndDebug(wideBandAbsorptionEmission, 0); + + addToRunTimeSelectionTable + ( + absorptionEmissionModel, + wideBandAbsorptionEmission, + dictionary + ); + } +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::radiation::wideBandAbsorptionEmission::wideBandAbsorptionEmission +( + const dictionary& dict, + const fvMesh& mesh +) +: + absorptionEmissionModel(dict, mesh), + coeffsDict_((dict.subDict(typeName + "Coeffs"))), + speciesNames_(0), + specieIndex_(0), + lookUpTable_ + ( + fileName(coeffsDict_.lookup("lookUpTableFileName")), + mesh.time().constant(), + mesh + ), + thermo_(mesh.lookupObject<basicThermo>("thermophysicalProperties")), + Yj_(nSpecies_), + totalWaveLength_(0) +{ + label nBand = 0; + const dictionary& functionDicts = dict.subDict(typeName +"Coeffs"); + forAllConstIter(dictionary, functionDicts, iter) + { + // safety: + if (!iter().isDict()) + { + continue; + } + + const dictionary& dict = iter().dict(); + dict.lookup("bandLimits") >> iBands_[nBand]; + dict.lookup("EhrrCoeff") >> iEhrrCoeffs_[nBand]; + totalWaveLength_ += (iBands_[nBand][1] - iBands_[nBand][0]); + + label nSpec = 0; + const dictionary& specDicts = dict.subDict("species"); + forAllConstIter(dictionary, specDicts, iter) + { + const word& key = iter().keyword(); + if (nBand == 0) + { + speciesNames_.insert(key, nSpec); + } + else + { + if (!speciesNames_.found(key)) + { + FatalErrorIn + ( + "Foam::radiation::wideBandAbsorptionEmission(const" + "dictionary& dict, const fvMesh& mesh)" + ) << "specie: " << key << "is not in all the bands" + << nl << exit(FatalError); + } + } + coeffs_[nSpec][nBand].initialise(specDicts.subDict(key)); + nSpec++; + } + nBand++; + } + nBands_ = nBand; + + // Check that all the species on the dictionary are present in the + // look-up table and save the corresponding indexes of the look-up table + + label j = 0; + forAllConstIter(HashTable<label>, speciesNames_, iter) + { + if (lookUpTable_.found(iter.key())) + { + label index = lookUpTable_.findFieldIndex(iter.key()); + Info<< "specie: " << iter.key() << " found in look-up table " + << " with index: " << index << endl; + specieIndex_[iter()] = index; + } + else if (mesh.foundObject<volScalarField>(iter.key())) + { + volScalarField& Y = const_cast<volScalarField&> + (mesh.lookupObject<volScalarField>(iter.key())); + + Yj_.set(j, &Y); + + specieIndex_[iter()] = 0.0; + j++; + Info<< "species: " << iter.key() << " is being solved" << endl; + } + else + { + FatalErrorIn + ( + "radiation::wideBandAbsorptionEmission(const" + "dictionary& dict, const fvMesh& mesh)" + ) << "specie: " << iter.key() + << " is neither in look-up table : " + << lookUpTable_.tableName() << " nor is being solved" + << exit(FatalError); + } + } +} + + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::radiation::wideBandAbsorptionEmission::~wideBandAbsorptionEmission() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +Foam::tmp<Foam::volScalarField> +Foam::radiation::wideBandAbsorptionEmission::aCont(const label bandI) const +{ + const volScalarField& T = thermo_.T(); + const volScalarField& p = thermo_.p(); + const volScalarField& ft = mesh_.lookupObject<volScalarField>("ft"); + + label nSpecies = speciesNames_.size(); + + tmp<volScalarField> ta + ( + new volScalarField + ( + IOobject + ( + "a", + mesh().time().timeName(), + mesh(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh(), + dimensionedScalar("a",dimless/dimLength, 0.0) + ) + ); + + scalarField& a = ta().internalField(); + + forAll(a, i) + { + const List<scalar>& species = lookUpTable_.lookUp(ft[i]); + + for (label n=0; n<nSpecies; n++) + { + label l = 0; + scalar Yipi = 0; + if (specieIndex_[n] != 0) + { + // moles x pressure [atm] + Yipi = species[specieIndex_[n]]*p[i]*9.869231e-6; + } + else + { + // mass fraction from species being solved + Yipi = Yj_[l][i]; + l++; + } + + scalar Ti = T[i]; + + const absorptionCoeffs::coeffArray& b = + coeffs_[n][bandI].coeffs(T[i]); + + if (coeffs_[n][bandI].invTemp()) + { + Ti = 1./T[i]; + } + + a[i]+= + Yipi + *( + ((((b[5]*Ti + b[4])*Ti + b[3])*Ti + b[2])*Ti + b[1])*Ti + + b[0] + ); + } + } + + return ta; +} + + +Foam::tmp<Foam::volScalarField> +Foam::radiation::wideBandAbsorptionEmission::eCont(const label bandI) const +{ + tmp<volScalarField> e + ( + new volScalarField + ( + IOobject + ( + "e", + mesh().time().timeName(), + mesh(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh(), + dimensionedScalar("e",dimless/dimLength, 0.0) + ) + ); + + return e; +} + + +Foam::tmp<Foam::volScalarField> +Foam::radiation::wideBandAbsorptionEmission::ECont(const label bandI) const +{ + tmp<volScalarField> E + ( + new volScalarField + ( + IOobject + ( + "E", + mesh().time().timeName(), + mesh(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh(), + dimensionedScalar("E", dimMass/dimLength/pow3(dimTime), 0.0) + ) + ); + + if (mesh().foundObject<volScalarField>("hrr")) + { + const volScalarField& hrr = mesh().lookupObject<volScalarField>("hrr"); + E().internalField() = + iEhrrCoeffs_[bandI] + *hrr.internalField() + *(iBands_[bandI][1] - iBands_[bandI][0]) + /totalWaveLength_; + } + + return E; +} + +Foam::tmp<Foam::volScalarField> +Foam::radiation::wideBandAbsorptionEmission::addIntensity +( + const label i, + const volScalarField& ILambda +) const +{ + return ILambda*(iBands_[i][1] - iBands_[i][0])/totalWaveLength_; +} + + +void Foam::radiation::wideBandAbsorptionEmission::correct +( + volScalarField& a, + PtrList<volScalarField>& aLambda +) const +{ + a = dimensionedScalar("zero", dimless/dimLength, 0.0); + + for (label j = 0; j < nBands_; j++) + { + Info<< "Calculating absorption in band: " << j << endl; + aLambda[j].internalField() = this->a(j); + Info<< "Calculated absorption in band: " << j << endl; + a.internalField() += + aLambda[j].internalField() + *(iBands_[j][1] - iBands_[j][0]) + /totalWaveLength_; + } + +} +// ************************************************************************* // diff --git a/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/wideBandAbsorptionEmission/wideBandAbsorptionEmission.H b/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/wideBandAbsorptionEmission/wideBandAbsorptionEmission.H new file mode 100644 index 0000000000000000000000000000000000000000..d0763595ea32497528d3e972fc97dd555500b9b9 --- /dev/null +++ b/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/wideBandAbsorptionEmission/wideBandAbsorptionEmission.H @@ -0,0 +1,264 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Class + Foam::radiation::greyMeanAbsorptionEmission + +Description + + wideBandAbsorptionEmission radiation absorption and emission coefficients + for continuous phase. + + All the bands should have the same number of species and have to be entered + in the same order. + + There is no check of continuity of the bands. They should not ovelap or + have gaps. + + The black body emission power table(constant/blackBodyEmissivePower) range + of lambda * T = [1000; 10000] x 10E-6 (90% of the total emission). + + The emission constant proportionality is specified per band (EhrrCoeff). + + The coefficients for the species in the LookUpTable have to be specified + for use in moles x P [atm].i.e. (k[i] = species[i]*p*9.869231e-6). + + The coefficients for CO and soot or any other added are multiplied by the + respective mass fraction being solved. + + The look Up table file should be in the constant directory. + + band dictionary: + + band0 + { + bandLimits (1.0e-6 2.63e-6); + EhrrCoeff 0.0; + species + { + CH4 + { + Tcommon 300.; + Tlow 300.; + Thigh 2500.; + invTemp false; + loTcoeffs (0 0 0 0 0 0) ; + hiTcoeffs (.1 0 0 0 0 0); + } + CO2 + { + Tcommon 300.; + Tlow 300.; + Thigh 2500.; + invTemp false; + loTcoeffs (0 0 0 0 0 0) ; + hiTcoeffs (.1 0 0 0 0 0); + } + + H2O + { + Tcommon 300.; + Tlow 300.; + Thigh 2500.; + invTemp false; + loTcoeffs (0 0 0 0 0 0) ; + hiTcoeffs (.1 0 0 0 0 0); + } + + Ysoot + { + Tcommon 300.; + Tlow 300.; + Thigh 2500.; + invTemp false; + loTcoeffs (0 0 0 0 0 0) ; + hiTcoeffs (.1 0 0 0 0 0); + } + } + } + + +SourceFiles + wideBandAbsorptionEmission.C + +\*---------------------------------------------------------------------------*/ + +#ifndef wideBandAbsorptionEmission_H +#define wideBandAbsorptionEmission_H + +#include "interpolationLookUpTable.H" +#include "absorptionEmissionModel.H" +#include "HashTable.H" +#include "absorptionCoeffs.H" +#include "basicThermo.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace radiation +{ + +/*---------------------------------------------------------------------------*\ + Class wideBandAbsorptionEmission Declaration +\*---------------------------------------------------------------------------*/ + +class wideBandAbsorptionEmission +: + public absorptionEmissionModel +{ +public: + + // Public data + + //- Maximum number of species considered for absorptivity + static const int nSpecies_ = 5; + + //- Maximum number of bands + static const int maxBands_ = 10; + + //- Absorption coefficients + FixedList<FixedList<absorptionCoeffs, nSpecies_>, maxBands_> coeffs_; + + +private: + + // Private data + + //- Absorption model dictionary + dictionary coeffsDict_; + + //- Hash table with species names + HashTable<label> speciesNames_; + + //- Indices of species in the look-up table + FixedList<label,nSpecies_> specieIndex_; + + //- Bands + FixedList<Vector2D<scalar>, maxBands_ > iBands_; + + //- Proportion of the heat released rate emitted + FixedList<scalar, maxBands_ > iEhrrCoeffs_; + + //- Look-up table of species related to ft + mutable interpolationLookUpTable<scalar> lookUpTable_; + + //- Thermo package + const basicThermo& thermo_; + + //- Bands + label nBands_ ; + + //- Pointer list of species being solved involved in the absorption + UPtrList<volScalarField> Yj_; + + // Total wave length covered by the bands + scalar totalWaveLength_; + + +public: + + //- Runtime type information + TypeName("wideBandAbsorptionEmission"); + + + // Constructors + + //- Construct from components + wideBandAbsorptionEmission + ( + const dictionary& dict, + const fvMesh& mesh + ); + + + // Destructor + virtual ~wideBandAbsorptionEmission(); + + + // Member Functions + + // Access + + // Absorption coefficient + + //- Absorption coefficient for continuous phase + tmp<volScalarField> aCont(const label bandI = 0) const; + + + // Emission coefficient + + //- Emission coefficient for continuous phase + tmp<volScalarField> eCont(const label bandI = 0) const; + + + // Emission contribution + + //- Emission contribution for continuous phase + tmp<volScalarField> ECont(const label bandI = 0) const; + + + inline bool isGrey() const + { + return false; + } + + //- Number of bands + inline label nBands() const + { + return nBands_; + } + + //- Lower and upper limit of band i + inline const Vector2D<scalar>& bands(const label i) const + { + return iBands_[i]; + } + + //- Add contribution of ILambda to the total radiative intensity in + // direction i + tmp<volScalarField> addIntensity + ( + const label i, + const volScalarField& ILambda + ) const; + + void correct + ( + volScalarField& a_, + PtrList<volScalarField>& aLambda + ) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace radiation +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/triSurface/faceTriangulation/faceTriangulation.C b/src/triSurface/faceTriangulation/faceTriangulation.C index f0df3371077d31883cb5fbd1a2bb6a7d6ff2d14c..675ae91db8b559bad6019a491725dcc7219dcb36 100644 --- a/src/triSurface/faceTriangulation/faceTriangulation.C +++ b/src/triSurface/faceTriangulation/faceTriangulation.C @@ -88,7 +88,7 @@ void Foam::faceTriangulation::calcHalfAngle scalar sin = (e0 ^ e1) & normal; - if (sin < -SMALL) + if (sin < -ROOTVSMALL) { // 3rd or 4th quadrant cosHalfAngle = - Foam::sqrt(0.5*(1 + cos)); @@ -366,7 +366,7 @@ Foam::label Foam::faceTriangulation::findStart const vector& rightEdge = edges[right(size, fp)]; const vector leftEdge = -edges[left(size, fp)]; - if (((rightEdge ^ leftEdge) & normal) < SMALL) + if (((rightEdge ^ leftEdge) & normal) < ROOTVSMALL) { scalar cos = rightEdge & leftEdge; if (cos < minCos)