Compare commits

..

No commits in common. "774afd5f37b889c09e12045cfe33782af7e97e88" and "8466e02d8119e7ccd10a1bcc356cb53b9911eaed" have entirely different histories.

14 changed files with 137 additions and 98 deletions

View File

@ -74,7 +74,7 @@ pFlow::initialize_pFlowProcessors();
do
{
//Ping;
if(! sphInsertion.insertParticles(
Control.time().currentIter(),
Control.time().currentTime(),
@ -84,31 +84,27 @@ pFlow::initialize_pFlowProcessors();
"particle insertion failed in sphereDFlow solver.\n";
return 1;
}
// set force to zero
surfGeometry.beforeIteration();
// set force to zero, predict, particle deletion and etc.
sphParticles.beforeIteration();
//Ping;
sphInteraction.beforeIteration();
sphInteraction.iterate();
sphInteraction.iterate();
surfGeometry.iterate();
//Ping;
sphParticles.iterate();
//Ping;
sphInteraction.afterIteration();
//Ping;
surfGeometry.afterIteration();
//Ping;
sphParticles.afterIteration();
//Ping;
}while(Control++);

View File

@ -35,14 +35,10 @@ pFlow::globalDamping::globalDamping(const systemControl& control)
performDamping_ = !equal(dampingFactor_, static_cast<real>(1.0));
if( performDamping_ )
{
REPORT(2)<<"Global damping "<<Yellow_Text("is active")<<
" and damping factor is "<<dampingFactor_<<END_REPORT;
}
else
{
REPORT(2)<<"Global damping "<<Yellow_Text("is not active")<<"."<<END_REPORT;
}
REPORT(2)<<"Global damping "<<Yellow_Text("is active")<<
" and damping factor is "<<dampingFactor_<<END_REPORT;
else
REPORT(2)<<"Global damping "<<Yellow_Text("is not active")<<"."<<END_REPORT;
}

View File

@ -27,7 +27,6 @@ Licence:
#include "pFlowMacros.hpp"
#include "error.hpp"
#include "iOstream.hpp"
// just for preventing the use of std namespace and adding some minor functionalities

View File

@ -28,8 +28,8 @@ in <b>caseSetup/sphereShape</b> file
```C++
names (smallSphere largeSphere); // names of shapes
diameters (0.003 0.005); // diameter of shapes (m)
materials (prop1 prop1); // material names for shapes
diameters (0.003 0.005); // diameter of shapes (m)
materials (prop1 prop1); // material names for shapes
```
### Positioning and initial mixture
@ -44,17 +44,18 @@ in <b>settings/particlesDict</b> file
// positions particles
positionParticles
{
method ordered; // other options: random or empty
method ordered; // other options: random or empty
orderedInfo
{
diameter 0.005; // minimum space between centers of particles
numPoints 30000; // number of particles in the simulation
diameter 0.005; // minimum space between centers of particles
numPoints 30000; // number of particles in the simulation
axisOrder (z x y); // axis order for filling the space with particles
}
regionType cylinder; // other options: box and sphere
cylinder // cylinder region for positioning particles
cylinder // cylinder region for positioning particles
{
p1 (0.0 0.0 0.003); // begin point of cylinder axis (m m m)
p2 (0.0 0.0 0.097); // end point of cylinder axis (m m m)
@ -75,9 +76,9 @@ setFields
{
/*
Default value for fields defined for particles
These fields should always be defined for simulations with
spherical particles.
*/
These fields should always be defined for simulations with
spherical particles.
*/
defaultValue
{
@ -86,21 +87,20 @@ setFields
rotVelocity realx3 (0 0 0); // rotational velocity (rad/s)
shapeName word smallSphere; // name of the particle shape
}
selectors
{
shapeAssigne
{
selector stridedRange; // other options: box, cylinder, sphere, randomPoints
selector stridedRange; // other options: box, cylinder, sphere, randomPoints
stridedRangeInfo
{
begin 0; // begin index of points
begin 0; // begin index of points
end 30000; // end index of points
stride 3; // stride for selector
stride 3; // stride for selector
}
fieldValue // fields that the selector is applied to
fieldValue // fields that the selector is applied to
{
/*
sets shapeName of the selected points to largeSphere
@ -139,4 +139,4 @@ Options:
--setFields-only Exectue the setFields part only. Read the pointStructure from time folder and setFields and save the result in the same time folder.
```
so, with flag `--setFields-only`, you can execute the `setFields` part of `particlesDict`. Now suppose that you have a simulation case which proceeded up to 2 seconds and for any reason you want to change some field value at time 3 s and continue the simulation from 3 s. To this end, you need to change `startTime` in settings dictionary to 3, execute `particlesPhasicFlow --setFields-only`, and start the simulation.
so, with flag `--setFields-only`, you can execute the `setFields` part of `particlesDict`. Now suppose that you have a simulation case which proceeded up to 2 seconds and for any reason you want to change some field value at time 3 s and continue the simulation from 3 s. To this end, you need to change `startTime` in settings dictionary to 3, execute `particlesPhasicFlow --setFields-only`, and start the simulation.

View File

@ -6,9 +6,9 @@ objectName interaction;
objectType dicrionary;
fileFormat ASCII;
/*---------------------------------------------------------------------------*/
materials (prop1); // properties of material
materials (prop1); // properties of material
densities (1000.0); // density of materials [kg/m3]
densities (1000.0); // density of materials [kg/m3]
contactListType sortedContactList;
@ -38,14 +38,14 @@ model
Geff (0.8e6); // Shear modulus [Pa]
nu (0.25); // Poisson's ratio [-]
nu (0.25); // Poisson's ratio [-]
en (0.7); // coefficient of normal restitution
en (0.7); // coefficient of normal restitution
et (1.0); // coefficient of tangential restitution
et (1.0); // coefficient of tangential restitution
mu (0.3); // dynamic friction
mu (0.3); // dynamic friction
mur (0.1); // rolling friction
mur (0.1); // rolling friction
}

View File

@ -26,19 +26,19 @@ surfaces
{
type cylinderWall; // other options: cuboidWall and planeWall
p1 (0.0 0.0 0.0); // begin point of cylinder axis
p1 (0.0 0.0 0.0); // begin point of cylinder axis
p2 (0.0 0.0 0.1); // end point of cylinder axis
p2 (0.0 0.0 0.1); // end point of cylinder axis
radius1 0.12; // radius at p1
radius1 0.12; // radius at p1
radius2 0.12; // radius at p2
radius2 0.12; // radius at p2
resolution 24; // number of divisions
resolution 24; // number of divisions
material prop1; // material name of this wall
material prop1; // material name of this wall
motion rotAxis; // motion component name
motion rotAxis; // motion component name
}
/*

View File

@ -29,20 +29,20 @@ setFields
{
shapeAssigne
{
selector stridedRange; // other options: box, cylinder, sphere, randomPoints
selector stridedRange; // other options: box, cylinder, sphere, randomPoints
stridedRangeInfo
{
begin 0; // begin index of points
begin 0; // begin index of points
end 30000; // end index of points
end 30000; // end index of points
stride 3; // stride for selector
stride 3; // stride for selector
}
fieldValue // fields that the selector is applied to
{
shapeName word largeSphere; // sets shapeName of the selected points to largeSphere
shapeName word largeSphere; // sets shapeName of the selected points to largeSphere
}
}
}
@ -50,13 +50,13 @@ setFields
positionParticles // positions particles
{
method ordered; // other options: random and empty
method ordered; // other options: random and empty
orderedInfo
{
diameter 0.005; // diameter of particles
diameter 0.005; // diameter of particles
numPoints 30000; // number of particles in the simulation
numPoints 30000; // number of particles in the simulation
axisOrder (z x y); // axis order for filling the space with particles
}
@ -69,6 +69,6 @@ positionParticles // positions particles
p2 (0.0 0.0 0.097); // end point of cylinder axis
radius 0.117; // radius of cylinder
radius 0.117; // radius of cylinder
}
}

View File

@ -16,13 +16,13 @@ contactSearch
{
method NBS; // method for broad search particle-particle
updateInterval 10;
updateInterval 10;
sizeRatio 1.1;
cellExtent 0.55;
cellExtent 0.55;
adjustableBox No;
adjustableBox No;
}
model
@ -46,25 +46,25 @@ model
0.8e6 0.8e6
0.8e6);
nu (0.25 0.25 0.25 // Poisson's ratio [-]
0.25 0.25
0.25);
nu (0.25 0.25 0.25 // Poisson's ratio [-]
0.25 0.25
0.25);
en (0.97 0.97 0.85 // coefficient of normal restitution
0.97 0.85
1.00);
en (0.97 0.97 0.85 // coefficient of normal restitution
0.97 0.85
1.00);
et (1.0 1.0 1.0 // coefficient of tangential restitution
1.0 1.0
1.0);
et (1.0 1.0 1.0 // coefficient of tangential restitution
1.0 1.0
1.0);
mu (0.65 0.65 0.35 // dynamic friction
0.65 0.35
0.35);
mu (0.65 0.65 0.35 // dynamic friction
0.65 0.35
0.35);
mur (0.1 0.1 0.1 // rolling friction
0.1 0.1
0.1);
mur (0.1 0.1 0.1 // rolling friction
0.1 0.1
0.1);
}

View File

@ -6,7 +6,7 @@ objectName geometryDict;
objectType dictionary;
fileFormat ASCII;
/*---------------------------------------------------------------------------*/
motionModel conveyorBelt; // motion model can be rotatingAxis or stationary or vibrating
motionModel conveyorBelt; // motion model can be rotatingAxis or stationary or vibrating
conveyorBeltInfo
{
@ -54,22 +54,17 @@ surfaces
belt
{
type stlWall; // type of the wall
file belt.stl; // file name in stl folder
material wallMat; // material name of this wall
motion conveyorBelt1; // motion component name
type stlWall; // type of the wall
file belt.stl; // file name in stl folder
material wallMat; // material name of this wall
motion conveyorBelt1; // motion component name
}
box
{
type stlWall; // type of the wall
file box.stl; // file name in stl folder
material wallMat; // material name of this wall
type stlWall; // type of the wall
file box.stl; // file name in stl folder
material wallMat; // material name of this wall
}
}

View File

@ -30,7 +30,7 @@ pFlow::empty::empty(
positionParticles(control, dict),
position_
(
"empty",1, 0, RESERVE()
"empty",maxNumberOfParticles(), 0, RESERVE()
)
{
}

View File

@ -146,8 +146,8 @@ pFlow::positionOrdered::positionOrdered
position_
(
"positionOrdered",
numPoints_,
numPoints_,
max(maxNumberOfParticles(), numPoints_),
numPoints_ ,
RESERVE()
)
{

View File

@ -32,10 +32,45 @@ pFlow::realx3Vector pFlow::positionParticles::sortByMortonCode(
uint64 index;
};
/*realx3 minP = min(position);
realx3 maxP = max(position);
real cellsize = maxDiameter();
cells<uint64> allCells( box(minP, maxP), cellsize);
Vector<indexMorton> indMor(position.size(),RESERVE());
indMor.clear();
uint64 ind=0;
for(const auto& p:position)
{
auto cellInd = allCells.pointIndex(p);
indMor.push_back(
{ xyzToMortonCode64(cellInd.x(), cellInd.y(), cellInd.z()),
ind++});
}
INFORMATION<<"Performing morton sorting."<<END_INFO;
std::sort(
indMor.begin(),
indMor.end(),
[]( const indexMorton &lhs, const indexMorton &rhs){
return lhs.morton < rhs.morton; } );
realx3Vector sortedPos(position.capacity(), RESERVE());
sortedPos.clear();
for(auto& ind:indMor)
{
sortedPos.push_back( position[ind.index] );
}*/
WARNING<<"Morton sorting is inactive!"<<END_WARNING;
return position;
}
pFlow::positionParticles::positionParticles
(
systemControl& control,
@ -43,8 +78,12 @@ pFlow::positionParticles::positionParticles
)
:
regionType_(dict.getValOrSet<word>("regionType", "domain")),
maxNumberOfParticles_(dict.getValOrSet(
"maxNumberOfParticles",
static_cast<uint32>(10000))),
mortonSorting_(dict.getValOrSet("mortonSorting", Logical("Yes")))
{
if( regionType_ != "domain" )
{
pRegion_ = peakableRegion::create(
@ -53,7 +92,7 @@ pFlow::positionParticles::positionParticles
}
else
{
fileDictionary domainDictionary
fileDictionary domainDict
(
objectFile
{
@ -64,10 +103,12 @@ pFlow::positionParticles::positionParticles
},
&control.settings()
);
pRegion_ = peakableRegion::create("box", domainDictionary.subDict("globalBox"));
pRegion_ = peakableRegion::create(regionType_,domainDict.subDict("globalBox"));
}
}
pFlow::realx3Vector pFlow::positionParticles::getFinalPosition()
{
if(mortonSorting_)
@ -89,8 +130,10 @@ pFlow::uniquePtr<pFlow::positionParticles>
const dictionary & dict
)
{
word method = dict.getVal<word>("method");
if( dictionaryvCtorSelector_.search(method) )
{
return dictionaryvCtorSelector_[method] (control, dict);

View File

@ -40,8 +40,12 @@ private:
word regionType_;
uint32 maxNumberOfParticles_ = 10000;
Logical mortonSorting_;
realx3Vector sortByMortonCode(const realx3Vector& position)const;
protected:
@ -79,6 +83,12 @@ public:
return mortonSorting_();
}
inline
auto maxNumberOfParticles()const
{
return maxNumberOfParticles_;
}
virtual uint32 numPoints()const = 0;
virtual uint32 size()const = 0;

View File

@ -122,14 +122,14 @@ pFlow::positionRandom::positionRandom
position_
(
"position",
1,
maxNumberOfParticles(),
0,
RESERVE()
),
diameters_
(
"diameters",
1,
maxNumberOfParticles(),
0,
RESERVE()
)