diff --git a/src/thermophysicalModels/radiation/Make/files b/src/thermophysicalModels/radiation/Make/files index 9b385e8a5675a2cb704020f20a6d9649f1a840e8..cfce31241011a8f5df4eb006fef0c4ba04fd8683 100644 --- a/src/thermophysicalModels/radiation/Make/files +++ b/src/thermophysicalModels/radiation/Make/files @@ -1,13 +1,16 @@ + /* 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 +24,13 @@ 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..818b874d1de523299b5a440ce970ca844a2f1e52 --- /dev/null +++ b/src/thermophysicalModels/radiation/derivedFvPatchFields/GreyDiffusiveRadiation/GreyDiffusiveRadiationMixedFvPatchScalarField.C @@ -0,0 +1,312 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / 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 "radiationModel.H" +#include "fvDOM.H" +#include "radiationConstants.H" +#include "mathematicalConstants.H" + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::radiation::GreyDiffusiveRadiationMixedFvPatchField:: +GreyDiffusiveRadiationMixedFvPatchField +( + const fvPatch& p, + const DimensionedField<scalar, volMesh>& iF +) +: + mixedFvPatchScalarField(p, iF), + TName_("undefined"), + emissivity_(0.0), + myRayIndex_(0), + myWaveLengthIndex_(0), + myRayIsInit_(-1), + qr_(0) +{ + refValue() = 0.0; + refGrad() = 0.0; + valueFraction() = 1.0; + qr_.setSize(p.size()); +} + + +Foam::radiation::GreyDiffusiveRadiationMixedFvPatchField:: +GreyDiffusiveRadiationMixedFvPatchField +( + const GreyDiffusiveRadiationMixedFvPatchField& ptf, + const fvPatch& p, + const DimensionedField<scalar, volMesh>& iF, + const fvPatchFieldMapper& mapper +) +: + mixedFvPatchScalarField(ptf, p, iF, mapper), + TName_(ptf.TName_), + emissivity_(ptf.emissivity_), + myRayIndex_(ptf.myRayIndex_), + myWaveLengthIndex_(ptf.myWaveLengthIndex_), + myRayIsInit_(ptf.myRayIsInit_), + qr_(ptf.qr_) +{} + + +Foam::radiation::GreyDiffusiveRadiationMixedFvPatchField:: +GreyDiffusiveRadiationMixedFvPatchField +( + const fvPatch& p, + const DimensionedField<scalar, volMesh>& iF, + const dictionary& dict +) +: + mixedFvPatchScalarField(p, iF), + TName_(dict.lookup("T")), + emissivity_(readScalar(dict.lookup("emissivity"))), + myRayIndex_(0), + myWaveLengthIndex_(0), + myRayIsInit_(-1), + qr_(0) +{ + const scalarField& Tp = + patch().lookupPatchField<volScalarField, scalar>(TName_); + + refValue() = emissivity_*4.0*radiation::sigmaSB.value()*pow4(Tp) / + Foam::mathematicalConstant::pi; + refGrad() = 0.0; + + qr_.setSize(p.size()); + + if (dict.found("value")) + { + fvPatchScalarField::operator= + ( + scalarField("value", dict, p.size()) + ); + } + else + { + fvPatchScalarField::operator=(refValue()); + } +} + + +Foam::radiation::GreyDiffusiveRadiationMixedFvPatchField:: +GreyDiffusiveRadiationMixedFvPatchField +( + const GreyDiffusiveRadiationMixedFvPatchField& ptf +) +: + mixedFvPatchScalarField(ptf), + TName_(ptf.TName_), + emissivity_(ptf.emissivity_), + myRayIndex_(ptf.myRayIndex_), + myWaveLengthIndex_(ptf.myWaveLengthIndex_), + myRayIsInit_(ptf.myRayIsInit_), + qr_(ptf.qr_) +{} + + +Foam::radiation::GreyDiffusiveRadiationMixedFvPatchField:: +GreyDiffusiveRadiationMixedFvPatchField +( + const GreyDiffusiveRadiationMixedFvPatchField& ptf, + const DimensionedField<scalar, volMesh>& iF +) +: + mixedFvPatchScalarField(ptf, iF), + TName_(ptf.TName_), + emissivity_(ptf.emissivity_), + myRayIndex_(ptf.myRayIndex_), + myWaveLengthIndex_(ptf.myWaveLengthIndex_), + myRayIsInit_(ptf.myRayIsInit_), + qr_(ptf.qr_) + +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::radiation::GreyDiffusiveRadiationMixedFvPatchField::autoMap +( + const fvPatchFieldMapper& m +) +{ + scalarField::autoMap(m); + +} + + +void Foam::radiation::GreyDiffusiveRadiationMixedFvPatchField::rmap +( + const fvPatchScalarField& ptf, + const labelList& addr +) +{ + mixedFvPatchScalarField::rmap(ptf, addr); + +// const GreyDiffusiveRadiationMixedFvPatchField& mrptf = + refCast<const GreyDiffusiveRadiationMixedFvPatchField>(ptf); +} + + +void Foam::radiation::GreyDiffusiveRadiationMixedFvPatchField::updateCoeffs() +{ + if (this->updated()) + { + return; + } + + const scalarField& Tp = + patch().lookupPatchField<volScalarField, scalar>(TName_); + + const radiationModel& rad = + db().lookupObject<radiationModel>("radiationProperties"); + + const fvDOM& Dom(refCast<const fvDOM>(rad)); + + const label patchi = patch().index(); + + if(Dom.lambdaj() == 1) + { + if (myRayIsInit_ == -1) + { + for(label i=0; i < Dom.Ni() ; i++) + { + for(label j=0; j < Dom.lambdaj() ; j++) + { + const volScalarField& radiationField = + Dom.RadIntRayiLambdaj(i,j); + if (&(radiationField.internalField()) == + &dimensionedInternalField()) + { + myRayIndex_ = i; + myWaveLengthIndex_ = j; + myRayIsInit_ = 0.; + break; + } + } + } + } + } + else + { + FatalErrorIn + ( + "Foam::radiation::" + "GreyDiffusiveRadiationMixedFvPatchField::" + "updateCoeffs" + ) << " a grey boundary condition is used with a non-grey" + << "absorption model" + << exit(FatalError); + } + + vectorField n = patch().Sf()/patch().magSf(); + + scalarField& Iw = *(this); + + qr_ = Iw *(-n & Dom.RadIntRay(myRayIndex_).Di()); + + Dom.RadIntRay(myRayIndex_).add(qr_,patchi); + + forAll(Iw, faceI) + { + + scalar Ir = 0.0; + + for(label i=0; i < Dom.Ni() ; i++) // + { + const vector& si = Dom.RadIntRay(i).Si(); + + const scalarField& Iface = Dom.RadIntRay(i).Ilambdaj + ( + myWaveLengthIndex_ + ).boundaryField()[patch().index()]; + + scalar InOut = -n[faceI] & si; + + if (InOut < 0.) // qin into the wall + { + const vector& di = Dom.RadIntRay(i).Di(); + Ir += Iface[faceI]*mag(n[faceI] & di); + } + } + + const vector& mySi = Dom.RadIntRay(myRayIndex_).Si(); + + scalar InOut = -n[faceI] & mySi; + + if (InOut > 0.) //direction out of the wall + { + refGrad()[faceI] = 0.0; + valueFraction()[faceI] = 1.0; + refValue()[faceI] = ((1. - emissivity_) * Ir + + emissivity_*radiation::sigmaSB.value()*pow4(Tp[faceI])) / + Foam::mathematicalConstant::pi; + + } + else if (InOut < 0.) //direction into the wall + { + valueFraction()[faceI] = 0.0; + refGrad()[faceI] = 0.0; + refValue()[faceI] = 0.0; //not used + } + } + + mixedFvPatchScalarField::updateCoeffs(); +} + + +void Foam::radiation::GreyDiffusiveRadiationMixedFvPatchField::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, + GreyDiffusiveRadiationMixedFvPatchField + ); +} +} + + +// ************************************************************************* // diff --git a/src/thermophysicalModels/radiation/derivedFvPatchFields/GreyDiffusiveRadiation/GreyDiffusiveRadiationMixedFvPatchScalarField.H b/src/thermophysicalModels/radiation/derivedFvPatchFields/GreyDiffusiveRadiation/GreyDiffusiveRadiationMixedFvPatchScalarField.H new file mode 100644 index 0000000000000000000000000000000000000000..cc0cd34129561904b3c092332d857acda531d052 --- /dev/null +++ b/src/thermophysicalModels/radiation/derivedFvPatchFields/GreyDiffusiveRadiation/GreyDiffusiveRadiationMixedFvPatchScalarField.H @@ -0,0 +1,218 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / 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::GreyDiffusiveRadiationMixedFvPatchField + +Description + Radiation temperature specified + +SourceFiles + GreyDiffusiveRadiationMixedFvPatchField.C + +\*---------------------------------------------------------------------------*/ + +#ifndef GreyDiffusiveRadiationMixedFvPatchField_H +#define GreyDiffusiveRadiationMixedFvPatchField_H + +#include "mixedFvPatchFields.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace radiation +{ +/*---------------------------------------------------------------------------*\ + Class GreyDiffusiveRadiationMixedFvPatchField Declaration +\*---------------------------------------------------------------------------*/ + +class GreyDiffusiveRadiationMixedFvPatchField +: + public mixedFvPatchScalarField +{ + + // Private data + + //- Name of temperature field + word TName_; + + //- Emissivity + scalar emissivity_; + + //- Direction index + label myRayIndex_; + + //- Direction index + label myWaveLengthIndex_; + + //- Init ray flag + label myRayIsInit_; + + //- Radiative heat flux on walls. + scalarField qr_; + +public: + + //- Runtime type information + TypeName("GreyDiffusiveRadiation"); + + + // Constructors + + //- Construct from patch and internal field + GreyDiffusiveRadiationMixedFvPatchField + ( + const fvPatch&, + const DimensionedField<scalar, volMesh>& + ); + + //- Construct from patch, internal field and dictionary + GreyDiffusiveRadiationMixedFvPatchField + ( + const fvPatch&, + const DimensionedField<scalar, volMesh>&, + const dictionary& + ); + + //- Construct by mapping given GreyDiffusiveRadiationMixedFvPatchField + // onto a new patch + GreyDiffusiveRadiationMixedFvPatchField + ( + const GreyDiffusiveRadiationMixedFvPatchField&, + const fvPatch&, + const DimensionedField<scalar, volMesh>&, + const fvPatchFieldMapper& + ); + + //- Construct as copy + GreyDiffusiveRadiationMixedFvPatchField + ( + const GreyDiffusiveRadiationMixedFvPatchField& + ); + + //- Construct and return a clone + virtual tmp<fvPatchScalarField> clone() const + { + return tmp<fvPatchScalarField> + ( + new GreyDiffusiveRadiationMixedFvPatchField(*this) + ); + } + + //- Construct as copy setting internal field reference + GreyDiffusiveRadiationMixedFvPatchField + ( + const GreyDiffusiveRadiationMixedFvPatchField&, + 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 GreyDiffusiveRadiationMixedFvPatchField(*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_; + } + + + //- Return heat flux on the boundary + const scalarField& qr() const + { + return qr_; + } + + // Mapping functions + + //- Map (and resize as needed) from self given a mapping object + virtual void autoMap + ( + const fvPatchFieldMapper& + ); + + //- Reverse map the given fvPatchField onto this fvPatchField + virtual void rmap + ( + const fvPatchScalarField&, + const labelList& + ); + + + // 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..ef795c5f52f115901f570d50d5af0bdf3cce2eb4 --- /dev/null +++ b/src/thermophysicalModels/radiation/derivedFvPatchFields/WideBandDiffusiveRadiation/WideBandDiffusiveRadiationMixedFvPatchScalarField.C @@ -0,0 +1,314 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / 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 "radiationModel.H" +#include "fvDOM.H" +#include "wideBandAbsorptionEmission.H" +#include "radiationConstants.H" +#include "mathematicalConstants.H" + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::radiation::WideBandDiffusiveRadiationMixedFvPatchField:: +WideBandDiffusiveRadiationMixedFvPatchField +( + const fvPatch& p, + const DimensionedField<scalar, volMesh>& iF +) +: + mixedFvPatchScalarField(p, iF), + TName_("undefined"), + emissivity_(0.0), + myRayIndex_(0), + myWaveLengthIndex_(0), + myRayIsInit_(-1), + qr_(0) +{ + refValue() = 0.0; + refGrad() = 0.0; + valueFraction() = 1.0; + qr_.setSize(p.size()); +} + + +Foam::radiation::WideBandDiffusiveRadiationMixedFvPatchField:: +WideBandDiffusiveRadiationMixedFvPatchField +( + const WideBandDiffusiveRadiationMixedFvPatchField& ptf, + const fvPatch& p, + const DimensionedField<scalar, volMesh>& iF, + const fvPatchFieldMapper& mapper +) +: + mixedFvPatchScalarField(ptf, p, iF, mapper), + TName_(ptf.TName_), + emissivity_(ptf.emissivity_), + myRayIndex_(ptf.myRayIndex_), + myWaveLengthIndex_(ptf.myWaveLengthIndex_), + myRayIsInit_(ptf.myRayIsInit_), + qr_(ptf.qr_) +{} + + +Foam::radiation::WideBandDiffusiveRadiationMixedFvPatchField:: +WideBandDiffusiveRadiationMixedFvPatchField +( + const fvPatch& p, + const DimensionedField<scalar, volMesh>& iF, + const dictionary& dict +) +: + mixedFvPatchScalarField(p, iF), + TName_(dict.lookup("T")), + emissivity_(readScalar(dict.lookup("emissivity"))), + myRayIndex_(0), + myWaveLengthIndex_(0), + myRayIsInit_(-1), + qr_(0) +{ + const scalarField& Tp = + patch().lookupPatchField<volScalarField, scalar>(TName_); + + refValue() = emissivity_*4.0*radiation::sigmaSB.value()*pow4(Tp) / + Foam::mathematicalConstant::pi; + refGrad() = 0.0; + + qr_.setSize(p.size()); + + if (dict.found("value")) + { + fvPatchScalarField::operator= + ( + scalarField("value", dict, p.size()) + ); + } + else + { + fvPatchScalarField::operator=(refValue()); + } +} + + +Foam::radiation::WideBandDiffusiveRadiationMixedFvPatchField:: +WideBandDiffusiveRadiationMixedFvPatchField +( + const WideBandDiffusiveRadiationMixedFvPatchField& ptf +) +: + mixedFvPatchScalarField(ptf), + TName_(ptf.TName_), + emissivity_(ptf.emissivity_), + myRayIndex_(ptf.myRayIndex_), + myWaveLengthIndex_(ptf.myWaveLengthIndex_), + myRayIsInit_(ptf.myRayIsInit_), + qr_(ptf.qr_) +{} + + +Foam::radiation::WideBandDiffusiveRadiationMixedFvPatchField:: +WideBandDiffusiveRadiationMixedFvPatchField +( + const WideBandDiffusiveRadiationMixedFvPatchField& ptf, + const DimensionedField<scalar, volMesh>& iF +) +: + mixedFvPatchScalarField(ptf, iF), + TName_(ptf.TName_), + emissivity_(ptf.emissivity_), + myRayIndex_(ptf.myRayIndex_), + myWaveLengthIndex_(ptf.myWaveLengthIndex_), + myRayIsInit_(ptf.myRayIsInit_), + qr_(ptf.qr_) + +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::radiation::WideBandDiffusiveRadiationMixedFvPatchField::autoMap +( + const fvPatchFieldMapper& m +) +{ + scalarField::autoMap(m); + +} + + +void Foam::radiation::WideBandDiffusiveRadiationMixedFvPatchField::rmap +( + const fvPatchScalarField& ptf, + const labelList& addr +) +{ + mixedFvPatchScalarField::rmap(ptf, addr); + +// const GreyDiffusiveRadiationMixedFvPatchField& mrptf = + refCast<const WideBandDiffusiveRadiationMixedFvPatchField>(ptf); +} + + +void +Foam::radiation::WideBandDiffusiveRadiationMixedFvPatchField::updateCoeffs +() +{ + if (this->updated()) + { + return; + } + + const radiationModel& rad = + db().lookupObject<radiationModel>("radiationProperties"); + + const fvDOM& Dom(refCast<const fvDOM>(rad)); + + const label patchi = patch().index(); + + if(Dom.lambdaj() > 1) + { + if (myRayIsInit_ == -1) + { + for(label i=0; i < Dom.Ni() ; i++) + { + for(label j=0; j < Dom.lambdaj() ; j++) + { + const volScalarField& radiationField = + Dom.RadIntRayiLambdaj(i,j); + if (&(radiationField.internalField()) == + &dimensionedInternalField()) + { + myRayIndex_ = i; + myWaveLengthIndex_ = j; + myRayIsInit_ = 0.; + break; + } + } + } + } + } + else + { + FatalErrorIn + ( + "Foam::radiation::" + "WideBandDiffusiveRadiationMixedFvPatchScalarField::" + "updateCoeffs" + ) << " a Non-grey boundary condition is used with a grey" + << "absorption model" + << exit(FatalError); + } + + vectorField n = patch().Sf()/patch().magSf(); + + scalarField& Iw = *(this); + + qr_ = Iw *(-n & Dom.RadIntRay(myRayIndex_).Di()); + + Dom.RadIntRay(myRayIndex_).add(qr_,patchi); + + const scalarField Eb = + Dom.blackBody().bj(myWaveLengthIndex_).boundaryField()[patchi]; + + forAll(Iw, faceI) + { + + scalar Ir = 0.0; + for(label i=0; i < Dom.Ni() ; i++) // + { + const vector& si = Dom.RadIntRay(i).Si(); + + const scalarField& Iface = Dom.RadIntRay(i).Ilambdaj + ( + myWaveLengthIndex_ + ).boundaryField()[patch().index()]; + + scalar InOut = -n[faceI] & si; + + if (InOut < 0.) // qin into the wall + { + const vector& di = Dom.RadIntRay(i).Di(); + Ir = Ir + Iface[faceI]*mag(n[faceI] & di); + } + } + + + const vector& mySi = Dom.RadIntRay(myRayIndex_).Si(); + + scalar InOut = -n[faceI] & mySi; + + if (InOut > 0.) //direction out of the wall + { + refGrad()[faceI] = 0.0; + valueFraction()[faceI] = 1.0; + refValue()[faceI] = ((1. - emissivity_) * Ir + + emissivity_* Eb[faceI]) / Foam::mathematicalConstant::pi; + } + else if (InOut < 0.) //direction into the wall + { + valueFraction()[faceI] = 0.0; + refGrad()[faceI] = 0.0; + refValue()[faceI] = 0.0; //not used + } + } + + mixedFvPatchScalarField::updateCoeffs(); +} + + +void Foam::radiation::WideBandDiffusiveRadiationMixedFvPatchField::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, + WideBandDiffusiveRadiationMixedFvPatchField + ); +} +} + + +// ************************************************************************* // diff --git a/src/thermophysicalModels/radiation/derivedFvPatchFields/WideBandDiffusiveRadiation/WideBandDiffusiveRadiationMixedFvPatchScalarField.H b/src/thermophysicalModels/radiation/derivedFvPatchFields/WideBandDiffusiveRadiation/WideBandDiffusiveRadiationMixedFvPatchScalarField.H new file mode 100644 index 0000000000000000000000000000000000000000..765579c3acdc8a4fd08b4308d3cba8d807f80dc7 --- /dev/null +++ b/src/thermophysicalModels/radiation/derivedFvPatchFields/WideBandDiffusiveRadiation/WideBandDiffusiveRadiationMixedFvPatchScalarField.H @@ -0,0 +1,218 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / 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::WideBandDiffusiveRadiationMixedFvPatchField + +Description + Radiation temperature specified + +SourceFiles + WideBandDiffusiveRadiationMixedFvPatchField.C + +\*---------------------------------------------------------------------------*/ + +#ifndef WideBandDiffusiveRadiationMixedFvPatchField_H +#define WideBandDiffusiveRadiationMixedFvPatchField_H + +#include "mixedFvPatchFields.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace radiation +{ +/*---------------------------------------------------------------------------*\ + Class WideBandDiffusiveRadiationMixedFvPatchField Declaration +\*---------------------------------------------------------------------------*/ + +class WideBandDiffusiveRadiationMixedFvPatchField +: + public mixedFvPatchScalarField +{ + + // Private data + + //- Name of temperature field + word TName_; + + //- Emissivity + scalar emissivity_; + + //- Direction index + label myRayIndex_; + + //- Direction index + label myWaveLengthIndex_; + + //- Init ray flag + label myRayIsInit_; + + //- Radiative heat flux on walls. + scalarField qr_; + +public: + + //- Runtime type information + TypeName("WideBandDiffusiveRadiation"); + + + // Constructors + + //- Construct from patch and internal field + WideBandDiffusiveRadiationMixedFvPatchField + ( + const fvPatch&, + const DimensionedField<scalar, volMesh>& + ); + + //- Construct from patch, internal field and dictionary + WideBandDiffusiveRadiationMixedFvPatchField + ( + const fvPatch&, + const DimensionedField<scalar, volMesh>&, + const dictionary& + ); + + //- Construct by mapping given GreyDiffusiveRadiationMixedFvPatchField + // onto a new patch + WideBandDiffusiveRadiationMixedFvPatchField + ( + const WideBandDiffusiveRadiationMixedFvPatchField&, + const fvPatch&, + const DimensionedField<scalar, volMesh>&, + const fvPatchFieldMapper& + ); + + //- Construct as copy + WideBandDiffusiveRadiationMixedFvPatchField + ( + const WideBandDiffusiveRadiationMixedFvPatchField& + ); + + //- Construct and return a clone + virtual tmp<fvPatchScalarField> clone() const + { + return tmp<fvPatchScalarField> + ( + new WideBandDiffusiveRadiationMixedFvPatchField(*this) + ); + } + + //- Construct as copy setting internal field reference + WideBandDiffusiveRadiationMixedFvPatchField + ( + const WideBandDiffusiveRadiationMixedFvPatchField&, + 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 WideBandDiffusiveRadiationMixedFvPatchField(*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_; + } + + + //- Return heat flux on the boundary + const scalarField& qr() const + { + return qr_; + } + + // Mapping functions + + //- Map (and resize as needed) from self given a mapping object + virtual void autoMap + ( + const fvPatchFieldMapper& + ); + + //- Reverse map the given fvPatchField onto this fvPatchField + virtual void rmap + ( + const fvPatchScalarField&, + const labelList& + ); + + + // 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..5a7e5982789642aa1d02f85456fed0bf701adb12 100644 --- a/src/thermophysicalModels/radiation/radiationModel/P1/P1.C +++ b/src/thermophysicalModels/radiation/radiationModel/P1/P1.C @@ -50,6 +50,9 @@ namespace Foam } } +// Radiation solver iteration +Foam::label Foam::radiation::P1::iterRadId = pTraits<label>::one; + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // Construct from components @@ -135,10 +138,12 @@ bool Foam::radiation::P1::read() void Foam::radiation::P1::correct() { - if (!radiation_) + if (!radiation_ || !(iterRadId == nFlowIterPerRadIter_)) { + iterRadId++; return; } + a_ = absorptionEmission_->a(); e_ = absorptionEmission_->e(); E_ = absorptionEmission_->E(); @@ -166,6 +171,8 @@ void Foam::radiation::P1::correct() == - 4.0*(e_*radiation::sigmaSB*pow4(T_) + E_) ); + + iterRadId = pTraits<label>::one; } diff --git a/src/thermophysicalModels/radiation/radiationModel/P1/P1.H b/src/thermophysicalModels/radiation/radiationModel/P1/P1.H index 7215664cf7b95e8e3104e68223874011022adb12..d262330f634f3caa44252d3c4b594728c3667c36 100644 --- a/src/thermophysicalModels/radiation/radiationModel/P1/P1.H +++ b/src/thermophysicalModels/radiation/radiationModel/P1/P1.H @@ -86,6 +86,10 @@ class P1 public: + // Static data members + + static label iterRadId; + //- Runtime type information TypeName("P1"); 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..cf5958aa80703a0e89b1407dc92d65f5fd370380 --- /dev/null +++ b/src/thermophysicalModels/radiation/radiationModel/fvDOM/absorptionCoeffs/absorptionCoeffs.C @@ -0,0 +1,112 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / 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" + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * // + +Foam::radiation::absorptionCoeffs::~absorptionCoeffs() +{} + +// * * * * * * * * * * * * * * * * 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]; + } +} + +void Foam::radiation::absorptionCoeffs::checkT(const scalar T) const +{ + if (T < Tlow_ || T > Thigh_) + { + FatalErrorIn + ( + "absCoeffs::checkT(const scalar T) const" + ) << "attempt to use absCoeff" + " out of temperature range " + << Tlow_ << " -> " << Thigh_ << "; T = " << T + << 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::init +( + const dictionary& dict +) +{ + Tcommon_ = readScalar(dict.lookup("Tcommon")); + Tlow_ = readScalar(dict.lookup("Tlow")); + Thigh_ = readScalar(dict.lookup("Thigh")); + invTemp_ = readBool(dict.lookup("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..dfb22f5f0afcc4e5dbea765cc9cfb89faab18208 --- /dev/null +++ b/src/thermophysicalModels/radiation/radiationModel/fvDOM/absorptionCoeffs/absorptionCoeffs.H @@ -0,0 +1,153 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / 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: + + static const int nCoeffs_ = 6; + typedef FixedList<scalar, nCoeffs_> coeffArray; + +private: + + // Private data + + // Temperature limits of applicability of functions + scalar Tcommon_; + + scalar Tlow_; + + scalar Thigh_; + + // Polynomio 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; + + // Init from a dictionary + void init(const dictionary&); + + // Init from an Istram + inline void init(Istream&) + { + absorptionCoeffs(Istream); + } + + + // Acces Functions + inline bool invTemp() const + { + return invTemp_; + } + + inline scalar Tcommon() const + { + return Tcommon_; + } + + inline scalar Tlow() const + { + return Tlow_; + } + + inline scalar Thigh() const + { + return Thigh_; + } + + inline const coeffArray& highACoeffs() const + { + return highACoeffs_; + } + + inline const coeffArray& lowACoeffs() const + { + return lowACoeffs_; + } + +}; + +} // End namespace Foam + +} // End namespace radiation + +#endif + 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..16efef5fb55646cd0bb827ded7ff4485a65ee4ab --- /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& fn, + const word& instance, + label lambdaj, + const volScalarField& T +) +:blackBodyEmissiveTable_(fn, 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), +bj_(0), +T_(T) +{ + bj_.setSize(lambdaj); + for(label i=0; i < lambdaj; i++) + { + bj_.set + ( + i, + new volScalarField + ( + IOobject + ( + "bj_" + Foam::name(i) , + 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*1e6)[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 +( + label j, + const Vector2D<scalar>& band +) +{ + bj_[j] = 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..5236f780999c5efffde15db9a55c5a486d4f86d2 --- /dev/null +++ b/src/thermophysicalModels/radiation/radiationModel/fvDOM/blackBodyEmission/blackBodyEmission.H @@ -0,0 +1,124 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / 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 Intensity. + +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_; + + scalar flambdaT(const scalar lambdaT) const; + + const dimensionedScalar C1_; + + const dimensionedScalar C2_; + + // Ptr List for enregy black body emission + PtrList<volScalarField> bj_; + + // T + const volScalarField& T_; + +public: + + + // Constructors + blackBodyEmission + ( + const fileName& fn, + const word& instance, + label lambdaj, + const volScalarField& T + ); + + // Destructor + ~blackBodyEmission(); + + + // - 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))); + } + + // Integral Energy at T from lambda1 to lambda2 + + tmp<Foam::volScalarField> EbDeltaLambdaT //dimensionedScalar + ( + const volScalarField& T, + const Vector2D<scalar>& band + ) const; + + // Edit + + // Update black body emission + void correct(label j, const Vector2D<scalar>& band); + + // Acces members + + // Black body spectrum + inline const volScalarField& bj(label i) const + { + return bj_[i]; + } + +}; + +} +} + +#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..90b30142e24141c3ed886ade5defc65e307110a5 --- /dev/null +++ b/src/thermophysicalModels/radiation/radiationModel/fvDOM/fvDOM/fvDOM.C @@ -0,0 +1,353 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / 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 + ); + } +} + +// Radiation solver iterator counter +Foam::label Foam::radiation::fvDOM::iterRadId = pTraits<label>::one; + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +// Construct from components +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) + ), + aj_(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(radiationModelCoeffs_.lookup("Ntheta"))), + Nphi_(readLabel(radiationModelCoeffs_.lookup("Nphi"))), + Ni_(0), + lambdaj_(absorptionEmission_->nBands()), + blackBody_(fileName("blackBodyEmissivePower"), "constant", lambdaj_, T) +{ + aj_.setSize(lambdaj_); + if (mesh_.nSolutionD() == 3) //3D + { + RadIntRay_.setSize(4.* Nphi_* Ntheta_); + Ni_ = 4. * Nphi_ * Ntheta_; + scalar deltaPhi = mathematicalConstant::pi / (2. * 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.*n - 1.)*deltaTheta/2.; + scalar phii = (2.*m - 1.)*deltaPhi/2.; + RadIntRay_.set + ( + i, + new radiativeIntensityRay + ( + phii, thetai, deltaPhi, + deltaTheta, lambdaj_, mesh_, + absorptionEmission_, blackBody_ + ) + ); + i++; + } + } + } + else + { + if (mesh_.nSolutionD() == 2) //2D (X & Y) + { + scalar thetai = mathematicalConstant::pi/2.; + scalar deltaTheta = mathematicalConstant::pi; + RadIntRay_.setSize(4.* Nphi_); + Ni_ = 4. * Nphi_; + scalar deltaPhi = mathematicalConstant::pi / (2. * Nphi_); + label i = 0; + for(label m = 1 ; m <= 4*Nphi_ ; m++) + { + scalar phii = (2.*m - 1.)*deltaPhi/2.; + RadIntRay_.set + ( + i, + new radiativeIntensityRay + ( + phii, thetai, deltaPhi, + deltaTheta, lambdaj_, mesh_, + absorptionEmission_, blackBody_ + ) + ); + i++; + } + } + else //1D (X) + { + scalar thetai = mathematicalConstant::pi/2.; + scalar deltaTheta = mathematicalConstant::pi; + RadIntRay_.setSize(2); + Ni_ = 2.; + scalar deltaPhi = mathematicalConstant::pi; + label i = 0; + for(label m = 1 ; m <= 2 ; m++) + { + scalar phii = (2*m - 1.)*deltaPhi/2.; + RadIntRay_.set + ( + i, + new radiativeIntensityRay + ( + phii, thetai, deltaPhi, + deltaTheta, lambdaj_, mesh_, + absorptionEmission_, blackBody_ + ) + ); + i++; + } + + } + } + + +// Construct absorption for wave length + for(label i=0; i < lambdaj_; i++) + { + volScalarField* volPtr= new volScalarField + ( + IOobject + ( + "aj_" + Foam::name(i) , + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + a_ + ); + + aj_.set(i, volPtr); + } + +} +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::radiation::fvDOM::~fvDOM() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +bool Foam::radiation::fvDOM::read() +{ + if (radiationModel::read()) + { + // nothing to read + + return true; + } + else + { + return false; + } +} + + +void Foam::radiation::fvDOM::correct() +{ + if (!radiation_ || !(iterRadId == nFlowIterPerRadIter_)) + { + iterRadId++; + return; + } + + absorptionEmission_->correct(a_, aj_); + + updateBlackBodyEmission(); + + scalar maxResidual = 0; + scalar convergenceCriterion = 0; + radiationModelCoeffs_.readIfPresent("convergence", convergenceCriterion); + label radIter = 0; + do + { + radIter ++; + for(label i = 0; i < Ni_; i++) // + { + maxResidual = 0; + scalar maxBandResidual = RadIntRay_[i].correct(this); + maxResidual = max(maxBandResidual, maxResidual); + } + + Info << "Radiation solver Iter: " << radIter << endl; + + }while(maxResidual > convergenceCriterion); + + updateG(); + + iterRadId = pTraits<label>::one; +} + +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 < lambdaj_; 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); + + for(label i = 0; i < Ni_; i++) + { + RadIntRay_[i].addIntensity(); + G_ += RadIntRay_[i].I()* RadIntRay_[i].omegai(); + Qr_ += RadIntRay_[i].Qri(); + } +} +// ************************************************************************* // 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..8f6df2adb4a2fa35a5f5e6b6b8fcc516c02be24c --- /dev/null +++ b/src/thermophysicalModels/radiation/radiationModel/fvDOM/fvDOM/fvDOM.H @@ -0,0 +1,257 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / 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. It solves the RTE equation for n + directions in a participating media. It does not consider 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_; + + //- wavelength total Absorption coefficient [1/m] + PtrList<volScalarField> aj_; + + //- 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 directions + label Ni_; + + //- Number of wavelength bands + label lambdaj_; + + //- Black Body + blackBodyEmission blackBody_; + + //- List of Pointers to RadiativeIntensityRay + PtrList<radiativeIntensityRay> RadIntRay_; + + + // 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 Black Body Emissiom + void updateBlackBodyEmission(void); + +public: + + // Static data members + + static label iterRadId; + + //- Runtime type information + TypeName("fvDOM"); + + + // Constructors + + //- Construct from components + fvDOM(const volScalarField& T); + + + // Destructor + + ~fvDOM(); + + + // Member functions + + // Edit + + //- Update radiationSource varible + void correct(); + + //- Read radiationProperties 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 + + //- Intensity Ray on i direction + inline const radiativeIntensityRay& RadIntRay(label i) const + { + return RadIntRay_[i]; + } + + //- Intensity Ray on i direction and j band-width + inline const volScalarField& RadIntRayiLambdaj + ( + const label i, + const label j + ) const + { + return RadIntRay_[i].Ilambdaj(j); + } + + //-Number of angles in theta + label Ntheta() const + { + return Ntheta_; + } + + //- Number of angles in phi + label Nphi() const + { + return Nphi_; + } + + //- Number of directions + label Ni() const + { + return Ni_; + } + + //- Number of wavelengths + inline const label& lambdaj() const + { + return lambdaj_; + } + + // Const access to a + inline const volScalarField& a() const + { + return a_; + } + + // Const access to aj + inline const volScalarField& aj(label i) const + { + return aj_[i]; + } + + // Const access to G + inline const volScalarField& G() const + { + return G_; + } + + // Const access to Qr + inline const volScalarField& Qr() const + { + return Qr_; + } + + // Const access to blavkBody + virtual const blackBodyEmission& blackBody() const + { + return blackBody_; + } +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace radiation +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // 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..5ddc1fca77184f7d07d578d61248082923a1b3a8 --- /dev/null +++ b/src/thermophysicalModels/radiation/radiationModel/fvDOM/interpolationLookUpTable/interpolationLookUpTable.C @@ -0,0 +1,540 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / 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 += Foam::min + ( + Foam::max(label((indices[i]-min_[i])/delta_[i]),0), + dim_[i] + )*dim; + } + + if(lastDim) + { + + + label iLastdim = dim_.size() -1; + totalindex += Foam::min + ( + Foam::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, //Xi + const label ofield, // Yo , Delta Y + const label interfield // Delta X +) 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, //i, + 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.), + max_(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), + delta_(.0), + max_(.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, //i, + 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& key +) const +{ + for + ( + HashTable<label>::const_iterator iter = fieldIndices_.begin(); + iter != fieldIndices_.end(); + ++iter + ) + { + if (fieldIndices_.found(key)) + { + return true; + }; + } + return false; +} + + +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..69f6049fe99458bb3de2d6d493b2f358abda9a9f --- /dev/null +++ b/src/thermophysicalModels/radiation/radiationModel/fvDOM/interpolationLookUpTable/interpolationLookUpTable.H @@ -0,0 +1,247 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / 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> +{ +public: + + // Public data types + +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_; + + //- entries dictionaries + List<dictionary> entries_; + + //- output dictionaries + List<dictionary> output_; + + //- input Indeces 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(); + + // Index table finding using scalarList + label index(const List<scalar>&, const bool lastDim=true) const; + + // Index table finding using scalar + label index(const scalar) const; + + //- check range of lookUpValue + 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 + + bool found(const word& key) 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; + + + // Acces + + inline label findFieldIndex(const word& field) const + { + return fieldIndices_[field]; + } + + inline const List<dictionary>& output() const + { + return output_; + } + + inline const List<dictionary>& entries() const + { + return entries_; + } + + inline const List<scalar>& min() const + { + return min_; + } + + inline const List<label>& dim() const + { + return dim_; + } + + inline const List<scalar>& delta() const + { + return delta_; + } + + inline const List<scalar>& max() const + { + return max_; + } + + inline const word tableName() const + { + return fileName_.name(); + } + // 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); + +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + + +#ifdef NoRepository +# include "interpolationLookUpTable.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // 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..2c519daa174296eaf52899464576eba38ab6faa5 --- /dev/null +++ b/src/thermophysicalModels/radiation/radiationModel/fvDOM/radiativeIntensityRay/radiativeIntensityRay.C @@ -0,0 +1,250 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / 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 * * * * * * * * * * * * * * // + +// Null constructor +Foam::radiation::radiativeIntensityRay::radiativeIntensityRay +( + scalar& phii, + scalar& thetai, + scalar& deltaPhi, + scalar& deltaTheta, + label& lambdaj, + const fvMesh& mesh, + const absorptionEmissionModel& absEmmModel, + const blackBodyEmission& blackBody +) +: + absEmmModel_(absEmmModel), + mesh_(mesh), + 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) + ), + Qri_ + ( + IOobject + ( + "Qr" + name(rayId), + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_, + dimensionedScalar("Qr", dimMass/pow3(dimTime), 0.0) + ) +{ + init(phii,thetai,deltaPhi,deltaTheta,lambdaj); +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::radiation::radiativeIntensityRay::~radiativeIntensityRay() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + + +void Foam::radiation::radiativeIntensityRay::init +( + scalar phii, scalar thetai, scalar deltaPhi, scalar deltaTheta, + scalar lambdaj +) +{ + scalar sinTheta = Foam::sin(thetai); + scalar cosTheta = Foam::cos(thetai); + scalar sinPhi = Foam::sin(phii); + scalar cosPhi = Foam::cos(phii); + vector s = vector(sinTheta*sinPhi, sinTheta*cosPhi, cosTheta); + Si_ = (s); + thetai_ = thetai; + phii_ = phii; + omegai_ = 2. * Foam::sin(thetai)*Foam::sin(deltaTheta/2.)*deltaPhi; + Nlambdaj_ = (lambdaj); + Ilambdaj_.setSize(Nlambdaj_); + const vector& d = vector + ( + sinPhi * Foam::sin(0.5*deltaPhi) * (deltaTheta - Foam::cos(2.*thetai) + * Foam::sin(deltaTheta)) , + cosPhi * Foam::sin(0.5*deltaPhi) * (deltaTheta - Foam::cos(2.*thetai) + * Foam::sin(deltaTheta)) , + 0.5 * deltaPhi * Foam::sin(2.*thetai) * Foam::sin(deltaTheta) + ); + + Di_ = (d); + + forAll(Ilambdaj_, i) + { + IOobject header + ( + "Ilambda_" + name(rayId) + "_"+ name(i), + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ + ); + // check if field exists and can be read + if (header.headerOk()) + { + Ilambdaj_.set + ( + i, + new volScalarField + ( + IOobject + ( + "Ilambda_" + name(rayId) + "_" + name(i), + mesh_.time().timeName(), + mesh_, + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + mesh_ + ) + ); + } + else + { + volScalarField Idefault + ( + IOobject + ( + "Idefault", + mesh_.time().timeName(), + mesh_, + IOobject::MUST_READ, + IOobject::NO_WRITE + ), + mesh_ + ); + + Ilambdaj_.set + ( + i, + new volScalarField + ( + IOobject + ( + "Ilambda_" + name(rayId) + "_"+ name(i), + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + Idefault + ) + ); + } + } + rayId++; +} + +Foam::scalar Foam::radiation::radiativeIntensityRay::correct +( + fvDOM* DomPtr +) +{ + Qri_ = dimensionedScalar("zero",dimMass/pow3(dimTime), 0.0); + + scalar maxResidual = 0.0; + + for(label i = 0; i < Nlambdaj_; i++) + { + volScalarField k = DomPtr->aj(i); + + volScalarField E = absEmmModel_.ECont(i)/Foam::mathematicalConstant::pi; + + surfaceScalarField Ji = Di_ & mesh_.Sf(); + + volScalarField Ib = blackBody_.bj(i)/Foam::mathematicalConstant::pi; + + fvScalarMatrix IiEq + ( + fvm::div(Ji,Ilambdaj_[i],"div(Ji,Ii_h)") + + fvm::Sp(k*omegai_, Ilambdaj_[i]) + == k*omegai_*Ib + E + ); + + 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); + + for(label i = 0; i < Nlambdaj_; i++) + { + I_ += absEmmModel_.addRadInt(i, Ilambdaj_[i]); + } +} + +void Foam::radiation::radiativeIntensityRay::add +( + const scalarField & qr, + label patchI +) const +{ + Qri_.boundaryField()[patchI] += qr; +} + +// ************************************************************************* // 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..a88691ad18e3f5ec27d6e2a5a03601f12fff3841 --- /dev/null +++ b/src/thermophysicalModels/radiation/radiationModel/fvDOM/radiativeIntensityRay/radiativeIntensityRay.H @@ -0,0 +1,214 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / 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 + +SourceFiles + radiativeIntensityRay.C + +\*---------------------------------------------------------------------------*/ + +#ifndef radiativeIntensityRay_H +#define radiativeIntensityRay_H + +#include "absorptionEmissionModel.H" +#include "blackBodyEmission.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace radiation +{ + + +/*---------------------------------------------------------------------------*\ + Class radiativeIntensityRay Declaration +\*---------------------------------------------------------------------------*/ +class fvDOM; + + +class radiativeIntensityRay +{ + + // Private data + + //- absorptionEmissionModel + const absorptionEmissionModel& absEmmModel_; + + //- Temperature + const fvMesh& mesh_; + + // black Body + const blackBodyEmission& blackBody_; + + //- Total Radiative Intensity on i direction / [W/m2] + volScalarField I_; + + // - Total radiative heat flux on boundary on i direction + mutable volScalarField Qri_; + + //- Direction i + vector Si_; + + //- theta angle of direction i + scalar thetai_; + + //- phi angle of direction i + scalar phii_; + + //- solid angle + scalar omegai_; + + //- Number of bands on i direction + label Nlambdaj_; + + //- average vector inside the solid angle + vector Di_; + + //- List of Pointers to Radiative Intensity wave-length + PtrList<volScalarField> Ilambdaj_; + + // Private member functions + + //- Disallow default bitwise copy construct + radiativeIntensityRay(const radiativeIntensityRay&); + + //- Disallow default bitwise assignment + void operator=(const radiativeIntensityRay&); + + //- Integrate Intensity on this direction +// void IntegrateRadiativeIntensity(const label i); +public: + + // Static data members + static label rayId; + + // Constructors + + //- Null constructor + radiativeIntensityRay + ( + scalar& phii, + scalar& thetai, + scalar& deltaPhi, + scalar& deltaTheta, + label& lambdaj, + const fvMesh& mesh_, + const absorptionEmissionModel& absEmmModel_, + const blackBodyEmission& blackBody + ); + + + // Destructor + + ~radiativeIntensityRay(); + + + // Member functions + + // Edit + + // Update radiative intensity on i direction + scalar correct(fvDOM*); + + // init the ray on i direction + void init + ( + scalar phii, scalar thetai, scalar deltaPhi,scalar + deltaTheta, scalar lambda + ); + + // add radiative heat flux on walls from the boundary patch + void add(const scalarField&, label) const; + + // add Radiative intensities from all the bands + void addIntensity(); + + // Access + + //- Return Intensity on i direction + inline const volScalarField& I() const + { + return I_; + } + + //- Return heat flux on boundary on i direction + inline const volScalarField& Qri() const + { + return Qri_; + } + + inline const vector Si() const + { + return Si_; + } + + inline const vector Di() const + { + return Di_; + } + + scalar lambdaj() const + { + return Nlambdaj_; + } + + scalar phii() const + { + return phii_; + } + + scalar thetai() const + { + return thetai_; + } + + scalar omegai() const + { + return omegai_; + } + + + const volScalarField& Ilambdaj(label i) const + { + return Ilambdaj_[i]; + } + +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace radiation +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/thermophysicalModels/radiation/radiationModel/radiationModel/newRadiationModel.C b/src/thermophysicalModels/radiation/radiationModel/radiationModel/newRadiationModel.C index 9822578114692dcfbcd05db74144e421eae87507..a30d7946f4c94b03eb76aeb056a22d56f3cdbf1a 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().db(), IOobject::MUST_READ, IOobject::NO_WRITE ) @@ -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..faf26873f150655f5616408d5e384e11fbb210f2 100644 --- a/src/thermophysicalModels/radiation/radiationModel/radiationModel/radiationModel.C +++ b/src/thermophysicalModels/radiation/radiationModel/radiationModel/radiationModel.C @@ -54,8 +54,8 @@ Foam::radiation::radiationModel::radiationModel IOobject ( "radiationProperties", - T.time().constant(), - T.db(), + T.mesh().time().constant(), + T.mesh().db(), IOobject::MUST_READ, IOobject::NO_WRITE ) @@ -64,6 +64,7 @@ Foam::radiation::radiationModel::radiationModel mesh_(T.mesh()), radiation_(lookup("radiation")), radiationModelCoeffs_(subDict(type + "Coeffs")), + nFlowIterPerRadIter_(readLabel(lookup("nFlowIterPerRadIter"))), absorptionEmission_(absorptionEmissionModel::New(*this, mesh_)), scatter_(scatterModel::New(*this, mesh_)) {} diff --git a/src/thermophysicalModels/radiation/radiationModel/radiationModel/radiationModel.H b/src/thermophysicalModels/radiation/radiationModel/radiationModel/radiationModel.H index 4fc4e25c43874d656a5e620150f5e37e5ac920ed..e0ec9709e0270dc5ef16c4aa62b177be04f3deea 100644 --- a/src/thermophysicalModels/radiation/radiationModel/radiationModel/radiationModel.H +++ b/src/thermophysicalModels/radiation/radiationModel/radiationModel/radiationModel.H @@ -49,6 +49,7 @@ SourceFiles #include "volFields.H" #include "basicThermo.H" #include "fvMatrices.H" +#include "blackBodyEmission.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -82,9 +83,12 @@ protected: //- Model specific dictionary input parameters Switch radiation_; + //- Radiation model dictionary dictionary radiationModelCoeffs_; + //- Number of iteration in the Flow solver per Radiative solver + label nFlowIterPerRadIter_; // References to the radiation sub-models @@ -95,6 +99,7 @@ protected: autoPtr<scatterModel> scatter_; + private: // Private Member Functions @@ -106,6 +111,7 @@ private: void operator=(const radiationModel&); + public: //- Runtime type information @@ -174,6 +180,8 @@ public: ( 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..6e2c11a8813a91a79354a9f1cee9194abfe1858e 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(label i) const { - return aDisp() + aCont(); + return aDisp(i) + aCont(i); } Foam::tmp<Foam::volScalarField> -Foam::radiation::absorptionEmissionModel::aCont() const +Foam::radiation::absorptionEmissionModel::aCont(label i) 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(label i) 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(label i) const { - return eDisp() + eCont(); + return eDisp(i) + eCont(i); } Foam::tmp<Foam::volScalarField> -Foam::radiation::absorptionEmissionModel::eCont() const +Foam::radiation::absorptionEmissionModel::eCont(label i) 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(label i) 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(label i) const { - return EDisp() + ECont(); + return EDisp(i) + ECont(i); } Foam::tmp<Foam::volScalarField> -Foam::radiation::absorptionEmissionModel::ECont() const +Foam::radiation::absorptionEmissionModel::ECont(label i) 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(label i) const { return tmp<volScalarField> ( @@ -216,5 +216,41 @@ 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(label n) const +{ + + return Vector2D<scalar>::one; +} + +bool Foam::radiation::absorptionEmissionModel::isGrey(void) const +{ + return false; +} +Foam::tmp<Foam::volScalarField> +Foam::radiation::absorptionEmissionModel::addRadInt +( + const label i, + const volScalarField& Ilambdaj +) const +{ + return Ilambdaj; +} + +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..7dd266e920dc3d47f134d92ddb6692eb163fdd4f 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" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -115,37 +116,69 @@ public: // Absorption coefficient //- Absorption coefficient (net) - virtual tmp<volScalarField> a() const; + virtual tmp<volScalarField> a(const label i = 0) const; //- Absorption coefficient for continuous phase - virtual tmp<volScalarField> aCont() const; + virtual tmp<volScalarField> aCont(const label i = 0) const; //- Absorption coefficient for dispersed phase - virtual tmp<volScalarField> aDisp() const; + virtual tmp<volScalarField> aDisp(const label i = 0) const; // Emission coefficient //- Emission coefficient (net) - virtual tmp<volScalarField> e() const; + virtual tmp<volScalarField> e(const label i = 0) const; //- Return emission coefficient for continuous phase - virtual tmp<volScalarField> eCont() const; + virtual tmp<volScalarField> eCont(const label i = 0) const; //- Return emission coefficient for dispersed phase - virtual tmp<volScalarField> eDisp() const; + virtual tmp<volScalarField> eDisp(const label i = 0) const; // Emission contribution //- Emission contribution (net) - virtual tmp<volScalarField> E() const; + virtual tmp<volScalarField> E(const label i = 0) const; //- Emission contribution for continuous phase - virtual tmp<volScalarField> ECont() const; + virtual tmp<volScalarField> ECont(const label i = 0) const; //- Emission contribution for dispersed phase - virtual tmp<volScalarField> EDisp() const; + virtual tmp<volScalarField> EDisp(const label i = 0) const; + + inline const fvMesh& mesh() const + { + return mesh_; + } + + // Default for grey absorptionEmission model return 1 + virtual label nBands() const; + + // Default for grey absorptionEmission model return Vector2D::one + virtual const Vector2D<scalar>& bands + ( + label n + ) const; + + // Is the absorptionEmission grey + virtual bool isGrey(void) const; + + + // Add radiative intensity fir ray i + virtual tmp<volScalarField> addRadInt + ( + const label i, + const volScalarField& Ilambdaj + ) const; + + // Correct absorption coefficients + virtual void correct + ( + volScalarField& a_, + PtrList<volScalarField>& aj_ + ) const ; }; diff --git a/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/constantAbsorptionEmission/constantAbsorptionEmission.C b/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/constantAbsorptionEmission/constantAbsorptionEmission.C index 1ab215c6b7fee4679587db4f9cbf2ca841b96515..d37884388824b97af70bd4e881a4169ea1807284 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(label i) 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(label i) 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(label i) 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..611bb01b96b877c0eff3489c8f667a9b25164d9e 100644 --- a/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/constantAbsorptionEmission/constantAbsorptionEmission.H +++ b/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/constantAbsorptionEmission/constantAbsorptionEmission.H @@ -98,19 +98,26 @@ public: // Absorption coefficient //- Absorption coefficient for continuous phase - tmp<volScalarField> aCont() const; + tmp<volScalarField> aCont(const label i = 0) const; // Emission coefficient //- Emission coefficient for continuous phase - tmp<volScalarField> eCont() const; + tmp<volScalarField> eCont(const label i = 0) const; // Emission contribution //- Emission contribution for continuous phase - tmp<volScalarField> ECont() const; + tmp<volScalarField> ECont(const label i = 0) const; + + // Member Functions + + inline bool isGrey(void) 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..cd111cd46486515b1ec4f9bb80e7127a8f4d12d5 --- /dev/null +++ b/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/greyMeanAbsorptionEmission/greyMeanAbsorptionEmission.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 "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")), + "constant", + mesh + ), + thermo_(mesh.db().lookupObject<basicThermo>("thermophysicalProperties")), + EhrrCoeff_(readScalar(coeffsDict_.lookup("EhrrCoeff"))), + Yj_(0) +{ + Yj_.setSize(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].init(dict); + nFunc++; + } + +// Check that all the species on the dictionary are present in the LookupTable +// and save the corresponding indexes of the LookupTable + + label j = 0; + forAllConstIter(HashTable<label>, speciesNames_, iter) + { + if(mesh.db().foundObject<volScalarField>("ft")) + { + + if(LookUpTable_.found(iter.key())) + { + label index = LookUpTable_.findFieldIndex(iter.key()); + + Info << "specie: " << iter.key() << " found on LookUpTable" + << " with index: " << index << endl; + + specieIndex_[iter()] = index; + } + else if(mesh.db().foundObject<volScalarField>(iter.key())) + { + volScalarField& Y = const_cast<volScalarField&> + (mesh.db().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(label iband) const +{ + const volScalarField& T = thermo_.T(); + const volScalarField& p = thermo_.p(); + const volScalarField& ft = + this->mesh().db().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 + { + Yipi = Yj_[l][i]; // mass fraction + l++; + } + + const absorptionCoeffs::coeffArray& b = coeffs_[n].coeffs(T[i]); + + scalar Ti = T[i]; + if (coeffs_[n].invTemp()) //negative Temp exponents + { + 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(label iband) 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(label iband) 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().db().foundObject<volScalarField>("hrr")) + { + const volScalarField& hrr = + mesh().db().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..a7aa97aadd464c58bc5b94ba4faa88a2c8f17fe0 --- /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 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. + + 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 polynomio using inverse temperature. + Tlow 300.; //Low Temp + Thigh 2500.; //Hight Temp + + loTcoeffs //coefss 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 //coefss 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: + + + // - Maximum number of species considered for absorptivity + static const int nSpecies_ = 5; + + // Absorption Coefficients + absorptionCoeffs coeffs_[nSpecies_]; + +private: + //- Absorption model dictionary + dictionary coeffsDict_; + + // Hash table with species names + HashTable<label> speciesNames_; + + // Indexes of species in the LookUpTable + FixedList<label,nSpecies_> specieIndex_; + + + // Look Up table of species related to ft + mutable interpolationLookUpTable<scalar> LookUpTable_; + + // Thermo + 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 + + ~greyMeanAbsorptionEmission(); + + + // Member Operators + + // Access + + // Absorption coefficient + + //- Absorption coefficient for continuous phase + tmp<volScalarField> aCont(const label i = 0) const; + + + // Emission coefficient + + //- Emission coefficient for continuous phase + tmp<volScalarField> eCont(const label i = 0) const; + + + // Emission contribution + + //- Emission contribution for continuous phase + tmp<volScalarField> ECont(const label i = 0) const; + + // Member Functions + + inline bool isGrey(void) const + { + return true; + } +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace radiation +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // 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..4f2a0dd09934464f39fb537a74dc1371c25d4978 --- /dev/null +++ b/src/thermophysicalModels/radiation/submodels/absorptionEmissionModel/wideBandAbsorptionEmission/wideBandAbsorptionEmission.C @@ -0,0 +1,318 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / 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")), + "constant", + mesh + ), + thermo_(mesh.db().lookupObject<basicThermo>("thermophysicalProperties")), + Yj_(0), + totalWaveLength_(0) +{ + Yj_.setSize(nSpecies_); + 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].init(SpecDicts.subDict(key)); + nSpec++; + } + nBand++; + } + nBands_ = nBand; + +/* +Check that all the species on the dictionary are present in the +LookupTable and save the corresponding indexes of the LookupTable +*/ + + 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 LookUpTable" + << " with index: " << index << endl; + specieIndex_[iter()] = index; + } + else if + (mesh.db().foundObject<volScalarField>(iter.key())) + { + volScalarField& Y = const_cast<volScalarField&> + (mesh.db().lookupObject<volScalarField>(iter.key())); + + Yj_.set(j, &Y); + + specieIndex_[iter()] = 0.; + j++; + Info << "specie : " << 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 slved" + << exit(FatalError); + } + } +} + + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::radiation::wideBandAbsorptionEmission::~wideBandAbsorptionEmission() +{} + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +Foam::tmp<Foam::volScalarField> +Foam::radiation::wideBandAbsorptionEmission::aCont(label iband) const +{ + const volScalarField& T = thermo_.T(); + const volScalarField& p = thermo_.p(); + const volScalarField& ft = + this->mesh().db().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 + { + Yipi = Yj_[l][i]; // mass fraction from species being solved + l++; + } + + scalar Ti = T[i]; + + const absorptionCoeffs::coeffArray& b = + coeffs_[n][iband].coeffs(T[i]); + + if (coeffs_[n][iband].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(label iband) 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(label iband) 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().db().foundObject<volScalarField>("hrr")) + { + const volScalarField& hrr = + mesh().db().lookupObject<volScalarField>("hrr"); + E().internalField() = iEhrrCoeffs_[iband] * hrr.internalField() * + (iBands_[iband][1] - iBands_[iband][0])/totalWaveLength_; + } + + + return E; +} + +Foam::tmp<Foam::volScalarField> +Foam::radiation::wideBandAbsorptionEmission::addRadInt +( + const label i, + const volScalarField& Ilambdaj +) const +{ + return Ilambdaj*(iBands_[i][1] - iBands_[i][0])/totalWaveLength_; +} + + +void Foam::radiation::wideBandAbsorptionEmission::correct +( + volScalarField& a, + PtrList<volScalarField>& aj +) const +{ + a = dimensionedScalar("zero",dimless/dimLength, 0.0); + + for(label j = 0; j < nBands_; j++) + { + Info << "Calculating... absorption in band : " << j <<endl; + aj[j].internalField() = this->a(j); + Info << "Calculated absorption in band : " << j <<endl; + a.internalField() += aj[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..2e127787d4c38b67b6d38523d997f2eb113e4de2 --- /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: + + + // - 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: + //- Absorption model dictionary + dictionary coeffsDict_; + + //- Hash table with species names + HashTable<label> speciesNames_; + + //- Indexes of species in the LookUpTable + 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 + const basicThermo& thermo_; + + //- Bands + label nBands_ ; + + //- Pointer list of species being solved involved in the absorption + UPtrList<volScalarField> Yj_; + + // Total wave lenght cover by the bands + scalar totalWaveLength_; + +public: + + + //- Runtime type information + TypeName("wideBandAbsorptionEmission"); + + + // Constructors + + //- Construct from components + wideBandAbsorptionEmission + ( + const dictionary& dict, + const fvMesh& mesh + ); + + + // Destructor + + ~wideBandAbsorptionEmission(); + + + // Member Operators + + // Access + + // Absorption coefficient + + //- Absorption coefficient for continuous phase + tmp<volScalarField> aCont(const label i = 0) const; + + + // Emission coefficient + + //- Emission coefficient for continuous phase + tmp<volScalarField> eCont(const label i = 0) const; + + + // Emission contribution + + //- Emission contribution for continuous phase + tmp<volScalarField> ECont(const label i = 0) const; + + // Member Functions + + inline bool isGrey(void) const + { + return false; + } + + // Number of bands + label nBands() const + { + return nBands_; + } + + // lower and upper limit of band i + inline const Vector2D<scalar>& bands(label i) const + { + return iBands_[i]; + } + + // Add contribution of Ilambdaj to the total Radiative Intensity on + //direction i + tmp<volScalarField> addRadInt + ( + const label i, + const volScalarField& Ilambdaj + ) const; + + void correct(volScalarField& a_, PtrList<volScalarField>& aj) const; + +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace radiation +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* //