mirror of
https://github.com/ParticulateFlow/CFDEMcoupling-PFM.git
synced 2025-12-08 06:37:44 +00:00
Merge pull request #28 from ParticulateFlow/feature/cherry_pick_PUBLIC
Feature/cherry pick public
This commit is contained in:
@ -1,7 +1,7 @@
|
|||||||
|
{
|
||||||
//========================================================================//
|
//========================================================================//
|
||||||
scalar countCell=0; // number of cells touched by particles
|
label countCell=0; // number of cells touched by particles
|
||||||
int points=0; // number of particles and sub-points
|
label points=0; // number of particles and sub-points
|
||||||
scalar totalParticleWeights=0; // total weight of all particles and sub-points
|
scalar totalParticleWeights=0; // total weight of all particles and sub-points
|
||||||
vector totalForce_array(0,0,0); // total force on particles based on particle array
|
vector totalForce_array(0,0,0); // total force on particles based on particle array
|
||||||
vector totalForce_field(0,0,0); // forceField of forceM(), used to calc Ksl
|
vector totalForce_field(0,0,0); // forceField of forceM(), used to calc Ksl
|
||||||
@ -93,3 +93,4 @@
|
|||||||
Info <<"meanR_array = "<< meanR_array << endl;
|
Info <<"meanR_array = "<< meanR_array << endl;
|
||||||
Info <<"=============================================================================" << endl;
|
Info <<"=============================================================================" << endl;
|
||||||
Info << endl;
|
Info << endl;
|
||||||
|
}
|
||||||
|
|||||||
@ -36,14 +36,36 @@ Description
|
|||||||
#define CFDEM_MATH_EXTRA_H
|
#define CFDEM_MATH_EXTRA_H
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
//#include "math.h"
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <error.h>
|
#include <error.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include "mathematicalConstants.H"
|
||||||
|
|
||||||
#define TOLERANCE_ORTHO 1e-10
|
#define TOLERANCE_ORTHO 1e-10
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace constant
|
||||||
|
{
|
||||||
|
namespace mathematical
|
||||||
|
{
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
const scalar piByFour(0.25*pi);
|
||||||
|
const scalar fourPiByThree(4.0*pi/3.0);
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace mathematical
|
||||||
|
} // End namespace constant
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
|
||||||
namespace MathExtra
|
namespace MathExtra
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,8 @@
|
|||||||
www.cfdem.com
|
www.cfdem.com
|
||||||
Christoph Goniva, christoph.goniva@cfdem.com
|
Christoph Goniva, christoph.goniva@cfdem.com
|
||||||
Copyright 2009-2012 JKU Linz
|
Copyright 2009-2012 JKU Linz
|
||||||
Copyright 2012- DCS Computing GmbH, Linz
|
Copyright 2012-2015 DCS Computing GmbH, Linz
|
||||||
|
Copyright 2015- JKU Linz
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of CFDEMcoupling.
|
This file is part of CFDEMcoupling.
|
||||||
@ -27,6 +28,20 @@ License
|
|||||||
Description
|
Description
|
||||||
This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS
|
This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS
|
||||||
and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).
|
and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).
|
||||||
|
|
||||||
|
This function is based on the derivation in R. Mei,
|
||||||
|
An approximate expression for shear lift force on a spherical particle at a
|
||||||
|
finite Reynolds number,
|
||||||
|
Int. J. Multiph. Flow 18 (1992) 145–147
|
||||||
|
|
||||||
|
The data for this functions is based on J.B. Mclaughlin,
|
||||||
|
Inertial migration of a small sphere in linear shear flows,
|
||||||
|
Journal of Fluid Mechanics. 224 (1991) 261-274.
|
||||||
|
|
||||||
|
The second order terms are based on E. Loth and A. J. Dorgan,
|
||||||
|
An equation of motion for particles of finite Reynolds number and size,
|
||||||
|
Environ. Fluid Mech. 9 (2009) 187–206
|
||||||
|
and can be added to the lift coefficient if desired
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#include "error.H"
|
#include "error.H"
|
||||||
@ -124,6 +139,7 @@ void MeiLift::setForce() const
|
|||||||
scalar J_star(0);
|
scalar J_star(0);
|
||||||
scalar Omega_eq(0);
|
scalar Omega_eq(0);
|
||||||
scalar alphaStar(0);
|
scalar alphaStar(0);
|
||||||
|
scalar epsilonSqr(0.0);
|
||||||
scalar epsilon(0);
|
scalar epsilon(0);
|
||||||
scalar omega_star(0);
|
scalar omega_star(0);
|
||||||
vector vorticity(0,0,0);
|
vector vorticity(0,0,0);
|
||||||
@ -148,14 +164,12 @@ void MeiLift::setForce() const
|
|||||||
if (forceSubM(0).interpolation())
|
if (forceSubM(0).interpolation())
|
||||||
{
|
{
|
||||||
position = particleCloud_.position(index);
|
position = particleCloud_.position(index);
|
||||||
Ur = UInterpolator_.interpolate(position,cellI)
|
Ur = UInterpolator_.interpolate(position,cellI) - Us;
|
||||||
- Us;
|
|
||||||
vorticity = VorticityInterpolator_.interpolate(position,cellI);
|
vorticity = VorticityInterpolator_.interpolate(position,cellI);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Ur = U_[cellI]
|
Ur = U_[cellI] - Us;
|
||||||
- Us;
|
|
||||||
vorticity = vorticityField[cellI];
|
vorticity = vorticityField[cellI];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -164,7 +178,7 @@ void MeiLift::setForce() const
|
|||||||
|
|
||||||
if (magUr > 0 && magVorticity > 0)
|
if (magUr > 0 && magVorticity > 0)
|
||||||
{
|
{
|
||||||
ds = 2*particleCloud_.radius(index);
|
ds = 2. * particleCloud_.radius(index);
|
||||||
nuf = nufField[cellI];
|
nuf = nufField[cellI];
|
||||||
rho = rhoField[cellI];
|
rho = rhoField[cellI];
|
||||||
|
|
||||||
@ -172,42 +186,50 @@ void MeiLift::setForce() const
|
|||||||
Rep = ds*magUr/nuf;
|
Rep = ds*magUr/nuf;
|
||||||
Rew = magVorticity*ds*ds/nuf;
|
Rew = magVorticity*ds*ds/nuf;
|
||||||
|
|
||||||
alphaStar = magVorticity*ds/magUr/2.0;
|
omega_star = magVorticity * ds / magUr;
|
||||||
epsilon = sqrt(2.0*alphaStar /Rep );
|
alphaStar = 0.5 * omega_star;
|
||||||
omega_star = 2.0*alphaStar;
|
epsilonSqr = omega_star / Rep;
|
||||||
|
epsilon = sqrt(epsilonSqr);
|
||||||
|
|
||||||
//Basic model for the correction to the Saffman lift
|
//Basic model for the correction to the Saffman lift
|
||||||
//Based on McLaughlin (1991)
|
//McLaughlin (1991), Mei (1992), Loth and Dorgan (2009)
|
||||||
if(epsilon < 0.1)
|
//J_star = 0.443 * J
|
||||||
|
if (epsilon < 0.1) //epsilon << 1
|
||||||
{
|
{
|
||||||
J_star = -140 *epsilon*epsilon*epsilon*epsilon*epsilon
|
//McLaughlin (1991), Eq (3.27): J = 32 * pi^2 * epsilon^5 * ln(1 / epsilon^2)
|
||||||
*log( 1./(epsilon*epsilon+SMALL) );
|
J_star = -140.0 * epsilonSqr * epsilonSqr * epsilon * log(1. / (epsilonSqr+SMALL));
|
||||||
}
|
}
|
||||||
else if(epsilon > 20)
|
else if (epsilon > 20.0) //epsilon >> 1
|
||||||
{
|
{
|
||||||
J_star = 1.0-0.287/(epsilon*epsilon+SMALL);
|
//McLaughlin (1991), Eq (3.26): J = 2.255 - 0.6463 / epsilon^2
|
||||||
|
J_star = 1.0 - 0.287 / epsilonSqr;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
//Mei (1992), Eq (10)
|
||||||
|
//Loth and Dorgan (2009), Eq (32)
|
||||||
J_star = 0.3
|
J_star = 0.3
|
||||||
*( 1.0
|
* (1.0 + tanh(2.5 * (log10(epsilon) + 0.191)))
|
||||||
+tanh( 2.5 * log10(epsilon+0.191) )
|
* (0.667 + tanh(6.0 * ( epsilon - 0.32 )));
|
||||||
)
|
|
||||||
*( 0.667
|
|
||||||
+tanh( 6.0 * (epsilon-0.32) )
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
Cl = J_star * 4.11 * epsilon; //multiply McLaughlin's correction to the basic Saffman model
|
//Loth and Dorgan (2009), Eq (31): Saffman lift-coefficient: ClSaff = 12.92 / pi * epsilon ~ 4.11 * epsilon
|
||||||
|
//Loth and Dorgan (2009), Eq (32)
|
||||||
|
Cl = J_star * 4.11 * epsilon; //multiply correction to the basic Saffman model
|
||||||
|
|
||||||
//Second order terms given by Loth and Dorgan 2009
|
//Second order terms given by Loth and Dorgan (2009)
|
||||||
if (useSecondOrderTerms_)
|
if (useSecondOrderTerms_)
|
||||||
{
|
{
|
||||||
Omega_eq = omega_star/2.0*(1.0-0.0075*Rew)*(1.0-0.062*sqrt(Rep)-0.001*Rep);
|
scalar sqrtRep = sqrt(Rep);
|
||||||
Cl_star=1.0-(0.675+0.15*(1.0+tanh(0.28*(omega_star/2.0-2.0))))*tanh(0.18*sqrt(Rep));
|
//Loth and Dorgan (2009), Eq (34)
|
||||||
|
Cl_star = 1.0 - (0.675 + 0.15 * (1.0 + tanh(0.28 * (alphaStar - 2.0)))) * tanh(0.18 * sqrtRep);
|
||||||
|
//Loth and Dorgan (2009), Eq (38)
|
||||||
|
Omega_eq = alphaStar * (1.0 - 0.0075 * Rew) * (1.0 - 0.062 * sqrtRep - 0.001 * Rep);
|
||||||
|
//Loth and Dorgan (2009), Eq (39)
|
||||||
Cl += Omega_eq * Cl_star;
|
Cl += Omega_eq * Cl_star;
|
||||||
}
|
}
|
||||||
|
|
||||||
lift = 0.125*M_PI
|
//Loth and Dorgan (2009), Eq (27)
|
||||||
|
lift = 0.125 * constant::mathematical::pi
|
||||||
* rho
|
* rho
|
||||||
* Cl
|
* Cl
|
||||||
* magUr * Ur ^ vorticity / magVorticity
|
* magUr * Ur ^ vorticity / magVorticity
|
||||||
|
|||||||
@ -5,7 +5,8 @@
|
|||||||
www.cfdem.com
|
www.cfdem.com
|
||||||
Christoph Goniva, christoph.goniva@cfdem.com
|
Christoph Goniva, christoph.goniva@cfdem.com
|
||||||
Copyright 2009-2012 JKU Linz
|
Copyright 2009-2012 JKU Linz
|
||||||
Copyright 2012- DCS Computing GmbH, Linz
|
Copyright 2012-2015 DCS Computing GmbH, Linz
|
||||||
|
Copyright 2015- JKU Linz
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of CFDEMcoupling.
|
This file is part of CFDEMcoupling.
|
||||||
@ -28,16 +29,18 @@ Description
|
|||||||
This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS
|
This code is designed to realize coupled CFD-DEM simulations using LIGGGHTS
|
||||||
and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).
|
and OpenFOAM(R). Note: this code is not part of OpenFOAM(R) (see DISCLAIMER).
|
||||||
|
|
||||||
This function is based on the derivation in R. Kurose, S. Komori,
|
This function is based on the derivation in R. Mei,
|
||||||
Drag and lift forces on a rotating sphere in a linear shear flow,
|
An approximate expression for shear lift force on a spherical particle at a
|
||||||
Journal of Fluid Mechanics. 384 (1999) 183-206.
|
finite Reynolds number,
|
||||||
|
Int. J. Multiph. Flow 18 (1992) 145–147
|
||||||
|
|
||||||
The data for this functions is based on J.B. Mclaughlin,
|
The data for this functions is based on J.B. Mclaughlin,
|
||||||
Inertial migration of a small sphere in linear shear flows,
|
Inertial migration of a small sphere in linear shear flows,
|
||||||
Journal of Fluid Mechanics. 224 (1991) 261-274.
|
Journal of Fluid Mechanics. 224 (1991) 261-274.
|
||||||
|
|
||||||
The second order terms are based on:
|
The second order terms are based on E. Loth and A. J. Dorgan,
|
||||||
Mei Lift force following Loth and Dorgan 2009,
|
An equation of motion for particles of finite Reynolds number and size,
|
||||||
|
Environ. Fluid Mech. 9 (2009) 187–206
|
||||||
and can be added to the lift coefficient if desired
|
and can be added to the lift coefficient if desired
|
||||||
(contribution from RQ)
|
(contribution from RQ)
|
||||||
|
|
||||||
|
|||||||
@ -30,14 +30,10 @@ Description
|
|||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#include "error.H"
|
#include "error.H"
|
||||||
|
|
||||||
|
|
||||||
#include "engineSearchIB.H"
|
#include "engineSearchIB.H"
|
||||||
#include "addToRunTimeSelectionTable.H"
|
#include "addToRunTimeSelectionTable.H"
|
||||||
#include "mathematicalConstants.H"
|
#include "mathematicalConstants.H"
|
||||||
|
|
||||||
#include <mpi.h>
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
namespace Foam
|
namespace Foam
|
||||||
@ -68,11 +64,15 @@ engineSearchIB::engineSearchIB
|
|||||||
propsDict_(dict.subDict(typeName + "Props")),
|
propsDict_(dict.subDict(typeName + "Props")),
|
||||||
zSplit_(readLabel(propsDict_.lookup("zSplit"))),
|
zSplit_(readLabel(propsDict_.lookup("zSplit"))),
|
||||||
xySplit_(readLabel(propsDict_.lookup("xySplit"))),
|
xySplit_(readLabel(propsDict_.lookup("xySplit"))),
|
||||||
checkPeriodicCells_(false)
|
thetaSize_(180./zSplit_),
|
||||||
|
phiSize_(360./xySplit_),
|
||||||
|
deg2rad_(constant::mathematical::pi/180.),
|
||||||
|
numberOfSatellitePoints_((zSplit_-1)*xySplit_+2)
|
||||||
{
|
{
|
||||||
|
for (int countPoints = 0; countPoints < numberOfSatellitePoints_; ++countPoints)
|
||||||
if(propsDict_.found("checkPeriodicCells")) checkPeriodicCells_=true;
|
{
|
||||||
|
satellitePoints_.push_back(generateSatellitePoint(countPoints));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -93,6 +93,7 @@ label engineSearchIB::findCell
|
|||||||
int size
|
int size
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
|
bool checkPeriodicCells(particleCloud_.checkPeriodicCells());
|
||||||
const boundBox& globalBb = particleCloud_.mesh().bounds();
|
const boundBox& globalBb = particleCloud_.mesh().bounds();
|
||||||
|
|
||||||
vector position;
|
vector position;
|
||||||
@ -100,7 +101,7 @@ label engineSearchIB::findCell
|
|||||||
{
|
{
|
||||||
cellIDs[index][0] = -1;
|
cellIDs[index][0] = -1;
|
||||||
double radius = particleCloud_.radius(index);
|
double radius = particleCloud_.radius(index);
|
||||||
//if(mask[index][0] && radius > SMALL)
|
|
||||||
if (radius > SMALL)
|
if (radius > SMALL)
|
||||||
{
|
{
|
||||||
// create pos vector
|
// create pos vector
|
||||||
@ -109,43 +110,19 @@ label engineSearchIB::findCell
|
|||||||
// find cell
|
// find cell
|
||||||
label oldID = cellIDs[index][0];
|
label oldID = cellIDs[index][0];
|
||||||
cellIDs[index][0] = findSingleCell(position, oldID);
|
cellIDs[index][0] = findSingleCell(position, oldID);
|
||||||
//cellIDs[index][0] = particleCloud_.mesh().findCell(position);
|
|
||||||
|
|
||||||
//mod by alice upon from here
|
|
||||||
if (cellIDs[index][0] < 0)
|
if (cellIDs[index][0] < 0)
|
||||||
{
|
{
|
||||||
vector pos = position;
|
|
||||||
label altStartPos = -1;
|
label altStartPos = -1;
|
||||||
label numberOfPoints = (zSplit_-1)*xySplit_ + 2; // 1 point at bottom, 1 point at top
|
|
||||||
label thetaLevel = 0;
|
|
||||||
scalar theta, phi;
|
|
||||||
const scalar thetaSize = 180./zSplit_, phiSize = 360./xySplit_;
|
|
||||||
const scalar deg2rad = M_PI/180.;
|
|
||||||
|
|
||||||
for(int countPoints = 0; countPoints < numberOfPoints; ++countPoints)
|
for (int countPoints = 0; countPoints < numberOfSatellitePoints_; ++countPoints)
|
||||||
{
|
{
|
||||||
pos = position;
|
vector pos = getSatellitePoint(index, countPoints);
|
||||||
if(countPoints == 0)
|
|
||||||
{
|
altStartPos = findSingleCell(pos,oldID);
|
||||||
pos[2] += radius;
|
|
||||||
}
|
|
||||||
else if(countPoints == 1)
|
|
||||||
{
|
|
||||||
pos[2] -= radius;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
thetaLevel = (countPoints - 2) / xySplit_;
|
|
||||||
theta = deg2rad * thetaSize * (thetaLevel+1);
|
|
||||||
phi = deg2rad * phiSize * (countPoints - 2 - thetaLevel*xySplit_);
|
|
||||||
pos[0] += radius * sin(theta) * cos(phi);
|
|
||||||
pos[1] += radius * sin(theta) * sin(phi);
|
|
||||||
pos[2] += radius * cos(theta);
|
|
||||||
}
|
|
||||||
|
|
||||||
altStartPos=findSingleCell(pos,oldID); //particleCloud_.mesh().findCell(pos);//
|
|
||||||
//check for periodic domains
|
//check for periodic domains
|
||||||
if(checkPeriodicCells_)
|
if (checkPeriodicCells)
|
||||||
{
|
{
|
||||||
for (int iDir = 0; iDir < 3; iDir++)
|
for (int iDir = 0; iDir < 3; iDir++)
|
||||||
{
|
{
|
||||||
@ -158,7 +135,8 @@ label engineSearchIB::findCell
|
|||||||
pos[iDir] += globalBb.max()[iDir] - globalBb.min()[iDir];
|
pos[iDir] += globalBb.max()[iDir] - globalBb.min()[iDir];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
altStartPos=findSingleCell(pos,oldID); //particleCloud_.mesh().findCell(pos);//
|
|
||||||
|
altStartPos = findSingleCell(pos, oldID);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (altStartPos >= 0) // found position, we're done
|
if (altStartPos >= 0) // found position, we're done
|
||||||
@ -171,9 +149,35 @@ label engineSearchIB::findCell
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vector engineSearchIB::generateSatellitePoint(int countPoints) const
|
||||||
|
{
|
||||||
|
// 1 point at bottom, 1 point at top
|
||||||
|
if (countPoints == 0)
|
||||||
|
{
|
||||||
|
return vector(0., 0., 1.);
|
||||||
|
}
|
||||||
|
else if (countPoints == 1)
|
||||||
|
{
|
||||||
|
return vector(0., 0., -1.);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const scalar thetaLevel = (countPoints - 2) / xySplit_;
|
||||||
|
const scalar theta = deg2rad_ * thetaSize_ * (thetaLevel + 1);
|
||||||
|
const scalar phi = deg2rad_ * phiSize_ * (countPoints - 2 - thetaLevel * xySplit_);
|
||||||
|
return vector(sin(theta) * cos(phi), sin(theta) * sin(phi), cos(theta));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
vector engineSearchIB::getSatellitePoint(int index, int countPoints) const
|
||||||
|
{
|
||||||
|
return particleCloud_.position(index)
|
||||||
|
+ particleCloud_.radius(index) * satellitePoints_[countPoints];
|
||||||
|
}
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
|||||||
@ -47,7 +47,7 @@ namespace Foam
|
|||||||
{
|
{
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
/*---------------------------------------------------------------------------*\
|
||||||
Class noDrag Declaration
|
Class engineSearchIB Declaration
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
class engineSearchIB
|
class engineSearchIB
|
||||||
@ -63,7 +63,13 @@ private:
|
|||||||
|
|
||||||
const label xySplit_;
|
const label xySplit_;
|
||||||
|
|
||||||
bool checkPeriodicCells_;
|
const scalar thetaSize_;
|
||||||
|
const scalar phiSize_;
|
||||||
|
const scalar deg2rad_;
|
||||||
|
|
||||||
|
const label numberOfSatellitePoints_;
|
||||||
|
|
||||||
|
std::vector<vector> satellitePoints_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@ -94,6 +100,17 @@ public:
|
|||||||
int size
|
int size
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
vector generateSatellitePoint
|
||||||
|
(
|
||||||
|
int countPoints
|
||||||
|
) const;
|
||||||
|
|
||||||
|
vector getSatellitePoint
|
||||||
|
(
|
||||||
|
int index,
|
||||||
|
int countPoints
|
||||||
|
) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -30,7 +30,7 @@ Description
|
|||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#include "error.H"
|
#include "error.H"
|
||||||
|
#include "mathExtra.H"
|
||||||
#include "GaussVoidFraction.H"
|
#include "GaussVoidFraction.H"
|
||||||
#include "addToRunTimeSelectionTable.H"
|
#include "addToRunTimeSelectionTable.H"
|
||||||
#include "locateModel.H"
|
#include "locateModel.H"
|
||||||
@ -69,7 +69,7 @@ GaussVoidFraction::GaussVoidFraction
|
|||||||
alphaLimited_(0)
|
alphaLimited_(0)
|
||||||
{
|
{
|
||||||
Info << "\n\n W A R N I N G - do not use in combination with differentialRegion model! \n\n" << endl;
|
Info << "\n\n W A R N I N G - do not use in combination with differentialRegion model! \n\n" << endl;
|
||||||
Info << "\n\n W A R N I N G - this model does not yet work properly! \n\n" << endl;
|
FatalError << "\n\n This model does not yet work properly! \n\n" << endl;
|
||||||
//reading maxCellsPerParticle from dictionary
|
//reading maxCellsPerParticle from dictionary
|
||||||
maxCellsPerParticle_=readLabel(propsDict_.lookup("maxCellsPerParticle"));
|
maxCellsPerParticle_=readLabel(propsDict_.lookup("maxCellsPerParticle"));
|
||||||
|
|
||||||
@ -115,7 +115,7 @@ void GaussVoidFraction::setvoidFraction(double** const& mask,double**& voidfract
|
|||||||
label particleCenterCellID=particleCloud_.cellIDs()[index][0];
|
label particleCenterCellID=particleCloud_.cellIDs()[index][0];
|
||||||
|
|
||||||
radius = particleCloud_.radius(index);
|
radius = particleCloud_.radius(index);
|
||||||
volume = 4.188790205*radius*radius*radius*scaleVol;
|
volume = constant::mathematical::fourPiByThree*radius*radius*radius*scaleVol;
|
||||||
radius *= scaleRadius;
|
radius *= scaleRadius;
|
||||||
|
|
||||||
vector positionCenter=particleCloud_.position(index);
|
vector positionCenter=particleCloud_.position(index);
|
||||||
@ -183,7 +183,6 @@ void GaussVoidFraction::setvoidFraction(double** const& mask,double**& voidfract
|
|||||||
|
|
||||||
//Info << "AFTER:set voidfraction in cellI=" << cellI
|
//Info << "AFTER:set voidfraction in cellI=" << cellI
|
||||||
// << ", voidfraction =" << voidfractionNext_[cellI] << endl;
|
// << ", voidfraction =" << voidfractionNext_[cellI] << endl;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// debug
|
// debug
|
||||||
@ -235,12 +234,13 @@ void GaussVoidFraction::buildLabelHashSet
|
|||||||
forAll(nc,i)
|
forAll(nc,i)
|
||||||
{
|
{
|
||||||
label neighbor=nc[i];
|
label neighbor=nc[i];
|
||||||
if(!hashSett.found(neighbor) && mag(position-particleCloud_.mesh().C()[neighbor])<radius){
|
if(!hashSett.found(neighbor) && mag(position-particleCloud_.mesh().C()[neighbor])<radius)
|
||||||
|
{
|
||||||
buildLabelHashSet(radius,position,neighbor,hashSett);
|
buildLabelHashSet(radius,position,neighbor,hashSett);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
} // End namespace Foam
|
} // End namespace Foam
|
||||||
|
|||||||
@ -66,7 +66,8 @@ IBVoidFraction::IBVoidFraction
|
|||||||
propsDict_(dict.subDict(typeName + "Props")),
|
propsDict_(dict.subDict(typeName + "Props")),
|
||||||
alphaMin_(readScalar(propsDict_.lookup("alphaMin"))),
|
alphaMin_(readScalar(propsDict_.lookup("alphaMin"))),
|
||||||
alphaLimited_(0),
|
alphaLimited_(0),
|
||||||
scaleUpVol_(readScalar(propsDict_.lookup("scaleUpVol")))
|
scaleUpVol_(readScalar(propsDict_.lookup("scaleUpVol"))),
|
||||||
|
sqrtThree_(sqrt(3.0))
|
||||||
{
|
{
|
||||||
Info << "\n\n W A R N I N G - do not use in combination with differentialRegion model!\n\n" << endl;
|
Info << "\n\n W A R N I N G - do not use in combination with differentialRegion model!\n\n" << endl;
|
||||||
maxCellsPerParticle_ = readLabel(propsDict_.lookup("maxCellsPerParticle"));
|
maxCellsPerParticle_ = readLabel(propsDict_.lookup("maxCellsPerParticle"));
|
||||||
@ -128,8 +129,10 @@ void IBVoidFraction::setvoidFraction(double** const& mask,double**& voidfraction
|
|||||||
}
|
}
|
||||||
|
|
||||||
scalar centreDist = mag(cellCentrePosition - minPeriodicParticlePos);
|
scalar centreDist = mag(cellCentrePosition - minPeriodicParticlePos);
|
||||||
scalar corona = 0.5 * sqrt(3.0) * pow(particleCloud_.mesh().V()[particleCenterCellID], 1./3.);
|
scalar corona = 0.5 * sqrtThree_ * pow(particleCloud_.mesh().V()[particleCenterCellID], 1./3.);
|
||||||
vector coronaPoint = cellCentrePosition + (cellCentrePosition - minPeriodicParticlePos) * (corona / centreDist);
|
vector coronaPoint = cellCentrePosition;
|
||||||
|
if(centreDist > 0.0)
|
||||||
|
coronaPoint += (cellCentrePosition - minPeriodicParticlePos) * (corona / centreDist);
|
||||||
|
|
||||||
if (pointInParticle(index, minPeriodicParticlePos, coronaPoint) < 0.0)
|
if (pointInParticle(index, minPeriodicParticlePos, coronaPoint) < 0.0)
|
||||||
{
|
{
|
||||||
@ -249,7 +252,7 @@ void IBVoidFraction::setvoidFraction(double** const& mask,double**& voidfraction
|
|||||||
label partCellId = particleCloud_.mesh().findNearestCell(particlePosList[iPeriodicImage]);
|
label partCellId = particleCloud_.mesh().findNearestCell(particlePosList[iPeriodicImage]);
|
||||||
particleLabelList.append(partCellId);
|
particleLabelList.append(partCellId);
|
||||||
|
|
||||||
buildLabelHashSet(radius, particlePosList[iPeriodicImage], particleLabelList[iPeriodicImage], hashSett, false);
|
buildLabelHashSet(index, particlePosList[iPeriodicImage], particleLabelList[iPeriodicImage], hashSett, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
} //end checkPeriodicCells_
|
} //end checkPeriodicCells_
|
||||||
@ -316,8 +319,10 @@ void IBVoidFraction::buildLabelHashSet
|
|||||||
scalar centreDist = mag(cellCentrePosition-position);
|
scalar centreDist = mag(cellCentrePosition-position);
|
||||||
|
|
||||||
scalar fc = pointInParticle(index, position, cellCentrePosition);
|
scalar fc = pointInParticle(index, position, cellCentrePosition);
|
||||||
scalar corona = 0.5 * sqrt(3.0) * pow(particleCloud_.mesh().V()[neighbor], 1./3.);
|
scalar corona = 0.5 * sqrtThree_ * pow(particleCloud_.mesh().V()[neighbor], 1./3.);
|
||||||
vector coronaPoint = cellCentrePosition + (cellCentrePosition - position) * (corona / centreDist);
|
vector coronaPoint = cellCentrePosition;
|
||||||
|
if (centreDist > 0.0)
|
||||||
|
coronaPoint += (cellCentrePosition - position) * (corona / centreDist);
|
||||||
|
|
||||||
if (!hashSett.found(neighbor) && pointInParticle(index, position, coronaPoint) < 0.0)
|
if (!hashSett.found(neighbor) && pointInParticle(index, position, coronaPoint) < 0.0)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -68,6 +68,8 @@ private:
|
|||||||
|
|
||||||
const scalar scaleUpVol_; //NP scaling radius, keeping volume of particle
|
const scalar scaleUpVol_; //NP scaling radius, keeping volume of particle
|
||||||
|
|
||||||
|
const scalar sqrtThree_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
//- Runtime type information
|
//- Runtime type information
|
||||||
|
|||||||
@ -30,7 +30,7 @@ Description
|
|||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#include "error.H"
|
#include "error.H"
|
||||||
|
#include "mathExtra.H"
|
||||||
#include "bigParticleVoidFraction.H"
|
#include "bigParticleVoidFraction.H"
|
||||||
#include "addToRunTimeSelectionTable.H"
|
#include "addToRunTimeSelectionTable.H"
|
||||||
#include "locateModel.H"
|
#include "locateModel.H"
|
||||||
@ -113,7 +113,7 @@ void bigParticleVoidFraction::setvoidFraction(double** const& mask,double**& voi
|
|||||||
//collecting data
|
//collecting data
|
||||||
label particleCenterCellID=particleCloud_.cellIDs()[index][0];
|
label particleCenterCellID=particleCloud_.cellIDs()[index][0];
|
||||||
radius = particleCloud_.radius(index);
|
radius = particleCloud_.radius(index);
|
||||||
volume = 4.188790205*radius*radius*radius*scaleVol;
|
volume = constant::mathematical::fourPiByThree*radius*radius*radius*scaleVol;
|
||||||
radius *= scaleRadius;
|
radius *= scaleRadius;
|
||||||
vector positionCenter=particleCloud_.position(index);
|
vector positionCenter=particleCloud_.position(index);
|
||||||
|
|
||||||
|
|||||||
@ -30,8 +30,8 @@ Description
|
|||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#include "error.H"
|
#include "error.H"
|
||||||
|
|
||||||
#include "centreVoidFraction.H"
|
#include "centreVoidFraction.H"
|
||||||
|
#include "mathExtra.H"
|
||||||
#include "addToRunTimeSelectionTable.H"
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
@ -101,7 +101,7 @@ void centreVoidFraction::setvoidFraction(double** const& mask,double**& voidfrac
|
|||||||
{
|
{
|
||||||
cellVol = voidfractionNext_.mesh().V()[cellI];
|
cellVol = voidfractionNext_.mesh().V()[cellI];
|
||||||
radius = particleCloud_.radius(index);
|
radius = particleCloud_.radius(index);
|
||||||
volume = 4.188790205*radius*radius*radius*scaleVol;
|
volume = constant::mathematical::fourPiByThree*radius*radius*radius*scaleVol;
|
||||||
|
|
||||||
// store volume for each particle
|
// store volume for each particle
|
||||||
particleVolumes[index][0] = volume;
|
particleVolumes[index][0] = volume;
|
||||||
|
|||||||
@ -39,6 +39,7 @@ SourceFiles
|
|||||||
#ifndef dividedVoidFraction_H
|
#ifndef dividedVoidFraction_H
|
||||||
#define dividedVoidFraction_H
|
#define dividedVoidFraction_H
|
||||||
|
|
||||||
|
#include "mathExtra.H"
|
||||||
#include "voidFractionModel.H"
|
#include "voidFractionModel.H"
|
||||||
#include "interpolationCellPoint.H"
|
#include "interpolationCellPoint.H"
|
||||||
|
|
||||||
@ -79,8 +80,8 @@ private:
|
|||||||
|
|
||||||
virtual inline scalar Vp(int index, scalar radius, scalar scaleVol) const
|
virtual inline scalar Vp(int index, scalar radius, scalar scaleVol) const
|
||||||
{
|
{
|
||||||
return 4.188790205*radius*radius*radius*scaleVol; //4/3*pi=4.188790205
|
return constant::mathematical::fourPiByThree*radius*radius*radius*scaleVol;
|
||||||
};
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|||||||
@ -67,7 +67,7 @@
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
particleWeights[index][storeInIndex] += 1/static_cast<scalar>(nPoints);
|
particleWeights[index][storeInIndex] += 1.0/nPoints;
|
||||||
particleVolumes[index][storeInIndex] += particleVolume;
|
particleVolumes[index][storeInIndex] += particleVolume;
|
||||||
particleV[index][0] += particleVolume;
|
particleV[index][0] += particleVolume;
|
||||||
//====================================================//
|
//====================================================//
|
||||||
|
|||||||
@ -29,7 +29,7 @@ Description
|
|||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#include "error.H"
|
#include "error.H"
|
||||||
|
#include "mathExtra.H"
|
||||||
#include "trilinearVoidFraction.H"
|
#include "trilinearVoidFraction.H"
|
||||||
#include "addToRunTimeSelectionTable.H"
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
|
||||||
@ -95,7 +95,6 @@ void trilinearVoidFraction::setvoidFraction(double** const& mask,double**& voidf
|
|||||||
scalar radius(-1.);
|
scalar radius(-1.);
|
||||||
scalar volume(0.);
|
scalar volume(0.);
|
||||||
const scalar scaleVol = weight();
|
const scalar scaleVol = weight();
|
||||||
const scalar fourPiByThree = 4.0*constant::mathematical::pi/3.0;
|
|
||||||
|
|
||||||
vector partPos(0.,0.,0.);
|
vector partPos(0.,0.,0.);
|
||||||
vector pt(0.,0.,0.);
|
vector pt(0.,0.,0.);
|
||||||
@ -141,7 +140,7 @@ void trilinearVoidFraction::setvoidFraction(double** const& mask,double**& voidf
|
|||||||
if (cellI >= 0) // particel centre is in domain
|
if (cellI >= 0) // particel centre is in domain
|
||||||
{
|
{
|
||||||
radius = particleCloud_.radius(index);
|
radius = particleCloud_.radius(index);
|
||||||
volume = fourPiByThree * radius * radius * radius * scaleVol;
|
volume = constant::mathematical::fourPiByThree * radius * radius * radius * scaleVol;
|
||||||
|
|
||||||
// store volume for each particle
|
// store volume for each particle
|
||||||
particleVolumes[index][0] = volume;
|
particleVolumes[index][0] = volume;
|
||||||
|
|||||||
Reference in New Issue
Block a user