Merge branch 'master' of /home/noisy2/OpenFOAM/OpenFOAM-dev/

This commit is contained in:
Henry Weller
2008-05-16 12:38:48 +01:00
63 changed files with 2063 additions and 417 deletions

View File

@ -48,4 +48,8 @@ submodels/addOns/radiation/scatter/cloudScatter/cloudScatter.C
IntegrationScheme/makeIntegrationSchemes.C IntegrationScheme/makeIntegrationSchemes.C
/* Data entries */
submodels/IO/DataEntry/makeDataEntries.C
LIB = $(FOAM_LIBBIN)/liblagrangianIntermediate LIB = $(FOAM_LIBBIN)/liblagrangianIntermediate

View File

@ -112,15 +112,13 @@ Foam::scalar Foam::KinematicCloud<ParcelType>::setNumberOfParticles
{ {
nP = pVolumeFraction*massTotal_/nParcels nP = pVolumeFraction*massTotal_/nParcels
/(pRho*mathematicalConstant::pi/6.0*pow(pDiameter, 3)); /(pRho*mathematicalConstant::pi/6.0*pow(pDiameter, 3));
break;
} }
break;
case pbNumber: case pbNumber:
{ {
nP = pVolumeFraction*massTotal_/(pRho*pVolume); nP = pVolumeFraction*massTotal_/(pRho*pVolume);
break;
} }
break;
default: default:
{ {
nP = 0.0; nP = 0.0;
@ -364,13 +362,10 @@ void Foam::KinematicCloud<ParcelType>::inject
scalar pRho = td.constProps().rho0(); scalar pRho = td.constProps().rho0();
this->injection().prepareForNextTimeStep(time0_, time);
// Number of parcels to introduce during this timestep // Number of parcels to introduce during this timestep
const label nParcels = this->injection().nParcelsToInject const label nParcels = this->injection().nParcels();
(
nInjections_,
time0_,
time
);
// Return if no parcels are required // Return if no parcels are required
if (!nParcels) if (!nParcels)
@ -380,15 +375,10 @@ void Foam::KinematicCloud<ParcelType>::inject
} }
// Volume of particles to introduce during this timestep // Volume of particles to introduce during this timestep
scalar pVolume = this->injection().volume scalar pVolume = this->injection().volume();
(
time0_,
time,
this->meshInfo()
);
// Volume fraction to introduce during this timestep // Volume fraction to introduce during this timestep
scalar pVolumeFraction = this->injection().volumeFraction(time0_, time); scalar pVolumeFraction = this->injection().volumeFraction();
// Duration of injection period during this timestep // Duration of injection period during this timestep
scalar deltaT = min scalar deltaT = min
@ -419,8 +409,7 @@ void Foam::KinematicCloud<ParcelType>::inject
( (
iParcel, iParcel,
timeInj, timeInj,
this->meshInfo(), this->meshInfo()
rndGen_
); );
// Diameter of parcels // Diameter of parcels
@ -437,7 +426,12 @@ void Foam::KinematicCloud<ParcelType>::inject
); );
// Velocity of parcels // Velocity of parcels
vector pU = this->injection().velocity(iParcel, timeInj); vector pU = this->injection().velocity
(
iParcel,
timeInj,
this->meshInfo()
);
// Determine the injection cell // Determine the injection cell
label pCell = -1; label pCell = -1;
@ -496,8 +490,9 @@ void Foam::KinematicCloud<ParcelType>::postInjectCheck()
{ {
if (nParcelsAdded_) if (nParcelsAdded_)
{ {
Pout<< "\n--> Cloud: " << this->name() << nl << Pout<< "\n--> Cloud: " << this->name() << nl
" Added " << nParcelsAdded_ << " new parcels" << nl << endl; << " Added " << nParcelsAdded_
<< " new parcels" << nl << endl;
} }
// Reset parcel counters // Reset parcel counters

View File

@ -363,6 +363,9 @@ public:
inline const InjectionModel<KinematicCloud<ParcelType> >& inline const InjectionModel<KinematicCloud<ParcelType> >&
injection() const; injection() const;
inline InjectionModel<KinematicCloud<ParcelType> >&
injection();
//- Return reference to wall interaction model //- Return reference to wall interaction model
inline const WallInteractionModel<KinematicCloud<ParcelType> >& inline const WallInteractionModel<KinematicCloud<ParcelType> >&
wallInteraction() const; wallInteraction() const;

View File

@ -139,6 +139,14 @@ Foam::KinematicCloud<ParcelType>::injection() const
} }
template<class ParcelType>
inline Foam::InjectionModel<Foam::KinematicCloud<ParcelType> >&
Foam::KinematicCloud<ParcelType>::injection()
{
return injectionModel_();
}
template<class ParcelType> template<class ParcelType>
inline const Foam::WallInteractionModel<Foam::KinematicCloud<ParcelType> >& inline const Foam::WallInteractionModel<Foam::KinematicCloud<ParcelType> >&
Foam::KinematicCloud<ParcelType>::wallInteraction() const Foam::KinematicCloud<ParcelType>::wallInteraction() const

View File

@ -200,13 +200,10 @@ void Foam::ReactingCloud<ParcelType>::inject
scalar pRho = td.constProps().rho0(); scalar pRho = td.constProps().rho0();
this->injection().prepareForNextTimeStep(this->time0(), time);
// Number of parcels to introduce during this timestep // Number of parcels to introduce during this timestep
const label nParcels = this->injection().nParcelsToInject const label nParcels = this->injection().nParcels();
(
this->nInjections(),
this->time0(),
time
);
// Return if no parcels are required // Return if no parcels are required
if (!nParcels) if (!nParcels)
@ -216,19 +213,10 @@ void Foam::ReactingCloud<ParcelType>::inject
} }
// Volume of particles to introduce during this timestep // Volume of particles to introduce during this timestep
scalar pVolume = this->injection().volume scalar pVolume = this->injection().volume();
(
this->time0(),
time,
this->meshInfo()
);
// Volume fraction to introduce during this timestep // Volume fraction to introduce during this timestep
scalar pVolumeFraction = this->injection().volumeFraction scalar pVolumeFraction = this->injection().volumeFraction();
(
this->time0(),
time
);
// Duration of injection period during this timestep // Duration of injection period during this timestep
scalar deltaT = min scalar deltaT = min
@ -259,8 +247,7 @@ void Foam::ReactingCloud<ParcelType>::inject
( (
iParcel, iParcel,
timeInj, timeInj,
this->meshInfo(), this->meshInfo()
this->rndGen()
); );
// Diameter of parcels // Diameter of parcels
@ -277,7 +264,12 @@ void Foam::ReactingCloud<ParcelType>::inject
); );
// Velocity of parcels // Velocity of parcels
vector pU = this->injection().velocity(iParcel, timeInj); vector pU = this->injection().velocity
(
iParcel,
timeInj,
this->meshInfo()
);
// Determine the injection cell // Determine the injection cell
label pCell = -1; label pCell = -1;

View File

@ -277,38 +277,58 @@ public:
//- Return type id //- Return type id
inline const label typeId() const; inline const label typeId() const;
//- Return diameter //- Return const access to diameter
inline const scalar d() const; inline const scalar d() const;
inline scalar& d();
//- Return velocity //- Return const access to velocity
inline const vector& U() const; inline const vector& U() const;
inline vector& U();
//- Return relative velocity //- Return const access to relative velocity
inline const vector& Ur() const; inline const vector& Ur() const;
inline vector& Ur();
//- Return number of particles //- Return const access to number of particles
inline const scalar nParticle() const; inline const scalar nParticle() const;
inline scalar& nParticle();
//- Return density //- Return const access to density
inline const scalar rho() const; inline const scalar rho() const;
inline scalar& rho();
//- Return time spent in turbulent eddy //- Return const access to time spent in turbulent eddy
inline const scalar tTurb() const; inline const scalar tTurb() const;
inline scalar& tTurb();
//- Return turbulent velocity fluctuation //- Return const access to turbulent velocity fluctuation
inline const vector& UTurb() const; inline const vector& UTurb() const;
inline vector& UTurb();
//- The nearest distance to a wall that //- The nearest distance to a wall that
// the particle can be in the n direction // the particle can be in the n direction
inline scalar wallImpactDistance(const vector& n) const; inline scalar wallImpactDistance(const vector& n) const;
// Edit
//- Return access to diameter
inline scalar& d();
//- Return access to velocity
inline vector& U();
//- Return access to relative velocity
inline vector& Ur();
//- Return access to number of particles
inline scalar& nParticle();
//- Return access to density
inline scalar& rho();
//- Return access to time spent in turbulent eddy
inline scalar& tTurb();
//- Return access to turbulent velocity fluctuation
inline vector& UTurb();
// Helper functions
//- Return the index of the face to be used in the interpolation //- Return the index of the face to be used in the interpolation
// routine // routine
inline label faceInterpolation() const; inline label faceInterpolation() const;

View File

@ -259,24 +259,37 @@ public:
// Access // Access
//- Return mass fractions of gases //- Return const access to mass fractions of gases
inline const scalarField& YGas() const; inline const scalarField& YGas() const;
//- Return const access to mass fractions of liquids
inline const scalarField& YLiquid() const;
//- Return const access to mass fractions of solids
inline const scalarField& YSolid() const;
//- Return const access to mass fractions of mixture
inline const scalarField& YMixture() const;
//- Return const access to initial mass
inline const scalar mass0() const;
// Edit
//- Return access to mass fractions of gases
inline scalarField& YGas(); inline scalarField& YGas();
//- Return mass fractions of liquids //- Return access to mass fractions of liquids
inline const scalarField& YLiquid() const;
inline scalarField& YLiquid(); inline scalarField& YLiquid();
//- Return mass fractions of solids //- Return access to mass fractions of solids
inline const scalarField& YSolid() const;
inline scalarField& YSolid(); inline scalarField& YSolid();
//- Return mass fractions of mixture //- Return access to mass fractions of mixture
inline const scalarField& YMixture() const;
inline scalarField& YMixture(); inline scalarField& YMixture();
//- Return initial mass //- Return access to initial mass
inline const scalar mass0() const;
inline scalar& mass0(); inline scalar& mass0();
@ -315,6 +328,15 @@ public:
static void readFields(ReactingCloud<ParcelType>& c); static void readFields(ReactingCloud<ParcelType>& c);
static void writeFields(const ReactingCloud<ParcelType>& c); static void writeFields(const ReactingCloud<ParcelType>& c);
// Ostream Operator
friend Ostream& operator<< <ParcelType>
(
Ostream&,
const ReactingParcel<ParcelType>&
);
}; };

View File

@ -249,12 +249,19 @@ public:
// Access // Access
//- Return temperature //- Return const access to temperature
inline const scalar T() const; inline const scalar T() const;
//- Return const access to specific heat capacity
inline const scalar cp() const;
// Edit
//- Return access to temperature
inline scalar& T(); inline scalar& T();
//- Return specific heat capacity //- Return access to specific heat capacity
inline const scalar cp() const;
inline scalar& cp(); inline scalar& cp();
@ -293,6 +300,15 @@ public:
static void readFields(ThermoCloud<ParcelType>& c); static void readFields(ThermoCloud<ParcelType>& c);
static void writeFields(const ThermoCloud<ParcelType>& c); static void writeFields(const ThermoCloud<ParcelType>& c);
// Ostream Operator
friend Ostream& operator<< <ParcelType>
(
Ostream&,
const ThermoParcel<ParcelType>&
);
}; };

View File

@ -26,8 +26,9 @@ License
#include "basicKinematicParcel.H" #include "basicKinematicParcel.H"
#include "KinematicCloud.H" #include "KinematicCloud.H"
#include "ManualInjection.H"
#include "NoInjection.H" #include "NoInjection.H"
#include "ManualInjection.H"
#include "ConeInjection.H"
namespace Foam namespace Foam
{ {
@ -35,6 +36,12 @@ namespace Foam
// Add instances of injection model to the table // Add instances of injection model to the table
makeInjectionModelType makeInjectionModelType
(
NoInjection,
KinematicCloud,
basicKinematicParcel
);
makeInjectionModelType
( (
ManualInjection, ManualInjection,
KinematicCloud, KinematicCloud,
@ -42,7 +49,7 @@ namespace Foam
); );
makeInjectionModelType makeInjectionModelType
( (
NoInjection, ConeInjection,
KinematicCloud, KinematicCloud,
basicKinematicParcel basicKinematicParcel
); );

View File

@ -26,8 +26,9 @@ License
#include "basicReactingParcel.H" #include "basicReactingParcel.H"
#include "ReactingCloud.H" #include "ReactingCloud.H"
#include "ManualInjection.H"
#include "NoInjection.H" #include "NoInjection.H"
#include "ManualInjection.H"
#include "ConeInjection.H"
namespace Foam namespace Foam
{ {
@ -35,6 +36,12 @@ namespace Foam
// Add instances of injection model to the table // Add instances of injection model to the table
makeInjectionModelType makeInjectionModelType
(
NoInjection,
KinematicCloud,
basicReactingParcel
);
makeInjectionModelType
( (
ManualInjection, ManualInjection,
KinematicCloud, KinematicCloud,
@ -42,7 +49,7 @@ namespace Foam
); );
makeInjectionModelType makeInjectionModelType
( (
NoInjection, ConeInjection,
KinematicCloud, KinematicCloud,
basicReactingParcel basicReactingParcel
); );

View File

@ -28,6 +28,7 @@ License
#include "ThermoCloud.H" #include "ThermoCloud.H"
#include "NoInjection.H" #include "NoInjection.H"
#include "ManualInjection.H" #include "ManualInjection.H"
#include "ConeInjection.H"
namespace Foam namespace Foam
{ {
@ -37,6 +38,8 @@ namespace Foam
makeInjectionModelType(NoInjection, KinematicCloud, basicThermoParcel); makeInjectionModelType(NoInjection, KinematicCloud, basicThermoParcel);
makeInjectionModelType(ManualInjection, KinematicCloud, basicThermoParcel); makeInjectionModelType(ManualInjection, KinematicCloud, basicThermoParcel);
makeInjectionModelType(ConeInjection, KinematicCloud, basicThermoParcel);
}; };

View File

@ -0,0 +1,90 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2007 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 "Constant.H"
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class Type>
Foam::Constant<Type>::Constant
(
const word& entryName,
const dictionary& dict
)
:
DataEntry<Type>(typeName, entryName, dict),
value_(this->dict_.lookup("value"))
{}
template<>
Foam::Constant<Foam::label>::Constant
(
const word& entryName,
const dictionary& dict
)
:
DataEntry<label>(typeName, entryName, dict),
value_(readLabel(this->dict_.lookup("value")))
{}
template<>
Foam::Constant<Foam::scalar>::Constant
(
const word& entryName,
const dictionary& dict
)
:
DataEntry<scalar>(typeName, entryName, dict),
value_(readScalar(this->dict_.lookup("value")))
{}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
template<class Type>
Foam::Constant<Type>::~Constant()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class Type>
Type Foam::Constant<Type>::value(const scalar x) const
{
return value_;
}
template<class Type>
Type Foam::Constant<Type>::integrate(const scalar x1, const scalar x2) const
{
return (x2 - x1)*value_;
}
// ************************************************************************* //

View File

@ -0,0 +1,129 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2007 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::Constant
Description
Templated basic entry that holds a constant value.
@verbatim
entry Constant
entryCoeffs
{
value 100.0; // Constant value
}
@endverbatim
SourceFiles
Constant.C
\*---------------------------------------------------------------------------*/
#ifndef Constant_H
#define Constant_H
#include "DataEntry.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class Constant Declaration
\*---------------------------------------------------------------------------*/
template<class Type>
class Constant
:
public DataEntry<Type>
{
// Private data
Type value_;
// Private Member Functions
//- Disallow default bitwise copy construct
Constant(const Constant<Type>&);
//- Disallow default bitwise assignment
void operator=(const Constant<Type>&);
public:
// Runtime type information
TypeName("Constant");
// Constructors
//- Construct from dictionary
Constant
(
const word& entryName,
const dictionary& dict
);
//- Destructor
~Constant();
// Member Functions
//- Return constant value
Type value(const scalar) const;
//- Integrate between two values
Type integrate(const scalar x1, const scalar x2) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
template<>
Constant<label>::Constant(const word& entryName, const dictionary& dict);
template<>
Constant<scalar>::Constant(const word& entryName, const dictionary& dict);
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#ifdef NoRepository
# include "Constant.C"
#endif
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,60 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2007 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 "DataEntry.H"
// * * * * * * * * * * * * * * * * Constructor * * * * * * * * * * * * * * * //
template<class Type>
Foam::DataEntry<Type>::DataEntry
(
const word& typeName,
const word& entryName,
const dictionary& dict
)
:
dict_(dict.subDict(entryName + "Coeffs")),
entry_(entryName)
{}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
template<class Type>
Foam::DataEntry<Type>::~DataEntry()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class Type>
const Foam::dictionary& Foam::DataEntry<Type>::dict() const
{
return dict_;
}
// ************************************************************************* //

View File

@ -0,0 +1,170 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2007 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::DataEntry
Description
SourceFiles
DataEntry.C
NewDataEntry.C
\*---------------------------------------------------------------------------*/
#ifndef DataEntry_H
#define DataEntry_H
#include "dictionary.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class DataEntry Declaration
\*---------------------------------------------------------------------------*/
template<class Type>
class DataEntry
{
// Private Member Functions
//- Disallow default bitwise copy construct
DataEntry(const DataEntry<Type>&);
//- Disallow default bitwise assignment
void operator=(const DataEntry<Type>&);
protected:
// Protected data
//- Coefficients dictionary
const dictionary dict_;
//- Name of entry
const word entry_;
public:
//- Runtime type information
TypeName("DataEntry")
//- Declare runtime constructor selection table
declareRunTimeSelectionTable
(
autoPtr,
DataEntry,
dictionary,
(
const word& entryName,
const dictionary& dict
),
(entryName, dict)
);
// Constructor
//- Construct from type name and dictionary
DataEntry
(
const word& TypeName,
const word& entryName,
const dictionary& dict
);
//- Selector
static autoPtr<DataEntry<Type> > New
(
const word& entryName,
const dictionary& dict
);
//- Destructor
virtual ~DataEntry();
// Member Functions
// Access
//- Return the dictionary
const dictionary& dict() const;
// Evaluation
//- Return value as a function of (scalar) independent variable
virtual Type value(const scalar x) const = 0;
//- Integrate between two (scalar) values
virtual Type integrate(const scalar x1, const scalar x2) const = 0;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#define makeDataEntry(Type) \
\
defineNamedTemplateTypeNameAndDebug(DataEntry<Type>, 0); \
\
defineTemplateRunTimeSelectionTable \
( \
DataEntry<Type>, \
dictionary \
);
#define makeDataEntryType(SS, Type) \
\
defineNamedTemplateTypeNameAndDebug(SS<Type>, 0); \
\
DataEntry<Type>::adddictionaryConstructorToTable<SS<Type> > \
add##SS##Type##ConstructorToTable_;
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#ifdef NoRepository
# include "DataEntry.C"
# include "NewDataEntry.C"
#endif
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,62 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2007 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 "DataEntry.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
template<class Type>
Foam::autoPtr<Foam::DataEntry<Type> > Foam::DataEntry<Type>::New
(
const word& entryName,
const dictionary& dict
)
{
word DataEntryType(dict.lookup(entryName));
// Info<< "Selecting DataEntry " << DataEntryType << endl;
typename dictionaryConstructorTable::iterator cstrIter =
dictionaryConstructorTablePtr_->find(DataEntryType);
if (cstrIter == dictionaryConstructorTablePtr_->end())
{
FatalErrorIn
(
"DataEntry<Type>::New(const dictionary&"
) << "Unknown DataEntry type "
<< DataEntryType << " for " << entryName
<< ", constructor not in hash table" << nl << nl
<< " Valid DataEntry types are :" << nl
<< dictionaryConstructorTablePtr_->toc() << nl
<< exit(FatalError);
}
return autoPtr<DataEntry<Type> >(cstrIter()(entryName, dict));
}
// ************************************************************************* //

View File

@ -0,0 +1,151 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2007 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 "Table.H"
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class Type>
Foam::Table<Type>::Table
(
const word& entryName,
const dictionary& dict
)
:
DataEntry<Type>(typeName, entryName, dict),
table_(this->dict_.lookup("table"))
{
if (!table_.size())
{
FatalErrorIn
(
"Foam::Table<Type>::Table"
"("
"const word& entryName,"
"const dictionary& dict"
")"
) << "Table is invalid (empty)" << nl
<< exit(FatalError);
}
Info<< table_;
}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
template<class Type>
Foam::Table<Type>::~Table()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class Type>
Type Foam::Table<Type>::value(const scalar x) const
{
// Return zero if out of bounds
if ((x > table_[table_.size()-1].first()) || (x < table_[0].first()))
{
return pTraits<Type>::zero;
}
label i = 0;
while ((table_[i].first() < x) && (i < table_.size()))
{
i++;
}
if (i == 0)
{
return table_[0].second();
}
else if (i == table_.size() - 1)
{
return table_[i-1].second();
}
else
{
return
(x - table_[i-1].first())/(table_[i].first() - table_[i-1].first())
* (table_[i].second() - table_[i-1].second())
+ table_[i-1].second();
}
}
template<class Type>
Type Foam::Table<Type>::integrate(const scalar x1, const scalar x2) const
{
// Initialise return value
Type sum = pTraits<Type>::zero;
// Return zero if out of bounds
if ((x1 > table_[table_.size()-1].first()) || (x2 < table_[0].first()))
{
return sum;
}
// Find start index
label id1 = 0;
while ((table_[id1].first() < x1) && (id1 < table_.size()))
{
id1++;
}
// Find end index
label id2 = table_.size() - 1;
while ((table_[id2].first() > x2) && (id2 >= 1))
{
id2--;
}
// Integrate table body
for (label i=id1; i<id2; i++)
{
sum +=
(table_[i].second() + table_[i+1].second())
* (table_[i+1].first() - table_[i].first());
}
sum *= 0.5;
// Add table ends
if (id1 > 0)
{
sum += 0.5
* (value(x1) + table_[id1].second())
* (table_[id1].first() - x1);
}
if (id2 < table_.size() - 1)
{
sum += 0.5
* (table_[id2].second() + value(x2))
* (x2 - table_[id2].first());
}
return sum;
}
// ************************************************************************* //

View File

@ -0,0 +1,130 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2007 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::Table
Description
Templated table container data entry. Items are stored in a list of
Tuple2's. First column is always stored as scalar entries. Data is read
in the form, e.g. for (scalar, vector):
@verbatim
entry Table
entryCoeffs
{
table
(
0.0 (1 2 3)
1.0 (4 5 6)
)
}
@endverbatim
SourceFiles
Table.C
\*---------------------------------------------------------------------------*/
#ifndef Table_H
#define Table_H
#include "DataEntry.H"
#include "Tuple2.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class Table Declaration
\*---------------------------------------------------------------------------*/
template<class Type>
class Table
:
public DataEntry<Type>
{
// Private data
//- Table data
List<Tuple2<scalar, Type> > table_;
// Private Member Functions
//- Disallow default bitwise copy construct
Table(const Table<Type>&);
//- Disallow default bitwise assignment
void operator=(const Table<Type>&);
public:
// Runtime type information
TypeName("Table");
// Constructors
//- Construct from dictionary
Table
(
const word& entryName,
const dictionary& dict
);
//- Destructor
~Table();
// Member Functions
//- Return Table value
Type value(const scalar x) const;
//- Integrate between two (scalar) values
Type integrate(const scalar x1, const scalar x2) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#ifdef NoRepository
# include "Table.C"
#endif
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,51 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2007 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 "DataEntry.H"
#include "Constant.H"
#include "Table.H"
#include "label.H"
#include "scalar.H"
#include "vector.H"
namespace Foam
{
makeDataEntry(label);
makeDataEntryType(Constant, label);
makeDataEntryType(Table, label);
makeDataEntry(scalar);
makeDataEntryType(Constant, scalar);
makeDataEntryType(Table, scalar);
makeDataEntry(vector);
makeDataEntryType(Constant, vector);
makeDataEntryType(Table, vector);
};
// ************************************************************************* //

View File

@ -80,22 +80,11 @@ public:
// Member Functions // Member Functions
//- Return const access to the turbulence model
const compressible::turbulenceModel& turbulence() const const compressible::turbulenceModel& turbulence() const
{ {
return turbulence_; return turbulence_;
} }
virtual bool active() const = 0;
virtual vector update
(
const scalar dt,
const label celli,
const vector& U,
const vector& Uc,
vector& UTurb,
scalar& tTurb
) = 0;
}; };

View File

@ -75,8 +75,10 @@ public:
// Member Functions // Member Functions
//- Flag to indicate whether model activates injection model
bool active() const; bool active() const;
//- Update (disperse particles)
vector update vector update
( (
const scalar dt, const scalar dt,

View File

@ -73,8 +73,10 @@ public:
// Member Functions // Member Functions
//- Flag to indicate whether model activates injection model
bool active() const; bool active() const;
//- Update (disperse particles)
vector update vector update
( (
const scalar dt, const scalar dt,

View File

@ -28,7 +28,7 @@ Class
Description Description
The velocity is perturbed in random direction, with a The velocity is perturbed in random direction, with a
Gaussian random number distribution with variance sigma. Gaussian random number distribution with variance sigma.
where sigma is defined below where sigma is defined below
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
@ -75,8 +75,10 @@ public:
// Member Functions // Member Functions
//- Flag to indicate whether model activates injection model
bool active() const; bool active() const;
//- Update (disperse particles)
vector update vector update
( (
const scalar dt, const scalar dt,

View File

@ -72,8 +72,10 @@ public:
// Member Functions // Member Functions
//- Flag to indicate whether model activates drag model
bool active() const; bool active() const;
//- Return drag coefficient
scalar Cd(const scalar) const; scalar Cd(const scalar) const;
}; };

View File

@ -72,8 +72,10 @@ public:
// Member Functions // Member Functions
//- Flag to indicate whether model activates drag model
bool active() const; bool active() const;
//- Return drag coefficient
scalar Cd(const scalar Re) const; scalar Cd(const scalar Re) const;
}; };

View File

@ -0,0 +1,256 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2007 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 "ConeInjection.H"
#include "DataEntry.H"
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
template<class CloudType>
Foam::label Foam::ConeInjection<CloudType>::nParcelsToInject
(
const scalar time0,
const scalar time1
) const
{
if ((time0 >= 0.0) && (time0 < duration_))
{
return round((time1 - time0)*parcelsPerSecond_);
}
else
{
return 0;
}
}
template<class CloudType>
Foam::scalar Foam::ConeInjection<CloudType>::volumeToInject
(
const scalar time0,
const scalar time1
) const
{
if ((time0 >= 0.0) && (time0 < duration_))
{
return volumeFlowRate_().integrate(time0, time1);
}
else
{
return 0.0;
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class CloudType>
Foam::ConeInjection<CloudType>::ConeInjection
(
const dictionary& dict,
CloudType& owner
)
:
InjectionModel<CloudType>(dict, owner, typeName),
duration_(readScalar(this->coeffDict().lookup("duration"))),
position_(this->coeffDict().lookup("position")),
direction_(this->coeffDict().lookup("direction")),
parcelsPerSecond_
(
readScalar(this->coeffDict().lookup("parcelsPerSecond"))
),
volumeFlowRate_
(
DataEntry<scalar>::New
(
"volumeFlowRate",
this->coeffDict()
)
),
Umag_
(
DataEntry<scalar>::New
(
"Umag",
this->coeffDict()
)
),
thetaInner_
(
DataEntry<scalar>::New
(
"thetaInner",
this->coeffDict()
)
),
thetaOuter_
(
DataEntry<scalar>::New
(
"thetaOuter",
this->coeffDict()
)
),
parcelPDF_
(
pdf::New
(
this->coeffDict().subDict("parcelPDF"),
owner.rndGen()
)
),
tanVec1_(vector::zero),
tanVec2_(vector::zero)
{
// Normalise direction vector
direction_ /= mag(direction_);
// Determine direction vectors tangential to direction
vector tangent = vector::zero;
scalar magTangent = 0.0;
while (magTangent < SMALL)
{
vector v = this->owner().rndGen().vector01();
tangent = v - (v & direction_)*direction_;
magTangent = mag(tangent);
}
tanVec1_ = tangent/magTangent;
tanVec2_ = direction_^tanVec1_;
// Set total volume to inject
this->volumeTotal_ = volumeFlowRate_().integrate(0.0, duration_);
}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
template<class CloudType>
Foam::ConeInjection<CloudType>::~ConeInjection()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class CloudType>
bool Foam::ConeInjection<CloudType>::active() const
{
return true;
}
template<class CloudType>
Foam::scalar Foam::ConeInjection<CloudType>::timeEnd() const
{
return this->SOI_ + duration_;
}
template<class CloudType>
Foam::vector Foam::ConeInjection<CloudType>::position
(
const label,
const scalar,
const polyMeshInfo& meshInfo
)
{
vector pos = position_;
if (meshInfo.caseIs2d())
{
if (meshInfo.caseIs2dWedge())
{
pos.component(meshInfo.emptyComponent()) = 0.0;
}
else if (meshInfo.caseIs2dSlab())
{
pos.component(meshInfo.emptyComponent()) =
meshInfo.centrePoint().component(meshInfo.emptyComponent());
}
else
{
FatalErrorIn
(
"Foam::vector Foam::ConeInjection<CloudType>::position"
) << "Could not determine 2-D case geometry" << nl
<< abort(FatalError);
}
}
return pos;
}
template<class CloudType>
Foam::vector Foam::ConeInjection<CloudType>::velocity
(
const label,
const scalar time,
const polyMeshInfo& meshInfo
)
{
const scalar deg2Rad = mathematicalConstant::pi/180.0;
scalar t = time - this->SOI_;
scalar ti = thetaInner_().value(t);
scalar to = thetaOuter_().value(t);
scalar coneAngle = this->owner().rndGen().scalar01()*(to - ti) + ti;
coneAngle *= deg2Rad;
scalar alpha = sin(coneAngle);
scalar dcorr = cos(coneAngle);
scalar beta =
2.0*mathematicalConstant::pi*this->owner().rndGen().scalar01();
vector normal = alpha*(tanVec1_*cos(beta) + tanVec2_*sin(beta));
vector dirVec = dcorr*direction_;
dirVec += normal;
// Remove empty component of velocity for slab cases
if (meshInfo.caseIs2dSlab())
{
dirVec.component(meshInfo.emptyComponent()) = 0.0;
}
dirVec /= mag(dirVec);
return Umag_().value(t)*dirVec;
}
template<class CloudType>
Foam::scalar Foam::ConeInjection<CloudType>::d0
(
const label,
const scalar
) const
{
return parcelPDF_().sample();
}
// ************************************************************************* //

View File

@ -0,0 +1,200 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2007 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::ConeInjection
Description
Cone injection
- User specifies
- time of start of injection
- injector position
- direction (along injection axis)
- parcel flow rate
- parcel velocity
- inner and outer cone angles
- Parcel diameters obtained by PDF model
SourceFiles
ConeInjection.C
\*---------------------------------------------------------------------------*/
#ifndef ConeInjection_H
#define ConeInjection_H
#include "InjectionModel.H"
#include "pdf.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
template<class Type>
class DataEntry;
/*---------------------------------------------------------------------------*\
Class ConeInjection Declaration
\*---------------------------------------------------------------------------*/
template<class CloudType>
class ConeInjection
:
public InjectionModel<CloudType>
{
// Private data
//- Coefficients dictionary
dictionary coeffDict_;
//- Injection duration [s]
const scalar duration_;
//- Injector position [m]
const vector position_;
//- Injector direction []
vector direction_;
//- Number of parcels to introduce per second []
const label parcelsPerSecond_;
//- Volume flow rate of parcels to introduce relative to SOI [m^3]
const autoPtr<DataEntry<scalar> > volumeFlowRate_;
//- Parcel velocity magnitude relative to SOI [m/s]
const autoPtr<DataEntry<scalar> > Umag_;
//- Inner cone angle relative to SOI [deg]
const autoPtr<DataEntry<scalar> > thetaInner_;
//- Outer cone angle relative to SOI [deg]
const autoPtr<DataEntry<scalar> > thetaOuter_;
//- Parcel size PDF model
const autoPtr<pdf> parcelPDF_;
// Tangential vectors to the direction vector
//- First tangential vector
vector tanVec1_;
//- Second tangential vector
vector tanVec2_;
protected:
// Protected member functions
//- Number of parcels to introduce over the time step
label nParcelsToInject
(
const scalar time0,
const scalar time1
) const;
//- Number of parcels to introduce over the time step
scalar volumeToInject
(
const scalar time0,
const scalar time1
) const;
public:
//- Runtime type information
TypeName("ConeInjection");
// Constructors
//- Construct from dictionary
ConeInjection
(
const dictionary& dict,
CloudType& owner
);
// Destructor
~ConeInjection();
// Member Functions
//- Flag to indicate whether model activates injection model
bool active() const;
//- Return the end-of-injection time
scalar timeEnd() const;
// Injection geometry
//- Return the injection position
vector position
(
const label iParcel,
const scalar time,
const polyMeshInfo& meshInfo
);
//- Return the velocity of the parcel to introduce at a time
vector velocity
(
const label,
const scalar time,
const polyMeshInfo& meshInfo
);
//- Return the diameter of the parcel to introduce at a time
scalar d0
(
const label,
const scalar
) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#ifdef NoRepository
# include "ConeInjection.C"
#endif
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -32,11 +32,17 @@ template<class CloudType>
Foam::InjectionModel<CloudType>::InjectionModel Foam::InjectionModel<CloudType>::InjectionModel
( (
const dictionary& dict, const dictionary& dict,
CloudType& owner CloudType& owner,
const word& type
) )
: dict_(dict), : dict_(dict),
owner_(owner), owner_(owner),
rndGen_(label(0)) coeffDict_(dict.subDict(type + "Coeffs")),
SOI_(readScalar(coeffDict_.lookup("SOI"))),
volumeTotal_(0.0),
timeStep0_(0.0),
nParcels_(0),
volume_(0.0)
{} {}
@ -56,6 +62,13 @@ const CloudType& Foam::InjectionModel<CloudType>::owner() const
} }
template<class CloudType>
CloudType& Foam::InjectionModel<CloudType>::owner()
{
return owner_;
}
template<class CloudType> template<class CloudType>
const Foam::dictionary& Foam::InjectionModel<CloudType>::dict() const const Foam::dictionary& Foam::InjectionModel<CloudType>::dict() const
{ {
@ -64,9 +77,85 @@ const Foam::dictionary& Foam::InjectionModel<CloudType>::dict() const
template<class CloudType> template<class CloudType>
Foam::Random& Foam::InjectionModel<CloudType>::rndGen() const Foam::dictionary& Foam::InjectionModel<CloudType>::coeffDict() const
{ {
return rndGen_; return coeffDict_;
}
template<class CloudType>
const Foam::scalar Foam::InjectionModel<CloudType>::timeStart() const
{
return SOI_;
}
template<class CloudType>
const Foam::scalar Foam::InjectionModel<CloudType>::volumeTotal() const
{
return volumeTotal_;
}
template<class CloudType>
const Foam::label Foam::InjectionModel<CloudType>::nParcels() const
{
return nParcels_;
}
template<class CloudType>
const Foam::scalar Foam::InjectionModel<CloudType>::volume() const
{
return volume_;
}
template<class CloudType>
const Foam::scalar Foam::InjectionModel<CloudType>::volumeFraction() const
{
return volume_/volumeTotal_;
}
template<class CloudType>
void Foam::InjectionModel<CloudType>::prepareForNextTimeStep
(
const scalar time0,
const scalar time1
)
{
// Initialise values
nParcels_ = 0;
volume_ = 0.0;
// Return if not started injection event
if (time1 < SOI_)
{
timeStep0_ = time1;
return;
}
// Make times relative to SOI
scalar t0 = timeStep0_ - SOI_;
scalar t1 = time1 - SOI_;
// Number of parcels to inject
nParcels_ = nParcelsToInject(t0, t1);
// Volume of parcels to inject
volume_ = volumeToInject(t0, t1);
// Hold previous time if no parcels, but non-zero volume fraction
if ((nParcels_ == 0) && (volume_ > 0.0))
{
// hold value of timeStep0_
}
else
{
// advance value of timeStep0_
timeStep0_ = time1;
}
} }

View File

@ -63,8 +63,51 @@ class InjectionModel
// Reference to the owner cloud class // Reference to the owner cloud class
CloudType& owner_; CloudType& owner_;
//- Random number generator //- The coefficients dictionary
Random rndGen_; const dictionary coeffDict_;
protected:
// Protected data
// Global injection properties
//- Start of injection [s]
scalar SOI_;
//- Total volume of parcels to introduce [m^3]
// Initialised in the individual injection models
scalar volumeTotal_;
// Injection properties per Lagrangian time step
//- Time at start of injection time step [s]
scalar timeStep0_;
//- Number of parcels to introduce []
label nParcels_;
//- Volume of parcels to introduce [m^3]
scalar volume_;
// Protected member functions
//- Number of parcels to introduce over the time step
virtual label nParcelsToInject
(
const scalar time0,
const scalar time1
) const = 0;
//- Volume of parcels to introduce over the time step
virtual scalar volumeToInject
(
const scalar time0,
const scalar time1
) const = 0;
public: public:
@ -92,7 +135,8 @@ public:
InjectionModel InjectionModel
( (
const dictionary& dict, const dictionary& dict,
CloudType& owner CloudType& owner,
const word& type
); );
@ -112,14 +156,17 @@ public:
// Access // Access
//- Return the owner cloud object //- Return const access the owner cloud object
const CloudType& owner() const; const CloudType& owner() const;
//- Return non-const access the owner cloud object for manipulation
CloudType& owner();
//- Return the dictionary //- Return the dictionary
const dictionary& dict() const; const dictionary& dict() const;
//- Return reference to random number //- Return the coefficients dictionary
inline Random& rndGen(); const dictionary& coeffDict() const;
// Member Functions // Member Functions
@ -127,57 +174,62 @@ public:
//- Flag to indicate whether model activates injection model //- Flag to indicate whether model activates injection model
virtual bool active() const = 0; virtual bool active() const = 0;
//- Return the start-of-injection time
virtual scalar timeStart() const = 0;
//- Return the end-of-injection time // Global information
virtual scalar timeEnd() const = 0;
//- Return the injection position //- Return the start-of-injection time
virtual vector position const scalar timeStart() const;
(
const label iParcel,
const scalar time,
const polyMeshInfo& meshInfo,
Random& rndGen
) const = 0;
//- Return the number of parcels to intruduce between two times //- Return the total volume to be injected across the event
virtual label nParcelsToInject const scalar volumeTotal() const;
(
const label nInjections_,
const scalar time0,
const scalar time1
) const = 0;
//- Return the volume of parcels to introduce between two times //- Return the end-of-injection time
virtual scalar volume virtual scalar timeEnd() const = 0;
(
const scalar time0,
const scalar time1,
const polyMeshInfo& meshInfo
) const = 0;
//- Return the volume fraction to introduce between two times
virtual scalar volumeFraction
(
const scalar time0,
const scalar time1
) const = 0;
//- Return the diameter of the parcel to introduce at a time // Per Lagrangian time step properties
virtual scalar d0
(
const label iParcel,
const scalar time
) const = 0;
//- Return the velocity of the parcel to introduce at a time //- Determine properties for next time step/injection interval
virtual vector velocity void prepareForNextTimeStep
( (
const label iParcel, const scalar time0,
const scalar time const scalar time1
) const = 0; );
//- Return the number of parcels to introduce
const label nParcels() const;
//- Return the volume of parcels to introduce
const scalar volume() const;
//- Return the volume fraction to introduce
const scalar volumeFraction() const;
// Injection geometry
//- Return the injection position
virtual vector position
(
const label iParcel,
const scalar time,
const polyMeshInfo& meshInfo
) = 0;
//- Return the velocity of the parcel to introduce at a time
virtual vector velocity
(
const label iParcel,
const scalar time,
const polyMeshInfo& meshInfo
) = 0;
//- Return the diameter of the parcel to introduce at a time
virtual scalar d0
(
const label iParcel,
const scalar time
) const = 0;
}; };

View File

@ -24,10 +24,47 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "error.H"
#include "ManualInjection.H" #include "ManualInjection.H"
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
template<class CloudType>
Foam::label Foam::ManualInjection<CloudType>::nParcelsToInject
(
const scalar time0,
const scalar time1
) const
{
if ((0.0 >= time0) && (0.0 < time1))
{
return positions_.size();
}
else
{
return 0;
}
}
template<class CloudType>
Foam::scalar Foam::ManualInjection<CloudType>::volumeToInject
(
const scalar time0,
const scalar time1
) const
{
// All parcels introduced at SOI
if ((0.0 >= time0) && (0.0 < time1))
{
return this->volumeTotal_;
}
else
{
return 0.0;
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class CloudType> template<class CloudType>
@ -37,10 +74,8 @@ Foam::ManualInjection<CloudType>::ManualInjection
CloudType& owner CloudType& owner
) )
: :
InjectionModel<CloudType>(dict, owner), InjectionModel<CloudType>(dict, owner, typeName),
coeffDict_(dict.subDict(typeName + "Coeffs")), positionsFile_(this->coeffDict().lookup("positionsFile")),
injectionTime_(readScalar(coeffDict_.lookup("injectionTime"))),
positionsFile_(coeffDict_.lookup("positionsFile")),
positions_ positions_
( (
IOobject IOobject
@ -53,12 +88,12 @@ Foam::ManualInjection<CloudType>::ManualInjection
) )
), ),
diameters_(positions_.size()), diameters_(positions_.size()),
U0_(coeffDict_.lookup("U0")), U0_(this->coeffDict().lookup("U0")),
parcelPDF_ parcelPDF_
( (
pdf::New pdf::New
( (
coeffDict_.subDict("parcelPDF"), this->coeffDict().subDict("parcelPDF"),
owner.rndGen() owner.rndGen()
) )
) )
@ -70,7 +105,7 @@ Foam::ManualInjection<CloudType>::ManualInjection
} }
// Determine volume of particles to inject // Determine volume of particles to inject
volumeTotal_ = sum(pow(diameters_, 3)) this->volumeTotal_ = sum(pow(diameters_, 3))
*mathematicalConstant::pi/6.0; *mathematicalConstant::pi/6.0;
} }
@ -91,13 +126,6 @@ bool Foam::ManualInjection<CloudType>::active() const
} }
template<class CloudType>
Foam::scalar Foam::ManualInjection<CloudType>::timeStart() const
{
return injectionTime_;
}
template<class CloudType> template<class CloudType>
Foam::scalar Foam::ManualInjection<CloudType>::timeEnd() const Foam::scalar Foam::ManualInjection<CloudType>::timeEnd() const
{ {
@ -111,9 +139,8 @@ Foam::vector Foam::ManualInjection<CloudType>::position
( (
const label iParcel, const label iParcel,
const scalar time, const scalar time,
const polyMeshInfo& meshInfo, const polyMeshInfo& meshInfo
Random& )
) const
{ {
vector pos = positions_[iParcel]; vector pos = positions_[iParcel];
if (meshInfo.caseIs2d()) if (meshInfo.caseIs2d())
@ -129,8 +156,10 @@ Foam::vector Foam::ManualInjection<CloudType>::position
} }
else else
{ {
FatalErrorIn("Foam::vector Foam::ManualInjection<CloudType>::position") FatalErrorIn
<< "Could not determine 2-D case geometry" << nl (
"Foam::vector Foam::ManualInjection<CloudType>::position"
) << "Could not determine 2-D case geometry" << nl
<< abort(FatalError); << abort(FatalError);
} }
} }
@ -140,53 +169,21 @@ Foam::vector Foam::ManualInjection<CloudType>::position
template<class CloudType> template<class CloudType>
Foam::label Foam::ManualInjection<CloudType>::nParcelsToInject Foam::vector Foam::ManualInjection<CloudType>::velocity
( (
const label, const label,
const scalar time0,
const scalar time1
) const
{
if ((injectionTime_>=time0) && (injectionTime_<time1))
{
return positions_.size();
}
else
{
return 0;
}
}
template<class CloudType>
Foam::scalar Foam::ManualInjection<CloudType>::volume
(
const scalar, const scalar,
const scalar, const polyMeshInfo& meshInfo
const polyMeshInfo& )
) const
{ {
// Since all parcels are introduced at once, volume introduced in this time vector vel = U0_;
// interval = total mass if (meshInfo.caseIs2dSlab())
return volumeTotal_;
}
template<class CloudType>
Foam::scalar Foam::ManualInjection<CloudType>::volumeFraction
(
const scalar time0,
const scalar time1
) const
{
if ((injectionTime_>=time0) && (injectionTime_<time1))
{ {
return 1; vel.component(meshInfo.emptyComponent()) =
} meshInfo.centrePoint().component(meshInfo.emptyComponent());
else
{
return 0;
} }
return vel;
} }
@ -201,15 +198,4 @@ Foam::scalar Foam::ManualInjection<CloudType>::d0
} }
template<class CloudType>
Foam::vector Foam::ManualInjection<CloudType>::velocity
(
const label,
const scalar
) const
{
return U0_;
}
// ************************************************************************* // // ************************************************************************* //

View File

@ -68,9 +68,6 @@ class ManualInjection
//- Coefficients dictionary //- Coefficients dictionary
dictionary coeffDict_; dictionary coeffDict_;
//- Time to introduce parcels
const scalar injectionTime_;
//- Name of file containing positions data //- Name of file containing positions data
const word positionsFile_; const word positionsFile_;
@ -83,9 +80,6 @@ class ManualInjection
//- Initial parcel velocity //- Initial parcel velocity
const vector U0_; const vector U0_;
//- Total volume of parcels to introduce [m^3]
scalar volumeTotal_;
//- Parcel size PDF model //- Parcel size PDF model
const autoPtr<pdf> parcelPDF_; const autoPtr<pdf> parcelPDF_;
@ -93,6 +87,25 @@ class ManualInjection
scalar nParticlesPerParcel_; scalar nParticlesPerParcel_;
protected:
// Protected member functions
//- Number of parcels to introduce over the time step
label nParcelsToInject
(
const scalar time0,
const scalar time1
) const;
//- Volume of parcels to introduce over the time step
scalar volumeToInject
(
const scalar time0,
const scalar time1
) const;
public: public:
//- Runtime type information //- Runtime type information
@ -116,51 +129,37 @@ public:
// Member Functions // Member Functions
//- Flag to indicate whether model activates injection model
bool active() const; bool active() const;
scalar timeStart() const; //- Return the end-of-injection time
scalar timeEnd() const; scalar timeEnd() const;
vector position
(
const label iParcel,
const scalar time,
const polyMeshInfo& meshInfo,
Random&
) const;
label nParcelsToInject // Injection geometry
(
const label,
const scalar time0,
const scalar time1
) const;
scalar volume //- Return the injection position
( vector position
const scalar, (
const scalar, const label iParcel,
const polyMeshInfo& const scalar time,
) const; const polyMeshInfo& meshInfo
);
scalar volumeFraction //- Return the velocity of the parcel to introduce at a time
( vector velocity
const scalar time0, (
const scalar time1 const label,
) const; const scalar time,
const polyMeshInfo& meshInfo
);
scalar d0 //- Return the diameter of the parcel to introduce at a time
( scalar d0
const label iParcel, (
const scalar const label,
) const; const scalar
) const;
vector velocity
(
const label,
const scalar
) const;
}; };

View File

@ -24,11 +24,33 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "error.H"
#include "NoInjection.H" #include "NoInjection.H"
#include "addToRunTimeSelectionTable.H" #include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
template<class CloudType>
Foam::label Foam::NoInjection<CloudType>::nParcelsToInject
(
const scalar,
const scalar
) const
{
return 0;
}
template<class CloudType>
Foam::scalar Foam::NoInjection<CloudType>::volumeToInject
(
const scalar,
const scalar
) const
{
return 0.0;
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class CloudType> template<class CloudType>
@ -38,7 +60,7 @@ Foam::NoInjection<CloudType>::NoInjection
CloudType& owner CloudType& owner
) )
: :
InjectionModel<CloudType>(dict, owner) InjectionModel<CloudType>(dict, owner, typeName)
{} {}
@ -58,13 +80,6 @@ bool Foam::NoInjection<CloudType>::active() const
} }
template<class CloudType>
Foam::scalar Foam::NoInjection<CloudType>::timeStart() const
{
return 0.0;
}
template<class CloudType> template<class CloudType>
Foam::scalar Foam::NoInjection<CloudType>::timeEnd() const Foam::scalar Foam::NoInjection<CloudType>::timeEnd() const
{ {
@ -77,46 +92,22 @@ Foam::vector Foam::NoInjection<CloudType>::position
( (
const label, const label,
const scalar, const scalar,
const polyMeshInfo&, const polyMeshInfo&
Random& )
) const
{ {
return vector::zero; return vector::zero;
} }
template<class CloudType> template<class CloudType>
Foam::label Foam::NoInjection<CloudType>::nParcelsToInject Foam::vector Foam::NoInjection<CloudType>::velocity
( (
const label, const label,
const scalar, const scalar,
const scalar
) const
{
return 0;
}
template<class CloudType>
Foam::scalar Foam::NoInjection<CloudType>::volume
(
const scalar,
const scalar,
const polyMeshInfo& const polyMeshInfo&
) const )
{ {
return 0.0; return vector::zero;
}
template<class CloudType>
Foam::scalar Foam::NoInjection<CloudType>::volumeFraction
(
const scalar,
const scalar
) const
{
return 0.0;
} }
@ -131,15 +122,4 @@ Foam::scalar Foam::NoInjection<CloudType>::d0
} }
template<class CloudType>
Foam::vector Foam::NoInjection<CloudType>::velocity
(
const label,
const scalar
) const
{
return vector::zero;
}
// ************************************************************************* // // ************************************************************************* //

View File

@ -53,6 +53,25 @@ class NoInjection
public InjectionModel<CloudType> public InjectionModel<CloudType>
{ {
protected:
// Protected member functions
//- Number of parcels to introduce over the time step
label nParcelsToInject
(
const scalar,
const scalar
) const;
//- Volume of parcels to introduce over the time step
scalar volumeToInject
(
const scalar,
const scalar
) const;
public: public:
//- Runtime type information //- Runtime type information
@ -76,51 +95,37 @@ public:
// Member Functions // Member Functions
//- Flag to indicate whether model activates injection model
bool active() const; bool active() const;
scalar timeStart() const; //- Return the end-of-injection time
scalar timeEnd() const; scalar timeEnd() const;
vector position
(
const label,
const scalar,
const polyMeshInfo&,
Random&
) const;
label nParcelsToInject // Injection geometry
(
const label,
const scalar,
const scalar
) const;
scalar volume //- Return the injection position
( vector position
const scalar, (
const scalar, const label iParcel,
const polyMeshInfo& const scalar time,
) const; const polyMeshInfo& meshInfo
);
scalar volumeFraction //- Return the velocity of the parcel to introduce at a time
( vector velocity
const scalar, (
const scalar const label,
) const; const scalar time,
const polyMeshInfo& meshInfo
);
scalar d0 //- Return the diameter of the parcel to introduce at a time
( scalar d0
const label, (
const scalar const label,
) const; const scalar
) const;
vector velocity
(
const label,
const scalar
) const;
}; };

View File

@ -24,8 +24,6 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "error.H"
#include "Rebound.H" #include "Rebound.H"
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
@ -37,7 +35,8 @@ Foam::Rebound<CloudType>::Rebound
CloudType& cloud CloudType& cloud
) )
: :
WallInteractionModel<CloudType>(dict, cloud) WallInteractionModel<CloudType>(dict, cloud, typeName),
UFactor_(readScalar(this->coeffDict().lookup("UFactor")))
{} {}
@ -71,9 +70,9 @@ void Foam::Rebound<CloudType>::correct
scalar Un = U & nw; scalar Un = U & nw;
vector Ut = U - Un*nw; vector Ut = U - Un*nw;
if (Un > 0) if (Un > 0.0)
{ {
U -= 2.0*Un*nw; U -= UFactor_*2.0*Un*nw;
} }
U -= Ut; U -= Ut;

View File

@ -48,6 +48,12 @@ class Rebound
: :
public WallInteractionModel<CloudType> public WallInteractionModel<CloudType>
{ {
// Private data
//- Factor applied to velocity on rebound
// Normal rebound = 1
scalar UFactor_;
public: public:
@ -72,8 +78,10 @@ public:
// Member Functions // Member Functions
//- Flag to indicate whether model activates heat transfer model
bool active() const; bool active() const;
//- Apply wall correction
virtual void correct virtual void correct
( (
const wallPolyPatch& wpp, const wallPolyPatch& wpp,

View File

@ -37,10 +37,9 @@ Foam::StandardWallInteraction<CloudType>::StandardWallInteraction
CloudType& cloud CloudType& cloud
) )
: :
WallInteractionModel<CloudType>(dict, cloud), WallInteractionModel<CloudType>(dict, cloud, typeName),
coeffDict_(dict.subDict(typeName + "Coeffs")), e_(dimensionedScalar(this->coeffDict().lookup("e")).value()),
e_(dimensionedScalar(coeffDict_.lookup("e")).value()), mu_(dimensionedScalar(this->coeffDict().lookup("mu")).value())
mu_(dimensionedScalar(coeffDict_.lookup("mu")).value())
{} {}

View File

@ -51,9 +51,6 @@ class StandardWallInteraction
// Private data // Private data
//- Coefficient dictionary
dictionary coeffDict_;
//- Elasticity //- Elasticity
const scalar e_; const scalar e_;
@ -84,8 +81,10 @@ public:
// Member Functions // Member Functions
//- Flag to indicate whether model activates heat transfer model
bool active() const; bool active() const;
//- Apply wall correction
virtual void correct virtual void correct
( (
const wallPolyPatch& wpp, const wallPolyPatch& wpp,

View File

@ -32,10 +32,12 @@ template<class CloudType>
Foam::WallInteractionModel<CloudType>::WallInteractionModel Foam::WallInteractionModel<CloudType>::WallInteractionModel
( (
const dictionary& dict, const dictionary& dict,
CloudType& owner CloudType& owner,
const word& type
) )
: dict_(dict), : dict_(dict),
owner_(owner) owner_(owner),
coeffDict_(dict.subDict(type + "Coeffs"))
{} {}
@ -63,6 +65,14 @@ const Foam::dictionary& Foam::WallInteractionModel<CloudType>::dict() const
} }
template<class CloudType>
const Foam::dictionary&
Foam::WallInteractionModel<CloudType>::coeffDict() const
{
return coeffDict_;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#include "NewWallInteractionModel.C" #include "NewWallInteractionModel.C"

View File

@ -63,6 +63,9 @@ class WallInteractionModel
// reference to the owner cloud class // reference to the owner cloud class
CloudType& owner_; CloudType& owner_;
//- The coefficients dictionary
const dictionary coeffDict_;
public: public:
@ -89,7 +92,8 @@ public:
WallInteractionModel WallInteractionModel
( (
const dictionary& dict, const dictionary& dict,
CloudType& owner CloudType& owner,
const word& type
); );
@ -109,11 +113,14 @@ public:
// Access // Access
//- Return the owner cloud object
const CloudType& owner() const;
//- Return the dictionary //- Return the dictionary
const dictionary& dict() const; const dictionary& dict() const;
//- Return the owner cloud object //- Return the coefficients dictionary
const CloudType& owner() const; const dictionary& coeffDict() const;
// Member Functions // Member Functions

View File

@ -32,10 +32,12 @@ template<class CloudType>
Foam::CompositionModel<CloudType>::CompositionModel Foam::CompositionModel<CloudType>::CompositionModel
( (
const dictionary& dict, const dictionary& dict,
CloudType& owner CloudType& owner,
const word& type
) )
: dict_(dict), : dict_(dict),
owner_(owner), owner_(owner),
coeffDict_(dict.subDict(type + "Coeffs")),
carrierThermo_(owner.carrierThermo()), carrierThermo_(owner.carrierThermo()),
gases_(owner.gases()), gases_(owner.gases()),
liquids_ liquids_
@ -84,6 +86,13 @@ const Foam::dictionary& Foam::CompositionModel<CloudType>::dict() const
} }
template<class CloudType>
const Foam::dictionary& Foam::CompositionModel<CloudType>::coeffDict() const
{
return coeffDict_;
}
template<class CloudType> template<class CloudType>
const Foam::hCombustionThermo& const Foam::hCombustionThermo&
Foam::CompositionModel<CloudType>::carrierThermo() const Foam::CompositionModel<CloudType>::carrierThermo() const

View File

@ -70,6 +70,9 @@ class CompositionModel
//- Reference to the owner injection class //- Reference to the owner injection class
CloudType& owner_; CloudType& owner_;
//- The coefficients dictionary
const dictionary& coeffDict_;
//- Reference to the carrier phase thermo package //- Reference to the carrier phase thermo package
hCombustionThermo& carrierThermo_; hCombustionThermo& carrierThermo_;
@ -108,7 +111,8 @@ public:
CompositionModel CompositionModel
( (
const dictionary& dict, const dictionary& dict,
CloudType& owner CloudType& owner,
const word& type
); );
@ -133,9 +137,12 @@ public:
//- Return the cloud object //- Return the cloud object
const CloudType& owner() const; const CloudType& owner() const;
//- Return the dictionary //- Return the cloud dictionary
const dictionary& dict() const; const dictionary& dict() const;
//- Return the coefficients dictionary
const dictionary& coeffDict() const;
//- Return the carrier phase thermo package //- Return the carrier phase thermo package
const hCombustionThermo& carrierThermo() const; const hCombustionThermo& carrierThermo() const;
@ -216,6 +223,7 @@ public:
const scalar T const scalar T
) const = 0; ) const = 0;
//- Return specific heat caparcity for the liquid mixture
virtual const scalar cpLiquid virtual const scalar cpLiquid
( (
const scalarField& YLiquid, const scalarField& YLiquid,
@ -223,6 +231,7 @@ public:
const scalar T const scalar T
) const = 0; ) const = 0;
//- Return specific heat caparcity for the solid mixture
virtual const scalar cpSolid virtual const scalar cpSolid
( (
const scalarField& YSolid const scalarField& YSolid

View File

@ -35,23 +35,22 @@ Foam::SingleMixtureFraction<CloudType>::SingleMixtureFraction
CloudType& owner CloudType& owner
) )
: :
CompositionModel<CloudType>(dict, owner), CompositionModel<CloudType>(dict, owner, typeName),
coeffDict_(dict.subDict(typeName + "Coeffs")),
gasNames_(coeffDict_.lookup("gasNames")), gasNames_(this->coeffDict().lookup("gasNames")),
gasGlobalIds_(gasNames_.size(), -1), gasGlobalIds_(gasNames_.size(), -1),
YGas0_(coeffDict_.lookup("YGas0")), YGas0_(this->coeffDict().lookup("YGas0")),
YGasTot0_(readScalar(coeffDict_.lookup("YGasTot0"))), YGasTot0_(readScalar(this->coeffDict().lookup("YGasTot0"))),
liquidNames_(coeffDict_.lookup("liquidNames")), liquidNames_(this->coeffDict().lookup("liquidNames")),
liquidGlobalIds_(liquidNames_.size(), -1), liquidGlobalIds_(liquidNames_.size(), -1),
YLiquid0_(coeffDict_.lookup("YLiquid0")), YLiquid0_(this->coeffDict().lookup("YLiquid0")),
YLiquidTot0_(readScalar(coeffDict_.lookup("YLiquidTot0"))), YLiquidTot0_(readScalar(this->coeffDict().lookup("YLiquidTot0"))),
solidNames_(coeffDict_.lookup("solidNames")), solidNames_(this->coeffDict().lookup("solidNames")),
solidGlobalIds_(solidNames_.size(), -1), solidGlobalIds_(solidNames_.size(), -1),
YSolid0_(coeffDict_.lookup("YSolid0")), YSolid0_(this->coeffDict().lookup("YSolid0")),
YSolidTot0_(readScalar(coeffDict_.lookup("YSolidTot0"))), YSolidTot0_(readScalar(this->coeffDict().lookup("YSolidTot0"))),
YMixture0_(3) YMixture0_(3)
{ {
@ -73,7 +72,8 @@ Foam::SingleMixtureFraction<CloudType>::SingleMixtureFraction
Info<< "\nThermo package species composition comprises:" << endl; Info<< "\nThermo package species composition comprises:" << endl;
forAll (this->carrierThermo().composition().Y(), k) forAll (this->carrierThermo().composition().Y(), k)
{ {
Info<< this->carrierThermo().composition().Y()[k].name() << endl; Info<< this->carrierThermo().composition().Y()[k].name()
<< endl;
} }
FatalErrorIn FatalErrorIn
@ -255,12 +255,14 @@ Foam::SingleMixtureFraction<CloudType>::gasLocalId(const word& gasName) const
return i; return i;
} }
} }
WarningIn WarningIn
( (
"Foam::label SingleMixtureFraction<CloudType>::" "Foam::label SingleMixtureFraction<CloudType>::"
"gasLocalId(const word& gasName) const" "gasLocalId(const word& gasName) const"
)<< "Gas name " << gasName << " not found in gasNames_" )<< "Gas name " << gasName << " not found in gasNames_"
<< endl; << endl;
return -1; return -1;
} }
@ -276,12 +278,14 @@ Foam::SingleMixtureFraction<CloudType>::gasGlobalId(const word& gasName) const
return gasGlobalIds_[i]; return gasGlobalIds_[i];
} }
} }
WarningIn WarningIn
( (
"Foam::label SingleMixtureFraction<CloudType>::" "Foam::label SingleMixtureFraction<CloudType>::"
"gasGlobalId(const word& gasName) const" "gasGlobalId(const word& gasName) const"
)<< "Gas name " << gasName << " not found in gasNames_" )<< "Gas name " << gasName << " not found in gasNames_"
<< endl; << endl;
return -1; return -1;
} }
@ -329,12 +333,14 @@ Foam::SingleMixtureFraction<CloudType>::liquidLocalId(const word& liquidName) co
return i; return i;
} }
} }
WarningIn WarningIn
( (
"Foam::label SingleMixtureFraction<CloudType>::" "Foam::label SingleMixtureFraction<CloudType>::"
"liquidLocalId(const word& liquidName) const" "liquidLocalId(const word& liquidName) const"
)<< "Liquid name " << liquidName << " not found in liquidNames_" )<< "Liquid name " << liquidName << " not found in liquidNames_"
<< endl; << endl;
return -1; return -1;
} }
@ -350,12 +356,14 @@ Foam::SingleMixtureFraction<CloudType>::liquidGlobalId(const word& liquidName) c
return liquidGlobalIds_[i]; return liquidGlobalIds_[i];
} }
} }
WarningIn WarningIn
( (
"Foam::label SingleMixtureFraction<CloudType>::" "Foam::label SingleMixtureFraction<CloudType>::"
"liquidGlobalId(const word& liquidName) const" "liquidGlobalId(const word& liquidName) const"
)<< "Liquid name " << liquidName << " not found in liquidNames_" )<< "Liquid name " << liquidName << " not found in liquidNames_"
<< endl; << endl;
return -1; return -1;
} }
@ -403,12 +411,14 @@ Foam::SingleMixtureFraction<CloudType>::solidLocalId(const word& solidName) cons
return i; return i;
} }
} }
WarningIn WarningIn
( (
"Foam::label SingleMixtureFraction<CloudType>::" "Foam::label SingleMixtureFraction<CloudType>::"
"SolididLocalId(const word& solidName) const" "SolididLocalId(const word& solidName) const"
)<< "Solid name " << solidName << " not found in solidNames_" )<< "Solid name " << solidName << " not found in solidNames_"
<< endl; << endl;
return -1; return -1;
} }
@ -424,12 +434,14 @@ Foam::SingleMixtureFraction<CloudType>::solidGlobalId(const word& solidName) con
return solidGlobalIds_[i]; return solidGlobalIds_[i];
} }
} }
WarningIn WarningIn
( (
"Foam::label SingleMixtureFraction<CloudType>::" "Foam::label SingleMixtureFraction<CloudType>::"
"solidGlobalId(const word& solidName) const" "solidGlobalId(const word& solidName) const"
)<< "Solid name " << solidName << " not found in solidNames_" )<< "Solid name " << solidName << " not found in solidNames_"
<< endl; << endl;
return -1; return -1;
} }

View File

@ -57,9 +57,6 @@ class SingleMixtureFraction
// Private data // Private data
//- The coefficient dictionary
const dictionary& coeffDict_;
//- Parcel properties //- Parcel properties
//- List of gas names //- List of gas names
@ -146,40 +143,58 @@ public:
// Access // Access
//- Return the list of composition names
const wordList compositionNames() const; const wordList compositionNames() const;
//- Return the list of gas names
const wordList& gasNames() const; const wordList& gasNames() const;
//- Return the list indices of gases in global thermo list
const labelList& gasGlobalIds() const; const labelList& gasGlobalIds() const;
//- Return the list of gas mass fractions
const scalarField& YGas0() const; const scalarField& YGas0() const;
//- Return the total gas mass fraction
const scalar YGasTot0() const; const scalar YGasTot0() const;
//- Return the list of liquid names
const wordList& liquidNames() const; const wordList& liquidNames() const;
//- Return the list indices of liquid in global thermo list
const labelList& liquidGlobalIds() const; const labelList& liquidGlobalIds() const;
//- Return the list of liquid mass fractions
const scalarField& YLiquid0() const; const scalarField& YLiquid0() const;
//- Return the total liquid mass fraction
const scalar YLiquidTot0() const; const scalar YLiquidTot0() const;
//- Return the list of solid names
const wordList& solidNames() const; const wordList& solidNames() const;
//- Return the list indices of solids in global thermo list
const labelList& solidGlobalIds() const; const labelList& solidGlobalIds() const;
//- Return the list of solid mass fractions
const scalarField& YSolid0() const; const scalarField& YSolid0() const;
//- Return the total solid mass fraction
const scalar YSolidTot0() const; const scalar YSolidTot0() const;
//- Return the list of mixture mass fractions
const scalarField& YMixture0() const; const scalarField& YMixture0() const;
//- Return the gas constant for the gas mixture
const scalar RGas(const scalarField& YGas) const; const scalar RGas(const scalarField& YGas) const;
//- Return enthalpy for the gas mixture
const scalar HGas(const scalarField& YGas, const scalar T) const; const scalar HGas(const scalarField& YGas, const scalar T) const;
//- Return specific heat caparcity for the gas mixture
const scalar cpGas(const scalarField& YGas, const scalar T) const; const scalar cpGas(const scalarField& YGas, const scalar T) const;
//- Return specific heat caparcity for the liquid mixture
const scalar cpLiquid const scalar cpLiquid
( (
const scalarField& YLiquid, const scalarField& YLiquid,
@ -187,6 +202,7 @@ public:
const scalar T const scalar T
) const; ) const;
//- Return specific heat caparcity for the solid mixture
const scalar cpSolid(const scalarField& YSolid) const; const scalar cpSolid(const scalarField& YSolid) const;
}; };

View File

@ -35,12 +35,11 @@ Foam::ConstantRateDevolatilisation<CloudType>::ConstantRateDevolatilisation
CloudType& owner CloudType& owner
) )
: :
MassTransferModel<CloudType>(dict, owner), MassTransferModel<CloudType>(dict, owner, typeName),
coeffDict_(dict.subDict(typeName + "Coeffs")), A0_(dimensionedScalar(this->coeffDict().lookup("A0")).value()),
A0_(dimensionedScalar(coeffDict_.lookup("A0")).value()),
volatileResidualCoeff_ volatileResidualCoeff_
( (
readScalar(coeffDict_.lookup("volatileResidualCoeff")) readScalar(this->coeffDict().lookup("volatileResidualCoeff"))
) )
{} {}

View File

@ -52,10 +52,6 @@ class ConstantRateDevolatilisation
// Private data // Private data
//- Coefficients dictionary
dictionary coeffDict_;
// Model constants // Model constants
//- Rate constant (suggested default = 12) [1/s] //- Rate constant (suggested default = 12) [1/s]
@ -90,10 +86,13 @@ public:
// Member Functions // Member Functions
//- Flag to indicate whether model activates mass transfer model
bool active() const; bool active() const;
//- Flag to indicate whether model changes particle volume
bool changesVolume() const; bool changesVolume() const;
//- Update model
scalar calculate scalar calculate
( (
const scalar dt, const scalar dt,

View File

@ -32,10 +32,12 @@ template<class CloudType>
Foam::MassTransferModel<CloudType>::MassTransferModel Foam::MassTransferModel<CloudType>::MassTransferModel
( (
const dictionary& dict, const dictionary& dict,
CloudType& owner CloudType& owner,
const word& type
) )
: dict_(dict), : dict_(dict),
owner_(owner) owner_(owner),
coeffDict_(dict.subDict(type + "Coeffs"))
{} {}
@ -61,6 +63,13 @@ const Foam::dictionary& Foam::MassTransferModel<CloudType>::dict() const
} }
template<class CloudType>
const Foam::dictionary& Foam::MassTransferModel<CloudType>::coeffDict() const
{
return coeffDict_;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#include "NewMassTransferModel.C" #include "NewMassTransferModel.C"

View File

@ -65,6 +65,9 @@ protected:
//- Reference to the owner cloud class //- Reference to the owner cloud class
CloudType& owner_; CloudType& owner_;
//- The coefficient dictionary
const dictionary coeffDict_;
public: public:
@ -91,7 +94,8 @@ public:
MassTransferModel MassTransferModel
( (
const dictionary& dict, const dictionary& dict,
CloudType& owner CloudType& owner,
const word& type
); );
@ -114,9 +118,12 @@ public:
//- Return the owner cloud object //- Return the owner cloud object
const CloudType& owner() const; const CloudType& owner() const;
//- Return the dictionary //- Return the cloud dictionary
const dictionary& dict() const; const dictionary& dict() const;
//- Return the coefficient dictionary
const dictionary& coeffDict() const;
// Member Functions // Member Functions

View File

@ -35,7 +35,7 @@ Foam::NoMassTransfer<CloudType>::NoMassTransfer
CloudType& cloud CloudType& cloud
) )
: :
MassTransferModel<CloudType>(dict, cloud) MassTransferModel<CloudType>(dict, cloud, typeName)
{} {}

View File

@ -72,10 +72,13 @@ public:
// Member Functions // Member Functions
//- Flag to indicate whether model activates mass transfer model
bool active() const; bool active() const;
//- Flag to indicate whether model changes particle volume
bool changesVolume() const; bool changesVolume() const;
//- Update model
scalar calculate scalar calculate
( (
const scalar, const scalar,

View File

@ -35,13 +35,12 @@ Foam::SingleKineticRateDevolatilisation<CloudType>::SingleKineticRateDevolatilis
CloudType& owner CloudType& owner
) )
: :
MassTransferModel<CloudType>(dict, owner), MassTransferModel<CloudType>(dict, owner, typeName),
coeffDict_(dict.subDict(typeName + "Coeffs")), A1_(dimensionedScalar(this->coeffDict().lookup("A1")).value()),
A1_(dimensionedScalar(coeffDict_.lookup("A1")).value()), E_(dimensionedScalar(this->coeffDict().lookup("E")).value()),
E_(dimensionedScalar(coeffDict_.lookup("E")).value()),
volatileResidualCoeff_ volatileResidualCoeff_
( (
readScalar(coeffDict_.lookup("volatileResidualCoeff")) readScalar(this->coeffDict().lookup("volatileResidualCoeff"))
) )
{} {}

View File

@ -51,10 +51,6 @@ class SingleKineticRateDevolatilisation
// Private data // Private data
//- Coefficients dictionary
dictionary coeffDict_;
// Model constants // Model constants
//- Activation energy //- Activation energy
@ -92,10 +88,13 @@ public:
// Member Functions // Member Functions
//- Flag to indicate whether model activates mass transfer model
bool active() const; bool active() const;
//- Flag to indicate whether model changes particle volume
bool changesVolume() const; bool changesVolume() const;
//- Update model
scalar calculate scalar calculate
( (
const scalar dt, const scalar dt,

View File

@ -35,7 +35,7 @@ Foam::NoSurfaceReaction<CloudType>::NoSurfaceReaction
CloudType& owner CloudType& owner
) )
: :
SurfaceReactionModel<CloudType>(dict, owner) SurfaceReactionModel<CloudType>(dict, owner, typeName)
{} {}

View File

@ -72,8 +72,10 @@ public:
// Member Functions // Member Functions
//- Flag to indicate whether model activates devolatisation model
bool active() const; bool active() const;
//- Update surface reactions
void calculate void calculate
( (
const scalar dt, const scalar dt,

View File

@ -32,10 +32,12 @@ template<class CloudType>
Foam::SurfaceReactionModel<CloudType>::SurfaceReactionModel Foam::SurfaceReactionModel<CloudType>::SurfaceReactionModel
( (
const dictionary& dict, const dictionary& dict,
CloudType& owner CloudType& owner,
const word& type
) )
: dict_(dict), : dict_(dict),
owner_(owner) owner_(owner),
coeffDict_(dict.subDict(type + "Coeffs"))
{} {}
@ -61,6 +63,13 @@ const Foam::dictionary& Foam::SurfaceReactionModel<CloudType>::dict() const
} }
template<class CloudType>
const Foam::dictionary& Foam::SurfaceReactionModel<CloudType>::coeffDict() const
{
return coeffDict_;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#include "NewSurfaceReactionModel.C" #include "NewSurfaceReactionModel.C"

View File

@ -66,6 +66,9 @@ class SurfaceReactionModel
// reference to the owner cloud class // reference to the owner cloud class
CloudType& owner_; CloudType& owner_;
//- The coefficients dictionary
const dictionary coeffDict_;
public: public:
@ -93,7 +96,8 @@ public:
SurfaceReactionModel SurfaceReactionModel
( (
const dictionary& dict, const dictionary& dict,
CloudType& cloud CloudType& cloud,
const word& type
); );
@ -116,15 +120,19 @@ public:
//- Return the owner cloud object //- Return the owner cloud object
const CloudType& owner() const; const CloudType& owner() const;
//- Return the dictionary //- Return the cloud dictionary
const dictionary& dict() const; const dictionary& dict() const;
//- Return the coefficients dictionary
const dictionary& coeffDict() const;
// Member Functions // Member Functions
//- Flag to indicate whether model activates devolatisation model //- Flag to indicate whether model activates devolatisation model
virtual bool active() const = 0; virtual bool active() const = 0;
//- Update surface reactions
virtual void calculate virtual void calculate
( (
const scalar dt, const scalar dt,

View File

@ -32,10 +32,12 @@ template<class CloudType>
Foam::HeatTransferModel<CloudType>::HeatTransferModel Foam::HeatTransferModel<CloudType>::HeatTransferModel
( (
const dictionary& dict, const dictionary& dict,
CloudType& owner CloudType& owner,
const word& type
) )
: dict_(dict), : dict_(dict),
owner_(owner) owner_(owner),
coeffDict_(dict.subDict(type + "Coeffs"))
{} {}
@ -62,6 +64,13 @@ const Foam::dictionary& Foam::HeatTransferModel<CloudType>::dict() const
} }
template<class CloudType>
const Foam::dictionary& Foam::HeatTransferModel<CloudType>::coeffDict() const
{
return coeffDict_;
}
template<class CloudType> template<class CloudType>
Foam::scalar Foam::HeatTransferModel<CloudType>::h Foam::scalar Foam::HeatTransferModel<CloudType>::h
( (

View File

@ -63,6 +63,9 @@ class HeatTransferModel
//- Reference to the owner cloud class //- Reference to the owner cloud class
CloudType& owner_; CloudType& owner_;
//- The coefficents dictionary
const dictionary coeffDict_;
public: public:
@ -89,7 +92,8 @@ public:
HeatTransferModel HeatTransferModel
( (
const dictionary& dict, const dictionary& dict,
CloudType& owner CloudType& owner,
const word& type
); );
@ -109,9 +113,12 @@ public:
// Access // Access
//- Return the dictionary //- Return the cloud dictionary
const dictionary& dict() const; const dictionary& dict() const;
//- Return the coefficients dictionary
const dictionary& coeffDict() const;
//- Return the owner cloud object //- Return the owner cloud object
const CloudType& owner() const; const CloudType& owner() const;

View File

@ -35,7 +35,7 @@ Foam::NoHeatTransfer<CloudType>::NoHeatTransfer
CloudType& cloud CloudType& cloud
) )
: :
HeatTransferModel<CloudType>(dict, cloud) HeatTransferModel<CloudType>(dict, cloud, typeName)
{} {}

View File

@ -72,14 +72,17 @@ public:
// Member Functions // Member Functions
//- Flag to indicate whether model activates heat transfer model
bool active() const; bool active() const;
//- Nusselt number
scalar Nu scalar Nu
( (
const scalar, const scalar,
const scalar const scalar
) const; ) const;
//- Prandtl number
scalar Pr() const; scalar Pr() const;
}; };

View File

@ -37,9 +37,8 @@ Foam::RanzMarshall<CloudType>::RanzMarshall
CloudType& cloud CloudType& cloud
) )
: :
HeatTransferModel<CloudType>(dict, cloud), HeatTransferModel<CloudType>(dict, cloud, typeName),
coeffDict_(dict.subDict(typeName + "Coeffs")), Pr_(dimensionedScalar(this->coeffDict().lookup("Pr")).value())
Pr_(dimensionedScalar(coeffDict_.lookup("Pr")).value())
{} {}

View File

@ -51,9 +51,6 @@ class RanzMarshall
// Private data // Private data
// Coefficients dictionary
dictionary coeffDict_;
// Prandtl number // Prandtl number
const scalar Pr_; const scalar Pr_;
@ -81,14 +78,17 @@ public:
// Member Functions // Member Functions
//- Flag to indicate whether model activates heat transfer model
bool active() const; bool active() const;
//- Nusselt number
scalar Nu scalar Nu
( (
const scalar Re, const scalar Re,
const scalar Pr const scalar Pr
) const; ) const;
//- Prandtl number
scalar Pr() const; scalar Pr() const;
}; };

View File

@ -60,7 +60,7 @@ integrationSchemes
ManualInjectionCoeffs ManualInjectionCoeffs
{ {
injectionTime 0; SOI 0.0;
positionsFile kinematicCloud1Positions; positionsFile kinematicCloud1Positions;
U0 (0 0 0); U0 (0 0 0);
parcelPDF parcelPDF
@ -76,6 +76,46 @@ ManualInjectionCoeffs
} }
} }
ConeInjectionCoeffs
{
SOI 0.001;
duration 0.005;
position (0.25 0.25 0.05);
direction (0 -1 0);
parcelsPerSecond 10000;
volumeFlowRate Constant;
volumeFlowRateCoeffs
{
value 0.01;
}
Umag Constant;
UmagCoeffs
{
value 50.0;
}
thetaInner Constant;
thetaInnerCoeffs
{
value 0.0;
}
thetaOuter Constant;
thetaOuterCoeffs
{
value 30.0;
}
parcelPDF
{
pdfType RosinRammler;
RosinRammlerPDF
{
minValue 50.0e-06;
maxValue 100.0e-06;
d (75.0e-06);
n (0.5);
}
}
}
StandardWallInteractionCoeffs StandardWallInteractionCoeffs
{ {
e e [ 0 0 0 0 0] 1; e e [ 0 0 0 0 0] 1;

View File

@ -70,7 +70,7 @@ integrationSchemes
ManualInjectionCoeffs ManualInjectionCoeffs
{ {
injectionTime 0; SOI 0.0;
positionsFile thermoCloud1Positions; positionsFile thermoCloud1Positions;
U0 (0 0 0); U0 (0 0 0);
parcelPDF parcelPDF