mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: Migrated stochastic collision models from spray to kinematic clouds, refactored and added models
This commit is contained in:
@ -25,7 +25,7 @@ $(KINEMATICCOLLIDINGPARCEL)/makeBasicKinematicCollidingParcelSubmodels.C
|
|||||||
|
|
||||||
|
|
||||||
/* thermo parcel sub-models */
|
/* thermo parcel sub-models */
|
||||||
THERMOPARCEL=$(DERIVEDPARCELS)/fluidThermoParcel
|
THERMOPARCEL=$(DERIVEDPARCELS)/basicThermoParcel
|
||||||
$(THERMOPARCEL)/defineBasicThermoParcel.C
|
$(THERMOPARCEL)/defineBasicThermoParcel.C
|
||||||
$(THERMOPARCEL)/makeBasicThermoParcelSubmodels.C
|
$(THERMOPARCEL)/makeBasicThermoParcelSubmodels.C
|
||||||
|
|
||||||
|
|||||||
@ -31,6 +31,7 @@ License
|
|||||||
#include "InjectionModelList.H"
|
#include "InjectionModelList.H"
|
||||||
#include "DispersionModel.H"
|
#include "DispersionModel.H"
|
||||||
#include "PatchInteractionModel.H"
|
#include "PatchInteractionModel.H"
|
||||||
|
#include "StochasticCollisionModel.H"
|
||||||
#include "SurfaceFilmModel.H"
|
#include "SurfaceFilmModel.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * //
|
// * * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * //
|
||||||
@ -56,6 +57,15 @@ void Foam::KinematicCloud<CloudType>::setModels()
|
|||||||
).ptr()
|
).ptr()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
stochasticCollisionModel_.reset
|
||||||
|
(
|
||||||
|
StochasticCollisionModel<KinematicCloud<CloudType> >::New
|
||||||
|
(
|
||||||
|
subModelProperties_,
|
||||||
|
*this
|
||||||
|
).ptr()
|
||||||
|
);
|
||||||
|
|
||||||
surfaceFilmModel_.reset
|
surfaceFilmModel_.reset
|
||||||
(
|
(
|
||||||
SurfaceFilmModel<KinematicCloud<CloudType> >::New
|
SurfaceFilmModel<KinematicCloud<CloudType> >::New
|
||||||
@ -181,7 +191,6 @@ void Foam::KinematicCloud<CloudType>::evolveCloud(TrackData& td)
|
|||||||
if (preInjectionSize != this->size())
|
if (preInjectionSize != this->size())
|
||||||
{
|
{
|
||||||
updateCellOccupancy();
|
updateCellOccupancy();
|
||||||
|
|
||||||
preInjectionSize = this->size();
|
preInjectionSize = this->size();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -191,6 +200,8 @@ void Foam::KinematicCloud<CloudType>::evolveCloud(TrackData& td)
|
|||||||
// Assume that motion will update the cellOccupancy as necessary
|
// Assume that motion will update the cellOccupancy as necessary
|
||||||
// before it is required.
|
// before it is required.
|
||||||
td.cloud().motion(td);
|
td.cloud().motion(td);
|
||||||
|
|
||||||
|
stochasticCollision().update(solution_.trackTime());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -249,6 +260,7 @@ void Foam::KinematicCloud<CloudType>::cloudReset(KinematicCloud<CloudType>& c)
|
|||||||
|
|
||||||
dispersionModel_.reset(c.dispersionModel_.ptr());
|
dispersionModel_.reset(c.dispersionModel_.ptr());
|
||||||
patchInteractionModel_.reset(c.patchInteractionModel_.ptr());
|
patchInteractionModel_.reset(c.patchInteractionModel_.ptr());
|
||||||
|
stochasticCollisionModel_.reset(c.stochasticCollisionModel_.ptr());
|
||||||
surfaceFilmModel_.reset(c.surfaceFilmModel_.ptr());
|
surfaceFilmModel_.reset(c.surfaceFilmModel_.ptr());
|
||||||
|
|
||||||
UIntegrator_.reset(c.UIntegrator_.ptr());
|
UIntegrator_.reset(c.UIntegrator_.ptr());
|
||||||
@ -338,6 +350,7 @@ Foam::KinematicCloud<CloudType>::KinematicCloud
|
|||||||
),
|
),
|
||||||
dispersionModel_(NULL),
|
dispersionModel_(NULL),
|
||||||
patchInteractionModel_(NULL),
|
patchInteractionModel_(NULL),
|
||||||
|
stochasticCollisionModel_(NULL),
|
||||||
surfaceFilmModel_(NULL),
|
surfaceFilmModel_(NULL),
|
||||||
UIntegrator_(NULL),
|
UIntegrator_(NULL),
|
||||||
UTrans_
|
UTrans_
|
||||||
@ -418,6 +431,7 @@ Foam::KinematicCloud<CloudType>::KinematicCloud
|
|||||||
injectors_(c.injectors_),
|
injectors_(c.injectors_),
|
||||||
dispersionModel_(c.dispersionModel_->clone()),
|
dispersionModel_(c.dispersionModel_->clone()),
|
||||||
patchInteractionModel_(c.patchInteractionModel_->clone()),
|
patchInteractionModel_(c.patchInteractionModel_->clone()),
|
||||||
|
stochasticCollisionModel_(c.stochasticCollisionModel_->clone()),
|
||||||
surfaceFilmModel_(c.surfaceFilmModel_->clone()),
|
surfaceFilmModel_(c.surfaceFilmModel_->clone()),
|
||||||
UIntegrator_(c.UIntegrator_->clone()),
|
UIntegrator_(c.UIntegrator_->clone()),
|
||||||
UTrans_
|
UTrans_
|
||||||
@ -507,6 +521,7 @@ Foam::KinematicCloud<CloudType>::KinematicCloud
|
|||||||
injectors_(*this),
|
injectors_(*this),
|
||||||
dispersionModel_(NULL),
|
dispersionModel_(NULL),
|
||||||
patchInteractionModel_(NULL),
|
patchInteractionModel_(NULL),
|
||||||
|
stochasticCollisionModel_(NULL),
|
||||||
surfaceFilmModel_(NULL),
|
surfaceFilmModel_(NULL),
|
||||||
UIntegrator_(NULL),
|
UIntegrator_(NULL),
|
||||||
UTrans_(NULL),
|
UTrans_(NULL),
|
||||||
|
|||||||
@ -39,6 +39,7 @@ Description
|
|||||||
- dispersion model
|
- dispersion model
|
||||||
- injection model
|
- injection model
|
||||||
- patch interaction model
|
- patch interaction model
|
||||||
|
- stochastic collision model
|
||||||
- surface film model
|
- surface film model
|
||||||
|
|
||||||
SourceFiles
|
SourceFiles
|
||||||
@ -84,6 +85,9 @@ class PatchInteractionModel;
|
|||||||
template<class CloudType>
|
template<class CloudType>
|
||||||
class SurfaceFilmModel;
|
class SurfaceFilmModel;
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
class StochasticCollisionModel;
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
/*---------------------------------------------------------------------------*\
|
||||||
Class KinematicCloud Declaration
|
Class KinematicCloud Declaration
|
||||||
@ -203,6 +207,10 @@ protected:
|
|||||||
autoPtr<PatchInteractionModel<KinematicCloud<CloudType> > >
|
autoPtr<PatchInteractionModel<KinematicCloud<CloudType> > >
|
||||||
patchInteractionModel_;
|
patchInteractionModel_;
|
||||||
|
|
||||||
|
//- Stochastic collision model
|
||||||
|
autoPtr<StochasticCollisionModel<KinematicCloud<CloudType> > >
|
||||||
|
stochasticCollisionModel_;
|
||||||
|
|
||||||
//- Surface film model
|
//- Surface film model
|
||||||
autoPtr<SurfaceFilmModel<KinematicCloud<CloudType> > >
|
autoPtr<SurfaceFilmModel<KinematicCloud<CloudType> > >
|
||||||
surfaceFilmModel_;
|
surfaceFilmModel_;
|
||||||
@ -416,6 +424,15 @@ public:
|
|||||||
inline PatchInteractionModel<KinematicCloud<CloudType> >&
|
inline PatchInteractionModel<KinematicCloud<CloudType> >&
|
||||||
patchInteraction();
|
patchInteraction();
|
||||||
|
|
||||||
|
//- Return const-access to the stochastic collision model
|
||||||
|
inline const
|
||||||
|
StochasticCollisionModel<KinematicCloud<CloudType> >&
|
||||||
|
stochasticCollision() const;
|
||||||
|
|
||||||
|
//- Return reference to the stochastic collision model
|
||||||
|
inline StochasticCollisionModel<KinematicCloud<CloudType> >&
|
||||||
|
stochasticCollision();
|
||||||
|
|
||||||
//- Return const-access to the surface film model
|
//- Return const-access to the surface film model
|
||||||
inline const SurfaceFilmModel<KinematicCloud<CloudType> >&
|
inline const SurfaceFilmModel<KinematicCloud<CloudType> >&
|
||||||
surfaceFilm() const;
|
surfaceFilm() const;
|
||||||
@ -482,6 +499,9 @@ public:
|
|||||||
|
|
||||||
// Fields
|
// Fields
|
||||||
|
|
||||||
|
//- Volume swept rate of parcels per cell
|
||||||
|
inline const tmp<volScalarField> vDotSweep() const;
|
||||||
|
|
||||||
//- Return the particle volume fraction field
|
//- Return the particle volume fraction field
|
||||||
// Note: for particles belonging to this cloud only
|
// Note: for particles belonging to this cloud only
|
||||||
inline const tmp<volScalarField> theta() const;
|
inline const tmp<volScalarField> theta() const;
|
||||||
|
|||||||
@ -204,6 +204,22 @@ Foam::KinematicCloud<CloudType>::patchInteraction()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
inline const Foam::StochasticCollisionModel<Foam::KinematicCloud<CloudType> >&
|
||||||
|
Foam::KinematicCloud<CloudType>::stochasticCollision() const
|
||||||
|
{
|
||||||
|
return stochasticCollisionModel_();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
inline Foam::StochasticCollisionModel<Foam::KinematicCloud<CloudType> >&
|
||||||
|
Foam::KinematicCloud<CloudType>::stochasticCollision()
|
||||||
|
{
|
||||||
|
return stochasticCollisionModel_();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template<class CloudType>
|
template<class CloudType>
|
||||||
inline const Foam::SurfaceFilmModel<Foam::KinematicCloud<CloudType> >&
|
inline const Foam::SurfaceFilmModel<Foam::KinematicCloud<CloudType> >&
|
||||||
Foam::KinematicCloud<CloudType>::surfaceFilm() const
|
Foam::KinematicCloud<CloudType>::surfaceFilm() const
|
||||||
@ -571,6 +587,45 @@ Foam::KinematicCloud<CloudType>::SU(volVectorField& U) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
inline const Foam::tmp<Foam::volScalarField>
|
||||||
|
Foam::KinematicCloud<CloudType>::vDotSweep() const
|
||||||
|
{
|
||||||
|
tmp<volScalarField> tvDotSweep
|
||||||
|
(
|
||||||
|
new volScalarField
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
this->name() + ":vDotSweep",
|
||||||
|
this->db().time().timeName(),
|
||||||
|
this->db(),
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE,
|
||||||
|
false
|
||||||
|
),
|
||||||
|
mesh_,
|
||||||
|
dimensionedScalar("zero", dimless/dimTime, 0.0),
|
||||||
|
zeroGradientFvPatchScalarField::typeName
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
volScalarField& vDotSweep = tvDotSweep();
|
||||||
|
forAllConstIter(typename KinematicCloud<CloudType>, *this, iter)
|
||||||
|
{
|
||||||
|
const parcelType& p = iter();
|
||||||
|
const label cellI = p.cell();
|
||||||
|
|
||||||
|
vDotSweep[cellI] += p.nParticle()*p.areaP()*mag(p.U() - U_[cellI]);
|
||||||
|
}
|
||||||
|
|
||||||
|
vDotSweep.internalField() /= mesh_.V();
|
||||||
|
vDotSweep.correctBoundaryConditions();
|
||||||
|
|
||||||
|
return vDotSweep;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template<class CloudType>
|
template<class CloudType>
|
||||||
inline const Foam::tmp<Foam::volScalarField>
|
inline const Foam::tmp<Foam::volScalarField>
|
||||||
Foam::KinematicCloud<CloudType>::theta() const
|
Foam::KinematicCloud<CloudType>::theta() const
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation
|
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
@ -100,6 +100,9 @@ public:
|
|||||||
|
|
||||||
// Fields
|
// Fields
|
||||||
|
|
||||||
|
//- Volume swept rate of parcels per cell
|
||||||
|
virtual const tmp<volScalarField> vDotSweep() const = 0;
|
||||||
|
|
||||||
//- Return the particle volume fraction field
|
//- Return the particle volume fraction field
|
||||||
// Note: for particles belonging to this cloud only
|
// Note: for particles belonging to this cloud only
|
||||||
virtual const tmp<volScalarField> theta() const = 0;
|
virtual const tmp<volScalarField> theta() const = 0;
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation
|
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
@ -520,8 +520,7 @@ public:
|
|||||||
|
|
||||||
// Helper functions
|
// Helper functions
|
||||||
|
|
||||||
//- Return the index of the face to be used in the interpolation
|
//- Return the index of the face used in the interpolation routine
|
||||||
// routine
|
|
||||||
inline label faceInterpolation() const;
|
inline label faceInterpolation() const;
|
||||||
|
|
||||||
//- Cell owner mass
|
//- Cell owner mass
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
|
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
@ -33,6 +33,7 @@ License
|
|||||||
#include "makeParcelInjectionModels.H"
|
#include "makeParcelInjectionModels.H"
|
||||||
#include "makeParcelCollisionModels.H"
|
#include "makeParcelCollisionModels.H"
|
||||||
#include "makeParcelPatchInteractionModels.H"
|
#include "makeParcelPatchInteractionModels.H"
|
||||||
|
#include "makeParcelStochasticCollisionModels.H"
|
||||||
#include "makeParcelSurfaceFilmModels.H"
|
#include "makeParcelSurfaceFilmModels.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
@ -47,6 +48,7 @@ namespace Foam
|
|||||||
makeParcelInjectionModels(basicKinematicCollidingCloud);
|
makeParcelInjectionModels(basicKinematicCollidingCloud);
|
||||||
makeParcelCollisionModels(basicKinematicCollidingCloud);
|
makeParcelCollisionModels(basicKinematicCollidingCloud);
|
||||||
makeParcelPatchInteractionModels(basicKinematicCollidingCloud);
|
makeParcelPatchInteractionModels(basicKinematicCollidingCloud);
|
||||||
|
makeParcelStochasticCollisionModels(basicKinematicCollidingCloud);
|
||||||
makeParcelSurfaceFilmModels(basicKinematicCollidingCloud);
|
makeParcelSurfaceFilmModels(basicKinematicCollidingCloud);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
|
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
@ -32,6 +32,7 @@ License
|
|||||||
#include "makeParcelDispersionModels.H"
|
#include "makeParcelDispersionModels.H"
|
||||||
#include "makeParcelInjectionModels.H"
|
#include "makeParcelInjectionModels.H"
|
||||||
#include "makeParcelPatchInteractionModels.H"
|
#include "makeParcelPatchInteractionModels.H"
|
||||||
|
#include "makeParcelStochasticCollisionModels.H"
|
||||||
#include "makeParcelSurfaceFilmModels.H"
|
#include "makeParcelSurfaceFilmModels.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
@ -45,6 +46,7 @@ namespace Foam
|
|||||||
makeParcelDispersionModels(basicKinematicCloud);
|
makeParcelDispersionModels(basicKinematicCloud);
|
||||||
makeParcelInjectionModels(basicKinematicCloud);
|
makeParcelInjectionModels(basicKinematicCloud);
|
||||||
makeParcelPatchInteractionModels(basicKinematicCloud);
|
makeParcelPatchInteractionModels(basicKinematicCloud);
|
||||||
|
makeParcelStochasticCollisionModels(basicKinematicCloud);
|
||||||
makeParcelSurfaceFilmModels(basicKinematicCloud);
|
makeParcelSurfaceFilmModels(basicKinematicCloud);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,45 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 OpenFOAM Foundation
|
||||||
|
\\/ 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/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef makeParcelStochasticCollisionModels_H
|
||||||
|
#define makeParcelStochasticCollisionModels_H
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#include "NoStochasticCollision.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#define makeParcelStochasticCollisionModels(CloudType) \
|
||||||
|
\
|
||||||
|
makeStochasticCollisionModel(CloudType); \
|
||||||
|
makeStochasticCollisionModelType(NoStochasticCollision, CloudType);
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,47 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 OpenFOAM Foundation
|
||||||
|
\\/ 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/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef makeReactingMultiphaseParcelStochasticCollisionModels_H
|
||||||
|
#define makeReactingMultiphaseParcelStochasticCollisionModels_H
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#include "NoStochasticCollision.H"
|
||||||
|
#include "SuppressionCollision.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#define makeReactingMultiphaseParcelStochasticCollisionModels(CloudType) \
|
||||||
|
\
|
||||||
|
makeStochasticCollisionModel(CloudType); \
|
||||||
|
makeStochasticCollisionModelType(NoStochasticCollision, CloudType); \
|
||||||
|
makeStochasticCollisionModelType(SuppressionCollision, CloudType);
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
|
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
@ -25,6 +25,15 @@ License
|
|||||||
|
|
||||||
#include "NoStochasticCollision.H"
|
#include "NoStochasticCollision.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
void Foam::NoStochasticCollision<CloudType>::collide(const scalar)
|
||||||
|
{
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
template<class CloudType>
|
template<class CloudType>
|
||||||
@ -64,37 +73,4 @@ bool Foam::NoStochasticCollision<CloudType>::active() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
template<class CloudType>
|
|
||||||
bool Foam::NoStochasticCollision<CloudType>::update
|
|
||||||
(
|
|
||||||
const scalar dt,
|
|
||||||
cachedRandom& rndGen,
|
|
||||||
vector& pos1,
|
|
||||||
scalar& m1,
|
|
||||||
scalar& d1,
|
|
||||||
scalar& N1,
|
|
||||||
vector& U,
|
|
||||||
scalar& rho1,
|
|
||||||
scalar& T1,
|
|
||||||
scalarField& Y1,
|
|
||||||
const scalar sigma1,
|
|
||||||
const label celli,
|
|
||||||
const scalar voli,
|
|
||||||
vector& pos2,
|
|
||||||
scalar& m2,
|
|
||||||
scalar& d2,
|
|
||||||
scalar& N2,
|
|
||||||
vector& U2,
|
|
||||||
scalar& rho2,
|
|
||||||
scalar& T2,
|
|
||||||
scalarField& Y2,
|
|
||||||
const scalar sigma2,
|
|
||||||
const label cellj,
|
|
||||||
const scalar volj
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
|
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
@ -39,7 +39,7 @@ Description
|
|||||||
namespace Foam
|
namespace Foam
|
||||||
{
|
{
|
||||||
/*---------------------------------------------------------------------------*\
|
/*---------------------------------------------------------------------------*\
|
||||||
Class NoStochasticCollision Declaration
|
Class NoStochasticCollision Declaration
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
template<class CloudType>
|
template<class CloudType>
|
||||||
@ -47,6 +47,14 @@ class NoStochasticCollision
|
|||||||
:
|
:
|
||||||
public StochasticCollisionModel<CloudType>
|
public StochasticCollisionModel<CloudType>
|
||||||
{
|
{
|
||||||
|
protected:
|
||||||
|
|
||||||
|
// Protected Member Functions
|
||||||
|
|
||||||
|
//- Update the model
|
||||||
|
virtual void collide(const scalar dt);
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
//- Runtime type information
|
//- Runtime type information
|
||||||
@ -79,34 +87,6 @@ public:
|
|||||||
|
|
||||||
//- Flag to indicate whether model activates collision model
|
//- Flag to indicate whether model activates collision model
|
||||||
virtual bool active() const;
|
virtual bool active() const;
|
||||||
|
|
||||||
virtual bool update
|
|
||||||
(
|
|
||||||
const scalar dt,
|
|
||||||
cachedRandom& rndGen,
|
|
||||||
vector& pos1,
|
|
||||||
scalar& m1,
|
|
||||||
scalar& d1,
|
|
||||||
scalar& N1,
|
|
||||||
vector& U,
|
|
||||||
scalar& rho1,
|
|
||||||
scalar& T1,
|
|
||||||
scalarField& Y1,
|
|
||||||
const scalar sigma1,
|
|
||||||
const label celli,
|
|
||||||
const scalar voli,
|
|
||||||
vector& pos2,
|
|
||||||
scalar& m2,
|
|
||||||
scalar& d2,
|
|
||||||
scalar& N2,
|
|
||||||
vector& U2,
|
|
||||||
scalar& rho2,
|
|
||||||
scalar& T2,
|
|
||||||
scalarField& Y2,
|
|
||||||
const scalar sigma2,
|
|
||||||
const label cellj,
|
|
||||||
const scalar volj
|
|
||||||
) const;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
|
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
@ -25,6 +25,18 @@ License
|
|||||||
|
|
||||||
#include "StochasticCollisionModel.H"
|
#include "StochasticCollisionModel.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
void Foam::StochasticCollisionModel<CloudType>::collide(const scalar dt)
|
||||||
|
{
|
||||||
|
notImplemented
|
||||||
|
(
|
||||||
|
"void Foam::NoStochasticCollision<CloudType>::collide(const scalar)"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
template<class CloudType>
|
template<class CloudType>
|
||||||
@ -69,66 +81,12 @@ Foam::StochasticCollisionModel<CloudType>::~StochasticCollisionModel()
|
|||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
template<class CloudType>
|
template<class CloudType>
|
||||||
bool Foam::StochasticCollisionModel<CloudType>::update
|
void Foam::StochasticCollisionModel<CloudType>::update(const scalar dt)
|
||||||
(
|
|
||||||
const scalar dt,
|
|
||||||
cachedRandom& rndGen,
|
|
||||||
vector& pos1,
|
|
||||||
scalar& m1,
|
|
||||||
scalar& d1,
|
|
||||||
scalar& N1,
|
|
||||||
vector& U1,
|
|
||||||
scalar& rho1,
|
|
||||||
scalar& T1,
|
|
||||||
scalarField& Y1,
|
|
||||||
const scalar sigma1,
|
|
||||||
const label celli,
|
|
||||||
const scalar voli,
|
|
||||||
vector& pos2,
|
|
||||||
scalar& m2,
|
|
||||||
scalar& d2,
|
|
||||||
scalar& N2,
|
|
||||||
vector& U2,
|
|
||||||
scalar& rho2,
|
|
||||||
scalar& T2,
|
|
||||||
scalarField& Y2,
|
|
||||||
const scalar sigma2,
|
|
||||||
const label cellj,
|
|
||||||
const scalar volj
|
|
||||||
) const
|
|
||||||
{
|
{
|
||||||
notImplemented
|
if (this->active())
|
||||||
(
|
{
|
||||||
"bool Foam::StochasticCollisionModel<CloudType>::update"
|
this->collide(dt);
|
||||||
"("
|
}
|
||||||
"const scalar, "
|
|
||||||
"cachedRandom&, "
|
|
||||||
"vector&, "
|
|
||||||
"scalar&, "
|
|
||||||
"scalar&, "
|
|
||||||
"scalar&, "
|
|
||||||
"vector&, "
|
|
||||||
"scalar&, "
|
|
||||||
"scalar&, "
|
|
||||||
"scalarField&, "
|
|
||||||
"const scalar, "
|
|
||||||
"const label, "
|
|
||||||
"const scalar, "
|
|
||||||
"vector&, "
|
|
||||||
"scalar&, "
|
|
||||||
"scalar&, "
|
|
||||||
"scalar&, "
|
|
||||||
"vector&, "
|
|
||||||
"scalar&, "
|
|
||||||
"scalar&, "
|
|
||||||
"scalarField&, "
|
|
||||||
"const scalar, "
|
|
||||||
"const label, "
|
|
||||||
"const scalar"
|
|
||||||
") const"
|
|
||||||
);
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -137,4 +95,3 @@ bool Foam::StochasticCollisionModel<CloudType>::update
|
|||||||
#include "StochasticCollisionModelNew.C"
|
#include "StochasticCollisionModelNew.C"
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|
||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
|
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
@ -55,6 +55,12 @@ class StochasticCollisionModel
|
|||||||
:
|
:
|
||||||
public SubModelBase<CloudType>
|
public SubModelBase<CloudType>
|
||||||
{
|
{
|
||||||
|
protected:
|
||||||
|
|
||||||
|
//- Main collision routine
|
||||||
|
virtual void collide(const scalar dt);
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
//- Runtime type information
|
//- Runtime type information
|
||||||
@ -114,33 +120,8 @@ public:
|
|||||||
|
|
||||||
// Member Functions
|
// Member Functions
|
||||||
|
|
||||||
virtual bool update
|
//- Update the model
|
||||||
(
|
void update(const scalar dt);
|
||||||
const scalar dt,
|
|
||||||
cachedRandom& rndGen,
|
|
||||||
vector& pos1,
|
|
||||||
scalar& m1,
|
|
||||||
scalar& d1,
|
|
||||||
scalar& N1,
|
|
||||||
vector& U1,
|
|
||||||
scalar& rho1,
|
|
||||||
scalar& T1,
|
|
||||||
scalarField& Y1,
|
|
||||||
const scalar sigma1,
|
|
||||||
const label celli,
|
|
||||||
const scalar voli,
|
|
||||||
vector& pos2,
|
|
||||||
scalar& m2,
|
|
||||||
scalar& d2,
|
|
||||||
scalar& N2,
|
|
||||||
vector& U2,
|
|
||||||
scalar& rho2,
|
|
||||||
scalar& T2,
|
|
||||||
scalarField& Y2,
|
|
||||||
const scalar sigma2,
|
|
||||||
const label cellj,
|
|
||||||
const scalar volj
|
|
||||||
) const;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -152,27 +133,27 @@ public:
|
|||||||
|
|
||||||
#define makeStochasticCollisionModel(CloudType) \
|
#define makeStochasticCollisionModel(CloudType) \
|
||||||
\
|
\
|
||||||
typedef CloudType::sprayCloudType sprayCloudType; \
|
typedef CloudType::kinematicCloudType kinematicCloudType; \
|
||||||
defineNamedTemplateTypeNameAndDebug \
|
defineNamedTemplateTypeNameAndDebug \
|
||||||
( \
|
( \
|
||||||
StochasticCollisionModel<sprayCloudType>, \
|
StochasticCollisionModel<kinematicCloudType>, \
|
||||||
0 \
|
0 \
|
||||||
); \
|
); \
|
||||||
defineTemplateRunTimeSelectionTable \
|
defineTemplateRunTimeSelectionTable \
|
||||||
( \
|
( \
|
||||||
StochasticCollisionModel<sprayCloudType>, \
|
StochasticCollisionModel<kinematicCloudType>, \
|
||||||
dictionary \
|
dictionary \
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
#define makeStochasticCollisionModelType(SS, CloudType) \
|
#define makeStochasticCollisionModelType(SS, CloudType) \
|
||||||
\
|
\
|
||||||
typedef CloudType::sprayCloudType sprayCloudType; \
|
typedef CloudType::kinematicCloudType kinematicCloudType; \
|
||||||
defineNamedTemplateTypeNameAndDebug(SS<sprayCloudType>, 0); \
|
defineNamedTemplateTypeNameAndDebug(SS<kinematicCloudType>, 0); \
|
||||||
\
|
\
|
||||||
StochasticCollisionModel<sprayCloudType>:: \
|
StochasticCollisionModel<kinematicCloudType>:: \
|
||||||
adddictionaryConstructorToTable<SS<sprayCloudType> > \
|
adddictionaryConstructorToTable<SS<kinematicCloudType> > \
|
||||||
add##SS##CloudType##sprayCloudType##ConstructorToTable_;
|
add##SS##CloudType##kinematicCloudType##ConstructorToTable_;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
|
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
@ -37,7 +37,7 @@ Foam::StochasticCollisionModel<CloudType>::New
|
|||||||
{
|
{
|
||||||
word modelType(dict.lookup("stochasticCollisionModel"));
|
word modelType(dict.lookup("stochasticCollisionModel"));
|
||||||
|
|
||||||
Info<< "Selecting StochasticCollisionModel " << modelType << endl;
|
Info<< "Selecting stochastic collision model " << modelType << endl;
|
||||||
|
|
||||||
typename dictionaryConstructorTable::iterator cstrIter =
|
typename dictionaryConstructorTable::iterator cstrIter =
|
||||||
dictionaryConstructorTablePtr_->find(modelType);
|
dictionaryConstructorTablePtr_->find(modelType);
|
||||||
@ -51,9 +51,9 @@ Foam::StochasticCollisionModel<CloudType>::New
|
|||||||
"const dictionary&, "
|
"const dictionary&, "
|
||||||
"CloudType&"
|
"CloudType&"
|
||||||
")"
|
")"
|
||||||
) << "Unknown StochasticCollisionModelType type "
|
) << "Unknown model type type "
|
||||||
<< modelType << ", constructor not in hash table" << nl << nl
|
<< modelType << ", constructor not in hash table" << nl << nl
|
||||||
<< " Valid StochasticCollisionModel types are:" << nl
|
<< " Valid model types are:" << nl
|
||||||
<< dictionaryConstructorTablePtr_->sortedToc() << exit(FatalError);
|
<< dictionaryConstructorTablePtr_->sortedToc() << exit(FatalError);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -0,0 +1,91 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 OpenFOAM Foundation
|
||||||
|
\\/ 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 "SuppressionCollision.H"
|
||||||
|
#include "kinematicCloud.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
void Foam::SuppressionCollision<CloudType>::collide(const scalar dt)
|
||||||
|
{
|
||||||
|
const kinematicCloud& sc =
|
||||||
|
this->owner().mesh().template
|
||||||
|
lookupObject<kinematicCloud>(suppressionCloud_);
|
||||||
|
|
||||||
|
volScalarField vDotSweep(sc.vDotSweep());
|
||||||
|
volScalarField P(type() + ":p", 1.0 - exp(-vDotSweep*dt));
|
||||||
|
|
||||||
|
forAllIter(typename CloudType, this->owner(), iter)
|
||||||
|
{
|
||||||
|
typename CloudType::parcelType& p = iter();
|
||||||
|
label cellI = p.cell();
|
||||||
|
|
||||||
|
scalar xx = this->owner().rndGen().template sample01<scalar>();
|
||||||
|
|
||||||
|
if (xx < P[cellI])
|
||||||
|
{
|
||||||
|
p.canCombust() = -1;
|
||||||
|
p.typeId() = max(p.typeId(), suppressedParcelType_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
Foam::SuppressionCollision<CloudType>::SuppressionCollision
|
||||||
|
(
|
||||||
|
const dictionary& dict,
|
||||||
|
CloudType& owner
|
||||||
|
)
|
||||||
|
:
|
||||||
|
StochasticCollisionModel<CloudType>(owner),
|
||||||
|
suppressionCloud_(dict.lookup("suppressionCloud")),
|
||||||
|
suppressedParcelType_(dict.lookupOrDefault("suppressedParcelType", -1))
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
Foam::SuppressionCollision<CloudType>::SuppressionCollision
|
||||||
|
(
|
||||||
|
const SuppressionCollision<CloudType>& cm
|
||||||
|
)
|
||||||
|
:
|
||||||
|
StochasticCollisionModel<CloudType>(cm),
|
||||||
|
suppressionCloud_(cm.suppressionCloud_),
|
||||||
|
suppressedParcelType_(cm.suppressedParcelType_)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
Foam::SuppressionCollision<CloudType>::~SuppressionCollision()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,111 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 OpenFOAM Foundation
|
||||||
|
\\/ 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::SuppressionCollision
|
||||||
|
|
||||||
|
Description
|
||||||
|
Inter-cloud collision model, whereby the \c canReact flag can be used
|
||||||
|
to inhibit devolatilisation and surface reactions
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef SuppressionCollision_H
|
||||||
|
#define SuppressionCollision_H
|
||||||
|
|
||||||
|
#include "StochasticCollisionModel.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class SuppressionCollision Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
class SuppressionCollision
|
||||||
|
:
|
||||||
|
public StochasticCollisionModel<CloudType>
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
|
||||||
|
// Protected data
|
||||||
|
|
||||||
|
//- Name of cloud used for suppression
|
||||||
|
const word suppressionCloud_;
|
||||||
|
|
||||||
|
//- Suppressed parcel type - optional
|
||||||
|
const label suppressedParcelType_;
|
||||||
|
|
||||||
|
|
||||||
|
// Protected Member Functions
|
||||||
|
|
||||||
|
//- Update the model
|
||||||
|
virtual void collide(const scalar dt);
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeName("suppressionCollision");
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct from dictionary
|
||||||
|
SuppressionCollision(const dictionary& dict, CloudType& owner);
|
||||||
|
|
||||||
|
//- Construct copy
|
||||||
|
SuppressionCollision(const SuppressionCollision<CloudType>& cm);
|
||||||
|
|
||||||
|
//- Construct and return a clone
|
||||||
|
virtual autoPtr<StochasticCollisionModel<CloudType> > clone() const
|
||||||
|
{
|
||||||
|
return autoPtr<StochasticCollisionModel<CloudType> >
|
||||||
|
(
|
||||||
|
new SuppressionCollision<CloudType>(*this)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
virtual ~SuppressionCollision();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#ifdef NoRepository
|
||||||
|
# include "SuppressionCollision.C"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
|
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
@ -26,7 +26,6 @@ License
|
|||||||
#include "SprayCloud.H"
|
#include "SprayCloud.H"
|
||||||
#include "AtomizationModel.H"
|
#include "AtomizationModel.H"
|
||||||
#include "BreakupModel.H"
|
#include "BreakupModel.H"
|
||||||
#include "StochasticCollisionModel.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * //
|
// * * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * //
|
||||||
|
|
||||||
@ -50,15 +49,6 @@ void Foam::SprayCloud<CloudType>::setModels()
|
|||||||
*this
|
*this
|
||||||
).ptr()
|
).ptr()
|
||||||
);
|
);
|
||||||
|
|
||||||
stochasticCollisionModel_.reset
|
|
||||||
(
|
|
||||||
StochasticCollisionModel<SprayCloud<CloudType> >::New
|
|
||||||
(
|
|
||||||
this->subModelProperties(),
|
|
||||||
*this
|
|
||||||
).ptr()
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -72,7 +62,6 @@ void Foam::SprayCloud<CloudType>::cloudReset
|
|||||||
|
|
||||||
atomizationModel_.reset(c.atomizationModel_.ptr());
|
atomizationModel_.reset(c.atomizationModel_.ptr());
|
||||||
breakupModel_.reset(c.breakupModel_.ptr());
|
breakupModel_.reset(c.breakupModel_.ptr());
|
||||||
stochasticCollisionModel_.reset(c.stochasticCollisionModel_.ptr());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -94,8 +83,7 @@ Foam::SprayCloud<CloudType>::SprayCloud
|
|||||||
cloudCopyPtr_(NULL),
|
cloudCopyPtr_(NULL),
|
||||||
averageParcelMass_(0.0),
|
averageParcelMass_(0.0),
|
||||||
atomizationModel_(NULL),
|
atomizationModel_(NULL),
|
||||||
breakupModel_(NULL),
|
breakupModel_(NULL)
|
||||||
stochasticCollisionModel_(NULL)
|
|
||||||
{
|
{
|
||||||
if (this->solution().active())
|
if (this->solution().active())
|
||||||
{
|
{
|
||||||
@ -130,8 +118,7 @@ Foam::SprayCloud<CloudType>::SprayCloud
|
|||||||
cloudCopyPtr_(NULL),
|
cloudCopyPtr_(NULL),
|
||||||
averageParcelMass_(c.averageParcelMass_),
|
averageParcelMass_(c.averageParcelMass_),
|
||||||
atomizationModel_(c.atomizationModel_->clone()),
|
atomizationModel_(c.atomizationModel_->clone()),
|
||||||
breakupModel_(c.breakupModel_->clone()),
|
breakupModel_(c.breakupModel_->clone())
|
||||||
stochasticCollisionModel_(c.stochasticCollisionModel_->clone())
|
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
@ -148,8 +135,7 @@ Foam::SprayCloud<CloudType>::SprayCloud
|
|||||||
cloudCopyPtr_(NULL),
|
cloudCopyPtr_(NULL),
|
||||||
averageParcelMass_(0.0),
|
averageParcelMass_(0.0),
|
||||||
atomizationModel_(NULL),
|
atomizationModel_(NULL),
|
||||||
breakupModel_(NULL),
|
breakupModel_(NULL)
|
||||||
stochasticCollisionModel_(NULL)
|
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
@ -179,6 +165,8 @@ void Foam::SprayCloud<CloudType>::setParcelThermoProperties
|
|||||||
// override rho and Cp from constantProperties
|
// override rho and Cp from constantProperties
|
||||||
parcel.Cp() = liqMix.Cp(parcel.pc(), parcel.T(), X);
|
parcel.Cp() = liqMix.Cp(parcel.pc(), parcel.T(), X);
|
||||||
parcel.rho() = liqMix.rho(parcel.pc(), parcel.T(), X);
|
parcel.rho() = liqMix.rho(parcel.pc(), parcel.T(), X);
|
||||||
|
parcel.sigma() = liqMix.sigma(parcel.pc(), parcel.T(), X);
|
||||||
|
parcel.mu() = liqMix.mu(parcel.pc(), parcel.T(), X);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -237,128 +225,6 @@ void Foam::SprayCloud<CloudType>::evolve()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
template<class CloudType>
|
|
||||||
template<class TrackData>
|
|
||||||
void Foam::SprayCloud<CloudType>::motion(TrackData& td)
|
|
||||||
{
|
|
||||||
const scalar dt = this->solution().trackTime();
|
|
||||||
|
|
||||||
td.part() = TrackData::tpLinearTrack;
|
|
||||||
CloudType::move(td, dt);
|
|
||||||
|
|
||||||
this->updateCellOccupancy();
|
|
||||||
|
|
||||||
if (stochasticCollision().active())
|
|
||||||
{
|
|
||||||
const liquidMixtureProperties& liqMix = this->composition().liquids();
|
|
||||||
|
|
||||||
label i = 0;
|
|
||||||
forAllIter(typename SprayCloud<CloudType>, *this, iter)
|
|
||||||
{
|
|
||||||
label j = 0;
|
|
||||||
forAllIter(typename SprayCloud<CloudType>, *this, jter)
|
|
||||||
{
|
|
||||||
if (j > i)
|
|
||||||
{
|
|
||||||
parcelType& p = iter();
|
|
||||||
scalar Vi = this->mesh().V()[p.cell()];
|
|
||||||
scalarField X1(liqMix.X(p.Y()));
|
|
||||||
scalar sigma1 = liqMix.sigma(p.pc(), p.T(), X1);
|
|
||||||
scalar mp = p.mass()*p.nParticle();
|
|
||||||
|
|
||||||
parcelType& q = jter();
|
|
||||||
scalar Vj = this->mesh().V()[q.cell()];
|
|
||||||
scalarField X2(liqMix.X(q.Y()));
|
|
||||||
scalar sigma2 = liqMix.sigma(q.pc(), q.T(), X2);
|
|
||||||
scalar mq = q.mass()*q.nParticle();
|
|
||||||
|
|
||||||
bool updateProperties = stochasticCollision().update
|
|
||||||
(
|
|
||||||
dt,
|
|
||||||
this->rndGen(),
|
|
||||||
p.position(),
|
|
||||||
mp,
|
|
||||||
p.d(),
|
|
||||||
p.nParticle(),
|
|
||||||
p.U(),
|
|
||||||
p.rho(),
|
|
||||||
p.T(),
|
|
||||||
p.Y(),
|
|
||||||
sigma1,
|
|
||||||
p.cell(),
|
|
||||||
Vi,
|
|
||||||
q.position(),
|
|
||||||
mq,
|
|
||||||
q.d(),
|
|
||||||
q.nParticle(),
|
|
||||||
q.U(),
|
|
||||||
q.rho(),
|
|
||||||
q.T(),
|
|
||||||
q.Y(),
|
|
||||||
sigma2,
|
|
||||||
q.cell(),
|
|
||||||
Vj
|
|
||||||
);
|
|
||||||
|
|
||||||
// for coalescence we need to update the density and
|
|
||||||
// the diameter cause of the temp/conc/mass-change
|
|
||||||
if (updateProperties)
|
|
||||||
{
|
|
||||||
if (mp > VSMALL)
|
|
||||||
{
|
|
||||||
scalarField Xp(liqMix.X(p.Y()));
|
|
||||||
p.rho() = liqMix.rho(p.pc(), p.T(), Xp);
|
|
||||||
p.Cp() = liqMix.Cp(p.pc(), p.T(), Xp);
|
|
||||||
p.d() =
|
|
||||||
cbrt
|
|
||||||
(
|
|
||||||
6.0*mp
|
|
||||||
/(
|
|
||||||
p.nParticle()
|
|
||||||
*p.rho()
|
|
||||||
*constant::mathematical::pi
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mq > VSMALL)
|
|
||||||
{
|
|
||||||
scalarField Xq(liqMix.X(q.Y()));
|
|
||||||
q.rho() = liqMix.rho(q.pc(), q.T(), Xq);
|
|
||||||
q.Cp() = liqMix.Cp(q.pc(), q.T(), Xq);
|
|
||||||
q.d() =
|
|
||||||
cbrt
|
|
||||||
(
|
|
||||||
6.0*mq
|
|
||||||
/(
|
|
||||||
q.nParticle()
|
|
||||||
*q.rho()
|
|
||||||
*constant::mathematical::pi
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// remove coalesced parcels that fall below minimum mass threshold
|
|
||||||
forAllIter(typename SprayCloud<CloudType>, *this, iter)
|
|
||||||
{
|
|
||||||
parcelType& p = iter();
|
|
||||||
scalar mass = p.nParticle()*p.mass();
|
|
||||||
|
|
||||||
if (mass < td.cloud().constProps().minParticleMass())
|
|
||||||
{
|
|
||||||
this->deleteParticle(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<class CloudType>
|
template<class CloudType>
|
||||||
void Foam::SprayCloud<CloudType>::info()
|
void Foam::SprayCloud<CloudType>::info()
|
||||||
{
|
{
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
|
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
@ -27,6 +27,10 @@ Class
|
|||||||
Description
|
Description
|
||||||
Templated base class for spray cloud
|
Templated base class for spray cloud
|
||||||
|
|
||||||
|
- sub-models:
|
||||||
|
- atomization model
|
||||||
|
- break-up model
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#ifndef SprayCloud_H
|
#ifndef SprayCloud_H
|
||||||
@ -46,9 +50,6 @@ class AtomizationModel;
|
|||||||
template<class CloudType>
|
template<class CloudType>
|
||||||
class BreakupModel;
|
class BreakupModel;
|
||||||
|
|
||||||
template<class CloudType>
|
|
||||||
class StochasticCollisionModel;
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
/*---------------------------------------------------------------------------*\
|
||||||
Class SprayCloud Declaration
|
Class SprayCloud Declaration
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
@ -106,10 +107,6 @@ protected:
|
|||||||
//- Break-up model
|
//- Break-up model
|
||||||
autoPtr<BreakupModel<SprayCloud<CloudType> > > breakupModel_;
|
autoPtr<BreakupModel<SprayCloud<CloudType> > > breakupModel_;
|
||||||
|
|
||||||
//- Collision model
|
|
||||||
autoPtr<StochasticCollisionModel<SprayCloud<CloudType> > >
|
|
||||||
stochasticCollisionModel_;
|
|
||||||
|
|
||||||
|
|
||||||
// Protected Member Functions
|
// Protected Member Functions
|
||||||
|
|
||||||
@ -202,14 +199,6 @@ public:
|
|||||||
//- Return reference to the breakup model
|
//- Return reference to the breakup model
|
||||||
inline BreakupModel<SprayCloud<CloudType> >& breakup();
|
inline BreakupModel<SprayCloud<CloudType> >& breakup();
|
||||||
|
|
||||||
//- Return const-access to the breakup model
|
|
||||||
inline const StochasticCollisionModel<SprayCloud<CloudType> >&
|
|
||||||
stochasticCollision() const;
|
|
||||||
|
|
||||||
//- Return reference to the breakup model
|
|
||||||
inline StochasticCollisionModel<SprayCloud<CloudType> >&
|
|
||||||
stochasticCollision();
|
|
||||||
|
|
||||||
|
|
||||||
// Cloud evolution functions
|
// Cloud evolution functions
|
||||||
|
|
||||||
@ -236,10 +225,6 @@ public:
|
|||||||
|
|
||||||
//- Evolve the spray (inject, move)
|
//- Evolve the spray (inject, move)
|
||||||
void evolve();
|
void evolve();
|
||||||
//- Particle motion
|
|
||||||
|
|
||||||
template<class TrackData>
|
|
||||||
void motion(TrackData& td);
|
|
||||||
|
|
||||||
|
|
||||||
// I-O
|
// I-O
|
||||||
@ -249,7 +234,6 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
} // End namespace Foam
|
} // End namespace Foam
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
|
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
@ -65,22 +65,6 @@ Foam::SprayCloud<CloudType>::breakup()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
template<class CloudType>
|
|
||||||
inline const Foam::StochasticCollisionModel<Foam::SprayCloud<CloudType> >&
|
|
||||||
Foam::SprayCloud<CloudType>::stochasticCollision() const
|
|
||||||
{
|
|
||||||
return stochasticCollisionModel_;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<class CloudType>
|
|
||||||
inline Foam::StochasticCollisionModel<Foam::SprayCloud<CloudType> >&
|
|
||||||
Foam::SprayCloud<CloudType>::stochasticCollision()
|
|
||||||
{
|
|
||||||
return stochasticCollisionModel_();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<class CloudType>
|
template<class CloudType>
|
||||||
inline Foam::scalar Foam::SprayCloud<CloudType>::averageParcelMass() const
|
inline Foam::scalar Foam::SprayCloud<CloudType>::averageParcelMass() const
|
||||||
{
|
{
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
|
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
|
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
@ -32,6 +32,7 @@ License
|
|||||||
#include "makeParcelDispersionModels.H"
|
#include "makeParcelDispersionModels.H"
|
||||||
#include "makeSprayParcelInjectionModels.H" // Spray variant
|
#include "makeSprayParcelInjectionModels.H" // Spray variant
|
||||||
#include "makeParcelPatchInteractionModels.H"
|
#include "makeParcelPatchInteractionModels.H"
|
||||||
|
#include "makeSprayParcelStochasticCollisionModels.H" // Spray variant
|
||||||
|
|
||||||
// Thermodynamic
|
// Thermodynamic
|
||||||
#include "makeParcelHeatTransferModels.H"
|
#include "makeParcelHeatTransferModels.H"
|
||||||
@ -44,7 +45,6 @@ License
|
|||||||
// Spray
|
// Spray
|
||||||
#include "makeSprayParcelAtomizationModels.H"
|
#include "makeSprayParcelAtomizationModels.H"
|
||||||
#include "makeSprayParcelBreakupModels.H"
|
#include "makeSprayParcelBreakupModels.H"
|
||||||
#include "makeSprayParcelCollisionModels.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
@ -57,6 +57,7 @@ namespace Foam
|
|||||||
makeParcelDispersionModels(basicSprayCloud);
|
makeParcelDispersionModels(basicSprayCloud);
|
||||||
makeSprayParcelInjectionModels(basicSprayCloud);
|
makeSprayParcelInjectionModels(basicSprayCloud);
|
||||||
makeParcelPatchInteractionModels(basicSprayCloud);
|
makeParcelPatchInteractionModels(basicSprayCloud);
|
||||||
|
makeSprayParcelStochasticCollisionModels(basicSprayCloud);
|
||||||
|
|
||||||
// Thermo sub-models
|
// Thermo sub-models
|
||||||
makeParcelHeatTransferModels(basicSprayCloud);
|
makeParcelHeatTransferModels(basicSprayCloud);
|
||||||
@ -69,7 +70,6 @@ namespace Foam
|
|||||||
// Spray sub-models
|
// Spray sub-models
|
||||||
makeSprayParcelAtomizationModels(basicSprayCloud);
|
makeSprayParcelAtomizationModels(basicSprayCloud);
|
||||||
makeSprayParcelBreakupModels(basicSprayCloud);
|
makeSprayParcelBreakupModels(basicSprayCloud);
|
||||||
makeSprayParcelCollisionModels(basicSprayCloud);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
|
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
@ -23,8 +23,8 @@ License
|
|||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#ifndef makeSprayParcelCollisionModels_H
|
#ifndef makeSprayParcelStochasticCollisionModels_H
|
||||||
#define makeSprayParcelCollisionModels_H
|
#define makeSprayParcelStochasticCollisionModels_H
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
@ -34,7 +34,7 @@ License
|
|||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
#define makeSprayParcelCollisionModels(CloudType) \
|
#define makeSprayParcelStochasticCollisionModels(CloudType) \
|
||||||
\
|
\
|
||||||
makeStochasticCollisionModel(CloudType); \
|
makeStochasticCollisionModel(CloudType); \
|
||||||
makeStochasticCollisionModelType(NoStochasticCollision, CloudType); \
|
makeStochasticCollisionModelType(NoStochasticCollision, CloudType); \
|
||||||
@ -24,150 +24,120 @@ License
|
|||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#include "ORourkeCollision.H"
|
#include "ORourkeCollision.H"
|
||||||
|
#include "mathematicalConstants.H"
|
||||||
|
#include "SLGThermo.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
using namespace Foam::constant::mathematical;
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * //
|
||||||
|
|
||||||
template<class CloudType>
|
template<class CloudType>
|
||||||
Foam::ORourkeCollision<CloudType>::ORourkeCollision
|
void Foam::ORourkeCollision<CloudType>::collide(const scalar dt)
|
||||||
(
|
{
|
||||||
const dictionary& dict,
|
label i = 0;
|
||||||
CloudType& owner
|
forAllIter(typename CloudType, this->owner(), iter1)
|
||||||
)
|
{
|
||||||
:
|
label j = 0;
|
||||||
StochasticCollisionModel<CloudType>(dict, owner, typeName),
|
forAllIter(typename CloudType, this->owner(), iter2)
|
||||||
coalescence_(this->coeffDict().lookup("coalescence"))
|
{
|
||||||
{}
|
if (j > i)
|
||||||
|
{
|
||||||
|
parcelType& p1 = iter1();
|
||||||
|
parcelType& p2 = iter2();
|
||||||
|
|
||||||
|
scalar m1 = p1.nParticle()*p1.mass();
|
||||||
|
scalar m2 = p2.nParticle()*p2.mass();
|
||||||
|
|
||||||
|
bool massChanged = collideParcels(dt, p1, p2, m1, m2);
|
||||||
|
|
||||||
|
if (massChanged)
|
||||||
|
{
|
||||||
|
if (m1 > ROOTVSMALL)
|
||||||
|
{
|
||||||
|
const scalarField X(liquids_.X(p1.Y()));
|
||||||
|
p1.rho() = liquids_.rho(p1.pc(), p1.T(), X);
|
||||||
|
p1.Cp() = liquids_.Cp(p1.pc(), p1.T(), X);
|
||||||
|
p1.sigma() = liquids_.sigma(p1.pc(), p1.T(), X);
|
||||||
|
p1.mu() = liquids_.mu(p1.pc(), p1.T(), X);
|
||||||
|
p1.d() = cbrt(6.0*m1/(p1.nParticle()*p1.rho()*pi));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m2 > ROOTVSMALL)
|
||||||
|
{
|
||||||
|
const scalarField X(liquids_.X(p2.Y()));
|
||||||
|
p2.rho() = liquids_.rho(p2.pc(), p2.T(), X);
|
||||||
|
p2.Cp() = liquids_.Cp(p2.pc(), p2.T(), X);
|
||||||
|
p2.sigma() = liquids_.sigma(p2.pc(), p2.T(), X);
|
||||||
|
p2.mu() = liquids_.mu(p2.pc(), p2.T(), X);
|
||||||
|
p2.d() = cbrt(6.0*m2/(p2.nParticle()*p2.rho()*pi));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove coalesced parcels that fall below minimum mass threshold
|
||||||
|
forAllIter(typename CloudType, this->owner(), iter)
|
||||||
|
{
|
||||||
|
parcelType& p = iter();
|
||||||
|
scalar mass = p.nParticle()*p.mass();
|
||||||
|
|
||||||
|
if (mass < this->owner().constProps().minParticleMass())
|
||||||
|
{
|
||||||
|
this->owner().deleteParticle(p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template<class CloudType>
|
template<class CloudType>
|
||||||
Foam::ORourkeCollision<CloudType>::ORourkeCollision
|
bool Foam::ORourkeCollision<CloudType>::collideParcels
|
||||||
(
|
|
||||||
const ORourkeCollision<CloudType>& cm
|
|
||||||
)
|
|
||||||
:
|
|
||||||
StochasticCollisionModel<CloudType>(cm),
|
|
||||||
coalescence_(cm.coalescence_)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
template<class CloudType>
|
|
||||||
Foam::ORourkeCollision<CloudType>::~ORourkeCollision()
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
template<class CloudType>
|
|
||||||
bool Foam::ORourkeCollision<CloudType>::update
|
|
||||||
(
|
(
|
||||||
const scalar dt,
|
const scalar dt,
|
||||||
cachedRandom& rndGen,
|
parcelType& p1,
|
||||||
vector& pos1,
|
parcelType& p2,
|
||||||
scalar& m1,
|
scalar& m1,
|
||||||
scalar& d1,
|
scalar& m2
|
||||||
scalar& N1,
|
)
|
||||||
vector& U1,
|
|
||||||
scalar& rho1,
|
|
||||||
scalar& T1,
|
|
||||||
scalarField& Y1,
|
|
||||||
const scalar sigma1,
|
|
||||||
const label celli,
|
|
||||||
const scalar voli,
|
|
||||||
vector& pos2,
|
|
||||||
scalar& m2,
|
|
||||||
scalar& d2,
|
|
||||||
scalar& N2,
|
|
||||||
vector& U2,
|
|
||||||
scalar& rho2,
|
|
||||||
scalar& T2,
|
|
||||||
scalarField& Y2,
|
|
||||||
const scalar sigma2,
|
|
||||||
const label cellj,
|
|
||||||
const scalar volj
|
|
||||||
) const
|
|
||||||
{
|
{
|
||||||
|
const label cell1 = p1.cell();
|
||||||
|
const label cell2 = p2.cell();
|
||||||
|
|
||||||
// check if parcels belong to same cell
|
// check if parcels belong to same cell
|
||||||
if ((celli != cellj) || (m1 < VSMALL) || (m2 < VSMALL))
|
if ((cell1 != cell2) || (m1 < ROOTVSMALL) || (m2 < ROOTVSMALL))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool coalescence = false;
|
bool coalescence = false;
|
||||||
|
|
||||||
scalar magVrel = mag(U1-U2);
|
const scalar Vc = this->owner().mesh().V()[cell1];
|
||||||
|
const scalar d1 = p1.d();
|
||||||
|
const scalar d2 = p2.d();
|
||||||
|
|
||||||
|
scalar magUrel = mag(p1.U() - p2.U());
|
||||||
scalar sumD = d1 + d2;
|
scalar sumD = d1 + d2;
|
||||||
scalar nu0 = 0.25*constant::mathematical::pi*sumD*sumD*magVrel*dt/volj;
|
scalar nu0 = 0.25*constant::mathematical::pi*sqr(sumD)*magUrel*dt/Vc;
|
||||||
scalar nMin = min(N1, N2);
|
scalar nMin = min(p1.nParticle(), p2.nParticle());
|
||||||
scalar nu = nMin*nu0;
|
scalar nu = nMin*nu0;
|
||||||
scalar collProb = exp(-nu);
|
scalar collProb = exp(-nu);
|
||||||
scalar xx = rndGen.sample01<scalar>();
|
scalar xx = this->owner().rndGen().template sample01<scalar>();
|
||||||
|
|
||||||
// collision occurs
|
// collision occurs
|
||||||
if (xx > collProb)
|
if (xx > collProb)
|
||||||
{
|
{
|
||||||
if (d1 > d2)
|
if (d1 > d2)
|
||||||
{
|
{
|
||||||
coalescence = collideSorted
|
coalescence = collideSorted(dt, p1, p2, m1, m2);
|
||||||
(
|
|
||||||
dt,
|
|
||||||
rndGen,
|
|
||||||
pos1,
|
|
||||||
m1,
|
|
||||||
d1,
|
|
||||||
N1,
|
|
||||||
U1,
|
|
||||||
rho1,
|
|
||||||
T1,
|
|
||||||
Y1,
|
|
||||||
sigma1,
|
|
||||||
celli,
|
|
||||||
voli,
|
|
||||||
pos2,
|
|
||||||
m2,
|
|
||||||
d2,
|
|
||||||
N2,
|
|
||||||
U2,
|
|
||||||
rho2,
|
|
||||||
T2,
|
|
||||||
Y2,
|
|
||||||
sigma2,
|
|
||||||
cellj,
|
|
||||||
volj
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
coalescence = collideSorted
|
coalescence = collideSorted(dt, p2, p1, m2, m1);
|
||||||
(
|
|
||||||
dt,
|
|
||||||
rndGen,
|
|
||||||
pos2,
|
|
||||||
m2,
|
|
||||||
d2,
|
|
||||||
N2,
|
|
||||||
U2,
|
|
||||||
rho2,
|
|
||||||
T2,
|
|
||||||
Y2,
|
|
||||||
sigma2,
|
|
||||||
cellj,
|
|
||||||
volj,
|
|
||||||
pos1,
|
|
||||||
m1,
|
|
||||||
d1,
|
|
||||||
N1,
|
|
||||||
U1,
|
|
||||||
rho1,
|
|
||||||
T1,
|
|
||||||
Y1,
|
|
||||||
sigma1,
|
|
||||||
celli,
|
|
||||||
voli
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return coalescence;
|
return coalescence;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -176,85 +146,81 @@ template<class CloudType>
|
|||||||
bool Foam::ORourkeCollision<CloudType>::collideSorted
|
bool Foam::ORourkeCollision<CloudType>::collideSorted
|
||||||
(
|
(
|
||||||
const scalar dt,
|
const scalar dt,
|
||||||
cachedRandom& rndGen,
|
parcelType& p1,
|
||||||
vector& pos1,
|
parcelType& p2,
|
||||||
scalar& m1,
|
scalar& m1,
|
||||||
scalar& d1,
|
scalar& m2
|
||||||
scalar& N1,
|
)
|
||||||
vector& U1,
|
|
||||||
scalar& rho1,
|
|
||||||
scalar& T1,
|
|
||||||
scalarField& Y1,
|
|
||||||
const scalar sigma1,
|
|
||||||
const label celli,
|
|
||||||
const scalar voli,
|
|
||||||
vector& pos2,
|
|
||||||
scalar& m2,
|
|
||||||
scalar& d2,
|
|
||||||
scalar& N2,
|
|
||||||
vector& U2,
|
|
||||||
scalar& rho2,
|
|
||||||
scalar& T2,
|
|
||||||
scalarField& Y2,
|
|
||||||
const scalar sigma2,
|
|
||||||
const label cellj,
|
|
||||||
const scalar volj
|
|
||||||
) const
|
|
||||||
{
|
{
|
||||||
bool coalescence = false;
|
bool coalescence = false;
|
||||||
|
|
||||||
vector vRel = U1 - U2;
|
const scalar sigma1 = p1.sigma();
|
||||||
scalar magVRel = mag(vRel);
|
const scalar sigma2 = p2.sigma();
|
||||||
|
|
||||||
scalar mdMin = m2/N2;
|
const scalar d1 = p1.d();
|
||||||
|
const scalar d2 = p2.d();
|
||||||
|
|
||||||
|
const scalar T1 = p1.T();
|
||||||
|
const scalar T2 = p2.T();
|
||||||
|
|
||||||
|
const scalar rho1 = p1.rho();
|
||||||
|
const scalar rho2 = p2.rho();
|
||||||
|
|
||||||
|
const vector& U1 = p1.U();
|
||||||
|
const vector& U2 = p2.U();
|
||||||
|
|
||||||
|
const label& nP1 = p1.nParticle();
|
||||||
|
const label& nP2 = p2.nParticle();
|
||||||
|
|
||||||
|
|
||||||
|
vector URel = U1 - U2;
|
||||||
|
scalar magURel = mag(URel);
|
||||||
|
|
||||||
scalar mTot = m1 + m2;
|
scalar mTot = m1 + m2;
|
||||||
|
|
||||||
scalar gamma = d1/max(d2, 1.0e-12);
|
scalar gamma = d1/max(ROOTVSMALL, d2);
|
||||||
scalar f = gamma*gamma*gamma + 2.7*gamma - 2.4*gamma*gamma;
|
scalar f = pow3(gamma) + 2.7*gamma - 2.4*sqr(gamma);
|
||||||
|
|
||||||
vector momMax = m1*U1;
|
// mass-averaged temperature
|
||||||
vector momMin = m2*U2;
|
scalar Tave = (T1*m1 + T2*m2)/mTot;
|
||||||
|
|
||||||
// use mass-averaged temperature to calculate We number
|
// interpolate to find average surface tension
|
||||||
scalar Tm = (T1*m1 + T2*m2)/mTot;
|
scalar sigmaAve = sigma1 + (sigma2 - sigma1)*(Tave - T1)/(T2 - T1);
|
||||||
|
|
||||||
// interpolate the averaged surface tension
|
|
||||||
scalar sigma = sigma1 + (sigma2 - sigma1)*(Tm - T1)/(T2 - T1);
|
|
||||||
|
|
||||||
sigma = max(1.0e-6, sigma);
|
|
||||||
scalar Vtot = m1/rho1 + m2/rho2;
|
scalar Vtot = m1/rho1 + m2/rho2;
|
||||||
scalar rho = mTot/Vtot;
|
scalar rhoAve = mTot/Vtot;
|
||||||
|
|
||||||
scalar dMean = sqrt(d1*d2);
|
scalar dAve = sqrt(d1*d2);
|
||||||
scalar WeColl = max(1.0e-12, 0.5*rho*magVRel*magVRel*dMean/sigma);
|
scalar WeColl = 0.5*rhoAve*sqr(magURel)*dAve/max(ROOTVSMALL, sigmaAve);
|
||||||
|
|
||||||
scalar coalesceProb = min(1.0, 2.4*f/WeColl);
|
scalar coalesceProb = min(1.0, 2.4*f/max(ROOTVSMALL, WeColl));
|
||||||
|
|
||||||
scalar prob = rndGen.sample01<scalar>();
|
scalar prob = this->owner().rndGen().template sample01<scalar>();
|
||||||
|
|
||||||
// Coalescence
|
// Coalescence
|
||||||
if (prob < coalesceProb && coalescence_)
|
if (prob < coalesceProb && coalescence_)
|
||||||
{
|
{
|
||||||
coalescence = true;
|
coalescence = true;
|
||||||
// How 'many' of the droplets coalesce
|
|
||||||
scalar nProb = prob*N2/N1;
|
|
||||||
|
|
||||||
// Conservation of mass, momentum and energy
|
// number of the droplets that coalesce
|
||||||
scalar m2Org = m2;
|
scalar nProb = prob*nP2/nP1;
|
||||||
scalar dm = N1*nProb*mdMin;
|
|
||||||
m2 -= dm;
|
|
||||||
scalar V2 = constant::mathematical::pi*pow3(d2)/6.0;
|
|
||||||
N2 = m2/(rho2*V2);
|
|
||||||
|
|
||||||
|
// conservation of mass, momentum and energy
|
||||||
scalar m1Org = m1;
|
scalar m1Org = m1;
|
||||||
|
scalar m2Org = m2;
|
||||||
|
|
||||||
|
scalar dm = nP1*nProb*m2/scalar(nP2);
|
||||||
|
|
||||||
m1 += dm;
|
m1 += dm;
|
||||||
T1 = (Tm*mTot - m2*T2)/m1;
|
m2 -= dm;
|
||||||
|
|
||||||
U1 =(momMax + (1.0 - m2/m2Org)*momMin)/m1;
|
p1.T() = (Tave*mTot - m2*T2)/m1;
|
||||||
|
|
||||||
// update the liquid mass fractions
|
p1.U() = (m1*U1 + (1.0 - m2/m2Org)*m2*U2)/m1;
|
||||||
Y1 = (m1Org*Y1 + dm*Y2)/m1;
|
|
||||||
|
p1.Y() = (m1Org*p1.Y() + dm*p2.Y())/m1;
|
||||||
|
|
||||||
|
p2.nParticle() = m2/(rho2*p2.volume());
|
||||||
}
|
}
|
||||||
// Grazing collision (no coalescence)
|
// Grazing collision (no coalescence)
|
||||||
else
|
else
|
||||||
@ -271,28 +237,65 @@ bool Foam::ORourkeCollision<CloudType>::collideSorted
|
|||||||
// and these parcels should have coalesced
|
// and these parcels should have coalesced
|
||||||
gf = max(0.0, gf);
|
gf = max(0.0, gf);
|
||||||
|
|
||||||
// gf -> 1 => v1p -> p1().U() ...
|
// gf -> 1 => v1p -> U1 ...
|
||||||
// gf -> 0 => v1p -> momentum/(m1+m2)
|
// gf -> 0 => v1p -> momentum/mTot
|
||||||
|
|
||||||
vector mr = m1*U1 + m2*U2;
|
vector mr = m1*U1 + m2*U2;
|
||||||
vector v1p = (mr + m2*gf*vRel)/(m1+m2);
|
vector v1p = (mr + m2*gf*URel)/mTot;
|
||||||
vector v2p = (mr - m1*gf*vRel)/(m1+m2);
|
vector v2p = (mr - m1*gf*URel)/mTot;
|
||||||
|
|
||||||
if (N1 < N2)
|
if (nP1 < nP2)
|
||||||
{
|
{
|
||||||
U1 = v1p;
|
p1.U() = v1p;
|
||||||
U2 = (N1*v2p + (N2-N1)*U2)/N2;
|
p2.U() = (nP1*v2p + (nP2 - nP1)*U2)/nP2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
U1 = (N2*v1p + (N1-N2)*U1)/N1;
|
p1.U() = (nP2*v1p + (nP1 - nP2)*U1)/nP1;
|
||||||
U2 = v2p;
|
p2.U() = v2p;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return coalescence;
|
return coalescence;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
Foam::ORourkeCollision<CloudType>::ORourkeCollision
|
||||||
|
(
|
||||||
|
const dictionary& dict,
|
||||||
|
CloudType& owner,
|
||||||
|
const word& modelName
|
||||||
|
)
|
||||||
|
:
|
||||||
|
StochasticCollisionModel<CloudType>(dict, owner, modelName),
|
||||||
|
liquids_
|
||||||
|
(
|
||||||
|
owner.db().template lookupObject<SLGThermo>("SLGThermo").liquids()
|
||||||
|
),
|
||||||
|
coalescence_(this->coeffDict().lookup("coalescence"))
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
Foam::ORourkeCollision<CloudType>::ORourkeCollision
|
||||||
|
(
|
||||||
|
const ORourkeCollision<CloudType>& cm
|
||||||
|
)
|
||||||
|
:
|
||||||
|
StochasticCollisionModel<CloudType>(cm),
|
||||||
|
liquids_(cm.liquids_),
|
||||||
|
coalescence_(cm.coalescence_)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
Foam::ORourkeCollision<CloudType>::~ORourkeCollision()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
|
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
@ -34,13 +34,14 @@ Description
|
|||||||
#define ORourkeCollision_H
|
#define ORourkeCollision_H
|
||||||
|
|
||||||
#include "StochasticCollisionModel.H"
|
#include "StochasticCollisionModel.H"
|
||||||
|
#include "liquidMixtureProperties.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
namespace Foam
|
namespace Foam
|
||||||
{
|
{
|
||||||
/*---------------------------------------------------------------------------*\
|
/*---------------------------------------------------------------------------*\
|
||||||
Class ORourkeCollision Declaration
|
Class ORourkeCollision Declaration
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
template<class CloudType>
|
template<class CloudType>
|
||||||
@ -48,10 +49,44 @@ class ORourkeCollision
|
|||||||
:
|
:
|
||||||
public StochasticCollisionModel<CloudType>
|
public StochasticCollisionModel<CloudType>
|
||||||
{
|
{
|
||||||
private:
|
protected:
|
||||||
|
|
||||||
|
// Protected Data
|
||||||
|
|
||||||
|
//- Convenience typedef to the cloud's parcel type
|
||||||
|
typedef typename CloudType::parcelType parcelType;
|
||||||
|
|
||||||
|
const liquidMixtureProperties& liquids_;
|
||||||
|
|
||||||
|
//- Coalescence activation switch
|
||||||
|
Switch coalescence_;
|
||||||
|
|
||||||
|
|
||||||
|
// Protected Member Functions
|
||||||
|
|
||||||
|
//- Main collision routine
|
||||||
|
virtual void collide(const scalar dt);
|
||||||
|
|
||||||
|
//- Collide parcels and return true if mass has changed
|
||||||
|
virtual bool collideParcels
|
||||||
|
(
|
||||||
|
const scalar dt,
|
||||||
|
parcelType& p1,
|
||||||
|
parcelType& p2,
|
||||||
|
scalar& m1,
|
||||||
|
scalar& m2
|
||||||
|
);
|
||||||
|
|
||||||
|
// 1 is the larger drop and 2 is the smaller
|
||||||
|
virtual bool collideSorted
|
||||||
|
(
|
||||||
|
const scalar dt,
|
||||||
|
parcelType& p1,
|
||||||
|
parcelType& p2,
|
||||||
|
scalar& m1,
|
||||||
|
scalar& m2
|
||||||
|
);
|
||||||
|
|
||||||
dictionary coeffsDict_;
|
|
||||||
Switch coalescence_;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@ -62,7 +97,12 @@ public:
|
|||||||
// Constructors
|
// Constructors
|
||||||
|
|
||||||
//- Construct from dictionary
|
//- Construct from dictionary
|
||||||
ORourkeCollision(const dictionary& dict, CloudType& cloud);
|
ORourkeCollision
|
||||||
|
(
|
||||||
|
const dictionary& dict,
|
||||||
|
CloudType& cloud,
|
||||||
|
const word& modelName = typeName
|
||||||
|
);
|
||||||
|
|
||||||
//- Construct copy
|
//- Construct copy
|
||||||
ORourkeCollision(const ORourkeCollision<CloudType>& cm);
|
ORourkeCollision(const ORourkeCollision<CloudType>& cm);
|
||||||
@ -79,67 +119,6 @@ public:
|
|||||||
|
|
||||||
//- Destructor
|
//- Destructor
|
||||||
virtual ~ORourkeCollision();
|
virtual ~ORourkeCollision();
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
|
||||||
|
|
||||||
virtual bool update
|
|
||||||
(
|
|
||||||
const scalar dt,
|
|
||||||
cachedRandom& rndGen,
|
|
||||||
vector& pos1,
|
|
||||||
scalar& m1,
|
|
||||||
scalar& d1,
|
|
||||||
scalar& N1,
|
|
||||||
vector& U,
|
|
||||||
scalar& rho1,
|
|
||||||
scalar& T1,
|
|
||||||
scalarField& Y1,
|
|
||||||
const scalar sigma1,
|
|
||||||
const label celli,
|
|
||||||
const scalar voli,
|
|
||||||
vector& pos2,
|
|
||||||
scalar& m2,
|
|
||||||
scalar& d2,
|
|
||||||
scalar& N2,
|
|
||||||
vector& U2,
|
|
||||||
scalar& rho2,
|
|
||||||
scalar& T2,
|
|
||||||
scalarField& Y2,
|
|
||||||
const scalar sigma2,
|
|
||||||
const label cellj,
|
|
||||||
const scalar volj
|
|
||||||
) const;
|
|
||||||
|
|
||||||
|
|
||||||
// 1 is the larger drop and 2 is the smaller
|
|
||||||
bool collideSorted
|
|
||||||
(
|
|
||||||
const scalar dt,
|
|
||||||
cachedRandom& rndGen,
|
|
||||||
vector& pos1,
|
|
||||||
scalar& m1,
|
|
||||||
scalar& d1,
|
|
||||||
scalar& N1,
|
|
||||||
vector& U,
|
|
||||||
scalar& rho1,
|
|
||||||
scalar& T1,
|
|
||||||
scalarField& Y1,
|
|
||||||
const scalar sigma1,
|
|
||||||
const label celli,
|
|
||||||
const scalar voli,
|
|
||||||
vector& pos2,
|
|
||||||
scalar& m2,
|
|
||||||
scalar& d2,
|
|
||||||
scalar& N2,
|
|
||||||
vector& U2,
|
|
||||||
scalar& rho2,
|
|
||||||
scalar& T2,
|
|
||||||
scalarField& Y2,
|
|
||||||
const scalar sigma2,
|
|
||||||
const label cellj,
|
|
||||||
const scalar volj
|
|
||||||
) const;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -25,187 +25,96 @@ License
|
|||||||
|
|
||||||
#include "TrajectoryCollision.H"
|
#include "TrajectoryCollision.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * //
|
||||||
|
|
||||||
template<class CloudType>
|
template<class CloudType>
|
||||||
Foam::TrajectoryCollision<CloudType>::TrajectoryCollision
|
void Foam::TrajectoryCollision<CloudType>::collide(const scalar dt)
|
||||||
(
|
{
|
||||||
const dictionary& dict,
|
ORourkeCollision<CloudType>::collide(dt);
|
||||||
CloudType& owner
|
}
|
||||||
)
|
|
||||||
:
|
|
||||||
StochasticCollisionModel<CloudType>(dict, owner, typeName),
|
|
||||||
cSpace_(readScalar(this->coeffDict().lookup("cSpace"))),
|
|
||||||
cTime_(readScalar(this->coeffDict().lookup("cTime"))),
|
|
||||||
coalescence_(this->coeffDict().lookup("coalescence"))
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
template<class CloudType>
|
template<class CloudType>
|
||||||
Foam::TrajectoryCollision<CloudType>::TrajectoryCollision
|
bool Foam::TrajectoryCollision<CloudType>::collideParcels
|
||||||
(
|
|
||||||
const TrajectoryCollision<CloudType>& cm
|
|
||||||
)
|
|
||||||
:
|
|
||||||
StochasticCollisionModel<CloudType>(cm),
|
|
||||||
cSpace_(cm.cSpace_),
|
|
||||||
cTime_(cm.cTime_),
|
|
||||||
coalescence_(cm.coalescence_)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
template<class CloudType>
|
|
||||||
Foam::TrajectoryCollision<CloudType>::~TrajectoryCollision()
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
template<class CloudType>
|
|
||||||
bool Foam::TrajectoryCollision<CloudType>::update
|
|
||||||
(
|
(
|
||||||
const scalar dt,
|
const scalar dt,
|
||||||
cachedRandom& rndGen,
|
parcelType& p1,
|
||||||
vector& pos1,
|
parcelType& p2,
|
||||||
scalar& m1,
|
scalar& m1,
|
||||||
scalar& d1,
|
scalar& m2
|
||||||
scalar& N1,
|
)
|
||||||
vector& U1,
|
|
||||||
scalar& rho1,
|
|
||||||
scalar& T1,
|
|
||||||
scalarField& Y1,
|
|
||||||
const scalar sigma1,
|
|
||||||
const label celli,
|
|
||||||
const scalar voli,
|
|
||||||
vector& pos2,
|
|
||||||
scalar& m2,
|
|
||||||
scalar& d2,
|
|
||||||
scalar& N2,
|
|
||||||
vector& U2,
|
|
||||||
scalar& rho2,
|
|
||||||
scalar& T2,
|
|
||||||
scalarField& Y2,
|
|
||||||
const scalar sigma2,
|
|
||||||
const label cellj,
|
|
||||||
const scalar volj
|
|
||||||
) const
|
|
||||||
{
|
{
|
||||||
bool coalescence = false;
|
bool coalescence = false;
|
||||||
|
|
||||||
vector vRel = U1 - U2;
|
const vector& pos1 = p1.position();
|
||||||
|
const vector& pos2 = p2.position();
|
||||||
|
|
||||||
vector p = pos2 - pos1;
|
const vector& U1 = p1.U();
|
||||||
scalar dist = mag(p);
|
const vector& U2 = p2.U();
|
||||||
|
|
||||||
scalar vAlign = vRel & (p/(dist + SMALL));
|
vector URel = U1 - U2;
|
||||||
|
|
||||||
|
vector d = pos2 - pos1;
|
||||||
|
scalar magd = mag(d);
|
||||||
|
|
||||||
|
scalar vAlign = URel & (d/(magd + ROOTVSMALL));
|
||||||
|
|
||||||
if (vAlign > 0)
|
if (vAlign > 0)
|
||||||
{
|
{
|
||||||
|
const scalar d1 = p1.d();
|
||||||
|
const scalar d2 = p2.d();
|
||||||
|
|
||||||
scalar sumD = d1 + d2;
|
scalar sumD = d1 + d2;
|
||||||
|
|
||||||
if (vAlign*dt > dist - 0.5*sumD)
|
if (vAlign*dt > magd - 0.5*sumD)
|
||||||
{
|
{
|
||||||
scalar v1Mag = mag(U1);
|
scalar magU1 = mag(U1) + ROOTVSMALL;
|
||||||
scalar v2Mag = mag(U2);
|
scalar magU2 = mag(U2) + ROOTVSMALL;
|
||||||
vector nv1 = U1/v1Mag;
|
vector n1 = U1/magU1;
|
||||||
vector nv2 = U2/v2Mag;
|
vector n2 = U2/magU2;
|
||||||
|
|
||||||
scalar v1v2 = nv1 & nv2;
|
scalar n1n2 = n1 & n2;
|
||||||
scalar v1p = nv1 & p;
|
scalar n1d = n1 & d;
|
||||||
scalar v2p = nv2 & p;
|
scalar n2d = n2 & d;
|
||||||
|
|
||||||
scalar det = 1.0 - v1v2*v1v2;
|
scalar det = 1.0 - sqr(n1n2);
|
||||||
|
|
||||||
scalar alpha = 1.0e+20;
|
scalar alpha = GREAT;
|
||||||
scalar beta = 1.0e+20;
|
scalar beta = GREAT;
|
||||||
|
|
||||||
if (mag(det) > 1.0e-4)
|
if (mag(det) > 1.0e-4)
|
||||||
{
|
{
|
||||||
beta = -(v2p - v1v2*v1p)/det;
|
beta = -(n2d - n1n2*n1d)/det;
|
||||||
alpha = v1p + v1v2*beta;
|
alpha = n1d + n1n2*beta;
|
||||||
}
|
}
|
||||||
|
|
||||||
alpha /= v1Mag*dt;
|
alpha /= magU1*dt;
|
||||||
beta /= v2Mag*dt;
|
beta /= magU2*dt;
|
||||||
|
|
||||||
// is collision possible within this timestep
|
// is collision possible within this timestep
|
||||||
if ((alpha>0) && (alpha<1.0) && (beta>0) && (beta<1.0))
|
if ((alpha > 0) && (alpha < 1.0) && (beta > 0) && (beta < 1.0))
|
||||||
{
|
{
|
||||||
vector p1c = pos1 + alpha*U1*dt;
|
vector p1c = pos1 + alpha*U1*dt;
|
||||||
vector p2c = pos2 + beta*U2*dt;
|
vector p2c = pos2 + beta*U2*dt;
|
||||||
|
|
||||||
scalar closestDist = mag(p1c-p2c);
|
scalar closestDist = mag(p1c - p2c);
|
||||||
|
|
||||||
scalar collProb =
|
scalar collProb =
|
||||||
pow(0.5*sumD/max(0.5*sumD, closestDist), cSpace_)
|
pow(0.5*sumD/max(0.5*sumD, closestDist), cSpace_)
|
||||||
* exp(-cTime_*mag(alpha-beta));
|
*exp(-cTime_*mag(alpha - beta));
|
||||||
|
|
||||||
scalar xx = rndGen.sample01<scalar>();
|
scalar xx = this->owner().rndGen().template sample01<scalar>();
|
||||||
|
|
||||||
// collision occur
|
// collision occurs
|
||||||
if ((xx < collProb) && (m1 > VSMALL) && (m2 > VSMALL))
|
if (xx > collProb)
|
||||||
{
|
{
|
||||||
if (d1 > d2)
|
if (d1 > d2)
|
||||||
{
|
{
|
||||||
coalescence = collideSorted
|
coalescence = this->collideSorted(dt, p1, p2, m1, m2);
|
||||||
(
|
|
||||||
dt,
|
|
||||||
rndGen,
|
|
||||||
pos1,
|
|
||||||
m1,
|
|
||||||
d1,
|
|
||||||
N1,
|
|
||||||
U1,
|
|
||||||
rho1,
|
|
||||||
T1,
|
|
||||||
Y1,
|
|
||||||
sigma1,
|
|
||||||
celli,
|
|
||||||
voli,
|
|
||||||
pos2,
|
|
||||||
m2,
|
|
||||||
d2,
|
|
||||||
N2,
|
|
||||||
U2,
|
|
||||||
rho2,
|
|
||||||
T2,
|
|
||||||
Y2,
|
|
||||||
sigma2,
|
|
||||||
cellj,
|
|
||||||
volj
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
coalescence = collideSorted
|
coalescence = this->collideSorted(dt, p2, p1, m2, m1);
|
||||||
(
|
|
||||||
dt,
|
|
||||||
rndGen,
|
|
||||||
pos2,
|
|
||||||
m2,
|
|
||||||
d2,
|
|
||||||
N2,
|
|
||||||
U2,
|
|
||||||
rho2,
|
|
||||||
T2,
|
|
||||||
Y2,
|
|
||||||
sigma2,
|
|
||||||
cellj,
|
|
||||||
volj,
|
|
||||||
pos1,
|
|
||||||
m1,
|
|
||||||
d1,
|
|
||||||
N1,
|
|
||||||
U1,
|
|
||||||
rho1,
|
|
||||||
T1,
|
|
||||||
Y1,
|
|
||||||
sigma1,
|
|
||||||
celli,
|
|
||||||
voli
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -216,128 +125,38 @@ bool Foam::TrajectoryCollision<CloudType>::update
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
template<class CloudType>
|
template<class CloudType>
|
||||||
bool Foam::TrajectoryCollision<CloudType>::collideSorted
|
Foam::TrajectoryCollision<CloudType>::TrajectoryCollision
|
||||||
(
|
(
|
||||||
const scalar dt,
|
const dictionary& dict,
|
||||||
cachedRandom& rndGen,
|
CloudType& owner
|
||||||
vector& pos1,
|
)
|
||||||
scalar& m1,
|
:
|
||||||
scalar& d1,
|
ORourkeCollision<CloudType>(dict, owner, typeName),
|
||||||
scalar& N1,
|
cSpace_(readScalar(this->coeffDict().lookup("cSpace"))),
|
||||||
vector& U1,
|
cTime_(readScalar(this->coeffDict().lookup("cTime")))
|
||||||
scalar& rho1,
|
{}
|
||||||
scalar& T1,
|
|
||||||
scalarField& Y1,
|
|
||||||
const scalar sigma1,
|
|
||||||
const label celli,
|
|
||||||
const scalar voli,
|
|
||||||
vector& pos2,
|
|
||||||
scalar& m2,
|
|
||||||
scalar& d2,
|
|
||||||
scalar& N2,
|
|
||||||
vector& U2,
|
|
||||||
scalar& rho2,
|
|
||||||
scalar& T2,
|
|
||||||
scalarField& Y2,
|
|
||||||
const scalar sigma2,
|
|
||||||
const label cellj,
|
|
||||||
const scalar volj
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
bool coalescence = false;
|
|
||||||
|
|
||||||
vector vRel = U1 - U2;
|
|
||||||
|
|
||||||
scalar mdMin = m2/N2;
|
template<class CloudType>
|
||||||
|
Foam::TrajectoryCollision<CloudType>::TrajectoryCollision
|
||||||
|
(
|
||||||
|
const TrajectoryCollision<CloudType>& cm
|
||||||
|
)
|
||||||
|
:
|
||||||
|
ORourkeCollision<CloudType>(cm),
|
||||||
|
cSpace_(cm.cSpace_),
|
||||||
|
cTime_(cm.cTime_)
|
||||||
|
{}
|
||||||
|
|
||||||
scalar mTot = m1 + m2;
|
|
||||||
|
|
||||||
scalar gamma = d1/max(d2, 1.0e-12);
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||||
scalar f = gamma*gamma*gamma + 2.7*gamma - 2.4*gamma*gamma;
|
|
||||||
|
|
||||||
vector momMax = m1*U1;
|
template<class CloudType>
|
||||||
vector momMin = m2*U2;
|
Foam::TrajectoryCollision<CloudType>::~TrajectoryCollision()
|
||||||
|
{}
|
||||||
// use mass-averaged temperature to calculate We number
|
|
||||||
scalar Tm = (T1*m1 + T2*m2)/mTot;
|
|
||||||
|
|
||||||
// and mass averaged fractions ...
|
|
||||||
//scalarField Yav((m1*Y1 + m2*Y2)/mTot;
|
|
||||||
|
|
||||||
// interpolate the averaged surface tension
|
|
||||||
scalar sigma = sigma1 + (sigma2 - sigma1)*(Tm - T1)/(T2 - T1);
|
|
||||||
|
|
||||||
sigma = max(1.0e-6, sigma);
|
|
||||||
scalar Vtot = m1/rho1 + m2/rho2;
|
|
||||||
scalar rho = mTot/Vtot;
|
|
||||||
|
|
||||||
scalar dMean = sqrt(d1*d2);
|
|
||||||
scalar WeColl = max(1.0e-12, 0.5*rho*magSqr(vRel)*dMean/sigma);
|
|
||||||
|
|
||||||
scalar coalesceProb = min(1.0, 2.4*f/WeColl);
|
|
||||||
|
|
||||||
scalar prob = rndGen.sample01<scalar>();
|
|
||||||
|
|
||||||
// Coalescence
|
|
||||||
if ( prob < coalesceProb && coalescence_)
|
|
||||||
{
|
|
||||||
coalescence = true;
|
|
||||||
// How 'many' of the droplets coalesce
|
|
||||||
scalar nProb = prob*N2/N1;
|
|
||||||
|
|
||||||
// Conservation of mass, momentum and energy
|
|
||||||
scalar m2Org = m2;
|
|
||||||
scalar dm = N1*nProb*mdMin;
|
|
||||||
m2 -= dm;
|
|
||||||
scalar V2 = constant::mathematical::pi*pow3(d2)/6.0;
|
|
||||||
N2 = m2/(rho2*V2);
|
|
||||||
|
|
||||||
scalar m1Org = m1;
|
|
||||||
m1 += dm;
|
|
||||||
T1 = (Tm*mTot - m2*T2)/m1;
|
|
||||||
|
|
||||||
U1 =(momMax + (1.0 - m2/m2Org)*momMin)/m1;
|
|
||||||
|
|
||||||
// update the liquid mass fractions
|
|
||||||
Y1 = (m1Org*Y1 + dm*Y2)/m1;
|
|
||||||
}
|
|
||||||
// Grazing collision (no coalescence)
|
|
||||||
else
|
|
||||||
{
|
|
||||||
scalar gf = sqrt(prob) - sqrt(coalesceProb);
|
|
||||||
scalar denom = 1.0 - sqrt(coalesceProb);
|
|
||||||
if (denom < 1.0e-5)
|
|
||||||
{
|
|
||||||
denom = 1.0;
|
|
||||||
}
|
|
||||||
gf /= denom;
|
|
||||||
|
|
||||||
// if gf negative, this means that coalescence is turned off
|
|
||||||
// and these parcels should have coalesced
|
|
||||||
gf = max(0.0, gf);
|
|
||||||
|
|
||||||
// gf -> 1 => v1p -> p1().U() ...
|
|
||||||
// gf -> 0 => v1p -> momentum/(m1 + m2)
|
|
||||||
|
|
||||||
vector mr = m1*U1 + m2*U2;
|
|
||||||
vector v1p = (mr + m2*gf*vRel)/(m1 + m2);
|
|
||||||
vector v2p = (mr - m1*gf*vRel)/(m1 + m2);
|
|
||||||
|
|
||||||
if (N1 < N2)
|
|
||||||
{
|
|
||||||
U1 = v1p;
|
|
||||||
U2 = (N1*v2p + (N2 - N1)*U2)/N2;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
U1 = (N2*v1p + (N1 - N2)*U1)/N1;
|
|
||||||
U2 = v2p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return coalescence;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
|
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
@ -25,35 +25,57 @@ Class
|
|||||||
Foam::TrajectoryCollision
|
Foam::TrajectoryCollision
|
||||||
|
|
||||||
Description
|
Description
|
||||||
Trajectory collision model by N. Nordin.
|
Trajectory collision model by N. Nordin, based on O'Rourke's collision
|
||||||
|
model
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#ifndef TrajectoryCollision_H
|
#ifndef TrajectoryCollision_H
|
||||||
#define TrajectoryCollision_H
|
#define TrajectoryCollision_H
|
||||||
|
|
||||||
#include "StochasticCollisionModel.H"
|
#include "ORourkeCollision.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
namespace Foam
|
namespace Foam
|
||||||
{
|
{
|
||||||
/*---------------------------------------------------------------------------*\
|
/*---------------------------------------------------------------------------*\
|
||||||
Class TrajectoryCollision Declaration
|
Class TrajectoryCollision Declaration
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
template<class CloudType>
|
template<class CloudType>
|
||||||
class TrajectoryCollision
|
class TrajectoryCollision
|
||||||
:
|
:
|
||||||
public StochasticCollisionModel<CloudType>
|
public ORourkeCollision<CloudType>
|
||||||
{
|
{
|
||||||
private:
|
protected:
|
||||||
|
|
||||||
// Private data
|
// Protected Data
|
||||||
|
|
||||||
|
//- Convenience typedef to the cloud's parcel type
|
||||||
|
typedef typename CloudType::parcelType parcelType;
|
||||||
|
|
||||||
|
//- Space coefficient
|
||||||
scalar cSpace_;
|
scalar cSpace_;
|
||||||
|
|
||||||
|
//- Time coefficient
|
||||||
scalar cTime_;
|
scalar cTime_;
|
||||||
Switch coalescence_;
|
|
||||||
|
|
||||||
|
// Protected Member Functions
|
||||||
|
|
||||||
|
//- Main collision routine
|
||||||
|
virtual void collide(const scalar dt);
|
||||||
|
|
||||||
|
//- Collide parcels and return true if mass has changed
|
||||||
|
virtual bool collideParcels
|
||||||
|
(
|
||||||
|
const scalar dt,
|
||||||
|
parcelType& p1,
|
||||||
|
parcelType& p2,
|
||||||
|
scalar& m1,
|
||||||
|
scalar& m2
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -82,66 +104,6 @@ public:
|
|||||||
|
|
||||||
//- Destructor
|
//- Destructor
|
||||||
virtual ~TrajectoryCollision();
|
virtual ~TrajectoryCollision();
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
|
||||||
|
|
||||||
virtual bool update
|
|
||||||
(
|
|
||||||
const scalar dt,
|
|
||||||
cachedRandom& rndGen,
|
|
||||||
vector& pos1,
|
|
||||||
scalar& m1,
|
|
||||||
scalar& d1,
|
|
||||||
scalar& N1,
|
|
||||||
vector& U,
|
|
||||||
scalar& rho1,
|
|
||||||
scalar& T1,
|
|
||||||
scalarField& Y1,
|
|
||||||
const scalar sigma1,
|
|
||||||
const label celli,
|
|
||||||
const scalar voli,
|
|
||||||
vector& pos2,
|
|
||||||
scalar& m2,
|
|
||||||
scalar& d2,
|
|
||||||
scalar& N2,
|
|
||||||
vector& U2,
|
|
||||||
scalar& rho2,
|
|
||||||
scalar& T2,
|
|
||||||
scalarField& Y2,
|
|
||||||
const scalar sigma2,
|
|
||||||
const label cellj,
|
|
||||||
const scalar volj
|
|
||||||
) const;
|
|
||||||
|
|
||||||
// 1 is the larger drop and 2 is the smaller
|
|
||||||
bool collideSorted
|
|
||||||
(
|
|
||||||
const scalar dt,
|
|
||||||
cachedRandom& rndGen,
|
|
||||||
vector& pos1,
|
|
||||||
scalar& m1,
|
|
||||||
scalar& d1,
|
|
||||||
scalar& N1,
|
|
||||||
vector& U,
|
|
||||||
scalar& rho1,
|
|
||||||
scalar& T1,
|
|
||||||
scalarField& Y1,
|
|
||||||
const scalar sigma1,
|
|
||||||
const label celli,
|
|
||||||
const scalar voli,
|
|
||||||
vector& pos2,
|
|
||||||
scalar& m2,
|
|
||||||
scalar& d2,
|
|
||||||
scalar& N2,
|
|
||||||
vector& U2,
|
|
||||||
scalar& rho2,
|
|
||||||
scalar& T2,
|
|
||||||
scalarField& Y2,
|
|
||||||
const scalar sigma2,
|
|
||||||
const label cellj,
|
|
||||||
const scalar volj
|
|
||||||
) const;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user