diff --git a/tutorials/sphereGranFlow/RotatingDrumWithBaffles/ReadMe.md b/tutorials/sphereGranFlow/RotatingDrumWithBaffles/ReadMe.md index 8ea62191..2b177b81 100644 --- a/tutorials/sphereGranFlow/RotatingDrumWithBaffles/ReadMe.md +++ b/tutorials/sphereGranFlow/RotatingDrumWithBaffles/ReadMe.md @@ -1,4 +1,5 @@ # 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 +16,13 @@ The problem is to simulate a rotating drum with a diameter of 0.24 m, a length o # 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 sorted in three folders: `caseSetup`, `setting` and `stl`. + +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/shapes` 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); @@ -28,8 +32,8 @@ diameters (0.004 0.005); materials (lightMat heavyMat); ``` - ## Particle Insertion + 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. @@ -39,31 +43,44 @@ in caseSetup/particleInsertion file ```C++ -// Right Layer Region -layerrightregion +// Right Region +right_region { -// type of insertion region - timeControl simulationTime; - regionType cylinder; -// insertion rate (particles/s) + // type of insertion region + regionType cylinder; + // insertion rate (particles/s) rate 12500; -// Start time of LightParticles insertion (s) + + timeControl simulationTime; + // Start time of insertion (s) startTime 0; -// End time of LightParticles insertion (s) + // End time of insertion (s) endTime 1; -// Time Interval of LightParticles insertion (s) + // Time Interval of insertion (s) insertionInterval 0.025; cylinderInfo { -// Coordinates of cylinderRegion (m,m,m) - p2 (-0.15 0.25 0.05); - p1 (-0.15 0.24 0.05); -// radius of cylinder (m) - radius 0.035; + // Coordinates of cylinderRegion (m,m,m) + p2 (-0.15 0.25 0.05); + p1 (-0.15 0.24 0.05); + // radius of cylinder (m) + radius 0.035; + } + + setFields + { + velocity realx3 (0.0 -0.6 0.0); // initial velocity of inserted particles + } + + mixture + { + smallSphere 1; // mixture composition of inserted particles } } ``` + + ## Interaction between particles and walls 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). @@ -73,36 +90,37 @@ materials (lightMat heavyMat wallMat); // density of materials [kg/m3] densities (1000 1500 2500); - /* + /* Property (lightMat-lightMat lightMat-heavyMat lightMat-wallMat heavyMat-heavyMat heavyMat-wallMat wallMat-wallMat ); - */ -// Young modulus [Pa] + */ + // Young modulus [Pa] Yeff (1.0e6 1.0e6 1.0e6 1.0e6 1.0e6 1.0e6); -// Shear modulus [Pa] + // Shear modulus [Pa] Geff (0.8e6 0.8e6 0.8e6 0.8e6 0.8e6 0.8e6); -// Poisson's ratio [-] + // Poisson's ratio [-] nu (0.25 0.25 0.25 0.25 0.25 0.25); -// coefficient of normal restitution + // coefficient of normal restitution en (0.97 0.97 0.85 0.97 0.85 1.00); -// dynamic friction + // dynamic friction mu (0.65 0.65 0.35 0.65 0.35 0.35); -// rolling friction + // rolling friction mur (0.1 0.1 0.1 0.1 0.1 0.1); ``` + ## Settings ### Geometry In the `settings/geometryDict` file, the geometry and axis of rotation is defined for the drum. The geometry is composed of a body, front and rear ends. @@ -163,28 +181,32 @@ 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++ -motionModel rotatingAxis; + +motionModel rotatingAxis; + rotatingAxisInfo { rotAxis { // first point for the axis of rotation - p1 (-0.1974 0.2269 0); - // second point for the axis of rotation - p2 (-0.1974 0.2269 0.1); - // rotation speed (rad/s) => 15 rpm - omega 2.38733; - // Start time of Geometry Rotating - startTime 2; - // End time of Geometry Rotating - endTime 9.5; + p1 (-0.1974 0.2269 0); + // second point for the axis of rotation + p2 (-0.1974 0.2269 0.1); + // rotation speed (rad/s) => 15 rpm + omega 2.38733; + // Start time of Geometry Rotating + startTime 2; + // End time of Geometry Rotating + endTime 9.5; } } ``` + ## Performing Simulation + 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 stored in ./VTK folder. \ No newline at end of file +After finishing the simulation, you can use `pFlowtoVTK` to convert the results into vtk format stored in ./VTK folder. \ No newline at end of file diff --git a/tutorials/sphereGranFlow/RotatingDrumWithBaffles/caseSetup/interaction b/tutorials/sphereGranFlow/RotatingDrumWithBaffles/caseSetup/interaction index 7572adb9..b0009cda 100644 --- a/tutorials/sphereGranFlow/RotatingDrumWithBaffles/caseSetup/interaction +++ b/tutorials/sphereGranFlow/RotatingDrumWithBaffles/caseSetup/interaction @@ -6,6 +6,7 @@ objectName interaction; objectType dicrionary; fileFormat ASCII; /*---------------------------------------------------------------------------*/ + materials (lightMat heavyMat wallMat); // a list of materials names densities (1000 1500 2500); // density of materials [kg/m3] @@ -14,7 +15,7 @@ contactListType sortedContactList; contactSearch { - method NBS; // method for broad search + method NBS; updateInterval 10; diff --git a/tutorials/sphereGranFlow/RotatingDrumWithBaffles/caseSetup/particleInsertion b/tutorials/sphereGranFlow/RotatingDrumWithBaffles/caseSetup/particleInsertion index 6ba98b98..fd20ef9b 100644 --- a/tutorials/sphereGranFlow/RotatingDrumWithBaffles/caseSetup/particleInsertion +++ b/tutorials/sphereGranFlow/RotatingDrumWithBaffles/caseSetup/particleInsertion @@ -6,78 +6,78 @@ objectName particleInsertion; objectType dicrionary; fileFormat ASCII; /*---------------------------------------------------------------------------*/ -active Yes; // is insertion active -> Yes or No + +active Yes; // is insertion active -> Yes or No /* Two layers of particles are packed one-by-one using 1 insertion steps */ - -layerrightregion // Right Layer Region +right_region { 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 insertion (s) - endTime 1; // End time of LightParticles insertion (s) + endTime 1; // End time of insertion (s) - insertionInterval 0.025; // Time Interval of LightParticles insertion (s) + insertionInterval 0.025; // Time Interval of particles insertion (s) cylinderInfo { - p2 (-0.15 0.25 0.05); // Top of cylinderRegion (m,m,m) + p2 (-0.15 0.25 0.05); // Top of cylinderRegion (m,m,m) - 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 + velocity realx3 (0.0 -0.6 0.0); // initial velocity of inserted particles } mixture { - smallSphere 1; // mixture composition of inserted particles + smallSphere 1; // mixture composition of inserted particles } } -layerleftregion // Left Layer Region +left_region { 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 insertion (s) - endTime 1; // End time of LightParticles insertion (s) + endTime 1; // End time of insertion (s) - insertionInterval 0.025; // Time Interval of LightParticles insertion (s) + insertionInterval 0.025; // Time Interval of insertion (s) cylinderInfo { - p2 (-0.23 0.25 0.05); // Top of cylinderRegion (m,m,m) + 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 + velocity realx3 (0.0 -0.6 0.0); // initial velocity of inserted particles } mixture { - largeSphere 1; // only heavySphere + largeSphere 1; // only heavySphere } } diff --git a/tutorials/sphereGranFlow/RotatingDrumWithBaffles/caseSetup/shapes b/tutorials/sphereGranFlow/RotatingDrumWithBaffles/caseSetup/shapes index 95d438e4..c894548b 100644 --- a/tutorials/sphereGranFlow/RotatingDrumWithBaffles/caseSetup/shapes +++ b/tutorials/sphereGranFlow/RotatingDrumWithBaffles/caseSetup/shapes @@ -2,12 +2,13 @@ | phasicFlow File | | copyright: www.cemf.ir | \* ------------------------------------------------------------------------- */ -objectName sphereDict; -objectType sphereShape; +objectName sphereDict; +objectType sphereShape; fileFormat ASCII; /*---------------------------------------------------------------------------*/ -names (smallSphere largeSphere); // names of shapes - -diameters (0.004 0.005); // diameter of shapes (m) - -materials (lightMat heavyMat); // material names for shapes + +names (smallSphere largeSphere); // names of shapes + +diameters (0.004 0.005); // diameter of shapes (m) + +materials (lightMat heavyMat); // material names for shapes diff --git a/tutorials/sphereGranFlow/RotatingDrumWithBaffles/settings/domainDict b/tutorials/sphereGranFlow/RotatingDrumWithBaffles/settings/domainDict index 74c86ad3..f6a3f02e 100755 --- a/tutorials/sphereGranFlow/RotatingDrumWithBaffles/settings/domainDict +++ b/tutorials/sphereGranFlow/RotatingDrumWithBaffles/settings/domainDict @@ -6,42 +6,44 @@ objectName domainDict; objectType dictionary; 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 - max (-0.068 0.355 0.125); // upper corner point of the box +// Simulation domain: every particles that goes outside this domain will be deleted +globalBox +{ + 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 } boundaries { left { - type exit; // other options: periodic, reflective + type exit; // other options: periodic, reflective } right { - type exit; // other options: periodict, reflective + type exit; // other options: periodic, reflective } bottom { - type exit; // other options: periodict, reflective + type exit; // other options: periodic, reflective } top { - type exit; // other options: periodict, reflective + type exit; // other options: periodic, reflective } rear { - type exit; // other options: periodict, reflective + type exit; // other options: periodic, reflective } front { - type exit; // other options: periodict, reflective + type exit; // other options: periodic, reflective } } diff --git a/tutorials/sphereGranFlow/RotatingDrumWithBaffles/settings/geometryDict b/tutorials/sphereGranFlow/RotatingDrumWithBaffles/settings/geometryDict index a7502d1c..d46b854b 100644 --- a/tutorials/sphereGranFlow/RotatingDrumWithBaffles/settings/geometryDict +++ b/tutorials/sphereGranFlow/RotatingDrumWithBaffles/settings/geometryDict @@ -2,80 +2,81 @@ | phasicFlow File | | copyright: www.cemf.ir | \* ------------------------------------------------------------------------- */ -objectName geometryDict; -objectType dictionary; +objectName geometryDict; +objectType dictionary; fileFormat ASCII; /*---------------------------------------------------------------------------*/ + motionModel rotatingAxis; rotatingAxisInfo { rotAxis - { - 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 - - omega 2.38733; // rotation speed (rad/s) => 15 rpm - - startTime 2; // Start time of Geometry Rotating - - endTime 9.5; // End time of Geometry Rotating - } + { + 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 + + omega 2.38733; // rotation speed (rad/s) => 15 rpm + + startTime 2; // Start time of Geometry Rotating + + endTime 9.5; // End time of Geometry Rotating + } } surfaces { - body - { - type stlWall; // type of the wall - - file Body.stl; // file name in stl folder - - material wallMat; // material name of this wall - - motion rotAxis; // motion component name - } + body + { + type stlWall; // type of the wall + + file Body.stl; // file name in stl folder + + material wallMat; // material name of this wall + + motion rotAxis; // motion component name + } - /* - This is a Cylinder Wall at the rear of cylinder - */ + /* + This is a Cylinder Wall at the rear of cylinder + */ - rearEnd - { - 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 - - radius1 0.0001; // Radius of p1 - - radius2 0.12; // Radius of p2 - - material wallMat; // material name of the wall - - motion rotAxis; // motion component name - } + rearEnd + { + 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 + + radius1 0.0001; // Radius of p1 + + radius2 0.12; // Radius of p2 + + material wallMat; // material name of the wall + + motion rotAxis; // motion component name + } - /* - This a cylinder Wall at the front of Cylinder - */ + /* + This a cylinder Wall at the front of Cylinder + */ - frontEnd - { - type cylinderWall; // type of the wall - - 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 - - radius1 0.0001; // Radius of p1 - - radius2 0.12; // Radius of p2 - - material wallMat; // material name of the wall - - motion rotAxis; // motion component name - } + frontEnd + { + type cylinderWall; // type of the wall + + 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 + + radius1 0.0001; // Radius of p1 + + radius2 0.12; // Radius of p2 + + material wallMat; // material name of the wall + + motion rotAxis; // motion component name + } } diff --git a/tutorials/sphereGranFlow/RotatingDrumWithBaffles/settings/particlesDict b/tutorials/sphereGranFlow/RotatingDrumWithBaffles/settings/particlesDict index b4d5bf80..31f3c913 100644 --- a/tutorials/sphereGranFlow/RotatingDrumWithBaffles/settings/particlesDict +++ b/tutorials/sphereGranFlow/RotatingDrumWithBaffles/settings/particlesDict @@ -10,9 +10,7 @@ setFields { /* Default value for fields defined for particles - These fields should always be defined for simulations with - spherical particles. */ @@ -29,30 +27,13 @@ setFields selectors { - shapeAssigne - { - selector stridedRange; // other options: box, cylinder, sphere, randomPoints - - stridedRangeInfo - { - begin 0; // begin index of points - - end 20000; // end index of points - - stride 3; // stride for selector - } - - fieldValue // fields that the selector is applied to - { - shapeName word sphere1; // sets shapeName of the selected points to largeSphere - } - } + } } -positionParticles // positions particles +positionParticles { - method empty; // other options: random and ordered + method empty; // other options: random, file and ordered } diff --git a/tutorials/sphereGranFlow/RotatingDrumWithBaffles/settings/settingsDict b/tutorials/sphereGranFlow/RotatingDrumWithBaffles/settings/settingsDict index b64a6a85..f4af181a 100644 --- a/tutorials/sphereGranFlow/RotatingDrumWithBaffles/settings/settingsDict +++ b/tutorials/sphereGranFlow/RotatingDrumWithBaffles/settings/settingsDict @@ -2,34 +2,36 @@ | phasicFlow File | | copyright: www.cemf.ir | \* ------------------------------------------------------------------------- */ -objectName settingsDict; -objectType dictionary; +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) -// save necessary (i.e., required) data on disk +// save necessary data on disk includeObjects (diameter); // exclude unnecessary data from saving on disk -excludeObjects (rVelocity.dy1 pStructPosition.dy1 pStructVelocity.dy1); +excludeObjects (); -integrationMethod AdamsBashforth2; // integration method +integrationMethod AdamsBashforth2; // integration method -writeFormat ascii; // data writting format (ascii or binary) +integrationHistory off; // to sace space on disk -timersReport Yes; // report timers (Yes or No) +writeFormat ascii; // data writting format (ascii or binary) -timersReportInterval 0.1; // time interval for reporting timers +timersReport Yes; // report timers (Yes or No) + +timersReportInterval 0.1; // time interval for reporting timers diff --git a/tutorials/sphereGranFlow/V-blender/README.md b/tutorials/sphereGranFlow/V-blender/README.md new file mode 100644 index 00000000..323e659b --- /dev/null +++ b/tutorials/sphereGranFlow/V-blender/README.md @@ -0,0 +1,250 @@ +# V-blender Simulation (phasicFlow v-1.0) + +This tutorial demonstrates the simulation of a V-blender, a common mixing device used in pharmaceutical and powder processing industries. The V-blender consists of a V-shaped vessel that rotates around a horizontal axis, allowing for efficient mixing of particulate materials. + + +
+ + + + V-blender simulation with two layers of particles + +
+ +## Problem Definition + +The simulation represents a V-blender with the following characteristics: + +- The blender is initially empty and is filled with two different particle types in sequence +- First layer: Small particles (10 mm diameter) are inserted from the right side +- Second layer: Slightly larger particles (10.1 mm diameter) are inserted from the left side +- The blender begins rotation at t = 3.0 s and continues until t = 10.0 s +- The rotation speed is set to 3.14 rad/s (approximately 0.5 Hz or 30 RPM) +- The simulation runs for a total of 10 seconds + +## Case Setup + +The simulation case setup files are organized in the `settings/` and `caseSetup/` folders. + +### Particles Definition + +Two particle types are defined in the `caseSetup/shapes` file: + +```C++ +names (smallSphere largeSphere); // names of particles +diameters (0.01 0.0101); // diameter of particles (m) +materials (lightMat lightMat); // material names for particles +``` + +Both particle types share the same material properties but differ slightly in size to allow for visual distinction during mixing. + +### Particle Insertion + +Particles are inserted in two sequential phases, as defined in `caseSetup/particleInsertion`: + +```C++ +active Yes; // is insertion active -> Yes or No + +rightregion +{ + timeControl simulationTime; // Controls insertion based on simulation time + + regionType cylinder; // Defines a cylindrical insertion region + + rate 10000; // Inserts 10,000 particles per second + + startTime 0.0; // Starts inserting at t = 0s (beginning of simulation) + + endTime 1.0; // Stops inserting at t = 1s + + insertionInterval 0.025; // Inserts particles every 0.025s + // (40 insertion events during the 1s period) + + cylinderInfo { + // Defines cylinder endpoints and radius + p1 (0.0950615 0.12 0.5011585); // First endpoint coordinates (x,y,z) in meters + p2 (0.1150615 0.12 0.4811585); // Second endpoint coordinates (x,y,z) in meters + radius 0.1; // Cylinder radius in meters + } + + setFields { + // Initial properties for inserted particles + velocity realx3 (1.2 0.0 -1.2); // Initial velocity vector (x,y,z) in m/s + // Particles move to the right and downward + } + + mixture { + // Particle type distribution + smallSphere 1; // 100% of inserted particles are "smallSphere" type + } +} + +leftregion +{ + timeControl simulationTime; // Controls insertion based on simulation time + + regionType cylinder; // Defines a cylindrical insertion region + + rate 10000; // Inserts 10,000 particles per second + + startTime 1.5; // Starts inserting at t = 1.5s + // (after the first insertion phase) + + endTime 2.5; // Stops inserting at t = 2.5s + + insertionInterval 0.025; // Inserts particles every 0.025s + // (40 insertion events during the 1s period) + + cylinderInfo { + // Defines cylinder endpoints and radius + p1 (0.7562545 0.12 0.50079); // First endpoint coordinates (x,y,z) in meters + p2 (0.7362545 0.12 0.48079); // Second endpoint coordinates (x,y,z) in meters + radius 0.1; // Cylinder radius in meters + } + + setFields { + // Initial properties for inserted particles + velocity realx3 (-1.2 0.0 -1.2); // Initial velocity vector (x,y,z) in m/s + // Particles move to the left and downward + } + + mixture { + // Particle type distribution + largeSphere 1; // 100% of inserted particles are "largeSphere" type + } +} +``` + +#### Detailed Explanation of Insertion Parameters + +1. **`rightregion` Dictionary**: + - Creates a cylindrical insertion region on the right side of the V-blender + - Active during t=0s to t=1s at the beginning of the simulation + - Particles are inserted from randomly generated positions within the cylinder + - Inserts "smallSphere" particles with 10mm diameter + - Initial velocity (1.2, 0.0, -1.2) m/s directs particles toward the center and bottom of the blender + - 40 insertion events occur (every 0.025s), each adding approximately 250 particles + +2. **`leftregion` Dictionary**: + - Creates a symmetrical cylindrical insertion region on the left side of the V-blender + - Active during t=1.5s to t=2.5s, after the first batch of particles has settled + - Inserts "largeSphere" particles with 10.1mm diameter + - Initial velocity (-1.2, 0.0, -1.2) m/s directs particles toward the center and bottom of the blender + - Mirror image of the first insertion but with slightly larger particles + +3. **Insertion Region Selection**: + - Cylindrical insertion regions are positioned above each arm of the V-blender + - This arrangement ensures particles fall naturally into the V-blender without initial overlap + +4. **Timing Strategy**: + - Sequential insertion with a 0.5s gap between phases allows the first batch to settle + - All particles settle for 0.5s after the second insertion (t=2.5s to t=3.0s) + - Blender rotation begins after all particles have settled (t=3.0s) + +### Geometry and Motion + +The V-blender geometry is defined in `settings/geometryDict` using an STL file: + +```C++ +motionModel rotatingAxis; // motion model: rotating object around an axis + +rotatingAxisInfo // information for rotatingAxis motion model +{ + rotAxis + { + p1 (0.128228 0.116446 0.297901); // first point for the axis of rotation + p2 (0.722596 0.116459 0.297901); // second point for the axis of rotation + omega 3.14; // rotation speed (rad/s) + startTime 3; // start time of rotation + endTime 10; // end time of rotation + } +} +``` + +The blender starts rotating at t = 3.0 s, after both particle types have been inserted and allowed to settle. + +### Simulation Domain and Boundaries + +The simulation domain is defined in `settings/domainDict`: + +```C++ +globalBox +{ + min (-0.1 -0.4 0); // lower corner point of the box + max (0.86 0.6 0.6); // upper corner point of the box +} +``` + +All boundaries are set to "exit" type, meaning particles that go outside the domain will be deleted. + +### Particle Interaction Properties + +Material properties and interaction parameters are defined in `caseSetup/interaction`: + +```C++ +materials (wallMat lightMat); // a list of materials names +densities (1000 1000); // density of materials [kg/m3] + +// Contact force models +model +{ + contactForceModel nonLinearNonLimited; + rollingFrictionModel normal; + + // Material properties + Yeff (1.0e6 1.0e6 + 1.0e6); // Young modulus [Pa] + Geff (0.8e6 0.8e6 + 0.8e6); // Shear modulus [Pa] + nu (0.25 0.25 + 0.25); // Poisson's ratio [-] + en (0.97 0.85 + 0.97); // coefficient of normal restitution + mu (0.65 0.35 + 0.65); // dynamic friction + mur (0.1 0.1 + 0.1); // rolling friction +} +``` + +## Running the Simulation + +To run this simulation, execute the following commands in sequence: + +1. First, create the geometry: + + ``` + geometryPhasicFlow + ``` + +2. Next, initialize the particle system (note: starts with zero particles): + ``` + particlesPhasicFlow + ``` + +3. Finally, run the simulation: + + ``` + sphereGranFlow + ``` + +The simulation will automatically insert particles according to the defined schedule and begin rotating the V-blender at the specified time. + +## Visualizing Results + +After the simulation completes, you can convert the results to VTK format for visualization: + +``` +pFlowToVTK --binary +``` + +The VTK files will be stored in a new directory called `./VTK` and can be visualized using tools like ParaView or VisIt. + +## Expected Behavior + +During the simulation, you should observe: +1. Initial filling with small particles from the right side (0-1s) +2. A brief settling period (1-1.5s) +3. Filling with large particles from the left side (1.5-2.5s) +4. Another settling period (2.5-3s) +5. Rotation of the V-blender causing mixing of the two particle types (3-10s) diff --git a/tutorials/sphereGranFlow/V-blender/caseSetup/interaction b/tutorials/sphereGranFlow/V-blender/caseSetup/interaction index 0c2ef656..437e98bf 100644 --- a/tutorials/sphereGranFlow/V-blender/caseSetup/interaction +++ b/tutorials/sphereGranFlow/V-blender/caseSetup/interaction @@ -6,15 +6,16 @@ objectName interaction; objectType dicrionary; fileFormat ASCII; /*---------------------------------------------------------------------------*/ -materials (wallMat lightMat); // a list of materials names -densities (1000 1000); // density of materials [kg/m3] +materials (wallMat lightMat); // a list of materials names + +densities (1000 1000); // density of materials [kg/m3] contactListType sortedContactList; contactSearch { - method NBS; // method for broad search + method NBS; updateInterval 10; @@ -33,22 +34,22 @@ model Yeff (1.0e6 1.0e6 - 1.0e6); // Young modulus [Pa] + 1.0e6); // Young modulus [Pa] Geff (0.8e6 0.8e6 - 0.8e6); // Shear modulus [Pa] + 0.8e6); // Shear modulus [Pa] nu (0.25 0.25 - 0.25); // Poisson's ratio [-] + 0.25); // Poisson's ratio [-] en (0.97 0.85 - 0.97); // coefficient of normal restitution + 0.97); // coefficient of normal restitution mu (0.65 0.35 - 0.65); // dynamic friction + 0.65); // dynamic friction mur (0.1 0.1 - 0.1); // rolling friction + 0.1); // rolling friction } diff --git a/tutorials/sphereGranFlow/V-blender/caseSetup/particleInsertion b/tutorials/sphereGranFlow/V-blender/caseSetup/particleInsertion index 5d9a104e..320a29c8 100644 --- a/tutorials/sphereGranFlow/V-blender/caseSetup/particleInsertion +++ b/tutorials/sphereGranFlow/V-blender/caseSetup/particleInsertion @@ -6,9 +6,10 @@ objectName particleInsertion; objectType dicrionary; fileFormat ASCII; /*---------------------------------------------------------------------------*/ -active Yes; // is insertion active -> Yes or No -checkForCollision Yes; // is checked -> Yes or No + +active Yes; // is insertion active -> Yes or No + /* Two layers of particles are packed one-by-one using tho insertion steps @@ -18,15 +19,15 @@ rightregion { timeControl simulationTime; - regionType cylinder; // type of insertion region + regionType cylinder; // type of insertion region - rate 10000; // Particles Insertion Rate (particles/s) + rate 10000; // Particles Insertion Rate (particles/s) - startTime 0.0; // start time of small particles insertion (s) + startTime 0.0; // start time of small particles insertion (s) - endTime 1; // end time of small particles insertion (s) + endTime 1; // end time of small particles insertion (s) - insertionInterval 0.025; // time interval of small particles insertion (s) + insertionInterval 0.025; // time interval of small particles insertion (s) cylinderInfo { @@ -37,17 +38,17 @@ rightregion p2 (0.1150615 0.12 0.4811585); - radius 0.1; // radius of cylinder (m) + radius 0.1; // radius of cylinder (m) } setFields { - velocity realx3 (1.2 0.0 -1.2); // initial velocity of inserted particles + velocity realx3 (1.2 0.0 -1.2); // initial velocity of inserted particles } mixture { - smallSphere 1; // first layer of inserted particles + smallSphere 1; // first layer of inserted particles } } @@ -55,35 +56,34 @@ leftregion { timeControl simulationTime; - regionType cylinder; // type of insertion region + regionType cylinder; // type of insertion region - rate 10000; // Particles Insertion Rate (particles/s) + rate 10000; // Particles Insertion Rate (particles/s) - startTime 1.5; // start time of large particles insertion (s) + startTime 1.5; // start time of large particles insertion (s) - endTime 2.5; // end time of large particles insertion (s) + endTime 2.5; // end time of large particles insertion (s) - insertionInterval 0.025; // time interval of large particles insertion (s) + insertionInterval 0.025; // time interval of large particles insertion (s) cylinderInfo { /* coordinates of center of both ends of the insertion cylinder on the left side of the V-blender (m,m,m) */ - p1 ( 0.7562545 0.12 0.50079); p2 ( 0.7362545 0.12 0.48079); - radius 0.1; // radius of cylinder (m) + radius 0.1; } setFields { - velocity realx3 (-1.2 0.0 -1.2); // initial velocity of inserted particles + velocity realx3 (-1.2 0.0 -1.2); // initial velocity of inserted particles } mixture { - largeSphere 1; // second layer of inserted particles + largeSphere 1; // second layer of inserted particles } } diff --git a/tutorials/sphereGranFlow/V-blender/caseSetup/shapes b/tutorials/sphereGranFlow/V-blender/caseSetup/shapes index d7008679..820578c8 100644 --- a/tutorials/sphereGranFlow/V-blender/caseSetup/shapes +++ b/tutorials/sphereGranFlow/V-blender/caseSetup/shapes @@ -7,8 +7,8 @@ objectType sphereShape; fileFormat ASCII; /*---------------------------------------------------------------------------*/ -names (smallSphere largeSphere); // names of particles +names (smallSphere largeSphere); // names of particles -diameters (0.01 0.0101); // diameter of particles +diameters (0.01 0.0101); // diameter of particles -materials (lightMat lightMat); // material names for particles +materials (lightMat lightMat); // material names for particles diff --git a/tutorials/sphereGranFlow/V-blender/settings/domainDict b/tutorials/sphereGranFlow/V-blender/settings/domainDict index 68aa66b9..7ee51605 100755 --- a/tutorials/sphereGranFlow/V-blender/settings/domainDict +++ b/tutorials/sphereGranFlow/V-blender/settings/domainDict @@ -10,9 +10,9 @@ fileFormat ASCII; // Simulation domain: every particles that goes outside this domain will be deleted globalBox { - min (-0.1 -0.4 0); // lower corner point of the box + min (-0.1 -0.4 0); // lower corner point of the box - max (0.86 0.6 0.6); // upper corner point of the box + max (0.86 0.6 0.6); // upper corner point of the box } boundaries @@ -20,31 +20,31 @@ boundaries left { - type exit; // other options: periodic, reflective + type exit; // other options: periodic, reflective } right { - type exit; // other options: periodict, reflective + type exit; // other options: periodic, reflective } bottom { - type exit; // other options: periodict, reflective + type exit; // other options: periodic, reflective } top { - type exit; // other options: periodict, reflective + type exit; // other options: periodic, reflective } rear { - type exit; // other options: periodict, reflective + type exit; // other options: periodic, reflective } front { - type exit; // other options: periodict, reflective + type exit; // other options: periodic, reflective } } diff --git a/tutorials/sphereGranFlow/V-blender/settings/geometryDict b/tutorials/sphereGranFlow/V-blender/settings/geometryDict index 005cf07d..0c302482 100644 --- a/tutorials/sphereGranFlow/V-blender/settings/geometryDict +++ b/tutorials/sphereGranFlow/V-blender/settings/geometryDict @@ -6,6 +6,7 @@ objectName geometryDict; objectType dictionary; fileFormat ASCII; /*---------------------------------------------------------------------------*/ + motionModel rotatingAxis; // motion model: rotating object around an axis rotatingAxisInfo // information for rotatingAxis motion model diff --git a/tutorials/sphereGranFlow/V-blender/settings/particlesDict b/tutorials/sphereGranFlow/V-blender/settings/particlesDict index a61bf692..46c2288b 100644 --- a/tutorials/sphereGranFlow/V-blender/settings/particlesDict +++ b/tutorials/sphereGranFlow/V-blender/settings/particlesDict @@ -2,38 +2,38 @@ | phasicFlow File | | copyright: www.cemf.ir | \* ------------------------------------------------------------------------- */ -objectName particlesDict; -objectType dictionary; -fileFormat ASCII; +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. + 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) + 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 + shapeName word smallSphere; // name of the particle shape } selectors - {} + {} } positionParticles { - - method empty; // no particle at the start of simulation + + method empty; // no particle at the start of simulation - mortonSorting Yes; // perform initial sorting based on morton code? + mortonSorting Yes; // perform initial sorting based on morton code? } diff --git a/tutorials/sphereGranFlow/V-blender/settings/settingsDict b/tutorials/sphereGranFlow/V-blender/settings/settingsDict index 05e34f47..dad5bcd6 100644 --- a/tutorials/sphereGranFlow/V-blender/settings/settingsDict +++ b/tutorials/sphereGranFlow/V-blender/settings/settingsDict @@ -2,23 +2,23 @@ | phasicFlow File | | copyright: www.cemf.ir | \* ------------------------------------------------------------------------- */ -objectName settingsDict; -objectType dictionary; +objectName settingsDict; +objectType dictionary; fileFormat ASCII; /*---------------------------------------------------------------------------*/ -run rotatingVblender; +run rotatingVblender; -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 0 -9.8); // gravity vector (m/s2) +g (0 0 -9.8); // gravity vector (m/s2) includeObjects (diameter); // save necessary (i.e., required) data on disk @@ -28,12 +28,12 @@ excludeObjects (); // include the objects to be saved in the time folders includeObject (); -integrationMethod AdamsBashforth2; // integration method +integrationMethod AdamsBashforth2; // integration method -integrationHistory off; // Do not save integration history on the disk +integrationHistory off; // Do not save integration history on the disk -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.05; // time interval for reporting timers +timersReportInterval 0.05; // time interval for reporting timers diff --git a/tutorials/sphereGranFlow/V-blender/v-blender.png b/tutorials/sphereGranFlow/V-blender/v-blender.png new file mode 100644 index 00000000..1c99ebe7 Binary files /dev/null and b/tutorials/sphereGranFlow/V-blender/v-blender.png differ diff --git a/tutorials/sphereGranFlow/screwConveyor/caseSetup/particleInsertion b/tutorials/sphereGranFlow/screwConveyor/caseSetup/particleInsertion index 7a5a5c3f..61285cb0 100755 --- a/tutorials/sphereGranFlow/screwConveyor/caseSetup/particleInsertion +++ b/tutorials/sphereGranFlow/screwConveyor/caseSetup/particleInsertion @@ -4,45 +4,44 @@ \* ------------------------------------------------------------------------- */ objectName particleInsertion; objectType dicrionary; -fileFormat ASCII; +fileFormat ASCII; /*---------------------------------------------------------------------------*/ -active yes; // is insertion active? +active yes; // is insertion active? feeder { - rate 2800; // insertion rate (particles/s) - - timeControl simulationTime; + rate 2800; // insertion rate (particles/s) - startTime 0; - - endTime 100; - - insertionInterval 0.04; //s - - regionType box; + timeControl simulationTime; - boxInfo - { + startTime 0; - min ( -0.15 0.34 0.01); // (m,m,m) - max ( 0.15 0.36 0.15); // (m,m,m) - } - - // initial velocity of inserted particles - setFields - { - velocity realx3 (0.0 -0.65 0); - } - - // mixture composition of inserted particles - mixture - { - sphere1 2; - sphere2 1; - } + endTime 100; + + insertionInterval 0.04; //s + + regionType box; + + boxInfo + { + min ( -0.15 0.34 0.01); // (m,m,m) + max ( 0.15 0.36 0.15); // (m,m,m) + } + + // initial velocity of inserted particles + setFields + { + velocity realx3 (0.0 -0.65 0); + } + + // mixture composition of inserted particles + mixture + { + sphere1 2; + sphere2 1; + } } diff --git a/tutorials/sphereGranFlow/screwConveyor/settings/geometryDict b/tutorials/sphereGranFlow/screwConveyor/settings/geometryDict index 7bd905b4..5399819e 100644 --- a/tutorials/sphereGranFlow/screwConveyor/settings/geometryDict +++ b/tutorials/sphereGranFlow/screwConveyor/settings/geometryDict @@ -40,7 +40,6 @@ surfaces material prop1; // material name of this wall motion none; // this surface is not moving ==> none } - } diff --git a/tutorials/sphereGranFlow/screwConveyor/settings/particlesDict b/tutorials/sphereGranFlow/screwConveyor/settings/particlesDict index 4b419d77..79e3655a 100644 --- a/tutorials/sphereGranFlow/screwConveyor/settings/particlesDict +++ b/tutorials/sphereGranFlow/screwConveyor/settings/particlesDict @@ -13,8 +13,6 @@ positionParticles { // A list of options are: ordered, random method empty; // creates the required fields with zero particles (empty). - - mortonSorting Yes; // perform initial sorting based on morton } setFields diff --git a/tutorials/sphereGranFlow/screwConveyor/settings/settingsDict b/tutorials/sphereGranFlow/screwConveyor/settings/settingsDict index 12c55d37..8e7bcfbe 100644 --- a/tutorials/sphereGranFlow/screwConveyor/settings/settingsDict +++ b/tutorials/sphereGranFlow/screwConveyor/settings/settingsDict @@ -2,41 +2,39 @@ | phasicFlow File | | copyright: www.cemf.ir | \* ------------------------------------------------------------------------- */ -objectName settingsDict; -objectType dictionary; -fileFormat ASCII; +objectName settingsDict; +objectType dictionary; +fileFormat ASCII; /*---------------------------------------------------------------------------*/ -run screwConveyor; +run screwConveyor; -dt 0.00002; // time step for integration (s) +dt 0.00002; // time step for integration (s) -startTime 0; // start time for simulation +startTime 0; // start time for simulation -endTime 20; // end time for simulation +endTime 20; // end time for simulation -saveInterval 0.025; // time interval for saving the simulation +saveInterval 0.025; // time interval for saving the simulation -timePrecision 4; // maximum number of digits for time folder +timePrecision 4; // 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) -writeFormat binary; // field files will be saved in binary format +writeFormat binary; // field files will be saved in binary format // A list of options: AB2, AB3, AB4, AB5 -integrationMethod AdamsBashforth4; // integration method +integrationMethod AdamsBashforth4; // integration method + +integrationHistory off; // 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); - +excludeObjects (); + -timersReport Yes; // report timers? +timersReport Yes; // report timers? -timersReportInterval 0.1; // time interval for reporting timers +timersReportInterval 0.1; // time interval for reporting timers diff --git a/tutorials/sphereGranFlow/toteBlender/ReadMe.md b/tutorials/sphereGranFlow/toteBlender/ReadMe.md index de1a367c..dd6e0322 100644 --- a/tutorials/sphereGranFlow/toteBlender/ReadMe.md +++ b/tutorials/sphereGranFlow/toteBlender/ReadMe.md @@ -244,7 +244,7 @@ positionParticles positionOrderedInfo { // minimum space between centers of particles - diameter 0.005; + distance 0.005; // number of particles in the simulation numPoints 24000; diff --git a/tutorials/sphereGranFlow/toteBlender/settings/settingsDict b/tutorials/sphereGranFlow/toteBlender/settings/settingsDict index 46a7218b..a0015cee 100644 --- a/tutorials/sphereGranFlow/toteBlender/settings/settingsDict +++ b/tutorials/sphereGranFlow/toteBlender/settings/settingsDict @@ -24,10 +24,12 @@ g (0 0 -9.8); // gravity vector (m/s2) // include/exclude fields for saving on disk includeObjects (diameter); -excludeObjects (rVelocity.dy1 pStructPosition.dy1 pStructVelocity.dy1); +excludeObjects (); integrationMethod AdamsBashforth2; +integrationHistory off; + writeFormat ascii; timersReport Yes;