mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
added new family of injection models
This commit is contained in:
@ -29,6 +29,7 @@ License
|
|||||||
|
|
||||||
#include "ConeInjection.H"
|
#include "ConeInjection.H"
|
||||||
#include "FieldActivatedInjection.H"
|
#include "FieldActivatedInjection.H"
|
||||||
|
#include "KinematicLookupTableInjection.H"
|
||||||
#include "ManualInjection.H"
|
#include "ManualInjection.H"
|
||||||
#include "NoInjection.H"
|
#include "NoInjection.H"
|
||||||
|
|
||||||
@ -52,6 +53,12 @@ namespace Foam
|
|||||||
basicKinematicParcel
|
basicKinematicParcel
|
||||||
);
|
);
|
||||||
makeInjectionModelType
|
makeInjectionModelType
|
||||||
|
(
|
||||||
|
KinematicLookupTableInjection,
|
||||||
|
KinematicCloud,
|
||||||
|
basicKinematicParcel
|
||||||
|
);
|
||||||
|
makeInjectionModelType
|
||||||
(
|
(
|
||||||
ManualInjection,
|
ManualInjection,
|
||||||
KinematicCloud,
|
KinematicCloud,
|
||||||
|
|||||||
@ -31,6 +31,7 @@ License
|
|||||||
#include "FieldActivatedInjection.H"
|
#include "FieldActivatedInjection.H"
|
||||||
#include "ManualInjection.H"
|
#include "ManualInjection.H"
|
||||||
#include "NoInjection.H"
|
#include "NoInjection.H"
|
||||||
|
#include "ReactingLookupTableInjection.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
@ -63,6 +64,12 @@ namespace Foam
|
|||||||
KinematicCloud,
|
KinematicCloud,
|
||||||
basicReactingParcel
|
basicReactingParcel
|
||||||
);
|
);
|
||||||
|
makeInjectionModelType
|
||||||
|
(
|
||||||
|
ReactingLookupTableInjection,
|
||||||
|
KinematicCloud,
|
||||||
|
basicReactingParcel
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -31,6 +31,7 @@ License
|
|||||||
#include "FieldActivatedInjection.H"
|
#include "FieldActivatedInjection.H"
|
||||||
#include "ManualInjection.H"
|
#include "ManualInjection.H"
|
||||||
#include "NoInjection.H"
|
#include "NoInjection.H"
|
||||||
|
#include "ThermoLookupTableInjection.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
@ -64,6 +65,12 @@ namespace Foam
|
|||||||
KinematicCloud,
|
KinematicCloud,
|
||||||
basicThermoParcel
|
basicThermoParcel
|
||||||
);
|
);
|
||||||
|
makeInjectionModelType
|
||||||
|
(
|
||||||
|
ThermoLookupTableInjection,
|
||||||
|
KinematicCloud,
|
||||||
|
basicThermoParcel
|
||||||
|
);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,231 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by the
|
||||||
|
Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "KinematicLookupTableInjection.H"
|
||||||
|
#include "scalarIOList.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
Foam::label Foam::KinematicLookupTableInjection<CloudType>::INPUT_FILE_COLS = 9;
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
Foam::label Foam::KinematicLookupTableInjection<CloudType>::parcelsToInject
|
||||||
|
(
|
||||||
|
const scalar time0,
|
||||||
|
const scalar time1
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
if ((time0 >= 0.0) && (time0 < duration_))
|
||||||
|
{
|
||||||
|
return round(injectorCells_.size()*(time1 - time0)*nParcelsPerSecond_);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
Foam::scalar Foam::KinematicLookupTableInjection<CloudType>::volumeToInject
|
||||||
|
(
|
||||||
|
const scalar time0,
|
||||||
|
const scalar time1
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
scalar volume = 0.0;
|
||||||
|
if ((time0 >= 0.0) && (time0 < duration_))
|
||||||
|
{
|
||||||
|
forAll(mDot_, injectorI)
|
||||||
|
{
|
||||||
|
volume += mDot_[injectorI]/rho_[injectorI]*(time1 - time0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return volume;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
Foam::KinematicLookupTableInjection<CloudType>::KinematicLookupTableInjection
|
||||||
|
(
|
||||||
|
const dictionary& dict,
|
||||||
|
CloudType& owner
|
||||||
|
)
|
||||||
|
:
|
||||||
|
InjectionModel<CloudType>(dict, owner, typeName),
|
||||||
|
inputFileName_(this->coeffDict().lookup("inputFile")),
|
||||||
|
duration_(readScalar(this->coeffDict().lookup("duration"))),
|
||||||
|
nParcelsPerSecond_
|
||||||
|
(
|
||||||
|
readScalar(this->coeffDict().lookup("parcelsPerSecond"))
|
||||||
|
),
|
||||||
|
x_(0),
|
||||||
|
U_(0),
|
||||||
|
d_(0),
|
||||||
|
rho_(0),
|
||||||
|
mDot_(0),
|
||||||
|
injectorCells_(0)
|
||||||
|
{
|
||||||
|
scalarListIOList injectorData
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
inputFileName_,
|
||||||
|
owner.db().time().constant(),
|
||||||
|
owner.db(),
|
||||||
|
IOobject::MUST_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
x_.setSize(injectorData.size());
|
||||||
|
U_.setSize(injectorData.size());
|
||||||
|
d_.setSize(injectorData.size());
|
||||||
|
rho_.setSize(injectorData.size());
|
||||||
|
mDot_.setSize(injectorData.size());
|
||||||
|
|
||||||
|
// Populate lists
|
||||||
|
forAll(injectorData, injectorI)
|
||||||
|
{
|
||||||
|
if (injectorData[injectorI].size() != INPUT_FILE_COLS)
|
||||||
|
{
|
||||||
|
FatalErrorIn
|
||||||
|
(
|
||||||
|
"KinematicLookupTableInjection"
|
||||||
|
"("
|
||||||
|
"const dictionary&,"
|
||||||
|
"CloudType& owner"
|
||||||
|
")"
|
||||||
|
) << "Incorrect number of entries in injector specification "
|
||||||
|
<< "- found " << injectorData[injectorI].size()
|
||||||
|
<< ", expected " << INPUT_FILE_COLS << ":" << nl
|
||||||
|
<< " x0 x1 x2 u0 u1 u2 d rho mDot " << nl
|
||||||
|
<< exit(FatalError);
|
||||||
|
}
|
||||||
|
x_[injectorI].component(0) = injectorData[injectorI][0];
|
||||||
|
x_[injectorI].component(1) = injectorData[injectorI][1];
|
||||||
|
x_[injectorI].component(2) = injectorData[injectorI][2];
|
||||||
|
U_[injectorI].component(0) = injectorData[injectorI][3];
|
||||||
|
U_[injectorI].component(1) = injectorData[injectorI][4];
|
||||||
|
U_[injectorI].component(2) = injectorData[injectorI][5];
|
||||||
|
d_[injectorI] = injectorData[injectorI][6];
|
||||||
|
rho_[injectorI] = injectorData[injectorI][7];
|
||||||
|
mDot_[injectorI] = injectorData[injectorI][8];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set/cache the injector cells
|
||||||
|
injectorCells_.setSize(injectorData.size());
|
||||||
|
forAll(x_, injectorI)
|
||||||
|
{
|
||||||
|
this->findCellAtPosition(injectorCells_[injectorI], x_[injectorI]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine volume of particles to inject
|
||||||
|
this->volumeTotal_ = 0.0;
|
||||||
|
forAll(mDot_, injectorI)
|
||||||
|
{
|
||||||
|
this->volumeTotal_ += mDot_[injectorI]/rho_[injectorI];
|
||||||
|
}
|
||||||
|
this->volumeTotal_ *= duration_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
Foam::KinematicLookupTableInjection<CloudType>::~KinematicLookupTableInjection()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
bool Foam::KinematicLookupTableInjection<CloudType>::active() const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
Foam::scalar Foam::KinematicLookupTableInjection<CloudType>::timeEnd() const
|
||||||
|
{
|
||||||
|
return this->SOI_ + duration_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
void Foam::KinematicLookupTableInjection<CloudType>::setPositionAndCell
|
||||||
|
(
|
||||||
|
const label parcelI,
|
||||||
|
const label nParcels,
|
||||||
|
const scalar time,
|
||||||
|
vector& position,
|
||||||
|
label& cellOwner
|
||||||
|
)
|
||||||
|
{
|
||||||
|
label injectorI = parcelI*injectorCells_.size()/nParcels;
|
||||||
|
|
||||||
|
position = x_[injectorI];
|
||||||
|
cellOwner = injectorCells_[injectorI];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
void Foam::KinematicLookupTableInjection<CloudType>::setProperties
|
||||||
|
(
|
||||||
|
const label parcelI,
|
||||||
|
const label nParcels,
|
||||||
|
const scalar,
|
||||||
|
typename CloudType::parcelType* pPtr
|
||||||
|
)
|
||||||
|
{
|
||||||
|
label injectorI = parcelI*injectorCells_.size()/nParcels;
|
||||||
|
|
||||||
|
// set particle velocity
|
||||||
|
pPtr->U() = U_[injectorI];
|
||||||
|
|
||||||
|
// set particle diameter
|
||||||
|
pPtr->d() = d_[injectorI];
|
||||||
|
|
||||||
|
// set particle density
|
||||||
|
pPtr->rho() = rho_[injectorI];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
bool Foam::KinematicLookupTableInjection<CloudType>::validInjection(const label)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,194 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by the
|
||||||
|
Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
Class
|
||||||
|
Foam::KinematicLookupTableInjection
|
||||||
|
|
||||||
|
Description
|
||||||
|
Particle injection sources read from look-up table. Each row corresponds to
|
||||||
|
an injection site.
|
||||||
|
|
||||||
|
(
|
||||||
|
(x y z u v w d rho mDot)
|
||||||
|
);
|
||||||
|
|
||||||
|
where:
|
||||||
|
x, y, z = global cartesian co-ordinates [m]
|
||||||
|
u, v, w = global cartesian velocity components [m/s]
|
||||||
|
d = diameter [m]
|
||||||
|
rho = density [kg/m3]
|
||||||
|
mDot = mass flow rate [kg/m3]
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
KinematicLookupTableInjection.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef KinematicLookupTableInjection_H
|
||||||
|
#define KinematicLookupTableInjection_H
|
||||||
|
|
||||||
|
#include "InjectionModel.H"
|
||||||
|
#include "pdf.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class KinematicLookupTableInjection Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
class KinematicLookupTableInjection
|
||||||
|
:
|
||||||
|
public InjectionModel<CloudType>
|
||||||
|
{
|
||||||
|
// Private data
|
||||||
|
|
||||||
|
//- Name of file containing injector/parcel data
|
||||||
|
const word inputFileName_;
|
||||||
|
|
||||||
|
//- Injection duration - common to all injection sources
|
||||||
|
const scalar duration_;
|
||||||
|
|
||||||
|
//- Number of parcels per injector - common to all injection sources
|
||||||
|
const label nParcelsPerSecond_;
|
||||||
|
|
||||||
|
//- List of parcel position per injector / [m]
|
||||||
|
List<point> x_;
|
||||||
|
|
||||||
|
//- List of parcel velocity per injector / [m]
|
||||||
|
List<vector> U_;
|
||||||
|
|
||||||
|
//- List of parcel diameter per injector / [m]
|
||||||
|
List<scalar> d_;
|
||||||
|
|
||||||
|
//- List of parcel fluid density pre injector / [kg/m3]
|
||||||
|
List<scalar> rho_;
|
||||||
|
|
||||||
|
//- List of parcel injection mass flow per injector / [kg/s]
|
||||||
|
List<scalar> mDot_;
|
||||||
|
|
||||||
|
//- List of injector cells per injector
|
||||||
|
List<label> injectorCells_;
|
||||||
|
|
||||||
|
//- Number of columns expected in input file
|
||||||
|
static label INPUT_FILE_COLS;
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
// Protected member functions
|
||||||
|
|
||||||
|
//- Number of parcels to introduce over the time step relative to SOI
|
||||||
|
label parcelsToInject
|
||||||
|
(
|
||||||
|
const scalar time0,
|
||||||
|
const scalar time1
|
||||||
|
) const;
|
||||||
|
|
||||||
|
//- Volume of parcels to introduce over the time step relative to SOI
|
||||||
|
scalar volumeToInject
|
||||||
|
(
|
||||||
|
const scalar time0,
|
||||||
|
const scalar time1
|
||||||
|
) const;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeName("KinematicLookupTableInjection");
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct from dictionary
|
||||||
|
KinematicLookupTableInjection
|
||||||
|
(
|
||||||
|
const dictionary& dict,
|
||||||
|
CloudType& owner
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
virtual ~KinematicLookupTableInjection();
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
//- Flag to indicate whether model activates injection model
|
||||||
|
bool active() const;
|
||||||
|
|
||||||
|
//- Return the end-of-injection time
|
||||||
|
scalar timeEnd() const;
|
||||||
|
|
||||||
|
|
||||||
|
// Injection geometry
|
||||||
|
|
||||||
|
//- Set the injection position and owner cell
|
||||||
|
virtual void setPositionAndCell
|
||||||
|
(
|
||||||
|
const label parcelI,
|
||||||
|
const label nParcels,
|
||||||
|
const scalar time,
|
||||||
|
vector& position,
|
||||||
|
label& cellOwner
|
||||||
|
);
|
||||||
|
|
||||||
|
virtual void setProperties
|
||||||
|
(
|
||||||
|
const label parcelI,
|
||||||
|
const label nParcels,
|
||||||
|
const scalar time,
|
||||||
|
typename CloudType::parcelType* pPtr
|
||||||
|
);
|
||||||
|
|
||||||
|
virtual bool fullyDescribed() const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Return flag to identify whether or not injection in cellI is
|
||||||
|
// permitted
|
||||||
|
virtual bool validInjection(const label parcelI);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#ifdef NoRepository
|
||||||
|
# include "KinematicLookupTableInjection.C"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,263 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by the
|
||||||
|
Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "ReactingLookupTableInjection.H"
|
||||||
|
#include "scalarIOList.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
Foam::label Foam::ReactingLookupTableInjection<CloudType>::INPUT_FILE_COLS = 12;
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
Foam::label Foam::ReactingLookupTableInjection<CloudType>::parcelsToInject
|
||||||
|
(
|
||||||
|
const scalar time0,
|
||||||
|
const scalar time1
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
if ((time0 >= 0.0) && (time0 < duration_))
|
||||||
|
{
|
||||||
|
return round(injectorCells_.size()*(time1 - time0)*nParcelsPerSecond_);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
Foam::scalar Foam::ReactingLookupTableInjection<CloudType>::volumeToInject
|
||||||
|
(
|
||||||
|
const scalar time0,
|
||||||
|
const scalar time1
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
scalar volume = 0.0;
|
||||||
|
if ((time0 >= 0.0) && (time0 < duration_))
|
||||||
|
{
|
||||||
|
forAll(mDot_, injectorI)
|
||||||
|
{
|
||||||
|
volume += mDot_[injectorI]/rho_[injectorI]*(time1 - time0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return volume;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
Foam::ReactingLookupTableInjection<CloudType>::ReactingLookupTableInjection
|
||||||
|
(
|
||||||
|
const dictionary& dict,
|
||||||
|
CloudType& owner
|
||||||
|
)
|
||||||
|
:
|
||||||
|
InjectionModel<CloudType>(dict, owner, typeName),
|
||||||
|
inputFileName_(this->coeffDict().lookup("inputFile")),
|
||||||
|
duration_(readScalar(this->coeffDict().lookup("duration"))),
|
||||||
|
nParcelsPerSecond_
|
||||||
|
(
|
||||||
|
readScalar(this->coeffDict().lookup("parcelsPerSecond"))
|
||||||
|
),
|
||||||
|
x_(0),
|
||||||
|
U_(0),
|
||||||
|
d_(0),
|
||||||
|
rho_(0),
|
||||||
|
mDot_(0),
|
||||||
|
T_(0),
|
||||||
|
cp_(0),
|
||||||
|
Y_(0),
|
||||||
|
injectorCells_(0)
|
||||||
|
{
|
||||||
|
scalarListIOList injectorData
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
inputFileName_,
|
||||||
|
owner.db().time().constant(),
|
||||||
|
owner.db(),
|
||||||
|
IOobject::MUST_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
x_.setSize(injectorData.size());
|
||||||
|
U_.setSize(injectorData.size());
|
||||||
|
d_.setSize(injectorData.size());
|
||||||
|
rho_.setSize(injectorData.size());
|
||||||
|
mDot_.setSize(injectorData.size());
|
||||||
|
T_.setSize(injectorData.size());
|
||||||
|
cp_.setSize(injectorData.size());
|
||||||
|
Y_.setSize(injectorData.size());
|
||||||
|
|
||||||
|
// Populate lists
|
||||||
|
forAll(injectorData, injectorI)
|
||||||
|
{
|
||||||
|
if (injectorData[injectorI].size() != INPUT_FILE_COLS)
|
||||||
|
{
|
||||||
|
FatalErrorIn
|
||||||
|
(
|
||||||
|
"ReactingLookupTableInjection"
|
||||||
|
"("
|
||||||
|
"const dictionary&,"
|
||||||
|
"CloudType& owner"
|
||||||
|
")"
|
||||||
|
) << "Incorrect number of entries in injector specification "
|
||||||
|
<< "- found " << injectorData[injectorI].size()
|
||||||
|
<< ", expected a minimum of " << INPUT_FILE_COLS << ":" << nl
|
||||||
|
<< " x0 x1 x2 u0 u1 u2 d rho mDot T cp Y0..YN"
|
||||||
|
<< nl << exit(FatalError);
|
||||||
|
}
|
||||||
|
x_[injectorI].component(0) = injectorData[injectorI][0];
|
||||||
|
x_[injectorI].component(1) = injectorData[injectorI][1];
|
||||||
|
x_[injectorI].component(2) = injectorData[injectorI][2];
|
||||||
|
U_[injectorI].component(0) = injectorData[injectorI][3];
|
||||||
|
U_[injectorI].component(1) = injectorData[injectorI][4];
|
||||||
|
U_[injectorI].component(2) = injectorData[injectorI][5];
|
||||||
|
d_[injectorI] = injectorData[injectorI][6];
|
||||||
|
rho_[injectorI] = injectorData[injectorI][7];
|
||||||
|
mDot_[injectorI] = injectorData[injectorI][8];
|
||||||
|
T_[injectorI] = injectorData[injectorI][9];
|
||||||
|
cp_[injectorI] = injectorData[injectorI][10];
|
||||||
|
|
||||||
|
Y_[injectorI].setSize
|
||||||
|
(
|
||||||
|
injectorData[injectorI].size() - INPUT_FILE_COLS + 1
|
||||||
|
);
|
||||||
|
label Yi = 0;
|
||||||
|
for
|
||||||
|
(
|
||||||
|
label i = INPUT_FILE_COLS-1;
|
||||||
|
i < injectorData[injectorI].size();
|
||||||
|
i++
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Y_[injectorI][Yi++] = injectorData[injectorI][i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set/cache the injector cells
|
||||||
|
injectorCells_.setSize(injectorData.size());
|
||||||
|
forAll(x_, injectorI)
|
||||||
|
{
|
||||||
|
this->findCellAtPosition(injectorCells_[injectorI], x_[injectorI]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine volume of particles to inject
|
||||||
|
this->volumeTotal_ = 0.0;
|
||||||
|
forAll(mDot_, injectorI)
|
||||||
|
{
|
||||||
|
this->volumeTotal_ += mDot_[injectorI]/rho_[injectorI];
|
||||||
|
}
|
||||||
|
this->volumeTotal_ *= duration_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
Foam::ReactingLookupTableInjection<CloudType>::~ReactingLookupTableInjection()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
bool Foam::ReactingLookupTableInjection<CloudType>::active() const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
Foam::scalar Foam::ReactingLookupTableInjection<CloudType>::timeEnd() const
|
||||||
|
{
|
||||||
|
return this->SOI_ + duration_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
void Foam::ReactingLookupTableInjection<CloudType>::setPositionAndCell
|
||||||
|
(
|
||||||
|
const label parcelI,
|
||||||
|
const label nParcels,
|
||||||
|
const scalar time,
|
||||||
|
vector& position,
|
||||||
|
label& cellOwner
|
||||||
|
)
|
||||||
|
{
|
||||||
|
label injectorI = parcelI*injectorCells_.size()/nParcels;
|
||||||
|
|
||||||
|
position = x_[injectorI];
|
||||||
|
cellOwner = injectorCells_[injectorI];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
void Foam::ReactingLookupTableInjection<CloudType>::setProperties
|
||||||
|
(
|
||||||
|
const label parcelI,
|
||||||
|
const label nParcels,
|
||||||
|
const scalar,
|
||||||
|
typename CloudType::parcelType* pPtr
|
||||||
|
)
|
||||||
|
{
|
||||||
|
label injectorI = parcelI*injectorCells_.size()/nParcels;
|
||||||
|
|
||||||
|
// set particle velocity
|
||||||
|
pPtr->U() = U_[injectorI];
|
||||||
|
|
||||||
|
// set particle diameter
|
||||||
|
pPtr->d() = d_[injectorI];
|
||||||
|
|
||||||
|
// set particle density
|
||||||
|
pPtr->rho() = rho_[injectorI];
|
||||||
|
|
||||||
|
// set particle temperature
|
||||||
|
pPtr->T() = T_[injectorI];
|
||||||
|
|
||||||
|
// set particle specific heat capacity
|
||||||
|
pPtr->cp() = cp_[injectorI];
|
||||||
|
|
||||||
|
// set particle component mass fractions
|
||||||
|
pPtr->Y() = Y_[injectorI];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
bool Foam::ReactingLookupTableInjection<CloudType>::validInjection(const label)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,205 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by the
|
||||||
|
Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
Class
|
||||||
|
Foam::ReactingLookupTableInjection
|
||||||
|
|
||||||
|
Description
|
||||||
|
Particle injection sources read from look-up table. Each row corresponds to
|
||||||
|
an injection site.
|
||||||
|
|
||||||
|
(
|
||||||
|
(x y z u v w d rho mDot T cp Y0..YN)
|
||||||
|
);
|
||||||
|
|
||||||
|
where:
|
||||||
|
x, y, z = global cartesian co-ordinates [m]
|
||||||
|
u, v, w = global cartesian velocity components [m/s]
|
||||||
|
d = diameter [m]
|
||||||
|
rho = density [kg/m3]
|
||||||
|
mDot = mass flow rate [kg/m3]
|
||||||
|
T = temperature [K]
|
||||||
|
cp = specific heat capacity [J/kg/K]
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
ReactingLookupTableInjection.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef ReactingLookupTableInjection_H
|
||||||
|
#define ReactingLookupTableInjection_H
|
||||||
|
|
||||||
|
#include "InjectionModel.H"
|
||||||
|
#include "pdf.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class ReactingLookupTableInjection Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
class ReactingLookupTableInjection
|
||||||
|
:
|
||||||
|
public InjectionModel<CloudType>
|
||||||
|
{
|
||||||
|
// Private data
|
||||||
|
|
||||||
|
//- Name of file containing injector/parcel data
|
||||||
|
const word inputFileName_;
|
||||||
|
|
||||||
|
//- Injection duration - common to all injection sources
|
||||||
|
const scalar duration_;
|
||||||
|
|
||||||
|
//- Number of parcels per injector - common to all injection sources
|
||||||
|
const label nParcelsPerSecond_;
|
||||||
|
|
||||||
|
//- List of parcel position per injector / [m]
|
||||||
|
List<point> x_;
|
||||||
|
|
||||||
|
//- List of parcel velocity per injector / [m]
|
||||||
|
List<vector> U_;
|
||||||
|
|
||||||
|
//- List of parcel diameter per injector / [m]
|
||||||
|
List<scalar> d_;
|
||||||
|
|
||||||
|
//- List of parcel fluid density pre injector / [kg/m3]
|
||||||
|
List<scalar> rho_;
|
||||||
|
|
||||||
|
//- List of parcel injection mass flow per injector / [kg/s]
|
||||||
|
List<scalar> mDot_;
|
||||||
|
|
||||||
|
//- List of parcel temperature flow per injector / [K]
|
||||||
|
List<scalar> T_;
|
||||||
|
|
||||||
|
//- List of parcel specific heat capacity per injector / [J/kg/K]
|
||||||
|
List<scalar> cp_;
|
||||||
|
|
||||||
|
//- List of parcel specie mass fractions per injector / []
|
||||||
|
List<scalarList> Y_;
|
||||||
|
|
||||||
|
//- List of injector cells per injector
|
||||||
|
List<label> injectorCells_;
|
||||||
|
|
||||||
|
//- Number of columns expected in input file
|
||||||
|
static label INPUT_FILE_COLS;
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
// Protected member functions
|
||||||
|
|
||||||
|
//- Number of parcels to introduce over the time step relative to SOI
|
||||||
|
label parcelsToInject
|
||||||
|
(
|
||||||
|
const scalar time0,
|
||||||
|
const scalar time1
|
||||||
|
) const;
|
||||||
|
|
||||||
|
//- Volume of parcels to introduce over the time step relative to SOI
|
||||||
|
scalar volumeToInject
|
||||||
|
(
|
||||||
|
const scalar time0,
|
||||||
|
const scalar time1
|
||||||
|
) const;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeName("ReactingLookupTableInjection");
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct from dictionary
|
||||||
|
ReactingLookupTableInjection
|
||||||
|
(
|
||||||
|
const dictionary& dict,
|
||||||
|
CloudType& owner
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
virtual ~ReactingLookupTableInjection();
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
//- Flag to indicate whether model activates injection model
|
||||||
|
bool active() const;
|
||||||
|
|
||||||
|
//- Return the end-of-injection time
|
||||||
|
scalar timeEnd() const;
|
||||||
|
|
||||||
|
|
||||||
|
// Injection geometry
|
||||||
|
|
||||||
|
//- Set the injection position and owner cell
|
||||||
|
virtual void setPositionAndCell
|
||||||
|
(
|
||||||
|
const label parcelI,
|
||||||
|
const label nParcels,
|
||||||
|
const scalar time,
|
||||||
|
vector& position,
|
||||||
|
label& cellOwner
|
||||||
|
);
|
||||||
|
|
||||||
|
virtual void setProperties
|
||||||
|
(
|
||||||
|
const label parcelI,
|
||||||
|
const label nParcels,
|
||||||
|
const scalar time,
|
||||||
|
typename CloudType::parcelType* pPtr
|
||||||
|
);
|
||||||
|
|
||||||
|
virtual bool fullyDescribed() const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Return flag to identify whether or not injection in cellI is
|
||||||
|
// permitted
|
||||||
|
virtual bool validInjection(const label parcelI);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#ifdef NoRepository
|
||||||
|
# include "ReactingLookupTableInjection.C"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,243 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by the
|
||||||
|
Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "ThermoLookupTableInjection.H"
|
||||||
|
#include "scalarIOList.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
Foam::label Foam::ThermoLookupTableInjection<CloudType>::INPUT_FILE_COLS = 11;
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
Foam::label Foam::ThermoLookupTableInjection<CloudType>::parcelsToInject
|
||||||
|
(
|
||||||
|
const scalar time0,
|
||||||
|
const scalar time1
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
if ((time0 >= 0.0) && (time0 < duration_))
|
||||||
|
{
|
||||||
|
return round(injectorCells_.size()*(time1 - time0)*nParcelsPerSecond_);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
Foam::scalar Foam::ThermoLookupTableInjection<CloudType>::volumeToInject
|
||||||
|
(
|
||||||
|
const scalar time0,
|
||||||
|
const scalar time1
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
scalar volume = 0.0;
|
||||||
|
if ((time0 >= 0.0) && (time0 < duration_))
|
||||||
|
{
|
||||||
|
forAll(mDot_, injectorI)
|
||||||
|
{
|
||||||
|
volume += mDot_[injectorI]/rho_[injectorI]*(time1 - time0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return volume;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
Foam::ThermoLookupTableInjection<CloudType>::ThermoLookupTableInjection
|
||||||
|
(
|
||||||
|
const dictionary& dict,
|
||||||
|
CloudType& owner
|
||||||
|
)
|
||||||
|
:
|
||||||
|
InjectionModel<CloudType>(dict, owner, typeName),
|
||||||
|
inputFileName_(this->coeffDict().lookup("inputFile")),
|
||||||
|
duration_(readScalar(this->coeffDict().lookup("duration"))),
|
||||||
|
nParcelsPerSecond_
|
||||||
|
(
|
||||||
|
readScalar(this->coeffDict().lookup("parcelsPerSecond"))
|
||||||
|
),
|
||||||
|
x_(0),
|
||||||
|
U_(0),
|
||||||
|
d_(0),
|
||||||
|
rho_(0),
|
||||||
|
mDot_(0),
|
||||||
|
T_(0),
|
||||||
|
cp_(0),
|
||||||
|
injectorCells_(0)
|
||||||
|
{
|
||||||
|
scalarListIOList injectorData
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
inputFileName_,
|
||||||
|
owner.db().time().constant(),
|
||||||
|
owner.db(),
|
||||||
|
IOobject::MUST_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
x_.setSize(injectorData.size());
|
||||||
|
U_.setSize(injectorData.size());
|
||||||
|
d_.setSize(injectorData.size());
|
||||||
|
rho_.setSize(injectorData.size());
|
||||||
|
mDot_.setSize(injectorData.size());
|
||||||
|
T_.setSize(injectorData.size());
|
||||||
|
cp_.setSize(injectorData.size());
|
||||||
|
|
||||||
|
// Populate lists
|
||||||
|
forAll(injectorData, injectorI)
|
||||||
|
{
|
||||||
|
if (injectorData[injectorI].size() != INPUT_FILE_COLS)
|
||||||
|
{
|
||||||
|
FatalErrorIn
|
||||||
|
(
|
||||||
|
"ThermoLookupTableInjection"
|
||||||
|
"("
|
||||||
|
"const dictionary&,"
|
||||||
|
"CloudType& owner"
|
||||||
|
")"
|
||||||
|
) << "Incorrect number of entries in injector specification "
|
||||||
|
<< "- found " << injectorData[injectorI].size()
|
||||||
|
<< ", expected " << INPUT_FILE_COLS << ":" << nl
|
||||||
|
<< " x0 x1 x2 u0 u1 u2 d rho mDot T cp"
|
||||||
|
<< nl << exit(FatalError);
|
||||||
|
}
|
||||||
|
x_[injectorI].component(0) = injectorData[injectorI][0];
|
||||||
|
x_[injectorI].component(1) = injectorData[injectorI][1];
|
||||||
|
x_[injectorI].component(2) = injectorData[injectorI][2];
|
||||||
|
U_[injectorI].component(0) = injectorData[injectorI][3];
|
||||||
|
U_[injectorI].component(1) = injectorData[injectorI][4];
|
||||||
|
U_[injectorI].component(2) = injectorData[injectorI][5];
|
||||||
|
d_[injectorI] = injectorData[injectorI][6];
|
||||||
|
rho_[injectorI] = injectorData[injectorI][7];
|
||||||
|
mDot_[injectorI] = injectorData[injectorI][8];
|
||||||
|
T_[injectorI] = injectorData[injectorI][9];
|
||||||
|
cp_[injectorI] = injectorData[injectorI][10];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set/cache the injector cells
|
||||||
|
injectorCells_.setSize(injectorData.size());
|
||||||
|
forAll(x_, injectorI)
|
||||||
|
{
|
||||||
|
this->findCellAtPosition(injectorCells_[injectorI], x_[injectorI]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine volume of particles to inject
|
||||||
|
this->volumeTotal_ = 0.0;
|
||||||
|
forAll(mDot_, injectorI)
|
||||||
|
{
|
||||||
|
this->volumeTotal_ += mDot_[injectorI]/rho_[injectorI];
|
||||||
|
}
|
||||||
|
this->volumeTotal_ *= duration_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
Foam::ThermoLookupTableInjection<CloudType>::~ThermoLookupTableInjection()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
bool Foam::ThermoLookupTableInjection<CloudType>::active() const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
Foam::scalar Foam::ThermoLookupTableInjection<CloudType>::timeEnd() const
|
||||||
|
{
|
||||||
|
return this->SOI_ + duration_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
void Foam::ThermoLookupTableInjection<CloudType>::setPositionAndCell
|
||||||
|
(
|
||||||
|
const label parcelI,
|
||||||
|
const label nParcels,
|
||||||
|
const scalar time,
|
||||||
|
vector& position,
|
||||||
|
label& cellOwner
|
||||||
|
)
|
||||||
|
{
|
||||||
|
label injectorI = parcelI*injectorCells_.size()/nParcels;
|
||||||
|
|
||||||
|
position = x_[injectorI];
|
||||||
|
cellOwner = injectorCells_[injectorI];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
void Foam::ThermoLookupTableInjection<CloudType>::setProperties
|
||||||
|
(
|
||||||
|
const label parcelI,
|
||||||
|
const label nParcels,
|
||||||
|
const scalar,
|
||||||
|
typename CloudType::parcelType* pPtr
|
||||||
|
)
|
||||||
|
{
|
||||||
|
label injectorI = parcelI*injectorCells_.size()/nParcels;
|
||||||
|
|
||||||
|
// set particle velocity
|
||||||
|
pPtr->U() = U_[injectorI];
|
||||||
|
|
||||||
|
// set particle diameter
|
||||||
|
pPtr->d() = d_[injectorI];
|
||||||
|
|
||||||
|
// set particle density
|
||||||
|
pPtr->rho() = rho_[injectorI];
|
||||||
|
|
||||||
|
// set particle temperature
|
||||||
|
pPtr->T() = T_[injectorI];
|
||||||
|
|
||||||
|
// set particle specific heat capacity
|
||||||
|
pPtr->cp() = cp_[injectorI];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
bool Foam::ThermoLookupTableInjection<CloudType>::validInjection(const label)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,202 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by the
|
||||||
|
Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
Class
|
||||||
|
Foam::ThermoLookupTableInjection
|
||||||
|
|
||||||
|
Description
|
||||||
|
Particle injection sources read from look-up table. Each row corresponds to
|
||||||
|
an injection site.
|
||||||
|
|
||||||
|
(
|
||||||
|
(x y z u v w d rho mDot T cp)
|
||||||
|
);
|
||||||
|
|
||||||
|
where:
|
||||||
|
x, y, z = global cartesian co-ordinates [m]
|
||||||
|
u, v, w = global cartesian velocity components [m/s]
|
||||||
|
d = diameter [m]
|
||||||
|
rho = density [kg/m3]
|
||||||
|
mDot = mass flow rate [kg/m3]
|
||||||
|
T = temperature [K]
|
||||||
|
cp = specific heat capacity [J/kg/K]
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
ThermoLookupTableInjection.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef ThermoLookupTableInjection_H
|
||||||
|
#define ThermoLookupTableInjection_H
|
||||||
|
|
||||||
|
#include "InjectionModel.H"
|
||||||
|
#include "pdf.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class ThermoLookupTableInjection Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
class ThermoLookupTableInjection
|
||||||
|
:
|
||||||
|
public InjectionModel<CloudType>
|
||||||
|
{
|
||||||
|
// Private data
|
||||||
|
|
||||||
|
//- Name of file containing injector/parcel data
|
||||||
|
const word inputFileName_;
|
||||||
|
|
||||||
|
//- Injection duration - common to all injection sources
|
||||||
|
const scalar duration_;
|
||||||
|
|
||||||
|
//- Number of parcels per injector - common to all injection sources
|
||||||
|
const label nParcelsPerSecond_;
|
||||||
|
|
||||||
|
//- List of parcel position per injector / [m]
|
||||||
|
List<point> x_;
|
||||||
|
|
||||||
|
//- List of parcel velocity per injector / [m]
|
||||||
|
List<vector> U_;
|
||||||
|
|
||||||
|
//- List of parcel diameter per injector / [m]
|
||||||
|
List<scalar> d_;
|
||||||
|
|
||||||
|
//- List of parcel fluid density pre injector / [kg/m3]
|
||||||
|
List<scalar> rho_;
|
||||||
|
|
||||||
|
//- List of parcel injection mass flow per injector / [kg/s]
|
||||||
|
List<scalar> mDot_;
|
||||||
|
|
||||||
|
//- List of parcel temperature flow per injector / [K]
|
||||||
|
List<scalar> T_;
|
||||||
|
|
||||||
|
//- List of parcel specific heat capacity per injector / [J/kg/K]
|
||||||
|
List<scalar> cp_;
|
||||||
|
|
||||||
|
//- List of injector cells per injector
|
||||||
|
List<label> injectorCells_;
|
||||||
|
|
||||||
|
//- Number of columns expected in input file
|
||||||
|
static label INPUT_FILE_COLS;
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
// Protected member functions
|
||||||
|
|
||||||
|
//- Number of parcels to introduce over the time step relative to SOI
|
||||||
|
label parcelsToInject
|
||||||
|
(
|
||||||
|
const scalar time0,
|
||||||
|
const scalar time1
|
||||||
|
) const;
|
||||||
|
|
||||||
|
//- Volume of parcels to introduce over the time step relative to SOI
|
||||||
|
scalar volumeToInject
|
||||||
|
(
|
||||||
|
const scalar time0,
|
||||||
|
const scalar time1
|
||||||
|
) const;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeName("ThermoLookupTableInjection");
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct from dictionary
|
||||||
|
ThermoLookupTableInjection
|
||||||
|
(
|
||||||
|
const dictionary& dict,
|
||||||
|
CloudType& owner
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
virtual ~ThermoLookupTableInjection();
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
//- Flag to indicate whether model activates injection model
|
||||||
|
bool active() const;
|
||||||
|
|
||||||
|
//- Return the end-of-injection time
|
||||||
|
scalar timeEnd() const;
|
||||||
|
|
||||||
|
|
||||||
|
// Injection geometry
|
||||||
|
|
||||||
|
//- Set the injection position and owner cell
|
||||||
|
virtual void setPositionAndCell
|
||||||
|
(
|
||||||
|
const label parcelI,
|
||||||
|
const label nParcels,
|
||||||
|
const scalar time,
|
||||||
|
vector& position,
|
||||||
|
label& cellOwner
|
||||||
|
);
|
||||||
|
|
||||||
|
virtual void setProperties
|
||||||
|
(
|
||||||
|
const label parcelI,
|
||||||
|
const label nParcels,
|
||||||
|
const scalar time,
|
||||||
|
typename CloudType::parcelType* pPtr
|
||||||
|
);
|
||||||
|
|
||||||
|
virtual bool fullyDescribed() const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Return flag to identify whether or not injection in cellI is
|
||||||
|
// permitted
|
||||||
|
virtual bool validInjection(const label parcelI);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#ifdef NoRepository
|
||||||
|
# include "ThermoLookupTableInjection.C"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
Reference in New Issue
Block a user