diff --git a/README.md b/README.md
index e1281936..2e597702 100644
--- a/README.md
+++ b/README.md
@@ -1,48 +1,66 @@
-
-

+
+
+## **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.
-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).
+**Scalable Parallelism: MPI Integration**
-## Online code documentation
-You can find a full documentation of the code, its features, and other related materials on [online documentation of the code](https://phasicflow.github.io/phasicFlow/)
+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:
-## How to use PhasicFlow?
-You can navigate into [tutorials folder](./tutorials) in the phasicFlow folder to see some simulation case setups. If you need more detailed discription, visit our [wiki page tutorials](https://github.com/PhasicFlow/phasicFlow/wiki/Tutorials).
+1. **Serial Execution:** Single-core CPU.
+2. **Shared-Memory Parallelism:** Multi-core CPU (OpenMP).
+3. **GPU Acceleration:** NVIDIA GPU (CUDA).
+4. **Distributed-Memory Parallelism:** MPI.
+5. **Hybrid Parallelism:** MPI + OpenMP.
+6. **Multi-GPU Parallelism:** MPI + CUDA.
-## [PhasicFlowPlus](https://github.com/PhasicFlow/PhasicFlowPlus)
-PhasicFlowPlus is and extension to PhasicFlow for simulating particle-fluid systems using resolved and unresolved CFD-DEM. [See the repository of this package.](https://github.com/PhasicFlow/PhasicFlowPlus)
+# **Build and Installation**
+
+PhasicFlow can be compiled for both CPU and GPU execution.
+
+* **Current Development (v-1.0):** Comprehensive build instructions are available [here](https://github.com/PhasicFlow/phasicFlow/wiki/How-to-build-PhasicFlow%E2%80%90v%E2%80%901.0).
+* **Latest Release (v-0.1):** Detailed build instructions are available [here](https://github.com/PhasicFlow/phasicFlow/wiki/How-to-Build-PhasicFlow).
+
+# **Comprehensive Documentation**
+
+In-depth documentation, including code structure, features, and usage guidelines, is accessible via the [online documentation portal](https://phasicflow.github.io/phasicFlow/).
+
+## **Tutorials and Examples**
+
+Practical examples and simulation setups are provided in the [tutorials directory](./tutorials). For detailed explanations and step-by-step guides, please refer to the [tutorial section on the PhasicFlow Wiki](https://github.com/PhasicFlow/phasicFlow/wiki/Tutorials).
+
+# **PhasicFlowPlus: Coupled CFD-DEM Simulations**
+
+PhasicFlowPlus is an extension of PhasicFlow that facilitates the simulation of particle-fluid systems using resolved and unresolved CFD-DEM methods. The repository for PhasicFlowPlus can be found [here](https://github.com/PhasicFlow/PhasicFlowPlus).
-## Supporting packages
-* [Kokkos](https://github.com/kokkos/kokkos) from National Technology & Engineering Solutions of Sandia, LLC (NTESS)
-* [CLI11 1.8](https://github.com/CLIUtils/CLI11) from University of Cincinnati.
+# How to cite PhasicFlow?
-## How to cite PhasicFlow
If you are using PhasicFlow in your research or industrial work, cite the following [article](https://www.sciencedirect.com/science/article/pii/S0010465523001662):
+
```
-@article{NOROUZI2023108821,
-title = {PhasicFlow: A parallel, multi-architecture open-source code for DEM simulations},
-journal = {Computer Physics Communications},
-volume = {291},
-pages = {108821},
-year = {2023},
-issn = {0010-4655},
-doi = {https://doi.org/10.1016/j.cpc.2023.108821},
-url = {https://www.sciencedirect.com/science/article/pii/S0010465523001662},
-author = {H.R. Norouzi},
-keywords = {Discrete element method, Parallel computing, CUDA, GPU, OpenMP, Granular flow}
+@article
+{
+ NOROUZI2023108821,
+ title = {PhasicFlow: A parallel, multi-architecture open-source code for DEM simulations},
+ journal = {Computer Physics Communications},
+ volume = {291},
+ pages = {108821},
+ year = {2023},
+ issn = {0010-4655},
+ doi = {https://doi.org/10.1016/j.cpc.2023.108821},
+ url = {https://www.sciencedirect.com/science/article/pii/S0010465523001662},
+ author = {H.R. Norouzi},
+ keywords = {Discrete element method, Parallel computing, CUDA, GPU, OpenMP, Granular flow}
}
```
+
+# **Dependencies**
+
+PhasicFlow relies on the following external libraries:
+
+* **Kokkos:** A performance portability ecosystem developed by National Technology & Engineering Solutions of Sandia, LLC (NTESS). ([https://github.com/kokkos/kokkos](https://github.com/kokkos/kokkos))
+* **CLI11 1.8:** A command-line interface parser developed by the University of Cincinnati. ([https://github.com/CLIUtils/CLI11](https://github.com/CLIUtils/CLI11))
diff --git a/benchmarks/rotatingDrum_4MParticles/caseSetup/interaction b/benchmarks/rotatingDrum_4MParticles/caseSetup/interaction
index 0477966f..e99f1b34 100755
--- a/benchmarks/rotatingDrum_4MParticles/caseSetup/interaction
+++ b/benchmarks/rotatingDrum_4MParticles/caseSetup/interaction
@@ -3,57 +3,58 @@
| copyright: www.cemf.ir |
\* ------------------------------------------------------------------------- */
-objectName interaction;
-objectType dicrionary;
+objectName interaction;
+objectType dictionary;
+fileFormat ASCII;
+
+/*---------------------------------------------------------------------------*/
materials (glassMat wallMat); // a list of materials names
+
densities (2500.0 2500); // density of materials [kg/m3]
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
{
- method NBS;
- wallMapping cellMapping;
+ method NBS;
- NBSInfo
- {
- updateFrequency 10; // each 20 timesteps, update neighbor list
- sizeRatio 1.05; // bounding box size to particle diameter (max)
- }
+ updateInterval 10;
- cellMappingInfo
- {
- updateFrequency 10; // each 20 timesteps, update neighbor list
- cellExtent 0.6; // bounding box for particle-wall search (> 0.5)
- }
+ sizeRatio 1.1;
+
+ cellExtent 0.55;
+
+ adjustableBox Yes;
+}
+
+model
+{
+ contactForceModel nonLinearLimited;
+
+ rollingFrictionModel normal;
+
+ /*
+ Property (glassMat-glassMat glassMat-wallMat
+ wallMat-wallMat);
+ */
+
+ Yeff (1.0e6 1.0e6
+ 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
+}
-}
\ No newline at end of file
diff --git a/benchmarks/rotatingDrum_4MParticles/caseSetup/particleInsertion b/benchmarks/rotatingDrum_4MParticles/caseSetup/particleInsertion
index eec7b7f9..d1075bda 100755
--- a/benchmarks/rotatingDrum_4MParticles/caseSetup/particleInsertion
+++ b/benchmarks/rotatingDrum_4MParticles/caseSetup/particleInsertion
@@ -3,12 +3,10 @@
| copyright: www.cemf.ir |
\* ------------------------------------------------------------------------- */
-objectName particleInsertion;
-objectType dicrionary;
-
-
-active no; // is insertion active?
-
-collisionCheck No; // not implemented for yes
+objectName particleInsertion;
+objectType dicrionary;
+fileFormat ASCII;
+
+active No; // is insertion active?
diff --git a/tutorials/sphereGranFlow/RotatingDrumWithBaffles/caseSetup/sphereShape b/benchmarks/rotatingDrum_4MParticles/caseSetup/shapes
old mode 100644
new mode 100755
similarity index 62%
rename from tutorials/sphereGranFlow/RotatingDrumWithBaffles/caseSetup/sphereShape
rename to benchmarks/rotatingDrum_4MParticles/caseSetup/shapes
index c9960912..d08fdf86
--- a/tutorials/sphereGranFlow/RotatingDrumWithBaffles/caseSetup/sphereShape
+++ b/benchmarks/rotatingDrum_4MParticles/caseSetup/shapes
@@ -2,14 +2,14 @@
| phasicFlow File |
| copyright: www.cemf.ir |
\* ------------------------------------------------------------------------- */
-objectName sphereDict;
-objectType sphereShape;
-fileFormat ASCII;
+
+objectName shapes;
+objectType dictionary;
+fileFormat ASCII;
/*---------------------------------------------------------------------------*/
-// names of shapes
-names (smallSphere largeSphere);
-// diameter of shapes (m)
-diameters (0.004 0.005);
-// material names for shapes
-materials (lightMat heavyMat);
+names (glassBead); // names of shapes
+
+diameters (0.003); // diameter of shapes
+
+materials (glassMat); // material names for shapes
diff --git a/benchmarks/rotatingDrum_4MParticles/caseSetup/sphereShape b/benchmarks/rotatingDrum_4MParticles/caseSetup/sphereShape
deleted file mode 100755
index eab9b617..00000000
--- a/benchmarks/rotatingDrum_4MParticles/caseSetup/sphereShape
+++ /dev/null
@@ -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
diff --git a/benchmarks/rotatingDrum_4MParticles/settings/domainDict b/benchmarks/rotatingDrum_4MParticles/settings/domainDict
new file mode 100755
index 00000000..a54a7831
--- /dev/null
+++ b/benchmarks/rotatingDrum_4MParticles/settings/domainDict
@@ -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
+ }
+}
diff --git a/benchmarks/rotatingDrum_4MParticles/settings/geometryDict b/benchmarks/rotatingDrum_4MParticles/settings/geometryDict
index 64702fd8..97c513c8 100644
--- a/benchmarks/rotatingDrum_4MParticles/settings/geometryDict
+++ b/benchmarks/rotatingDrum_4MParticles/settings/geometryDict
@@ -3,61 +3,84 @@
| copyright: www.cemf.ir |
\* ------------------------------------------------------------------------- */
-objectName geometryDict;
-objectType dictionary;
+objectName geometryDict;
+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
{
-
- cylinder
- {
- type cylinderWall;
- p1 (0.0 0.0 0.0);
- p2 (0.0 0.0 1.6);
- radius1 0.2;
- radius2 0.2;
- resolution 24;
- material wallMat;
- motion rotAxis;
- }
+ cylinder
+ {
+ type cylinderWall; // type of the wall
+
+ p1 (0.0 0.0 0.0); // begin point of cylinder axis
+
+ p2 (0.0 0.0 1.6); // end point of cylinder axis
+
+ radius1 0.2; // radius at p1
+
+ radius2 0.2; // radius at p2
+
+ resolution 24; // number of divisions
+
+ material wallMat; // material name of this wall
+
+ motion rotAxis; // motion component name
+ }
-
- wall1
- {
- type planeWall;
- p1 (-0.2 -0.2 0.0);
- p2 ( 0.2 -0.2 0.0);
- p3 ( 0.2 0.2 0.0);
- p4 (-0.2 0.2 0.0);
- material wallMat;
- motion rotAxis;
- }
+ /*
+ This is a plane wall at the rear end of cylinder
+ */
+
+ wall1
+ {
+ type planeWall; // type of the wall
+
+ p1 (-0.2 -0.2 0.0); // first point of the wall
+
+ p2 ( 0.2 -0.2 0.0); // second point
+
+ p3 ( 0.2 0.2 0.0); // third point
+
+ p4 (-0.2 0.2 0.0); // fourth point
+
+ material wallMat; // material name of the wall
+
+ motion rotAxis; // motion component name
+ }
- /*
- This is a plane wall at the front end of cylinder
- */
- wall2
- {
- type planeWall;
- p1 (-0.2 -0.2 1.6);
- p2 ( 0.2 -0.2 1.6);
- p3 ( 0.2 0.2 1.6);
- p4 (-0.2 0.2 1.6);
- material wallMat;
- motion rotAxis;
- }
-
+ /*
+ This is a plane wall at the front end of cylinder
+ */
+
+ wall2
+ {
+ type planeWall; // type of the wall
+
+ p1 (-0.2 -0.2 1.6); // first point of the wall
+
+ p2 ( 0.2 -0.2 1.6); // second point
+
+ p3 ( 0.2 0.2 1.6); // third point
+
+ p4 (-0.2 0.2 1.6); // fourth point
+
+ material wallMat; // material name of the wall
+
+ motion rotAxis; // motion component name
+ }
}
-
-// information for rotatingAxisMotion motion model
-rotatingAxisMotionInfo
-{
- rotAxis
- {
- p1 (0.0 0.0 0.0);
- p2 (0.0 0.0 1.0);
- omega 1.256; // rotation speed (rad/s) => 12 rpm
- }
-}
\ No newline at end of file
diff --git a/benchmarks/rotatingDrum_4MParticles/settings/particlesDict b/benchmarks/rotatingDrum_4MParticles/settings/particlesDict
index 7ae00511..d24e6441 100644
--- a/benchmarks/rotatingDrum_4MParticles/settings/particlesDict
+++ b/benchmarks/rotatingDrum_4MParticles/settings/particlesDict
@@ -3,42 +3,45 @@
| copyright: www.cemf.ir |
\* ------------------------------------------------------------------------- */
-objectName particlesDict;
-objectType dictionary;
+objectName particlesDict;
+objectType dictionary;
+fileFormat ASCII;
setFields
{
-
- defaultValue
- {
- velocity realx3 (0 0 0); // linear velocity (m/s)
- acceleration realx3 (0 0 0); // linear acceleration (m/s2)
- rotVelocity realx3 (0 0 0); // rotational velocity (rad/s)
- shapeName word glassBead; // name of the particle shape
- }
+ defaultValue
+ {
+ velocity realx3 (0 0 0); // linear velocity (m/s)
+ acceleration realx3 (0 0 0); // linear acceleration (m/s2)
+ rotVelocity realx3 (0 0 0); // rotational velocity (rad/s)
+ shapeName word glassBead; // name of the particle shape
+ }
- selectors
- {}
+ selectors
+ {}
}
positionParticles
{
- method positionOrdered;
+ method ordered;
- maxNumberOfParticles 4000001;
- mortonSorting Yes;
+ orderedInfo
+ {
+ 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
- {
- p1 ( 0.0 0.0 0.01); // lower corner point of the box
- p2 ( 0.0 0.0 1.59); // upper corner point of the box
- radius 0.195;
- }
-
- positionOrderedInfo
- {
- diameter 0.003; // minimum space between centers of particles
- numPoints 4000000; // number of particles in the simulation
- axisOrder (z x y); // axis order for filling the space with particles
- }
+ regionType cylinder; // other options: box and sphere
+
+ cylinderInfo // cylinder for positioning particles
+ {
+ p1 (0.0 0.0 0.01); // lower corner point of the box
+
+ p2 (0.0 0.0 1.59); // upper corner point of the box
+
+ radius 0.195; // radius of cylinder
+ }
}
diff --git a/benchmarks/rotatingDrum_4MParticles/settings/settingsDict b/benchmarks/rotatingDrum_4MParticles/settings/settingsDict
index 8a881847..8a06568f 100644
--- a/benchmarks/rotatingDrum_4MParticles/settings/settingsDict
+++ b/benchmarks/rotatingDrum_4MParticles/settings/settingsDict
@@ -2,31 +2,33 @@
| phasicFlow File |
| copyright: www.cemf.ir |
\* ------------------------------------------------------------------------- */
-objectName settingsDict;
-objectType dictionary;;
+objectName settingsDict;
+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
-{
- min (-0.2 -0.2 -0.0);
- max ( 0.2 0.2 1.6);
-}
+// exclude unnecessary data from saving on disk
+excludeObjects (rVelocity.dy1 pStructPosition.dy1 pStructVelocity.dy1);
-integrationMethod 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;
diff --git a/tutorials/sphereGranFlow/RotatingDrumWithBaffles/ReadMe.md b/tutorials/sphereGranFlow/RotatingDrumWithBaffles/ReadMe.md
index 8815cb83..8ea62191 100644
--- a/tutorials/sphereGranFlow/RotatingDrumWithBaffles/ReadMe.md
+++ b/tutorials/sphereGranFlow/RotatingDrumWithBaffles/ReadMe.md
@@ -1,5 +1,5 @@
-# Problem Definition
-The problem is to simulate a rotating drum with the diameter **0.24 m**, the length **0.1 m** and **6** Baffles, rotating at **15 rpm**. This drum is filled with **20000** Particles.The timestep for integration is **0.00001 s**. There are 2 types of Particles in this drum each are being inserted during simulation to fill the drum.
+# Problem Definition (v-1.0)
+The problem is to simulate a rotating drum with a diameter of 0.24 m, a length of 0.1 m and 6 baffles rotating at 15 rpm. This drum is filled with 20000 particles, the integration time step is 0.00001 s. There are 2 types of particles in this drum, each of which is inserted during the simulation to fill the drum.
* **12500** Particles with **4 mm** diameter, at the rate of 12500 particles/s for 1 sec.
* **7500** Particles with **5mm** diameter, at the rate of 7500 particles/s for 1 sec.
@@ -15,10 +15,10 @@ The problem is to simulate a rotating drum with the diameter **0.24 m**, the len