fvModels: Simplified structure using fvCellSet member data

which will allow for a run-time selectable and hence extensible fvCellSet in the
future.
This commit is contained in:
Henry Weller
2021-03-09 15:17:32 +00:00
parent e090643f63
commit 252b71f3c6
38 changed files with 329 additions and 612 deletions

View File

@ -86,7 +86,7 @@ void Foam::fv::VoFSolidificationMeltingSource::update() const
const volScalarField CpVoF(thermo.thermo1().Cp()); const volScalarField CpVoF(thermo.thermo1().Cp());
const volScalarField& alphaVoF = thermo.alpha1(); const volScalarField& alphaVoF = thermo.alpha1();
const labelList& cells = this->cells(); const labelList& cells = set_.cells();
forAll(cells, i) forAll(cells, i)
{ {
@ -126,13 +126,14 @@ Foam::word Foam::fv::VoFSolidificationMeltingSource::alphaSolidName() const
Foam::fv::VoFSolidificationMeltingSource::VoFSolidificationMeltingSource Foam::fv::VoFSolidificationMeltingSource::VoFSolidificationMeltingSource
( (
const word& sourceName, const word& name,
const word& modelType, const word& modelType,
const dictionary& dict, const dictionary& dict,
const fvMesh& mesh const fvMesh& mesh
) )
: :
cellSetModel(sourceName, modelType, dict, mesh), fvModel(name, modelType, dict, mesh),
set_(coeffs(), mesh),
alphaSolidT_(), alphaSolidT_(),
L_("L", dimEnergy/dimMass, NaN), L_("L", dimEnergy/dimMass, NaN),
relax_(NaN), relax_(NaN),
@ -218,7 +219,7 @@ void Foam::fv::VoFSolidificationMeltingSource::addSup
scalarField& Sp = eqn.diag(); scalarField& Sp = eqn.diag();
const scalarField& V = mesh().V(); const scalarField& V = mesh().V();
const labelList& cells = this->cells(); const labelList& cells = set_.cells();
forAll(cells, i) forAll(cells, i)
{ {
@ -233,10 +234,20 @@ void Foam::fv::VoFSolidificationMeltingSource::addSup
} }
void Foam::fv::VoFSolidificationMeltingSource::updateMesh
(
const mapPolyMesh& mpm
)
{
set_.updateMesh(mpm);
}
bool Foam::fv::VoFSolidificationMeltingSource::read(const dictionary& dict) bool Foam::fv::VoFSolidificationMeltingSource::read(const dictionary& dict)
{ {
if (cellSetModel::read(dict)) if (fvModel::read(dict))
{ {
set_.read(coeffs());
readCoeffs(); readCoeffs();
return true; return true;
} }

View File

@ -78,9 +78,10 @@ SourceFiles
#ifndef VoFSolidificationMeltingSource_H #ifndef VoFSolidificationMeltingSource_H
#define VoFSolidificationMeltingSource_H #define VoFSolidificationMeltingSource_H
#include "fvModel.H"
#include "fvCellSet.H"
#include "fvMesh.H" #include "fvMesh.H"
#include "volFields.H" #include "volFields.H"
#include "cellSetModel.H"
#include "Function1.H" #include "Function1.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -96,10 +97,13 @@ namespace fv
class VoFSolidificationMeltingSource class VoFSolidificationMeltingSource
: :
public cellSetModel public fvModel
{ {
// Private Data // Private Data
//- The set of cells the fvConstraint applies to
fvCellSet set_;
//- Solid fraction as a function of temperature //- Solid fraction as a function of temperature
autoPtr<Function1<scalar>> alphaSolidT_; autoPtr<Function1<scalar>> alphaSolidT_;
@ -149,7 +153,7 @@ public:
//- Construct from explicit source name and mesh //- Construct from explicit source name and mesh
VoFSolidificationMeltingSource VoFSolidificationMeltingSource
( (
const word& sourceName, const word& name,
const word& modelType, const word& modelType,
const dictionary& dict, const dictionary& dict,
const fvMesh& mesh const fvMesh& mesh
@ -190,6 +194,12 @@ public:
) const; ) const;
// Mesh motion
//- Update for mesh changes
virtual void updateMesh(const mapPolyMesh&);
// IO // IO
//- Read source dictionary //- Read source dictionary

View File

@ -100,7 +100,8 @@ ${typeName}FvModel${SourceType}
const fvMesh& mesh const fvMesh& mesh
) )
: :
cellSetModel(name, modelType, dict, mesh) fvModel(name, modelType, dict, mesh)
set_(coeffs(), mesh),
{ {
if (${verbose:-false}) if (${verbose:-false})
{ {

View File

@ -32,7 +32,8 @@ SourceFiles
#ifndef codedFvModelTemplate_H #ifndef codedFvModelTemplate_H
#define codedFvModelTemplate_H #define codedFvModelTemplate_H
#include "cellSetModel.H" #include "fvModel.H"
#include "fvCellSet.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -48,8 +49,14 @@ namespace fv
class ${typeName}FvModel${SourceType} class ${typeName}FvModel${SourceType}
: :
public cellSetModel public fvModel
{ {
// Private Data
//- The set of cells the fvConstraint applies to
fvCellSet set_;
public: public:
//- Information about the SHA1 of the code itself //- Information about the SHA1 of the code itself

View File

@ -1,4 +1,3 @@
cellSetModel/cellSetModel.C
interRegionModel/interRegionModel.C interRegionModel/interRegionModel.C
general/codedFvModel/codedFvModel.C general/codedFvModel/codedFvModel.C

View File

@ -1,236 +0,0 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2011-2021 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 "cellSetModel.H"
#include "volFields.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
namespace fv
{
defineTypeNameAndDebug(cellSetModel, 0);
}
template<> const char* NamedEnum
<
fv::cellSetModel::selectionModeType,
4
>::names[] =
{
"points",
"cellSet",
"cellZone",
"all"
};
const NamedEnum<fv::cellSetModel::selectionModeType, 4>
fv::cellSetModel::selectionModeTypeNames_;
}
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
void Foam::fv::cellSetModel::readCoeffs()
{
selectionMode_ =
selectionModeTypeNames_.read(coeffs().lookup("selectionMode"));
switch (selectionMode_)
{
case selectionModeType::points:
{
coeffs().lookup("points") >> points_;
break;
}
case selectionModeType::cellSet:
{
coeffs().lookup("cellSet") >> cellSetName_;
break;
}
case selectionModeType::cellZone:
{
coeffs().lookup("cellZone") >> cellSetName_;
break;
}
case selectionModeType::all:
{
break;
}
default:
{
FatalErrorInFunction
<< "Unknown selectionMode "
<< selectionModeTypeNames_[selectionMode_]
<< ". Valid selectionMode types are" << selectionModeTypeNames_
<< exit(FatalError);
}
}
}
void Foam::fv::cellSetModel::setCellSet()
{
Info<< incrIndent;
switch (selectionMode_)
{
case selectionModeType::points:
{
Info<< indent << "- selecting cells using points" << endl;
labelHashSet selectedCells;
forAll(points_, i)
{
label celli = mesh().findCell(points_[i]);
if (celli >= 0)
{
selectedCells.insert(celli);
}
label globalCelli = returnReduce(celli, maxOp<label>());
if (globalCelli < 0)
{
WarningInFunction
<< "Unable to find owner cell for point " << points_[i]
<< endl;
}
}
cells_ = selectedCells.toc();
break;
}
case selectionModeType::cellSet:
{
Info<< indent
<< "- selecting cells using cellSet " << cellSetName_ << endl;
cellSet selectedCells(mesh(), cellSetName_);
cells_ = selectedCells.toc();
break;
}
case selectionModeType::cellZone:
{
Info<< indent
<< "- selecting cells using cellZone " << cellSetName_ << endl;
label zoneID = mesh().cellZones().findZoneID(cellSetName_);
if (zoneID == -1)
{
FatalErrorInFunction
<< "Cannot find cellZone " << cellSetName_ << endl
<< "Valid cellZones are " << mesh().cellZones().names()
<< exit(FatalError);
}
cells_ = mesh().cellZones()[zoneID];
break;
}
case selectionModeType::all:
{
Info<< indent << "- selecting all cells" << endl;
cells_ = identity(mesh().nCells());
break;
}
}
// Set volume information
V_ = 0;
forAll(cells_, i)
{
V_ += mesh().V()[cells_[i]];
}
reduce(V_, sumOp<scalar>());
Info<< indent
<< "- selected " << returnReduce(cells_.size(), sumOp<label>())
<< " cell(s) with volume " << V_ << endl;
Info<< decrIndent;
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::fv::cellSetModel::cellSetModel
(
const word& name,
const word& modelType,
const dictionary& dict,
const fvMesh& mesh
)
:
fvModel(name, modelType, dict, mesh),
selectionMode_(selectionModeType::all),
cellSetName_(word::null),
V_(NaN)
{
readCoeffs();
setCellSet();
}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::fv::cellSetModel::~cellSetModel()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::fv::cellSetModel::updateMesh(const mapPolyMesh&)
{
setCellSet();
}
bool Foam::fv::cellSetModel::movePoints()
{
return true;
}
bool Foam::fv::cellSetModel::read(const dictionary& dict)
{
if (fvModel::read(dict))
{
readCoeffs();
setCellSet();
return true;
}
else
{
return false;
}
}
// ************************************************************************* //

View File

@ -1,201 +0,0 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2011-2021 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::fv::cellSetModel
Description
Cell-set fvModels abstract base class. Provides a base set of controls
regarding the location where the fvModel is applied.
Usage
Example usage:
\verbatim
fvModel1
{
type <fvModelType>
// Apply everywhere
selectionMode all;
// // Apply within a given cell set
// selectionMode cellSet;
// cellSet c0;
// // Apply in cells containing a list of points
// selectionMode points;
// points
// (
// (2.25 0.5 0)
// (2.75 0.5 0)
// );
...
}
\endverbatim
SourceFiles
cellSetModel.C
\*---------------------------------------------------------------------------*/
#ifndef cellSetModel_H
#define cellSetModel_H
#include "fvModel.H"
#include "cellSet.H"
#include "fvMesh.H"
#include "Time.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
namespace fv
{
/*---------------------------------------------------------------------------*\
Class cellSetModel Declaration
\*---------------------------------------------------------------------------*/
class cellSetModel
:
public fvModel
{
public:
// Public data
//- Enumeration for selection mode types
enum class selectionModeType
{
points,
cellSet,
cellZone,
all
};
//- Word list of selection mode type names
static const NamedEnum<selectionModeType, 4>
selectionModeTypeNames_;
private:
// Private data
//- Cell selection mode
selectionModeType selectionMode_;
//- Name of cell set for "cellSet" and "cellZone" selectionMode
word cellSetName_;
//- List of points for "points" selectionMode
List<point> points_;
//- Set of cells to apply source to
mutable labelList cells_;
//- Sum of cell volumes
mutable scalar V_;
// Private functions
//- Non-virtual read
void readCoeffs();
//- Set the cell set based on the user input selection mode
void setCellSet();
public:
//- Runtime type information
TypeName("cellSetModel");
// Constructors
//- Construct from components
cellSetModel
(
const word& name,
const word& modelType,
const dictionary& dict,
const fvMesh& mesh
);
//- Destructor
virtual ~cellSetModel();
// Member Functions
// Access
//- Return const access to the cell selection mode
inline const selectionModeType& selectionMode() const;
//- Return const access to the name of cell set for "cellSet"
// selectionMode
inline const word& cellSetName() const;
//- Return const access to the total cell volume
inline scalar V() const;
//- Return const access to the cell set
inline const labelList& cells() const;
// Mesh changes
//- Update for mesh changes
virtual void updateMesh(const mapPolyMesh&);
//- Update for mesh motion
virtual bool movePoints();
// IO
//- Read source dictionary
virtual bool read(const dictionary& dict);
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace fv
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#include "cellSetModelI.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -1,53 +0,0 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2011-2021 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/>.
\*---------------------------------------------------------------------------*/
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
inline const Foam::fv::cellSetModel::selectionModeType&
Foam::fv::cellSetModel::selectionMode() const
{
return selectionMode_;
}
inline const Foam::word& Foam::fv::cellSetModel::cellSetName() const
{
return cellSetName_;
}
inline Foam::scalar Foam::fv::cellSetModel::V() const
{
return V_;
}
inline const Foam::labelList& Foam::fv::cellSetModel::cells() const
{
return cells_;
}
// ************************************************************************* //

View File

@ -61,7 +61,8 @@ Foam::fv::accelerationSource::accelerationSource
const fvMesh& mesh const fvMesh& mesh
) )
: :
cellSetModel(name, modelType, dict, mesh), fvModel(name, modelType, dict, mesh),
set_(coeffs(), mesh),
UName_(word::null), UName_(word::null),
velocity_(nullptr) velocity_(nullptr)
{ {
@ -110,10 +111,17 @@ void Foam::fv::accelerationSource::addSup
} }
void Foam::fv::accelerationSource::updateMesh(const mapPolyMesh& mpm)
{
set_.updateMesh(mpm);
}
bool Foam::fv::accelerationSource::read(const dictionary& dict) bool Foam::fv::accelerationSource::read(const dictionary& dict)
{ {
if (cellSetModel::read(dict)) if (fvModel::read(dict))
{ {
set_.read(coeffs());
readCoeffs(); readCoeffs();
return true; return true;
} }

View File

@ -58,7 +58,8 @@ SourceFiles
#ifndef accelerationSource_H #ifndef accelerationSource_H
#define accelerationSource_H #define accelerationSource_H
#include "cellSetModel.H" #include "fvModel.H"
#include "fvCellSet.H"
#include "Function1.H" #include "Function1.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -74,10 +75,13 @@ namespace fv
class accelerationSource class accelerationSource
: :
public cellSetModel public fvModel
{ {
// Private Data // Private Data
//- The set of cells the fvConstraint applies to
fvCellSet set_;
//- Name of the velocity field //- Name of the velocity field
word UName_; word UName_;
@ -159,6 +163,12 @@ public:
) const; ) const;
// Mesh motion
//- Update for mesh changes
virtual void updateMesh(const mapPolyMesh&);
// IO // IO
//- Read dictionary //- Read dictionary

View File

@ -40,7 +40,7 @@ void Foam::fv::accelerationSource::add
const vector dU = velocity_->value(t) - velocity_->value(t - dt); const vector dU = velocity_->value(t) - velocity_->value(t - dt);
const vector a = dU/mesh().time().deltaTValue(); const vector a = dU/mesh().time().deltaTValue();
const labelList& cells = this->cells(); const labelList& cells = set_.cells();
forAll(cells, i) forAll(cells, i)
{ {

View File

@ -98,7 +98,8 @@ Foam::fv::actuationDiskSource::actuationDiskSource
const fvMesh& mesh const fvMesh& mesh
) )
: :
cellSetModel(name, modelType, dict, mesh), fvModel(name, modelType, dict, mesh),
set_(coeffs(), mesh),
UName_(word::null), UName_(word::null),
diskDir_(vector::uniform(NaN)), diskDir_(vector::uniform(NaN)),
Cp_(NaN), Cp_(NaN),
@ -129,12 +130,12 @@ void Foam::fv::actuationDiskSource::addSup
vectorField& Usource = eqn.source(); vectorField& Usource = eqn.source();
const vectorField& U = eqn.psi(); const vectorField& U = eqn.psi();
if (V() > vSmall) if (set_.V() > vSmall)
{ {
addActuationDiskAxialInertialResistance addActuationDiskAxialInertialResistance
( (
Usource, Usource,
cells(), set_.cells(),
cellsV, cellsV,
geometricOneField(), geometricOneField(),
U U
@ -154,12 +155,12 @@ void Foam::fv::actuationDiskSource::addSup
vectorField& Usource = eqn.source(); vectorField& Usource = eqn.source();
const vectorField& U = eqn.psi(); const vectorField& U = eqn.psi();
if (V() > vSmall) if (set_.V() > vSmall)
{ {
addActuationDiskAxialInertialResistance addActuationDiskAxialInertialResistance
( (
Usource, Usource,
cells(), set_.cells(),
cellsV, cellsV,
rho, rho,
U U
@ -168,10 +169,17 @@ void Foam::fv::actuationDiskSource::addSup
} }
void Foam::fv::actuationDiskSource::updateMesh(const mapPolyMesh& mpm)
{
set_.updateMesh(mpm);
}
bool Foam::fv::actuationDiskSource::read(const dictionary& dict) bool Foam::fv::actuationDiskSource::read(const dictionary& dict)
{ {
if (cellSetModel::read(dict)) if (fvModel::read(dict))
{ {
set_.read(coeffs());
readCoeffs(); readCoeffs();
return true; return true;
} }

View File

@ -74,7 +74,8 @@ SourceFiles
#ifndef actuationDiskSource_H #ifndef actuationDiskSource_H
#define actuationDiskSource_H #define actuationDiskSource_H
#include "cellSetModel.H" #include "fvModel.H"
#include "fvCellSet.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -89,11 +90,14 @@ namespace fv
class actuationDiskSource class actuationDiskSource
: :
public cellSetModel public fvModel
{ {
protected: protected:
// Protected data // Protected Data
//- The set of cells the fvConstraint applies to
fvCellSet set_;
//- Name of the velocity field //- Name of the velocity field
word UName_; word UName_;
@ -189,6 +193,12 @@ public:
) const; ) const;
// Mesh motion
//- Update for mesh changes
virtual void updateMesh(const mapPolyMesh&);
// IO // IO
//- Read dictionary //- Read dictionary

View File

@ -59,7 +59,7 @@ void Foam::fv::actuationDiskSource::addActuationDiskAxialInertialResistance
forAll(cells, i) forAll(cells, i)
{ {
Usource[cells[i]] += ((Vcells[cells[i]]/V())*T*E) & upU; Usource[cells[i]] += ((Vcells[cells[i]]/set_.V())*T*E) & upU;
} }
} }

View File

@ -65,13 +65,13 @@ void Foam::fv::buoyancyEnergy::readCoeffs()
Foam::fv::buoyancyEnergy::buoyancyEnergy Foam::fv::buoyancyEnergy::buoyancyEnergy
( (
const word& sourceName, const word& name,
const word& modelType, const word& modelType,
const dictionary& dict, const dictionary& dict,
const fvMesh& mesh const fvMesh& mesh
) )
: :
fvModel(sourceName, modelType, dict, mesh), fvModel(name, modelType, dict, mesh),
phaseName_(word::null), phaseName_(word::null),
UName_(word::null) UName_(word::null)
{ {

View File

@ -91,7 +91,7 @@ public:
//- Construct from explicit source name and mesh //- Construct from explicit source name and mesh
buoyancyEnergy buoyancyEnergy
( (
const word& sourceName, const word& name,
const word& modelType, const word& modelType,
const dictionary& dict, const dictionary& dict,
const fvMesh& mesh const fvMesh& mesh

View File

@ -64,13 +64,13 @@ void Foam::fv::buoyancyForce::readCoeffs()
Foam::fv::buoyancyForce::buoyancyForce Foam::fv::buoyancyForce::buoyancyForce
( (
const word& sourceName, const word& name,
const word& modelType, const word& modelType,
const dictionary& dict, const dictionary& dict,
const fvMesh& mesh const fvMesh& mesh
) )
: :
fvModel(sourceName, modelType, dict, mesh), fvModel(name, modelType, dict, mesh),
phaseName_(word::null), phaseName_(word::null),
UName_(word::null), UName_(word::null),
g_ g_

View File

@ -94,7 +94,7 @@ public:
//- Construct from explicit source name and mesh //- Construct from explicit source name and mesh
buoyancyForce buoyancyForce
( (
const word& sourceName, const word& name,
const word& modelType, const word& modelType,
const dictionary& dict, const dictionary& dict,
const fvMesh& mesh const fvMesh& mesh

View File

@ -175,7 +175,8 @@ Foam::fv::effectivenessHeatExchangerSource::effectivenessHeatExchangerSource
const fvMesh& mesh const fvMesh& mesh
) )
: :
cellSetModel(name, modelType, dict, mesh), fvModel(name, modelType, dict, mesh),
set_(coeffs(), mesh),
secondaryMassFlowRate_(NaN), secondaryMassFlowRate_(NaN),
secondaryInletT_(NaN), secondaryInletT_(NaN),
primaryInletT_(NaN), primaryInletT_(NaN),
@ -249,8 +250,10 @@ void Foam::fv::effectivenessHeatExchangerSource::addSup
*(secondaryInletT_ - primaryInletT_) *(secondaryInletT_ - primaryInletT_)
*(CpfMean/faceZoneArea_)*mag(totalphi); *(CpfMean/faceZoneArea_)*mag(totalphi);
const labelList& cells = set_.cells();
const volScalarField& T = mesh().lookupObject<volScalarField>(TName_); const volScalarField& T = mesh().lookupObject<volScalarField>(TName_);
const scalarField TCells(T, cells()); const scalarField TCells(T, cells);
scalar Tref = 0; scalar Tref = 0;
if (Qt > 0) if (Qt > 0)
{ {
@ -263,7 +266,7 @@ void Foam::fv::effectivenessHeatExchangerSource::addSup
reduce(Tref, minOp<scalar>()); reduce(Tref, minOp<scalar>());
} }
scalarField deltaTCells(cells().size(), 0); scalarField deltaTCells(cells.size(), 0);
forAll(deltaTCells, i) forAll(deltaTCells, i)
{ {
if (Qt > 0) if (Qt > 0)
@ -280,15 +283,13 @@ void Foam::fv::effectivenessHeatExchangerSource::addSup
const scalarField& V = mesh().V(); const scalarField& V = mesh().V();
scalar sumWeight = 0; scalar sumWeight = 0;
const labelList& cells = this->cells();
forAll(cells, i) forAll(cells, i)
{ {
sumWeight += V[cells[i]]*mag(U[cells[i]])*deltaTCells[i]; sumWeight += V[cells[i]]*mag(U[cells[i]])*deltaTCells[i];
} }
reduce(sumWeight, sumOp<scalar>()); reduce(sumWeight, sumOp<scalar>());
if (this->V() > vSmall && mag(Qt) > vSmall) if (set_.V() > vSmall && mag(Qt) > vSmall)
{ {
scalarField& heSource = eqn.source(); scalarField& heSource = eqn.source();
@ -310,10 +311,20 @@ void Foam::fv::effectivenessHeatExchangerSource::addSup
} }
void Foam::fv::effectivenessHeatExchangerSource::updateMesh
(
const mapPolyMesh& mpm
)
{
set_.updateMesh(mpm);
}
bool Foam::fv::effectivenessHeatExchangerSource::read(const dictionary& dict) bool Foam::fv::effectivenessHeatExchangerSource::read(const dictionary& dict)
{ {
if (cellSetModel::read(dict)) if (fvModel::read(dict))
{ {
set_.read(coeffs());
readCoeffs(); readCoeffs();
setZone(); setZone();
return true; return true;

View File

@ -95,7 +95,8 @@ SourceFiles
#ifndef effectivenessHeatExchangerSource_H #ifndef effectivenessHeatExchangerSource_H
#define effectivenessHeatExchangerSource_H #define effectivenessHeatExchangerSource_H
#include "cellSetModel.H" #include "fvModel.H"
#include "fvCellSet.H"
#include "Function2.H" #include "Function2.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -111,10 +112,13 @@ namespace fv
class effectivenessHeatExchangerSource class effectivenessHeatExchangerSource
: :
public cellSetModel public fvModel
{ {
// Private data // Private data
//- The set of cells the fvConstraint applies to
fvCellSet set_;
//- Secondary flow mass rate [kg/s] //- Secondary flow mass rate [kg/s]
scalar secondaryMassFlowRate_; scalar secondaryMassFlowRate_;
@ -213,6 +217,9 @@ public:
const word& fieldName const word& fieldName
) const; ) const;
//- Update for mesh changes
virtual void updateMesh(const mapPolyMesh&);
//- Read dictionary //- Read dictionary
virtual bool read(const dictionary& dict); virtual bool read(const dictionary& dict);

View File

@ -66,7 +66,7 @@ void Foam::fv::explicitPorositySource::readCoeffs()
name(), name(),
mesh(), mesh(),
coeffs(), coeffs(),
cellSetName() set_.cellSetName()
).ptr() ).ptr()
); );
} }
@ -83,7 +83,8 @@ Foam::fv::explicitPorositySource::explicitPorositySource
const fvMesh& mesh const fvMesh& mesh
) )
: :
cellSetModel(name, modelType, dict, mesh), fvModel(name, modelType, dict, mesh),
set_(coeffs(), mesh),
UNames_(), UNames_(),
porosityPtr_(nullptr) porosityPtr_(nullptr)
{ {
@ -138,10 +139,17 @@ void Foam::fv::explicitPorositySource::addSup
} }
void Foam::fv::explicitPorositySource::updateMesh(const mapPolyMesh& mpm)
{
set_.updateMesh(mpm);
}
bool Foam::fv::explicitPorositySource::read(const dictionary& dict) bool Foam::fv::explicitPorositySource::read(const dictionary& dict)
{ {
if (cellSetModel::read(dict)) if (fvModel::read(dict))
{ {
set_.read(coeffs());
readCoeffs(); readCoeffs();
return true; return true;
} }

View File

@ -65,7 +65,8 @@ SourceFiles
#ifndef explicitPorositySource_H #ifndef explicitPorositySource_H
#define explicitPorositySource_H #define explicitPorositySource_H
#include "cellSetModel.H" #include "fvModel.H"
#include "fvCellSet.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -84,10 +85,13 @@ namespace fv
class explicitPorositySource class explicitPorositySource
: :
public cellSetModel public fvModel
{ {
// Private data // Private data
//- The set of cells the fvConstraint applies to
fvCellSet set_;
//- Names of the velocity fields //- Names of the velocity fields
wordList UNames_; wordList UNames_;
@ -172,6 +176,12 @@ public:
) const; ) const;
// Mesh motion
//- Update for mesh changes
virtual void updateMesh(const mapPolyMesh&);
// IO // IO
//- Read dictionary //- Read dictionary

View File

@ -123,10 +123,12 @@ void Foam::fv::massSource::addGeneralSupType
const scalar massFlowRate = massFlowRate_->value(t); const scalar massFlowRate = massFlowRate_->value(t);
const Type value = fieldValues_[fieldName]->value<Type>(t); const Type value = fieldValues_[fieldName]->value<Type>(t);
forAll(cells(), i) const labelList& cells = set_.cells();
forAll(cells, i)
{ {
eqn.source()[cells()[i]] -= eqn.source()[cells[i]] -=
mesh().V()[cells()[i]]/V()*massFlowRate*value; mesh().V()[cells[i]]/set_.V()*massFlowRate*value;
} }
} }
@ -148,14 +150,17 @@ void Foam::fv::massSource::addSupType
const word& fieldName const word& fieldName
) const ) const
{ {
const labelList& cells = set_.cells();
if (fieldName == rhoName_) if (fieldName == rhoName_)
{ {
const scalar t = mesh().time().value(); const scalar t = mesh().time().value();
const scalar massFlowRate = massFlowRate_->value(t); const scalar massFlowRate = massFlowRate_->value(t);
forAll(cells(), i) forAll(cells, i)
{ {
eqn.source()[cells()[i]] -= mesh().V()[cells()[i]]/V()*massFlowRate; eqn.source()[cells[i]] -=
mesh().V()[cells[i]]/set_.V()*massFlowRate;
} }
} }
else if (fieldName == heName_ && fieldValues_.found(TName_)) else if (fieldName == heName_ && fieldValues_.found(TName_))
@ -178,13 +183,13 @@ void Foam::fv::massSource::addSupType
); );
const scalarField hs const scalarField hs
( (
thermo.hs(scalarField(cells().size(), T), cells()) thermo.hs(scalarField(cells.size(), T), cells)
); );
forAll(cells(), i) forAll(cells, i)
{ {
eqn.source()[cells()[i]] -= eqn.source()[cells[i]] -=
mesh().V()[cells()[i]]/V()*massFlowRate*hs[i]; mesh().V()[cells[i]]/set_.V()*massFlowRate*hs[i];
} }
} }
else else
@ -229,7 +234,8 @@ Foam::fv::massSource::massSource
const fvMesh& mesh const fvMesh& mesh
) )
: :
cellSetModel(name, modelType, dict, mesh), fvModel(name, modelType, dict, mesh),
set_(coeffs(), mesh),
phaseName_(), phaseName_(),
rhoName_(), rhoName_(),
heName_(), heName_(),
@ -288,10 +294,17 @@ FOR_ALL_FIELD_TYPES(IMPLEMENT_FV_MODEL_ADD_RHO_SUP, fv::massSource);
FOR_ALL_FIELD_TYPES(IMPLEMENT_FV_MODEL_ADD_ALPHA_RHO_SUP, fv::massSource); FOR_ALL_FIELD_TYPES(IMPLEMENT_FV_MODEL_ADD_ALPHA_RHO_SUP, fv::massSource);
void Foam::fv::massSource::updateMesh(const mapPolyMesh& mpm)
{
set_.updateMesh(mpm);
}
bool Foam::fv::massSource::read(const dictionary& dict) bool Foam::fv::massSource::read(const dictionary& dict)
{ {
if (cellSetModel::read(dict)) if (fvModel::read(dict))
{ {
set_.read(coeffs());
readCoeffs(); readCoeffs();
return true; return true;
} }

View File

@ -63,7 +63,8 @@ SourceFiles
#ifndef massSource_H #ifndef massSource_H
#define massSource_H #define massSource_H
#include "cellSetModel.H" #include "fvModel.H"
#include "fvCellSet.H"
#include "HashPtrTable.H" #include "HashPtrTable.H"
#include "objectFunction1.H" #include "objectFunction1.H"
@ -80,10 +81,13 @@ namespace fv
class massSource class massSource
: :
public cellSetModel public fvModel
{ {
// Private Data // Private Data
//- The set of cells the fvConstraint applies to
fvCellSet set_;
//- Name of the phase //- Name of the phase
word phaseName_; word phaseName_;
@ -161,7 +165,7 @@ public:
//- Construct from explicit source name and mesh //- Construct from explicit source name and mesh
massSource massSource
( (
const word& sourceName, const word& name,
const word& modelType, const word& modelType,
const dictionary& dict, const dictionary& dict,
const fvMesh& mesh const fvMesh& mesh
@ -205,6 +209,12 @@ public:
FOR_ALL_FIELD_TYPES(DEFINE_FV_MODEL_ADD_ALPHA_RHO_SUP); FOR_ALL_FIELD_TYPES(DEFINE_FV_MODEL_ADD_ALPHA_RHO_SUP);
// Mesh motion
//- Update for mesh changes
virtual void updateMesh(const mapPolyMesh&);
// IO // IO
//- Read source dictionary //- Read source dictionary

View File

@ -80,12 +80,12 @@ void Foam::fv::radialActuationDiskSource::addSup
vectorField& Usource = eqn.source(); vectorField& Usource = eqn.source();
const vectorField& U = eqn.psi(); const vectorField& U = eqn.psi();
if (V() > vSmall) if (set_.V() > vSmall)
{ {
addRadialActuationDiskAxialInertialResistance addRadialActuationDiskAxialInertialResistance
( (
Usource, Usource,
cells(), set_.cells(),
cellsV, cellsV,
geometricOneField(), geometricOneField(),
U U
@ -105,12 +105,12 @@ void Foam::fv::radialActuationDiskSource::addSup
vectorField& Usource = eqn.source(); vectorField& Usource = eqn.source();
const vectorField& U = eqn.psi(); const vectorField& U = eqn.psi();
if (V() > vSmall) if (set_.V() > vSmall)
{ {
addRadialActuationDiskAxialInertialResistance addRadialActuationDiskAxialInertialResistance
( (
Usource, Usource,
cells(), set_.cells(),
cellsV, cellsV,
rho, rho,
U U

View File

@ -54,7 +54,7 @@ addRadialActuationDiskAxialInertialResistance
const Field<vector> zoneCellCentres(mesh().cellCentres(), cells); const Field<vector> zoneCellCentres(mesh().cellCentres(), cells);
const Field<scalar> zoneCellVolumes(mesh().cellVolumes(), cells); const Field<scalar> zoneCellVolumes(mesh().cellVolumes(), cells);
const vector avgCentre = gSum(zoneCellVolumes*zoneCellCentres)/V(); const vector avgCentre = gSum(zoneCellVolumes*zoneCellCentres)/set_.V();
const scalar maxR = gMax(mag(zoneCellCentres - avgCentre)); const scalar maxR = gMax(mag(zoneCellCentres - avgCentre));
scalar intCoeffs = scalar intCoeffs =
@ -82,7 +82,7 @@ addRadialActuationDiskAxialInertialResistance
*(radialCoeffs_[0] + radialCoeffs_[1]*r2 + radialCoeffs_[2]*sqr(r2)) *(radialCoeffs_[0] + radialCoeffs_[1]*r2 + radialCoeffs_[2]*sqr(r2))
/intCoeffs; /intCoeffs;
Usource[cells[i]] += ((Vcells[cells[i]]/V())*Tr[i]*E) & upU; Usource[cells[i]] += ((Vcells[cells[i]]/set_.V())*Tr[i]*E) & upU;
} }
if (debug) if (debug)

View File

@ -111,11 +111,11 @@ void Foam::fv::rotorDiskSource::readCoeffs()
void Foam::fv::rotorDiskSource::checkData() void Foam::fv::rotorDiskSource::checkData()
{ {
// Set inflow type // Set inflow type
switch (selectionMode()) switch (set_.selectionMode())
{ {
case selectionModeType::cellSet: case fvCellSet::selectionModeType::cellSet:
case selectionModeType::cellZone: case fvCellSet::selectionModeType::cellZone:
case selectionModeType::all: case fvCellSet::selectionModeType::all:
{ {
// Set the profile ID for each blade section // Set the profile ID for each blade section
profiles_.connectBlades(blade_.profileName(), blade_.profileID()); profiles_.connectBlades(blade_.profileName(), blade_.profileID());
@ -151,11 +151,14 @@ void Foam::fv::rotorDiskSource::checkData()
{ {
FatalErrorInFunction FatalErrorInFunction
<< "Source cannot be used with '" << "Source cannot be used with '"
<< selectionModeTypeNames_[selectionMode()] << fvCellSet::selectionModeTypeNames_[set_.selectionMode()]
<< "' mode. Please use one of: " << nl << "' mode. Please use one of: " << nl
<< selectionModeTypeNames_[selectionModeType::cellSet] << nl << fvCellSet::selectionModeTypeNames_
<< selectionModeTypeNames_[selectionModeType::cellZone] << nl [fvCellSet::selectionModeType::cellSet] << nl
<< selectionModeTypeNames_[selectionModeType::all] << fvCellSet::selectionModeTypeNames_
[fvCellSet::selectionModeType::cellZone] << nl
<< fvCellSet::selectionModeTypeNames_
[fvCellSet::selectionModeType::all]
<< exit(FatalError); << exit(FatalError);
} }
} }
@ -177,7 +180,8 @@ void Foam::fv::rotorDiskSource::setFaceArea(vector& axis, const bool correct)
// Calculate cell addressing for selected cells // Calculate cell addressing for selected cells
labelList cellAddr(mesh().nCells(), -1); labelList cellAddr(mesh().nCells(), -1);
UIndirectList<label>(cellAddr, cells()) = identity(cells().size()); UIndirectList<label>(cellAddr, set_.cells()) =
identity(set_.cells().size());
labelList nbrFaceCellAddr(mesh().nFaces() - nInternalFaces, -1); labelList nbrFaceCellAddr(mesh().nFaces() - nInternalFaces, -1);
forAll(pbm, patchi) forAll(pbm, patchi)
{ {
@ -288,7 +292,7 @@ void Foam::fv::rotorDiskSource::setFaceArea(vector& axis, const bool correct)
mesh(), mesh(),
dimensionedScalar(dimArea, 0) dimensionedScalar(dimArea, 0)
); );
UIndirectList<scalar>(area.primitiveField(), cells()) = area_; UIndirectList<scalar>(area.primitiveField(), set_.cells()) = area_;
Info<< type() << ": " << name() << " writing field " << area.name() Info<< type() << ": " << name() << " writing field " << area.name()
<< endl; << endl;
@ -317,7 +321,7 @@ void Foam::fv::rotorDiskSource::createCoordinateSystem()
const scalarField& V = mesh().V(); const scalarField& V = mesh().V();
const vectorField& C = mesh().C(); const vectorField& C = mesh().C();
const labelList& cells = this->cells(); const labelList& cells = set_.cells();
forAll(cells, i) forAll(cells, i)
{ {
@ -398,7 +402,7 @@ void Foam::fv::rotorDiskSource::createCoordinateSystem()
( (
axis, axis,
origin, origin,
UIndirectList<vector>(mesh().C(), this->cells())() UIndirectList<vector>(mesh().C(), set_.cells())()
) )
); );
@ -433,7 +437,7 @@ void Foam::fv::rotorDiskSource::constructGeometry()
{ {
const vectorField& C = mesh().C(); const vectorField& C = mesh().C();
const labelList& cells = this->cells(); const labelList& cells = set_.cells();
forAll(cells, i) forAll(cells, i)
{ {
@ -509,7 +513,8 @@ Foam::fv::rotorDiskSource::rotorDiskSource
const fvMesh& mesh const fvMesh& mesh
) )
: :
cellSetModel(name, modelType, dict, mesh), fvModel(name, modelType, dict, mesh),
set_(coeffs(), mesh),
UName_(word::null), UName_(word::null),
omega_(0), omega_(0),
nBlades_(0), nBlades_(0),
@ -517,10 +522,10 @@ Foam::fv::rotorDiskSource::rotorDiskSource
inletVelocity_(Zero), inletVelocity_(Zero),
tipEffect_(1), tipEffect_(1),
flap_(), flap_(),
x_(cells().size(), Zero), x_(set_.cells().size(), Zero),
R_(cells().size(), I), R_(set_.cells().size(), I),
invR_(cells().size(), I), invR_(set_.cells().size(), I),
area_(cells().size(), Zero), area_(set_.cells().size(), Zero),
coordSys_("rotorCoordSys", vector::zero, axesRotation(sphericalTensor::I)), coordSys_("rotorCoordSys", vector::zero, axesRotation(sphericalTensor::I)),
cylindrical_(), cylindrical_(),
rMax_(0), rMax_(0),
@ -625,10 +630,17 @@ void Foam::fv::rotorDiskSource::addSup
} }
void Foam::fv::rotorDiskSource::updateMesh(const mapPolyMesh& mpm)
{
set_.updateMesh(mpm);
}
bool Foam::fv::rotorDiskSource::read(const dictionary& dict) bool Foam::fv::rotorDiskSource::read(const dictionary& dict)
{ {
if (cellSetModel::read(dict)) if (fvModel::read(dict))
{ {
set_.read(coeffs());
readCoeffs(); readCoeffs();
return true; return true;
} }

View File

@ -100,7 +100,8 @@ SourceFiles
#ifndef rotorDiskSource_H #ifndef rotorDiskSource_H
#define rotorDiskSource_H #define rotorDiskSource_H
#include "cellSetModel.H" #include "fvModel.H"
#include "fvCellSet.H"
#include "cylindricalCS.H" #include "cylindricalCS.H"
#include "cylindrical.H" #include "cylindrical.H"
#include "NamedEnum.H" #include "NamedEnum.H"
@ -125,7 +126,7 @@ namespace fv
class rotorDiskSource class rotorDiskSource
: :
public cellSetModel public fvModel
{ {
public: public:
@ -145,7 +146,7 @@ public:
static const NamedEnum<inletFlowType, 3> inletFlowTypeNames_; static const NamedEnum<inletFlowType, 3> inletFlowTypeNames_;
protected: private:
// Helper structures to encapsulate flap and trim data // Helper structures to encapsulate flap and trim data
// Note: all input in degrees (converted to radians internally) // Note: all input in degrees (converted to radians internally)
@ -158,7 +159,10 @@ protected:
}; };
// Protected data // Private data
//- The set of cells the fvConstraint applies to
fvCellSet set_;
//- Name of the velocity field //- Name of the velocity field
word UName_; word UName_;
@ -282,6 +286,8 @@ public:
// Positive anti-clockwise when looking along -ve lift direction // Positive anti-clockwise when looking along -ve lift direction
inline scalar omega() const; inline scalar omega() const;
inline const fvCellSet& set() const;
//- Return the cell centre positions in local rotor frame //- Return the cell centre positions in local rotor frame
// (Cylindrical r, theta, z) // (Cylindrical r, theta, z)
inline const List<point>& x() const; inline const List<point>& x() const;
@ -330,6 +336,12 @@ public:
) const; ) const;
// Mesh motion
//- Update for mesh changes
virtual void updateMesh(const mapPolyMesh&);
// IO // IO
//- Read source dictionary //- Read source dictionary

View File

@ -27,25 +27,31 @@ License
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
Foam::scalar Foam::fv::rotorDiskSource::rhoRef() const inline Foam::scalar Foam::fv::rotorDiskSource::rhoRef() const
{ {
return rhoRef_; return rhoRef_;
} }
Foam::scalar Foam::fv::rotorDiskSource::omega() const inline Foam::scalar Foam::fv::rotorDiskSource::omega() const
{ {
return omega_; return omega_;
} }
const Foam::List<Foam::point>& Foam::fv::rotorDiskSource::x() const inline const Foam::fvCellSet& Foam::fv::rotorDiskSource::set() const
{
return set_;
}
inline const Foam::List<Foam::point>& Foam::fv::rotorDiskSource::x() const
{ {
return x_; return x_;
} }
const Foam::coordinateSystems::cylindrical& inline const Foam::coordinateSystems::cylindrical&
Foam::fv::rotorDiskSource::coordSys() const Foam::fv::rotorDiskSource::coordSys() const
{ {
return coordSys_; return coordSys_;

View File

@ -51,7 +51,7 @@ void Foam::fv::rotorDiskSource::calculate
scalar AOAmax = -great; scalar AOAmax = -great;
scalar powerEff = 0; scalar powerEff = 0;
const labelList& cells = this->cells(); const labelList& cells = set_.cells();
forAll(cells, i) forAll(cells, i)
{ {
@ -187,13 +187,13 @@ void Foam::fv::rotorDiskSource::writeField
Field<Type>& field = tfield.ref().primitiveFieldRef(); Field<Type>& field = tfield.ref().primitiveFieldRef();
if (cells().size() != values.size()) const labelList& cells = set_.cells();
if (cells.size() != values.size())
{ {
FatalErrorInFunction << abort(FatalError); FatalErrorInFunction << abort(FatalError);
} }
const labelList& cells = this->cells();
forAll(cells, i) forAll(cells, i)
{ {
field[cells[i]] = values[i]; field[cells[i]] = values[i];

View File

@ -49,7 +49,7 @@ Foam::fixedTrim::fixedTrim
) )
: :
trimModel(rotor, dict, typeName), trimModel(rotor, dict, typeName),
thetag_(rotor.cells().size(), 0.0) thetag_(rotor.set().cells().size(), 0.0)
{ {
read(dict); read(dict);
} }

View File

@ -52,7 +52,7 @@ Foam::vector Foam::targetCoeffTrim::calcCoeffs
{ {
rotor_.calculate(rho, U, thetag, force, false, false); rotor_.calculate(rho, U, thetag, force, false, false);
const labelList& cells = rotor_.cells(); const labelList& cells = rotor_.set().cells();
const vectorField& C = rotor_.mesh().C(); const vectorField& C = rotor_.mesh().C();
const List<point>& x = rotor_.x(); const List<point>& x = rotor_.x();

View File

@ -176,7 +176,7 @@ void Foam::fv::solidificationMeltingSource::update
const volScalarField& T = mesh().lookupObject<volScalarField>(TName_); const volScalarField& T = mesh().lookupObject<volScalarField>(TName_);
const labelList& cells = this->cells(); const labelList& cells = set_.cells();
forAll(cells, i) forAll(cells, i)
{ {
@ -218,13 +218,14 @@ void Foam::fv::solidificationMeltingSource::update
Foam::fv::solidificationMeltingSource::solidificationMeltingSource Foam::fv::solidificationMeltingSource::solidificationMeltingSource
( (
const word& sourceName, const word& name,
const word& modelType, const word& modelType,
const dictionary& dict, const dictionary& dict,
const fvMesh& mesh const fvMesh& mesh
) )
: :
cellSetModel(sourceName, modelType, dict, mesh), fvModel(name, modelType, dict, mesh),
set_(coeffs(), mesh),
Tsol_(NaN), Tsol_(NaN),
Tliq_(NaN), Tliq_(NaN),
alpha1e_(NaN), alpha1e_(NaN),
@ -243,7 +244,7 @@ Foam::fv::solidificationMeltingSource::solidificationMeltingSource
( (
IOobject IOobject
( (
name() + ":alpha1", this->name() + ":alpha1",
mesh.time().timeName(), mesh.time().timeName(),
mesh, mesh,
IOobject::READ_IF_PRESENT, IOobject::READ_IF_PRESENT,
@ -254,7 +255,7 @@ Foam::fv::solidificationMeltingSource::solidificationMeltingSource
zeroGradientFvPatchScalarField::typeName zeroGradientFvPatchScalarField::typeName
), ),
curTimeIndex_(-1), curTimeIndex_(-1),
deltaT_(cells().size(), 0) deltaT_(set_.cells().size(), 0)
{ {
readCoeffs(); readCoeffs();
} }
@ -325,7 +326,7 @@ void Foam::fv::solidificationMeltingSource::addSup
vectorField& Su = eqn.source(); vectorField& Su = eqn.source();
const scalarField& V = mesh().V(); const scalarField& V = mesh().V();
const labelList& cells = this->cells(); const labelList& cells = set_.cells();
forAll(cells, i) forAll(cells, i)
{ {
@ -355,10 +356,17 @@ void Foam::fv::solidificationMeltingSource::addSup
} }
void Foam::fv::solidificationMeltingSource::updateMesh(const mapPolyMesh& mpm)
{
set_.updateMesh(mpm);
}
bool Foam::fv::solidificationMeltingSource::read(const dictionary& dict) bool Foam::fv::solidificationMeltingSource::read(const dictionary& dict)
{ {
if (cellSetModel::read(dict)) if (fvModel::read(dict))
{ {
set_.read(coeffs());
readCoeffs(); readCoeffs();
return true; return true;
} }

View File

@ -120,9 +120,10 @@ SourceFiles
#ifndef solidificationMeltingSource_H #ifndef solidificationMeltingSource_H
#define solidificationMeltingSource_H #define solidificationMeltingSource_H
#include "fvModel.H"
#include "fvCellSet.H"
#include "fvMesh.H" #include "fvMesh.H"
#include "volFields.H" #include "volFields.H"
#include "cellSetModel.H"
#include "NamedEnum.H" #include "NamedEnum.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -138,7 +139,7 @@ namespace fv
class solidificationMeltingSource class solidificationMeltingSource
: :
public cellSetModel public fvModel
{ {
public: public:
@ -155,6 +156,9 @@ private:
// Private Data // Private Data
//- The set of cells the fvConstraint applies to
fvCellSet set_;
//- Temperature at which isotherm melting occurs //- Temperature at which isotherm melting occurs
// and not isotherm melting starts e.g. eutectic [K] // and not isotherm melting starts e.g. eutectic [K]
scalar Tsol_; scalar Tsol_;
@ -240,7 +244,7 @@ public:
//- Construct from explicit source name and mesh //- Construct from explicit source name and mesh
solidificationMeltingSource solidificationMeltingSource
( (
const word& sourceName, const word& name,
const word& modelType, const word& modelType,
const dictionary& dict, const dictionary& dict,
const fvMesh& mesh const fvMesh& mesh
@ -298,6 +302,12 @@ public:
) const; ) const;
// Mesh motion
//- Update for mesh changes
virtual void updateMesh(const mapPolyMesh&);
// IO // IO
//- Read source dictionary //- Read source dictionary

View File

@ -238,7 +238,8 @@ Foam::fv::codedFvModel::codedFvModel
const fvMesh& mesh const fvMesh& mesh
) )
: :
cellSetModel(name, modelType, dict, mesh), fvModel(name, modelType, dict, mesh),
set_(coeffs(), mesh),
fieldName_(word::null) fieldName_(word::null)
{ {
readCoeffs(); readCoeffs();
@ -262,10 +263,17 @@ FOR_ALL_FIELD_TYPES(IMPLEMENT_FV_MODEL_ADD_RHO_SUP, fv::codedFvModel);
FOR_ALL_FIELD_TYPES(IMPLEMENT_FV_MODEL_ADD_ALPHA_RHO_SUP, fv::codedFvModel); FOR_ALL_FIELD_TYPES(IMPLEMENT_FV_MODEL_ADD_ALPHA_RHO_SUP, fv::codedFvModel);
void Foam::fv::codedFvModel::updateMesh(const mapPolyMesh& mpm)
{
set_.updateMesh(mpm);
}
bool Foam::fv::codedFvModel::read(const dictionary& dict) bool Foam::fv::codedFvModel::read(const dictionary& dict)
{ {
if (cellSetModel::read(dict)) if (fvModel::read(dict))
{ {
set_.read(coeffs());
readCoeffs(); readCoeffs();
return true; return true;
} }

View File

@ -73,7 +73,8 @@ SourceFiles
#ifndef codedFvModel_H #ifndef codedFvModel_H
#define codedFvModel_H #define codedFvModel_H
#include "cellSetModel.H" #include "fvModel.H"
#include "fvCellSet.H"
#include "codedBase.H" #include "codedBase.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -89,7 +90,7 @@ namespace fv
class codedFvModel class codedFvModel
: :
public cellSetModel, public fvModel,
public codedBase public codedBase
{ {
// Private static data // Private static data
@ -100,6 +101,9 @@ class codedFvModel
// Private data // Private data
//- The set of cells the fvConstraint applies to
fvCellSet set_;
//- The name //- The name
word name_; word name_;
@ -209,6 +213,12 @@ public:
FOR_ALL_FIELD_TYPES(DEFINE_FV_MODEL_ADD_ALPHA_RHO_SUP); FOR_ALL_FIELD_TYPES(DEFINE_FV_MODEL_ADD_ALPHA_RHO_SUP);
// Mesh motion
//- Update for mesh changes
virtual void updateMesh(const mapPolyMesh&);
// IO // IO
//- Read source dictionary //- Read source dictionary

View File

@ -39,7 +39,7 @@ namespace Foam
addToRunTimeSelectionTable addToRunTimeSelectionTable
( (
cellSetModel, fvModel,
semiImplicitSource, semiImplicitSource,
dictionary dictionary
); );
@ -68,7 +68,7 @@ void Foam::fv::semiImplicitSource::readCoeffs()
switch (volumeMode_) switch (volumeMode_)
{ {
case volumeMode::absolute: case volumeMode::absolute:
VDash_ = V(); VDash_ = set_.V();
break; break;
case volumeMode::specific: case volumeMode::specific:
VDash_ = 1; VDash_ = 1;
@ -143,7 +143,7 @@ void Foam::fv::semiImplicitSource::addSupType
); );
// Explicit source function for the field // Explicit source function for the field
UIndirectList<Type>(Su, cells()) = UIndirectList<Type>(Su, set_.cells()) =
fieldSu_[fieldName]->value<Type>(t)/VDash_; fieldSu_[fieldName]->value<Type>(t)/VDash_;
volScalarField::Internal Sp volScalarField::Internal Sp
@ -167,7 +167,7 @@ void Foam::fv::semiImplicitSource::addSupType
); );
// Implicit source function for the field // Implicit source function for the field
UIndirectList<scalar>(Sp, cells()) = UIndirectList<scalar>(Sp, set_.cells()) =
fieldSp_[fieldName]->value(t)/VDash_; fieldSp_[fieldName]->value(t)/VDash_;
eqn += Su + fvm::SuSp(Sp, psi); eqn += Su + fvm::SuSp(Sp, psi);
@ -209,7 +209,8 @@ Foam::fv::semiImplicitSource::semiImplicitSource
const fvMesh& mesh const fvMesh& mesh
) )
: :
cellSetModel(name, modelType, dict, mesh), fvModel(name, modelType, dict, mesh),
set_(coeffs(), mesh),
volumeMode_(volumeMode::absolute), volumeMode_(volumeMode::absolute),
VDash_(1) VDash_(1)
{ {
@ -244,10 +245,17 @@ FOR_ALL_FIELD_TYPES
); );
void Foam::fv::semiImplicitSource::updateMesh(const mapPolyMesh& mpm)
{
set_.updateMesh(mpm);
}
bool Foam::fv::semiImplicitSource::read(const dictionary& dict) bool Foam::fv::semiImplicitSource::read(const dictionary& dict)
{ {
if (cellSetModel::read(dict)) if (fvModel::read(dict))
{ {
set_.read(coeffs());
readCoeffs(); readCoeffs();
return true; return true;
} }

View File

@ -92,7 +92,8 @@ SourceFiles
#ifndef semiImplicitSource_H #ifndef semiImplicitSource_H
#define semiImplicitSource_H #define semiImplicitSource_H
#include "cellSetModel.H" #include "fvModel.H"
#include "fvCellSet.H"
#include "HashPtrTable.H" #include "HashPtrTable.H"
#include "objectFunction1.H" #include "objectFunction1.H"
@ -109,7 +110,7 @@ namespace fv
class semiImplicitSource class semiImplicitSource
: :
public cellSetModel public fvModel
{ {
public: public:
@ -130,6 +131,9 @@ private:
// Private member data // Private member data
//- The set of cells the fvConstraint applies to
fvCellSet set_;
//- Volume mode //- Volume mode
volumeMode volumeMode_; volumeMode volumeMode_;
@ -217,6 +221,12 @@ public:
FOR_ALL_FIELD_TYPES(DEFINE_FV_MODEL_ADD_ALPHA_RHO_SUP); FOR_ALL_FIELD_TYPES(DEFINE_FV_MODEL_ADD_ALPHA_RHO_SUP);
// Mesh motion
//- Update for mesh changes
virtual void updateMesh(const mapPolyMesh&);
// IO // IO
//- Read source dictionary //- Read source dictionary