21 Commits

Author SHA1 Message Date
892f5395bc Bug fix for observed in particles, getNth and naming for contact lists 2025-03-14 18:33:02 +03:30
b65be8881c end of file corrections 2025-03-13 23:43:52 +03:30
23783b7db9 toteBlender for v-1.0 2025-03-11 17:20:42 +03:30
389e42ee1f Merge branch 'main' of github.com:PhasicFlow/phasicFlow 2025-03-09 21:14:02 +03:30
7f7e06ae7d bug fix for compiling on Ubuntu-24.04LTS 2025-03-09 21:10:41 +03:30
b007426d5d Merge pull request #184 from wanqing0421/main
update benchmarks file and romove the unused comments in rotatingDrumMedium
2025-03-06 21:40:39 +03:30
3ff4ad1469 Merge branch 'PhasicFlow:main' into main 2025-03-07 01:20:31 +08:00
5a5a3c6daf delete the unused comments 2025-03-07 02:53:49 +08:00
bff34bbb9e Merge pull request #185 from ramin1728/RotatingDrumWithBaffles
Rotating drum with baffles
2025-03-06 18:40:59 +03:30
84197bf237 Merge branch 'PhasicFlow:main' into main 2025-03-06 18:39:55 +08:00
169dd73963 Update README.md 2025-03-06 01:06:29 +03:30
baa99c61c0 bug fix for compiling on ubuntu-24 2025-03-06 00:14:14 +03:30
08d0d62d37 ReadMe.md is corrected. 2025-03-05 23:34:37 +03:30
8dcd578a22 RotatingDrumWithBaffles is Updated. 2025-03-05 20:06:25 +03:30
eb62adc87d update benchmarks file and romove the unused comments in rotatingDrumMedium 2025-03-05 22:51:07 +08:00
5394dce7aa Merge pull request #182 from wanqing0421/main
correction for particle insertion region
2025-03-05 17:39:21 +03:30
8038a76699 Correction for settingsDict 2025-03-05 19:59:18 +08:00
c408b60f87 correction for shapes file 2025-03-05 19:56:57 +08:00
ab21acdca5 update rotatingDrumMedium tutorial 2025-03-05 08:37:52 +08:00
07b54c4077 RotatingDrumWithBaffles is Updated. 2025-03-04 22:12:54 +03:30
75f679a234 correction for particle insertion region 2025-03-04 13:57:30 +08:00
72 changed files with 1317 additions and 1517 deletions

View File

@ -183,4 +183,4 @@ public:
} // pFlow } // pFlow
#endif // __DEMSystem_hpp__ #endif // __DEMSystem_hpp__

View File

@ -1,48 +1,66 @@
<div align ="center"> <div align="center">
<img src="doc/phasicFlow_logo_github.png" style="width: 400px;"> <img src="doc/phasicFlow_logo_github.png" style="width: 400px;" alt="PhasicFlow Logo">
</div> </div>
## **PhasicFlow: High-Performance Discrete Element Method Simulations**
**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. 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).
**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. **Scalable Parallelism: MPI Integration**
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).
## Online code documentation 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:
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/)
## How to use PhasicFlow? 1. **Serial Execution:** Single-core CPU.
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). 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.
## [PhasicFlowPlus](https://github.com/PhasicFlow/PhasicFlowPlus) # **Build and Installation**
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)
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).
## Supporting packages # How to cite PhasicFlow?
* [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): 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, @article
title = {PhasicFlow: A parallel, multi-architecture open-source code for DEM simulations}, {
journal = {Computer Physics Communications}, NOROUZI2023108821,
volume = {291}, title = {PhasicFlow: A parallel, multi-architecture open-source code for DEM simulations},
pages = {108821}, journal = {Computer Physics Communications},
year = {2023}, volume = {291},
issn = {0010-4655}, pages = {108821},
doi = {https://doi.org/10.1016/j.cpc.2023.108821}, year = {2023},
url = {https://www.sciencedirect.com/science/article/pii/S0010465523001662}, issn = {0010-4655},
author = {H.R. Norouzi}, doi = {https://doi.org/10.1016/j.cpc.2023.108821},
keywords = {Discrete element method, Parallel computing, CUDA, GPU, OpenMP, Granular flow} 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))

View File

@ -3,57 +3,58 @@
| copyright: www.cemf.ir | | copyright: www.cemf.ir |
\* ------------------------------------------------------------------------- */ \* ------------------------------------------------------------------------- */
objectName interaction; objectName interaction;
objectType dicrionary; objectType dictionary;
fileFormat ASCII;
/*---------------------------------------------------------------------------*/
materials (glassMat wallMat); // a list of materials names materials (glassMat wallMat); // a list of materials names
densities (2500.0 2500); // density of materials [kg/m3] densities (2500.0 2500); // density of materials [kg/m3]
contactListType sortedContactList; contactListType sortedContactList;
model
{
contactForceModel nonLinearLimited;
rollingFrictionModel normal;
Yeff (1.0e6 1.0e6 // Young modulus [Pa]
1.0e6);
Geff (0.8e6 0.8e6 // Shear modulus [Pa]
0.8e6);
nu (0.25 0.25 // Poisson's ratio [-]
0.25);
en (0.97 0.85 // coefficient of normal restitution
1.00);
et (1.0 1.0 // coefficient of tangential restitution
1.0);
mu (0.65 0.65 // dynamic friction
0.65);
mur (0.1 0.1 // rolling friction
0.1);
}
contactSearch contactSearch
{ {
method NBS; method NBS;
wallMapping cellMapping;
NBSInfo updateInterval 10;
{
updateFrequency 10; // each 20 timesteps, update neighbor list
sizeRatio 1.05; // bounding box size to particle diameter (max)
}
cellMappingInfo sizeRatio 1.1;
{
updateFrequency 10; // each 20 timesteps, update neighbor list cellExtent 0.55;
cellExtent 0.6; // bounding box for particle-wall search (> 0.5)
} adjustableBox Yes;
}
model
{
contactForceModel nonLinearLimited;
rollingFrictionModel normal;
/*
Property (glassMat-glassMat glassMat-wallMat
wallMat-wallMat);
*/
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
1.00); // coefficient of normal restitution
mu (0.65 0.65
0.65); // dynamic friction
mur (0.1 0.1
0.1); // rolling friction
}
}

View File

@ -3,12 +3,10 @@
| copyright: www.cemf.ir | | copyright: www.cemf.ir |
\* ------------------------------------------------------------------------- */ \* ------------------------------------------------------------------------- */
objectName particleInsertion; objectName particleInsertion;
objectType dicrionary; objectType dicrionary;
fileFormat ASCII;
active no; // is insertion active? active No; // is insertion active?
collisionCheck No; // not implemented for yes

View File

@ -2,16 +2,14 @@
| phasicFlow File | | phasicFlow File |
| copyright: www.cemf.ir | | copyright: www.cemf.ir |
\* ------------------------------------------------------------------------- */ \* ------------------------------------------------------------------------- */
objectName sphereDict;
objectType sphereShape; objectName shapes;
fileFormat ASCII; objectType dictionary;
fileFormat ASCII;
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
// name of shapes names (glassBead); // names of shapes
names (sphere1);
// diameter of shapes (m) diameters (0.003); // diameter of shapes
diameters (0.005);
// material name for shapes materials (glassMat); // material names for shapes
materials (solidProperty);

View File

@ -1,11 +0,0 @@
/* -------------------------------*- 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

View File

@ -0,0 +1,46 @@
/* -------------------------------*- 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
}
}

View File

@ -3,61 +3,84 @@
| copyright: www.cemf.ir | | copyright: www.cemf.ir |
\* ------------------------------------------------------------------------- */ \* ------------------------------------------------------------------------- */
objectName geometryDict; objectName geometryDict;
objectType dictionary; objectType dictionary;
fileFormat ASCII;
motionModel rotatingAxisMotion; 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
}
}
surfaces surfaces
{ {
cylinder
cylinder {
{ type cylinderWall; // type of the wall
type cylinderWall;
p1 (0.0 0.0 0.0); p1 (0.0 0.0 0.0); // begin point of cylinder axis
p2 (0.0 0.0 1.6);
radius1 0.2; p2 (0.0 0.0 1.6); // end point of cylinder axis
radius2 0.2;
resolution 24; radius1 0.2; // radius at p1
material wallMat;
motion rotAxis; radius2 0.2; // radius at p2
}
resolution 24; // number of divisions
material wallMat; // material name of this wall
motion rotAxis; // motion component name
}
/*
wall1 This is a plane wall at the rear end of cylinder
{ */
type planeWall;
p1 (-0.2 -0.2 0.0); wall1
p2 ( 0.2 -0.2 0.0); {
p3 ( 0.2 0.2 0.0); type planeWall; // type of the wall
p4 (-0.2 0.2 0.0);
material wallMat; p1 (-0.2 -0.2 0.0); // first point of the wall
motion rotAxis;
} 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
}
/* /*
This is a plane wall at the front end of cylinder This is a plane wall at the front end of cylinder
*/ */
wall2
{ wall2
type planeWall; {
p1 (-0.2 -0.2 1.6); type planeWall; // type of the wall
p2 ( 0.2 -0.2 1.6);
p3 ( 0.2 0.2 1.6); p1 (-0.2 -0.2 1.6); // first point of the wall
p4 (-0.2 0.2 1.6);
material wallMat; p2 ( 0.2 -0.2 1.6); // second point
motion rotAxis;
} 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
}
}

View File

@ -3,42 +3,45 @@
| copyright: www.cemf.ir | | copyright: www.cemf.ir |
\* ------------------------------------------------------------------------- */ \* ------------------------------------------------------------------------- */
objectName particlesDict; objectName particlesDict;
objectType dictionary; objectType dictionary;
fileFormat ASCII;
setFields setFields
{ {
defaultValue
defaultValue {
{ velocity realx3 (0 0 0); // linear velocity (m/s)
velocity realx3 (0 0 0); // linear velocity (m/s) acceleration realx3 (0 0 0); // linear acceleration (m/s2)
acceleration realx3 (0 0 0); // linear acceleration (m/s2) rotVelocity realx3 (0 0 0); // rotational velocity (rad/s)
rotVelocity realx3 (0 0 0); // rotational velocity (rad/s) shapeName word glassBead; // name of the particle shape
shapeName word glassBead; // name of the particle shape }
}
selectors selectors
{} {}
} }
positionParticles positionParticles
{ {
method positionOrdered; method ordered;
maxNumberOfParticles 4000001; orderedInfo
mortonSorting Yes; {
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
}
cylinder // box for positioning particles regionType cylinder; // other options: box and sphere
{
p1 ( 0.0 0.0 0.01); // lower corner point of the box cylinderInfo // cylinder for positioning particles
p2 ( 0.0 0.0 1.59); // upper corner point of the box {
radius 0.195; 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
positionOrderedInfo
{ radius 0.195; // radius of cylinder
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
}
} }

View File

@ -2,31 +2,33 @@
| phasicFlow File | | phasicFlow File |
| copyright: www.cemf.ir | | copyright: www.cemf.ir |
\* ------------------------------------------------------------------------- */ \* ------------------------------------------------------------------------- */
objectName settingsDict; objectName settingsDict;
objectType dictionary;; objectType dictionary;
fileFormat ASCII;
/*---------------------------------------------------------------------------*/
run rotatingDrum_4MParticles;
run rotatingDrum_1; 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.2; // time interval for saving the simulation
saveInterval 0.2; // time interval for saving the simulation timePrecision 5; // maximum number of digits for time folder
timePrecision 5; // maximum number of digits for time folder g (0 -9.8 0); // gravity vector (m/s2)
g (0 -9.8 0); // gravity vector (m/s2) includeObjects (diameter); // save necessary (i.e., required) data on disk
domain // exclude unnecessary data from saving on disk
{ excludeObjects (rVelocity.dy1 pStructPosition.dy1 pStructVelocity.dy1);
min (-0.2 -0.2 -0.0);
max ( 0.2 0.2 1.6);
}
integrationMethod AdamsBashforth3; // integration method integrationMethod AdamsBashforth2; // integration method
timersReport Yes; writeFormat binary; // data writting format (ascii or binary)
timersReportInterval 0.01; timersReport Yes;
timersReportInterval 0.05;

View File

@ -36,12 +36,12 @@ if(NOT EXISTS "${Kokkos_Source_DIR}/CMakeLists.txt")
FetchContent_Declare( FetchContent_Declare(
kokkos kokkos
GIT_REPOSITORY https://github.com/kokkos/kokkos.git GIT_REPOSITORY https://github.com/kokkos/kokkos.git
GIT_TAG 4.3.01 GIT_TAG 4.4.01
) )
FetchContent_GetProperties(kokkos) FetchContent_GetProperties(kokkos)
if(NOT kokkos_POPULATED) if(NOT kokkos_POPULATED)
message(STATUS "Kokkos source directory not found. Downloading Kokkos version 4.3.01 ...") message(STATUS "Kokkos source directory not found. Downloading Kokkos version 4.4.1 ...")
FetchContent_Populate(kokkos) FetchContent_Populate(kokkos)
set(Kokkos_Source_DIR ${kokkos_SOURCE_DIR}) set(Kokkos_Source_DIR ${kokkos_SOURCE_DIR})
endif() endif()

View File

@ -80,13 +80,17 @@ public:
TypeInfoNV("sortedContactList"); TypeInfoNV("sortedContactList");
sortedContactList(uint32 initialSize =1)
explicit sortedContactList(uint32 initialSize =1)
: :
SortedPairs(initialSize), sortedContactList("sortedContactList", initialSize)
values_("values", SortedPairs::capacity()), {}
sortedPairs0_("sortedPairs0", SortedPairs::capacity()),
values0_("values0", SortedPairs::capacity()) sortedContactList(const word& name, uint32 initialSize =1)
:
SortedPairs(name, initialSize),
values_(groupNames(name, "values"), SortedPairs::capacity()),
sortedPairs0_(groupNames(name, "sortedPairs0"), SortedPairs::capacity()),
values0_(groupNames(name, "values0"), SortedPairs::capacity())
{} {}
bool beforeBroadSearch() bool beforeBroadSearch()

View File

@ -110,11 +110,11 @@ public:
// constructors // constructors
explicit sortedPairs(uint32 initialSize =1) explicit sortedPairs(const word& name, uint32 initialSize =1)
: :
UnsortedPairs(initialSize), UnsortedPairs(initialSize),
flags_("flags_",UnsortedPairs::capacity()+1), flags_( groupNames(name, "flags_"), UnsortedPairs::capacity()+1),
sortedPairs_("sortedPairs_",UnsortedPairs::capacity()) sortedPairs_(groupNames(name, "sortedPairs_"), UnsortedPairs::capacity())
{} {}

View File

@ -82,11 +82,16 @@ public:
TypeInfoNV("unsortedContactList"); TypeInfoNV("unsortedContactList");
explicit unsortedContactList(uint32 capacity=1) explicit unsortedContactList(uint32 capacity=1)
:
unsortedContactList("unsortedContactList", capacity)
{}
unsortedContactList(const word& name, uint32 capacity=1)
: :
UnsortedPairs(capacity), UnsortedPairs(capacity),
values_("values", UnsortedPairs::capacity()), values_(groupNames(name, "values"), UnsortedPairs::capacity()),
container0_(capacity), container0_(capacity),
values0_("values0",container0_.capacity()) values0_(groupNames(name, "values0"),container0_.capacity())
{} {}

View File

@ -194,7 +194,9 @@ public:
{ {
uint newCap = container_.capacity()+len; uint newCap = container_.capacity()+len;
this->clear(); this->clear();
//output<<"----------------before "<<capacity()<< " " << size()<<endl;
container_.rehash(newCap); container_.rehash(newCap);
//output<<"----------------after "<<capacity()<< " " << size()<<endl;
} }
INLINE_FUNCTION_H INLINE_FUNCTION_H

View File

@ -21,6 +21,7 @@ Licence:
-----------------------------------------------------------------------------*/ -----------------------------------------------------------------------------*/
#include "mapperNBSKernels.hpp" #include "mapperNBSKernels.hpp"
#include "streams.hpp"
void pFlow::mapperNBSKernels::findPointExtends void pFlow::mapperNBSKernels::findPointExtends
( (
@ -152,7 +153,9 @@ bool pFlow::mapperNBSKernels::buildLists
const pFlagTypeDevice &flags const pFlagTypeDevice &flags
) )
{ {
auto aRange = flags.activeRange(); auto aRange = flags.activeRange();
auto pp = points; auto pp = points;
if(flags.isAllActive() ) if(flags.isAllActive() )
{ {
@ -162,7 +165,7 @@ bool pFlow::mapperNBSKernels::buildLists
deviceRPolicyStatic(aRange.start(), aRange.end()), deviceRPolicyStatic(aRange.start(), aRange.end()),
LAMBDA_HD(uint32 i) LAMBDA_HD(uint32 i)
{ {
auto ind = searchCell.pointIndex(pp[i]); auto ind = searchCell.pointIndex(pp[i]);
uint32 old = Kokkos::atomic_exchange(&head(ind.x(), ind.y(), ind.z()), i); uint32 old = Kokkos::atomic_exchange(&head(ind.x(), ind.y(), ind.z()), i);
next[i] = old; next[i] = old;
} }

View File

@ -41,9 +41,9 @@ bool pFlow::grainInteraction<cFM,gMM, cLT>::createGrainInteraction()
geometryMotion_, geometryMotion_,
timers()); timers());
ppContactList_ = makeUnique<ContactListType>(nPrtcl+1); ppContactList_ = makeUnique<ContactListType>("Grain-Grain",nPrtcl+1);
pwContactList_ = makeUnique<ContactListType>(nPrtcl/5+1); pwContactList_ = makeUnique<ContactListType>("Grain-wall",nPrtcl/5+1);
return true; return true;
} }

View File

@ -41,9 +41,9 @@ bool pFlow::sphereInteraction<cFM,gMM, cLT>::createSphereInteraction()
geometryMotion_, geometryMotion_,
timers()); timers());
ppContactList_ = makeUnique<ContactListType>(nPrtcl+1); ppContactList_ = makeUnique<ContactListType>("sphere-sphere",nPrtcl+1);
pwContactList_ = makeUnique<ContactListType>(nPrtcl/5+1); pwContactList_ = makeUnique<ContactListType>("sphere-wall",nPrtcl/5+1);
return true; return true;
} }

View File

@ -62,6 +62,12 @@ pFlow::particles::particles(systemControl& control, const shape& shapes)
//idHandler_().initialIdCheck(); //idHandler_().initialIdCheck();
} }
pFlow::particles::~particles()
{
// invalidates / unsobscribe from subscriber before its actual destruction
addToSubscriber(nullptr, message::Empty());
}
bool bool
pFlow::particles::beforeIteration() pFlow::particles::beforeIteration()
{ {

View File

@ -98,6 +98,8 @@ public:
explicit particles(systemControl& control, const shape& shapes); explicit particles(systemControl& control, const shape& shapes);
~particles() override;
inline const auto& dynPointStruct() const inline const auto& dynPointStruct() const
{ {
return dynPointStruct_; return dynPointStruct_;

View File

@ -269,11 +269,19 @@ template<typename Type, typename... sProperties>
INLINE_FUNCTION_H void INLINE_FUNCTION_H void
getNth(Type& dst, const ViewType1D<Type, sProperties...>& src, const uint32 n) getNth(Type& dst, const ViewType1D<Type, sProperties...>& src, const uint32 n)
{ {
auto subV = Kokkos::subview(src, Kokkos::make_pair(n, n + 1)); using exeSpace = ViewType1D<Type, sProperties...>::execution_space;
hostViewType1D<Type> dstView("getNth", 1); if constexpr(isHostAccessible<exeSpace>())
// hostViewTypeScalar {
Kokkos::deep_copy(dstView, subV); dst = src[n];
dst = *dstView.data(); }
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> template<typename T, typename... properties>

View File

@ -62,4 +62,4 @@ struct minimum
} }
#endif // __algorithmFunctions_hpp__ #endif // __algorithmFunctions_hpp__

View File

@ -240,4 +240,4 @@ void inclusiveScan(Type* first, DestType* dFirst, int32 numElems)
} }
#endif //__stdAlgorithms_hpp__ #endif //__stdAlgorithms_hpp__

View File

@ -270,4 +270,4 @@ inline pFlow::iIstream& pFlow::operator >>(iIstream& is, List<T>& lst)
fatalExit; fatalExit;
} }
return is; return is;
} }

View File

@ -320,4 +320,4 @@ void pFlow::ListPtr<T>::clear
delete p; delete p;
list_.erase(pos(i)); list_.erase(pos(i));
} }
} }

View File

@ -131,4 +131,4 @@ inline iOstream& printKeys(iOstream& os, const int64Map<T> & m)
} }
return os; return os;
} }

View File

@ -185,4 +185,4 @@ span<const char> charSpan(span<const T> s)
} // pFlow } // pFlow
#endif //__span_hpp__ #endif //__span_hpp__

View File

@ -60,4 +60,4 @@ public:
} }
#endif //__fileDictionary_hpp__ #endif //__fileDictionary_hpp__

View File

@ -20,9 +20,8 @@ Licence:
#ifndef __subscriber_hpp__ #ifndef __subscriber_hpp__
#define __subscriber_hpp__ #define __subscriber_hpp__
// from std
#include <vector>
#include <array>
#include "List.hpp" #include "List.hpp"
#include "message.hpp" #include "message.hpp"

View File

@ -20,10 +20,13 @@ Licence:
#ifndef __pFlowProcessors_hpp__ #ifndef __pFlowProcessors_hpp__
#define __pFlowProcessors_hpp__ #define __pFlowProcessors_hpp__
// from std
#include <vector>
#include "processors.hpp" #include "processors.hpp"
#include "types.hpp" #include "types.hpp"
// from mpi
#ifdef pFlow_Build_MPI #ifdef pFlow_Build_MPI
#include "mpi.h" #include "mpi.h"
#endif #endif
@ -158,4 +161,4 @@ public:
} }
#endif #endif

View File

@ -32,4 +32,4 @@ pFlow::IOPattern::IOPattern( IOType iotype)
pFlow::word pFlow::IOPattern::exeMode() pFlow::word pFlow::IOPattern::exeMode()
{ {
return processors::globalRunTypeName(); return processors::globalRunTypeName();
} }

View File

@ -115,4 +115,4 @@ public:
} // namespace pFlow } // namespace pFlow
#endif //__timeInfo__hpp_ #endif //__timeInfo__hpp_

View File

@ -93,4 +93,4 @@ const T& pFlow::repository::lookupObject(const word& name)const
fatalExit; fatalExit;
return static_cast<T&>(*iter->second); return static_cast<T&>(*iter->second);
} }
} }

View File

@ -46,4 +46,4 @@ namespace pFlow
#define ERR pFlow::errReport<<boldChar<<redColor<<"> ERROR\n"<<defaultColor<<redColor<<" " #define ERR pFlow::errReport<<boldChar<<redColor<<"> ERROR\n"<<defaultColor<<redColor<<" "
#define END_ERR defaultColor<<pFlow::endl #define END_ERR defaultColor<<pFlow::endl
#endif #endif

View File

@ -84,4 +84,4 @@ operator>>(iIstream& str, quadruple<T>& iv);
template<typename T> template<typename T>
INLINE_FUNCTION_H void INLINE_FUNCTION_H void
readIstream(iIstream& str, quadruple<T>& iv); readIstream(iIstream& str, quadruple<T>& iv);

View File

@ -91,4 +91,4 @@ pFlow::max(const quadruple<T>& q4)
} }
#undef Q4Func #undef Q4Func
#undef Q4Func2 #undef Q4Func2

View File

@ -112,4 +112,4 @@ operator>>(iIstream& str, triple<T>& iv);
template<typename T> template<typename T>
inline void inline void
readIstream(iIstream& str, triple<T>& iv); readIstream(iIstream& str, triple<T>& iv);

View File

@ -342,4 +342,4 @@ pFlow::equal(const triple<T>& opr1, const triple<T>& opr2)
{ {
return equal(opr1.x(), opr2.x()) && equal(opr1.y(), opr2.y()) && return equal(opr1.x(), opr2.x()) && equal(opr1.y(), opr2.y()) &&
equal(opr1.z(), opr2.z()); equal(opr1.z(), opr2.z());
} }

View File

@ -50,90 +50,6 @@ using realx4 = quadruple<real>;
using realx4x3 = quadruple<realx3>; 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 zero3;
extern const realx3 one3; extern const realx3 one3;
@ -144,4 +60,4 @@ extern const realx4 zero4;
} // pFlow } // pFlow
#endif //__types_hpp__ #endif //__types_hpp__

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -8,33 +8,16 @@ fileFormat ASCII;
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
globalBox // Simulation domain: every particles that goes outside this domain will be deleted globalBox // Simulation domain: every particles that goes outside this domain will be deleted
{ {
min (-0.328 0.095 -0.025); // lower corner point of the box min (-0.328 0.095 -0.025); // lower corner point of the box
max (-0.068 0.355 0.125); // upper corner point of the box max (-0.068 0.355 0.125); // upper corner point of the box
}
decomposition
{
direction z;
} }
boundaries boundaries
{ {
left
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: periodic, reflective
} }
right right

View File

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

View File

@ -16,13 +16,13 @@ setFields
spherical particles. spherical particles.
*/ */
defaultValue defaultValue
{ {
velocity realx3 (0 0 0); // linear velocity (m/s) velocity realx3 (0 0 0); // linear velocity (m/s)
acceleration realx3 (0 0 0); // linear acceleration (m/s2) acceleration realx3 (0 0 0); // linear acceleration (m/s2)
rVelocity realx3 (0 0 0); // rotational velocity (rad/s) rVelocity realx3 (0 0 0); // rotational velocity (rad/s)
shapeName word smallSphere; // name of the particle shape shapeName word smallSphere; // name of the particle shape
} }
@ -31,15 +31,15 @@ setFields
{ {
shapeAssigne shapeAssigne
{ {
selector stridedRange; // other options: box, cylinder, sphere, randomPoints selector stridedRange; // other options: box, cylinder, sphere, randomPoints
stridedRangeInfo stridedRangeInfo
{ {
begin 0; // begin index of points begin 0; // begin index of points
end 20000; // end index of points end 20000; // end index of points
stride 3; // stride for selector stride 3; // stride for selector
} }
fieldValue // fields that the selector is applied to fieldValue // fields that the selector is applied to
@ -52,27 +52,7 @@ setFields
positionParticles // positions particles positionParticles // positions particles
{ {
method ordered; // other options: random and empty method empty; // other options: random and ordered
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
}
} }

View File

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

View File

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

View File

@ -8,5 +8,3 @@ fileFormat ASCII;
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
active No; // is checked -> Yes or No active No; // is checked -> Yes or No
collisionCheck No; // is insertion active -> Yes or No

View File

@ -2,12 +2,12 @@
| phasicFlow File | | phasicFlow File |
| copyright: www.cemf.ir | | copyright: www.cemf.ir |
\* ------------------------------------------------------------------------- */ \* ------------------------------------------------------------------------- */
objectName sphereDict; objectName shapes;
objectType sphereShape; objectType dictionary;
fileFormat ASCII; fileFormat ASCII;
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
names (glassBead); // names of shapes names (glassBead); // names of shapes
diameters (0.003); // diameter of shapes diameters (0.003); // diameter of shapes
materials (glassMat); // material names for shapes materials (glassMat); // material names for shapes

View File

@ -1,12 +0,0 @@
/* -------------------------------*- 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

View File

@ -2,63 +2,46 @@
| phasicFlow File | | phasicFlow File |
| copyright: www.cemf.ir | | copyright: www.cemf.ir |
\* ------------------------------------------------------------------------- */ \* ------------------------------------------------------------------------- */
objectName domainDict; objectName domainDict;
objectType dictionary; objectType dictionary;
fileFormat ASCII; fileFormat ASCII;
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
globalBox // Simulation domain: every particles that goes outside this domain will be deleted globalBox // Simulation domain: every particles that goes outside this domain will be deleted
{ {
min (-0.12 -0.12 0); min (-0.12 -0.12 0);
max (0.12 0.12 0.36); // upper corner point of the box max (0.12 0.12 0.36); // upper corner point of the box
}
decomposition
{
direction z;
} }
boundaries boundaries
{ {
left
{
type exit; // other options: periodic, reflective
}
neighborListUpdateInterval 50; /* Determines how often (how many iterations) do you want to right
{
type exit; // other options: periodic, reflective
}
rebuild the list of particles in the neighbor list bottom
{
type exit; // other options: periodic, reflective
}
of all boundaries in the simulation domain */ top
{
type exit; // other options: periodic, reflective
}
updateInterval 10; // Determines how often do you want to update the new changes in the boundary rear
{
type exit; // other options: periodic, reflective
}
neighborLength 0.004; // The distance from the boundary plane within which particles are marked to be in the boundary list front
{
left type exit; // other options: periodic, reflective
{ }
type exit; // other options: periodict, 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
}
} }

View File

@ -2,91 +2,90 @@
| phasicFlow File | | phasicFlow File |
| copyright: www.cemf.ir | | copyright: www.cemf.ir |
\* ------------------------------------------------------------------------- */ \* ------------------------------------------------------------------------- */
objectName geometryDict; objectName geometryDict;
objectType dictionary; objectType dictionary;
fileFormat ASCII; fileFormat ASCII;
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
motionModel rotatingAxis; // motion model: rotating object around an axis motionModel rotatingAxis; // motion model: rotating object around an axis
rotatingAxisInfo // information for rotatingAxisMotion motion model rotatingAxisInfo // information for rotatingAxisMotion motion model
{ {
rotAxis rotAxis
{ {
p1 (0.0 0.0 0.0); // first point for the axis of rotation 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 p2 (0.0 0.0 1.0); // second point for the axis of rotation
omega 1.214; // rotation speed (rad/s) => 11.6 rpm omega 1.214; // rotation speed (rad/s) => 11.6 rpm
} }
} }
surfaces surfaces
{ {
/* /*
A cylinder with begin and end radii 0.12 m and axis points at (0 0 0) and (0 0 0.36) A cylinder with begin and end radii 0.12 m and axis points at (0 0 0) and (0 0 0.36)
*/ */
cylinder cylinder
{ {
type cylinderWall; // type of the wall type cylinderWall; // type of the wall
p1 (0.0 0.0 0.0); // begin point of cylinder axis p1 (0.0 0.0 0.0); // begin point of cylinder axis
p2 (0.0 0.0 0.36); // end point of cylinder axis p2 (0.0 0.0 0.36); // end point of cylinder axis
radius1 0.12; // radius at p1 radius1 0.12; // radius at p1
radius2 0.12; // radius at p2 radius2 0.12; // radius at p2
resolution 24; // number of divisions resolution 24; // number of divisions
material wallMat; // material name of this wall material wallMat; // material name of this wall
motion rotAxis; // motion component name motion rotAxis; // motion component name
} }
/* /*
This is a plane wall at the rear end of cylinder This is a plane wall at the rear end of cylinder
*/ */
wall1 wall1
{ {
type planeWall; // type of the wall type planeWall; // type of the wall
p1 (-0.12 -0.12 0.0); // first point of the wall p1 (-0.12 -0.12 0.0); // first point of the wall
p2 ( 0.12 -0.12 0.0); // second point p2 ( 0.12 -0.12 0.0); // second point
p3 ( 0.12 0.12 0.0); // third point p3 ( 0.12 0.12 0.0); // third point
p4 (-0.12 0.12 0.0); // fourth point p4 (-0.12 0.12 0.0); // fourth point
material wallMat; // material name of the wall material wallMat; // material name of the wall
motion rotAxis; // motion component name motion rotAxis; // motion component name
} }
/* /*
This is a plane wall at the front end of cylinder This is a plane wall at the front end of cylinder
*/ */
wall2 wall2
{ {
type planeWall; // type of the wall type planeWall; // type of the wall
p1 (-0.12 -0.12 0.36); // first point of the wall p1 (-0.12 -0.12 0.36); // first point of the wall
p2 ( 0.12 -0.12 0.36); // second point p2 ( 0.12 -0.12 0.36); // second point
p3 ( 0.12 0.12 0.36); // third point p3 ( 0.12 0.12 0.36); // third point
p4 (-0.12 0.12 0.36); // fourth point p4 (-0.12 0.12 0.36); // fourth point
material wallMat; // material name of the wall material wallMat; // material name of the wall
motion rotAxis; // motion component name motion rotAxis; // motion component name
} }
} }

View File

@ -2,79 +2,55 @@
| phasicFlow File | | phasicFlow File |
| copyright: www.cemf.ir | | copyright: www.cemf.ir |
\* ------------------------------------------------------------------------- */ \* ------------------------------------------------------------------------- */
objectName particlesDict; objectName particlesDict;
objectType dictionary; objectType dictionary;
fileFormat ASCII; fileFormat ASCII;
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
setFields setFields
{ {
/* /*
Default value for fields defined for particles Default value for fields defined for particles
These fields should always be defined for simulations with These fields should always be defined for simulations with
spherical particles spherical particles
*/ */
defaultValue defaultValue
{ {
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 glassBead; // name of the particle shape shapeName word glassBead; // name of the particle shape
} }
selectors 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
}
}
}
} }
positionParticles // positions particles positionParticles // positions particles
{ {
method ordered; // other options: random and empty method ordered; // other options: random and empty
//maxNumberOfParticles 250001; // maximum number of particles in the simulation orderedInfo
{
diameter 0.003; // minimum space between centers of particles
//mortonSorting Yes; // perform initial sorting based on morton code? numPoints 250000; // number of particles in the simulation
orderedInfo axisOrder (z y x); // axis order for filling the space with particles
{ }
diameter 0.003; // minimum space between centers of particles
numPoints 250000; // number of particles in the simulation regionType cylinder; // other options: box and sphere
axisOrder (z y x); // axis order for filling the space with particles cylinderInfo // cylinder information for positioning particles
} {
p1 (0.0 0.0 0.003); // begin point of cylinder axis
regionType cylinder; // other options: box and sphere
cylinderInfo // cylinder information for positioning particles
{
p1 (0.0 0.003 0.0); // begin point of cylinder axis
p2 (0.0 0.22 0.0); // end point of cylinder axis
radius 0.117; // radius of cylinder
}
p2 (0.0 0.0 0.357); // end point of cylinder axis
radius 0.117; // radius of cylinder
}
} }

View File

@ -2,38 +2,33 @@
| phasicFlow File | | phasicFlow File |
| copyright: www.cemf.ir | | copyright: www.cemf.ir |
\* ------------------------------------------------------------------------- */ \* ------------------------------------------------------------------------- */
objectName settingsDict; objectName settingsDict;
objectType dictionary;; objectType dictionary;;
fileFormat ASCII; fileFormat ASCII;
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
run rotatingDrumMedium; run rotatingDrumMedium;
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.1; // time interval for saving the simulation saveInterval 0.1; // 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)
/*
Simulation domain
every particles that goes outside this domain is deleted.
*/
includeObjects (diameter); // save necessary (i.e., required) data on disk includeObjects (diameter); // save necessary (i.e., required) data on disk
// exclude unnecessary data from saving on disk // exclude unnecessary data from saving on disk
excludeObjects (rVelocity.dy1 pStructPosition.dy1 pStructVelocity.dy1); excludeObjects (rVelocity.dy1 pStructPosition.dy1 pStructVelocity.dy1);
integrationMethod AdamsBashforth2; // integration method integrationMethod AdamsBashforth2; // integration method
writeFormat binary; // data writting format (ascii or binary) writeFormat binary; // data writting format (ascii or binary)
timersReport Yes; // report timers? timersReport Yes; // report timers?
timersReportInterval 0.01; // time interval for reporting timers timersReportInterval 0.05; // time interval for reporting timers

View File

@ -0,0 +1,304 @@
# 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.

View File

@ -0,0 +1,49 @@
/* -------------------------------*- 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;
}

View File

@ -2,12 +2,13 @@
| phasicFlow File | | phasicFlow File |
| copyright: www.cemf.ir | | copyright: www.cemf.ir |
\* ------------------------------------------------------------------------- */ \* ------------------------------------------------------------------------- */
objectName particleInsertion; objectName sphereDict;
objectType dicrionary; objectType sphereShape;
fileFormat ASCII; fileFormat ASCII;
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
active No; // is insertion active -> Yes or No
collisionCheck No; // is checked -> Yes or No names (sphere1); // name of shapes
diameters (0.005); // diameter of shapes (m)
materials (solidProperty); // material name for shapes

View File

@ -0,0 +1,50 @@
/* -------------------------------*- 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;
}
}

View File

@ -0,0 +1,160 @@
/* -------------------------------*- 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;
}
}

View File

@ -0,0 +1,58 @@
/* -------------------------------*- 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
}
}

View File

@ -0,0 +1,35 @@
/* -------------------------------*- 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;

View File

@ -1,356 +0,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.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.

View File

@ -1,52 +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;
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
}

View File

@ -1,13 +0,0 @@
/* -------------------------------*- 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

View File

@ -1,64 +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.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
}
}

View File

@ -1,159 +0,0 @@
/* -------------------------------*- 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
}
}

View File

@ -1,79 +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
{
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
}
}

View File

@ -1,34 +0,0 @@
/* -------------------------------*- 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