Compare commits

...

16 Commits

Author SHA1 Message Date
HRN 774afd5f37 bug correction for the time when empty is used 2025-02-14 22:50:28 +03:30
PhasicFlow 191801b344
Merge pull request #165 from ramin1728/main
binarySystemOfParticles is Updated.
2025-02-14 20:42:14 +03:30
PhasicFlow 545de300ae
Merge pull request #166 from PhasicFlow/develop
edits
2025-02-14 20:40:44 +03:30
HRN 9b3c4f83b9 edits 2025-02-14 20:39:37 +03:30
ramin1728 b315d12357 conveyorBelt is Updated. 2025-02-11 23:35:58 +03:30
ramin1728 7e7184f1c5 binarySystemOfParticles is Updated. 2025-02-11 23:18:29 +03:30
PhasicFlow 9f489d07cc
Merge pull request #163 from PhasicFlow/develop
global damping is activated for velocity and rVelocity in both sphere…
2025-02-10 01:11:30 +03:30
PhasicFlow 3f1fa4ae90
Merge pull request #162 from wanqing0421/main
bug fix during the build process of cuda mode
2025-02-08 22:39:06 +03:30
wanqing0421 f0f185983c bug fix during the build process of cuda mode 2025-02-08 23:47:21 +08:00
PhasicFlow cb6d567dab
Merge pull request #161 from PhasicFlow/develop
AB5 is added and bug is resolved when particles are being inserted
2025-02-08 18:07:39 +03:30
PhasicFlow 3aff0f1fc6
Merge pull request #160 from PhasicFlow/develop
bug resolve, chekcForCollision is set to true for always, adjustable …
2025-02-07 23:16:48 +03:30
PhasicFlow 59fbaa91ab
Merge pull request #159 from PhasicFlow/develop
All messages are revisited for internal points and boundaries
2025-02-06 11:06:35 +03:30
PhasicFlow f84484881c
Merge pull request #158 from PhasicFlow/develop
pFlowToVTK now manages when Ctrl+C is used by user
2025-02-06 11:05:21 +03:30
PhasicFlow 1540321a31
Merge pull request #157 from PhasicFlow/develop
the need to provide neighborLength in domain dictionary is lifted. No…
2025-02-03 23:51:31 +03:30
PhasicFlow f4f5f29e3c
Merge pull request #156 from PhasicFlow/develop
Develop
2025-02-03 19:17:08 +03:30
PhasicFlow d909301f32
Merge pull request #155 from PhasicFlow/develop
Develop
2025-02-01 22:18:23 +03:30
14 changed files with 98 additions and 137 deletions

View File

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

View File

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

View File

@ -27,6 +27,7 @@ Licence:
#include "pFlowMacros.hpp" #include "pFlowMacros.hpp"
#include "error.hpp" #include "error.hpp"
#include "iOstream.hpp"
// just for preventing the use of std namespace and adding some minor functionalities // 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++ ```C++
names (smallSphere largeSphere); // names of shapes names (smallSphere largeSphere); // names of shapes
diameters (0.003 0.005); // diameter of shapes (m) diameters (0.003 0.005); // diameter of shapes (m)
materials (prop1 prop1); // material names for shapes materials (prop1 prop1); // material names for shapes
``` ```
### Positioning and initial mixture ### Positioning and initial mixture
@ -44,18 +44,17 @@ in <b>settings/particlesDict</b> file
// positions particles // positions particles
positionParticles positionParticles
{ {
method ordered; // other options: random or empty method ordered; // other options: random or empty
orderedInfo orderedInfo
{ {
diameter 0.005; // minimum space between centers of particles diameter 0.005; // minimum space between centers 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 axisOrder (z x y); // axis order for filling the space with particles
} }
regionType cylinder; // other options: box and sphere 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) 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) 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 Default value for fields defined for particles
These fields should always be defined for simulations with These fields should always be defined for simulations with
spherical particles. spherical particles.
*/ */
defaultValue defaultValue
{ {
@ -87,20 +86,21 @@ setFields
rotVelocity realx3 (0 0 0); // rotational velocity (rad/s) rotVelocity realx3 (0 0 0); // rotational velocity (rad/s)
shapeName word smallSphere; // name of the particle shape shapeName word smallSphere; // name of the particle shape
} }
selectors selectors
{ {
shapeAssigne shapeAssigne
{ {
selector stridedRange; // other options: box, cylinder, sphere, randomPoints selector stridedRange; // other options: box, cylinder, sphere, randomPoints
stridedRangeInfo 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
fieldValue // fields that the selector is applied to
{ {
/* /*
sets shapeName of the selected points to largeSphere 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. --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; objectType dicrionary;
fileFormat ASCII; 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; contactListType sortedContactList;
@ -38,14 +38,14 @@ model
Geff (0.8e6); // Shear modulus [Pa] 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 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 shapeAssigne
{ {
selector stridedRange; // other options: box, cylinder, sphere, randomPoints selector stridedRange; // other options: box, cylinder, sphere, randomPoints
stridedRangeInfo 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 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 positionParticles // positions particles
{ {
method ordered; // other options: random and empty method ordered; // other options: random and empty
orderedInfo 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 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 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 method NBS; // method for broad search particle-particle
updateInterval 10; updateInterval 10;
sizeRatio 1.1; sizeRatio 1.1;
cellExtent 0.55; cellExtent 0.55;
adjustableBox No; adjustableBox No;
} }
model model
@ -46,25 +46,25 @@ model
0.8e6 0.8e6 0.8e6 0.8e6
0.8e6); 0.8e6);
nu (0.25 0.25 0.25 // Poisson's ratio [-] nu (0.25 0.25 0.25 // Poisson's ratio [-]
0.25 0.25 0.25 0.25
0.25); 0.25);
en (0.97 0.97 0.85 // coefficient of normal restitution en (0.97 0.97 0.85 // coefficient of normal restitution
0.97 0.85 0.97 0.85
1.00); 1.00);
et (1.0 1.0 1.0 // coefficient of tangential restitution et (1.0 1.0 1.0 // coefficient of tangential restitution
1.0 1.0 1.0 1.0
1.0); 1.0);
mu (0.65 0.65 0.35 // dynamic friction mu (0.65 0.65 0.35 // dynamic friction
0.65 0.35 0.65 0.35
0.35); 0.35);
mur (0.1 0.1 0.1 // rolling friction mur (0.1 0.1 0.1 // rolling friction
0.1 0.1 0.1 0.1
0.1); 0.1);
} }

View File

@ -6,7 +6,7 @@ objectName geometryDict;
objectType dictionary; objectType dictionary;
fileFormat ASCII; 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 conveyorBeltInfo
{ {
@ -54,17 +54,22 @@ surfaces
belt belt
{ {
type stlWall; // type of the wall type stlWall; // type of the wall
file belt.stl; // file name in stl folder
material wallMat; // material name of this wall file belt.stl; // file name in stl folder
motion conveyorBelt1; // motion component name
material wallMat; // material name of this wall
motion conveyorBelt1; // motion component name
} }
box box
{ {
type stlWall; // type of the wall type stlWall; // type of the wall
file box.stl; // file name in stl folder
material wallMat; // material name of this 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), positionParticles(control, dict),
position_ position_
( (
"empty",maxNumberOfParticles(), 0, RESERVE() "empty",1, 0, RESERVE()
) )
{ {
} }

View File

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

View File

@ -32,45 +32,10 @@ pFlow::realx3Vector pFlow::positionParticles::sortByMortonCode(
uint64 index; 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; WARNING<<"Morton sorting is inactive!"<<END_WARNING;
return position; return position;
} }
pFlow::positionParticles::positionParticles pFlow::positionParticles::positionParticles
( (
systemControl& control, systemControl& control,
@ -78,12 +43,8 @@ pFlow::positionParticles::positionParticles
) )
: :
regionType_(dict.getValOrSet<word>("regionType", "domain")), regionType_(dict.getValOrSet<word>("regionType", "domain")),
maxNumberOfParticles_(dict.getValOrSet(
"maxNumberOfParticles",
static_cast<uint32>(10000))),
mortonSorting_(dict.getValOrSet("mortonSorting", Logical("Yes"))) mortonSorting_(dict.getValOrSet("mortonSorting", Logical("Yes")))
{ {
if( regionType_ != "domain" ) if( regionType_ != "domain" )
{ {
pRegion_ = peakableRegion::create( pRegion_ = peakableRegion::create(
@ -92,7 +53,7 @@ pFlow::positionParticles::positionParticles
} }
else else
{ {
fileDictionary domainDict fileDictionary domainDictionary
( (
objectFile objectFile
{ {
@ -103,12 +64,10 @@ pFlow::positionParticles::positionParticles
}, },
&control.settings() &control.settings()
); );
pRegion_ = peakableRegion::create(regionType_,domainDict.subDict("globalBox")); pRegion_ = peakableRegion::create("box", domainDictionary.subDict("globalBox"));
} }
} }
pFlow::realx3Vector pFlow::positionParticles::getFinalPosition() pFlow::realx3Vector pFlow::positionParticles::getFinalPosition()
{ {
if(mortonSorting_) if(mortonSorting_)
@ -130,10 +89,8 @@ pFlow::uniquePtr<pFlow::positionParticles>
const dictionary & dict const dictionary & dict
) )
{ {
word method = dict.getVal<word>("method"); word method = dict.getVal<word>("method");
if( dictionaryvCtorSelector_.search(method) ) if( dictionaryvCtorSelector_.search(method) )
{ {
return dictionaryvCtorSelector_[method] (control, dict); return dictionaryvCtorSelector_[method] (control, dict);

View File

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

View File

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