Merge branch 'PhasicFlow:main' into main

This commit is contained in:
Simboy 2025-02-16 12:38:31 +08:00 committed by GitHub
commit 9ccc487a51
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
36 changed files with 953 additions and 371 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(),
@ -90,21 +90,25 @@ pFlow::initialize_pFlowProcessors();
// 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")<< REPORT(2)<<"Global damping "<<Yellow_Text("is active")<<
" and damping factor is "<<dampingFactor_<<END_REPORT; " and damping factor is "<<dampingFactor_<<END_REPORT;
}
else else
{
REPORT(2)<<"Global damping "<<Yellow_Text("is not active")<<"."<<END_REPORT; REPORT(2)<<"Global damping "<<Yellow_Text("is not active")<<"."<<END_REPORT;
}
} }

View File

@ -24,6 +24,7 @@ Licence:
#include <set> #include <set>
#include "types.hpp" #include "types.hpp"
#include "iOstream.hpp"
namespace pFlow namespace pFlow
{ {
@ -34,6 +35,20 @@ using Set = std::set<Key,std::less<Key>,std::allocator<Key>>;
using wordSet = Set<word>; using wordSet = Set<word>;
template<typename key>
iOstream& operator<<(iOstream& os, const Set<key>& s)
{
os << beginListToken();
for(auto elm = s.begin(); elm!=s.end(); )
{
os<< *elm++;
if( elm!=s.end() )
os<<spaceToken();
}
os<< endListToken();
os.check(FUNCTION_NAME);
return os;
}
} }

View File

@ -36,6 +36,8 @@ bool pFlow::systemControl::readIncludeExclue(const dictionary& dict)
} }
} }
REPORT(1)<<"IncludeObject list is: "<<Green_Text(includeList_)<<END_REPORT;
if (dict.containsDataEntry("excludeObjects")) if (dict.containsDataEntry("excludeObjects"))
{ {
wordList excld = dict.getVal<wordList>("excludeObjects"); wordList excld = dict.getVal<wordList>("excludeObjects");
@ -44,6 +46,8 @@ bool pFlow::systemControl::readIncludeExclue(const dictionary& dict)
excludeList_.insert(nm); excludeList_.insert(nm);
} }
} }
REPORT(1)<<"excludeObject list is: "<<Green_Text(excludeList_)<<END_REPORT;
return true; return true;
} }

View File

@ -1,7 +1,7 @@
# Problem Definition # Problem Definition
The problem is to simulate a Rotary Air-Lock Valve. The external diameter of rotor is about 21 cm. There is one type of particle in this simulation. Particles are inserted into the inlet of the valve from t=**0** s. The problem is to simulate a Rotary Air-Lock Valve. The external diameter of rotor is about 21 cm. There is one type of particle in this simulation. Particles are inserted into the inlet of the valve from t=**0** s.
* **28000** particles with **5 mm** diameter are inserted into the valve with the rate of **4000 particles/s**. * **28000** particles with **5 mm** diameter are inserted into the valve with the rate of **4000 particles/s**.
* The rotor starts its ortation at t = 1.25 s at the rate of 2.1 rad/s. * The rotor starts its rotation at t = 1.25 s at the rate of 2.1 rad/s.
<html> <html>

View File

@ -46,7 +46,7 @@ model
nu (0.25 0.25 // Poisson's ratio [-] nu (0.25 0.25 // Poisson's ratio [-]
0.25); 0.25);
en (0.7 0.8 // coefficient of normal restitution en (0.70 0.80 // coefficient of normal restitution
1.0); 1.0);
et (1.0 1.0 // coefficient of tangential restitution et (1.0 1.0 // coefficient of tangential restitution

View File

@ -45,7 +45,6 @@ in <b>settings/particlesDict</b> file
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
@ -78,7 +77,7 @@ 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
{ {
@ -100,6 +99,7 @@ setFields
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
{ {
/* /*

View File

@ -55,15 +55,20 @@ surfaces
belt belt
{ {
type stlWall; // type of the wall type stlWall; // type of the wall
file belt.stl; // file name in stl folder file belt.stl; // file name in stl folder
material wallMat; // material name of this wall material wallMat; // material name of this wall
motion conveyorBelt1; // motion component name 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 file box.stl; // file name in stl folder
material wallMat; // material name of this wall material wallMat; // material name of this wall
} }
} }

View File

@ -0,0 +1,16 @@
# Simulating a simple homogenization silo using periodic boundary
## Problem
A homogenization silo is used to mix particles inside a silo using the circulation of particles. A pneumatic conveying system is used to carry particles at the exit and re-enter them from the top. Here, we use a `periodic` boundary to simulate the action of the pneumatic conveyor system for circulating particles. Particles that are exiting from the bottom are re-entered from top using this boundary (`periodic`).
<div align ="center">
<b>
A view of homogenization silo
</b>
<img src="./homoSilo.jpeg" style="width: 400px;">
</div>
***

View File

@ -0,0 +1,67 @@
/* -------------------------------*- C++ -*--------------------------------- *\
| phasicFlow File |
| copyright: www.cemf.ir |
\* ------------------------------------------------------------------------- */
objectName interaction;
objectType dicrionary;
fileFormat ASCII;
/*---------------------------------------------------------------------------*/
materials (lightMat heavyMat wallMat); // a list of materials names
densities (1000 1500.0 2500); // density of materials [kg/m3]
contactListType sortedContactList;
contactSearch
{
method NBS; // method for broad search particle-particle
updateInterval 10;
sizeRatio 1.1;
cellExtent 0.55;
adjustableBox No;
}
model
{
contactForceModel nonLinearLimited;
rollingFrictionModel normal;
/*
Property (lightMat-lightMat lightMat-heavyMat lightMat-wallMat
heavyMat-heavyMat heavyMat-wallMat
wallMat-wallMat );
*/
Yeff (1.0e6 1.0e6 1.0e6 // Young modulus [Pa]
1.0e6 1.0e6
1.0e6);
Geff (0.8e6 0.8e6 0.8e6 // Shear modulus [Pa]
0.8e6 0.8e6
0.8e6);
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);
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);
}

View File

@ -0,0 +1,214 @@
/* -------------------------------*- C++ -*--------------------------------- *\
| phasicFlow File |
| copyright: www.cemf.ir |
\* ------------------------------------------------------------------------- */
objectName particleInsertion;
objectType dicrionary;
fileFormat ASCII;
/*---------------------------------------------------------------------------*/
active Yes; // is insertion active -> yes or no
/*
one layers of particles are packed
*/
layer0
{
timeControl simulationTime;
regionType cylinder; // type of insertion region
rate 5100; // insertion rate (particles/s)
startTime 0; // (s)
endTime 0.5; // (s)
insertionInterval 0.025; // s
cylinderInfo
{
radius 0.09; // radius of cylinder (m)
p1 (0.0 0.0 0.1); // (m,m,m)
p2 (0.0 0.0 0.11); // (m,m,m)
}
setFields
{
velocity realx3 (0.0 0.0 -0.6); // initial velocity of inserted particles
}
mixture
{
parType1 1; // mixture composition of inserted particles
}
}
layer1
{
timeControl simulationTime;
regionType cylinder; // type of insertion region
rate 5100; // insertion rate (particles/s)
startTime 0.7; // (s)
endTime 1.2; // (s)
insertionInterval 0.025; // s
cylinderInfo
{
radius 0.09;
p1 (0.0 0.0 0.16 ); // (m,m,m)
p2 (0.0 0.0 0.17); // (m,m,m)
}
setFields
{
velocity realx3 (0.0 0.0 -0.6);
}
mixture
{
parType2 1; // only parType2
}
}
layer2
{
timeControl simulationTime;
regionType cylinder; // type of insertion region
rate 5100; // insertion rate (particles/s)
startTime 1.4; // (s)
endTime 1.9; // (s)
insertionInterval 0.025; // s
cylinderInfo
{
radius 0.09;
p1 ( 0.0 0.0 0.2 ); // (m,m,m)
p2 ( 0.0 0.0 0.21); // (m,m,m)
}
setFields
{
velocity realx3 (0.0 0.0 -0.6);
}
mixture
{
lightSphere 1; // only lightSphere
}
}
layer3
{
timeControl simulationTime;
regionType cylinder; // type of insertion region
rate 5100; // insertion rate (particles/s)
startTime 2.1; // (s)
endTime 2.6; // (s)
insertionInterval 0.025; // s
cylinderInfo
{
radius 0.09;
p1 ( 0.0 0.0 0.28 ); // (m,m,m)
p2 ( 0.0 0.0 0.29); // (m,m,m)
}
setFields
{
velocity realx3 (0.0 0.0 -0.6);
}
mixture
{
heavySphere 1;
}
}
layer4
{
timeControl simulationTime;
regionType cylinder; // type of insertion region
rate 5100; // insertion rate (particles/s)
startTime 2.8; // (s)
endTime 3.3; // (s)
insertionInterval 0.025; // s
cylinderInfo
{
radius 0.09;
p1 ( 0.0 0.0 0.37 ); // (m,m,m)
p2 ( 0.0 0.0 0.38); // (m,m,m)
}
setFields
{
velocity realx3 (0.0 0.0 -0.6);
}
mixture
{
lightSphere 1;
}
}
layer5
{
timeControl simulationTime;
regionType cylinder; // type of insertion region
rate 5100; // insertion rate (particles/s)
startTime 3.4; // (s)
endTime 3.9; // (s)
insertionInterval 0.025; // s
cylinderInfo
{
radius 0.09;
p1 ( 0.0 0.0 0.38 ); // (m,m,m)
p2 ( 0.0 0.0 0.39); // (m,m,m)
}
setFields
{
velocity realx3 (0.0 0.0 -0.6);
}
mixture
{
heavySphere 1;
}
}

View File

@ -2,18 +2,14 @@
| phasicFlow File | | phasicFlow File |
| copyright: www.cemf.ir | | copyright: www.cemf.ir |
\* ------------------------------------------------------------------------- */ \* ------------------------------------------------------------------------- */
objectName particleInsertion;
objectType dicrionary;
fileFormat ASCII;
/*---------------------------------------------------------------------------*/
objectName sphereDict; objectName sphereDict;
objectType sphereShape; objectType sphereShape;
fileFormat ASCII;
/*---------------------------------------------------------------------------*/
names (parType1 parType2); // names of shapes
// names of shapes diameters (0.00885 0.0089); // diameter of shapes
names (sphere);
materials (lightMat heavyMat); // material names for shapes
// diameter of shapes
diameters (0.005);
// material names for shapes
materials (sphereMat);

View File

@ -0,0 +1,7 @@
#!/bin/sh
cd ${0%/*} || exit 1 # Run from this directory
ls | grep -P "^(([0-9]+\.?[0-9]*)|(\.[0-9]+))$" | xargs -d"\n" rm -rf
rm -rf VTK
#------------------------------------------------------------------------------

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

View File

@ -0,0 +1,24 @@
#!/bin/sh
cd ${0%/*} || exit 1 # Run from this directory
echo "\n<--------------------------------------------------------------------->"
echo "1) Creating particles"
echo "<--------------------------------------------------------------------->\n"
particlesPhasicFlow
echo "\n<--------------------------------------------------------------------->"
echo "2) Creating geometry"
echo "<--------------------------------------------------------------------->\n"
geometryPhasicFlow
echo "\n<--------------------------------------------------------------------->"
echo "3) Running the case"
echo "<--------------------------------------------------------------------->\n"
sphereGranFlow
echo "\n<--------------------------------------------------------------------->"
echo "4) Converting to vtk"
echo "<--------------------------------------------------------------------->\n"
pFlowToVTK --fields diameter velocity id --binary
#------------------------------------------------------------------------------

View File

@ -0,0 +1,52 @@
/* -------------------------------*- C++ -*--------------------------------- *\
| phasicFlow File |
| copyright: www.cemf.ir |
\* ------------------------------------------------------------------------- */
objectName domainDict;
objectType dictionary;
fileFormat ASCII;
/*---------------------------------------------------------------------------*/
// Simulation domain: every particles that goes outside this domain will be deleted
globalBox
{
min (-0.11 -0.11 -0.15);
max ( 0.11 0.11 0.4);
}
boundaries
{
left
{
type exit;
}
right
{
type exit;
}
bottom
{
type exit;
}
top
{
type exit;
}
rear
{
type periodic;
}
front
{
type periodic;
}
}

View File

@ -0,0 +1,87 @@
/* -------------------------------*- C++ -*--------------------------------- *\
| phasicFlow File |
| copyright: www.cemf.ir |
\* ------------------------------------------------------------------------- */
objectName geometryDict;
objectType dictionary;
fileFormat ASCII;
/*---------------------------------------------------------------------------*/
motionModel rotatingAxis;
rotatingAxisInfo
{
// for opening the gate of silo between time 4.1 and 5.1 s
gateMotion
{
p1 (-0.04 -0.04 -0.1);
p2 (-0.04 -0.04 0.0);
omega 3.14;
startTime 4.1;
endTime 5.1;
}
}
surfaces
{
cylinderShell
{
type cylinderWall; // other options: cuboidWall and planeWall
p1 (0.0 0.0 0.0); // begin point of cylinder axis
p2 (0.0 0.0 0.4); // end point of cylinder axis
radius1 0.1; // radius at p1
radius2 0.1; // radius at p2
resolution 36; // number of divisions
material wallMat; // material name of this wall
}
coneShell
{
type cylinderWall; // other options: cuboidWall and planeWall
p1 (0.0 0.0 -0.1); // begin point of cylinder axis
p2 (0.0 0.0 0.0); // end point of cylinder axis
radius1 0.04; // radius at p1
radius2 0.1; // radius at p2
resolution 36; // number of divisions
material wallMat; // material name of this wall
}
/*
This is a plane wall at the exit of silo
*/
exitGate
{
type planeWall; // other options: cuboidWall and cylinderWall
p1 (-0.04 -0.04 -0.1); // first point of the wall
p2 ( 0.04 -0.04 -0.1); // second point of the wall
p3 ( 0.04 0.04 -0.1); // third point of the wall
p4 (-0.04 0.04 -0.1); // fourth point of the wall
material wallMat; // material name of the wall
motion gateMotion;
}
}

View File

@ -0,0 +1,36 @@
/* -------------------------------*- C++ -*--------------------------------- *\
| phasicFlow File |
| copyright: www.cemf.ir |
\* ------------------------------------------------------------------------- */
objectName particlesDict;
objectType dictionary;
fileFormat ASCII;
/*---------------------------------------------------------------------------*/
setFields
{
/*
Default value for fields defined for particles
These fields should always be defined for simulations with
spherical particles.
*/
defaultValue
{
velocity realx3 (0 0 0); // linear velocity (m/s)
acceleration realx3 (0 0 0); // linear acceleration (m/s2)
rVelocity realx3 (0 0 0); // rotational velocity (rad/s)
shapeName word parType1; // name of the particle shape
}
selectors
{}
}
positionParticles
{
method empty; // empty simulation
}

View File

@ -0,0 +1,41 @@
/* -------------------------------*- C++ -*--------------------------------- *\
| phasicFlow File |
| copyright: www.cemf.ir |
\* ------------------------------------------------------------------------- */
objectName settingsDict;
objectType dictionary;
fileFormat ASCII;
/*---------------------------------------------------------------------------*/
run homogenizationSilo;
dt 0.00001; // time step for integration (s)
startTime 0.0; // start time for simulation
endTime 20; // end time for simulation
saveInterval 0.05; // time interval for saving the simulation
timePrecision 4; // maximum number of digits for time folder
g (0 0 -9.8); // gravity vector (m/s2)
// overrides the default behavior
includeObjects (diameter);
// exclude unnecessary data from saving on disk
excludeObjects (rVelocity.dy1 rVelocity.dy2 rVelocity.dy3
pStructPosition.dy1 pStructPosition.dy2 pStructPosition.dy3
pStructVelocity.dy1 pStructVelocity.dy2 pStructVelocity.dy3);
integrationMethod AdamsBashforth4; // integration method
writeFormat binary; // data writting format (ascii or binary)
timersReport Yes; // report timers
timersReportInterval 0.1; // time interval for reporting timers

View File

@ -54,10 +54,6 @@ model
0.97 0.85 0.97 0.85
1.00); 1.00);
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 mu (0.65 0.65 0.35 // dynamic friction
0.65 0.35 0.65 0.35
0.35); 0.35);
@ -66,6 +62,3 @@ model
0.1 0.1 0.1 0.1
0.1); 0.1);
} }

View File

@ -6,35 +6,27 @@ objectName particleInsertion;
objectType dicrionary; objectType dicrionary;
fileFormat ASCII; fileFormat ASCII;
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
active Yes; // is insertion active -> yes or no
checkForCollision No; // is checked -> yes or no // is insertion active -> yes or no
active Yes;
/* /*
one layers of particles are packed six layers of particles are packed
*/ */
layer0 layer0
{ {
timeControl simulationTime; timeControl simulationTime;
regionType cylinder; // type of insertion region regionType cylinder; // type of insertion region
rate 15000; // insertion rate (particles/s) rate 15000; // insertion rate (particles/s)
startTime 0; // (s) startTime 0; // (s)
endTime 0.5; // (s) endTime 0.5; // (s)
insertionInterval 0.025; // s insertionInterval 0.025; // s
cylinderInfo cylinderInfo
{ {
radius 0.09; // radius of cylinder (m) radius 0.09; // radius of cylinder (m)
p1 (0.0 0.0 0.1); // (m,m,m)
p1 ( 0.0 0.0 0.1 ); // (m,m,m) p2 (0.0 0.0 0.11); // (m,m,m)
p2 ( 0.0 0.0 0.11); // (m,m,m)
} }
setFields setFields
@ -48,7 +40,138 @@ layer0
} }
} }
layer1
{
timeControl simulationTime;
regionType cylinder; // type of insertion region
rate 15000; // insertion rate (particles/s)
startTime 0.7; // (s)
endTime 1.2; // (s)
insertionInterval 0.025; // s
cylinderInfo
{
radius 0.09;
p1 (0.0 0.0 0.16 ); // (m,m,m)
p2 (0.0 0.0 0.17); // (m,m,m)
}
setFields
{
velocity realx3 (0.0 0.0 -0.6);
}
mixture
{
heavySphere 1; // only heavySphere
}
}
layer2
{
timeControl simulationTime;
regionType cylinder; // type of insertion region
rate 15000; // insertion rate (particles/s)
startTime 1.4; // (s)
endTime 1.9; // (s)
insertionInterval 0.025; // s
cylinderInfo
{
radius 0.09;
p1 ( 0.0 0.0 0.2 ); // (m,m,m)
p2 ( 0.0 0.0 0.21); // (m,m,m)
}
setFields
{
velocity realx3 (0.0 0.0 -0.6);
}
mixture
{
lightSphere 1; // only lightSphere
}
}
layer3
{
timeControl simulationTime;
regionType cylinder; // type of insertion region
rate 15000; // insertion rate (particles/s)
startTime 2.1; // (s)
endTime 2.6; // (s)
insertionInterval 0.025; // s
cylinderInfo
{
radius 0.09;
p1 ( 0.0 0.0 0.28 ); // (m,m,m)
p2 ( 0.0 0.0 0.29); // (m,m,m)
}
setFields
{
velocity realx3 (0.0 0.0 -0.6);
}
mixture
{
heavySphere 1;
}
}
layer4
{
timeControl simulationTime;
regionType cylinder; // type of insertion region
rate 15000; // insertion rate (particles/s)
startTime 2.8; // (s)
endTime 3.3; // (s)
insertionInterval 0.025; // s
cylinderInfo
{
radius 0.09;
p1 ( 0.0 0.0 0.37 ); // (m,m,m)
p2 ( 0.0 0.0 0.38); // (m,m,m)
}
setFields
{
velocity realx3 (0.0 0.0 -0.6);
}
mixture
{
lightSphere 1;
}
}
layer5
{
timeControl simulationTime;
regionType cylinder; // type of insertion region
rate 15000; // insertion rate (particles/s)
startTime 3.4; // (s)
endTime 3.9; // (s)
insertionInterval 0.025; // s
cylinderInfo
{
radius 0.09;
p1 ( 0.0 0.0 0.38); // (m,m,m)
p2 ( 0.0 0.0 0.39); // (m,m,m)
}
setFields
{
velocity realx3 (0.0 0.0 -0.6);
}
mixture
{
heavySphere 1;
}
}

View File

@ -2,64 +2,49 @@
| phasicFlow File | | phasicFlow File |
| copyright: www.cemf.ir | | copyright: www.cemf.ir |
\* ------------------------------------------------------------------------- */ \* ------------------------------------------------------------------------- */
objectName domainDict; objectName domainDict;
objectType dictionary; objectType dictionary;
fileFormat ASCII; fileFormat ASCII;
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
globalBox // Simulation domain: every particles that goes outside this domain will be deleted
// Simulation domain: every particle that goes outside this domain will be deleted
globalBox
{ {
min (-0.11 -0.11 -0.11); min (-0.11 -0.11 -0.11);
max ( 0.11 0.11 0.41); max ( 0.11 0.11 0.41);
} }
boundaries boundaries
{ {
// Determines how often (how many iterations) do you want to
// rebuild the list of particles in the neighbor list
// of all boundaries in the simulation domain
neighborListUpdateInterval 30;
// Determines how often do you want to update the new changes in the boundary
updateInterval 10;
// The distance from the boundary plane within which particles are marked to be in the boundary list
neighborLength 0.004;
left left
{ {
type exit; // other options: periodict, reflective type exit; // other options: periodic, reflective
} }
right right
{ {
type exit; // other options: periodict, reflective type exit; // other options: periodic, reflective
} }
bottom bottom
{ {
type exit; // other options: periodict, reflective type exit; // other options: periodic, reflective
} }
top top
{ {
type exit; // other options: periodict, reflective type exit; // other options: periodic, reflective
} }
rear rear
{ {
type exit; // other options: periodict, reflective type exit; // other options: periodic, reflective
} }
front front
{ {
type exit; // other options: periodict, reflective type exit; // other options: periodic, reflective
} }
} }

View File

@ -2,15 +2,18 @@
| phasicFlow File | | phasicFlow File |
| copyright: www.cemf.ir | | copyright: www.cemf.ir |
\* ------------------------------------------------------------------------- */ \* ------------------------------------------------------------------------- */
objectName geometryDict; objectName geometryDict;
objectType dictionary; objectType dictionary;
fileFormat ASCII; fileFormat ASCII;
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
motionModel stationary; // motion model can be rotatingAxis or stationary or vibrating
motionModel stationary; // motion model can be rotatingAxis, stationary, or vibrating
stationaryInfo stationaryInfo
{ {
// No additional information needed for stationary motion model
} }
surfaces surfaces
@ -18,59 +21,35 @@ surfaces
cylinderShell cylinderShell
{ {
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.4); // end point of cylinder axis p2 (0.0 0.0 0.4); // end point of cylinder axis
radius1 0.1; // radius at p1 radius1 0.1; // radius at p1
radius2 0.1; // radius at p2 radius2 0.1; // radius at p2
resolution 36; // number of divisions resolution 36; // number of divisions
material wallMat; // material name of this wall material wallMat; // material name of this wall
} }
coneShell coneShell
{ {
type cylinderWall; // other options: cuboidWall and planeWall type cylinderWall; // other options: cuboidWall and planeWall
p1 (0.0 0.0 -0.1); // begin point of cylinder axis p1 (0.0 0.0 -0.1); // begin point of cylinder axis
p2 (0.0 0.0 0.0); // end point of cylinder axis p2 (0.0 0.0 0.0); // end point of cylinder axis
radius1 0.02; // radius at p1 radius1 0.02; // radius at p1
radius2 0.1; // radius at p2 radius2 0.1; // radius at p2
resolution 36; // number of divisions resolution 36; // number of divisions
material wallMat; // material name of this wall material wallMat; // material name of this wall
} }
/* /*
This is a plane wall at the exit of silo This is a plane wall at the exit of the silo that plugs the exit.
*/ */
exitGate exitGate
{ {
type planeWall; // other options: cuboidWall and cylinderWall type planeWall; // other options: cuboidWall and cylinderWall
p1 (-0.02 -0.02 -0.1); // first point of the wall p1 (-0.02 -0.02 -0.1); // first point of the wall
p2 ( 0.02 -0.02 -0.1); // second point of the wall p2 ( 0.02 -0.02 -0.1); // second point of the wall
p3 ( 0.02 0.02 -0.1); // third point of the wall p3 ( 0.02 0.02 -0.1); // third point of the wall
p4 (-0.02 0.02 -0.1); // fourth point of the wall p4 (-0.02 0.02 -0.1); // fourth point of the wall
material wallMat; // material name of the wall material wallMat; // material name of the wall
} }
} }

View File

@ -10,9 +10,7 @@ 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.
*/ */
@ -20,7 +18,7 @@ setFields
{ {
velocity realx3 (0 0 0); // linear velocity (m/s) velocity realx3 (0 0 0); // linear velocity (m/s)
acceleration realx3 (0 0 0); // linear acceleration (m/s2) acceleration realx3 (0 0 0); // linear acceleration (m/s^2)
rVelocity realx3 (0 0 0); // rotational velocity (rad/s) rVelocity realx3 (0 0 0); // rotational velocity (rad/s)
@ -31,17 +29,8 @@ setFields
{} {}
} }
positionParticles // positions particles positionParticles
{ {
method empty; // other options: ordered and random method empty; // empty simulation
regionType box; // other options: cylinder and sphere
boxInfo // box region for positioning particles
{
min (-0.08 -0.08 0.015); // lower corner point of the box
max ( 0.08 0.08 0.098); // upper corner point of the box
}
} }

View File

@ -6,7 +6,7 @@ objectName settingsDict;
objectType dictionary; objectType dictionary;
fileFormat ASCII; fileFormat ASCII;
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
run layerdSiloFilling; run layeredSiloFilling;
dt 0.00001; // time step for integration (s) dt 0.00001; // time step for integration (s)
@ -18,25 +18,19 @@ saveInterval 0.05; // time interval for saving the simula
timePrecision 6; // maximum number of digits for time folder timePrecision 6; // maximum number of digits for time folder
g (0 0 -9.8); // gravity vector (m/s2) g (0 0 -9.8); // gravity vector (m/s^2)
// save data objects that are not automatically saved on disk. // save data objects that are not automatically saved on disk.
// overrides the default behavior // overrides the default behavior
includeObjects (diameter mass);
includeObjects (diameter);
// exclude unnecessary data from saving on disk // exclude unnecessary data from saving on disk
excludeObjects (rVelocity.dy1 pStructPosition.dy1 pStructVelocity.dy1); excludeObjects (rVelocity.dy1 pStructPosition.dy1 pStructVelocity.dy1);
integrationMethod AdamsBashforth2; // integration method integrationMethod AdamsBashforth2; // integration method
writeFormat ascii; // data writting format (ascii or binary) writeFormat ascii; // data writing format (ascii or binary)
timersReport Yes; // report timers timersReport Yes; // report timers
timersReportInterval 0.01; // time interval for reporting timers timersReportInterval 0.05; // time interval for reporting timers

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()
) )