mirror of
https://github.com/ParticulateFlow/CFDEMcoupling-PFM.git
synced 2025-12-08 06:37:44 +00:00
test concept for centralized per-particle properties
register any per-particle properties (here: cellsPerParticle_ of voidFractionModel) in hashtables in cfdemCloud class and in further consequence handle access to per-particle data pointers centrally
This commit is contained in:
@ -160,6 +160,8 @@ cfdemCloud::cfdemCloud
|
||||
turbulenceModelType_
|
||||
)
|
||||
),
|
||||
intParticleProperties(8),
|
||||
doubleParticleProperties(8),
|
||||
dataExchangeModel_
|
||||
(
|
||||
dataExchangeModel::New
|
||||
@ -402,6 +404,25 @@ cfdemCloud::~cfdemCloud()
|
||||
if(getParticleDensities_) dataExchangeM().destroy(particleDensities_,1);
|
||||
if(getParticleEffVolFactors_) dataExchangeM().destroy(particleEffVolFactors_,1);
|
||||
if(getParticleTypes_) dataExchangeM().destroy(particleTypes_,1);
|
||||
|
||||
for
|
||||
(
|
||||
HashTable<int**>::iterator iter = intParticleProperties.begin();
|
||||
iter != intParticleProperties.end();
|
||||
++iter
|
||||
)
|
||||
{
|
||||
dataExchangeM().destroy(*iter,-1);
|
||||
}
|
||||
for
|
||||
(
|
||||
HashTable<double**>::iterator iter = doubleParticleProperties.begin();
|
||||
iter != doubleParticleProperties.end();
|
||||
++iter
|
||||
)
|
||||
{
|
||||
dataExchangeM().destroy(*iter,-1);
|
||||
}
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * * * * private Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
@ -188,6 +188,9 @@ protected:
|
||||
|
||||
const turbulenceModel& turbulence_;
|
||||
|
||||
HashTable<int**> intParticleProperties;
|
||||
HashTable<double**> doubleParticleProperties;
|
||||
|
||||
autoPtr<dataExchangeModel> dataExchangeModel_;
|
||||
|
||||
PtrList<forceModel> forceModel_;
|
||||
@ -443,6 +446,14 @@ public:
|
||||
void otherForces(volVectorField&);
|
||||
|
||||
bool checkPeriodicCells() const { return checkPeriodicCells_; }
|
||||
|
||||
template<typename T>
|
||||
void registerParticleVectorProperty(const word& property);
|
||||
template<typename T>
|
||||
T**& getParticleVectorPropertyRef(const word& property);
|
||||
protected:
|
||||
virtual int**& getParticleVectorPropertyImpl(const word& property, int**);
|
||||
virtual double**& getParticleVectorPropertyImpl(const word& property, double**);
|
||||
};
|
||||
|
||||
|
||||
|
||||
@ -403,5 +403,40 @@ inline const turbulenceModel& cfdemCloud::turbulence() const
|
||||
return turbulence_;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void cfdemCloud::registerParticleVectorProperty(const word& property)
|
||||
{
|
||||
FatalError << "Trying to register particle vector property of unsupported type" << endl;
|
||||
}
|
||||
|
||||
template<> inline
|
||||
void cfdemCloud::registerParticleVectorProperty<int>(const word& property)
|
||||
{
|
||||
intParticleProperties.insert(property, (int**)NULL);
|
||||
}
|
||||
|
||||
template<> inline
|
||||
void cfdemCloud::registerParticleVectorProperty<double>(const word& property)
|
||||
{
|
||||
doubleParticleProperties.insert(property, (double**)NULL);
|
||||
}
|
||||
|
||||
|
||||
template<typename T>
|
||||
T**& cfdemCloud::getParticleVectorPropertyRef(const word& property)
|
||||
{
|
||||
return getParticleVectorPropertyImpl(property, (T**)NULL);
|
||||
}
|
||||
|
||||
inline int**& cfdemCloud::getParticleVectorPropertyImpl(const word& property, int**)
|
||||
{
|
||||
return intParticleProperties[property];
|
||||
}
|
||||
|
||||
inline double**& cfdemCloud::getParticleVectorPropertyImpl(const word& property, double**)
|
||||
{
|
||||
return doubleParticleProperties[property];
|
||||
}
|
||||
|
||||
}
|
||||
// ************************************************************************* //
|
||||
|
||||
@ -103,12 +103,12 @@ void GaussVoidFraction::setvoidFraction(double** const& mask,double**& voidfract
|
||||
//if(mask[index][0])
|
||||
//{
|
||||
//reset
|
||||
for(int subcell=0;subcell<cellsPerParticle_[index][0];subcell++)
|
||||
for(int subcell=0;subcell<cellsPerParticle()[index][0];subcell++)
|
||||
{
|
||||
particleWeights[index][subcell]=0;
|
||||
particleVolumes[index][subcell]=0;
|
||||
}
|
||||
cellsPerParticle_[index][0]=1;
|
||||
cellsPerParticle()[index][0]=1;
|
||||
particleV[index][0]=0;
|
||||
|
||||
//collecting data
|
||||
@ -142,7 +142,7 @@ void GaussVoidFraction::setvoidFraction(double** const& mask,double**& voidfract
|
||||
}
|
||||
else if (hashSetLength > 0)
|
||||
{
|
||||
cellsPerParticle_[index][0]=hashSetLength;
|
||||
cellsPerParticle()[index][0]=hashSetLength;
|
||||
|
||||
//making sure that the cell containing the center is the first subcell
|
||||
particleCloud_.cellIDs()[index][0]=particleCenterCellID;
|
||||
@ -200,7 +200,7 @@ void GaussVoidFraction::setvoidFraction(double** const& mask,double**& voidfract
|
||||
//bringing eulerian field to particle array
|
||||
for(label index=0; index< particleCloud_.numberOfParticles(); index++)
|
||||
{
|
||||
for(label subcell=0;subcell<cellsPerParticle_[index][0];subcell++)
|
||||
for(label subcell=0;subcell<cellsPerParticle()[index][0];subcell++)
|
||||
{
|
||||
label cellID = particleCloud_.cellIDs()[index][subcell];
|
||||
|
||||
|
||||
@ -100,13 +100,13 @@ void IBVoidFraction::setvoidFraction(double** const& mask,double**& voidfraction
|
||||
//if(mask[index][0])
|
||||
//{
|
||||
//reset
|
||||
for (int subcell=0; subcell < cellsPerParticle_[index][0]; subcell++)
|
||||
for (int subcell=0; subcell < cellsPerParticle()[index][0]; subcell++)
|
||||
{
|
||||
particleWeights[index][subcell] = 0.0;
|
||||
particleVolumes[index][subcell] = 0.0;
|
||||
}
|
||||
|
||||
cellsPerParticle_[index][0]=1;
|
||||
cellsPerParticle()[index][0]=1;
|
||||
particleV[index][0]=0;
|
||||
|
||||
//collecting data
|
||||
@ -266,7 +266,7 @@ void IBVoidFraction::setvoidFraction(double** const& mask,double**& voidfraction
|
||||
}
|
||||
else if (hashSetLength > 0)
|
||||
{
|
||||
cellsPerParticle_[index][0]=hashSetLength;
|
||||
cellsPerParticle()[index][0]=hashSetLength;
|
||||
hashSett.erase(particleCenterCellID);
|
||||
|
||||
for (label i=0; i < hashSetLength-1; i++)
|
||||
@ -281,7 +281,7 @@ void IBVoidFraction::setvoidFraction(double** const& mask,double**& voidfraction
|
||||
|
||||
for (label index=0; index < particleCloud_.numberOfParticles(); index++)
|
||||
{
|
||||
for (label subcell=0; subcell < cellsPerParticle_[index][0]; subcell++)
|
||||
for (label subcell=0; subcell < cellsPerParticle()[index][0]; subcell++)
|
||||
{
|
||||
label cellID = particleCloud_.cellIDs()[index][subcell];
|
||||
|
||||
|
||||
@ -102,12 +102,12 @@ void bigParticleVoidFraction::setvoidFraction(double** const& mask,double**& voi
|
||||
//if(mask[index][0])
|
||||
//{
|
||||
//reset
|
||||
for(int subcell=0;subcell<cellsPerParticle_[index][0];subcell++)
|
||||
for(int subcell=0;subcell<cellsPerParticle()[index][0];subcell++)
|
||||
{
|
||||
particleWeights[index][subcell]=0;
|
||||
particleVolumes[index][subcell]=0;
|
||||
}
|
||||
cellsPerParticle_[index][0]=1;
|
||||
cellsPerParticle()[index][0]=1;
|
||||
particleV[index][0]=0;
|
||||
|
||||
//collecting data
|
||||
@ -137,7 +137,7 @@ void bigParticleVoidFraction::setvoidFraction(double** const& mask,double**& voi
|
||||
}
|
||||
else if (hashSetLength > 0)
|
||||
{
|
||||
cellsPerParticle_[index][0]=hashSetLength;
|
||||
cellsPerParticle()[index][0]=hashSetLength;
|
||||
|
||||
//making sure that the cell containing the center is the first subcell
|
||||
particleCloud_.cellIDs()[index][0]=particleCenterCellID;
|
||||
@ -190,7 +190,7 @@ void bigParticleVoidFraction::setvoidFraction(double** const& mask,double**& voi
|
||||
//bringing eulerian field to particle array
|
||||
for(label index=0; index< particleCloud_.numberOfParticles(); index++)
|
||||
{
|
||||
for(label subcell=0;subcell<cellsPerParticle_[index][0];subcell++)
|
||||
for(label subcell=0;subcell<cellsPerParticle()[index][0];subcell++)
|
||||
{
|
||||
label cellID = particleCloud_.cellIDs()[index][subcell];
|
||||
|
||||
|
||||
@ -93,7 +93,7 @@ void centreVoidFraction::setvoidFraction(double** const& mask,double**& voidfrac
|
||||
//{
|
||||
// reset
|
||||
particleWeights[index][0]=0;
|
||||
cellsPerParticle_[index][0]=1;
|
||||
cellsPerParticle()[index][0]=1;
|
||||
|
||||
label cellI = particleCloud_.cellIDs()[index][0];
|
||||
|
||||
@ -128,9 +128,9 @@ void centreVoidFraction::setvoidFraction(double** const& mask,double**& voidfrac
|
||||
if (index==0)
|
||||
{
|
||||
Info << "centre cellI = " << cellI << endl;
|
||||
Info << "cellsPerParticle_=" << cellsPerParticle_[index][0] << endl;
|
||||
Info << "cellsPerParticle =" << cellsPerParticle()[index][0] << endl;
|
||||
|
||||
for(int i=0;i<cellsPerParticle_[index][0];i++)
|
||||
for(int i=0;i<cellsPerParticle()[index][0];i++)
|
||||
{
|
||||
if(i==0)Info << "cellids, voidfractions, particleWeights, : \n";
|
||||
Info << particleCloud_.cellIDs()[index][i] << " ," << endl;
|
||||
|
||||
@ -180,14 +180,14 @@ void dividedVoidFraction::setvoidFraction(double** const& mask,double**& voidfra
|
||||
//{
|
||||
// reset
|
||||
|
||||
for (int subcell=0; subcell < cellsPerParticle_[index][0]; subcell++)
|
||||
for (int subcell=0; subcell < cellsPerParticle()[index][0]; subcell++)
|
||||
{
|
||||
particleWeights[index][subcell] = 0.;
|
||||
particleVolumes[index][subcell] = 0.;
|
||||
}
|
||||
particleV[index][0] = 0.;
|
||||
|
||||
cellsPerParticle_[index][0] = 1;
|
||||
cellsPerParticle()[index][0] = 1;
|
||||
position = particleCloud_.position(index);
|
||||
cellID = particleCloud_.cellIDs()[index][0];
|
||||
radius = particleCloud_.radius(index);
|
||||
@ -270,7 +270,7 @@ void dividedVoidFraction::setvoidFraction(double** const& mask,double**& voidfra
|
||||
for(int index=0; index < particleCloud_.numberOfParticles(); index++)
|
||||
{
|
||||
{
|
||||
for (int subcell=0; subcell < cellsPerParticle_[index][0]; subcell++)
|
||||
for (int subcell=0; subcell < cellsPerParticle()[index][0]; subcell++)
|
||||
{
|
||||
label cellID = particleCloud_.cellIDs()[index][subcell];
|
||||
|
||||
|
||||
@ -49,7 +49,7 @@
|
||||
// add sub particle representation
|
||||
bool createNew = true;
|
||||
label storeInIndex=0;
|
||||
for(int i=0; i < cellsPerParticle_[index][0] ; i++)
|
||||
for(int i=0; i < cellsPerParticle()[index][0] ; i++)
|
||||
{
|
||||
if(partCellId == particleCloud_.cellIDs()[index][i])
|
||||
{
|
||||
@ -61,8 +61,8 @@
|
||||
|
||||
if(createNew)
|
||||
{
|
||||
cellsPerParticle_[index][0] ++;
|
||||
storeInIndex = cellsPerParticle_[index][0]-1;
|
||||
cellsPerParticle()[index][0] ++;
|
||||
storeInIndex = cellsPerParticle()[index][0]-1;
|
||||
particleCloud_.cellIDs()[index][storeInIndex] = partCellId;
|
||||
|
||||
}
|
||||
|
||||
@ -131,7 +131,7 @@ void trilinearVoidFraction::setvoidFraction(double** const& mask,double**& voidf
|
||||
for(int index = 0; index < particleCloud_.numberOfParticles(); ++index)
|
||||
{
|
||||
// reset
|
||||
cellsPerParticle_[index][0] = 8;
|
||||
cellsPerParticle()[index][0] = 8;
|
||||
//TODO do we need to set particleVolumes, particleV?
|
||||
// ===
|
||||
|
||||
|
||||
@ -84,12 +84,11 @@ voidFractionModel::voidFractionModel
|
||||
/*sm.mesh(),
|
||||
dimensionedScalar("zero", dimensionSet(0,0,0,0,0), 1)*/
|
||||
),
|
||||
cellsPerParticle_(NULL),
|
||||
maxCellsPerParticle_(1),
|
||||
weight_(1.),
|
||||
porosity_(1.)
|
||||
{
|
||||
particleCloud_.dataExchangeM().allocateArray(cellsPerParticle_,1,1);
|
||||
particleCloud_.registerParticleVectorProperty<int>("cellsPerParticle");
|
||||
if (particleCloud_.getParticleEffVolFactors()) multiWeights_ = true;
|
||||
}
|
||||
|
||||
@ -128,19 +127,17 @@ voidFractionModel::voidFractionModel
|
||||
sm.mesh(),
|
||||
dimensionedScalar("zero", dimensionSet(0,0,0,0,0), initVoidfraction)
|
||||
),
|
||||
cellsPerParticle_(NULL),
|
||||
maxCellsPerParticle_(1),
|
||||
weight_(1.),
|
||||
porosity_(1.)
|
||||
{
|
||||
particleCloud_.dataExchangeM().allocateArray(cellsPerParticle_,1,1);
|
||||
particleCloud_.registerParticleVectorProperty<int>("cellsPerParticle");
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||
|
||||
voidFractionModel::~voidFractionModel()
|
||||
{
|
||||
particleCloud_.dataExchangeM().destroy(cellsPerParticle_,1);
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * * * public Member Functions * * * * * * * * * * * * * //
|
||||
@ -162,7 +159,7 @@ void voidFractionModel::resetVoidFractions()
|
||||
|
||||
int** const& voidFractionModel::cellsPerParticle() const
|
||||
{
|
||||
return cellsPerParticle_;
|
||||
return particleCloud_.getParticleVectorPropertyRef<int>("cellsPerParticle");
|
||||
}
|
||||
|
||||
int voidFractionModel::maxCellsPerParticle() const
|
||||
@ -175,7 +172,8 @@ void voidFractionModel::reAllocArrays()
|
||||
if(particleCloud_.numberOfParticlesChanged())
|
||||
{
|
||||
// get arrays of new length
|
||||
particleCloud_.dataExchangeM().allocateArray(cellsPerParticle_,1,1);
|
||||
particleCloud_.dataExchangeM().allocateArray(
|
||||
particleCloud_.getParticleVectorPropertyRef<int>("cellsPerParticle"),1,1);
|
||||
}
|
||||
}
|
||||
|
||||
@ -184,7 +182,8 @@ void voidFractionModel::reAllocArrays(int nP)
|
||||
if(particleCloud_.numberOfParticlesChanged())
|
||||
{
|
||||
// get arrays of new length
|
||||
particleCloud_.dataExchangeM().allocateArray(cellsPerParticle_,1,1,nP);
|
||||
particleCloud_.dataExchangeM().allocateArray(
|
||||
particleCloud_.getParticleVectorPropertyRef<int>("cellsPerParticle"),1,1,nP);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -69,7 +69,6 @@ protected:
|
||||
|
||||
volScalarField voidfractionNext_;
|
||||
|
||||
int ** cellsPerParticle_;
|
||||
|
||||
int maxCellsPerParticle_;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user