Merge branch 'nr/DominikChrist' into nextRelease

This commit is contained in:
Dominik Christ 2013-07-19 13:52:25 +01:00
commit 062cac462c
226 changed files with 15674 additions and 528 deletions

View file

@ -0,0 +1,8 @@
#!/bin/sh
cd ${0%/*} || exit 1 # run from this directory
set -x
wmake libso conjugateHeatTransfer
wmake
# ----------------------------------------------------------------- end-of-file

View file

@ -1,9 +1,22 @@
EXE_INC = \ EXE_INC = \
-IconjugateHeatTransfer/lnInclude \
-I$(LIB_SRC)/turbulenceModels \
-I$(LIB_SRC)/turbulenceModels/incompressible/RAS/RASModel \
-I$(LIB_SRC)/turbulenceModels/incompressible/turbulenceModel \
-I$(LIB_SRC)/transportModels \
-I$(LIB_SRC)/transportModels/incompressible/singlePhaseTransportModel \
-I$(LIB_SRC)/coupledMatrix/lnInclude \ -I$(LIB_SRC)/coupledMatrix/lnInclude \
-I$(LIB_SRC)/finiteVolume/lnInclude -I$(LIB_SRC)/finiteVolume/lnInclude \
-I$(LIB_SRC)/thermophysicalModels/radiation/lnInclude \
-I$(LIB_SRC)/thermophysicalModels/basic/lnInclude
EXE_LIBS = \ EXE_LIBS = \
-lincompressibleTurbulenceModel \
-lincompressibleRASModels \
-lincompressibleTransportModels \
-lcoupledLduMatrix \ -lcoupledLduMatrix \
-lfiniteVolume \ -lfiniteVolume \
-llduSolvers -lradiation \
-lbasicThermophysicalModels \
-lspecie \
-lconjugateHeatTransfer

View file

@ -0,0 +1,26 @@
// Solve the momentum equation
fvVectorMatrix UEqn
(
fvm::ddt(U)
+ fvm::div(phi, U)
+ turbulence->divDevReff(U)
);
UEqn.relax();
if (momentumPredictor)
{
solve
(
UEqn
==
fvc::reconstruct
(
(
- ghf*fvc::snGrad(rhok)
- fvc::snGrad(p_rgh)
)*mesh.magSf()
)
);
}

View file

@ -14,5 +14,5 @@
} }
// Force recalculation of weights // Force recalculation of weights
mesh.surfaceInterpolation::movePoints(); mesh.surfaceInterpolation::movePoints();
} }

View file

@ -2,8 +2,8 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright held by original author \\ / A nd | Copyright (C) 2008-2011 H. Jasak & H. Rusche
\\/ M anipulation | \\/ M anipulation | All rights reserved
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -25,45 +25,92 @@ License
Application Application
conjugateHeatFoam conjugateHeatFoam
Author
Hrvoje Jasak, Wikki Ltd. All rights reserved.
Description Description
Transient solver for incompressible, laminar flow of Newtonian fluids Transient solver for buoyancy-driven turbulent flow of incompressible
with conjugate heat transfer Newtonian fluids with conjugate heat transfer, complex heat conduction
and radiation
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "fvCFD.H" #include "fvCFD.H"
#include "coupledFvMatrices.H" #include "coupledFvMatrices.H"
#include "regionCouplePolyPatch.H" #include "regionCouplePolyPatch.H"
#include "radiationModel.H"
#include "thermalModel.H"
#include "singlePhaseTransportModel.H"
#include "RASModel.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
# include "setRootCase.H" # include "setRootCase.H"
# include "createTime.H" # include "createTime.H"
# include "createFluidMesh.H" # include "createFluidMesh.H"
# include "attachPatches.H"
# include "createSolidMesh.H" # include "createSolidMesh.H"
# include "readGravitationalAcceleration.H"
# include "createFields.H" # include "createFields.H"
# include "createSolidFields.H" # include "createSolidFields.H"
# include "initContinuityErrs.H" # include "initContinuityErrs.H"
# include "readTimeControls.H"
# include "CourantNo.H"
# include "setInitialDeltaT.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
Info<< "\nStarting time loop\n" << endl; Info<< "\nStarting time loop\n" << endl;
for (runTime++; !runTime.end(); runTime++) while (runTime.loop())
{ {
Info<< "Time = " << runTime.timeName() << nl << endl; Info<< "Time = " << runTime.timeName() << nl << endl;
# include "solveFluid.H" # include "readTimeControls.H"
# include "readPISOControls.H"
# include "CourantNo.H"
# include "setDeltaT.H"
// Detach patches
# include "detachPatches.H"
# include "UEqn.H"
p_rgh.storePrevIter();
for (int corr = 0; corr < nCorr; corr++)
{
# include "pEqn.H"
}
// Update turbulent quantities
turbulence->correct();
radiation->correct();
// Update thermal conductivity in the fluid
kappaEff = rho*Cp*(turbulence->nu()/Pr + turbulence->nut()/Prt);
// Update thermal conductivity in the solid
solidThermo.correct();
ksolid = solidThermo.k();
rhoCpsolid.oldTime();
rhoCpsolid = solidThermo.rho()*solidThermo.C();
// Coupled patches
# include "attachPatches.H"
kappaEff.correctBoundaryConditions();
ksolid.correctBoundaryConditions();
// Interpolate to the faces and add thermal resistance
surfaceScalarField ksolidf = fvc::interpolate(ksolid);
solidThermo.modifyResistance(ksolidf);
# include "solveEnergy.H" # include "solveEnergy.H"
// Update density according to Boussinesq approximation
rhok = 1.0 - beta*(T - TRef);
runTime.write(); runTime.write();
Info<< "ExecutionTime = " Info<< "ExecutionTime = "

View file

@ -0,0 +1,49 @@
thermalModel/thermalModel.C
thermalLaws = thermalModel/thermalLaws
$(thermalLaws)/thermalLaw/thermalLaw.C
$(thermalLaws)/thermalLaw/newThermalLaw.C
$(thermalLaws)/constantThermal/constantThermal.C
$(thermalLaws)/multiMaterialThermal/multiMaterialThermal.C
$(thermalLaws)/multiMaterialZonesThermal/multiMaterialZonesThermal.C
thermalGaps = thermalModel/thermalGaps
$(thermalGaps)/thermalGap/thermalGap.C
$(thermalGaps)/thermalGap/newThermalGap.C
$(thermalGaps)/constantThermalGap/constantThermalGap.C
$(thermalGaps)/constantResistanceThermalGap/constantResistanceThermalGap.C
thermalSource = thermalModel/thermalSource
$(thermalSource)/thermalSource/thermalSource.C
$(thermalSource)/thermalSource/newThermalSource.C
$(thermalSource)/constantThermalSource/constantThermalSource.C
BCs = fvPatchFields
$(BCs)/controlledParabolicVelocity/controlledParabolicVelocityFvPatchVectorField.C
$(BCs)/chtRegionCoupleBase/chtRegionCoupleBase.C
$(BCs)/chtRcThermalDiffusivity/chtRcThermalDiffusivityFvPatchScalarField.C
$(BCs)/chtRcTemperature/chtRcTemperatureFvPatchScalarField.C
$(BCs)/chtRcThermalDiffusivityResistance/chtRcThermalDiffusivityResistanceFvPatchScalarField.C
$(BCs)/chtRcThermalDiffusivitySlave/chtRcThermalDiffusivitySlaveFvPatchScalarField.C
$(BCs)/extendedWallHeatTransfer/extendedWallHeatTransferFvPatchScalarField.C
$(BCs)/externalRadiation/externalRadiationSource/externalRadiationSource.C
$(BCs)/externalRadiation/externalRadiationSource/newExternalRadiationSource.C
$(BCs)/externalRadiation/ersConstantFlux/ersConstantFlux.C
$(BCs)/externalRadiation/ersViewFactor/ersViewFactor.C
$(BCs)/externalRadiation/ersPlaneToCylinder/ersPlaneToCylinder.C
$(BCs)/externalRadiation/ersPointSource/ersPointSource.C
$(BCs)/solidWallHeatFluxTemperature/solidWallHeatFluxTemperatureFvPatchScalarField.C
$(BCs)/adiabatic/adiabaticFvPatchScalarField.C
FOs = functionObjects
$(FOs)/heatFlux/heatFlux/heatFlux.C
$(FOs)/heatFlux/heatFluxFunctionObject/heatFluxFunctionObject.C
LIB = $(FOAM_LIBBIN)/libconjugateHeatTransfer

View file

@ -0,0 +1,13 @@
EXE_INC = \
-I$(LIB_SRC)/finiteVolume/lnInclude \
-I$(LIB_SRC)/thermophysicalModels/radiation/lnInclude \
-I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
-I$(LIB_SRC)/VectorN/lnInclude
LIB_LIBS = \
-lfiniteVolume \
-lspecie \
-lbasicThermophysicalModels \
-lradiation \
-lVectorN

View file

@ -0,0 +1,97 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2009-2011 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "fieldAverageItem.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
template<>
const char* Foam::NamedEnum
<
Foam::fieldAverageItem::baseType,
2
>::names[] =
{
"iteration",
"time"
};
}
const Foam::NamedEnum<Foam::fieldAverageItem::baseType, 2>
Foam::fieldAverageItem::baseTypeNames_;
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::fieldAverageItem::fieldAverageItem()
:
fieldName_("unknown"),
mean_(0),
prime2Mean_(0),
base_(ITER)
{}
Foam::fieldAverageItem::fieldAverageItem(const fieldAverageItem& faItem)
:
fieldName_(faItem.fieldName_),
mean_(faItem.mean_),
prime2Mean_(faItem.prime2Mean_),
base_(faItem.base_)
{}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::fieldAverageItem::~fieldAverageItem()
{}
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
void Foam::fieldAverageItem::operator=(const fieldAverageItem& rhs)
{
// Check for assignment to self
if (this == &rhs)
{
FatalErrorIn
(
"Foam::fieldAverageItem::operator=(const Foam::fieldAverageItem&)"
) << "Attempted assignment to self" << nl
<< abort(FatalError);
}
// Set updated values
fieldName_ = rhs.fieldName_;
mean_ = rhs.mean_;
prime2Mean_ = rhs.prime2Mean_;
base_ = rhs.base_;
}
// ************************************************************************* //

View file

@ -0,0 +1,208 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2009-2011 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Class
Foam::fieldAverageItem
Description
Helper class to describe what form of averaging to apply. A set will be
applied to each base field in Foam::fieldAverage, of the form:
\verbatim
{
mean on;
prime2Mean on;
base time; // iteration
}
\endverbatim
SourceFiles
fieldAverageItem.C
fieldAverageItemIO.C
\*---------------------------------------------------------------------------*/
#ifndef fieldAverageItem_H
#define fieldAverageItem_H
#include "NamedEnum.H"
#include "Switch.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// Forward declaration of classes
class Istream;
class Ostream;
// Forward declaration of friend functions and operators
class fieldAverageItem;
Istream& operator>>(Istream&, fieldAverageItem&);
Ostream& operator<<(Ostream&, const fieldAverageItem&);
/*---------------------------------------------------------------------------*\
Class fieldAverageItem Declaration
\*---------------------------------------------------------------------------*/
class fieldAverageItem
{
public:
// Public data
//- Enumeration defining the averaging base type
enum baseType
{
ITER,
TIME
};
private:
// Private data
//- Field name
word fieldName_;
//- Compute mean flag
Switch mean_;
//- Compute prime-squared mean flag
Switch prime2Mean_;
//- Averaging base type names
static const NamedEnum<baseType, 2> baseTypeNames_;
//- Averaging base type
baseType base_;
public:
// Constructors
//- Construct null
fieldAverageItem();
//- Construct from Istream
fieldAverageItem(Istream&);
//- Construct as copy
fieldAverageItem(const fieldAverageItem&);
//- Destructor
~fieldAverageItem();
// Member Functions
// Access
//- Return const access to the field name
const word& fieldName() const
{
return fieldName_;
}
//- Return const access to the mean flag
const Switch& mean() const
{
return mean_;
}
//- Return const access to the prime-squared mean flag
const Switch& prime2Mean() const
{
return prime2Mean_;
}
//- Return averaging base type name
const word base() const
{
return baseTypeNames_[base_];
}
//- Return true if base is ITER
Switch ITERBase() const
{
return base_ == ITER;
}
//- Return true if base is time
Switch timeBase() const
{
return base_ == TIME;
}
// Member Operators
void operator=(const fieldAverageItem&);
// Friend Operators
friend bool operator==
(
const fieldAverageItem& a,
const fieldAverageItem& b
)
{
return
a.fieldName_ == b.fieldName_
&& a.mean_ == b.mean_
&& a.prime2Mean_ == b.prime2Mean_
&& a.base_ == b.base_;
}
friend bool operator!=
(
const fieldAverageItem& a,
const fieldAverageItem& b
)
{
return !(a == b);
}
// IOstream Operators
friend Istream& operator>>(Istream&, fieldAverageItem&);
friend Ostream& operator<<(Ostream&, const fieldAverageItem&);
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -0,0 +1,95 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2009-2011 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "fieldAverageItem.H"
#include "IOstreams.H"
#include "dictionaryEntry.H"
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::fieldAverageItem::fieldAverageItem(Istream& is)
:
fieldName_("unknown"),
mean_(0),
prime2Mean_(0)
{
is.check("Foam::fieldAverageItem::fieldAverageItem(Foam::Istream&)");
const dictionaryEntry entry(dictionary::null, is);
fieldName_ = entry.keyword();
entry.lookup("mean") >> mean_;
entry.lookup("prime2Mean") >> prime2Mean_;
base_ = baseTypeNames_[entry.lookup("base")];
}
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
Foam::Istream& Foam::operator>>(Istream& is, fieldAverageItem& faItem)
{
is.check
(
"Foam::Istream& Foam::operator>>"
"(Foam::Istream&, Foam::fieldAverageItem&)"
);
const dictionaryEntry entry(dictionary::null, is);
faItem.fieldName_ = entry.keyword();
entry.lookup("mean") >> faItem.mean_;
entry.lookup("prime2Mean") >> faItem.prime2Mean_;
faItem.base_ = faItem.baseTypeNames_[entry.lookup("base")];
return is;
}
Foam::Ostream& Foam::operator<<(Ostream& os, const fieldAverageItem& faItem)
{
os.check
(
"Foam::Ostream& Foam::operator<<"
"(Foam::Ostream&, const Foam::fieldAverageItem&)"
);
os << faItem.fieldName_ << nl << token::BEGIN_BLOCK << nl;
os.writeKeyword("mean") << faItem.mean_ << token::END_STATEMENT << nl;
os.writeKeyword("prime2Mean") << faItem.mean_
<< token::END_STATEMENT << nl;
os.writeKeyword("base") << faItem.baseTypeNames_[faItem.base_]
<< token::END_STATEMENT << nl << token::END_BLOCK << nl;
os.check
(
"Foam::Ostream& Foam::operator<<"
"(Foam::Ostream&, const Foam::fieldAverageItem&)"
);
return os;
}
// ************************************************************************* //

View file

@ -0,0 +1,49 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2009-2011 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Typedef
Foam::IOfieldAverage
Description
Instance of the generic IOOutputFilter for fieldAverage.
\*---------------------------------------------------------------------------*/
#ifndef IOfieldAverage_H
#define IOfieldAverage_H
#include "fieldAverage.H"
#include "IOOutputFilter.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
typedef IOOutputFilter<fieldAverage> IOFieldAverage;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -0,0 +1,18 @@
{
const polyPatchList& patches = mesh.boundaryMesh();
forAll (patches, patchI)
{
if (isType<regionCouplePolyPatch>(patches[patchI]))
{
const regionCouplePolyPatch& rcp =
refCast<const regionCouplePolyPatch>(patches[patchI]);
// Detach it here
rcp.detach();
}
}
// Force recalculation of weights
mesh.surfaceInterpolation::movePoints();
}

View file

@ -0,0 +1,241 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2009-2011 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "heatFlux.H"
#include "volFields.H"
#include "surfaceFields.H"
#include "fvc.H"
#include "chtRcTemperatureFvPatchScalarField.H"
#include "processorFvPatchFields.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
defineTypeNameAndDebug(Foam::heatFlux, 0);
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::heatFlux::heatFlux
(
const word& name,
const objectRegistry& obr,
const dictionary& dict,
const bool loadFromFiles
)
:
name_(name),
Kfluid_(dict.lookup("K")),
obr_(obr),
active_(true)
{
// Only active if a fvMesh is available
if (isA<fvMesh>(obr_))
{
read(dict);
}
else
{
active_ = false;
WarningIn
(
"heatFlux::heatFlux\n"
"(\n"
"const word&,\n"
"const objectRegistry&,\n"
"const dictionary&,\n"
"const bool\n"
")"
) << "No fvMesh available, deactivating."
<< nl << endl;
}
}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::heatFlux::~heatFlux()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::heatFlux::calcAndPrint()
{
const volScalarField& T =
obr_.lookupObject<volScalarField>("T");
const volScalarField& kappaEff =
obr_.lookupObject<volScalarField>(Kfluid_);
//const surfaceScalarField& kappaEff =
// obr_.lookupObject<surfaceScalarField>(Kfluid_);
scalar rho = 1.2;
scalar Cp = 1000;
const fvMesh& mesh = T.mesh();
surfaceScalarField heatFluxD =
-fvc::interpolate(kappaEff)*fvc::snGrad(T);
// -kappaEff*fvc::snGrad(T);
const surfaceScalarField::GeometricBoundaryField& patchHeatFluxD =
heatFluxD.boundaryField();
//const surfaceScalarField::GeometricBoundaryField& patchHeatFluxD =
// heatFluxC.boundaryField();
//surfaceScalarField::GeometricBoundaryField patchHeatFluxC =
scalar sumConduction = 0.0;
scalar sumConvection = 0.0;
scalar sumRadiation = 0.0;
Info<< "\nWall heat fluxes [W]" << endl;
forAll(patchHeatFluxD, patchi)
{
if(isA<processorFvPatchScalarField>(T.boundaryField()[patchi]))
{
continue;
}
scalar conduction = gSum
(
mesh.magSf().boundaryField()[patchi]
*heatFluxD.boundaryField()[patchi]
);
// Account for heat sources at region couple BCs
if(isA<chtRcTemperatureFvPatchScalarField>(T.boundaryField()[patchi]))
{
const chtRcTemperatureFvPatchScalarField& pT =
dynamic_cast<const chtRcTemperatureFvPatchScalarField&>
(
T.boundaryField()[patchi]
);
conduction -= gSum
(
pT.source()*mesh.magSf().boundaryField()[patchi]
);
}
scalar convection = 0.0;
scalar radiation = 0.0;
if(obr_.foundObject<surfaceScalarField>("phi"))
{
const surfaceScalarField& phi =
obr_.lookupObject<surfaceScalarField>("phi");
convection = gSum
(
rho*Cp*T.boundaryField()[patchi]
*phi.boundaryField()[patchi]
);
}
if(obr_.foundObject<volScalarField>("Qr"))
{
const volScalarField& Qr =
obr_.lookupObject<volScalarField>("Qr");
radiation = gSum
(
Qr.boundaryField()[patchi]
*mesh.magSf().boundaryField()[patchi]
);
}
Info<< mesh.boundary()[patchi].name()
<< " "
<< conduction
<< " "
<< convection
<< " "
<< radiation
<< " "
<< conduction + convection + radiation
<< endl;
sumConduction += conduction;
sumConvection += convection;
sumRadiation += radiation;
}
Info<< "sum "
<< sumConduction
<< " "
<< sumConvection
<< " "
<< sumRadiation
<< " "
<< sumConduction + sumConvection + sumRadiation
<< nl << endl;
}
void Foam::heatFlux::read(const dictionary& dict)
{
if (active_)
{
}
}
void Foam::heatFlux::execute()
{
if (active_)
{
calcAndPrint();
}
}
void Foam::heatFlux::end()
{
if (active_)
{
calcAndPrint();
}
}
void Foam::heatFlux::write()
{
if (active_)
{
}
}
void Foam::heatFlux::updateMesh(const mapPolyMesh&)
{
// Do nothing
}
void Foam::heatFlux::movePoints(const pointField&)
{
// Do nothing
}
// ************************************************************************* //

View file

@ -0,0 +1,154 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2009-2011 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Class
Foam::heatFlux
Description
SourceFiles
heatFlux.C
heatFluxTemplates.C
\*---------------------------------------------------------------------------*/
#ifndef heatFlux_H
#define heatFlux_H
#include "volFieldsFwd.H"
#include "pointFieldFwd.H"
#include "Switch.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// Forward declaration of classes
class objectRegistry;
class dictionary;
class heatFluxItem;
class OFstream;
template<class Type>
class List;
class mapPolyMesh;
/*---------------------------------------------------------------------------*\
Class heatFlux Declaration
\*---------------------------------------------------------------------------*/
class heatFlux
{
protected:
// Private data
//- Name of this set of heat flux check
word name_;
//- name of fluid thermal diffusivity
word Kfluid_;
//- Database this class is registered to
const objectRegistry& obr_;
//- On/off switch
bool active_;
// Private Member Functions
// Calculation functions
//- Write
virtual void calcAndPrint();
// Functions to be over-ridden from IOoutputFilter class
//- Update mesh
virtual void updateMesh(const mapPolyMesh&);
//- Move points
virtual void movePoints(const Field<point>&);
//- Disallow default bitwise copy construct
heatFlux(const heatFlux&);
//- Disallow default bitwise assignment
void operator=(const heatFlux&);
public:
//- Runtime type information
TypeName("heatFlux");
// Constructors
//- Construct for given objectRegistry and dictionary.
// Allow the possibility to load fields from files
heatFlux
(
const word& name,
const objectRegistry&,
const dictionary&,
const bool loadFromFiles = false
);
//- Destructor
virtual ~heatFlux();
// Member Functions
//- Return name of the set of field averages
virtual const word& name() const
{
return name_;
}
//- Read the field average data
virtual void read(const dictionary&);
//- Execute the averaging
virtual void execute();
//- Execute the averaging at the final time-loop, currently does nothing
virtual void end();
//- Calculate the field average data and write
virtual void write();
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -0,0 +1,286 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2009-2011 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "heatFluxItem.H"
#include "volFields.H"
#include "OFstream.H"
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
template<class Type>
void Foam::heatFlux::addMeanField
(
const label fieldI,
wordList& meanFieldList
) const
{
if (faItems_[fieldI].mean())
{
typedef GeometricField<Type, fvPatchField, volMesh> fieldType;
const word& fieldName = faItems_[fieldI].fieldName();
const word meanFieldName = fieldName + EXT_MEAN;
Info<< "Reading/calculating field " << meanFieldName << nl << endl;
if (obr_.foundObject<fieldType>(meanFieldName))
{
meanFieldList[fieldI] = meanFieldName;
}
else if (obr_.found(meanFieldName))
{
Info<< "Cannot allocate average field " << meanFieldName
<< " since an object with that name already exists."
<< " Disabling averaging." << nl << endl;
meanFieldList[fieldI] = word::null;
}
else
{
const fieldType& baseField =
obr_.lookupObject<fieldType>(fieldName);
// Store on registry
obr_.store
(
new fieldType
(
IOobject
(
meanFieldName,
obr_.time().timeName(),
obr_,
IOobject::READ_IF_PRESENT,
IOobject::NO_WRITE
),
1*baseField
)
);
meanFieldList[fieldI] = meanFieldName;
}
}
}
template<class Type1, class Type2>
void Foam::heatFlux::addPrime2MeanField
(
const label fieldI,
const wordList& meanFieldList,
wordList& prime2MeanFieldList
) const
{
if (faItems_[fieldI].mean() && meanFieldList[fieldI].size())
{
typedef GeometricField<Type1, fvPatchField, volMesh> fieldType1;
typedef GeometricField<Type2, fvPatchField, volMesh> fieldType2;
const word& fieldName = faItems_[fieldI].fieldName();
const word meanFieldName = fieldName + EXT_PRIME2MEAN;
Info<< "Reading/calculating field " << meanFieldName << nl << endl;
if (obr_.foundObject<fieldType2>(meanFieldName))
{
prime2MeanFieldList[fieldI] = meanFieldName;
}
else if (obr_.found(meanFieldName))
{
Info<< "Cannot allocate average field " << meanFieldName
<< " since an object with that name already exists."
<< " Disabling averaging." << nl << endl;
prime2MeanFieldList[fieldI] = word::null;
}
else
{
const fieldType1& baseField =
obr_.lookupObject<fieldType1>(fieldName);
const fieldType1& meanField =
obr_.lookupObject<fieldType1>(meanFieldList[fieldI]);
obr_.store
(
new fieldType2
(
IOobject
(
meanFieldName,
obr_.time().timeName(),
obr_,
IOobject::READ_IF_PRESENT,
IOobject::NO_WRITE
),
sqr(baseField) - sqr(meanField)
)
);
prime2MeanFieldList[fieldI] = meanFieldName;
}
}
}
template<class Type>
void Foam::heatFlux::calculateMeanFields(const wordList& meanFieldList)
const
{
typedef GeometricField<Type, fvPatchField, volMesh> fieldType;
const scalar dt = obr_.time().deltaTValue();
forAll(faItems_, i)
{
if (faItems_[i].mean() && meanFieldList[i].size())
{
const word& fieldName = faItems_[i].fieldName();
const fieldType& baseField =
obr_.lookupObject<fieldType>(fieldName);
fieldType& meanField = const_cast<fieldType&>
(
obr_.lookupObject<fieldType>(meanFieldList[i])
);
scalar alpha = 0.0;
scalar beta = 0.0;
if (faItems_[i].timeBase())
{
alpha = (totalTime_[i] - dt)/totalTime_[i];
beta = dt/totalTime_[i];
}
else
{
alpha = scalar(totalIter_[i] - 1)/scalar(totalIter_[i]);
beta = 1.0/scalar(totalIter_[i]);
}
meanField = alpha*meanField + beta*baseField;
}
}
}
template<class Type1, class Type2>
void Foam::heatFlux::calculatePrime2MeanFields
(
const wordList& meanFieldList,
const wordList& prime2MeanFieldList
) const
{
typedef GeometricField<Type1, fvPatchField, volMesh> fieldType1;
typedef GeometricField<Type2, fvPatchField, volMesh> fieldType2;
const scalar dt = obr_.time().deltaTValue();
forAll(faItems_, i)
{
if
(
faItems_[i].prime2Mean()
&& meanFieldList[i].size()
&& prime2MeanFieldList[i].size()
)
{
const word& fieldName = faItems_[i].fieldName();
const fieldType1& baseField =
obr_.lookupObject<fieldType1>(fieldName);
const fieldType1& meanField =
obr_.lookupObject<fieldType1>(meanFieldList[i]);
fieldType2& prime2MeanField = const_cast<fieldType2&>
(
obr_.lookupObject<fieldType2>(prime2MeanFieldList[i])
);
scalar alpha = 0.0;
scalar beta = 0.0;
if (faItems_[i].timeBase())
{
alpha = (totalTime_[i] - dt)/totalTime_[i];
beta = dt/totalTime_[i];
}
else
{
alpha = scalar(totalIter_[i] - 1)/scalar(totalIter_[i]);
beta = 1.0/scalar(totalIter_[i]);
}
prime2MeanField =
alpha*prime2MeanField
+ beta*sqr(baseField)
- sqr(meanField);
}
}
}
template<class Type1, class Type2>
void Foam::heatFlux::addMeanSqrToPrime2Mean
(
const wordList& meanFieldList,
const wordList& prime2MeanFieldList
) const
{
typedef GeometricField<Type1, fvPatchField, volMesh> fieldType1;
typedef GeometricField<Type2, fvPatchField, volMesh> fieldType2;
forAll(faItems_, i)
{
if
(
faItems_[i].prime2Mean()
&& meanFieldList[i].size()
&& prime2MeanFieldList[i].size()
)
{
const fieldType1& meanField =
obr_.lookupObject<fieldType1>(meanFieldList[i]);
fieldType2& prime2MeanField = const_cast<fieldType2&>
(
obr_.lookupObject<fieldType2>(prime2MeanFieldList[i])
);
prime2MeanField += sqr(meanField);
}
}
}
template<class Type>
void Foam::heatFlux::writeFieldList(const wordList& fieldList) const
{
typedef GeometricField<Type, fvPatchField, volMesh> fieldType;
forAll(fieldList, i)
{
if (fieldList[i].size())
{
const fieldType& f = obr_.lookupObject<fieldType>(fieldList[i]);
f.write();
}
}
}
// ************************************************************************* //

View file

@ -0,0 +1,42 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2009-2011 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "heatFluxFunctionObject.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
defineNamedTemplateTypeNameAndDebug(heatFluxFunctionObject, 0);
addToRunTimeSelectionTable
(
functionObject,
heatFluxFunctionObject,
dictionary
);
}
// ************************************************************************* //

View file

@ -0,0 +1,54 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2009-2011 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Typedef
Foam::heatFluxFunctionObject
Description
FunctionObject wrapper around fieldAverage to allow them to be created
via the functions entry within controlDict.
SourceFiles
heatFluxFunctionObject.C
\*---------------------------------------------------------------------------*/
#ifndef heatFluxFunctionObject_H
#define heatFluxFunctionObject_H
#include "heatFlux.H"
#include "OutputFilterFunctionObject.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
typedef OutputFilterFunctionObject<heatFlux>
heatFluxFunctionObject;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -0,0 +1,161 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright held by original author
\\/ 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 "adiabaticFvPatchScalarField.H"
#include "addToRunTimeSelectionTable.H"
#include "fvPatchFieldMapper.H"
#include "volFields.H"
#include "radiationConstants.H"
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::adiabaticFvPatchScalarField::
adiabaticFvPatchScalarField
(
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF
)
:
mixedFvPatchScalarField(p, iF),
KName_("undefined-K")
{
refValue() = 0.0;
refGrad() = 0.0;
valueFraction() = 0.0;
}
Foam::adiabaticFvPatchScalarField::
adiabaticFvPatchScalarField
(
const adiabaticFvPatchScalarField& ptf,
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF,
const fvPatchFieldMapper& mapper
)
:
mixedFvPatchScalarField(ptf, p, iF, mapper),
KName_(ptf.KName_)
{}
Foam::adiabaticFvPatchScalarField::
adiabaticFvPatchScalarField
(
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF,
const dictionary& dict
)
:
mixedFvPatchScalarField(p, iF),
KName_(dict.lookup("K"))
{
refValue() = 0.0;
refGrad() = 0.0;
valueFraction() = 0.0;
if (dict.found("value"))
{
fvPatchField<scalar>::operator=
(
scalarField("value", dict, p.size())
);
}
}
Foam::adiabaticFvPatchScalarField::
adiabaticFvPatchScalarField
(
const adiabaticFvPatchScalarField& tppsf
)
:
mixedFvPatchScalarField(tppsf),
KName_(tppsf.KName_)
{}
Foam::adiabaticFvPatchScalarField::
adiabaticFvPatchScalarField
(
const adiabaticFvPatchScalarField& tppsf,
const DimensionedField<scalar, volMesh>& iF
)
:
mixedFvPatchScalarField(tppsf, iF),
KName_(tppsf.KName_)
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::adiabaticFvPatchScalarField::updateCoeffs()
{
if (updated())
{
return;
}
const scalarField& Tp = *this;
const scalarField& Kw =
patch().lookupPatchField<volScalarField, scalar>(KName_);
const scalarField& Qr =
patch().lookupPatchField<volScalarField, scalar>("Qr");
scalarField fourQro = 4.0*radiation::sigmaSB.value()*pow4(Tp);
refGrad() = (Qr + fourQro)/Kw;
valueFraction() = fourQro/(fourQro + Kw*patch().deltaCoeffs()*Tp);
mixedFvPatchScalarField::updateCoeffs();
}
void Foam::adiabaticFvPatchScalarField::write
(
Ostream& os
) const
{
fvPatchScalarField::write(os);
os.writeKeyword("K") << KName_ << token::END_STATEMENT << nl;
writeEntry("value", os);
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
makePatchTypeField
(
fvPatchScalarField,
adiabaticFvPatchScalarField
);
}
// ************************************************************************* //

View file

@ -0,0 +1,164 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright held by original author
\\/ 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
adiabaticFvPatchScalarField
Description
adiabatic boundary (with radiation)
Example usage:
myWallPatch
{
type adiabatic;
K K; // Name of K field
value 300.0; // Initial temperature / [K]
}
SourceFiles
adiabaticFvPatchScalarField.C
\*---------------------------------------------------------------------------*/
#ifndef adiabaticFvPatchScalarField_H
#define adiabaticFvPatchScalarField_H
#include "mixedFvPatchFields.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class adiabaticFvPatchScalarField Declaration
\*---------------------------------------------------------------------------*/
class adiabaticFvPatchScalarField
:
public mixedFvPatchScalarField
{
// Private data
//- Name of thermal conductivity field
word KName_;
public:
//- Runtime type information
TypeName("adiabatic");
// Constructors
//- Construct from patch and internal field
adiabaticFvPatchScalarField
(
const fvPatch&,
const DimensionedField<scalar, volMesh>&
);
//- Construct from patch, internal field and dictionary
adiabaticFvPatchScalarField
(
const fvPatch&,
const DimensionedField<scalar, volMesh>&,
const dictionary&
);
//- Construct by mapping given
// adiabaticFvPatchScalarField
// onto a new patch
adiabaticFvPatchScalarField
(
const adiabaticFvPatchScalarField&,
const fvPatch&,
const DimensionedField<scalar, volMesh>&,
const fvPatchFieldMapper&
);
//- Construct as copy
adiabaticFvPatchScalarField
(
const adiabaticFvPatchScalarField&
);
//- Construct and return a clone
virtual tmp<fvPatchScalarField> clone() const
{
return tmp<fvPatchScalarField>
(
new adiabaticFvPatchScalarField(*this)
);
}
//- Construct as copy setting internal field reference
adiabaticFvPatchScalarField
(
const adiabaticFvPatchScalarField&,
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 adiabaticFvPatchScalarField(*this, iF)
);
}
// Member functions
// Evaluation functions
//- Update the coefficients associated with the patch field
virtual void updateCoeffs();
// Mapping functions
// I-O
//- Write
void write(Ostream&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -0,0 +1,215 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright held by original author
\\/ 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
Author
Henrik Rusche, Wikki GmbH. All rights reserved
\*---------------------------------------------------------------------------*/
#include "chtRcTemperatureFvPatchScalarField.H"
#include "chtRegionCoupleBase.H"
#include "addToRunTimeSelectionTable.H"
#include "fvPatchFieldMapper.H"
#include "volFields.H"
#include "fvMatrices.H"
#include "magLongDelta.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
chtRcTemperatureFvPatchScalarField::chtRcTemperatureFvPatchScalarField
(
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF
)
:
regionCouplingFvPatchScalarField(p, iF),
kName_("none"),
radiation_(false)
{}
chtRcTemperatureFvPatchScalarField::chtRcTemperatureFvPatchScalarField
(
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF,
const dictionary& dict
)
:
regionCouplingFvPatchScalarField(p, iF, dict),
kName_(dict.lookup("K")),
radiation_(readBool(dict.lookup("radiation")))
{}
chtRcTemperatureFvPatchScalarField::chtRcTemperatureFvPatchScalarField
(
const chtRcTemperatureFvPatchScalarField& ptf,
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF,
const fvPatchFieldMapper& mapper
)
:
regionCouplingFvPatchScalarField(ptf, p, iF, mapper),
kName_(ptf.kName_),
radiation_(ptf.radiation_)
{}
chtRcTemperatureFvPatchScalarField::chtRcTemperatureFvPatchScalarField
(
const chtRcTemperatureFvPatchScalarField& ptf,
const DimensionedField<scalar, volMesh>& iF
)
:
regionCouplingFvPatchScalarField(ptf, iF),
kName_(ptf.kName_),
radiation_(ptf.radiation_)
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
// Return a named shadow patch field
const chtRcTemperatureFvPatchScalarField&
chtRcTemperatureFvPatchScalarField::shadowPatchField() const
{
return dynamic_cast
<
const chtRcTemperatureFvPatchScalarField&
>
(
regionCouplingFvPatchScalarField::shadowPatchField()
);
}
void chtRcTemperatureFvPatchScalarField::initEvaluate
(
const Pstream::commsTypes commsType
)
{
const chtRegionCoupleBase& K =
dynamic_cast<const chtRegionCoupleBase&>
(
patch().lookupPatchField<volScalarField, scalar>(kName_)
);
K.calcTemperature(*this, shadowPatchField(), K);
}
void chtRcTemperatureFvPatchScalarField::evaluate
(
const Pstream::commsTypes
)
{
fvPatchScalarField::evaluate();
}
void chtRcTemperatureFvPatchScalarField::updateCoeffs()
{
if (updated())
{
return;
}
fvPatchScalarField::updateCoeffs();
}
tmp<scalarField> chtRcTemperatureFvPatchScalarField::source() const
{
const fvPatch& p = patch();
const magLongDelta& mld = magLongDelta::New(p.boundaryMesh().mesh());
const scalarField TcOwn = patchInternalField();
const scalarField TcNei = patchNeighbourField();
const scalarField& Tw = *this;
const chtRegionCoupleBase& K =
dynamic_cast<const chtRegionCoupleBase&>
(
p.lookupPatchField<volScalarField, scalar>(kName_)
);
const scalarField k = K*p.deltaCoeffs();
const scalarField kOwn =
K.originalPatchField()/(1 - p.weights())/mld.magDelta(p.index());
return kOwn*(Tw - TcOwn) - k*(TcNei - TcOwn);
}
void chtRcTemperatureFvPatchScalarField::manipulateMatrix
(
fvScalarMatrix& matrix
)
{
const fvPatch& p = patch();
const scalarField& magSf = p.magSf();
const labelList& cellLabels = p.faceCells();
scalarField& source = matrix.source();
scalarField s = this->source();
//Info << "s = " << s << " Sum s = " << sum(s*p.magSf()) << endl;
//Info << "Sum s = " << sum(s*p.magSf()) << endl;
forAll(cellLabels, i)
{
source[cellLabels[i]] += s[i]*magSf[i];
}
}
void chtRcTemperatureFvPatchScalarField::write(Ostream& os) const
{
fvPatchScalarField::write(os);
os.writeKeyword("K") << kName_ << token::END_STATEMENT << nl;
os.writeKeyword("radiation") << radiation_ << token::END_STATEMENT << nl;
os.writeKeyword("remoteField")
<< remoteFieldName() << token::END_STATEMENT << nl;
this->writeEntry("value", os);
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
makePatchTypeField
(
fvPatchScalarField,
chtRcTemperatureFvPatchScalarField
);
} // End namespace Foam
// ************************************************************************* //

View file

@ -0,0 +1,174 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright held by original author
\\/ 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
chtRcTemperatureFvPatchScalarField
Description
Region couple patch field taking radiation into account
Author
Henrik Rusche, Wikki GmbH. All rights reserved
SourceFiles
chtRcTemperatureFvPatchScalarField.C
\*---------------------------------------------------------------------------*/
#ifndef chtRcTemperatureFvPatchScalarField_H
#define chtRcTemperatureFvPatchScalarField_H
#include "regionCouplingFvPatchFields.H"
#include "fvMatricesFwd.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class chtRcTemperatureFvPatchScalarField Declaration
\*---------------------------------------------------------------------------*/
class chtRcTemperatureFvPatchScalarField
:
public regionCouplingFvPatchScalarField
{
// Private data
//- Name of thermal diffusivity field
word kName_;
//- Take radiation into account for this patch
bool radiation_;
public:
//- Runtime type information
TypeName("chtRcTemperature");
// Constructors
//- Construct from patch and internal field
chtRcTemperatureFvPatchScalarField
(
const fvPatch&,
const DimensionedField<scalar, volMesh>&
);
//- Construct from patch, internal field and dictionary
chtRcTemperatureFvPatchScalarField
(
const fvPatch&,
const DimensionedField<scalar, volMesh>&,
const dictionary&
);
//- Construct by mapping given chtRcTemperatureFvPatchScalarField onto a new patch
chtRcTemperatureFvPatchScalarField
(
const chtRcTemperatureFvPatchScalarField&,
const fvPatch&,
const DimensionedField<scalar, volMesh>&,
const fvPatchFieldMapper&
);
//- Construct as copy setting internal field reference
chtRcTemperatureFvPatchScalarField
(
const chtRcTemperatureFvPatchScalarField&,
const DimensionedField<scalar, volMesh>&
);
//- Construct and return a clone
virtual tmp<fvPatchScalarField> clone() const
{
return tmp<fvPatchScalarField>
(
new chtRcTemperatureFvPatchScalarField(*this)
);
}
//- Construct and return a clone setting internal field reference
virtual tmp<fvPatchScalarField> clone
(
const DimensionedField<scalar, volMesh>& iF
) const
{
return tmp<fvPatchScalarField>
(
new chtRcTemperatureFvPatchScalarField(*this, iF)
);
}
// Member functions
// Access functions
//- Return radiation
bool radiation() const
{
return radiation_;
}
//- Return shadow patch field
virtual const chtRcTemperatureFvPatchScalarField&
shadowPatchField() const;
// Evaluation functions
//- Initialise the evaluation of the patch field
virtual void initEvaluate(const Pstream::commsTypes commsType);
//- Evaluate the patch field
virtual void evaluate(const Pstream::commsTypes commsType);
//- Evaluate the patch field
virtual void updateCoeffs();
//- Calculate source term
virtual tmp<scalarField> source() const;
//- Manipulate matrix
virtual void manipulateMatrix(fvScalarMatrix& matrix);
//- Write
virtual void write(Ostream&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -0,0 +1,364 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright held by original author
\\/ 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
Author
Henrik Rusche, Wikki GmbH. All rights reserved
\*---------------------------------------------------------------------------*/
#include "chtRcThermalDiffusivityFvPatchScalarField.H"
#include "chtRcThermalDiffusivitySlaveFvPatchScalarField.H"
#include "chtRcTemperatureFvPatchScalarField.H"
#include "addToRunTimeSelectionTable.H"
#include "fvPatchFieldMapper.H"
#include "volFields.H"
#include "harmonic.H"
#include "radiationConstants.H"
#include "VectorN.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
chtRcThermalDiffusivityFvPatchScalarField::chtRcThermalDiffusivityFvPatchScalarField
(
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF
)
:
chtRegionCoupleBase(p, iF)
{}
chtRcThermalDiffusivityFvPatchScalarField::chtRcThermalDiffusivityFvPatchScalarField
(
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF,
const dictionary& dict
)
:
chtRegionCoupleBase(p, iF, dict)
{}
chtRcThermalDiffusivityFvPatchScalarField::chtRcThermalDiffusivityFvPatchScalarField
(
const chtRcThermalDiffusivityFvPatchScalarField& ptf,
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF,
const fvPatchFieldMapper& mapper
)
:
chtRegionCoupleBase(ptf, p, iF, mapper)
{}
chtRcThermalDiffusivityFvPatchScalarField::chtRcThermalDiffusivityFvPatchScalarField
(
const chtRcThermalDiffusivityFvPatchScalarField& ptf,
const DimensionedField<scalar, volMesh>& iF
)
:
chtRegionCoupleBase(ptf, iF)
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void chtRcThermalDiffusivityFvPatchScalarField::evaluate
(
const Pstream::commsTypes
)
{
fvPatchScalarField::evaluate();
}
void chtRcThermalDiffusivityFvPatchScalarField::updateCoeffs()
{
if (updated())
{
return;
}
calcThermalDiffusivity(*this, shadowPatchField());
}
void
chtRcThermalDiffusivityFvPatchScalarField::calcThermalDiffusivity
(
chtRegionCoupleBase& owner,
const chtRegionCoupleBase& neighbour
) const
{
if(debug)
{
Info << "In chtRcThermalDiffusivityFvPatchScalarField::calcThermalDiffusivity on "
<< this->dimensionedInternalField().name()
<< " in " << this->patch().boundaryMesh().mesh().name()
<< endl;
}
const fvPatch& p = owner.patch();
const fvMesh& mesh = p.boundaryMesh().mesh();
const magLongDelta& mld = magLongDelta::New(mesh);
const chtRcTemperatureFvPatchScalarField& TwOwn =
dynamic_cast<const chtRcTemperatureFvPatchScalarField&>
(
p.lookupPatchField<volScalarField, scalar>("T")
);
scalarField& k = owner;
const scalarField& fOwn = owner.originalPatchField();
const scalarField TcOwn = TwOwn.patchInternalField();
scalarField fNei(p.size());
scalarField TcNei(p.size());
scalarField Qr(p.size(), 0.0);
scalarField fourQro(p.size(), 0.0);
if (TwOwn.radiation())
{
Qr += p.lookupPatchField<volScalarField, scalar>("Qr");
fourQro += 4.0*radiation::sigmaSB.value()*pow4(TwOwn);
}
{
Field<VectorN<scalar, 4> > lData(neighbour.size());
const scalarField& lfNei = neighbour.originalPatchField();
scalarField lTcNei = TwOwn.shadowPatchField().patchInternalField();
forAll(lData, facei)
{
lData[facei][0] = lTcNei[facei];
lData[facei][1] = lfNei[facei];
}
if(TwOwn.shadowPatchField().radiation())
{
const scalarField& lQrNei =
owner.lookupShadowPatchField<volScalarField, scalar>("Qr");
const scalarField& lTwNei = TwOwn.shadowPatchField();
forAll(lData, facei)
{
lData[facei][2] = lTwNei[facei];
lData[facei][3] = lQrNei[facei];
}
}
const Field<VectorN<scalar, 4> > iData =
owner.regionCouplePatch().interpolate(lData);
forAll(iData, facei)
{
TcNei[facei] = iData[facei][0];
fNei[facei] = iData[facei][1];
}
if(TwOwn.shadowPatchField().radiation())
{
forAll(iData, facei)
{
Qr[facei] += iData[facei][3];
fourQro[facei] +=
4.0*radiation::sigmaSB.value()*pow4(iData[facei][2]);
}
}
}
// Do interpolation
harmonic<scalar> interp(mesh);
const scalarField weights = interp.weights(fOwn, fNei, p);
const scalarField kHarm = weights*fOwn + (1.0 - weights)*fNei;
const scalarField kOwn = fOwn/(1.0 - p.weights())/mld.magDelta(p.index());
const scalarField kNei = fNei/p.weights()/mld.magDelta(p.index());
//Info << "kOwn = " << kOwn << endl;
//Info << "kNei = " << kNei << endl;
//Info << "TcOwn = " << TcOwn << endl;
//Info << "TcNei = " << TcNei << endl;
//Info << "DeltaT = " << TcNei - TcOwn << endl;
//Info << "Qr = " << Qr << endl;
//Info << "kOwn + kNei = " << (kOwn + kNei) << endl;
//Info << "k = " << k << endl;
k = kOwn*(TwOwn*(kNei*(TcNei - TcOwn) + Qr + fourQro) - TcOwn*fourQro);
k /= stabilise((fourQro + TwOwn*(kOwn + kNei))*(TcNei - TcOwn), SMALL);
k /= p.deltaCoeffs();
//Info << "k = " << k << endl;
forAll(k, facei)
{
k[facei] = max(min(k[facei], 100*kHarm[facei]), 0.01*kHarm[facei]);
}
//Info << "k = " << k << endl;
owner.fvPatchScalarField::updateCoeffs();
}
void
chtRcThermalDiffusivityFvPatchScalarField::calcTemperature
(
chtRcTemperatureFvPatchScalarField& TwOwn,
const chtRcTemperatureFvPatchScalarField& neighbour,
const chtRegionCoupleBase& ownerK
) const
{
if(debug)
{
Info << "In chtRcThermalDiffusivityFvPatchScalarField::calcTemperature on "
<< this->dimensionedInternalField().name()
<< " in " << this->patch().boundaryMesh().mesh().name()
<< endl;
}
const fvPatch& p = TwOwn.patch();
const fvMesh& mesh = p.boundaryMesh().mesh();
const magLongDelta& mld = magLongDelta::New(mesh);
const scalarField& fOwn = ownerK.originalPatchField();
const scalarField TcOwn = TwOwn.patchInternalField();
scalarField fNei(p.size());
scalarField TcNei(p.size());
scalarField Qr(p.size(), 0.0);
scalarField fourQro(p.size(), 0.0);
if (TwOwn.radiation())
{
Qr += p.lookupPatchField<volScalarField, scalar>("Qr");
fourQro += 4.0*radiation::sigmaSB.value()*pow4(TwOwn);
}
{
Field<VectorN<scalar, 4> > lData(neighbour.size());
const scalarField& lfNei =
ownerK.shadowPatchField().originalPatchField();
scalarField lTcNei =
TwOwn.shadowPatchField().patchInternalField();
forAll(lData, facei)
{
lData[facei][0] = lTcNei[facei];
lData[facei][1] = lfNei[facei];
}
if(TwOwn.shadowPatchField().radiation())
{
const scalarField& lTwNei = TwOwn.shadowPatchField();
const scalarField& lQrNei =
TwOwn.lookupShadowPatchField<volScalarField, scalar>("Qr");
forAll(lData, facei)
{
lData[facei][2] = lTwNei[facei];
lData[facei][3] = lQrNei[facei];
}
}
const Field<VectorN<scalar, 4> > iData =
TwOwn.regionCouplePatch().interpolate(lData);
forAll(iData, facei)
{
TcNei[facei] = iData[facei][0];
fNei[facei] = iData[facei][1];
}
if(TwOwn.shadowPatchField().radiation())
{
forAll(iData, facei)
{
fourQro[facei] +=
4.0*radiation::sigmaSB.value()*pow4(iData[facei][2]);
Qr[facei] += iData[facei][3];
}
}
}
const scalarField kOwn = fOwn/(1.0 - p.weights())/mld.magDelta(p.index());
const scalarField kNei = fNei/p.weights()/mld.magDelta(p.index());
//Info << "kOwn = " << kOwn << endl;
//Info << "kNei = " << kNei << endl;
//Info << "TcOwn = " << TcOwn << endl;
//Info << "TcNei = " << TcNei << endl;
//Info << "Qr = " << Qr << " Sum = " << sum(Qr*p.magSf()) << endl;
TwOwn *=
(fourQro + Qr + kOwn*TcOwn + kNei*TcNei)
/(TwOwn*(kOwn + kNei) + fourQro);
//Info << "TwOwn = " << TwOwn << endl;
//scalarField q1 = (TwOwn - TcOwn)*kOwn;
//Info << "q1 = " << q1 << " Sum = " << sum(q1*p.magSf()) << endl;
//scalarField q2 = (TcNei - TcOwn)*ownerK*p.deltaCoeffs();
//Info << "q2 = " << q2 << " Sum = " << sum(q2*p.magSf()) << endl;
TwOwn.fvPatchScalarField::updateCoeffs();
}
void chtRcThermalDiffusivityFvPatchScalarField::write(Ostream& os) const
{
fvPatchScalarField::write(os);
os.writeKeyword("remoteField")
<< remoteFieldName() << token::END_STATEMENT << nl;
this->writeEntry("value", os);
}
//- Specify data associated with VectorN<scalar, 4> type is contiguous
template<>
inline bool contiguous<VectorN<scalar, 4> >() {return true;}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
makePatchTypeField
(
fvPatchScalarField,
chtRcThermalDiffusivityFvPatchScalarField
);
} // End namespace Foam
// ************************************************************************* //

View file

@ -0,0 +1,164 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright held by original author
\\/ 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
chtRcThermalDiffusivityFvPatchScalarField
Description
Region couple patch field taking radiation into account
Author
Henrik Rusche, Wikki GmbH. All rights reserved
SourceFiles
chtRcThermalDiffusivityFvPatchScalarField.C
\*---------------------------------------------------------------------------*/
#ifndef chtRcThermalDiffusivityFvPatchScalarField_H
#define chtRcThermalDiffusivityFvPatchScalarField_H
#include "chtRegionCoupleBase.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class chtRcThermalDiffusivityFvPatchScalarField Declaration
\*---------------------------------------------------------------------------*/
class chtRcThermalDiffusivityFvPatchScalarField
:
public chtRegionCoupleBase
{
// Private data
public:
//- Runtime type information
TypeName("chtRcThermalDiffusivity");
// Constructors
//- Construct from patch and internal field
chtRcThermalDiffusivityFvPatchScalarField
(
const fvPatch&,
const DimensionedField<scalar, volMesh>&
);
//- Construct from patch, internal field and dictionary
chtRcThermalDiffusivityFvPatchScalarField
(
const fvPatch&,
const DimensionedField<scalar, volMesh>&,
const dictionary&
);
//- Construct by mapping given chtRcThermalDiffusivityFvPatchScalarField onto a new patch
chtRcThermalDiffusivityFvPatchScalarField
(
const chtRcThermalDiffusivityFvPatchScalarField&,
const fvPatch&,
const DimensionedField<scalar, volMesh>&,
const fvPatchFieldMapper&
);
//- Construct as copy setting internal field reference
chtRcThermalDiffusivityFvPatchScalarField
(
const chtRcThermalDiffusivityFvPatchScalarField&,
const DimensionedField<scalar, volMesh>&
);
//- Construct and return a clone
virtual tmp<fvPatchScalarField> clone() const
{
return tmp<fvPatchScalarField>
(
new chtRcThermalDiffusivityFvPatchScalarField(*this)
);
}
//- Construct and return a clone setting internal field reference
virtual tmp<fvPatchScalarField> clone
(
const DimensionedField<scalar, volMesh>& iF
) const
{
return tmp<fvPatchScalarField>
(
new chtRcThermalDiffusivityFvPatchScalarField(*this, iF)
);
}
// Member functions
// Access
// Evaluation functions
//- Evaluate the patch field
virtual void updateCoeffs();
//- Evaluate the patch field
virtual void evaluate(const Pstream::commsTypes commsType);
//- Calculate the thermal diffusivity
virtual void calcThermalDiffusivity
(
chtRegionCoupleBase& owner,
const chtRegionCoupleBase& neighbour
) const;
//- Calculate the temperature
virtual void calcTemperature
(
chtRcTemperatureFvPatchScalarField& owner,
const chtRcTemperatureFvPatchScalarField& neighbour,
const chtRegionCoupleBase& ownerK
) const;
//- Write
virtual void write(Ostream&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -0,0 +1,479 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright held by original author
\\/ 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
Author
Henrik Rusche, Wikki GmbH. All rights reserved
\*---------------------------------------------------------------------------*/
#include "chtRcThermalDiffusivityResistanceFvPatchScalarField.H"
#include "chtRcThermalDiffusivitySlaveFvPatchScalarField.H"
#include "chtRcTemperatureFvPatchScalarField.H"
#include "addToRunTimeSelectionTable.H"
#include "fvPatchFieldMapper.H"
#include "volFields.H"
#include "harmonic.H"
#include "radiationConstants.H"
#include "VectorN.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
chtRcThermalDiffusivityResistanceFvPatchScalarField::
chtRcThermalDiffusivityResistanceFvPatchScalarField
(
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF
)
:
chtRegionCoupleBase(p, iF),
conductivity_(p.size(), 0)
{}
chtRcThermalDiffusivityResistanceFvPatchScalarField::
chtRcThermalDiffusivityResistanceFvPatchScalarField
(
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF,
const dictionary& dict
)
:
chtRegionCoupleBase(p, iF, dict),
conductivity_("conductivity", dict, p.size())
{}
chtRcThermalDiffusivityResistanceFvPatchScalarField::
chtRcThermalDiffusivityResistanceFvPatchScalarField
(
const chtRcThermalDiffusivityResistanceFvPatchScalarField& ptf,
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF,
const fvPatchFieldMapper& mapper
)
:
chtRegionCoupleBase(ptf, p, iF, mapper),
conductivity_(ptf.conductivity_)
{}
chtRcThermalDiffusivityResistanceFvPatchScalarField::
chtRcThermalDiffusivityResistanceFvPatchScalarField
(
const chtRcThermalDiffusivityResistanceFvPatchScalarField& ptf,
const DimensionedField<scalar, volMesh>& iF
)
:
chtRegionCoupleBase(ptf, iF),
conductivity_(ptf.conductivity_)
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void chtRcThermalDiffusivityResistanceFvPatchScalarField::evaluate
(
const Pstream::commsTypes
)
{
fvPatchScalarField::evaluate();
}
void chtRcThermalDiffusivityResistanceFvPatchScalarField::updateCoeffs()
{
if (updated())
{
return;
}
calcThermalDiffusivity(*this, shadowPatchField());
}
void
chtRcThermalDiffusivityResistanceFvPatchScalarField::calcThermalDiffusivity
(
chtRegionCoupleBase& owner,
const chtRegionCoupleBase& neighbour
) const
{
const fvPatch& p = owner.patch();
const fvMesh& mesh = p.boundaryMesh().mesh();
const magLongDelta& mld = magLongDelta::New(mesh);
const chtRcTemperatureFvPatchScalarField& TwOwn =
dynamic_cast<const chtRcTemperatureFvPatchScalarField&>
(
p.lookupPatchField<volScalarField, scalar>("T")
);
scalarField& k = owner;
const scalarField& fOwn = owner.originalPatchField();
const scalarField TcOwn = TwOwn.patchInternalField();
scalarField fNei(p.size());
scalarField TcNei(p.size());
scalarField TwNei(p.size());
scalarField QrOwn(p.size(), 0.0);
scalarField fourQroOwn(p.size(), 0.0);
scalarField fourQroNei(p.size(), 0.0);
if (TwOwn.radiation())
{
QrOwn += p.lookupPatchField<volScalarField, scalar>("Qr");
fourQroOwn += 4.0*radiation::sigmaSB.value()*pow4(TwOwn);
}
scalarField Qr = QrOwn;
scalarField cond(p.size());
{
Field<VectorN<scalar, 5> > lData(neighbour.size());
const scalarField& lfNei = neighbour.originalPatchField();
scalarField lTcNei = TwOwn.shadowPatchField().patchInternalField();
const scalarField& lTwNei = TwOwn.shadowPatchField();
forAll(lData, facei)
{
lData[facei][0] = lTcNei[facei];
lData[facei][1] = lfNei[facei];
lData[facei][2] = lTwNei[facei];
}
if(TwOwn.shadowPatchField().radiation())
{
const scalarField& lQrNei =
owner.lookupShadowPatchField<volScalarField, scalar>("Qr");
forAll(lData, facei)
{
lData[facei][3] = lQrNei[facei];
}
}
if(isA<chtRcThermalDiffusivitySlaveFvPatchScalarField>(owner))
{
forAll(lData, facei)
{
lData[facei][4] = conductivity_[facei];
}
}
const Field<VectorN<scalar, 5> > iData =
owner.regionCouplePatch().interpolate(lData);
forAll(iData, facei)
{
TcNei[facei] = iData[facei][0];
fNei[facei] = iData[facei][1];
TwNei[facei] = iData[facei][2];
}
if(TwOwn.shadowPatchField().radiation())
{
forAll(iData, facei)
{
fourQroNei[facei] +=
4.0*radiation::sigmaSB.value()*pow4(iData[facei][2]);
Qr[facei] += iData[facei][3];
}
}
if(isA<chtRcThermalDiffusivitySlaveFvPatchScalarField>(owner))
{
forAll(lData, facei)
{
cond[facei] = iData[facei][4];
}
}
else
{
cond = conductivity_;
}
}
// Do interpolation
harmonic<scalar> interp(mesh);
const scalarField weights = interp.weights(fOwn, fNei, p);
scalarField kHarm = weights*fOwn + (1.0 - weights)*fNei;
kHarm *= cond/(kHarm*p.deltaCoeffs() + cond);
const scalarField kOwn = fOwn/(1.0 - p.weights())/mld.magDelta(p.index());
const scalarField kNei = fNei/p.weights()/mld.magDelta(p.index());
//Info << "kOwn = " << kOwn << endl;
//Info << "kNei = " << kNei << endl;
//Info << "TcOwn = " << TcOwn << endl;
//Info << "TcNei = " << TcNei << endl;
//Info << "DeltaT = " << TcNei - TcOwn << endl;
//Info << "TwOwn = " << TwOwn << endl;
//Info << "TwNei = " << TwNei << endl;
//Info << "QrOwn = " << QrOwn << endl;
//Info << "Qr = " << Qr << endl;
//Info << "kOwn + kNei = " << (kOwn + kNei) << endl;
//Info << "f1 = " << fourQroOwn << endl;
//Info << "f2 = " << fourQroNei << endl;
scalarField temp = TwNei*(cond + kNei) + fourQroNei;
/*
k = -TwOwn*
(
kOwn*
(
TwNei*(cond*(kNei*TcNei + fourQroOwn + fourQroNei + Qr) + kNei*(fourQroOwn + QrOwn))
+ fourQroNei*(fourQroOwn + QrOwn)
)
+ kOwn*kOwn*TcOwn*temp
);
k /= stabilise(TwOwn*(kOwn*temp + cond*(TwNei*kNei + fourQroNei)) + fourQroOwn*temp, SMALL);
k += kOwn*TcOwn;
k /= stabilise(TcOwn - TcNei, SMALL)*p.deltaCoeffs();
*/
// Expression is equivalent to the one above
k = kOwn*
(
TwOwn*
(
TwNei*
(
cond*(kNei*(TcOwn - TcNei) - fourQroOwn - fourQroNei - Qr)
- kNei*(fourQroOwn + QrOwn)
)
+ fourQroNei*(TcOwn*cond - fourQroOwn - QrOwn)
)
+ (TcOwn*fourQroOwn*temp)
);
k /= stabilise
(
(TcOwn - TcNei)*
(
TwOwn*
(
kOwn*temp + cond*(TwNei*kNei + fourQroNei)
)
+ fourQroOwn*temp
),
SMALL
);
k /= p.deltaCoeffs();
//Info << "k = " << k << endl;
forAll(k, facei)
{
k[facei] = max(min(k[facei], 100*kHarm[facei]), 0.01*kHarm[facei]);
}
//Info << "k = " << k << endl;
owner.fvPatchScalarField::updateCoeffs();
}
void
chtRcThermalDiffusivityResistanceFvPatchScalarField::calcTemperature
(
chtRcTemperatureFvPatchScalarField& TwOwn,
const chtRcTemperatureFvPatchScalarField& neighbour,
const chtRegionCoupleBase& ownerK
) const
{
const fvPatch& p = TwOwn.patch();
const fvMesh& mesh = p.boundaryMesh().mesh();
const magLongDelta& mld = magLongDelta::New(mesh);
const scalarField& fOwn = ownerK.originalPatchField();
const scalarField TcOwn = TwOwn.patchInternalField();
scalarField fNei(p.size());
scalarField TcNei(p.size());
scalarField TwNei(p.size());
scalarField QrOwn(p.size(), 0.0);
scalarField fourQroOwn(p.size(), 0.0);
scalarField fourQroNei(p.size(), 0.0);
if (TwOwn.radiation())
{
QrOwn += p.lookupPatchField<volScalarField, scalar>("Qr");
fourQroOwn += 4.0*radiation::sigmaSB.value()*pow4(TwOwn);
}
scalarField Qr = QrOwn;
scalarField cond(p.size());
{
Field<VectorN<scalar, 5> > lData(neighbour.size());
const scalarField& lfNei =
ownerK.shadowPatchField().originalPatchField();
scalarField lTcNei =
TwOwn.shadowPatchField().patchInternalField();
const scalarField& lTwNei =
TwOwn.shadowPatchField();
forAll(lData, facei)
{
lData[facei][0] = lTcNei[facei];
lData[facei][1] = lfNei[facei];
lData[facei][2] = lTwNei[facei];
}
if(TwOwn.shadowPatchField().radiation())
{
const scalarField& lQrNei =
TwOwn.lookupShadowPatchField<volScalarField, scalar>("Qr");
forAll(lData, facei)
{
lData[facei][3] = lQrNei[facei];
}
}
if(isA<chtRcThermalDiffusivitySlaveFvPatchScalarField>(ownerK))
{
forAll(lData, facei)
{
lData[facei][4] = conductivity_[facei];
}
}
const Field<VectorN<scalar, 5> > iData =
TwOwn.regionCouplePatch().interpolate(lData);
forAll(iData, facei)
{
TcNei[facei] = iData[facei][0];
fNei[facei] = iData[facei][1];
TwNei[facei] = iData[facei][2];
}
if(TwOwn.shadowPatchField().radiation())
{
forAll(iData, facei)
{
Qr[facei] += iData[facei][3];
fourQroNei[facei] +=
4.0*radiation::sigmaSB.value()*pow4(iData[facei][2]);
}
}
if(isA<chtRcThermalDiffusivitySlaveFvPatchScalarField>(ownerK))
{
forAll(lData, facei)
{
cond[facei] = iData[facei][4];
}
}
else
{
cond = conductivity_;
}
}
const scalarField kOwn = fOwn/(1.0 - p.weights())/mld.magDelta(p.index());
const scalarField kNei = fNei/p.weights()/mld.magDelta(p.index());
//Info << "kOwn = " << kOwn << endl;
//Info << "kNei = " << kNei << endl;
//Info << "TcOwn = " << TcOwn << endl;
//Info << "TcNei = " << TcNei << endl;
//Info << "QrOwn = " << QrOwn << " Sum = " << sum(QrOwn*p.magSf()) << endl;
//Info << "Qr = " << Qr << " Sum = " << sum(Qr*p.magSf()) << endl;
scalarField temp = fourQroOwn + QrOwn + kOwn*TcOwn;
TwOwn *=
(
TwNei*
(
cond*
(
kNei*TcNei + fourQroOwn + fourQroNei + Qr + kOwn*TcOwn
)
+ kNei*temp
)
+ fourQroNei*temp
)
/
(
TwOwn*
(
TwNei*(cond*(kOwn + kNei) + kOwn*kNei)
+ fourQroNei*(kOwn + cond)
)
+ fourQroOwn*(TwNei*(cond + kNei) + fourQroNei)
);
//Info << "TwOwn = " << TwOwn << endl;
//scalarField q1 = (TwOwn - TcOwn)*kOwn;
//Info << "q1 = " << q1 << " Sum = " << sum(q1*p.magSf()) << endl;
//scalarField q2 = (TcNei - TcOwn)*ownerK*p.deltaCoeffs();
//Info << "q2 = " << q2 << " Sum = " << sum(q2*p.magSf()) << endl;
TwOwn.fvPatchScalarField::updateCoeffs();
}
void chtRcThermalDiffusivityResistanceFvPatchScalarField::write(Ostream& os) const
{
fvPatchScalarField::write(os);
conductivity_.writeEntry("conductivity", os);
os.writeKeyword("remoteField")
<< remoteFieldName() << token::END_STATEMENT << nl;
this->writeEntry("value", os);
}
//- Specify data associated with VectorN<scalar, 5> type is contiguous
template<>
inline bool contiguous<VectorN<scalar, 5> >() {return true;}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
makePatchTypeField
(
fvPatchScalarField,
chtRcThermalDiffusivityResistanceFvPatchScalarField
);
} // End namespace Foam
// ************************************************************************* //

View file

@ -0,0 +1,181 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright held by original author
\\/ 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
regionCouplingResistanceFvPatchField
Description
Region couple patch field jump resistance on the surface taking
radiation into account
Author
Henrik Rusche, Wikki GmbH. All rights reserved
SourceFiles
regionCouplingResistanceFvPatchField.C
\*---------------------------------------------------------------------------*/
#ifndef regionCouplingResistanceFvPatchField_H
#define regionCouplingResistanceFvPatchField_H
#include "chtRegionCoupleBase.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class regionCouplingResistanceFvPatchField Declaration
\*---------------------------------------------------------------------------*/
class chtRcThermalDiffusivityResistanceFvPatchScalarField
:
public chtRegionCoupleBase
{
// Private data
//- Conductivity
scalarField conductivity_;
public:
//- Runtime type information
TypeName("chtRcThermalDiffusivityResistance");
// Constructors
//- Construct from patch and internal field
chtRcThermalDiffusivityResistanceFvPatchScalarField
(
const fvPatch&,
const DimensionedField<scalar, volMesh>&
);
//- Construct from patch, internal field and dictionary
chtRcThermalDiffusivityResistanceFvPatchScalarField
(
const fvPatch&,
const DimensionedField<scalar, volMesh>&,
const dictionary&
);
//- Construct by mapping given regionCouplingResistanceFvPatchField
// onto a new patch
chtRcThermalDiffusivityResistanceFvPatchScalarField
(
const chtRcThermalDiffusivityResistanceFvPatchScalarField&,
const fvPatch&,
const DimensionedField<scalar, volMesh>&,
const fvPatchFieldMapper&
);
//- Construct as copy setting internal field reference
chtRcThermalDiffusivityResistanceFvPatchScalarField
(
const chtRcThermalDiffusivityResistanceFvPatchScalarField&,
const DimensionedField<scalar, volMesh>&
);
//- Construct and return a clone
virtual tmp<fvPatchScalarField> clone() const
{
return tmp<fvPatchScalarField>
(
new chtRcThermalDiffusivityResistanceFvPatchScalarField(*this)
);
}
//- Construct and return a clone setting internal field reference
virtual tmp<fvPatchScalarField> clone
(
const DimensionedField<scalar, volMesh>& iF
) const
{
return tmp<fvPatchScalarField>
(
new chtRcThermalDiffusivityResistanceFvPatchScalarField(*this, iF)
);
}
// Member functions
// Access
//- Return conductivity
const scalarField& conductivity() const
{
return conductivity_;
}
//- Return Access to conductivity
scalarField& conductivity()
{
return conductivity_;
}
// Evaluation functions
//- Evaluate the patch field
virtual void updateCoeffs();
//- Evaluate the patch field
virtual void evaluate(const Pstream::commsTypes commsType);
//- Calculate the thermal diffusivity
virtual void calcThermalDiffusivity
(
chtRegionCoupleBase& owner,
const chtRegionCoupleBase& neighbour
) const;
//- Calculate the temperature
virtual void calcTemperature
(
chtRcTemperatureFvPatchScalarField& owner,
const chtRcTemperatureFvPatchScalarField& neighbour,
const chtRegionCoupleBase& ownerK
) const;
//- Write
virtual void write(Ostream&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -0,0 +1,127 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright held by original author
\\/ 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
Author
Henrik Rusche, Wikki GmbH. All rights reserved
\*---------------------------------------------------------------------------*/
#include "chtRcThermalDiffusivitySlaveFvPatchScalarField.H"
#include "addToRunTimeSelectionTable.H"
#include "fvPatchFieldMapper.H"
#include "volFields.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
chtRcThermalDiffusivitySlaveFvPatchScalarField::chtRcThermalDiffusivitySlaveFvPatchScalarField
(
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF
)
:
chtRegionCoupleBase(p, iF)
{}
chtRcThermalDiffusivitySlaveFvPatchScalarField::chtRcThermalDiffusivitySlaveFvPatchScalarField
(
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF,
const dictionary& dict
)
:
chtRegionCoupleBase(p, iF, dict)
{}
chtRcThermalDiffusivitySlaveFvPatchScalarField::chtRcThermalDiffusivitySlaveFvPatchScalarField
(
const chtRcThermalDiffusivitySlaveFvPatchScalarField& ptf,
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF,
const fvPatchFieldMapper& mapper
)
:
chtRegionCoupleBase(ptf, p, iF, mapper)
{}
chtRcThermalDiffusivitySlaveFvPatchScalarField::chtRcThermalDiffusivitySlaveFvPatchScalarField
(
const chtRcThermalDiffusivitySlaveFvPatchScalarField& ptf,
const DimensionedField<scalar, volMesh>& iF
)
:
chtRegionCoupleBase(ptf, iF)
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
const chtRegionCoupleBase&
chtRcThermalDiffusivitySlaveFvPatchScalarField::shadowPatchField() const
{
return dynamic_cast<const chtRegionCoupleBase&>
(
regionCouplingFvPatchScalarField::shadowPatchField()
);
}
void chtRcThermalDiffusivitySlaveFvPatchScalarField::evaluate
(
const Pstream::commsTypes
)
{
fvPatchScalarField::evaluate();
}
void chtRcThermalDiffusivitySlaveFvPatchScalarField::updateCoeffs()
{
if (updated())
{
return;
}
shadowPatchField().calcThermalDiffusivity(*this, shadowPatchField());
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
makePatchTypeField
(
fvPatchScalarField,
chtRcThermalDiffusivitySlaveFvPatchScalarField
);
} // End namespace Foam
// ************************************************************************* //

View file

@ -0,0 +1,149 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright held by original author
\\/ 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
chtRcThermalDiffusivitySlaveFvPatchScalarField
Description
Region couple patch field taking radiation into account
Author
Henrik Rusche, Wikki GmbH. All rights reserved
SourceFiles
chtRcThermalDiffusivitySlaveFvPatchScalarField.C
\*---------------------------------------------------------------------------*/
#ifndef chtRcThermalDiffusivitySlaveFvPatchScalarField_H
#define chtRcThermalDiffusivitySlaveFvPatchScalarField_H
#include "chtRegionCoupleBase.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
class chtThermalDiffusivityRegionCoupleFvPatchScalarField;
class chtTemperatureRegionCoupleFvPatchScalarField;
/*---------------------------------------------------------------------------*\
Class chtRcThermalDiffusivitySlaveFvPatchScalarField Declaration
\*---------------------------------------------------------------------------*/
class chtRcThermalDiffusivitySlaveFvPatchScalarField
:
public chtRegionCoupleBase
{
// Private data
public:
//- Runtime type information
TypeName("chtRcThermalDiffusivitySlave");
// Constructors
//- Construct from patch and internal field
chtRcThermalDiffusivitySlaveFvPatchScalarField
(
const fvPatch&,
const DimensionedField<scalar, volMesh>&
);
//- Construct from patch, internal field and dictionary
chtRcThermalDiffusivitySlaveFvPatchScalarField
(
const fvPatch&,
const DimensionedField<scalar, volMesh>&,
const dictionary&
);
//- Construct by mapping given chtRcThermalDiffusivitySlaveFvPatchScalarField onto a new patch
chtRcThermalDiffusivitySlaveFvPatchScalarField
(
const chtRcThermalDiffusivitySlaveFvPatchScalarField&,
const fvPatch&,
const DimensionedField<scalar, volMesh>&,
const fvPatchFieldMapper&
);
//- Construct as copy setting internal field reference
chtRcThermalDiffusivitySlaveFvPatchScalarField
(
const chtRcThermalDiffusivitySlaveFvPatchScalarField&,
const DimensionedField<scalar, volMesh>&
);
//- Construct and return a clone
virtual tmp<fvPatchScalarField> clone() const
{
return tmp<fvPatchScalarField>
(
new chtRcThermalDiffusivitySlaveFvPatchScalarField(*this)
);
}
//- Construct and return a clone setting internal field reference
virtual tmp<fvPatchScalarField> clone
(
const DimensionedField<scalar, volMesh>& iF
) const
{
return tmp<fvPatchScalarField>
(
new chtRcThermalDiffusivitySlaveFvPatchScalarField(*this, iF)
);
}
// Member functions
// Access
//- Return shadow patch field
virtual const chtRegionCoupleBase& shadowPatchField() const;
// Evaluation functions
//- Evaluate the patch field
virtual void updateCoeffs();
//- Evaluate the patch field
virtual void evaluate(const Pstream::commsTypes commsType);
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -0,0 +1,178 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright held by original author
\\/ 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
Author
Henrik Rusche, Wikki GmbH. All rights reserved
\*---------------------------------------------------------------------------*/
#include "chtRcTemperatureFvPatchScalarField.H"
#include "chtRegionCoupleBase.H"
#include "addToRunTimeSelectionTable.H"
#include "fvPatchFieldMapper.H"
#include "volFields.H"
#include "fvMatrices.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
chtRegionCoupleBase::chtRegionCoupleBase
(
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF
)
:
regionCouplingFvPatchScalarField(p, iF)
{}
chtRegionCoupleBase::chtRegionCoupleBase
(
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF,
const dictionary& dict
)
:
regionCouplingFvPatchScalarField(p, iF, dict)
{}
chtRegionCoupleBase::chtRegionCoupleBase
(
const chtRegionCoupleBase& ptf,
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF,
const fvPatchFieldMapper& mapper
)
:
regionCouplingFvPatchScalarField(ptf, p, iF, mapper)
{}
chtRegionCoupleBase::chtRegionCoupleBase
(
const chtRegionCoupleBase& ptf,
const DimensionedField<scalar, volMesh>& iF
)
:
regionCouplingFvPatchScalarField(ptf, iF)
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
// Return a named shadow patch field
const chtRegionCoupleBase&
chtRegionCoupleBase::shadowPatchField() const
{
return dynamic_cast<const chtRegionCoupleBase&>
(
regionCouplingFvPatchScalarField::shadowPatchField()
);
}
void chtRegionCoupleBase::initEvaluate
(
const Pstream::commsTypes commsType
)
{
updateCoeffs();
}
void
Foam::chtRegionCoupleBase::calcThermalDiffusivity
(
chtRegionCoupleBase& owner,
const chtRegionCoupleBase& neighbour
) const
{
shadowPatchField().calcThermalDiffusivity(owner, neighbour);
}
void
Foam::chtRegionCoupleBase::calcTemperature
(
chtRcTemperatureFvPatchScalarField& owner,
const chtRcTemperatureFvPatchScalarField& neighbour,
const chtRegionCoupleBase& ownerK
) const
{
shadowPatchField().calcTemperature(owner, neighbour, ownerK);
}
void
Foam::chtRegionCoupleBase::initInterfaceMatrixUpdate
(
const scalarField&,
scalarField&,
const lduMatrix&,
const scalarField&,
const direction,
const Pstream::commsTypes
) const
{
FatalErrorIn
(
"chtRegionCoupleBase::initInterfaceMatrixUpdate"
) << abort(FatalError);
}
void
Foam::chtRegionCoupleBase::updateInterfaceMatrix
(
const scalarField&,
scalarField&,
const lduMatrix&,
const scalarField&,
const direction,
const Pstream::commsTypes
) const
{
FatalErrorIn
(
"chtRegionCoupleBase::updateInterfaceMatrix"
) << abort(FatalError);
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
makePatchTypeField
(
fvPatchScalarField,
chtRegionCoupleBase
);
} // End namespace Foam
// ************************************************************************* //

View file

@ -0,0 +1,197 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright held by original author
\\/ 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
chtRegionCoupleBase
Description
Region couple patch field taking radiation into account
Author
Henrik Rusche, Wikki GmbH. All rights reserved
SourceFiles
chtRegionCoupleBase.C
\*---------------------------------------------------------------------------*/
#ifndef chtRegionCoupleBase_H
#define chtRegionCoupleBase_H
#include "regionCouplingFvPatchFields.H"
#include "fvMatricesFwd.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
class chtRcTemperatureFvPatchScalarField;
/*---------------------------------------------------------------------------*\
Class chtRegionCoupleBase Declaration
\*---------------------------------------------------------------------------*/
class chtRegionCoupleBase
:
public regionCouplingFvPatchScalarField
{
// Private data
public:
//- Runtime type information
TypeName("chtRegionCoupleBase");
// Constructors
//- Construct from patch and internal field
chtRegionCoupleBase
(
const fvPatch&,
const DimensionedField<scalar, volMesh>&
);
//- Construct from patch, internal field and dictionary
chtRegionCoupleBase
(
const fvPatch&,
const DimensionedField<scalar, volMesh>&,
const dictionary&
);
//- Construct by mapping given chtRegionCoupleBase onto a new patch
chtRegionCoupleBase
(
const chtRegionCoupleBase&,
const fvPatch&,
const DimensionedField<scalar, volMesh>&,
const fvPatchFieldMapper&
);
//- Construct as copy setting internal field reference
chtRegionCoupleBase
(
const chtRegionCoupleBase&,
const DimensionedField<scalar, volMesh>&
);
//- Construct and return a clone
virtual tmp<fvPatchScalarField> clone() const
{
return tmp<fvPatchScalarField>
(
new chtRegionCoupleBase(*this)
);
}
//- Construct and return a clone setting internal field reference
virtual tmp<fvPatchScalarField> clone
(
const DimensionedField<scalar, volMesh>& iF
) const
{
return tmp<fvPatchScalarField>
(
new chtRegionCoupleBase(*this, iF)
);
}
// Member functions
// Access
//- Return false to disable interpolation on this patch
virtual bool coupled() const
{
return false;
}
//- Return shadow patch field
const chtRegionCoupleBase& shadowPatchField() const;
//- Return original patch field
const scalarField& originalPatchField() const
{
return regionCouplingFvPatchScalarField::originalPatchField();
}
// Evaluation functions
//- Initialise the evaluation of the patch field
virtual void initEvaluate(const Pstream::commsTypes commsType);
//- Calculate the thermal diffusivity
virtual void calcThermalDiffusivity
(
chtRegionCoupleBase& owner,
const chtRegionCoupleBase& neighbour
) const;
//- Calculate the temperature
virtual void calcTemperature
(
chtRcTemperatureFvPatchScalarField& owner,
const chtRcTemperatureFvPatchScalarField& neighbour,
const chtRegionCoupleBase& ownerK
) const;
//- Initialise neighbour matrix update
virtual void initInterfaceMatrixUpdate
(
const scalarField& psiInternal,
scalarField& result,
const lduMatrix& m,
const scalarField& coeffs,
const direction cmpt,
const Pstream::commsTypes commsType
) const;
//- Update result field based on interface functionality
virtual void updateInterfaceMatrix
(
const scalarField& psiInternal,
scalarField& result,
const lduMatrix&,
const scalarField& coeffs,
const direction cmpt,
const Pstream::commsTypes commsType
) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -0,0 +1,214 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright held by original author
\\/ 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 "controlledParabolicVelocityFvPatchVectorField.H"
#include "addToRunTimeSelectionTable.H"
#include "fvPatchFieldMapper.H"
#include "volFields.H"
#include "surfaceFields.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
controlledParabolicVelocityFvPatchVectorField::controlledParabolicVelocityFvPatchVectorField
(
const fvPatch& p,
const DimensionedField<vector, volMesh>& iF
)
:
fixedValueFvPatchVectorField(p, iF),
Umean_(0),
n_(0, 1, 0),
y_(1, 0, 0),
target_(0),
obsFieldName_("undef"),
obsPatchName_("undef"),
obsPatchID_(-1),
gain_(0),
curTimeIndex_(-1)
{}
controlledParabolicVelocityFvPatchVectorField::controlledParabolicVelocityFvPatchVectorField
(
const controlledParabolicVelocityFvPatchVectorField& ptf,
const fvPatch& p,
const DimensionedField<vector, volMesh>& iF,
const fvPatchFieldMapper& mapper
)
:
fixedValueFvPatchVectorField(ptf, p, iF, mapper),
Umean_(ptf.Umean_),
n_(ptf.n_),
y_(ptf.y_),
target_(ptf.target_),
obsFieldName_(ptf.obsFieldName_),
obsPatchName_(ptf.obsPatchName_),
obsPatchID_(ptf.obsPatchID_),
gain_(ptf.gain_),
curTimeIndex_(-1)
{}
controlledParabolicVelocityFvPatchVectorField::controlledParabolicVelocityFvPatchVectorField
(
const fvPatch& p,
const DimensionedField<vector, volMesh>& iF,
const dictionary& dict
)
:
fixedValueFvPatchVectorField(p, iF),
Umean_(readScalar(dict.lookup("Umean"))),
n_(dict.lookup("n")),
y_(dict.lookup("y")),
target_(readScalar(dict.lookup("target"))),
obsFieldName_(dict.lookup("obsFieldName")),
obsPatchName_(dict.lookup("obsPatchName")),
obsPatchID_(patch().patch().boundaryMesh().findPatchID(obsPatchName_)),
gain_(readScalar(dict.lookup("gain"))),
curTimeIndex_(-1)
{
if (obsPatchID_ < 0)
{
FatalErrorIn
(
"controlledParabolicVelocityFvPatchVectorField"
) << "patch " << dict.lookup("obsPatchName")
<< "not found"
<< nl << exit(FatalError);
}
n_ /= mag(n_);
y_ /= mag(y_);
fvPatchField<vector>::operator=
(
vectorField("value", dict, p.size())
);
}
controlledParabolicVelocityFvPatchVectorField::controlledParabolicVelocityFvPatchVectorField
(
const controlledParabolicVelocityFvPatchVectorField& fcvpvf,
const DimensionedField<vector, volMesh>& iF
)
:
fixedValueFvPatchVectorField(fcvpvf, iF),
Umean_(fcvpvf.Umean_),
n_(fcvpvf.n_),
y_(fcvpvf.y_),
target_(fcvpvf.target_),
obsFieldName_(fcvpvf.obsFieldName_),
obsPatchName_(fcvpvf.obsPatchName_),
obsPatchID_(fcvpvf.obsPatchID_),
gain_(fcvpvf.gain_),
curTimeIndex_(-1)
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void controlledParabolicVelocityFvPatchVectorField::updateCoeffs()
{
if (updated())
{
return;
}
if (curTimeIndex_ != this->db().time().timeIndex())
{
const volScalarField& field =
db().lookupObject<volScalarField>(obsFieldName_);
scalar obsPatchAverage = gAverage(field.boundaryField()[obsPatchID_]);
Info<< "Average of " << obsFieldName_
<< " on patch " << patch().name()
<< " = " << obsPatchAverage
<< " Difference to target = "
<< obsPatchAverage - target_
<< " Umean = " << Umean_
<< endl;
Umean_ += gain_*(obsPatchAverage - target_);
// Get range and orientation
boundBox bb(patch().patch().localPoints(), true);
vector ctr = 0.5*(bb.max() + bb.min());
const vectorField& c = patch().Cf();
// Calculate local 1-D coordinate for the parabolic profile
scalarField coord =
0.5 - ((c - ctr) & y_)/((bb.max() - bb.min()) & y_);
operator==(n_*3/2*Umean_*(1.0 - sqr(coord)));
curTimeIndex_ = this->db().time().timeIndex();
}
fixedValueFvPatchVectorField::updateCoeffs();
}
// Write
void controlledParabolicVelocityFvPatchVectorField::write(Ostream& os) const
{
fvPatchVectorField::write(os);
os.writeKeyword("Umean")
<< Umean_ << token::END_STATEMENT << nl;
os.writeKeyword("n")
<< n_ << token::END_STATEMENT << nl;
os.writeKeyword("y")
<< y_ << token::END_STATEMENT << nl;
os.writeKeyword("target")
<< target_ << token::END_STATEMENT << nl;
os.writeKeyword("obsPatchName")
<< obsPatchName_ << token::END_STATEMENT << nl;
os.writeKeyword("obsFieldName")
<< obsFieldName_ << token::END_STATEMENT << nl;
os.writeKeyword("gain")
<< gain_ << token::END_STATEMENT << nl;
writeEntry("value", os);
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
makePatchTypeField(fvPatchVectorField, controlledParabolicVelocityFvPatchVectorField);
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* //

View file

@ -0,0 +1,170 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright held by original author
\\/ 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
controlledParabolicVelocityFvPatchVectorField
Description
Boundary condition specifies a velocity inlet profile
(fixed value), given the volumetric flow rate
flow direction n and direction of the parabolic coordinate y
SourceFiles
controlledParabolicVelocityFvPatchVectorField.C
Author
Wikki Ltd. All rights reserved
\*---------------------------------------------------------------------------*/
#ifndef controlledParabolicVelocityFvPatchVectorField_H
#define controlledParabolicVelocityFvPatchVectorField_H
#include "fvPatchFields.H"
#include "fixedValueFvPatchFields.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class parabolicVelocityFvPatchField Declaration
\*---------------------------------------------------------------------------*/
class controlledParabolicVelocityFvPatchVectorField
:
public fixedValueFvPatchVectorField
{
// Private data
//- Volumetric flow rate
scalar Umean_;
//- Flow direction
vector n_;
//- 1D coordinate direction
vector y_;
//- target value
scalar target_;
//- field to observe
word obsFieldName_;
//- patch ID to observe
word obsPatchName_;
//- patch ID to observe
label obsPatchID_;
//- proportionality factor
scalar gain_;
//- Current time index
label curTimeIndex_;
public:
//- Runtime type information
TypeName("controlledParabolicVelocity");
// Constructors
//- Construct from patch and internal field
controlledParabolicVelocityFvPatchVectorField
(
const fvPatch&,
const DimensionedField<vector, volMesh>&
);
//- Construct from patch, internal field and dictionary
controlledParabolicVelocityFvPatchVectorField
(
const fvPatch&,
const DimensionedField<vector, volMesh>&,
const dictionary&
);
//- Construct by mapping given controlledParabolicVelocityFvPatchVectorField
// onto a new patch
controlledParabolicVelocityFvPatchVectorField
(
const controlledParabolicVelocityFvPatchVectorField&,
const fvPatch&,
const DimensionedField<vector, volMesh>&,
const fvPatchFieldMapper&
);
//- Construct and return a clone
virtual tmp<fvPatchVectorField> clone() const
{
return tmp<fvPatchVectorField>
(
new controlledParabolicVelocityFvPatchVectorField(*this)
);
}
//- Construct as copy setting internal field reference
controlledParabolicVelocityFvPatchVectorField
(
const controlledParabolicVelocityFvPatchVectorField&,
const DimensionedField<vector, volMesh>&
);
//- Construct and return a clone setting internal field reference
virtual tmp<fvPatchVectorField> clone
(
const DimensionedField<vector, volMesh>& iF
) const
{
return tmp<fvPatchVectorField>
(
new controlledParabolicVelocityFvPatchVectorField(*this, iF)
);
}
// Member functions
//- Update coefficients
virtual void updateCoeffs();
//- Write
virtual void write(Ostream&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -0,0 +1,235 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / 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 "extendedWallHeatTransferFvPatchScalarField.H"
#include "addToRunTimeSelectionTable.H"
#include "fvPatchFieldMapper.H"
#include "volFields.H"
#include "radiationConstants.H"
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::extendedWallHeatTransferFvPatchScalarField::extendedWallHeatTransferFvPatchScalarField
(
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF
)
:
mixedFvPatchScalarField(p, iF),
Tinf_(0.0),
hc_(0.0),
alpha_(0.0),
KName_("undefined-K"),
radiation_(false)
{}
Foam::extendedWallHeatTransferFvPatchScalarField::extendedWallHeatTransferFvPatchScalarField
(
const extendedWallHeatTransferFvPatchScalarField& ptf,
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF,
const fvPatchFieldMapper& mapper
)
:
mixedFvPatchScalarField(p, iF),
Tinf_(ptf.Tinf_),
hc_(ptf.hc_),
alpha_(ptf.alpha_),
radSources_(ptf.radSources_),
KName_(ptf.KName_),
radiation_(ptf.radiation_)
{}
Foam::extendedWallHeatTransferFvPatchScalarField::extendedWallHeatTransferFvPatchScalarField
(
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF,
const dictionary& dict
)
:
mixedFvPatchScalarField(p, iF),
Tinf_(readScalar(dict.lookup("Tinf"))),
hc_(readScalar(dict.lookup("hc"))),
alpha_(readScalar(dict.lookup("alpha"))),
KName_(dict.lookup("K")),
radiation_(readBool(dict.lookup("radiation")))
{
refValue() = Tinf_;
refGrad() = 0.0;
valueFraction() = 0.0;
// Construct radiation sources
PtrList<entry> entries(dict.lookup("radiationSources"));
radSources_.setSize(entries.size());
forAll(entries, entryI)
{
radSources_.set
(
entryI,
externalRadiationSource::New
(
entries[entryI].keyword(),
entries[entryI].dict(),
p
)
);
}
fvPatchField<scalar>::operator=
(
scalarField("value", dict, p.size())
);
}
Foam::extendedWallHeatTransferFvPatchScalarField::extendedWallHeatTransferFvPatchScalarField
(
const extendedWallHeatTransferFvPatchScalarField& tppsf
)
:
mixedFvPatchScalarField(tppsf),
Tinf_(tppsf.Tinf_),
hc_(tppsf.hc_),
alpha_(tppsf.alpha_),
radSources_(tppsf.radSources_),
KName_(tppsf.KName_),
radiation_(tppsf.radiation_)
{}
Foam::extendedWallHeatTransferFvPatchScalarField::extendedWallHeatTransferFvPatchScalarField
(
const extendedWallHeatTransferFvPatchScalarField& tppsf,
const DimensionedField<scalar, volMesh>& iF
)
:
mixedFvPatchScalarField(tppsf, iF),
Tinf_(tppsf.Tinf_),
hc_(tppsf.hc_),
alpha_(tppsf.alpha_),
radSources_(tppsf.radSources_),
KName_(tppsf.KName_),
radiation_(tppsf.radiation_)
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::extendedWallHeatTransferFvPatchScalarField::updateCoeffs()
{
if (updated())
{
return;
}
const fvPatch& p = patch();
scalarField Tc = patchInternalField();
const scalarField& Tb = *this;
const scalarField& kappaEff =
p.lookupPatchField<volScalarField, scalar>(KName_);
scalarField term = kappaEff*patch().deltaCoeffs();
scalarField Qri(p.size(), 0);
if (radiation())
{
Qri = p.lookupPatchField<volScalarField, scalar>("Qr");
}
scalarField Qrio = 4.0*radiation::sigmaSB.value()*pow4(Tb);
scalarField Two = Tb - (term*(patchInternalField() - Tb) + Qri)/hc_;
scalarField Qro(p.size(), 0.0);
forAll(radSources_, rsI)
{
Qro += radSources_[rsI].q(Two);
}
scalarField term2 = Tb*hc_*alpha_ + hc_*Qrio + alpha_*Qrio;
//Info << "Tc = " << Tc << endl;
//Info << "Tb = "<< (scalarField) *this << endl;
//Info << "Two = "<< Two << endl;
//Info << "Qri = "<< Qri << endl;
//Info << "q = "<< q << endl;
//Info << "q1 = " << hc_*(*this - Two) << endl;
//Info << "q2 = " << Qro + alpha_*(Two - Tinf_) << endl;
//Info << "q3 = "<< term*(Tc - *this) + Qri << endl;
valueFraction() = 1.0 / (1.0 + Tb*term*(hc_ + alpha_)/term2);
refValue() =
Tb*(hc_*alpha_*Tinf_ - hc_*Qro + (hc_ + alpha_)*(Qri + Qrio))/term2;
mixedFvPatchScalarField::updateCoeffs();
}
void Foam::extendedWallHeatTransferFvPatchScalarField::write(Ostream& os) const
{
fvPatchScalarField::write(os);
os.writeKeyword("K") << KName_ << token::END_STATEMENT << nl;
os.writeKeyword("radiation") << radiation_ << token::END_STATEMENT << nl;
os.writeKeyword("Tinf") << Tinf_ << token::END_STATEMENT << nl;
os.writeKeyword("hc") << hc_ << token::END_STATEMENT << nl;
os.writeKeyword("alpha") << alpha_ << token::END_STATEMENT << nl;
os << nl << indent << "radiationSources" << nl
<< indent << token::BEGIN_LIST << incrIndent << nl;
forAll(radSources_, rsI)
{
os << indent << radSources_[rsI].name() << nl
<< indent << token::BEGIN_BLOCK << nl << incrIndent;
radSources_[rsI].write(os);
os << decrIndent << indent << token::END_BLOCK << endl;
}
os << decrIndent << indent
<< token::END_LIST << token::END_STATEMENT << nl << nl;
writeEntry("value", os);
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
makePatchTypeField
(
fvPatchScalarField,
extendedWallHeatTransferFvPatchScalarField
);
}
// ************************************************************************* //

View file

@ -0,0 +1,187 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / 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::extendedWallHeatTransferFvPatchScalarField
Description
wall heat transfer boundary condition taking into account
- heat resistance through a solid planar wall
q = hc*(Tb - Two)
- heat convection
q = alpha*(Two - Tinf)
- grey body radiation to infinite medium
q = epsilon*sigma*(Two^4 - Tinf^4)
SourceFiles
extendedWallHeatTransferFvPatchScalarField.C
\*---------------------------------------------------------------------------*/
#ifndef extendedWallHeatTransferFvPatchScalarField_H
#define extendedWallHeatTransferFvPatchScalarField_H
#include "mixedFvPatchFields.H"
#include "externalRadiationSource.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class wallHeatTransferFvPatch Declaration
\*---------------------------------------------------------------------------*/
class extendedWallHeatTransferFvPatchScalarField
:
public mixedFvPatchScalarField
{
// Private data
//- Tinf [K]
scalar Tinf_;
//- thermal conductance [W/m^2/K]
scalar hc_;
//- heat transfer coefficient [W/m^2/K]
scalar alpha_;
//- list of radiative sources
PtrList<externalRadiationSource> radSources_;
//- Name of thermal conductivity field
word KName_;
//- Take radiation into account for this patch
bool radiation_;
public:
//- Runtime type information
TypeName("extendedWallHeatTransfer");
// Constructors
//- Construct from patch and internal field
extendedWallHeatTransferFvPatchScalarField
(
const fvPatch&,
const DimensionedField<scalar, volMesh>&
);
//- Construct from patch, internal field and dictionary
extendedWallHeatTransferFvPatchScalarField
(
const fvPatch&,
const DimensionedField<scalar, volMesh>&,
const dictionary&
);
//- Construct by mapping given extendedWallHeatTransferFvPatchScalarField
// onto a new patch
extendedWallHeatTransferFvPatchScalarField
(
const extendedWallHeatTransferFvPatchScalarField&,
const fvPatch&,
const DimensionedField<scalar, volMesh>&,
const fvPatchFieldMapper&
);
//- Construct as copy
extendedWallHeatTransferFvPatchScalarField
(
const extendedWallHeatTransferFvPatchScalarField&
);
//- Construct and return a clone
virtual tmp<fvPatchScalarField> clone() const
{
return tmp<fvPatchScalarField>
(
new extendedWallHeatTransferFvPatchScalarField(*this)
);
}
//- Construct as copy setting internal field reference
extendedWallHeatTransferFvPatchScalarField
(
const extendedWallHeatTransferFvPatchScalarField&,
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 extendedWallHeatTransferFvPatchScalarField(*this, iF)
);
}
// Member functions
// Access
//- Return radiation
bool radiation() const
{
return radiation_;
}
// Mapping functions
// Evaluation functions
//- Update the coefficients associated with the patch field
virtual void updateCoeffs();
//- Write
virtual void write(Ostream&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -0,0 +1,66 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / 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 "viewFactorRadiation.H"
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::viewFactorRadiation::viewFactorRadiation
(
const word& name,
const dictionary& dict,
const label size
)
:
name_(name),
Tinf_(readScalar(dict.lookup("Tinf"))),
F_("F", dict, size),
epsilon_(readScalar(dict.lookup("epsilon")))
{}
void Foam::viewFactorRadiation::write(Ostream& os) const
{
os << indent << name_ << nl
<< indent << token::BEGIN_BLOCK << incrIndent << nl;
os.writeKeyword("Tinf") << Tinf_ << token::END_STATEMENT << nl;
F_.writeEntry("F", os);
os.writeKeyword("epsilon") << epsilon_ << token::END_STATEMENT << nl;
os << decrIndent << indent << token::END_BLOCK << endl;
}
Foam::Ostream& Foam::operator<<(Ostream& os, const viewFactorRadiation& r)
{
r.write(os);
os.check("Ostream& operator<<(Ostream&, const viewFactorRadiation&)");
return os;
}
// ************************************************************************* //

View file

@ -0,0 +1,155 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / 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::viewFactorRadiation
Description
helper class to sum up external radiation sources
SourceFiles
viewFactorRadiation.C
\*---------------------------------------------------------------------------*/
#ifndef viewFactorRadiation_H
#define viewFactorRadiation_H
#include "scalarField.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// Forward declaration of friend functions and operators
class viewFactorRadiation;
Ostream& operator<<(Ostream&, const viewFactorRadiation&);
/*---------------------------------------------------------------------------*\
Class wallHeatTransferFvPatch Declaration
\*---------------------------------------------------------------------------*/
class viewFactorRadiation
{
// Private data
//- name
word name_;
//- Tinf [K]
scalar Tinf_;
//- view factor [-]
scalarField F_;
//- emissivity [-]
scalar epsilon_;
public:
// Selectors
//- Return a reference to the selected thermal model
static autoPtr<viewFactorRadiation> New
(
const word& name,
const dictionary& dict,
const label size
)
{
return autoPtr<viewFactorRadiation>
(
new viewFactorRadiation(name, dict, size)
);
};
// Constructors
//- Construct from components
explicit viewFactorRadiation
(
const word& name,
const dictionary& dict,
const label size
);
//- Construct and return a clone
Foam::autoPtr<viewFactorRadiation> clone() const
{
return autoPtr<viewFactorRadiation>
(
new viewFactorRadiation(*this)
);
}
// Member functions
// Access
// Mapping functions
// Evaluation functions
//- Return Tinf
scalar Tinf() const
{
return Tinf_;
};
//- Return F
const scalarField& F() const
{
return F_;
};
//- Return epsilon
scalar epsilon() const
{
return epsilon_;
};
//- Write
void write(Ostream&) const;
// IOstream operators
friend Ostream& operator<<(Ostream&, const viewFactorRadiation&);
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -0,0 +1,72 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / 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 "ersConstantFlux.H"
#include "addToRunTimeSelectionTable.H"
namespace Foam
{
defineTypeNameAndDebug(ersConstantFlux, 0);
addToRunTimeSelectionTable(externalRadiationSource, ersConstantFlux, dictionary);
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
ersConstantFlux::ersConstantFlux
(
const word& name,
const dictionary& dict,
const fvPatch& p
)
:
externalRadiationSource(name),
q_("q", dict, p.size())
{}
ersConstantFlux::ersConstantFlux
(
const word& name
)
:
externalRadiationSource(name)
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void ersConstantFlux::write(Ostream& os) const
{
externalRadiationSource::write(os);
q_.writeEntry("q", os);
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* //

View file

@ -0,0 +1,136 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / 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::ersConstantFlux
Description
helper class to sum up external radiation sources
SourceFiles
ersConstantFlux.C
\*---------------------------------------------------------------------------*/
#ifndef ersConstantFlux_H
#define ersConstantFlux_H
#include "externalRadiationSource.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class wallHeatTransferFvPatch Declaration
\*---------------------------------------------------------------------------*/
class ersConstantFlux
:
public externalRadiationSource
{
// Private data
//- heat flux
scalarField q_;
public:
//- Runtime type information
TypeName("constantFlux");
// Constructors
//- Construct from components
explicit ersConstantFlux
(
const word& name,
const dictionary& dict,
const fvPatch& p
);
explicit ersConstantFlux
(
const word& name
);
//- Construct and return a clone
virtual autoPtr<externalRadiationSource> clone() const
{
return autoPtr<externalRadiationSource>
(
new ersConstantFlux(*this)
);
}
// Destructor
virtual ~ersConstantFlux()
{};
// Member functions
// Access
const scalarField& q() const
{
return q_;
};
scalarField& q()
{
return q_;
};
// Mapping functions
// Evaluation functions
//- Return heat flux
virtual tmp<scalarField> q(const scalarField&) const
{
return q_;
}
//- Write
virtual void write(Ostream&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -0,0 +1,65 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
\*---------------------------------------------------------------------------*/
#include "ersPlaneToCylinder.H"
#include "addToRunTimeSelectionTable.H"
namespace Foam
{
defineTypeNameAndDebug(ersPlaneToCylinder, 0);
addToRunTimeSelectionTable(externalRadiationSource, ersPlaneToCylinder, dictionary);
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
ersPlaneToCylinder::ersPlaneToCylinder
(
const word& name,
const dictionary& dict,
const fvPatch& p
)
:
ersViewFactor(name, dict),
direction_(dict.lookup("direction"))
{
scalarField cosBeta = (direction_ & p.Sf()/p.magSf());
F() = 0.5 - 0.5*cosBeta;
}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void ersPlaneToCylinder::write(Ostream& os) const
{
ersViewFactor::write(os);
os.writeKeyword("direction") << direction_ << token::END_STATEMENT << nl;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* //

View file

@ -0,0 +1,114 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Class
Foam::ersPlaneToCylinder
Description
helper class to sum up external radiation sources
SourceFiles
ersPlaneToCylinder.C
\*---------------------------------------------------------------------------*/
#ifndef ersPlaneToCylinder_H
#define ersPlaneToCylinder_H
#include "ersViewFactor.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class wallHeatTransferFvPatch Declaration
\*---------------------------------------------------------------------------*/
class ersPlaneToCylinder
:
public ersViewFactor
{
// Private data
//- Direction of infinite plane
vector direction_;
public:
//- Runtime type information
TypeName("planeToCylinder");
// Constructors
//- Construct from components
explicit ersPlaneToCylinder
(
const word& name,
const dictionary& dict,
const fvPatch& p
);
//- Construct and return a clone
virtual autoPtr<externalRadiationSource> clone() const
{
return autoPtr<externalRadiationSource>
(
new ersPlaneToCylinder(*this)
);
}
// Destructor
virtual ~ersPlaneToCylinder()
{};
// Member functions
// Access
// Mapping functions
// Evaluation functions
//- Write
virtual void write(Ostream&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -0,0 +1,69 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / 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 "ersPointSource.H"
#include "addToRunTimeSelectionTable.H"
namespace Foam
{
defineTypeNameAndDebug(ersPointSource, 0);
addToRunTimeSelectionTable(externalRadiationSource, ersPointSource, dictionary);
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
ersPointSource::ersPointSource
(
const word& name,
const dictionary& dict,
const fvPatch& p
)
:
ersConstantFlux(name),
qmax_(readScalar(dict.lookup("qmax"))),
alpha_(readScalar(dict.lookup("alpha"))),
direction_(dict.lookup("direction"))
{
q() = -alpha_*qmax_*min(direction_ & p.Sf()/p.magSf(), 0.0);
}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void ersPointSource::write(Ostream& os) const
{
ersConstantFlux::write(os);
os.writeKeyword("qmax") << qmax_ << token::END_STATEMENT << nl;
os.writeKeyword("alpha") << alpha_ << token::END_STATEMENT << nl;
os.writeKeyword("direction") << direction_ << token::END_STATEMENT << nl;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* //

View file

@ -0,0 +1,119 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / 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::ersPointSource
Description
helper class to sum up external radiation sources
SourceFiles
ersPointSource.C
\*---------------------------------------------------------------------------*/
#ifndef ersPointSource_H
#define ersPointSource_H
#include "ersConstantFlux.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class wallHeatTransferFvPatch Declaration
\*---------------------------------------------------------------------------*/
class ersPointSource
:
public ersConstantFlux
{
// Private data
//- Strenght of the point source
scalar qmax_;
//- radiation absorptivity
scalar alpha_;
//- Direction of the ersPointSource
vector direction_;
public:
//- Runtime type information
TypeName("pointSource");
// Constructors
//- Construct from components
explicit ersPointSource
(
const word& name,
const dictionary& dict,
const fvPatch& p
);
//- Construct and return a clone
virtual autoPtr<externalRadiationSource> clone() const
{
return autoPtr<externalRadiationSource>
(
new ersPointSource(*this)
);
}
// Destructor
virtual ~ersPointSource()
{};
// Member functions
// Access
// Mapping functions
// Evaluation functions
//- Write
virtual void write(Ostream&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -0,0 +1,89 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / 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 "ersViewFactor.H"
#include "addToRunTimeSelectionTable.H"
#include "radiationConstants.H"
namespace Foam
{
defineTypeNameAndDebug(ersViewFactor, 0);
addToRunTimeSelectionTable(externalRadiationSource, ersViewFactor, dictionary);
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
ersViewFactor::ersViewFactor
(
const word& name,
const dictionary& dict,
const fvPatch& p
)
:
externalRadiationSource(name),
Tinf_(readScalar(dict.lookup("Tinf"))),
F_("F", dict, p.size()),
epsilon_(readScalar(dict.lookup("epsilon")))
{}
ersViewFactor::ersViewFactor
(
const word& name,
const dictionary& dict
)
:
externalRadiationSource(name),
Tinf_(readScalar(dict.lookup("Tinf"))),
epsilon_(readScalar(dict.lookup("epsilon")))
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
tmp<scalarField> ersViewFactor::q
(
const scalarField& Tw
) const
{
return epsilon_*F_*radiation::sigmaSB.value()*(pow4(Tw) - pow4(Tinf_));
}
void ersViewFactor::write(Ostream& os) const
{
externalRadiationSource::write(os);
os.writeKeyword("Tinf") << Tinf_ << token::END_STATEMENT << nl;
F_.writeEntry("F", os);
os.writeKeyword("epsilon") << epsilon_ << token::END_STATEMENT << nl;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* //

View file

@ -0,0 +1,152 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / 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::ersViewFactor
Description
helper class to sum up external radiation sources
SourceFiles
ersViewFactor.C
\*---------------------------------------------------------------------------*/
#ifndef ersViewFactor_H
#define ersViewFactor_H
#include "externalRadiationSource.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class wallHeatTransferFvPatch Declaration
\*---------------------------------------------------------------------------*/
class ersViewFactor
:
public externalRadiationSource
{
// Private data
//- temperature at infinity
scalar Tinf_;
//- view factor
scalarField F_;
//- espison
scalar epsilon_;
public:
//- Runtime type information
TypeName("viewFactor");
// Constructors
//- Construct from components
explicit ersViewFactor
(
const word& name,
const dictionary& dict,
const fvPatch& p
);
//- Construct from components
explicit ersViewFactor
(
const word& name,
const dictionary& dict
);
//- Construct and return a clone
virtual autoPtr<externalRadiationSource> clone() const
{
return autoPtr<externalRadiationSource>
(
new ersViewFactor(*this)
);
}
// Destructor
virtual ~ersViewFactor()
{};
// Member functions
// Access
const scalarField& F() const
{
return F_;
};
scalarField& F()
{
return F_;
};
const scalar& epsilon() const
{
return epsilon_;
};
scalar& epsilson()
{
return epsilon_;
};
// Mapping functions
// Evaluation functions
//- Return heat flux
virtual tmp<scalarField> q(const scalarField& Tw) const;
//- Write
virtual void write(Ostream&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -0,0 +1,65 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
\*---------------------------------------------------------------------------*/
#include "externalRadiationSource.H"
#include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
defineTypeNameAndDebug(externalRadiationSource, 0);
defineRunTimeSelectionTable(externalRadiationSource, dictionary);
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
externalRadiationSource::externalRadiationSource
(
const word& name
)
:
name_(name)
{
Info << "externalRadiationSource::externalRadiationSource" << endl;
}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void externalRadiationSource::write(Ostream& os) const
{
os.writeKeyword("type") << type() << token::END_STATEMENT << nl;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* //

View file

@ -0,0 +1,158 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / 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::externalRadiationSource
Description
Virtual base class for external radiation sources
SourceFiles
externalRadiationSource.C
\*---------------------------------------------------------------------------*/
#ifndef externalRadiationSource_H
#define externalRadiationSource_H
#include "scalarField.H"
#include "tmp.H"
#include "fvPatch.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class wallHeatTransferFvPatch Declaration
\*---------------------------------------------------------------------------*/
class externalRadiationSource
{
// Private data
//- name
word name_;
public:
//- Runtime type information
TypeName("externalRadiationSource");
// Declare run-time constructor selection table
declareRunTimeSelectionTable
(
autoPtr,
externalRadiationSource,
dictionary,
(
const word& name,
const dictionary& dict,
const fvPatch& p
),
(name, dict, p)
);
// Destructor
virtual ~externalRadiationSource()
{};
// Selectors
//- Return a reference to the selected thermal model
static autoPtr<externalRadiationSource> New
(
const word& name,
const dictionary& dict,
const fvPatch& p
);
//- Construct and return a clone
virtual autoPtr<externalRadiationSource> clone() const
{
notImplemented("autoPt<externalRadiationSource> clone() const");
return autoPtr<externalRadiationSource>(NULL);
return autoPtr<externalRadiationSource>
(
new externalRadiationSource(*this)
);
};
// Constructors
//- Construct from components
explicit externalRadiationSource
(
const word& name
);
// Member functions
// Access
const word& name() const
{
return name_;
}
// Mapping functions
// Evaluation functions
//- Return heat flux
virtual tmp<scalarField> q(const scalarField& Tw) const
{
notImplemented
(
type() +"::q(const scalarField& Tw) const"
);
return tmp<scalarField>(NULL);
};
//- Write
virtual void write(Ostream&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -0,0 +1,74 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / 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 "externalRadiationSource.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
autoPtr<externalRadiationSource> externalRadiationSource::New
(
const word& name,
const dictionary& dict,
const fvPatch& p
)
{
word ersTypeName = dict.lookup("type");
Info<< "Selecting external radiation source " << ersTypeName << endl;
dictionaryConstructorTable::iterator cstrIter =
dictionaryConstructorTablePtr_->find(ersTypeName);
if (cstrIter == dictionaryConstructorTablePtr_->end())
{
FatalIOErrorIn
(
"externalRadiationSource::New(\n"
" const word& name,\n"
" const dictionary& dict,\n"
" const fvPatch& p\n"
")",
dict
) << "Unknown externalRadiationSource type "
<< ersTypeName << endl << endl
<< "Valid externalRadiationSource are : " << endl
<< dictionaryConstructorTablePtr_->toc()
<< exit(FatalIOError);
}
Info << "Here 2" << endl;
return cstrIter()(name, dict, p);
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* //

View file

@ -0,0 +1,96 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright held by original author
\\/ 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
Author
Hrvoje Jasak, Wikki Ltd. All rights reserved
\*---------------------------------------------------------------------------*/
#include "fieldStorage.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class Type>
fieldStorage<Type>::fieldStorage()
:
storedField_(),
curTimeIndex_(-1)
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class Type>
void fieldStorage<Type>::store()
{
if (curTimeIndex_ != time_.timeIndex())
{
storedField_ = *this;
curTimeIndex_ = time_.timeIndex();
}
}
template<class Type>
const Field<Type>& originalPatchField<Type>::store() const
{
if (curTimeIndex_ == time_.timeIndex())
{
return storedField_;
}
else
{
return *this;
}
};
template<class Type>
void originalPatchField<Type>::autoMap
(
const fvPatchFieldMapper& m
)
{
storedField_::autoMap(m);
}
template<class Type>
void clear() const
{
originalPatchField_.setSize(0);
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* //

View file

@ -0,0 +1,116 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright held by original author
\\/ 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
fieldStorage
Description
Region couple patch field
Author
Hrvoje Jasak, Wikki Ltd. All rights reserved
SourceFiles
fieldStorage.C
\*---------------------------------------------------------------------------*/
#ifndef fieldStorage_H
#define fieldStorage_H
#include "coupledFvPatchField.H"
#include "fvPatchFieldMapper.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class fieldStorage Declaration
\*---------------------------------------------------------------------------*/
template<class Type>
class fieldStorage
{
// Private data
// Reference to time
const runTime& time_;
//- original patch field
Field<Type> storedField_;
//- Current time index used to store originalPatchField_
label curTimeIndex_;
public:
// Constructors
//- Construct from patch and internal field
fieldStorage();
// Member functions
//- Store field
void store(const Field<Type>&) const;
//- Return stored field
const Field<Type>& originalPatchField() const;
//- Map (and resize as needed) from self given a mapping object
void autoMap
(
const fvPatchFieldMapper&
);
//- Reverse map the given fvPatchField onto this fvPatchField
void rmap
(
const fvPatchField<Type>&,
const labelList&
);
//- Clear storage
void clear() const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#ifdef NoRepository
# include "fieldStorage.C"
#endif
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -0,0 +1,168 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright held by original author
\\/ 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 "solidWallHeatFluxTemperatureFvPatchScalarField.H"
#include "addToRunTimeSelectionTable.H"
#include "fvPatchFieldMapper.H"
#include "volFields.H"
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::solidWallHeatFluxTemperatureFvPatchScalarField::
solidWallHeatFluxTemperatureFvPatchScalarField
(
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF
)
:
fixedValueFvPatchScalarField(p, iF),
q_(p.size(), 0.0),
KName_("undefined-K")
{}
Foam::solidWallHeatFluxTemperatureFvPatchScalarField::
solidWallHeatFluxTemperatureFvPatchScalarField
(
const solidWallHeatFluxTemperatureFvPatchScalarField& ptf,
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF,
const fvPatchFieldMapper& mapper
)
:
fixedValueFvPatchScalarField(ptf, p, iF, mapper),
q_(ptf.q_, mapper),
KName_(ptf.KName_)
{}
Foam::solidWallHeatFluxTemperatureFvPatchScalarField::
solidWallHeatFluxTemperatureFvPatchScalarField
(
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF,
const dictionary& dict
)
:
fixedValueFvPatchScalarField(p, iF, dict),
q_("q", dict, p.size()),
KName_(dict.lookup("K"))
{}
Foam::solidWallHeatFluxTemperatureFvPatchScalarField::
solidWallHeatFluxTemperatureFvPatchScalarField
(
const solidWallHeatFluxTemperatureFvPatchScalarField& tppsf
)
:
fixedValueFvPatchScalarField(tppsf),
q_(tppsf.q_),
KName_(tppsf.KName_)
{}
Foam::solidWallHeatFluxTemperatureFvPatchScalarField::
solidWallHeatFluxTemperatureFvPatchScalarField
(
const solidWallHeatFluxTemperatureFvPatchScalarField& tppsf,
const DimensionedField<scalar, volMesh>& iF
)
:
fixedValueFvPatchScalarField(tppsf, iF),
q_(tppsf.q_),
KName_(tppsf.KName_)
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::solidWallHeatFluxTemperatureFvPatchScalarField::autoMap
(
const fvPatchFieldMapper& m
)
{
fixedValueFvPatchScalarField::autoMap(m);
q_.autoMap(m);
}
void Foam::solidWallHeatFluxTemperatureFvPatchScalarField::rmap
(
const fvPatchScalarField& ptf,
const labelList& addr
)
{
fixedValueFvPatchScalarField::rmap(ptf, addr);
const solidWallHeatFluxTemperatureFvPatchScalarField& hfptf =
refCast<const solidWallHeatFluxTemperatureFvPatchScalarField>(ptf);
q_.rmap(hfptf.q_, addr);
}
void Foam::solidWallHeatFluxTemperatureFvPatchScalarField::updateCoeffs()
{
if (updated())
{
return;
}
const scalarField& Kw =
patch().lookupPatchField<volScalarField, scalar>(KName_);
const fvPatchScalarField& Tw = *this;
operator==(q_/(patch().deltaCoeffs()*Kw) + Tw.patchInternalField());
fixedValueFvPatchScalarField::updateCoeffs();
}
void Foam::solidWallHeatFluxTemperatureFvPatchScalarField::write
(
Ostream& os
) const
{
fixedValueFvPatchScalarField::write(os);
q_.writeEntry("q", os);
os.writeKeyword("K") << KName_ << token::END_STATEMENT << nl;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
makePatchTypeField
(
fvPatchScalarField,
solidWallHeatFluxTemperatureFvPatchScalarField
);
}
// ************************************************************************* //

View file

@ -0,0 +1,181 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright held by original author
\\/ 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
solidWallHeatFluxTemperatureFvPatchScalarField
Description
Heat flux boundary condition for temperature on solid region
Example usage:
myWallPatch
{
type solidWallHeatFluxTemperature;
K K; // Name of K field
q uniform 1000; // Heat flux / [W/m2]
value 300.0; // Initial temperature / [K]
}
SourceFiles
solidWallHeatFluxTemperatureFvPatchScalarField.C
\*---------------------------------------------------------------------------*/
#ifndef solidWallHeatFluxTemperatureFvPatchScalarField_H
#define solidWallHeatFluxTemperatureFvPatchScalarField_H
#include "fixedValueFvPatchFields.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class solidWallHeatFluxTemperatureFvPatchScalarField Declaration
\*---------------------------------------------------------------------------*/
class solidWallHeatFluxTemperatureFvPatchScalarField
:
public fixedValueFvPatchScalarField
{
// Private data
//- Heat flux / [W/m2]
scalarField q_;
//- Name of thermal conductivity field
word KName_;
public:
//- Runtime type information
TypeName("solidWallHeatFluxTemperature");
// Constructors
//- Construct from patch and internal field
solidWallHeatFluxTemperatureFvPatchScalarField
(
const fvPatch&,
const DimensionedField<scalar, volMesh>&
);
//- Construct from patch, internal field and dictionary
solidWallHeatFluxTemperatureFvPatchScalarField
(
const fvPatch&,
const DimensionedField<scalar, volMesh>&,
const dictionary&
);
//- Construct by mapping given
// solidWallHeatFluxTemperatureFvPatchScalarField
// onto a new patch
solidWallHeatFluxTemperatureFvPatchScalarField
(
const solidWallHeatFluxTemperatureFvPatchScalarField&,
const fvPatch&,
const DimensionedField<scalar, volMesh>&,
const fvPatchFieldMapper&
);
//- Construct as copy
solidWallHeatFluxTemperatureFvPatchScalarField
(
const solidWallHeatFluxTemperatureFvPatchScalarField&
);
//- Construct and return a clone
virtual tmp<fvPatchScalarField> clone() const
{
return tmp<fvPatchScalarField>
(
new solidWallHeatFluxTemperatureFvPatchScalarField(*this)
);
}
//- Construct as copy setting internal field reference
solidWallHeatFluxTemperatureFvPatchScalarField
(
const solidWallHeatFluxTemperatureFvPatchScalarField&,
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 solidWallHeatFluxTemperatureFvPatchScalarField(*this, iF)
);
}
// Member functions
// Evaluation functions
//- Update the coefficients associated with the patch field
virtual void updateCoeffs();
// 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&
);
// I-O
//- Write
void write(Ostream&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -0,0 +1,94 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2008-2011 H. Rusche
\\/ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
\*---------------------------------------------------------------------------*/
#include "constantResistanceThermalGap.H"
#include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
defineTypeNameAndDebug(constantResistanceThermalGap, 0);
addToRunTimeSelectionTable(thermalGap, constantResistanceThermalGap, dictionary);
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
// Construct from dictionary
Foam::constantResistanceThermalGap::constantResistanceThermalGap
(
const word& name,
const volScalarField& T,
const dictionary& dict
)
:
thermalGap(name, T, dict),
R_(dict.lookup("R")),
zones_(dict.lookup("zones"))
{}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::constantResistanceThermalGap::~constantResistanceThermalGap()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::constantResistanceThermalGap::modifyResistance
(
surfaceScalarField& DT
) const
{
forAll(zones_, zoneI)
{
const label zoneID = mesh().faceZones().findZoneID(zones_[zoneI]);
if ( zoneID < 0 )
{
FatalErrorIn
(
"constantResistanceThermalGap::modifyResistance()\n"
) << "Zone " << zones_[zoneI]
<< " specified in gap " << name()
<< " does not exist"
<< abort(FatalError);
}
const labelList& faces = mesh().faceZones()[zoneID];
const surfaceScalarField& deltaCoeffs = mesh().deltaCoeffs();
forAll(faces, faceI)
{
DT[faces[faceI]] = 1.0/deltaCoeffs[faceI]/R_.value();
}
}
}
// ************************************************************************* //

View file

@ -0,0 +1,114 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2008-2011 H. Rusche
\\/ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Class
constantResistanceThermalGap
Description
Constant thermal properties
Author
Henrik Rusche, Wikki GmbH, All rights reserved.
SourceFiles
constantResistanceThermalGap.C
\*---------------------------------------------------------------------------*/
#ifndef constantResistanceThermalGap_H
#define constantResistanceThermalGap_H
#include "thermalGap.H"
#include "surfaceFields.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class constantResistanceThermalGap Declaration
\*---------------------------------------------------------------------------*/
class constantResistanceThermalGap
:
public thermalGap
{
// Private data
//- thermal resistance of the gap
dimensionedScalar R_;
//- list of face zones
const wordList zones_;
// Private Member Functions
//- Disallow default bitwise copy construct
constantResistanceThermalGap(const constantResistanceThermalGap&);
//- Disallow default bitwise assignment
void operator=(const constantResistanceThermalGap&);
public:
//- Runtime type information
TypeName("constantResistance");
// Static data members
// Constructors
//- Construct from dictionary
constantResistanceThermalGap
(
const word& name,
const volScalarField& T,
const dictionary& dict
);
// Destructor
virtual ~constantResistanceThermalGap();
// Member Functions
//- Return density
virtual void modifyResistance(surfaceScalarField&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -0,0 +1,100 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2008-2011 H. Rusche
\\/ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
\*---------------------------------------------------------------------------*/
#include "constantThermalGap.H"
#include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
defineTypeNameAndDebug(constantThermalGap, 0);
addToRunTimeSelectionTable(thermalGap, constantThermalGap, dictionary);
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
// Construct from dictionary
Foam::constantThermalGap::constantThermalGap
(
const word& name,
const volScalarField& T,
const dictionary& dict
)
:
thermalGap(name, T, dict),
beta_(dict.lookup("beta")),
zones_(dict.lookup("zones"))
{}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::constantThermalGap::~constantThermalGap()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::constantThermalGap::modifyResistance(surfaceScalarField& DT) const
{
forAll(zones_, zoneI)
{
const label zoneID = mesh().faceZones().findZoneID(zones_[zoneI]);
if ( zoneID < 0 )
{
FatalErrorIn
(
"constantThermalGap::modifyResistance()\n"
) << "Zone " << zones_[zoneI]
<< " specified in gap " << name()
<< " does not exist"
<< abort(FatalError);
}
const labelList& faces = mesh().faceZones()[zoneID];
forAll(faces, faceI)
{
label fI = faces[faceI];
if(fI < mesh().nInternalFaces())
{
DT[fI] = beta_.value();
}
else
{
const label patchI = mesh().boundaryMesh().whichPatch(fI);
fI -= mesh().boundaryMesh()[patchI].start();
DT.boundaryField()[patchI][fI] = beta_.value();
}
}
}
}
// ************************************************************************* //

View file

@ -0,0 +1,114 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2008-2011 H. Rusche
\\/ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Class
constantThermalGap
Description
Constant thermal properties
Author
Henrik Rusche, Wikki GmbH, All rights reserved.
SourceFiles
constantThermalGap.C
\*---------------------------------------------------------------------------*/
#ifndef constantThermalGap_H
#define constantThermalGap_H
#include "thermalGap.H"
#include "surfaceFields.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class constantThermalGap Declaration
\*---------------------------------------------------------------------------*/
class constantThermalGap
:
public thermalGap
{
// Private data
//- thermal resistance of the gap
dimensionedScalar beta_;
//- list of face zones
const wordList zones_;
// Private Member Functions
//- Disallow default bitwise copy construct
constantThermalGap(const constantThermalGap&);
//- Disallow default bitwise assignment
void operator=(const constantThermalGap&);
public:
//- Runtime type information
TypeName("constant");
// Static data members
// Constructors
//- Construct from dictionary
constantThermalGap
(
const word& name,
const volScalarField& T,
const dictionary& dict
);
// Destructor
virtual ~constantThermalGap();
// Member Functions
//- Return density
virtual void modifyResistance(surfaceScalarField&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -0,0 +1,80 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2008-2011 H. Rusche
\\/ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Class
thermalGap
\*---------------------------------------------------------------------------*/
#include "thermalGap.H"
#include "volFields.H"
#include "surfaceFields.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
autoPtr<thermalGap> thermalGap::New
(
const word& name,
const volScalarField& T,
const dictionary& dict
)
{
word tgTypeName = dict.lookup("type");
Info<< "Selecting thermal gap model " << tgTypeName << endl;
dictionaryConstructorTable::iterator cstrIter =
dictionaryConstructorTablePtr_->find(tgTypeName);
if (cstrIter == dictionaryConstructorTablePtr_->end())
{
FatalIOErrorIn
(
"thermalGap::New(\n"
" const word& name,\n"
" const volScalarField& T,\n"
" const dictionary& dict\n"
")",
dict
) << "Unknown thermalGap type "
<< tgTypeName << endl << endl
<< "Valid thermalGaps are : " << endl
<< dictionaryConstructorTablePtr_->toc()
<< exit(FatalIOError);
}
return autoPtr<thermalGap>(cstrIter()(name, T, dict));
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* //

View file

@ -0,0 +1,63 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2008-2011 H. Rusche
\\/ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Class
thermalGap
\*---------------------------------------------------------------------------*/
#include "thermalGap.H"
#include "volFields.H"
#include "fvc.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
defineTypeNameAndDebug(thermalGap, 0);
defineRunTimeSelectionTable(thermalGap, dictionary);
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
thermalGap::thermalGap
(
const word& name,
const volScalarField& T,
const dictionary& dict
)
:
name_(name),
T_(T)
{}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* //

View file

@ -0,0 +1,164 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2008-2011 H. Rusche
\\/ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Class
thermalGap
Description
Thermal properties of a gap.
Author
Henrik Rusche, Wikki GmbH, All rights reserved.
SourceFiles
thermalGap.C
newThermalLaw.C
\*---------------------------------------------------------------------------*/
#ifndef thermalGap_H
#define thermalGap_H
#include "IOdictionary.H"
#include "typeInfo.H"
#include "runTimeSelectionTables.H"
#include "volFields.H"
#include "tmp.H"
#include "autoPtr.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class thermalGap Declaration
\*---------------------------------------------------------------------------*/
class thermalGap
{
// Private data
//- Name
const word name_;
//- Reference to temperature field
const volScalarField& T_;
// Private Member Functions
//- Disallow copy construct
thermalGap(const thermalGap&);
//- Disallow default bitwise assignment
void operator=(const thermalGap&);
protected:
//- Return reference to mesh
const fvMesh& mesh() const
{
return T_.mesh();
}
public:
//- Runtime type information
TypeName("thermalGap");
// Declare run-time constructor selection table
declareRunTimeSelectionTable
(
autoPtr,
thermalGap,
dictionary,
(
const word name,
const volScalarField& T,
const dictionary& dict
),
(name, T, dict)
);
// Selectors
//- Return a reference to the selected thermal model
static autoPtr<thermalGap> New
(
const word& name,
const volScalarField& T,
const dictionary& dict
);
// Constructors
//- Construct from dictionary
thermalGap
(
const word& name,
const volScalarField& T,
const dictionary& dict
);
// Destructor
virtual ~thermalGap()
{}
// Member Functions
//- Return name
const word& name() const
{
return name_;
}
//- Return temperture
const volScalarField& T() const
{
return T_;
};
//- Modify the resistance
virtual void modifyResistance(surfaceScalarField&) const = 0;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -0,0 +1,142 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2004-2011 Hrvoje Jasak
\\/ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
\*---------------------------------------------------------------------------*/
#include "constantThermal.H"
#include "addToRunTimeSelectionTable.H"
#include "zeroGradientFvPatchFields.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
defineTypeNameAndDebug(constantThermal, 0);
addToRunTimeSelectionTable(thermalLaw, constantThermal, dictionary);
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
// Construct from dictionary
Foam::constantThermal::constantThermal
(
const word& name,
const volScalarField& T,
const dictionary& dict
)
:
thermalLaw(name, T, dict),
rho_(dict.lookup("rho")),
C_(dict.lookup("C")),
k_(dict.lookup("k"))
{}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::constantThermal::~constantThermal()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
Foam::tmp<Foam::volScalarField> Foam::constantThermal::rho() const
{
tmp<volScalarField> tresult
(
new volScalarField
(
IOobject
(
"rho",
mesh().time().timeName(),
mesh(),
IOobject::NO_READ,
IOobject::NO_WRITE
),
mesh(),
rho_,
zeroGradientFvPatchScalarField::typeName
)
);
tresult().correctBoundaryConditions();
return tresult;
}
Foam::tmp<Foam::volScalarField> Foam::constantThermal::C() const
{
tmp<volScalarField> tresult
(
new volScalarField
(
IOobject
(
"C",
mesh().time().timeName(),
mesh(),
IOobject::NO_READ,
IOobject::NO_WRITE
),
mesh(),
C_,
zeroGradientFvPatchScalarField::typeName
)
);
tresult().correctBoundaryConditions();
return tresult;
}
Foam::tmp<Foam::volScalarField> Foam::constantThermal::k() const
{
tmp<volScalarField> tresult
(
new volScalarField
(
IOobject
(
"kTmp",
mesh().time().timeName(),
mesh(),
IOobject::NO_READ,
IOobject::NO_WRITE
),
mesh(),
k_,
zeroGradientFvPatchScalarField::typeName
)
);
tresult().correctBoundaryConditions();
return tresult;
}
// ************************************************************************* //

View file

@ -0,0 +1,126 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2004-2011 Hrvoje Jasak
\\/ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Class
constantThermal
Description
Constant thermal properties
Author
Hrvoje Jasak, Wikki Ltd. All rights reserved.
SourceFiles
constantThermal.C
\*---------------------------------------------------------------------------*/
#ifndef constantThermal_H
#define constantThermal_H
#include "thermalLaw.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class constantThermal Declaration
\*---------------------------------------------------------------------------*/
class constantThermal
:
public thermalLaw
{
// Private data
//- Specific heat capacity
dimensionedScalar rho_;
//- Specific heat capacity
dimensionedScalar C_;
//- Thermal conductivity
dimensionedScalar k_;
// Private Member Functions
//- Disallow default bitwise copy construct
constantThermal(const constantThermal&);
//- Disallow default bitwise assignment
void operator=(const constantThermal&);
public:
//- Runtime type information
TypeName("constant");
// Static data members
// Constructors
//- Construct from dictionary
constantThermal
(
const word& name,
const volScalarField& T,
const dictionary& dict
);
// Destructor
virtual ~constantThermal();
// Member Functions
//- Return density
virtual tmp<volScalarField> rho() const;
//- Return specific heat capacity
virtual tmp<volScalarField> C() const;
//- Return thermal conductivity
virtual tmp<volScalarField> k() const;
virtual void correct()
{}
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -0,0 +1,325 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2008 Hrvoje Jasak
\\/ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
\*---------------------------------------------------------------------------*/
#include "multiMaterialThermal.H"
#include "addToRunTimeSelectionTable.H"
#include "zeroGradientFvPatchFields.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
defineTypeNameAndDebug(multiMaterialThermal, 0);
addToRunTimeSelectionTable(thermalLaw, multiMaterialThermal, dictionary);
}
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
Foam::tmp<Foam::volScalarField> Foam::multiMaterialThermal::indicator
(
const label i
) const
{
const scalarField& mat = materials_.internalField();
tmp<volScalarField> tresult
(
new volScalarField
(
IOobject
(
"indicator",
mesh().time().timeName(),
mesh(),
IOobject::NO_READ,
IOobject::NO_WRITE
),
mesh(),
dimless,
zeroGradientFvPatchScalarField::typeName
)
);
volScalarField& result = tresult();
forAll (mat, matI)
{
if (mat[matI] > i - SMALL && mat[matI] < i + SMALL)
{
result[matI] = 1.0;
}
else
{
result[matI] = 0.0;
}
}
result.correctBoundaryConditions();
return tresult;
}
void Foam::multiMaterialThermal::readLaws
(
const volScalarField& T,
const dictionary& dict
)
{
PtrList<thermalLaw>& laws = *this;
PtrList<entry> lawEntries(dict.lookup("laws"));
laws.setSize(lawEntries.size());
forAll (laws, lawI)
{
laws.set
(
lawI,
thermalLaw::New
(
lawEntries[lawI].keyword(),
T,
lawEntries[lawI].dict()
)
);
}
}
void Foam::multiMaterialThermal::checkLaws() const
{
const PtrList<thermalLaw>& laws = *this;
if
(
max(materials_).value() > laws.size() + SMALL
)
{
FatalErrorIn
(
"multiMaterialThermal::checkLaws()\n"
) << "Invalid definition of material indicator field. "
<< "Number of materials: " << laws.size()
<< " max index: " << max(materials_)
<< ". Should be " << laws.size() - 1
<< abort(FatalError);
}
if
(
min(materials_).value() < 0
)
{
FatalErrorIn
(
"multiMaterialThermal::checkLaws()\n"
) << "Invalid definition of material indicator field. "
<< "Number of materials: " << laws.size()
<< " min index: " << min(materials_)
<< ". Should be 0"
<< abort(FatalError);
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
// Construct from dictionary
Foam::multiMaterialThermal::multiMaterialThermal
(
const word& name,
const volScalarField& T,
const dictionary& dict
)
:
thermalLaw(name, T, dict),
PtrList<thermalLaw>(),
materials_
(
IOobject
(
"materials",
mesh().time().timeName(),
mesh(),
IOobject::MUST_READ,
IOobject::AUTO_WRITE
),
mesh()
)
{
readLaws(T, dict);
checkLaws();
}
// Construct from dictionary and create default material field
Foam::multiMaterialThermal::multiMaterialThermal
(
const word& name,
const volScalarField& T,
const dictionary& dict,
const scalar defaultMaterial
)
:
thermalLaw(name, T, dict),
PtrList<thermalLaw>(),
materials_
(
IOobject
(
"materials",
mesh().time().timeName(),
mesh(),
IOobject::NO_READ,
IOobject::AUTO_WRITE
),
mesh(),
defaultMaterial,
zeroGradientFvPatchScalarField::typeName
)
{
readLaws(T, dict);
}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::multiMaterialThermal::~multiMaterialThermal()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
Foam::tmp<Foam::volScalarField> Foam::multiMaterialThermal::rho() const
{
tmp<volScalarField> tresult
(
new volScalarField
(
IOobject
(
"rhoTmp",
mesh().time().timeName(),
mesh(),
IOobject::NO_READ,
IOobject::NO_WRITE
),
mesh(),
dimensionedScalar("zeroRho", dimDensity, 0),
calculatedFvPatchScalarField::typeName
)
);
volScalarField& result = tresult();
// Accumulate data for all fields
const PtrList<thermalLaw>& laws = *this;
forAll (laws, lawI)
{
result += indicator(lawI)*laws[lawI].rho()();
}
return tresult;
}
Foam::tmp<Foam::volScalarField> Foam::multiMaterialThermal::C() const
{
tmp<volScalarField> tresult
(
new volScalarField
(
IOobject
(
"CTmp",
mesh().time().timeName(),
mesh(),
IOobject::NO_READ,
IOobject::NO_WRITE
),
mesh(),
dimensionedScalar("zeroC", dimSpecificHeatCapacity, 0),
calculatedFvPatchScalarField::typeName
)
);
volScalarField& result = tresult();
// Accumulate data for all fields
const PtrList<thermalLaw>& laws = *this;
forAll (laws, lawI)
{
result += indicator(lawI)*laws[lawI].C()();
}
return tresult;
}
Foam::tmp<Foam::volScalarField> Foam::multiMaterialThermal::k() const
{
tmp<volScalarField> tresult
(
new volScalarField
(
IOobject
(
"kTmp",
mesh().time().timeName(),
mesh(),
IOobject::NO_READ,
IOobject::NO_WRITE
),
mesh(),
dimensionedScalar("zerok", dimensionSet(1, 1, -3, -1, 0), 0),
calculatedFvPatchScalarField::typeName
)
);
volScalarField& result = tresult();
// Accumulate data for all fields
const PtrList<thermalLaw>& laws = *this;
forAll (laws, lawI)
{
result += indicator(lawI)*laws[lawI].k();
}
return tresult;
}
void Foam::multiMaterialThermal::correct()
{
PtrList<thermalLaw>& laws = *this;
forAll (laws, lawI)
{
laws[lawI].correct();
}
}
// ************************************************************************* //

View file

@ -0,0 +1,146 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2004-2011 Hrvoje Jasak
\\/ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Class
multiMaterialThermal
Description
Zoned multi-material thermal model controlled by an indicator field.
Author
Hrvoje Jasak, Wikki Ltd. All rights reserved.
SourceFiles
multiMaterialThermal.C
\*---------------------------------------------------------------------------*/
#ifndef multiMaterialThermal_H
#define multiMaterialThermal_H
#include "thermalLaw.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class multiMaterialThermal Declaration
\*---------------------------------------------------------------------------*/
class multiMaterialThermal
:
public thermalLaw,
public PtrList<thermalLaw>
{
// Private Member Functions
//- Disallow default bitwise copy construct
multiMaterialThermal(const multiMaterialThermal&);
//- Disallow default bitwise assignment
void operator=(const multiMaterialThermal&);
//- Calculate indicator field given index
tmp<volScalarField> indicator(const label index) const;
protected:
// Protected data
//- Material indicator field
volScalarField materials_;
// Protected member functions
//- Check that the laws and the material field are okay
void readLaws
(
const volScalarField& T,
const dictionary& dict
);
//- Check that the laws and the material field are okay
void checkLaws() const;
public:
//- Runtime type information
TypeName("multiMaterial");
// Static data members
// Constructors
//- Construct from dictionary
multiMaterialThermal
(
const word& name,
const volScalarField& T,
const dictionary& dict
);
//- Construct from dictionary and create default material field
multiMaterialThermal
(
const word& name,
const volScalarField& T,
const dictionary& dict,
const scalar defaultMaterial
);
// Destructor
virtual ~multiMaterialThermal();
// Member Functions
//- Return density
virtual tmp<volScalarField> rho() const;
//- Return specific heat capacity
virtual tmp<volScalarField> C() const;
//- Return thermal conductivity
virtual tmp<volScalarField> k() const;
//- Correct the rheological model
virtual void correct();
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -0,0 +1,96 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2008-2011 H. Rusche
\\/ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
\*---------------------------------------------------------------------------*/
#include "multiMaterialZonesThermal.H"
#include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
defineTypeNameAndDebug(multiMaterialZonesThermal, 0);
addToRunTimeSelectionTable(thermalLaw, multiMaterialZonesThermal, dictionary);
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
// Construct from dictionary
Foam::multiMaterialZonesThermal::multiMaterialZonesThermal
(
const word& name,
const volScalarField& T,
const dictionary& dict
)
:
multiMaterialThermal(name, T, dict, -1)
{
readLaws(T, dict);
PtrList<entry> lawEntries(dict.lookup("laws"));
PtrList<thermalLaw>& laws = *this;
forAll (laws, lawI)
{
wordList zones (lawEntries[lawI].dict().lookup("zones"));
forAll(zones, zoneI)
{
const label zoneID = mesh().cellZones().findZoneID(zones[zoneI]);
if ( zoneID < 0 )
{
FatalErrorIn
(
"multiMaterialZonesThermal::multiMaterialZonesThermal()\n"
) << "Zone " << zones[zoneI]
<< " specified in material " << lawEntries[lawI].keyword()
<< " does not exist"
<< abort(FatalError);
}
const labelList& cells = mesh().cellZones()[zoneID];
forAll(cells, cellI)
{
materials_[cells[cellI]] = lawI;
}
}
}
materials_.correctBoundaryConditions();
materials_.write();
checkLaws();
}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::multiMaterialZonesThermal::~multiMaterialZonesThermal()
{}
// ************************************************************************* //

View file

@ -0,0 +1,98 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2008-2011 H. Rusche
\\/ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Class
multiMaterialZonesThermal
Description
Zoned multi-material thermal model constructed from zones
Author
Henrik Rusche, Wikki GmbH, All rights reserved.
SourceFiles
multiMaterialZonesThermal.C
\*---------------------------------------------------------------------------*/
#ifndef multiMaterialZonesThermal_H
#define multiMaterialZonesThermal_H
#include "multiMaterialThermal.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class multiMaterialZonesThermal Declaration
\*---------------------------------------------------------------------------*/
class multiMaterialZonesThermal
:
public multiMaterialThermal
{
// Private Member Functions
//- Disallow default bitwise copy construct
multiMaterialZonesThermal(const multiMaterialZonesThermal&);
//- Disallow default bitwise assignment
void operator=(const multiMaterialZonesThermal&);
public:
//- Runtime type information
TypeName("multiMaterialZones");
// Static data members
// Constructors
//- Construct from dictionary
multiMaterialZonesThermal
(
const word& name,
const volScalarField& T,
const dictionary& dict
);
// Destructor
virtual ~multiMaterialZonesThermal();
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -0,0 +1,80 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2004-2011 Hrvoje Jasak
\\/ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Class
thermalLaw
\*---------------------------------------------------------------------------*/
#include "thermalLaw.H"
#include "volFields.H"
#include "surfaceFields.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
autoPtr<thermalLaw> thermalLaw::New
(
const word& name,
const volScalarField& T,
const dictionary& dict
)
{
word rheoTypeName = dict.lookup("type");
Info<< "Selecting thermal model " << rheoTypeName << endl;
dictionaryConstructorTable::iterator cstrIter =
dictionaryConstructorTablePtr_->find(rheoTypeName);
if (cstrIter == dictionaryConstructorTablePtr_->end())
{
FatalIOErrorIn
(
"thermalLaw::New(\n"
" const word& name,\n"
" const volScalarField& T,\n"
" const dictionary& dict\n"
")",
dict
) << "Unknown thermalLaw type "
<< rheoTypeName << endl << endl
<< "Valid thermalLaws are : " << endl
<< dictionaryConstructorTablePtr_->toc()
<< exit(FatalIOError);
}
return autoPtr<thermalLaw>(cstrIter()(name, T, dict));
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* //

View file

@ -0,0 +1,62 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2004-2011 Hrvoje Jasak
\\/ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Class
thermalLaw
\*---------------------------------------------------------------------------*/
#include "thermalLaw.H"
#include "volFields.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
defineTypeNameAndDebug(thermalLaw, 0);
defineRunTimeSelectionTable(thermalLaw, dictionary);
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
thermalLaw::thermalLaw
(
const word& name,
const volScalarField& T,
const dictionary& dict
)
:
name_(name),
T_(T)
{}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* //

View file

@ -0,0 +1,173 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2004-2011 Hrvoje Jasak
\\/ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Class
thermalLaw
Description
Thermal material properties for solids.
Author
Hrvoje Jasak, Wikki Ltd. All rights reserved.
SourceFiles
thermalLaw.C
newThermalLaw.C
\*---------------------------------------------------------------------------*/
#ifndef thermalLaw_H
#define thermalLaw_H
#include "IOdictionary.H"
#include "typeInfo.H"
#include "runTimeSelectionTables.H"
#include "volFields.H"
#include "tmp.H"
#include "autoPtr.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class thermalLaw Declaration
\*---------------------------------------------------------------------------*/
class thermalLaw
{
// Private data
//- Name
const word name_;
//- Reference to temperature field
const volScalarField& T_;
// Private Member Functions
//- Disallow copy construct
thermalLaw(const thermalLaw&);
//- Disallow default bitwise assignment
void operator=(const thermalLaw&);
protected:
//- Return reference to mesh
const fvMesh& mesh() const
{
return T_.mesh();
}
public:
//- Runtime type information
TypeName("thermalLaw");
// Declare run-time constructor selection table
declareRunTimeSelectionTable
(
autoPtr,
thermalLaw,
dictionary,
(
const word name,
const volScalarField& T,
const dictionary& dict
),
(name, T, dict)
);
// Selectors
//- Return a reference to the selected thermal model
static autoPtr<thermalLaw> New
(
const word& name,
const volScalarField& T,
const dictionary& dict
);
// Constructors
//- Construct from dictionary
thermalLaw
(
const word& name,
const volScalarField& T,
const dictionary& dict
);
// Destructor
virtual ~thermalLaw()
{}
// Member Functions
//- Return name
const word& name() const
{
return name_;
}
//- Return temperture
const volScalarField& T() const
{
return T_;
};
//- Return specific density
virtual tmp<volScalarField> rho() const = 0;
//- Return specific heat capacity
virtual tmp<volScalarField> C() const = 0;
//- Return thermal conductivity
virtual tmp<volScalarField> k() const = 0;
//- Correct the thermal model
virtual void correct() = 0;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -0,0 +1,187 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2004-2011 Hrvoje Jasak
\\/ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Class
thermalModel
Description
Thermal material properties for solids.
Author
Hrvoje Jasak, Wikki Ltd. All rights reserved.
\*---------------------------------------------------------------------------*/
#include "thermalModel.H"
#include "volFields.H"
#include "fvc.H"
#include "fvm.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
defineTypeNameAndDebug(thermalModel, 0);
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
thermalModel::thermalModel(const volScalarField& T)
:
IOdictionary
(
IOobject
(
"thermalProperties",
T.time().constant(),
T.db(),
IOobject::MUST_READ,
IOobject::NO_WRITE
)
),
T_(T),
lawPtr_(thermalLaw::New("law", T_, subDict("thermal")))
{
{
PtrList<entry> entries(subDict("thermal").lookup("gaps"));
gapPtr_.setSize(entries.size());
forAll (gapPtr_, gapI)
{
gapPtr_.set
(
gapI,
thermalGap::New
(
entries[gapI].keyword(),
T,
entries[gapI].dict()
)
);
}
}
{
PtrList<entry> entries(subDict("thermal").lookup("sources"));
sourcePtr_.setSize(entries.size());
forAll (sourcePtr_, sourceI)
{
sourcePtr_.set
(
sourceI,
thermalSource::New
(
entries[sourceI].keyword(),
T,
entries[sourceI].dict()
)
);
}
}
}
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
void thermalModel::modifyResistance
(
surfaceScalarField& kf
) const
{
forAll(gapPtr_, gapI)
{
gapPtr_[gapI].modifyResistance(kf);
}
}
tmp<fvScalarMatrix> thermalModel::laplacian(volScalarField& T)
{
word kScheme ("laplacian(k,T)");
surfaceScalarField kf = fvc::interpolate(lawPtr_->k());
modifyResistance(kf);
return tmp<fvScalarMatrix>
(
new fvScalarMatrix( fvm::laplacian(kf, T, kScheme) )
);
}
tmp<volScalarField> thermalModel::S() const
{
tmp<volScalarField> tsource
(
new volScalarField
(
IOobject
(
"heatSource",
T_.time().timeName(),
T_.mesh(),
IOobject::NO_READ,
IOobject::NO_WRITE
),
T_.mesh(),
dimensionedScalar
(
"zero",
dimEnergy/dimTime/dimVolume,
scalar(0.0)
)
)
);
forAll(sourcePtr_, sourceI)
{
sourcePtr_[sourceI].addSource(tsource());
}
return tsource;
}
bool thermalModel::read()
{
if (regIOobject::read())
{
lawPtr_ = thermalLaw::New("law", T_, subDict("thermal"));
return true;
}
else
{
return false;
}
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* //

View file

@ -0,0 +1,160 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2004-2011 Hrvoje Jasak
\\/ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Class
thermalModel
Description
Thermal material properties for solids.
Author
Hrvoje Jasak, Wikki Ltd. All rights reserved.
SourceFiles
thermalModel.C
\*---------------------------------------------------------------------------*/
#ifndef thermalModel_H
#define thermalModel_H
#include "IOdictionary.H"
#include "typeInfo.H"
#include "runTimeSelectionTables.H"
#include "volFields.H"
#include "fvMatrices.H"
#include "tmp.H"
#include "thermalLaw.H"
#include "thermalGap.H"
#include "thermalSource.H"
#include "Switch.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class thermalModel Declaration
\*---------------------------------------------------------------------------*/
class thermalModel
:
public IOdictionary
{
// Private data
//- Reference to temperature field
const volScalarField& T_;
//- Thermal law
autoPtr<thermalLaw> lawPtr_;
//- Contact resistance
PtrList<thermalGap> gapPtr_;
//- Thermal Source
PtrList<thermalSource> sourcePtr_;
// Private Member Functions
//- Disallow copy construct
thermalModel(const thermalModel&);
//- Disallow default bitwise assignment
void operator=(const thermalModel&);
public:
//- Runtime type information
TypeName("thermalModel");
// Constructors
//- Construct from dictionary
thermalModel(const volScalarField& T);
// Destructor
virtual ~thermalModel()
{}
// Member Functions
//- Return thermal law
const thermalLaw& law() const
{
return lawPtr_();
}
//- Return density
tmp<volScalarField> rho() const
{
return lawPtr_->rho();
}
//- Return specific heat capacity
tmp<volScalarField> C() const
{
return lawPtr_->C();
}
//- Return thermal conductivity
tmp<volScalarField> k() const
{
return lawPtr_->k();
}
//- Add resistance for gaps
void modifyResistance(surfaceScalarField&) const;
//- Return the laplacian and incorporate resistance for gaps
tmp<fvScalarMatrix> laplacian(volScalarField&);
//- Return the aggregated source
tmp<volScalarField> S() const;
//- Correct the thermal model
void correct()
{
lawPtr_->correct();
}
//- Read thermalProperties dictionary
virtual bool read();
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -0,0 +1,90 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2008 H. Rusche
\\/ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
\*---------------------------------------------------------------------------*/
#include "constantThermalSource.H"
#include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
defineTypeNameAndDebug(constantThermalSource, 0);
addToRunTimeSelectionTable(thermalSource, constantThermalSource, dictionary);
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
// Construct from dictionary
Foam::constantThermalSource::constantThermalSource
(
const word& name,
const volScalarField& T,
const dictionary& dict
)
:
thermalSource(name, T, dict),
S_(dict.lookup("S")),
zones_(dict.lookup("zones"))
{}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::constantThermalSource::~constantThermalSource()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::constantThermalSource::addSource(volScalarField& source) const
{
forAll(zones_, zoneI)
{
const label zoneID = mesh().cellZones().findZoneID(zones_[zoneI]);
if ( zoneID < 0 )
{
FatalErrorIn
(
"constantThermalSource::addSourcex()\n"
) << "Zone " << zones_[zoneI]
<< " specified in source " << name()
<< " does not exist"
<< abort(FatalError);
}
const labelList& cells = mesh().cellZones()[zoneID];
forAll(cells, cellI)
{
source[cells[cellI]] = S_.value();
}
}
}
// ************************************************************************* //

View file

@ -0,0 +1,113 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2008 H. Rusche
\\/ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Class
constantThermalSource
Description
Constant thermal properties
Author
Henrik Rusche, Wikki GmbH. All rights reserved.
SourceFiles
constantThermalSource.C
\*---------------------------------------------------------------------------*/
#ifndef constantThermalSource_H
#define constantThermalSource_H
#include "thermalSource.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class constantThermalSource Declaration
\*---------------------------------------------------------------------------*/
class constantThermalSource
:
public thermalSource
{
// Private data
//- Strengh of the source
dimensionedScalar S_;
//- list of cell zones
const wordList zones_;
// Private Member Functions
//- Disallow default bitwise copy construct
constantThermalSource(const constantThermalSource&);
//- Disallow default bitwise assignment
void operator=(const constantThermalSource&);
public:
//- Runtime type information
TypeName("constant");
// Static data members
// Constructors
//- Construct from dictionary
constantThermalSource
(
const word& name,
const volScalarField& T,
const dictionary& dict
);
// Destructor
virtual ~constantThermalSource();
// Member Functions
//- Add source term
virtual void addSource(volScalarField& source) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -0,0 +1,80 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2008-2011 H. Rusche
\\/ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Class
thermalSource
\*---------------------------------------------------------------------------*/
#include "thermalSource.H"
#include "volFields.H"
#include "surfaceFields.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
autoPtr<thermalSource> thermalSource::New
(
const word& name,
const volScalarField& T,
const dictionary& dict
)
{
word rheoTypeName = dict.lookup("type");
Info<< "Selecting thermal model " << rheoTypeName << endl;
dictionaryConstructorTable::iterator cstrIter =
dictionaryConstructorTablePtr_->find(rheoTypeName);
if (cstrIter == dictionaryConstructorTablePtr_->end())
{
FatalIOErrorIn
(
"thermalSource::New(\n"
" const word& name,\n"
" const volScalarField& T,\n"
" const dictionary& dict\n"
")",
dict
) << "Unknown thermalSource type "
<< rheoTypeName << endl << endl
<< "Valid thermalSources are : " << endl
<< dictionaryConstructorTablePtr_->toc()
<< exit(FatalIOError);
}
return autoPtr<thermalSource>(cstrIter()(name, T, dict));
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* //

View file

@ -0,0 +1,61 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2008-2011 H. Rusche
\\/ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Class
thermalSource
\*---------------------------------------------------------------------------*/
#include "thermalSource.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
defineTypeNameAndDebug(thermalSource, 0);
defineRunTimeSelectionTable(thermalSource, dictionary);
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
thermalSource::thermalSource
(
const word& name,
const volScalarField& T,
const dictionary& dict
)
:
name_(name),
T_(T)
{}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* //

View file

@ -0,0 +1,157 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2008-2011 H. Rusche
\\/ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Class
thermalSource
Description
A thermal source.
Author
Henrik Rusche, Wikki GmbH. All rights reserved.
SourceFiles
thermalSource.C
newThermalSource.C
\*---------------------------------------------------------------------------*/
#ifndef thermalSource_H
#define thermalSource_H
#include "IOdictionary.H"
#include "typeInfo.H"
#include "runTimeSelectionTables.H"
#include "volFields.H"
#include "autoPtr.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class thermalSource Declaration
\*---------------------------------------------------------------------------*/
class thermalSource
{
// Private data
//- Name
const word name_;
//- Reference to temperature field
const volScalarField& T_;
// Private Member Functions
//- Disallow copy construct
thermalSource(const thermalSource&);
//- Disallow default bitwise assignment
void operator=(const thermalSource&);
protected:
//- Return reference to mesh
const fvMesh& mesh() const
{
return T_.mesh();
}
public:
//- Runtime type information
TypeName("thermalSource");
// Declare run-time constructor selection table
declareRunTimeSelectionTable
(
autoPtr,
thermalSource,
dictionary,
(
const word name,
const volScalarField& T,
const dictionary& dict
),
(name, T, dict)
);
// Selectors
//- Return a reference to the selected thermal model
static autoPtr<thermalSource> New
(
const word& name,
const volScalarField& T,
const dictionary& dict
);
// Constructors
//- Construct from dictionary
thermalSource
(
const word& name,
const volScalarField& T,
const dictionary& dict
);
// Destructor
virtual ~thermalSource()
{}
// Member Functions
//- Return name
const word& name() const
{
return name_;
}
//- Add source term
virtual void addSource(volScalarField& source) const = 0;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -12,19 +12,16 @@
) )
); );
Info<< "Calculating field g.h\n" << endl;
volScalarField gh("gh", g & mesh.C());
surfaceScalarField ghf("ghf", g & mesh.Cf());
dimensionedScalar nu Info<< "Reading field p_rgh\n" << endl;
( volScalarField p_rgh
transportProperties.lookup("nu")
);
Info<< "Reading field p\n" << endl;
volScalarField p
( (
IOobject IOobject
( (
"p", "p_rgh",
runTime.timeName(), runTime.timeName(),
mesh, mesh,
IOobject::MUST_READ, IOobject::MUST_READ,
@ -48,7 +45,6 @@
); );
Info<< "Reading field T\n" << endl; Info<< "Reading field T\n" << endl;
volScalarField T volScalarField T
( (
IOobject IOobject
@ -64,16 +60,31 @@
# include "createPhi.H" # include "createPhi.H"
# include "readTransportProperties.H"
label pRefCell = 0; label pRefCell = 0;
scalar pRefValue = 0.0; scalar pRefValue = 0.0;
setRefCell(p, mesh.solutionDict().subDict("PISO"), pRefCell, pRefValue); setRefCell
(
p_rgh,
mesh.solutionDict().subDict("PISO"),
pRefCell,
pRefValue
);
Info<< "Reading field DT\n" << endl; autoPtr<incompressible::RASModel> turbulence
volScalarField DT (
incompressible::RASModel::New(U, phi, laminarTransport)
);
# include "attachPatches.H"
Info<< "Reading field kappaEff\n" << endl;
volScalarField kappaEff
( (
IOobject IOobject
( (
"DT", "kappaEff",
runTime.timeName(), runTime.timeName(),
mesh, mesh,
IOobject::MUST_READ, IOobject::MUST_READ,
@ -81,3 +92,21 @@
), ),
mesh mesh
); );
// Kinematic density for buoyancy force
volScalarField rhok
(
IOobject
(
"rhok",
runTime.timeName(),
mesh
),
1.0 - beta*(T - TRef)
);
Info<< "Creating radiation model\n" << endl;
autoPtr<radiation::radiationModel> radiation
(
radiation::radiationModel::New(T)
);

View file

@ -1,8 +1,6 @@
Info<< "Create mesh for time = " Info<< "Create mesh for time = "
<< runTime.timeName() << nl << endl; << runTime.timeName() << nl << endl;
Info << "f1" << endl;
fvMesh mesh fvMesh mesh
( (
IOobject IOobject
@ -13,6 +11,3 @@ Info << "f1" << endl;
IOobject::MUST_READ IOobject::MUST_READ
) )
); );
Info << "f2" << endl;

View file

@ -12,13 +12,15 @@
solidMesh solidMesh
); );
Info<< "Reading solid diffusivity DT\n" << endl; Info<< "Reading solid thermal properties" << endl;
thermalModel solidThermo(Tsolid);
volScalarField DTsolid Info<< "Reading solid diffusivity k\n" << endl;
volScalarField ksolid
( (
IOobject IOobject
( (
"DT", "k",
runTime.timeName(), runTime.timeName(),
solidMesh, solidMesh,
IOobject::MUST_READ, IOobject::MUST_READ,
@ -27,6 +29,17 @@
solidMesh solidMesh
); );
// On creation of both diffusivities, couple the sides Info<< "Constructing rhoCp\n" << endl;
DT.correctBoundaryConditions(); volScalarField rhoCpsolid
DTsolid.correctBoundaryConditions(); (
IOobject
(
"rhoCpsolid",
runTime.timeName(),
solidMesh,
IOobject::NO_READ,
IOobject::NO_WRITE
),
solidThermo.rho()*solidThermo.C()
);
rhoCpsolid.oldTime();

View file

@ -1,5 +1,3 @@
Info << "s1" << endl;
fvMesh solidMesh fvMesh solidMesh
( (
IOobject IOobject
@ -11,5 +9,22 @@ Info << "s1" << endl;
) )
); );
Info << "s2" << endl; {
const polyPatchList& patches = solidMesh.boundaryMesh();
forAll (patches, patchI)
{
if (isType<regionCouplePolyPatch>(patches[patchI]))
{
const regionCouplePolyPatch& rcp =
refCast<const regionCouplePolyPatch>(patches[patchI]);
// Attach it here
rcp.attach();
}
}
// Force recalculation of weights
solidMesh.surfaceInterpolation::movePoints();
}

View file

@ -14,5 +14,5 @@
} }
// Force recalculation of weights // Force recalculation of weights
mesh.surfaceInterpolation::movePoints(); mesh.surfaceInterpolation::movePoints();
} }

View file

@ -0,0 +1,7 @@
// initialize values for convergence checks
scalar eqnResidual = 1, maxResidual = 0;
scalar convergenceCriterion = 0;
simple.readIfPresent("convergence", convergenceCriterion);

View file

@ -0,0 +1,47 @@
{
volScalarField rUA("rUA", 1.0/UEqn.A());
surfaceScalarField rUAf("(1|A(U))", fvc::interpolate(rUA));
U = rUA*UEqn.H();
phi = (fvc::interpolate(U) & mesh.Sf())
+ fvc::ddtPhiCorr(rUA, U, phi);
surfaceScalarField buoyancyPhi(rUAf*ghf*fvc::snGrad(rhok)*mesh.magSf());
phi -= buoyancyPhi;
for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++)
{
fvScalarMatrix p_rghEqn
(
fvm::laplacian(rUAf, p_rgh) == fvc::div(phi)
);
p_rghEqn.setReference(pRefCell, pRefValue);
if (corr == nCorr-1 && nonOrth == nNonOrthCorr)
{
p_rghEqn.solve(mesh.solutionDict().solver(p_rgh.name() + "Final"));
}
else
{
p_rghEqn.solve(mesh.solutionDict().solver(p_rgh.name()));
}
if (nonOrth == nNonOrthCorr)
{
// Calculate the conservative fluxes
phi -= p_rghEqn.flux();
// Explicitly relax pressure for momentum corrector
p_rgh.relax();
// Correct the momentum source with the pressure gradient flux
// calculated from the relaxed pressure
U -= rUA*fvc::reconstruct((buoyancyPhi + p_rghEqn.flux())/rUAf);
U.correctBoundaryConditions();
}
}
#include "continuityErrs.H"
}

View file

@ -0,0 +1,19 @@
singlePhaseTransportModel laminarTransport(U, phi);
// Density [kg/m^3]
dimensionedScalar rho(laminarTransport.lookup("rho"));
// Heat capacity [J/kgK]
dimensionedScalar Cp(laminarTransport.lookup("Cp"));
// Thermal expansion coefficient [1/K]
dimensionedScalar beta(laminarTransport.lookup("beta"));
// Reference temperature [K]
dimensionedScalar TRef(laminarTransport.lookup("TRef"));
// Laminar Prandtl number
dimensionedScalar Pr(laminarTransport.lookup("Pr"));
// Turbulent Prandtl number
dimensionedScalar Prt(laminarTransport.lookup("Prt"));

View file

@ -1,7 +1,4 @@
{ {
// Decoupled patches
# include "attachPatches.H"
// Solid side // Solid side
# include "readSolidControls.H" # include "readSolidControls.H"
@ -9,28 +6,40 @@
{ {
coupledFvScalarMatrix TEqns(2); coupledFvScalarMatrix TEqns(2);
// Add fluid equation fvScalarMatrix* TFluidEqn = new fvScalarMatrix
TEqns.set
( (
0, rho*Cp*
new fvScalarMatrix
( (
fvm::ddt(T) fvm::ddt(T)
+ fvm::div(phi, T) + fvm::div(phi, T)
- fvm::laplacian(DT, T)
) )
- fvm::laplacian(kappaEff, T)
==
radiation->Ru()
- fvm::Sp(4.0*radiation->Rp()*pow3(T), T)
+ 3.0*radiation->Rp()*pow4(T)
); );
// Add solid equation //Done automatically in 1.6.1-ext
TEqns.set //TFluidEqn->boundaryManipulate(T.boundaryField());
fvScalarMatrix* TSolidEqn = new fvScalarMatrix
( (
1, fvm::ddt(rhoCpsolid, Tsolid)
new fvScalarMatrix - fvm::laplacian(ksolidf, Tsolid, "laplacian(k,T)")
( + fvm::SuSp(-solidThermo.S()/Tsolid, Tsolid)
fvm::ddt(Tsolid) - fvm::laplacian(DTsolid, Tsolid)
)
); );
//Done automatically in 1.6.1-ext
//TSolidEqn->boundaryManipulate(Tsolid.boundaryField());
// Add fluid equation
TEqns.set(0, TFluidEqn);
// Add solid equation
TEqns.set(1, TSolidEqn);
TEqns.solve(); TEqns.solve();
} }
} }

View file

@ -1,47 +0,0 @@
{
// Detach patches
# include "detachPatches.H"
# include "readPISOControls.H"
# include "CourantNo.H"
fvVectorMatrix UEqn
(
fvm::ddt(U)
+ fvm::div(phi, U)
- fvm::laplacian(nu, U)
);
solve(UEqn == -fvc::grad(p));
// --- PISO loop
for (int corr = 0; corr < nCorr; corr++)
{
U = UEqn.H()/UEqn.A();
U.correctBoundaryConditions();
phi = fvc::interpolate(U) & mesh.Sf();
for (int nonOrth = 0; nonOrth <= nNonOrthCorr; nonOrth++)
{
fvScalarMatrix pEqn
(
fvm::laplacian(1.0/UEqn.A(), p) == fvc::div(phi)
);
pEqn.setReference(pRefCell, pRefValue);
pEqn.solve();
if (nonOrth == nNonOrthCorr)
{
phi -= pEqn.flux();
}
}
# include "continuityErrs.H"
U -= fvc::grad(p)/UEqn.A();
U.correctBoundaryConditions();
}
}

View file

@ -0,0 +1,3 @@
conjugateHeatSimpleFoam.C
EXE = $(FOAM_APPBIN)/conjugateHeatSimpleFoam

View file

@ -0,0 +1,22 @@
EXE_INC = \
-I../conjugateHeatFoam/conjugateHeatTransfer/lnInclude \
-I$(LIB_SRC)/turbulenceModels \
-I$(LIB_SRC)/turbulenceModels/incompressible/RAS/RASModel \
-I$(LIB_SRC)/turbulenceModels/incompressible/turbulenceModel \
-I$(LIB_SRC)/transportModels \
-I$(LIB_SRC)/transportModels/incompressible/singlePhaseTransportModel \
-I$(LIB_SRC)/coupledMatrix/lnInclude \
-I$(LIB_SRC)/finiteVolume/lnInclude \
-I$(LIB_SRC)/thermophysicalModels/radiation/lnInclude \
-I$(LIB_SRC)/thermophysicalModels/basic/lnInclude
EXE_LIBS = \
-lincompressibleTurbulenceModel \
-lincompressibleRASModels \
-lincompressibleTransportModels \
-lcoupledLduMatrix \
-lfiniteVolume \
-lradiation \
-lbasicThermophysicalModels \
-lspecie \
-lconjugateHeatTransfer

View file

@ -0,0 +1,27 @@
// Solve the momentum equation
tmp<fvVectorMatrix> UEqn
(
fvm::div(phi, U)
+ turbulence->divDevReff(U)
+ fvm::SuSp(-fvc::div(phi), U)
);
UEqn().relax();
eqnResidual = solve
(
UEqn()
==
fvc::reconstruct
(
(
(
- ghf*fvc::snGrad(rhok)
- fvc::snGrad(p_rgh)
)*mesh.magSf()
)
)
).initialResidual();
maxResidual = max(eqnResidual, maxResidual);

View file

@ -0,0 +1,18 @@
{
const polyPatchList& patches = mesh.boundaryMesh();
forAll (patches, patchI)
{
if (isType<regionCouplePolyPatch>(patches[patchI]))
{
const regionCouplePolyPatch& rcp =
refCast<const regionCouplePolyPatch>(patches[patchI]);
// Attach it here
rcp.attach();
}
}
// Force recalculation of weights
mesh.surfaceInterpolation::movePoints();
}

View file

@ -0,0 +1,115 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2008-2011 H. Jasak & H. Rusche
\\/ M anipulation | All rights reserved
-------------------------------------------------------------------------------
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
Application
conjugateHeatSimpleFoam
Description
Steady-State solver for buoyancy-driven turbulent flow of incompressible
Newtonian fluids with conjugate heat transfer, complex heat conduction
and radiation
\*---------------------------------------------------------------------------*/
#include "fvCFD.H"
#include "coupledFvMatrices.H"
#include "regionCouplePolyPatch.H"
#include "radiationModel.H"
#include "thermalModel.H"
#include "singlePhaseTransportModel.H"
#include "RASModel.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
int main(int argc, char *argv[])
{
# include "setRootCase.H"
# include "createTime.H"
# include "createFluidMesh.H"
# include "createSolidMesh.H"
# include "readGravitationalAcceleration.H"
# include "createFields.H"
# include "createSolidFields.H"
# include "initContinuityErrs.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
Info<< "\nStarting time loop\n" << endl;
while (runTime.loop())
{
Info<< "Time = " << runTime.timeName() << nl << endl;
# include "readSIMPLEControls.H"
# include "initConvergenceCheck.H"
// Detach patches
# include "detachPatches.H"
p_rgh.storePrevIter();
# include "UEqn.H"
# include "pEqn.H"
// Update turbulent quantities
turbulence->correct();
radiation->correct();
// Update thermal conductivity in the fluid
kappaEff = rho*Cp*(turbulence->nu()/Pr + turbulence->nut()/Prt);
// Update thermal conductivity in the solid
solidThermo.correct();
ksolid = solidThermo.k();
// Coupled patches
# include "attachPatches.H"
kappaEff.correctBoundaryConditions();
ksolid.correctBoundaryConditions();
// Interpolate to the faces and add thermal resistance
surfaceScalarField ksolidf = fvc::interpolate(ksolid);
solidThermo.modifyResistance(ksolidf);
# include "solveEnergy.H"
// Update density according to Boussinesq approximation
rhok = 1.0 - beta*(T - TRef);
runTime.write();
Info<< "ExecutionTime = "
<< runTime.elapsedCpuTime()
<< " s\n\n" << endl;
}
Info<< "End\n" << endl;
return(0);
}
// ************************************************************************* //

View file

@ -0,0 +1,112 @@
Info<< "Reading transportProperties\n" << endl;
IOdictionary transportProperties
(
IOobject
(
"transportProperties",
runTime.constant(),
mesh,
IOobject::MUST_READ,
IOobject::NO_WRITE
)
);
Info<< "Calculating field g.h\n" << endl;
volScalarField gh("gh", g & mesh.C());
surfaceScalarField ghf("ghf", g & mesh.Cf());
Info<< "Reading field p_rgh\n" << endl;
volScalarField p_rgh
(
IOobject
(
"p_rgh",
runTime.timeName(),
mesh,
IOobject::MUST_READ,
IOobject::AUTO_WRITE
),
mesh
);
Info<< "Reading field U\n" << endl;
volVectorField U
(
IOobject
(
"U",
runTime.timeName(),
mesh,
IOobject::MUST_READ,
IOobject::AUTO_WRITE
),
mesh
);
Info<< "Reading field T\n" << endl;
volScalarField T
(
IOobject
(
"T",
runTime.timeName(),
mesh,
IOobject::MUST_READ,
IOobject::AUTO_WRITE
),
mesh
);
# include "createPhi.H"
# include "readTransportProperties.H"
label pRefCell = 0;
scalar pRefValue = 0.0;
setRefCell
(
p_rgh,
mesh.solutionDict().subDict("SIMPLE"),
pRefCell,
pRefValue
);
autoPtr<incompressible::RASModel> turbulence
(
incompressible::RASModel::New(U, phi, laminarTransport)
);
# include "attachPatches.H"
Info<< "Reading field kappaEff\n" << endl;
volScalarField kappaEff
(
IOobject
(
"kappaEff",
runTime.timeName(),
mesh,
IOobject::MUST_READ,
IOobject::AUTO_WRITE
),
mesh
);
// Kinematic density for buoyancy force
volScalarField rhok
(
IOobject
(
"rhok",
runTime.timeName(),
mesh
),
1.0 - beta*(T - TRef)
);
Info<< "Creating radiation model\n" << endl;
autoPtr<radiation::radiationModel> radiation
(
radiation::radiationModel::New(T)
);

View file

@ -0,0 +1,13 @@
Info<< "Create mesh for time = "
<< runTime.timeName() << nl << endl;
fvMesh mesh
(
IOobject
(
fvMesh::defaultRegion,
runTime.timeName(),
runTime,
IOobject::MUST_READ
)
);

View file

@ -0,0 +1,30 @@
Info<< "Reading field Tsolid\n" << endl;
volScalarField Tsolid
(
IOobject
(
"T",
runTime.timeName(),
solidMesh,
IOobject::MUST_READ,
IOobject::AUTO_WRITE
),
solidMesh
);
Info<< "Reading solid thermal properties" << endl;
thermalModel solidThermo(Tsolid);
Info<< "Reading solid diffusivity k\n" << endl;
volScalarField ksolid
(
IOobject
(
"k",
runTime.timeName(),
solidMesh,
IOobject::MUST_READ,
IOobject::AUTO_WRITE
),
solidMesh
);

View file

@ -0,0 +1,30 @@
fvMesh solidMesh
(
IOobject
(
"solid",
runTime.timeName(),
runTime,
IOobject::MUST_READ
)
);
{
const polyPatchList& patches = solidMesh.boundaryMesh();
forAll (patches, patchI)
{
if (isType<regionCouplePolyPatch>(patches[patchI]))
{
const regionCouplePolyPatch& rcp =
refCast<const regionCouplePolyPatch>(patches[patchI]);
// Attach it here
rcp.attach();
}
}
// Force recalculation of weights
solidMesh.surfaceInterpolation::movePoints();
}

View file

@ -0,0 +1,38 @@
{
const polyPatchList& patches = mesh.boundaryMesh();
forAll (patches, patchI)
{
if (isType<regionCouplePolyPatch>(patches[patchI]))
{
const regionCouplePolyPatch& rcp =
refCast<const regionCouplePolyPatch>(patches[patchI]);
// Detach it here
rcp.detach();
}
}
// Force recalculation of weights
mesh.surfaceInterpolation::movePoints();
}
/*
{
const polyPatchList& patches = solidMesh.boundaryMesh();
forAll (patches, patchI)
{
if (isType<regionCouplePolyPatch>(patches[patchI]))
{
const regionCouplePolyPatch& rcp =
refCast<const regionCouplePolyPatch>(patches[patchI]);
// Detach it here
rcp.detach();
}
}
// Force recalculation of weights
solidMesh.surfaceInterpolation::movePoints();
}
*/

View file

@ -0,0 +1,7 @@
// initialize values for convergence checks
scalar eqnResidual = 1, maxResidual = 0;
scalar convergenceCriterion = 0;
simple.readIfPresent("convergence", convergenceCriterion);

View file

@ -0,0 +1,50 @@
{
volScalarField rUA("rUA", 1.0/UEqn().A());
surfaceScalarField rUAf("(1|A(U))", fvc::interpolate(rUA));
U = rUA*UEqn().H();
UEqn.clear();
phi = fvc::interpolate(U) & mesh.Sf();
adjustPhi(phi, U, p_rgh);
surfaceScalarField buoyancyPhi(rUAf*ghf*fvc::snGrad(rhok)*mesh.magSf());
phi -= buoyancyPhi;
for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++)
{
fvScalarMatrix p_rghEqn
(
fvm::laplacian(rUAf, p_rgh) == fvc::div(phi)
);
p_rghEqn.setReference(pRefCell, pRefValue);
// retain the residual from the first iteration
if (nonOrth == 0)
{
eqnResidual = p_rghEqn.solve().initialResidual();
maxResidual = max(eqnResidual, maxResidual);
}
else
{
p_rghEqn.solve();
}
if (nonOrth == nNonOrthCorr)
{
// Calculate the conservative fluxes
phi -= p_rghEqn.flux();
// Explicitly relax pressure for momentum corrector
p_rgh.relax();
// Correct the momentum source with the pressure gradient flux
// calculated from the relaxed pressure
U -= rUA*fvc::reconstruct((buoyancyPhi + p_rghEqn.flux())/rUAf);
U.correctBoundaryConditions();
}
}
#include "continuityErrs.H"
}

View file

@ -0,0 +1,7 @@
const dictionary& simple = solidMesh.solutionDict().subDict("SIMPLE");
int nNonOrthCorr = 0;
if (simple.found("nNonOrthogonalCorrectors"))
{
nNonOrthCorr = readInt(simple.lookup("nNonOrthogonalCorrectors"));
}

View file

@ -0,0 +1,19 @@
singlePhaseTransportModel laminarTransport(U, phi);
// Density [kg/m^3]
dimensionedScalar rho(laminarTransport.lookup("rho"));
// Heat capacity [J/kgK]
dimensionedScalar Cp(laminarTransport.lookup("Cp"));
// Thermal expansion coefficient [1/K]
dimensionedScalar beta(laminarTransport.lookup("beta"));
// Reference temperature [K]
dimensionedScalar TRef(laminarTransport.lookup("TRef"));
// Laminar Prandtl number
dimensionedScalar Pr(laminarTransport.lookup("Pr"));
// Turbulent Prandtl number
dimensionedScalar Prt(laminarTransport.lookup("Prt"));

View file

@ -0,0 +1,46 @@
{
// Solid side
# include "readSolidControls.H"
for (int nonOrth = 0; nonOrth <= nNonOrthCorr; nonOrth++)
{
coupledFvScalarMatrix TEqns(2);
fvScalarMatrix* TFluidEqn = new fvScalarMatrix
(
rho*Cp*
(
fvm::div(phi, T)
+ fvm::SuSp(-fvc::div(phi), T)
)
- fvm::laplacian(kappaEff, T)
==
radiation->Ru()
- fvm::Sp(4.0*radiation->Rp()*pow3(T), T)
+ 3.0*radiation->Rp()*pow4(T)
);
//Called automatically in 1.6.1-ext
//TFluidEqn->boundaryManipulate(T.boundaryField());
TFluidEqn->relax();
fvScalarMatrix* TSolidEqn = new fvScalarMatrix
(
- fvm::laplacian(ksolidf, Tsolid, "laplacian(k,T)")
+ fvm::SuSp(-solidThermo.S()/Tsolid, Tsolid)
);
//Called automatically in 1.6.1-ext
//TSolidEqn->boundaryManipulate(Tsolid.boundaryField());
TSolidEqn->relax();
// Add fluid equation
TEqns.set(0, TFluidEqn);
// Add solid equation
TEqns.set(1, TSolidEqn);
TEqns.solve();
}
}

View file

@ -681,6 +681,8 @@ matrices/blockLduMatrix/BlockLduSmoothers/BlockLduSmoother/blockLduSmoothers.C
matrices/blockLduMatrix/BlockLduSmoothers/BlockGaussSeidelSmoother/blockGaussSeidelSmoothers.C matrices/blockLduMatrix/BlockLduSmoothers/BlockGaussSeidelSmoother/blockGaussSeidelSmoothers.C
matrices/blockLduMatrix/BlockLduSmoothers/BlockILUSmoother/blockILUSmoothers.C matrices/blockLduMatrix/BlockLduSmoothers/BlockILUSmoother/blockILUSmoothers.C
/* compile blockVectorNSolvers earlier to exploit parallelismn */
matrices/blockLduMatrix/BlockLduSolvers/blockVectorNSolvers.C
matrices/blockLduMatrix/BlockLduSolvers/BlockLduSolver/blockLduSolvers.C matrices/blockLduMatrix/BlockLduSolvers/BlockLduSolver/blockLduSolvers.C
matrices/blockLduMatrix/BlockLduSolvers/BlockDiagonal/blockDiagonalSolvers.C matrices/blockLduMatrix/BlockLduSolvers/BlockDiagonal/blockDiagonalSolvers.C
matrices/blockLduMatrix/BlockLduSolvers/BlockGaussSeidel/blockGaussSeidelSolvers.C matrices/blockLduMatrix/BlockLduSolvers/BlockGaussSeidel/blockGaussSeidelSolvers.C
@ -690,6 +692,4 @@ matrices/blockLduMatrix/BlockLduSolvers/BlockGMRES/blockGMRESSolvers.C
matrices/blockLduMatrix/BlockLduSolvers/BlockAmgSolver/blockAmgSolvers.C matrices/blockLduMatrix/BlockLduSolvers/BlockAmgSolver/blockAmgSolvers.C
matrices/blockLduMatrix/BlockLduSolvers/Segregated/segregatedSolvers.C matrices/blockLduMatrix/BlockLduSolvers/Segregated/segregatedSolvers.C
matrices/blockLduMatrix/BlockLduSolvers/blockVectorNSolvers.C
LIB = $(FOAM_LIBBIN)/libOpenFOAM LIB = $(FOAM_LIBBIN)/libOpenFOAM

View file

@ -356,7 +356,7 @@ MixingPlaneInterpolation<MasterPatch, SlavePatch>::calcTransforms() const
InfoIn InfoIn
( (
"MixingPlaneInterpolation" "MixingPlaneInterpolation"
"<SlavePatch, SlavePatch>::calcTransforms()" "<SlavePatch, SlavePatch>::calcTransforms() const"
) << "slave face centre transformation check: " ) << "slave face centre transformation check: "
<< "(should be zero!) mag = " << "(should be zero!) mag = "
<< mag(transformedFaceCentre2 - slaveFaceCntr) << nl << mag(transformedFaceCentre2 - slaveFaceCntr) << nl

Some files were not shown because too many files have changed in this diff Show more