Compare commits
16 Commits
8466e02d81
...
774afd5f37
Author | SHA1 | Date |
---|---|---|
|
774afd5f37 | |
|
191801b344 | |
|
545de300ae | |
|
9b3c4f83b9 | |
|
b315d12357 | |
|
7e7184f1c5 | |
|
9f489d07cc | |
|
3f1fa4ae90 | |
|
f0f185983c | |
|
cb6d567dab | |
|
3aff0f1fc6 | |
|
59fbaa91ab | |
|
f84484881c | |
|
1540321a31 | |
|
f4f5f29e3c | |
|
d909301f32 |
|
@ -74,7 +74,7 @@ pFlow::initialize_pFlowProcessors();
|
|||
|
||||
do
|
||||
{
|
||||
|
||||
//Ping;
|
||||
if(! sphInsertion.insertParticles(
|
||||
Control.time().currentIter(),
|
||||
Control.time().currentTime(),
|
||||
|
@ -84,27 +84,31 @@ 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++);
|
||||
|
||||
|
|
|
@ -35,10 +35,14 @@ 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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -27,6 +27,7 @@ Licence:
|
|||
|
||||
#include "pFlowMacros.hpp"
|
||||
#include "error.hpp"
|
||||
#include "iOstream.hpp"
|
||||
|
||||
// just for preventing the use of std namespace and adding some minor functionalities
|
||||
|
||||
|
|
|
@ -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,18 +44,17 @@ 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)
|
||||
|
@ -76,9 +75,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
|
||||
{
|
||||
|
@ -87,20 +86,21 @@ 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.
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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,17 +54,22 @@ 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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -30,7 +30,7 @@ pFlow::empty::empty(
|
|||
positionParticles(control, dict),
|
||||
position_
|
||||
(
|
||||
"empty",maxNumberOfParticles(), 0, RESERVE()
|
||||
"empty",1, 0, RESERVE()
|
||||
)
|
||||
{
|
||||
}
|
|
@ -146,8 +146,8 @@ pFlow::positionOrdered::positionOrdered
|
|||
position_
|
||||
(
|
||||
"positionOrdered",
|
||||
max(maxNumberOfParticles(), numPoints_),
|
||||
numPoints_ ,
|
||||
numPoints_,
|
||||
numPoints_,
|
||||
RESERVE()
|
||||
)
|
||||
{
|
||||
|
|
|
@ -32,45 +32,10 @@ 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,
|
||||
|
@ -78,12 +43,8 @@ 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(
|
||||
|
@ -92,7 +53,7 @@ pFlow::positionParticles::positionParticles
|
|||
}
|
||||
else
|
||||
{
|
||||
fileDictionary domainDict
|
||||
fileDictionary domainDictionary
|
||||
(
|
||||
objectFile
|
||||
{
|
||||
|
@ -103,12 +64,10 @@ pFlow::positionParticles::positionParticles
|
|||
},
|
||||
&control.settings()
|
||||
);
|
||||
pRegion_ = peakableRegion::create(regionType_,domainDict.subDict("globalBox"));
|
||||
pRegion_ = peakableRegion::create("box", domainDictionary.subDict("globalBox"));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
pFlow::realx3Vector pFlow::positionParticles::getFinalPosition()
|
||||
{
|
||||
if(mortonSorting_)
|
||||
|
@ -130,10 +89,8 @@ pFlow::uniquePtr<pFlow::positionParticles>
|
|||
const dictionary & dict
|
||||
)
|
||||
{
|
||||
|
||||
word method = dict.getVal<word>("method");
|
||||
|
||||
|
||||
if( dictionaryvCtorSelector_.search(method) )
|
||||
{
|
||||
return dictionaryvCtorSelector_[method] (control, dict);
|
||||
|
|
|
@ -40,12 +40,8 @@ private:
|
|||
|
||||
word regionType_;
|
||||
|
||||
uint32 maxNumberOfParticles_ = 10000;
|
||||
|
||||
Logical mortonSorting_;
|
||||
|
||||
|
||||
|
||||
realx3Vector sortByMortonCode(const realx3Vector& position)const;
|
||||
|
||||
protected:
|
||||
|
@ -83,12 +79,6 @@ public:
|
|||
return mortonSorting_();
|
||||
}
|
||||
|
||||
inline
|
||||
auto maxNumberOfParticles()const
|
||||
{
|
||||
return maxNumberOfParticles_;
|
||||
}
|
||||
|
||||
virtual uint32 numPoints()const = 0;
|
||||
|
||||
virtual uint32 size()const = 0;
|
||||
|
|
|
@ -122,14 +122,14 @@ pFlow::positionRandom::positionRandom
|
|||
position_
|
||||
(
|
||||
"position",
|
||||
maxNumberOfParticles(),
|
||||
1,
|
||||
0,
|
||||
RESERVE()
|
||||
),
|
||||
diameters_
|
||||
(
|
||||
"diameters",
|
||||
maxNumberOfParticles(),
|
||||
1,
|
||||
0,
|
||||
RESERVE()
|
||||
)
|
||||
|
|
Loading…
Reference in New Issue