Merge pull request #185 from ramin1728/RotatingDrumWithBaffles

Rotating drum with baffles
This commit is contained in:
PhasicFlow 2025-03-06 18:40:59 +03:30 committed by GitHub
commit bff34bbb9e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 145 additions and 206 deletions

View File

@ -1,5 +1,5 @@
# Problem Definition
The problem is to simulate a rotating drum with the diameter **0.24 m**, the length **0.1 m** and **6** Baffles, rotating at **15 rpm**. This drum is filled with **20000** Particles.The timestep for integration is **0.00001 s**. There are 2 types of Particles in this drum each are being inserted during simulation to fill the drum.
# Problem Definition (v-1.0)
The problem is to simulate a rotating drum with a diameter of 0.24 m, a length of 0.1 m and 6 baffles rotating at 15 rpm. This drum is filled with 20000 particles, the integration time step is 0.00001 s. There are 2 types of particles in this drum, each of which is inserted during the simulation to fill the drum.
* **12500** Particles with **4 mm** diameter, at the rate of 12500 particles/s for 1 sec.
* **7500** Particles with **5mm** diameter, at the rate of 7500 particles/s for 1 sec.
@ -15,10 +15,10 @@ The problem is to simulate a rotating drum with the diameter **0.24 m**, the len
</html>
# Setting up the Case
As it has been explained in the previous cases, the simulation case setup is based on text-based scripts. Here, the simulation case setup are sotred in three folders: `caseSetup`, `setting` and `stl` (see the above folders).
As it has been explained in the previous cases, the simulation case setup is based on text-based scripts. Here, the simulation case setup are sorted in three folders: `caseSetup`, `setting` and `stl`.
## Defining small and large particles
Then in the `caseSetup/sphereShape` the diameter and the material name of the particles are defined. Two sizes are defined: 4 and 5 mm.
Then in the `caseSetup/shapes` the diameter and the material name of the particles are defined. Two sizes are defined: 4 and 5 mm.
```C++
// names of shapes
names (smallSphere largeSphere);
@ -30,7 +30,7 @@ materials (lightMat heavyMat);
## Particle Insertion
In this case we have two region for inserting our particles. In the both region we define rate of insertion, start and end time of insertion, information for the volume of the space throught which particles are being inserted. The insertion phase in the simulation is performed between times 0 and 1 seconds.
In this case we have two regions for inserting the particles. In both regions we define the insertion rate, the start and end time of the insertion, information about the volume of space through which the particles are inserted. The insertion phase in the simulation is performed between times 0 and 1 second.
For example, for the insertion region for inserting light particles is shown below.
<div align="center">
@ -43,7 +43,8 @@ in <b>caseSetup/particleInsertion</b> file
layerrightregion
{
// type of insertion region
type cylinderRegion;
timeControl simulationTime;
regionType cylinder;
// insertion rate (particles/s)
rate 12500;
// Start time of LightParticles insertion (s)
@ -51,9 +52,9 @@ layerrightregion
// End time of LightParticles insertion (s)
endTime 1;
// Time Interval of LightParticles insertion (s)
interval 0.025;
insertionInterval 0.025;
cylinderRegionInfo
cylinderInfo
{
// Coordinates of cylinderRegion (m,m,m)
p2 (-0.15 0.25 0.05);
@ -64,7 +65,7 @@ layerrightregion
}
```
## Interaction between particles and walls
In `caseSetup/interaction` file, material names and properties and interaction parameters are defined: interaction between the particles and the shell of rotating drum. Since we are defining 3 materials for simulation, the interaction matrix is 3x3, while we are only required to enter upper-triangle elements (interactions are symetric).
The `caseSetup/interaction` file defines the material names and properties as well as the interaction parameters: the interaction between the particles and the shell of the rotating drum. Since we define 3 materials for simulation, the interaction matrix is 3x3, while we only need to enter upper triangle elements (interactions are symmetric).
```C++
// a list of materials names
@ -93,10 +94,6 @@ densities (1000 1500 2500);
en (0.97 0.97 0.85
0.97 0.85
1.00);
// coefficient of tangential restitution
et (1.0 1.0 1.0
1.0 1.0
1.0);
// dynamic friction
mu (0.65 0.65 0.35
0.65 0.35
@ -166,7 +163,8 @@ surfaces
In this part of `geometryDict` the information of rotating axis and speed of rotation are defined. The start of rotation is at 2 s. The first 2 seconds of simulation is for allowing particles to settle donw in the drum.
```C++
rotatingAxisMotionInfo
motionModel rotatingAxis;
rotatingAxisInfo
{
rotAxis
{
@ -184,9 +182,9 @@ rotatingAxisMotionInfo
}
```
## Performing Simulation
To perform simulations, enter the following commands one after another in the terminal.
To run simulations, type the following commands in the terminal one at a time.
Enter `$ particlesPhasicFlow` command to create the initial fields for particles.
Enter `$ geometryPhasicFlow` command to create the Geometry.
At last, enter `$ sphereGranFlow` command to start the simulation.
After finishing the simulation, you can use `$ pFlowtoVTK` to convert the results into vtk format storred in ./VTK folder.
Enter `particlesPhasicFlow` command to create the initial fields for particles.
Enter `geometryPhasicFlow` command to create the Geometry.
At last, enter `sphereGranFlow` command to start the simulation.
After finishing the simulation, you can use `pFlowtoVTK` to convert the results into vtk format stored in ./VTK folder.

View File

@ -6,62 +6,58 @@ objectName interaction;
objectType dicrionary;
fileFormat ASCII;
/*---------------------------------------------------------------------------*/
materials (lightMat heavyMat wallMat); // a list of materials names
materials (lightMat heavyMat wallMat); // a list of materials names
densities (1000 1500 2500); // density of materials [kg/m3]
densities (1000 1500 2500); // density of materials [kg/m3]
contactListType sortedContactList;
contactListType sortedContactList;
contactSearch
{
method NBS; // method for broad search
method NBS; // method for broad search
updateInterval 10;
updateInterval 10;
sizeRatio 1.1;
sizeRatio 1.1;
cellExtent 0.55;
cellExtent 0.55;
adjustableBox Yes;
adjustableBox Yes;
}
model
{
contactForceModel nonLinearLimited;
contactForceModel nonLinearLimited;
rollingFrictionModel normal;
rollingFrictionModel normal;
/*
Property (lightMat-lightMat lightMat-heavyMat lightMat-wallMat
heavyMat-heavyMat heavyMat-wallMat
wallMat-wallMat);
*/
/*
Property (lightMat-lightMat lightMat-heavyMat lightMat-wallMat
heavyMat-heavyMat heavyMat-wallMat
wallMat-wallMat);
*/
Yeff (1.0e6 1.0e6 1.0e6
1.0e6 1.0e6
1.0e6); // Young modulus [Pa]
Yeff (1.0e6 1.0e6 1.0e6
1.0e6 1.0e6
1.0e6); // Young modulus [Pa]
Geff (0.8e6 0.8e6 0.8e6
0.8e6 0.8e6
0.8e6); // Shear modulus [Pa]
Geff (0.8e6 0.8e6 0.8e6
0.8e6 0.8e6
0.8e6); // Shear modulus [Pa]
nu (0.25 0.25 0.25
0.25 0.25
0.25); // Poisson's ratio [-]
nu (0.25 0.25 0.25
0.25 0.25
0.25); // Poisson's ratio [-]
en (0.97 0.97 0.85
0.97 0.85
1.00); // coefficient of normal restitution
et (1.0 1.0 1.0
1.0 1.0
1.0); // coefficient of tangential restitution
en (0.97 0.97 0.85
0.97 0.85
1.00); // coefficient of normal restitution
mu (0.65 0.65 0.35
0.65 0.35
0.35); // dynamic friction
mu (0.65 0.65 0.35
0.65 0.35
0.35); // dynamic friction
mur (0.1 0.1 0.1
0.1 0.1
0.1); // rolling friction
mur (0.1 0.1 0.1
0.1 0.1
0.1); // rolling friction
}

View File

@ -6,9 +6,7 @@ objectName particleInsertion;
objectType dicrionary;
fileFormat ASCII;
/*---------------------------------------------------------------------------*/
active Yes; // is insertion active -> Yes or No
checkForCollision No; // is checked -> Yes or No
active Yes; // is insertion active -> Yes or No
/*
Two layers of particles are packed one-by-one using 1 insertion steps
@ -17,70 +15,69 @@ checkForCollision No; // is checked -> Yes o
layerrightregion // Right Layer Region
{
timeControl simulationTime;
timeControl simulationTime;
regionType cylinder; // type of insertion region
regionType cylinder; // type of insertion region
rate 12500; // Right Region Particles Insertion Rate (particles/s)
rate 12500; // Right Region Particles Insertion Rate (particles/s)
startTime 0; // Start time of LightParticles insertion (s)
startTime 0; // Start time of LightParticles insertion (s)
endTime 1; // End time of LightParticles insertion (s)
endTime 1; // End time of LightParticles insertion (s)
insertionInterval 0.025; // Time Interval of LightParticles insertion (s)
insertionInterval 0.025; // Time Interval of LightParticles insertion (s)
cylinderInfo
{
cylinderInfo
{
p2 (-0.15 0.25 0.05); // Top of cylinderRegion (m,m,m)
p2 (-0.15 0.25 0.05); //
p1 (-0.15 0.24 0.05); // Bottom of cylinderRegion (m,m,m)
p1 (-0.15 0.24 0.05); // Bottom of cylinderRegion (m,m,m)
radius 0.035; // radius of cylinder (m)
}
radius 0.035; // radius of cylinder (m)
}
setFields
{
velocity realx3 (0.0 -0.6 0.0); // initial velocity of inserted particles
}
setFields
{
velocity realx3 (0.0 -0.6 0.0); // initial velocity of inserted particles
}
mixture
{
smallSphere 1; // mixture composition of inserted particles
}
mixture
{
smallSphere 1; // mixture composition of inserted particles
}
}
layerleftregion // Left Layer Region
{
timeControl simulationTime;
timeControl simulationTime;
regionType cylinder; // type of insertion region
regionType cylinder; // type of insertion region
rate 7500; // Left Region Particles Insertion Rate (particles/s)
rate 7500; // Left Region Particles Insertion Rate (particles/s)
startTime 0; // Start time of LightParticles insertion (s)
startTime 0; // Start time of LightParticles insertion (s)
endTime 1; // End time of LightParticles insertion (s)
endTime 1; // End time of LightParticles insertion (s)
insertionInterval 0.025; // Time Interval of LightParticles insertion (s)
insertionInterval 0.025; // Time Interval of LightParticles insertion (s)
cylinderInfo
{
p2 (-0.23 0.25 0.05); // Top of cylinderRegion (m,m,m)
cylinderInfo
{
p2 (-0.23 0.25 0.05); // Top of cylinderRegion (m,m,m)
p1 (-0.23 0.24 0.05); // Bottom of cylinderRegion (m,m,m)
p1 (-0.23 0.24 0.05); // Bottom of cylinderRegion (m,m,m)
radius 0.035; // radius of cylinder (m)
}
radius 0.035; // radius of cylinder (m)
}
setFields
{
velocity realx3 (0.0 -0.6 0.0); // initial velocity of inserted particles
}
setFields
{
velocity realx3 (0.0 -0.6 0.0); // initial velocity of inserted particles
}
mixture
{
largeSphere 1; // only heavySphere
}
mixture
{
largeSphere 1; // only heavySphere
}
}

View File

@ -6,8 +6,8 @@ objectName sphereDict;
objectType sphereShape;
fileFormat ASCII;
/*---------------------------------------------------------------------------*/
names (smallSphere largeSphere); // names of shapes
names (smallSphere largeSphere); // names of shapes
diameters (0.004 0.005); // diameter of shapes (m)
diameters (0.004 0.005); // diameter of shapes (m)
materials (lightMat heavyMat); // material names for shapes
materials (lightMat heavyMat); // material names for shapes

View File

@ -1,15 +0,0 @@
/* -------------------------------*- C++ -*--------------------------------- *\
| phasicFlow File |
| copyright: www.cemf.ir |
\* ------------------------------------------------------------------------- */
objectName sphereDict;
objectType sphereShape;
fileFormat ASCII;
/*---------------------------------------------------------------------------*/
// names of shapes
names (smallSphere largeSphere);
// diameter of shapes (m)
diameters (0.004 0.005);
// material names for shapes
materials (lightMat heavyMat);

View File

@ -8,33 +8,16 @@ fileFormat ASCII;
/*---------------------------------------------------------------------------*/
globalBox // Simulation domain: every particles that goes outside this domain will be deleted
{
min (-0.328 0.095 -0.025); // lower corner point of the box
min (-0.328 0.095 -0.025); // lower corner point of the box
max (-0.068 0.355 0.125); // upper corner point of the box
}
decomposition
{
direction z;
max (-0.068 0.355 0.125); // upper corner point of the box
}
boundaries
{
neighborListUpdateInterval 50; /* 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 */
updateInterval 10; // Determines how often do you want to update the new changes in the boundary
neighborLength 0.004; // The distance from the boundary plane within which particles are marked to be in the boundary list
left
left
{
type exit; // other options: periodic, reflective
type exit; // other options: periodic, reflective
}
right

View File

@ -10,17 +10,17 @@ motionModel rotatingAxis;
rotatingAxisInfo
{
rotAxis
rotAxis
{
p1 (-0.1974 0.2269 0); // first point for the axis of rotation
p1 (-0.1974 0.2269 0); // first point for the axis of rotation
p2 (-0.1974 0.2269 0.1); // second point for the axis of rotation
p2 (-0.1974 0.2269 0.1); // second point for the axis of rotation
omega 2.38733; // rotation speed (rad/s) => 15 rpm
omega 2.38733; // rotation speed (rad/s) => 15 rpm
startTime 2; // Start time of Geometry Rotating
startTime 2; // Start time of Geometry Rotating
endTime 9.5; // End time of Geometry Rotating
endTime 9.5; // End time of Geometry Rotating
}
}
@ -28,13 +28,13 @@ surfaces
{
body
{
type stlWall; // type of the wall
type stlWall; // type of the wall
file Body.stl; // file name in stl folder
file Body.stl; // file name in stl folder
material wallMat; // material name of this wall
material wallMat; // material name of this wall
motion rotAxis; // motion component name
motion rotAxis; // motion component name
}
/*
@ -43,19 +43,19 @@ surfaces
rearEnd
{
type cylinderWall; // type of the wall
type cylinderWall; // type of the wall
p1 (-0.1974 0.2269 -0.001); // first point for the axis of rotation
p2 (-0.1974 0.2269 0.0); // second point for the axis of rotation
p1 (-0.1974 0.2269 -0.001); // first point for the axis of rotation
p2 (-0.1974 0.2269 0.0); // second point for the axis of rotation
radius1 0.0001; // Radius of p1
radius1 0.0001; // Radius of p1
radius2 0.12; // Radius of p2
radius2 0.12; // Radius of p2
material wallMat; // material name of the wall
material wallMat; // material name of the wall
motion rotAxis; // motion component name
motion rotAxis; // motion component name
}
/*
@ -64,19 +64,18 @@ surfaces
frontEnd
{
type cylinderWall; // type of the wall
type cylinderWall; // type of the wall
p1 (-0.1974 0.2269 0.0989); // first point for the axis of rotation
p1 (-0.1974 0.2269 0.0989); // first point for the axis of rotation
p2 (-0.1974 0.2269 0.0990); // second point for the axis of rotation
p2 (-0.1974 0.2269 0.0990); // second point for the axis of rotation
radius1 0.0001; // Radius of p1
radius1 0.0001; // Radius of p1
radius2 0.12; // Radius of p2
radius2 0.12; // Radius of p2
material wallMat; // material name of the wall
material wallMat; // material name of the wall
motion rotAxis; // motion component name
motion rotAxis; // motion component name
}
}

View File

@ -16,13 +16,13 @@ setFields
spherical particles.
*/
defaultValue
defaultValue
{
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/s2)
rVelocity realx3 (0 0 0); // rotational velocity (rad/s)
rVelocity realx3 (0 0 0); // rotational velocity (rad/s)
shapeName word smallSphere; // name of the particle shape
}
@ -31,15 +31,15 @@ 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 20000; // end index of points
end 20000; // end index of points
stride 3; // stride for selector
stride 3; // stride for selector
}
fieldValue // fields that the selector is applied to
@ -52,27 +52,7 @@ setFields
positionParticles // positions particles
{
method ordered; // other options: random and empty
mortonSorting Yes; // perform initial sorting based on morton code?
orderedInfo
{
diameter 0.005; // minimum space between centers of particles
numPoints 20000; // number of particles in the simulation
axisOrder (z y x); // axis order for filling the space with particles
}
regionType box; // other options: cylinder and sphere
boxInfo // box information for positioning particles
{
min (-0.08 -0.08 0.015); // lower corner point of the box
max ( 0.08 0.08 0.2); // upper corner point of the box
}
method empty; // other options: random and ordered
}

View File

@ -6,29 +6,30 @@ objectName settingsDict;
objectType dictionary;
fileFormat ASCII;
/*---------------------------------------------------------------------------*/
run RotatingDrumwithBaffles;
run RotatingDrumwithBaffles;
dt 0.00001; // time step for integration (s)
dt 0.00001; // time step for integration (s)
startTime 0; // start time for simulation
startTime 0; // start time for simulation
endTime 10; // end time for simulation
endTime 10; // end time for simulation
saveInterval 0.05; // time interval for saving the simulation
saveInterval 0.05; // time interval for saving the simulation
timePrecision 6; // maximum number of digits for time folder
timePrecision 6; // maximum number of digits for time folder
g (0 -9.8 0); // gravity vector (m/s2)
g (0 -9.8 0); // gravity vector (m/s2)
includeObjects (diameter); // save necessary (i.e., required) data on disk
// save necessary (i.e., required) data on disk
includeObjects (diameter);
// exclude unnecessary data from saving on disk
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 writting format (ascii or binary)
timersReport Yes; // report timers (Yes or No)
timersReport Yes; // report timers (Yes or No)
timersReportInterval 0.01; // time interval for reporting timers
timersReportInterval 0.1; // time interval for reporting timers