Compare commits
No commits in common. "892f5395bc1c50775494bfcca570e09bcd7523c9" and "c32789f34defc510492291499f7c4134beb9044e" have entirely different histories.
892f5395bc
...
c32789f34d
86
README.md
86
README.md
|
@ -1,66 +1,48 @@
|
|||
<div align="center">
|
||||
<img src="doc/phasicFlow_logo_github.png" style="width: 400px;" alt="PhasicFlow Logo">
|
||||
<div align ="center">
|
||||
<img src="doc/phasicFlow_logo_github.png" style="width: 400px;">
|
||||
</div>
|
||||
|
||||
## **PhasicFlow: High-Performance Discrete Element Method Simulations**
|
||||
|
||||
PhasicFlow is a robust, open-source C++ framework designed for the efficient simulation of granular materials using the Discrete Element Method (DEM). Leveraging parallel computing paradigms, PhasicFlow is capable of executing simulations on shared-memory multi-core architectures, including CPUs and NVIDIA GPUs (CUDA-enabled). The core parallelization strategy focuses on loop-level parallelism, enabling significant performance gains on modern hardware. Users can seamlessly transition between serial execution on standard PCs, parallel execution on multi-core CPUs (OpenMP), and accelerated simulations on GPUs. Currently, PhasicFlow supports simulations involving up to 80 million particles on a single desktop workstation. Detailed performance benchmarks are available on the [PhasicFlow Wiki](https://github.com/PhasicFlow/phasicFlow/wiki/Performance-of-phasicFlow).
|
||||
**PhasicFlow** is a parallel C++ code for performing DEM simulations. It can run on shared-memory multi-core computational units such as multi-core CPUs or GPUs (for now it works on CUDA-enabled GPUs). The parallelization method mainly relies on loop-level parallelization on a shared-memory computational unit. You can build and run PhasicFlow in serial mode on regular PCs, in parallel mode for multi-core CPUs, or build it for a GPU device to off-load computations to a GPU. In its current statues you can simulate millions of particles (up to 80M particles tested) on a single desktop computer. You can see the [performance tests of PhasicFlow](https://github.com/PhasicFlow/phasicFlow/wiki/Performance-of-phasicFlow) in the wiki page.
|
||||
|
||||
**Scalable Parallelism: MPI Integration**
|
||||
**MPI** parallelization with dynamic load balancing is under development. With this level of parallelization, PhasicFlow can leverage the computational power of **multi-gpu** workstations or clusters with distributed memory CPUs.
|
||||
In summary PhasicFlow can have 6 execution modes:
|
||||
1. Serial on a single CPU core,
|
||||
2. Parallel on a multi-core computer/node (using OpenMP),
|
||||
3. Parallel on an nvidia-GPU (using Cuda),
|
||||
4. Parallel on distributed memory workstation (Using MPI)
|
||||
5. Parallel on distributed memory workstations with multi-core nodes (using MPI+OpenMP)
|
||||
6. Parallel on workstations with multiple GPUs (using MPI+Cuda).
|
||||
## How to build?
|
||||
You can build PhasicFlow for CPU and GPU executions. The latest release of PhasicFlow is v-0.1. [Here is a complete step-by-step procedure for building phasicFlow-v-0.1.](https://github.com/PhasicFlow/phasicFlow/wiki/How-to-Build-PhasicFlow).
|
||||
|
||||
Ongoing development includes the integration of MPI-based parallelization with dynamic load balancing. This enhancement will extend PhasicFlow's capabilities to distributed memory environments, such as multi-GPU workstations and high-performance computing clusters. Upon completion, PhasicFlow will offer six distinct execution modes:
|
||||
## Online code documentation
|
||||
You can find a full documentation of the code, its features, and other related materials on [online documentation of the code](https://phasicflow.github.io/phasicFlow/)
|
||||
|
||||
1. **Serial Execution:** Single-core CPU.
|
||||
2. **Shared-Memory Parallelism:** Multi-core CPU (OpenMP).
|
||||
3. **GPU Acceleration:** NVIDIA GPU (CUDA).
|
||||
4. **Distributed-Memory Parallelism:** MPI.
|
||||
5. **Hybrid Parallelism:** MPI + OpenMP.
|
||||
6. **Multi-GPU Parallelism:** MPI + CUDA.
|
||||
## How to use PhasicFlow?
|
||||
You can navigate into [tutorials folder](./tutorials) in the phasicFlow folder to see some simulation case setups. If you need more detailed discription, visit our [wiki page tutorials](https://github.com/PhasicFlow/phasicFlow/wiki/Tutorials).
|
||||
|
||||
# **Build and Installation**
|
||||
|
||||
PhasicFlow can be compiled for both CPU and GPU execution.
|
||||
|
||||
* **Current Development (v-1.0):** Comprehensive build instructions are available [here](https://github.com/PhasicFlow/phasicFlow/wiki/How-to-build-PhasicFlow%E2%80%90v%E2%80%901.0).
|
||||
* **Latest Release (v-0.1):** Detailed build instructions are available [here](https://github.com/PhasicFlow/phasicFlow/wiki/How-to-Build-PhasicFlow).
|
||||
|
||||
# **Comprehensive Documentation**
|
||||
|
||||
In-depth documentation, including code structure, features, and usage guidelines, is accessible via the [online documentation portal](https://phasicflow.github.io/phasicFlow/).
|
||||
|
||||
## **Tutorials and Examples**
|
||||
|
||||
Practical examples and simulation setups are provided in the [tutorials directory](./tutorials). For detailed explanations and step-by-step guides, please refer to the [tutorial section on the PhasicFlow Wiki](https://github.com/PhasicFlow/phasicFlow/wiki/Tutorials).
|
||||
|
||||
# **PhasicFlowPlus: Coupled CFD-DEM Simulations**
|
||||
|
||||
PhasicFlowPlus is an extension of PhasicFlow that facilitates the simulation of particle-fluid systems using resolved and unresolved CFD-DEM methods. The repository for PhasicFlowPlus can be found [here](https://github.com/PhasicFlow/PhasicFlowPlus).
|
||||
## [PhasicFlowPlus](https://github.com/PhasicFlow/PhasicFlowPlus)
|
||||
PhasicFlowPlus is and extension to PhasicFlow for simulating particle-fluid systems using resolved and unresolved CFD-DEM. [See the repository of this package.](https://github.com/PhasicFlow/PhasicFlowPlus)
|
||||
|
||||
|
||||
# How to cite PhasicFlow?
|
||||
## Supporting packages
|
||||
* [Kokkos](https://github.com/kokkos/kokkos) from National Technology & Engineering Solutions of Sandia, LLC (NTESS)
|
||||
* [CLI11 1.8](https://github.com/CLIUtils/CLI11) from University of Cincinnati.
|
||||
|
||||
## How to cite PhasicFlow
|
||||
If you are using PhasicFlow in your research or industrial work, cite the following [article](https://www.sciencedirect.com/science/article/pii/S0010465523001662):
|
||||
|
||||
```
|
||||
@article
|
||||
{
|
||||
NOROUZI2023108821,
|
||||
title = {PhasicFlow: A parallel, multi-architecture open-source code for DEM simulations},
|
||||
journal = {Computer Physics Communications},
|
||||
volume = {291},
|
||||
pages = {108821},
|
||||
year = {2023},
|
||||
issn = {0010-4655},
|
||||
doi = {https://doi.org/10.1016/j.cpc.2023.108821},
|
||||
url = {https://www.sciencedirect.com/science/article/pii/S0010465523001662},
|
||||
author = {H.R. Norouzi},
|
||||
keywords = {Discrete element method, Parallel computing, CUDA, GPU, OpenMP, Granular flow}
|
||||
@article{NOROUZI2023108821,
|
||||
title = {PhasicFlow: A parallel, multi-architecture open-source code for DEM simulations},
|
||||
journal = {Computer Physics Communications},
|
||||
volume = {291},
|
||||
pages = {108821},
|
||||
year = {2023},
|
||||
issn = {0010-4655},
|
||||
doi = {https://doi.org/10.1016/j.cpc.2023.108821},
|
||||
url = {https://www.sciencedirect.com/science/article/pii/S0010465523001662},
|
||||
author = {H.R. Norouzi},
|
||||
keywords = {Discrete element method, Parallel computing, CUDA, GPU, OpenMP, Granular flow}
|
||||
}
|
||||
```
|
||||
|
||||
# **Dependencies**
|
||||
|
||||
PhasicFlow relies on the following external libraries:
|
||||
|
||||
* **Kokkos:** A performance portability ecosystem developed by National Technology & Engineering Solutions of Sandia, LLC (NTESS). ([https://github.com/kokkos/kokkos](https://github.com/kokkos/kokkos))
|
||||
* **CLI11 1.8:** A command-line interface parser developed by the University of Cincinnati. ([https://github.com/CLIUtils/CLI11](https://github.com/CLIUtils/CLI11))
|
||||
|
|
|
@ -4,57 +4,56 @@
|
|||
\* ------------------------------------------------------------------------- */
|
||||
|
||||
objectName interaction;
|
||||
objectType dictionary;
|
||||
fileFormat ASCII;
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
objectType dicrionary;
|
||||
|
||||
materials (glassMat wallMat); // a list of materials names
|
||||
|
||||
densities (2500.0 2500); // density of materials [kg/m3]
|
||||
|
||||
contactListType sortedContactList;
|
||||
|
||||
contactSearch
|
||||
{
|
||||
method NBS;
|
||||
|
||||
updateInterval 10;
|
||||
|
||||
sizeRatio 1.1;
|
||||
|
||||
cellExtent 0.55;
|
||||
|
||||
adjustableBox Yes;
|
||||
}
|
||||
|
||||
model
|
||||
{
|
||||
contactForceModel nonLinearLimited;
|
||||
|
||||
rollingFrictionModel normal;
|
||||
|
||||
/*
|
||||
Property (glassMat-glassMat glassMat-wallMat
|
||||
wallMat-wallMat);
|
||||
*/
|
||||
Yeff (1.0e6 1.0e6 // Young modulus [Pa]
|
||||
1.0e6);
|
||||
|
||||
Yeff (1.0e6 1.0e6
|
||||
1.0e6); // Young modulus [Pa]
|
||||
Geff (0.8e6 0.8e6 // Shear modulus [Pa]
|
||||
0.8e6);
|
||||
|
||||
Geff (0.8e6 0.8e6
|
||||
0.8e6); // Shear modulus [Pa]
|
||||
nu (0.25 0.25 // Poisson's ratio [-]
|
||||
0.25);
|
||||
|
||||
nu (0.25 0.25
|
||||
0.25); // Poisson's ratio [-]
|
||||
en (0.97 0.85 // coefficient of normal restitution
|
||||
1.00);
|
||||
|
||||
en (0.97 0.85
|
||||
1.00); // coefficient of normal restitution
|
||||
et (1.0 1.0 // coefficient of tangential restitution
|
||||
1.0);
|
||||
|
||||
mu (0.65 0.65
|
||||
0.65); // dynamic friction
|
||||
mu (0.65 0.65 // dynamic friction
|
||||
0.65);
|
||||
|
||||
mur (0.1 0.1 // rolling friction
|
||||
0.1);
|
||||
|
||||
mur (0.1 0.1
|
||||
0.1); // rolling friction
|
||||
}
|
||||
|
||||
contactSearch
|
||||
{
|
||||
method NBS;
|
||||
wallMapping cellMapping;
|
||||
|
||||
NBSInfo
|
||||
{
|
||||
updateFrequency 10; // each 20 timesteps, update neighbor list
|
||||
sizeRatio 1.05; // bounding box size to particle diameter (max)
|
||||
}
|
||||
|
||||
cellMappingInfo
|
||||
{
|
||||
updateFrequency 10; // each 20 timesteps, update neighbor list
|
||||
cellExtent 0.6; // bounding box for particle-wall search (> 0.5)
|
||||
}
|
||||
|
||||
}
|
|
@ -5,8 +5,10 @@
|
|||
|
||||
objectName particleInsertion;
|
||||
objectType dicrionary;
|
||||
fileFormat ASCII;
|
||||
|
||||
active No; // is insertion active?
|
||||
|
||||
|
||||
active no; // is insertion active?
|
||||
|
||||
collisionCheck No; // not implemented for yes
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||
| phasicFlow File |
|
||||
| copyright: www.cemf.ir |
|
||||
\* ------------------------------------------------------------------------- */
|
||||
|
||||
objectName sphereDict;
|
||||
objectType sphereShape;
|
||||
|
||||
names (glassBead); // names of shapes
|
||||
diameters (0.003); // diameter of shapes
|
||||
materials (glassMat); // material names for shapes
|
|
@ -1,46 +0,0 @@
|
|||
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||
| phasicFlow File |
|
||||
| copyright: www.cemf.ir |
|
||||
\* ------------------------------------------------------------------------- */
|
||||
objectName domainDict;
|
||||
objectType dictionary;
|
||||
fileFormat ASCII;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
globalBox // Simulation domain: every particles that goes outside this domain will be deleted
|
||||
{
|
||||
min (-0.2 -0.2 -0.0);
|
||||
max ( 0.2 0.2 1.6);
|
||||
}
|
||||
|
||||
boundaries
|
||||
{
|
||||
left
|
||||
{
|
||||
type exit; // other options: periodic, reflective
|
||||
}
|
||||
|
||||
right
|
||||
{
|
||||
type exit; // other options: periodic, reflective
|
||||
}
|
||||
|
||||
bottom
|
||||
{
|
||||
type exit; // other options: periodic, reflective
|
||||
}
|
||||
|
||||
top
|
||||
{
|
||||
type exit; // other options: periodic, reflective
|
||||
}
|
||||
|
||||
rear
|
||||
{
|
||||
type exit; // other options: periodic, reflective
|
||||
}
|
||||
|
||||
front
|
||||
{
|
||||
type exit; // other options: periodic, reflective
|
||||
}
|
||||
}
|
|
@ -5,82 +5,59 @@
|
|||
|
||||
objectName geometryDict;
|
||||
objectType dictionary;
|
||||
fileFormat ASCII;
|
||||
|
||||
motionModel rotatingAxis; // motion model: rotating object around an axis
|
||||
|
||||
rotatingAxisInfo // information for rotatingAxisMotion motion model
|
||||
{
|
||||
rotAxis
|
||||
{
|
||||
p1 (0.0 0.0 0.0); // first point for the axis of rotation
|
||||
|
||||
p2 (0.0 0.0 1.0); // second point for the axis of rotation
|
||||
|
||||
omega 1.256; // rotation speed (rad/s) => 12 rpm
|
||||
}
|
||||
}
|
||||
motionModel rotatingAxisMotion;
|
||||
|
||||
surfaces
|
||||
{
|
||||
|
||||
cylinder
|
||||
{
|
||||
type cylinderWall; // type of the wall
|
||||
|
||||
p1 (0.0 0.0 0.0); // begin point of cylinder axis
|
||||
|
||||
p2 (0.0 0.0 1.6); // end point of cylinder axis
|
||||
|
||||
radius1 0.2; // radius at p1
|
||||
|
||||
radius2 0.2; // radius at p2
|
||||
|
||||
resolution 24; // number of divisions
|
||||
|
||||
material wallMat; // material name of this wall
|
||||
|
||||
motion rotAxis; // motion component name
|
||||
type cylinderWall;
|
||||
p1 (0.0 0.0 0.0);
|
||||
p2 (0.0 0.0 1.6);
|
||||
radius1 0.2;
|
||||
radius2 0.2;
|
||||
resolution 24;
|
||||
material wallMat;
|
||||
motion rotAxis;
|
||||
}
|
||||
|
||||
/*
|
||||
This is a plane wall at the rear end of cylinder
|
||||
*/
|
||||
|
||||
wall1
|
||||
{
|
||||
type planeWall; // type of the wall
|
||||
|
||||
p1 (-0.2 -0.2 0.0); // first point of the wall
|
||||
|
||||
p2 ( 0.2 -0.2 0.0); // second point
|
||||
|
||||
p3 ( 0.2 0.2 0.0); // third point
|
||||
|
||||
p4 (-0.2 0.2 0.0); // fourth point
|
||||
|
||||
material wallMat; // material name of the wall
|
||||
|
||||
motion rotAxis; // motion component name
|
||||
type planeWall;
|
||||
p1 (-0.2 -0.2 0.0);
|
||||
p2 ( 0.2 -0.2 0.0);
|
||||
p3 ( 0.2 0.2 0.0);
|
||||
p4 (-0.2 0.2 0.0);
|
||||
material wallMat;
|
||||
motion rotAxis;
|
||||
}
|
||||
|
||||
/*
|
||||
This is a plane wall at the front end of cylinder
|
||||
*/
|
||||
|
||||
wall2
|
||||
{
|
||||
type planeWall; // type of the wall
|
||||
type planeWall;
|
||||
p1 (-0.2 -0.2 1.6);
|
||||
p2 ( 0.2 -0.2 1.6);
|
||||
p3 ( 0.2 0.2 1.6);
|
||||
p4 (-0.2 0.2 1.6);
|
||||
material wallMat;
|
||||
motion rotAxis;
|
||||
}
|
||||
|
||||
p1 (-0.2 -0.2 1.6); // first point of the wall
|
||||
}
|
||||
|
||||
p2 ( 0.2 -0.2 1.6); // second point
|
||||
|
||||
p3 ( 0.2 0.2 1.6); // third point
|
||||
|
||||
p4 (-0.2 0.2 1.6); // fourth point
|
||||
|
||||
material wallMat; // material name of the wall
|
||||
|
||||
motion rotAxis; // motion component name
|
||||
// information for rotatingAxisMotion motion model
|
||||
rotatingAxisMotionInfo
|
||||
{
|
||||
rotAxis
|
||||
{
|
||||
p1 (0.0 0.0 0.0);
|
||||
p2 (0.0 0.0 1.0);
|
||||
omega 1.256; // rotation speed (rad/s) => 12 rpm
|
||||
}
|
||||
}
|
|
@ -5,10 +5,10 @@
|
|||
|
||||
objectName particlesDict;
|
||||
objectType dictionary;
|
||||
fileFormat ASCII;
|
||||
|
||||
setFields
|
||||
{
|
||||
|
||||
defaultValue
|
||||
{
|
||||
velocity realx3 (0 0 0); // linear velocity (m/s)
|
||||
|
@ -23,25 +23,22 @@ setFields
|
|||
|
||||
positionParticles
|
||||
{
|
||||
method ordered;
|
||||
method positionOrdered;
|
||||
|
||||
orderedInfo
|
||||
maxNumberOfParticles 4000001;
|
||||
mortonSorting Yes;
|
||||
|
||||
cylinder // box for positioning particles
|
||||
{
|
||||
p1 ( 0.0 0.0 0.01); // lower corner point of the box
|
||||
p2 ( 0.0 0.0 1.59); // upper corner point of the box
|
||||
radius 0.195;
|
||||
}
|
||||
|
||||
positionOrderedInfo
|
||||
{
|
||||
diameter 0.003; // minimum space between centers of particles
|
||||
|
||||
numPoints 4000000; // number of particles in the simulation
|
||||
|
||||
axisOrder (z x y); // axis order for filling the space with particles
|
||||
}
|
||||
|
||||
regionType cylinder; // other options: box and sphere
|
||||
|
||||
cylinderInfo // cylinder for positioning particles
|
||||
{
|
||||
p1 (0.0 0.0 0.01); // lower corner point of the box
|
||||
|
||||
p2 (0.0 0.0 1.59); // upper corner point of the box
|
||||
|
||||
radius 0.195; // radius of cylinder
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,10 +3,9 @@
|
|||
| copyright: www.cemf.ir |
|
||||
\* ------------------------------------------------------------------------- */
|
||||
objectName settingsDict;
|
||||
objectType dictionary;
|
||||
fileFormat ASCII;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
run rotatingDrum_4MParticles;
|
||||
objectType dictionary;;
|
||||
|
||||
run rotatingDrum_1;
|
||||
|
||||
dt 0.00001; // time step for integration (s)
|
||||
|
||||
|
@ -20,15 +19,14 @@ timePrecision 5; // maximum number of digits for time folder
|
|||
|
||||
g (0 -9.8 0); // gravity vector (m/s2)
|
||||
|
||||
includeObjects (diameter); // save necessary (i.e., required) data on disk
|
||||
domain
|
||||
{
|
||||
min (-0.2 -0.2 -0.0);
|
||||
max ( 0.2 0.2 1.6);
|
||||
}
|
||||
|
||||
// exclude unnecessary data from saving on disk
|
||||
excludeObjects (rVelocity.dy1 pStructPosition.dy1 pStructVelocity.dy1);
|
||||
|
||||
integrationMethod AdamsBashforth2; // integration method
|
||||
|
||||
writeFormat binary; // data writting format (ascii or binary)
|
||||
integrationMethod AdamsBashforth3; // integration method
|
||||
|
||||
timersReport Yes;
|
||||
|
||||
timersReportInterval 0.05;
|
||||
timersReportInterval 0.01;
|
||||
|
|
|
@ -36,12 +36,12 @@ if(NOT EXISTS "${Kokkos_Source_DIR}/CMakeLists.txt")
|
|||
FetchContent_Declare(
|
||||
kokkos
|
||||
GIT_REPOSITORY https://github.com/kokkos/kokkos.git
|
||||
GIT_TAG 4.4.01
|
||||
GIT_TAG 4.3.01
|
||||
)
|
||||
|
||||
FetchContent_GetProperties(kokkos)
|
||||
if(NOT kokkos_POPULATED)
|
||||
message(STATUS "Kokkos source directory not found. Downloading Kokkos version 4.4.1 ...")
|
||||
message(STATUS "Kokkos source directory not found. Downloading Kokkos version 4.3.01 ...")
|
||||
FetchContent_Populate(kokkos)
|
||||
set(Kokkos_Source_DIR ${kokkos_SOURCE_DIR})
|
||||
endif()
|
||||
|
|
|
@ -80,17 +80,13 @@ public:
|
|||
|
||||
TypeInfoNV("sortedContactList");
|
||||
|
||||
sortedContactList(uint32 initialSize =1)
|
||||
:
|
||||
sortedContactList("sortedContactList", initialSize)
|
||||
{}
|
||||
|
||||
sortedContactList(const word& name, uint32 initialSize =1)
|
||||
explicit sortedContactList(uint32 initialSize =1)
|
||||
:
|
||||
SortedPairs(name, initialSize),
|
||||
values_(groupNames(name, "values"), SortedPairs::capacity()),
|
||||
sortedPairs0_(groupNames(name, "sortedPairs0"), SortedPairs::capacity()),
|
||||
values0_(groupNames(name, "values0"), SortedPairs::capacity())
|
||||
SortedPairs(initialSize),
|
||||
values_("values", SortedPairs::capacity()),
|
||||
sortedPairs0_("sortedPairs0", SortedPairs::capacity()),
|
||||
values0_("values0", SortedPairs::capacity())
|
||||
{}
|
||||
|
||||
bool beforeBroadSearch()
|
||||
|
|
|
@ -110,11 +110,11 @@ public:
|
|||
|
||||
|
||||
// constructors
|
||||
explicit sortedPairs(const word& name, uint32 initialSize =1)
|
||||
explicit sortedPairs(uint32 initialSize =1)
|
||||
:
|
||||
UnsortedPairs(initialSize),
|
||||
flags_( groupNames(name, "flags_"), UnsortedPairs::capacity()+1),
|
||||
sortedPairs_(groupNames(name, "sortedPairs_"), UnsortedPairs::capacity())
|
||||
flags_("flags_",UnsortedPairs::capacity()+1),
|
||||
sortedPairs_("sortedPairs_",UnsortedPairs::capacity())
|
||||
{}
|
||||
|
||||
|
||||
|
|
|
@ -82,16 +82,11 @@ public:
|
|||
TypeInfoNV("unsortedContactList");
|
||||
|
||||
explicit unsortedContactList(uint32 capacity=1)
|
||||
:
|
||||
unsortedContactList("unsortedContactList", capacity)
|
||||
{}
|
||||
|
||||
unsortedContactList(const word& name, uint32 capacity=1)
|
||||
:
|
||||
UnsortedPairs(capacity),
|
||||
values_(groupNames(name, "values"), UnsortedPairs::capacity()),
|
||||
values_("values", UnsortedPairs::capacity()),
|
||||
container0_(capacity),
|
||||
values0_(groupNames(name, "values0"),container0_.capacity())
|
||||
values0_("values0",container0_.capacity())
|
||||
{}
|
||||
|
||||
|
||||
|
|
|
@ -194,9 +194,7 @@ public:
|
|||
{
|
||||
uint newCap = container_.capacity()+len;
|
||||
this->clear();
|
||||
//output<<"----------------before "<<capacity()<< " " << size()<<endl;
|
||||
container_.rehash(newCap);
|
||||
//output<<"----------------after "<<capacity()<< " " << size()<<endl;
|
||||
}
|
||||
|
||||
INLINE_FUNCTION_H
|
||||
|
|
|
@ -21,7 +21,6 @@ Licence:
|
|||
-----------------------------------------------------------------------------*/
|
||||
|
||||
#include "mapperNBSKernels.hpp"
|
||||
#include "streams.hpp"
|
||||
|
||||
void pFlow::mapperNBSKernels::findPointExtends
|
||||
(
|
||||
|
@ -153,9 +152,7 @@ bool pFlow::mapperNBSKernels::buildLists
|
|||
const pFlagTypeDevice &flags
|
||||
)
|
||||
{
|
||||
|
||||
auto aRange = flags.activeRange();
|
||||
|
||||
auto pp = points;
|
||||
if(flags.isAllActive() )
|
||||
{
|
||||
|
|
|
@ -41,9 +41,9 @@ bool pFlow::grainInteraction<cFM,gMM, cLT>::createGrainInteraction()
|
|||
geometryMotion_,
|
||||
timers());
|
||||
|
||||
ppContactList_ = makeUnique<ContactListType>("Grain-Grain",nPrtcl+1);
|
||||
ppContactList_ = makeUnique<ContactListType>(nPrtcl+1);
|
||||
|
||||
pwContactList_ = makeUnique<ContactListType>("Grain-wall",nPrtcl/5+1);
|
||||
pwContactList_ = makeUnique<ContactListType>(nPrtcl/5+1);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -41,9 +41,9 @@ bool pFlow::sphereInteraction<cFM,gMM, cLT>::createSphereInteraction()
|
|||
geometryMotion_,
|
||||
timers());
|
||||
|
||||
ppContactList_ = makeUnique<ContactListType>("sphere-sphere",nPrtcl+1);
|
||||
ppContactList_ = makeUnique<ContactListType>(nPrtcl+1);
|
||||
|
||||
pwContactList_ = makeUnique<ContactListType>("sphere-wall",nPrtcl/5+1);
|
||||
pwContactList_ = makeUnique<ContactListType>(nPrtcl/5+1);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -62,12 +62,6 @@ pFlow::particles::particles(systemControl& control, const shape& shapes)
|
|||
//idHandler_().initialIdCheck();
|
||||
}
|
||||
|
||||
pFlow::particles::~particles()
|
||||
{
|
||||
// invalidates / unsobscribe from subscriber before its actual destruction
|
||||
addToSubscriber(nullptr, message::Empty());
|
||||
}
|
||||
|
||||
bool
|
||||
pFlow::particles::beforeIteration()
|
||||
{
|
||||
|
|
|
@ -98,8 +98,6 @@ public:
|
|||
|
||||
explicit particles(systemControl& control, const shape& shapes);
|
||||
|
||||
~particles() override;
|
||||
|
||||
inline const auto& dynPointStruct() const
|
||||
{
|
||||
return dynPointStruct_;
|
||||
|
|
|
@ -269,19 +269,11 @@ template<typename Type, typename... sProperties>
|
|||
INLINE_FUNCTION_H void
|
||||
getNth(Type& dst, const ViewType1D<Type, sProperties...>& src, const uint32 n)
|
||||
{
|
||||
using exeSpace = ViewType1D<Type, sProperties...>::execution_space;
|
||||
if constexpr(isHostAccessible<exeSpace>())
|
||||
{
|
||||
dst = src[n];
|
||||
}
|
||||
else
|
||||
{
|
||||
auto subV = Kokkos::subview(src, Kokkos::make_pair(n, n + 1));
|
||||
hostViewType1D<Type> dstView("getNth", 1);
|
||||
// hostViewTypeScalar
|
||||
Kokkos::deep_copy(dstView, subV);
|
||||
dst = *dstView.data();
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T, typename... properties>
|
||||
|
|
|
@ -20,8 +20,9 @@ Licence:
|
|||
#ifndef __subscriber_hpp__
|
||||
#define __subscriber_hpp__
|
||||
|
||||
// from std
|
||||
#include <vector>
|
||||
|
||||
|
||||
#include <array>
|
||||
|
||||
#include "List.hpp"
|
||||
#include "message.hpp"
|
||||
|
|
|
@ -20,13 +20,10 @@ Licence:
|
|||
#ifndef __pFlowProcessors_hpp__
|
||||
#define __pFlowProcessors_hpp__
|
||||
|
||||
// from std
|
||||
#include <vector>
|
||||
|
||||
#include "processors.hpp"
|
||||
#include "types.hpp"
|
||||
|
||||
// from mpi
|
||||
#ifdef pFlow_Build_MPI
|
||||
#include "mpi.h"
|
||||
#endif
|
||||
|
|
|
@ -50,6 +50,90 @@ using realx4 = quadruple<real>;
|
|||
|
||||
using realx4x3 = quadruple<realx3>;
|
||||
|
||||
/*template<>
|
||||
inline word
|
||||
triple<int8>::TYPENAME()
|
||||
{
|
||||
return "int8x3";
|
||||
}
|
||||
|
||||
template<>
|
||||
inline word
|
||||
triple<int32>::TYPENAME()
|
||||
{
|
||||
return "int32x3";
|
||||
}
|
||||
|
||||
template<>
|
||||
inline word
|
||||
basicTypeName<int64x3>()
|
||||
{
|
||||
return "int64x3";
|
||||
}
|
||||
|
||||
template<>
|
||||
inline word
|
||||
basicTypeName<uint8x3>()
|
||||
{
|
||||
return "uint8x3";
|
||||
}
|
||||
|
||||
template<>
|
||||
inline word
|
||||
basicTypeName<uint32x3>()
|
||||
{
|
||||
return "uint32x3";
|
||||
}
|
||||
|
||||
template<>
|
||||
inline word
|
||||
basicTypeName<uint64x3>()
|
||||
{
|
||||
return "unit64x3";
|
||||
}
|
||||
|
||||
template<>
|
||||
inline word
|
||||
basicTypeName<realx3>()
|
||||
{
|
||||
return "realx3";
|
||||
}
|
||||
|
||||
template<>
|
||||
inline word
|
||||
basicTypeName<int32x3x3>()
|
||||
{
|
||||
return "int32x3x3";
|
||||
}
|
||||
|
||||
template<>
|
||||
inline word
|
||||
basicTypeName<uint32x3x3>()
|
||||
{
|
||||
return "uint32x3x3";
|
||||
}
|
||||
|
||||
template<>
|
||||
inline word
|
||||
basicTypeName<realx3x3>()
|
||||
{
|
||||
return "realx3x3";
|
||||
}
|
||||
|
||||
template<>
|
||||
inline word
|
||||
basicTypeName<realx4>()
|
||||
{
|
||||
return "realx4";
|
||||
}
|
||||
|
||||
template<>
|
||||
inline word
|
||||
basicTypeName<realx4x3>()
|
||||
{
|
||||
return "realx4x3";
|
||||
}*/
|
||||
|
||||
extern const realx3 zero3;
|
||||
extern const realx3 one3;
|
||||
|
||||
|
|
|
@ -1,5 +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.
|
||||
# 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.
|
||||
* **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 a diameter of 0.24 m, a length o
|
|||
</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 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 sotred in three folders: `caseSetup`, `setting` and `stl` (see the above folders).
|
||||
|
||||
## 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/sphereShape` 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 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.
|
||||
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.
|
||||
For example, for the insertion region for inserting light particles is shown below.
|
||||
|
||||
<div align="center">
|
||||
|
@ -43,8 +43,7 @@ in <b>caseSetup/particleInsertion</b> file
|
|||
layerrightregion
|
||||
{
|
||||
// type of insertion region
|
||||
timeControl simulationTime;
|
||||
regionType cylinder;
|
||||
type cylinderRegion;
|
||||
// insertion rate (particles/s)
|
||||
rate 12500;
|
||||
// Start time of LightParticles insertion (s)
|
||||
|
@ -52,9 +51,9 @@ layerrightregion
|
|||
// End time of LightParticles insertion (s)
|
||||
endTime 1;
|
||||
// Time Interval of LightParticles insertion (s)
|
||||
insertionInterval 0.025;
|
||||
interval 0.025;
|
||||
|
||||
cylinderInfo
|
||||
cylinderRegionInfo
|
||||
{
|
||||
// Coordinates of cylinderRegion (m,m,m)
|
||||
p2 (-0.15 0.25 0.05);
|
||||
|
@ -65,7 +64,7 @@ layerrightregion
|
|||
}
|
||||
```
|
||||
## 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).
|
||||
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).
|
||||
|
||||
```C++
|
||||
// a list of materials names
|
||||
|
@ -94,6 +93,10 @@ 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
|
||||
|
@ -163,8 +166,7 @@ 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;
|
||||
rotatingAxisInfo
|
||||
rotatingAxisMotionInfo
|
||||
{
|
||||
rotAxis
|
||||
{
|
||||
|
@ -182,9 +184,9 @@ rotatingAxisInfo
|
|||
}
|
||||
```
|
||||
## Performing Simulation
|
||||
To run simulations, type the following commands in the terminal one at a time.
|
||||
To perform simulations, enter the following commands one after another in the terminal.
|
||||
|
||||
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.
|
||||
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.
|
||||
|
|
|
@ -53,6 +53,10 @@ model
|
|||
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
|
||||
|
||||
mu (0.65 0.65 0.35
|
||||
0.65 0.35
|
||||
0.35); // dynamic friction
|
||||
|
|
|
@ -8,6 +8,8 @@ fileFormat ASCII;
|
|||
/*---------------------------------------------------------------------------*/
|
||||
active Yes; // is insertion active -> Yes or No
|
||||
|
||||
checkForCollision No; // is checked -> Yes or No
|
||||
|
||||
/*
|
||||
Two layers of particles are packed one-by-one using 1 insertion steps
|
||||
*/
|
||||
|
@ -29,7 +31,8 @@ layerrightregion // Right Layer Region
|
|||
|
||||
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)
|
||||
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
/* -------------------------------*- 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);
|
|
@ -13,8 +13,25 @@ globalBox // Simulation domain: every par
|
|||
max (-0.068 0.355 0.125); // upper corner point of the box
|
||||
}
|
||||
|
||||
decomposition
|
||||
{
|
||||
direction z;
|
||||
}
|
||||
|
||||
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
|
||||
{
|
||||
type exit; // other options: periodic, reflective
|
||||
|
|
|
@ -79,3 +79,4 @@ surfaces
|
|||
motion rotAxis; // motion component name
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -52,7 +52,27 @@ setFields
|
|||
|
||||
positionParticles // positions particles
|
||||
{
|
||||
method empty; // other options: random and ordered
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -20,8 +20,7 @@ timePrecision 6; // maximum number of digits for time
|
|||
|
||||
g (0 -9.8 0); // gravity vector (m/s2)
|
||||
|
||||
// save necessary (i.e., required) data on disk
|
||||
includeObjects (diameter);
|
||||
includeObjects (diameter); // save necessary (i.e., required) data on disk
|
||||
|
||||
// exclude unnecessary data from saving on disk
|
||||
excludeObjects (rVelocity.dy1 pStructPosition.dy1 pStructVelocity.dy1);
|
||||
|
@ -32,4 +31,4 @@ writeFormat ascii; // data writting format (ascii or binary
|
|||
|
||||
timersReport Yes; // report timers (Yes or No)
|
||||
|
||||
timersReportInterval 0.1; // time interval for reporting timers
|
||||
timersReportInterval 0.01; // time interval for reporting timers
|
||||
|
|
|
@ -14,6 +14,7 @@ contactListType sortedContactList;
|
|||
|
||||
contactSearch
|
||||
{
|
||||
|
||||
method NBS; // method for broad search
|
||||
|
||||
updateInterval 10;
|
||||
|
@ -48,6 +49,9 @@ model
|
|||
en (0.97 0.85
|
||||
1.00); // coefficient of normal restitution
|
||||
|
||||
et (1.0 1.0
|
||||
1.0); // coefficient of tangential restitution
|
||||
|
||||
mu (0.65 0.65
|
||||
0.65); // dynamic friction
|
||||
|
||||
|
|
|
@ -8,3 +8,5 @@ fileFormat ASCII;
|
|||
/*---------------------------------------------------------------------------*/
|
||||
active No; // is checked -> Yes or No
|
||||
|
||||
collisionCheck No; // is insertion active -> Yes or No
|
||||
|
||||
|
|
|
@ -2,8 +2,8 @@
|
|||
| phasicFlow File |
|
||||
| copyright: www.cemf.ir |
|
||||
\* ------------------------------------------------------------------------- */
|
||||
objectName shapes;
|
||||
objectType dictionary;
|
||||
objectName sphereDict;
|
||||
objectType sphereShape;
|
||||
fileFormat ASCII;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
names (glassBead); // names of shapes
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||
| phasicFlow File |
|
||||
| copyright: www.cemf.ir |
|
||||
\* ------------------------------------------------------------------------- */
|
||||
objectName sphereDict;
|
||||
objectType sphereShape;
|
||||
fileFormat ASCII;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
names (glassBead); // names of shapes
|
||||
diameters (0.003); // diameter of shapes
|
||||
materials (glassMat); // material names for shapes
|
|
@ -13,35 +13,52 @@ globalBox // Simulation domain: every par
|
|||
max (0.12 0.12 0.36); // upper corner point of the box
|
||||
}
|
||||
|
||||
decomposition
|
||||
{
|
||||
direction z;
|
||||
}
|
||||
|
||||
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
|
||||
{
|
||||
type exit; // other options: periodic, reflective
|
||||
type exit; // other options: periodict, reflective
|
||||
}
|
||||
|
||||
right
|
||||
{
|
||||
type exit; // other options: periodic, reflective
|
||||
type exit; // other options: periodict, reflective
|
||||
}
|
||||
|
||||
bottom
|
||||
{
|
||||
type exit; // other options: periodic, reflective
|
||||
type exit; // other options: periodict, reflective
|
||||
}
|
||||
|
||||
top
|
||||
{
|
||||
type exit; // other options: periodic, reflective
|
||||
type exit; // other options: periodict, reflective
|
||||
}
|
||||
|
||||
rear
|
||||
{
|
||||
type exit; // other options: periodic, reflective
|
||||
type exit; // other options: periodict, reflective
|
||||
}
|
||||
|
||||
front
|
||||
{
|
||||
type exit; // other options: periodic, reflective
|
||||
type exit; // other options: periodict, reflective
|
||||
}
|
||||
}
|
||||
|
|
|
@ -87,5 +87,6 @@ surfaces
|
|||
|
||||
motion rotAxis; // motion component name
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -27,6 +27,24 @@ setFields
|
|||
|
||||
selectors
|
||||
{
|
||||
shapeAssigne
|
||||
{
|
||||
selector stridedRange; // other options: box, cylinder, sphere, randomPoints
|
||||
|
||||
stridedRangeInfo
|
||||
{
|
||||
begin 0; // begin index of points
|
||||
|
||||
end 250000; // end index of points
|
||||
|
||||
stride 3; // stride for selector
|
||||
}
|
||||
|
||||
fieldValue // fields that the selector is applied to
|
||||
{
|
||||
shapeName word glassBead; // sets shapeName of the selected points to largeSphere
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -34,6 +52,10 @@ positionParticles // positions particles
|
|||
{
|
||||
method ordered; // other options: random and empty
|
||||
|
||||
//maxNumberOfParticles 250001; // maximum number of particles in the simulation
|
||||
|
||||
//mortonSorting Yes; // perform initial sorting based on morton code?
|
||||
|
||||
orderedInfo
|
||||
{
|
||||
diameter 0.003; // minimum space between centers of particles
|
||||
|
@ -47,10 +69,12 @@ positionParticles // positions particles
|
|||
|
||||
cylinderInfo // cylinder information for positioning particles
|
||||
{
|
||||
p1 (0.0 0.0 0.003); // begin point of cylinder axis
|
||||
p1 (0.0 0.003 0.0); // begin point of cylinder axis
|
||||
|
||||
p2 (0.0 0.0 0.357); // end point of cylinder axis
|
||||
p2 (0.0 0.22 0.0); // end point of cylinder axis
|
||||
|
||||
radius 0.117; // radius of cylinder
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -20,6 +20,11 @@ timePrecision 6; // maximum number of digits for
|
|||
|
||||
g (0 -9.8 0); // gravity vector (m/s2)
|
||||
|
||||
/*
|
||||
Simulation domain
|
||||
every particles that goes outside this domain is deleted.
|
||||
*/
|
||||
|
||||
includeObjects (diameter); // save necessary (i.e., required) data on disk
|
||||
|
||||
// exclude unnecessary data from saving on disk
|
||||
|
@ -31,4 +36,4 @@ writeFormat binary; // data writting format (ascii
|
|||
|
||||
timersReport Yes; // report timers?
|
||||
|
||||
timersReportInterval 0.05; // time interval for reporting timers
|
||||
timersReportInterval 0.01; // time interval for reporting timers
|
||||
|
|
|
@ -1,304 +0,0 @@
|
|||
# Tote Blender simulation (v-1.0)
|
||||
|
||||
## Problem Definition
|
||||
The problem is to simulate a double pedestal tote blender (mixer) with the diameter **0.03 m** and **0.1 m** respectively, the length **0.3 m**, rotating at **28 rpm**. This blender is filled with **24000** particles. The timestep for integration is **0.00002 s**. There is one type of particle in this blender. Particles are positioned before the start of simulation to fill the blender.
|
||||
* **24000** particles with **5 mm** diameter are positioned, in order, and let to be settled under gravity. After settling particles, this blender starts to rotate at t=**1s**.
|
||||
|
||||
<html>
|
||||
<body>
|
||||
<div align="center"><b>
|
||||
a view of the tote-blender while rotating
|
||||
</div></b>
|
||||
<div align="center">
|
||||
<img src="https://github.com/PhasicFlow/phasicFlow/blob/media/media/Tote-blender.gif", width=700px>
|
||||
</div>
|
||||
<div align="center"><i>
|
||||
particles are colored according to their velocity
|
||||
</div></i>
|
||||
</body>
|
||||
</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 files are stored into two folders: `caseSetup`, `setting` (see the above folders). Unlike the previous cases, this case does not have the `stl` file and the surfaces are defined based on the built-in utilities in phasicFlow. See next the section for more information on how we can setup the geometry and its rotation.
|
||||
|
||||
## Geometry
|
||||
|
||||
### Defining rotation axis
|
||||
In file `settings/geometryDict` the information of rotating axis and speed of rotation are defined. The rotation of this blender starts at time=**0.5 s** and ends at time=**9.5 s**.
|
||||
|
||||
```C++
|
||||
// information for rotatingAxis motion model
|
||||
rotatingAxis
|
||||
{
|
||||
axisOfRotation
|
||||
{
|
||||
p1 (-0.1 0.0 0.15); // first point for the axis of rotation
|
||||
p2 ( 0.1 0.0 0.15); // second point for the axis of rotation
|
||||
|
||||
omega 1.5708; // rotation speed ==> 15 rad/s
|
||||
|
||||
// Start time of Geometry Rotating (s)
|
||||
startTime 0.5;
|
||||
|
||||
// End time of Geometry Rotating (s)
|
||||
endTime 9.5;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Surfaces
|
||||
In `settings/geometryDict` file, the surfaces and motion component of each surface are defined to form a rotating tote-blender. The geometry is composed of top and bottom cylinders, top and bottom cones, a cylindrical shell and top and bottom Gates.
|
||||
|
||||
```C++
|
||||
surfaces
|
||||
{
|
||||
|
||||
topGate
|
||||
{
|
||||
// type of wall
|
||||
type cylinderWall;
|
||||
|
||||
// begin point of cylinder axis
|
||||
p1 (0.0 0.0 0.3);
|
||||
|
||||
// end point of cylinder axis
|
||||
p2 (0.0 0.0 0.301);
|
||||
|
||||
// radius at p1
|
||||
radius1 0.03;
|
||||
|
||||
// radius at p2
|
||||
radius2 0.0001;
|
||||
|
||||
// material of wall
|
||||
material solidProperty;
|
||||
|
||||
// motion component name
|
||||
motion axisOfRotation;
|
||||
}
|
||||
|
||||
topCylinder
|
||||
{
|
||||
type cylinderWall;
|
||||
|
||||
p1 (0.0 0.0 0.28);
|
||||
|
||||
p2 (0.0 0.0 0.3);
|
||||
|
||||
radius1 0.03;
|
||||
|
||||
radius2 0.03;
|
||||
|
||||
resolution 36;
|
||||
|
||||
material solidProperty;
|
||||
|
||||
motion axisOfRotation;
|
||||
}
|
||||
|
||||
coneShelltop
|
||||
{
|
||||
type cylinderWall;
|
||||
|
||||
p1 (0.0 0.0 0.2);
|
||||
|
||||
p2 (0.0 0.0 0.28);
|
||||
|
||||
radius1 0.1;
|
||||
|
||||
radius2 0.03;
|
||||
|
||||
resolution 36;
|
||||
|
||||
material solidProperty;
|
||||
|
||||
motion axisOfRotation;
|
||||
}
|
||||
|
||||
cylinderShell
|
||||
{
|
||||
type cylinderWall;
|
||||
|
||||
p1 (0.0 0.0 0.1);
|
||||
|
||||
p2 (0.0 0.0 0.2);
|
||||
|
||||
radius1 0.1;
|
||||
|
||||
radius2 0.1;
|
||||
|
||||
resolution 36;
|
||||
|
||||
material solidProperty;
|
||||
|
||||
motion axisOfRotation;
|
||||
}
|
||||
|
||||
coneShelldown
|
||||
{
|
||||
type cylinderWall;
|
||||
|
||||
p1 (0.0 0.0 0.02);
|
||||
|
||||
p2 (0.0 0.0 0.1);
|
||||
|
||||
radius1 0.03;
|
||||
|
||||
radius2 0.1;
|
||||
|
||||
resolution 36;
|
||||
|
||||
material solidProperty;
|
||||
|
||||
motion axisOfRotation;
|
||||
}
|
||||
|
||||
bottomCylinder
|
||||
{
|
||||
type cylinderWall;
|
||||
|
||||
p1 (0.0 0.0 0.0);
|
||||
|
||||
p2 (0.0 0.0 0.02);
|
||||
|
||||
radius1 0.03;
|
||||
|
||||
radius2 0.03;
|
||||
|
||||
resolution 36;
|
||||
|
||||
material solidProperty;
|
||||
|
||||
motion axisOfRotation;
|
||||
}
|
||||
|
||||
exitGate
|
||||
{
|
||||
|
||||
type cylinderWall;
|
||||
|
||||
p1 (0.0 0.0 -0.001);
|
||||
|
||||
p2 (0.0 0.0 0.0);
|
||||
|
||||
radius1 0.03;
|
||||
|
||||
radius2 0.0001;
|
||||
|
||||
resolution 36;
|
||||
|
||||
material solidProperty;
|
||||
|
||||
motion axisOfRotation;
|
||||
}
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
## Defining particles
|
||||
### Diameter and material of spheres
|
||||
In the `caseSetup/shapes` the diameter and the material name of the particles are defined.
|
||||
|
||||
<div align="center">
|
||||
in <b>caseSetup/shapes</b> file
|
||||
</div>
|
||||
|
||||
```C++
|
||||
// name of shapes
|
||||
names (sphere1);
|
||||
|
||||
// diameter of shapes (m)
|
||||
diameters (0.005);
|
||||
|
||||
// material name for shapes
|
||||
materials (solidProperty);
|
||||
```
|
||||
### Particle positioning before start of simulation
|
||||
Particles are positioned before the start of simulation. The positioning can be ordered or random. Here we use ordered positioning. 24000 particles are positioned in a cylinderical region inside the tote-blender.
|
||||
|
||||
<div align="center">
|
||||
in <b>settings/particlesDict</b> file
|
||||
</div>
|
||||
|
||||
```C++
|
||||
// positions particles
|
||||
positionParticles
|
||||
{
|
||||
// ordered positioning
|
||||
method positionOrdered;
|
||||
|
||||
// maximum number of particles in the simulation
|
||||
maxNumberOfParticles 25001;
|
||||
|
||||
// perform initial sorting based on morton code?
|
||||
mortonSorting Yes;
|
||||
|
||||
// cylinderical region for positioning particles
|
||||
cylinder
|
||||
{
|
||||
p1 (0.0 0.0 0.09);
|
||||
p2 (0.0 0.0 0.21);
|
||||
radius 0.09;
|
||||
}
|
||||
|
||||
positionOrderedInfo
|
||||
{
|
||||
// minimum space between centers of particles
|
||||
diameter 0.005;
|
||||
|
||||
// number of particles in the simulation
|
||||
numPoints 24000;
|
||||
|
||||
// axis order for filling the space with particles
|
||||
axisOrder (x y z);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Interaction between particles
|
||||
In `caseSetup/interaction` file, material names and properties and interaction parameters are defined. Since we are defining 1 material type in the simulation, the interaction matrix is 1x1 (interactions are symmetric).
|
||||
```C++
|
||||
// a list of materials names
|
||||
materials (solidProperty);
|
||||
|
||||
// density of materials [kg/m3]
|
||||
densities (1000.0);
|
||||
|
||||
contactListType sortedContactList;
|
||||
|
||||
model
|
||||
{
|
||||
contactForceModel nonLinearNonLimited;
|
||||
|
||||
rollingFrictionModel normal;
|
||||
|
||||
/*
|
||||
Property (solidProperty-solidProperty);
|
||||
*/
|
||||
// Young modulus [Pa]
|
||||
Yeff (1.0e6);
|
||||
|
||||
// Shear modulus [Pa]
|
||||
Geff (0.8e6);
|
||||
|
||||
// Poisson's ratio [-]
|
||||
nu (0.25);
|
||||
|
||||
// coefficient of normal restitution
|
||||
en (0.7);
|
||||
|
||||
// dynamic friction
|
||||
mu (0.3);
|
||||
|
||||
// rolling friction
|
||||
mur (0.1);
|
||||
}
|
||||
```
|
||||
|
||||
# Performing Simulation and previewing the results
|
||||
To perform simulations, enter the following commands one after another in the terminal.
|
||||
|
||||
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.
|
|
@ -1,49 +0,0 @@
|
|||
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||
| phasicFlow File |
|
||||
| copyright: www.cemf.ir |
|
||||
\* ------------------------------------------------------------------------- */
|
||||
objectName interaction;
|
||||
objectType dicrionary;
|
||||
fileFormat ASCII;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
materials (solidProperty); // a list of materials names
|
||||
|
||||
densities (1000.0); // density of materials [kg/m3]
|
||||
|
||||
contactListType sortedContactList;
|
||||
|
||||
model
|
||||
{
|
||||
contactForceModel nonLinearNonLimited;
|
||||
|
||||
rollingFrictionModel normal;
|
||||
|
||||
/*
|
||||
Property (solidProperty-solidProperty)
|
||||
*/
|
||||
Yeff (1.0e6); // Young modulus [Pa]
|
||||
|
||||
Geff (0.8e6); // Shear modulus [Pa]
|
||||
|
||||
nu (0.25); // Poisson's ratio [-]
|
||||
|
||||
en (0.7); // coefficient of normal restitution
|
||||
|
||||
mu (0.3); // dynamic friction
|
||||
|
||||
mur (0.1); // rolling friction
|
||||
}
|
||||
|
||||
contactSearch
|
||||
{
|
||||
method NBS;
|
||||
|
||||
updateInterval 10;
|
||||
|
||||
sizeRatio 1.1;
|
||||
|
||||
cellExtent 0.55;
|
||||
|
||||
adjustableBox Yes;
|
||||
}
|
|
@ -1,50 +0,0 @@
|
|||
/* -------------------------------*- 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.3 -0.3 -0.3); // lower corner point of the box
|
||||
|
||||
max ( 0.5 0.5 0.5); // upper corner point of the box
|
||||
}
|
||||
|
||||
boundaries
|
||||
{
|
||||
|
||||
left
|
||||
{
|
||||
type exit;
|
||||
}
|
||||
|
||||
right
|
||||
{
|
||||
type exit;
|
||||
}
|
||||
|
||||
bottom
|
||||
{
|
||||
type exit;
|
||||
}
|
||||
|
||||
top
|
||||
{
|
||||
type exit;
|
||||
}
|
||||
|
||||
rear
|
||||
{
|
||||
type exit;
|
||||
}
|
||||
|
||||
front
|
||||
{
|
||||
type exit;
|
||||
}
|
||||
}
|
|
@ -1,160 +0,0 @@
|
|||
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||
| phasicFlow File |
|
||||
| copyright: www.cemf.ir |
|
||||
\* ------------------------------------------------------------------------- */
|
||||
objectName geometryDict;
|
||||
objectType dictionary;
|
||||
fileFormat ASCII;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
motionModel rotatingAxis;
|
||||
|
||||
rotatingAxisInfo
|
||||
{
|
||||
axisOfRotation
|
||||
{
|
||||
p1 (-0.1 0.0 0.15);
|
||||
|
||||
p2 ( 0.1 0.0 0.15);
|
||||
|
||||
omega 1.5708;
|
||||
|
||||
startTime 0.5;
|
||||
|
||||
endTime 9.5;
|
||||
}
|
||||
}
|
||||
|
||||
surfaces
|
||||
{
|
||||
topGate
|
||||
{
|
||||
type cylinderWall; // type of wall
|
||||
|
||||
p1 (0.0 0.0 0.3); // begin point of cylinder axis
|
||||
|
||||
p2 (0.0 0.0 0.301); // end point of cylinder axis
|
||||
|
||||
radius1 0.03; // radius at p1
|
||||
|
||||
radius2 0.0001; // radius at p2
|
||||
|
||||
material solidProperty; // material of wall
|
||||
|
||||
motion axisOfRotation;
|
||||
}
|
||||
|
||||
topCylinder
|
||||
{
|
||||
type cylinderWall;
|
||||
|
||||
p1 (0.0 0.0 0.28);
|
||||
|
||||
p2 (0.0 0.0 0.3);
|
||||
|
||||
radius1 0.03;
|
||||
|
||||
radius2 0.03;
|
||||
|
||||
resolution 36;
|
||||
|
||||
material solidProperty;
|
||||
|
||||
motion axisOfRotation;
|
||||
}
|
||||
|
||||
coneShelltop
|
||||
{
|
||||
type cylinderWall;
|
||||
|
||||
p1 (0.0 0.0 0.2);
|
||||
|
||||
p2 (0.0 0.0 0.28);
|
||||
|
||||
radius1 0.1;
|
||||
|
||||
radius2 0.03;
|
||||
|
||||
resolution 36;
|
||||
|
||||
material solidProperty;
|
||||
|
||||
motion axisOfRotation;
|
||||
}
|
||||
|
||||
cylinderShell
|
||||
{
|
||||
type cylinderWall;
|
||||
|
||||
p1 (0.0 0.0 0.1);
|
||||
|
||||
p2 (0.0 0.0 0.2);
|
||||
|
||||
radius1 0.1;
|
||||
|
||||
radius2 0.1;
|
||||
|
||||
resolution 36;
|
||||
|
||||
material solidProperty;
|
||||
|
||||
motion axisOfRotation;
|
||||
}
|
||||
|
||||
coneShelldown
|
||||
{
|
||||
type cylinderWall;
|
||||
|
||||
p1 (0.0 0.0 0.02);
|
||||
|
||||
p2 (0.0 0.0 0.1);
|
||||
|
||||
radius1 0.03;
|
||||
|
||||
radius2 0.1;
|
||||
|
||||
resolution 36;
|
||||
|
||||
material solidProperty;
|
||||
|
||||
motion axisOfRotation;
|
||||
}
|
||||
|
||||
bottomCylinder
|
||||
{
|
||||
type cylinderWall;
|
||||
|
||||
p1 (0.0 0.0 0.0);
|
||||
|
||||
p2 (0.0 0.0 0.02);
|
||||
|
||||
radius1 0.03;
|
||||
|
||||
radius2 0.03;
|
||||
|
||||
resolution 36;
|
||||
|
||||
material solidProperty;
|
||||
|
||||
motion axisOfRotation;
|
||||
}
|
||||
|
||||
exitGate
|
||||
{
|
||||
type cylinderWall;
|
||||
|
||||
p1 (0.0 0.0 -0.001);
|
||||
|
||||
p2 (0.0 0.0 0.0);
|
||||
|
||||
radius1 0.03;
|
||||
|
||||
radius2 0.0001;
|
||||
|
||||
resolution 36;
|
||||
|
||||
material solidProperty;
|
||||
|
||||
motion axisOfRotation;
|
||||
}
|
||||
}
|
|
@ -1,58 +0,0 @@
|
|||
/* -------------------------------*- 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 sphere1; // name of the particle shape
|
||||
}
|
||||
|
||||
selectors
|
||||
{}
|
||||
}
|
||||
|
||||
positionParticles
|
||||
{
|
||||
|
||||
method ordered; // ordered positioning
|
||||
|
||||
mortonSorting Yes; // perform initial sorting based on morton code?
|
||||
|
||||
orderedInfo
|
||||
{
|
||||
diameter 0.005; // minimum space between centers of particles
|
||||
|
||||
numPoints 24000; // number of particles in the simulation
|
||||
|
||||
axisOrder (x y z); // axis order for filling the space with particles
|
||||
}
|
||||
|
||||
regionType cylinder; // other options: cylinder and sphere
|
||||
|
||||
cylinderInfo
|
||||
{
|
||||
p1 (0.0 0.0 0.09);
|
||||
|
||||
p2 (0.0 0.0 0.21);
|
||||
|
||||
radius 0.09; // radius of cylinder
|
||||
}
|
||||
}
|
|
@ -1,35 +0,0 @@
|
|||
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||
| phasicFlow File |
|
||||
| copyright: www.cemf.ir |
|
||||
\* ------------------------------------------------------------------------- */
|
||||
objectName settingsDict;
|
||||
objectType dictionary;
|
||||
fileFormat ASCII;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
run toteBlender;
|
||||
|
||||
dt 0.00002; // time step for integration (s)
|
||||
|
||||
startTime 0; // start time for simulation
|
||||
|
||||
endTime 10; // 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)
|
||||
|
||||
// include/exclude fields for saving on disk
|
||||
includeObjects (diameter);
|
||||
|
||||
excludeObjects (rVelocity.dy1 pStructPosition.dy1 pStructVelocity.dy1);
|
||||
|
||||
integrationMethod AdamsBashforth2;
|
||||
|
||||
writeFormat ascii;
|
||||
|
||||
timersReport Yes;
|
||||
|
||||
timersReportInterval 0.05;
|
|
@ -0,0 +1,356 @@
|
|||
# Problem Definition
|
||||
The problem is to simulate a double pedestal tote blender (mixer) with the diameter **0.03 m** and **0.1 m** respectively, the length **0.3 m**, rotating at **28 rpm**. This blender is filled with **24000** particles. The timestep for integration is **0.00001 s**. There is one type of particle in this blender. Particles are positioned before start of simulation to fill the blender.
|
||||
* **24000** particles with **5 mm** diameter are positioned, in order, and let to be settled under gravity. After settling particles, this blender starts to rotate at t=**1s**.
|
||||
|
||||
<html>
|
||||
<body>
|
||||
<div align="center"><b>
|
||||
a view of the tote-blender while rotating
|
||||
</div></b>
|
||||
<div align="center">
|
||||
<img src="https://github.com/PhasicFlow/phasicFlow/blob/media/media/Tote-blender.gif", width=700px>
|
||||
</div>
|
||||
<div align="center"><i>
|
||||
particles are colored according to their velocity
|
||||
</div></i>
|
||||
</body>
|
||||
</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 files are stored into two folders: `caseSetup`, `setting` (see the above folders). Unlike the previous cases, this case does not have the `stl` file and the surfaces are defined based on the built-in utilities in phasicFlow. See next the section for more information on how we can setup the geometry and its rotation.
|
||||
|
||||
## Geometry
|
||||
|
||||
### Defining rotation axis
|
||||
In file `settings/geometryDict` the information of rotating axis and speed of rotation are defined. The rotation of this blender starts at time=**0.5 s** and ends at time=**9.5 s**.
|
||||
|
||||
```C++
|
||||
// information for rotatingAxisMotion motion model
|
||||
rotatingAxisMotionInfo
|
||||
{
|
||||
axisOfRotation
|
||||
{
|
||||
p1 (-0.1 0.0 0.15); // first point for the axis of rotation
|
||||
p2 ( 0.1 0.0 0.15); // second point for the axis of rotation
|
||||
|
||||
omega 1.5708; // rotation speed ==> 15 rad/s
|
||||
|
||||
// Start time of Geometry Rotating (s)
|
||||
startTime 0.5;
|
||||
|
||||
// End time of Geometry Rotating (s)
|
||||
endTime 9.5;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
### Surfaces
|
||||
In `settings/geometryDict` file, the surfaces and motion component of each surface are defined to form a rotating tote-blender. The geometry is composed of top and bottom cylinders, top and bottom cones, a cylindrical shell and top and bottom Gates.
|
||||
|
||||
```C++
|
||||
surfaces
|
||||
{
|
||||
|
||||
topGate
|
||||
{
|
||||
// type of wall
|
||||
type cylinderWall;
|
||||
|
||||
// begin point of cylinder axis
|
||||
p1 (0.0 0.0 0.3);
|
||||
|
||||
// end point of cylinder axis
|
||||
p2 (0.0 0.0 0.301);
|
||||
|
||||
// radius at p1
|
||||
radius1 0.03;
|
||||
|
||||
// radius at p2
|
||||
radius2 0.0001;
|
||||
|
||||
// material of wall
|
||||
material solidProperty;
|
||||
|
||||
// motion component name
|
||||
motion axisOfRotation;
|
||||
}
|
||||
|
||||
topCylinder
|
||||
{
|
||||
// type of the wall
|
||||
type cylinderWall;
|
||||
|
||||
// begin point of cylinder axis
|
||||
p1 (0.0 0.0 0.28);
|
||||
|
||||
// end point of cylinder axis
|
||||
p2 (0.0 0.0 0.3);
|
||||
|
||||
// radius at p1
|
||||
radius1 0.03;
|
||||
|
||||
// radius at p2
|
||||
radius2 0.03;
|
||||
|
||||
// number of divisions
|
||||
resolution 36;
|
||||
|
||||
// material name of this wall
|
||||
material solidProperty;
|
||||
|
||||
// motion component name
|
||||
motion axisOfRotation;
|
||||
}
|
||||
|
||||
coneShelltop
|
||||
{
|
||||
// type of the wall
|
||||
type cylinderWall;
|
||||
|
||||
// begin point of cylinder axis
|
||||
p1 (0.0 0.0 0.2);
|
||||
|
||||
// end point of cylinder axis
|
||||
p2 (0.0 0.0 0.28);
|
||||
|
||||
// radius at p1
|
||||
radius1 0.1;
|
||||
|
||||
// radius at p2
|
||||
radius2 0.03;
|
||||
|
||||
// number of divisions
|
||||
resolution 36;
|
||||
|
||||
// material name of this wall
|
||||
material solidProperty;
|
||||
|
||||
// motion component name
|
||||
motion axisOfRotation;
|
||||
}
|
||||
|
||||
cylinderShell
|
||||
{
|
||||
// type of the wall
|
||||
type cylinderWall;
|
||||
|
||||
// begin point of cylinder axis
|
||||
p1 (0.0 0.0 0.1);
|
||||
|
||||
// end point of cylinder axis
|
||||
p2 (0.0 0.0 0.2);
|
||||
|
||||
// radius at p1
|
||||
radius1 0.1;
|
||||
|
||||
// radius at p2
|
||||
radius2 0.1;
|
||||
|
||||
// number of divisions
|
||||
resolution 36;
|
||||
|
||||
// material name of this wall
|
||||
material solidProperty;
|
||||
|
||||
// motion component name
|
||||
motion axisOfRotation;
|
||||
}
|
||||
|
||||
coneShelldown
|
||||
{
|
||||
|
||||
// type of the wall
|
||||
type cylinderWall;
|
||||
|
||||
// begin point of cylinder axis
|
||||
p1 (0.0 0.0 0.02);
|
||||
|
||||
// end point of cylinder axis
|
||||
p2 (0.0 0.0 0.1);
|
||||
|
||||
// radius at p1
|
||||
radius1 0.03;
|
||||
|
||||
// radius at p2
|
||||
radius2 0.1;
|
||||
|
||||
// number of divisions
|
||||
resolution 36;
|
||||
|
||||
// material name of this wall
|
||||
material solidProperty;
|
||||
|
||||
// motion component name
|
||||
motion axisOfRotation;
|
||||
}
|
||||
|
||||
bottomCylinder
|
||||
{
|
||||
// type of the wall
|
||||
type cylinderWall;
|
||||
|
||||
// begin point of cylinder axis
|
||||
p1 (0.0 0.0 0.0);
|
||||
|
||||
// end point of cylinder axis
|
||||
p2 (0.0 0.0 0.02);
|
||||
|
||||
// radius at p1
|
||||
radius1 0.03;
|
||||
|
||||
// radius at p2
|
||||
radius2 0.03;
|
||||
|
||||
// number of divisions
|
||||
resolution 36;
|
||||
|
||||
// material name of this wall
|
||||
material solidProperty;
|
||||
|
||||
// motion component name
|
||||
motion axisOfRotation;
|
||||
}
|
||||
|
||||
exitGate
|
||||
{
|
||||
|
||||
// type of the wall
|
||||
type cylinderWall;
|
||||
|
||||
// begin point of cylinder axis
|
||||
p1 (0.0 0.0 -0.001);
|
||||
|
||||
// end point of cylinder axis
|
||||
p2 (0.0 0.0 0.0);
|
||||
|
||||
// radius at p1
|
||||
radius1 0.03;
|
||||
|
||||
// radius at p2
|
||||
radius2 0.0001;
|
||||
|
||||
// number of divisions
|
||||
resolution 36;
|
||||
|
||||
// material name of this wall
|
||||
material solidProperty;
|
||||
|
||||
// motion component name
|
||||
motion axisOfRotation;
|
||||
}
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
## Defining particles
|
||||
### Diameter and material of spheres
|
||||
In the `caseSetup/sphereShape` the diameter and the material name of the particles are defined.
|
||||
|
||||
<div align="center">
|
||||
in <b>caseSetup/sphereShape</b> file
|
||||
</div>
|
||||
|
||||
```C++
|
||||
// name of shapes
|
||||
names (sphere1);
|
||||
|
||||
// diameter of shapes (m)
|
||||
diameters (0.005);
|
||||
|
||||
// material name for shapes
|
||||
materials (solidProperty);
|
||||
```
|
||||
### Particle positioning before start of simulation
|
||||
Particles are positioned before the start of simulation. The positioning can be ordered or random. Here we use ordered positioning. 24000 particles are positioned in a cylinderical region inside the tote-blender.
|
||||
|
||||
<div align="center">
|
||||
in <b>settings/particlesDict</b> file
|
||||
</div>
|
||||
|
||||
```C++
|
||||
// positions particles
|
||||
positionParticles
|
||||
{
|
||||
// ordered positioning
|
||||
method positionOrdered;
|
||||
|
||||
// maximum number of particles in the simulation
|
||||
maxNumberOfParticles 25001;
|
||||
|
||||
// perform initial sorting based on morton code?
|
||||
mortonSorting Yes;
|
||||
|
||||
// cylinderical region for positioning particles
|
||||
cylinder
|
||||
{
|
||||
p1 (0.0 0.0 0.09);
|
||||
p2 (0.0 0.0 0.21);
|
||||
radius 0.09;
|
||||
}
|
||||
|
||||
positionOrderedInfo
|
||||
{
|
||||
// minimum space between centers of particles
|
||||
diameter 0.005;
|
||||
|
||||
// number of particles in the simulation
|
||||
numPoints 24000;
|
||||
|
||||
// axis order for filling the space with particles
|
||||
axisOrder (x y z);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Interaction between particles
|
||||
In `caseSetup/interaction` file, material names and properties and interaction parameters are defined. Since we are defining 1 material type in the simulation, the interaction matrix is 1x1 (interactions are symmetric).
|
||||
```C++
|
||||
// a list of materials names
|
||||
materials (solidProperty);
|
||||
|
||||
// density of materials [kg/m3]
|
||||
densities (1000.0);
|
||||
|
||||
contactListType sortedContactList;
|
||||
|
||||
model
|
||||
{
|
||||
contactForceModel nonLinearNonLimited;
|
||||
|
||||
rollingFrictionModel normal;
|
||||
|
||||
/*
|
||||
Property (solidProperty-solidProperty);
|
||||
*/
|
||||
|
||||
// Young modulus [Pa]
|
||||
Yeff (1.0e6);
|
||||
|
||||
// Shear modulus [Pa]
|
||||
Geff (0.8e6);
|
||||
|
||||
// Poisson's ratio [-]
|
||||
nu (0.25);
|
||||
|
||||
// coefficient of normal restitution
|
||||
en (0.7);
|
||||
|
||||
// coefficient of tangential restitution
|
||||
et (1.0);
|
||||
|
||||
// dynamic friction
|
||||
mu (0.3);
|
||||
|
||||
// rolling friction
|
||||
mur (0.1);
|
||||
}
|
||||
```
|
||||
|
||||
# Performing Simulation and previewing the results
|
||||
To perform simulations, enter the following commands one after another in the terminal.
|
||||
|
||||
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.
|
|
@ -0,0 +1,52 @@
|
|||
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||
| phasicFlow File |
|
||||
| copyright: www.cemf.ir |
|
||||
\* ------------------------------------------------------------------------- */
|
||||
objectName interaction;
|
||||
objectType dicrionary;
|
||||
fileFormat ASCII;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
materials (solidProperty); // a list of materials names
|
||||
|
||||
densities (1000.0); // density of materials [kg/m3]
|
||||
|
||||
contactListType sortedContactList;
|
||||
|
||||
contactSearch
|
||||
{
|
||||
method NBS; // method for broad search
|
||||
|
||||
updateInterval 10;
|
||||
|
||||
sizeRatio 1.1;
|
||||
|
||||
cellExtent 0.55;
|
||||
|
||||
adjustableBox Yes;
|
||||
}
|
||||
|
||||
model
|
||||
{
|
||||
contactForceModel nonLinearNonLimited;
|
||||
|
||||
rollingFrictionModel normal;
|
||||
|
||||
/*
|
||||
Property (solidProperty-solidProperty)
|
||||
*/
|
||||
|
||||
Yeff (1.0e6); // Young modulus [Pa]
|
||||
|
||||
Geff (0.8e6); // Shear modulus [Pa]
|
||||
|
||||
nu (0.25); // Poisson's ratio [-]
|
||||
|
||||
en (0.7); // coefficient of normal restitution
|
||||
|
||||
et (1.0); // coefficient of tangential restitution
|
||||
|
||||
mu (0.3); // dynamic friction
|
||||
|
||||
mur (0.1); // rolling friction
|
||||
}
|
||||
|
|
@ -2,13 +2,12 @@
|
|||
| phasicFlow File |
|
||||
| copyright: www.cemf.ir |
|
||||
\* ------------------------------------------------------------------------- */
|
||||
objectName sphereDict;
|
||||
objectType sphereShape;
|
||||
objectName particleInsertion;
|
||||
objectType dicrionary;
|
||||
fileFormat ASCII;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
active No; // is insertion active -> Yes or No
|
||||
|
||||
names (sphere1); // name of shapes
|
||||
collisionCheck No; // is checked -> Yes or No
|
||||
|
||||
diameters (0.005); // diameter of shapes (m)
|
||||
|
||||
materials (solidProperty); // material name for shapes
|
|
@ -0,0 +1,13 @@
|
|||
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||
| phasicFlow File |
|
||||
| copyright: www.cemf.ir |
|
||||
\* ------------------------------------------------------------------------- */
|
||||
objectName sphereDict;
|
||||
objectType sphereShape;
|
||||
fileFormat ASCII;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
names (sphere1); // name of shapes
|
||||
|
||||
diameters (0.005); // diameter of shapes (m)
|
||||
|
||||
materials (solidProperty); // material name for shapes
|
14
benchmarks/rotatingDrum_4MParticles/caseSetup/shapes → tutorials/sphereGranFlow/toteblender/caseSetup/sphereShape
Executable file → Normal file
14
benchmarks/rotatingDrum_4MParticles/caseSetup/shapes → tutorials/sphereGranFlow/toteblender/caseSetup/sphereShape
Executable file → Normal file
|
@ -2,14 +2,16 @@
|
|||
| phasicFlow File |
|
||||
| copyright: www.cemf.ir |
|
||||
\* ------------------------------------------------------------------------- */
|
||||
|
||||
objectName shapes;
|
||||
objectType dictionary;
|
||||
objectName sphereDict;
|
||||
objectType sphereShape;
|
||||
fileFormat ASCII;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
names (glassBead); // names of shapes
|
||||
// name of shapes
|
||||
names (sphere1);
|
||||
|
||||
diameters (0.003); // diameter of shapes
|
||||
// diameter of shapes (m)
|
||||
diameters (0.005);
|
||||
|
||||
materials (glassMat); // material names for shapes
|
||||
// material name for shapes
|
||||
materials (solidProperty);
|
0
tutorials/sphereGranFlow/toteBlender/cleanThisCase → tutorials/sphereGranFlow/toteblender/cleanThisCase
Executable file → Normal file
0
tutorials/sphereGranFlow/toteBlender/cleanThisCase → tutorials/sphereGranFlow/toteblender/cleanThisCase
Executable file → Normal file
0
tutorials/sphereGranFlow/toteBlender/runThisCase → tutorials/sphereGranFlow/toteblender/runThisCase
Executable file → Normal file
0
tutorials/sphereGranFlow/toteBlender/runThisCase → tutorials/sphereGranFlow/toteblender/runThisCase
Executable file → Normal file
|
@ -0,0 +1,64 @@
|
|||
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||
| phasicFlow File |
|
||||
| copyright: www.cemf.ir |
|
||||
\* ------------------------------------------------------------------------- */
|
||||
objectName domainDict;
|
||||
objectType dictionary;
|
||||
fileFormat ASCII;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
globalBox // Simulation domain: every particles that goes outside this domain will be deleted
|
||||
{
|
||||
min (-0.3 -0.3 -0.3); // lower corner point of the box
|
||||
|
||||
max (0.5 0.5 0.5); // upper corner point of the box
|
||||
}
|
||||
|
||||
decomposition
|
||||
{
|
||||
direction z;
|
||||
}
|
||||
|
||||
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
|
||||
{
|
||||
type exit; // other options: periodic, reflective
|
||||
}
|
||||
|
||||
right
|
||||
{
|
||||
type exit; // other options: periodict, reflective
|
||||
}
|
||||
|
||||
bottom
|
||||
{
|
||||
type exit; // other options: periodict, reflective
|
||||
}
|
||||
|
||||
top
|
||||
{
|
||||
type exit; // other options: periodict, reflective
|
||||
}
|
||||
|
||||
rear
|
||||
{
|
||||
type exit; // other options: periodict, reflective
|
||||
}
|
||||
|
||||
front
|
||||
{
|
||||
type exit; // other options: periodict, reflective
|
||||
}
|
||||
}
|
|
@ -0,0 +1,159 @@
|
|||
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||
| phasicFlow File |
|
||||
| copyright: www.cemf.ir |
|
||||
\* ------------------------------------------------------------------------- */
|
||||
objectName geometryDict;
|
||||
objectType dictionary;
|
||||
fileFormat ASCII;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
motionModel rotatingAxis; // motion model: rotating object around an axis
|
||||
|
||||
rotatingAxisInfo // information for rotatingAxisMotion motion model
|
||||
{
|
||||
axisOfRotation
|
||||
{
|
||||
p1 (-0.1 0.0 0.15); // first point for the axis of rotation
|
||||
|
||||
p2 ( 0.1 0.0 0.15); // second point for the axis of rotation
|
||||
|
||||
omega 1.5708; // rotation speed ==> 15 rad/s
|
||||
|
||||
startTime 0.5; // Start time of Geometry Rotating (s)
|
||||
|
||||
endTime 9.5; // End time of Geometry Rotating (s)
|
||||
}
|
||||
}
|
||||
|
||||
surfaces
|
||||
{
|
||||
topGate
|
||||
{
|
||||
type cylinderWall; // type of wall
|
||||
|
||||
p1 (0.0 0.0 0.3); // begin point of cylinder axis
|
||||
|
||||
p2 (0.0 0.0 0.301); // end point of cylinder axis
|
||||
|
||||
radius1 0.03; // radius at p1
|
||||
|
||||
radius2 0.0001; // radius at p2
|
||||
|
||||
material solidProperty; // material of wall
|
||||
|
||||
motion axisOfRotation; // motion component name
|
||||
}
|
||||
|
||||
topCylinder
|
||||
{
|
||||
type cylinderWall; // type of the wall
|
||||
|
||||
p1 (0.0 0.0 0.28); // begin point of cylinder axis
|
||||
|
||||
p2 (0.0 0.0 0.3); // end point of cylinder axis
|
||||
|
||||
radius1 0.03; // radius at p1
|
||||
|
||||
radius2 0.03; // radius at p2
|
||||
|
||||
resolution 36; // number of divisions
|
||||
|
||||
material solidProperty; // material name of this wall
|
||||
|
||||
motion axisOfRotation; // motion component name
|
||||
}
|
||||
|
||||
coneShelltop
|
||||
{
|
||||
type cylinderWall; // type of the wall
|
||||
|
||||
p1 (0.0 0.0 0.2); // begin point of cylinder axis
|
||||
|
||||
p2 (0.0 0.0 0.28); // end point of cylinder axis
|
||||
|
||||
radius1 0.1; // radius at p1
|
||||
|
||||
radius2 0.03; // radius at p2
|
||||
|
||||
resolution 36; // number of divisions
|
||||
|
||||
material solidProperty; // material name of this wall
|
||||
|
||||
motion axisOfRotation; // motion component name
|
||||
}
|
||||
|
||||
cylinderShell
|
||||
{
|
||||
type cylinderWall; // type of the wall
|
||||
|
||||
p1 (0.0 0.0 0.1); // begin point of cylinder axis
|
||||
|
||||
p2 (0.0 0.0 0.2); // end point of cylinder axis
|
||||
|
||||
radius1 0.1; // radius at p1
|
||||
|
||||
radius2 0.1; // radius at p2
|
||||
|
||||
resolution 36; // number of divisions
|
||||
|
||||
material solidProperty; // material name of this wall
|
||||
|
||||
motion axisOfRotation; // motion component name
|
||||
}
|
||||
|
||||
coneShelldown
|
||||
{
|
||||
type cylinderWall; // type of the wall
|
||||
|
||||
p1 (0.0 0.0 0.02); // begin point of cylinder axis
|
||||
|
||||
p2 (0.0 0.0 0.1); // end point of cylinder axis
|
||||
|
||||
radius1 0.03; // radius at p1
|
||||
|
||||
radius2 0.1; // radius at p2
|
||||
|
||||
resolution 36; // number of divisions
|
||||
|
||||
material solidProperty; // material name of this wall
|
||||
|
||||
motion axisOfRotation; // motion component name
|
||||
}
|
||||
|
||||
bottomCylinder
|
||||
{
|
||||
type cylinderWall; // type of the wall
|
||||
|
||||
p1 (0.0 0.0 0.0); // begin point of cylinder axis
|
||||
|
||||
p2 (0.0 0.0 0.02); // end point of cylinder axis
|
||||
|
||||
radius1 0.03; // radius at p1
|
||||
|
||||
radius2 0.03; // radius at p2
|
||||
|
||||
resolution 36; // number of divisions
|
||||
|
||||
material solidProperty; // material name of this wall
|
||||
|
||||
motion axisOfRotation; // motion component name
|
||||
}
|
||||
|
||||
exitGate
|
||||
{
|
||||
type cylinderWall; // type of the wall
|
||||
|
||||
p1 (0.0 0.0 -0.001); // begin point of cylinder axis
|
||||
|
||||
p2 (0.0 0.0 0.0); // end point of cylinder axis
|
||||
|
||||
radius1 0.03; // radius at p1
|
||||
|
||||
radius2 0.0001; // radius at p2
|
||||
|
||||
resolution 36; // number of divisions
|
||||
|
||||
material solidProperty; // material name of this wall
|
||||
|
||||
motion axisOfRotation; // motion component name
|
||||
}
|
||||
}
|
|
@ -0,0 +1,79 @@
|
|||
/* -------------------------------*- 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 sphere1; // name of the particle shape
|
||||
}
|
||||
|
||||
selectors
|
||||
{
|
||||
shapeAssigne
|
||||
{
|
||||
selector stridedRange; // other options: box, cylinder, sphere, randomPoints
|
||||
|
||||
stridedRangeInfo
|
||||
{
|
||||
begin 0; // begin index of points
|
||||
|
||||
end 24000; // 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
|
||||
{
|
||||
|
||||
method ordered; // ordered positioning
|
||||
|
||||
mortonSorting Yes; // perform initial sorting based on morton code?
|
||||
|
||||
orderedInfo
|
||||
{
|
||||
diameter 0.005; // minimum space between centers of particles
|
||||
|
||||
numPoints 24000; // number of particles in the simulation
|
||||
|
||||
axisOrder (x y z); // axis order for filling the space with particles
|
||||
}
|
||||
|
||||
regionType cylinder; // other options: cylinder and sphere
|
||||
|
||||
cylinderInfo // cylinder for positioning particles
|
||||
{
|
||||
p1 (0.0 0.0 0.09); // Coordinates of bottom cylinderRegion (m,m,m)
|
||||
|
||||
p2 (0.0 0.0 0.21); // Coordinates of top cylinderRegion (m,m,m)
|
||||
|
||||
radius 0.09; // radius of cylinder
|
||||
}
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||
| phasicFlow File |
|
||||
| copyright: www.cemf.ir |
|
||||
\* ------------------------------------------------------------------------- */
|
||||
objectName settingsDict;
|
||||
objectType dictionary;
|
||||
fileFormat ASCII;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
run toteblender;
|
||||
|
||||
dt 0.00004; // time step for integration (s)
|
||||
|
||||
startTime 0; // start time for simulation
|
||||
|
||||
endTime 10; // end time for simulation
|
||||
|
||||
saveInterval 0.05; // time interval for saving the simulation
|
||||
|
||||
timePrecision 3; // maximum number of digits for time folder
|
||||
|
||||
g (0 0 -9.8); // gravity vector (m/s2)
|
||||
|
||||
includeObjects (diameter); // save necessary (i.e., required) data on disk
|
||||
|
||||
// exclude unnecessary data from saving on disk
|
||||
excludeObjects (rVelocity.dy1 pStructPosition.dy1 pStructVelocity.dy1);
|
||||
|
||||
integrationMethod AdamsBashforth2; // integration method
|
||||
|
||||
writeFormat ascii; // data writting format (ascii or binary)
|
||||
|
||||
timersReport Yes; // report timers (Yes or No)
|
||||
|
||||
timersReportInterval 0.02; // time interval for reporting timers
|
Loading…
Reference in New Issue