mirror of
https://github.com/PhasicFlow/phasicFlow.git
synced 2025-07-28 03:27:05 +00:00
Compare commits
12 Commits
a3c3ca1b84
...
main
Author | SHA1 | Date | |
---|---|---|---|
e62ba11a8d | |||
1b949e9eda | |||
9257823b7e | |||
35b32db30e | |||
67559d5c6e | |||
3cc3792e08 | |||
b1ec396a1b | |||
a74e38bbec | |||
26bbdd3dce | |||
73ea794687 | |||
1b557c8514 | |||
b2cfb57c82 |
@ -12,7 +12,7 @@ dt 0.00001; // time step for integration (s)
|
|||||||
|
|
||||||
startTime 0; // start time for simulation
|
startTime 0; // start time for simulation
|
||||||
|
|
||||||
endTime 2; // end time for simulation
|
endTime 7.5; // end time for simulation
|
||||||
|
|
||||||
saveInterval 0.05; // time interval for saving the simulation
|
saveInterval 0.05; // time interval for saving the simulation
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@ dt 0.00001; // time step for integration (s)
|
|||||||
|
|
||||||
startTime 0; // start time for simulation
|
startTime 0; // start time for simulation
|
||||||
|
|
||||||
endTime 2; // end time for simulation
|
endTime 7.5; // end time for simulation
|
||||||
|
|
||||||
saveInterval 0.05; // time interval for saving the simulation
|
saveInterval 0.05; // time interval for saving the simulation
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@ dt 0.00001; // time step for integration (s)
|
|||||||
|
|
||||||
startTime 0; // start time for simulation
|
startTime 0; // start time for simulation
|
||||||
|
|
||||||
endTime 2; // end time for simulation
|
endTime 7.5; // end time for simulation
|
||||||
|
|
||||||
saveInterval 0.05; // time interval for saving the simulation
|
saveInterval 0.05; // time interval for saving the simulation
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@ dt 0.00001; // time step for integration (s)
|
|||||||
|
|
||||||
startTime 0; // start time for simulation
|
startTime 0; // start time for simulation
|
||||||
|
|
||||||
endTime 2; // end time for simulation
|
endTime 7.5; // end time for simulation
|
||||||
|
|
||||||
saveInterval 0.05; // time interval for saving the simulation
|
saveInterval 0.05; // time interval for saving the simulation
|
||||||
|
|
||||||
|
BIN
benchmarks/helicalMixer/images/commericalDEMsnapshot.png
Normal file
BIN
benchmarks/helicalMixer/images/commericalDEMsnapshot.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 185 KiB |
BIN
benchmarks/helicalMixer/images/performance.png
Normal file
BIN
benchmarks/helicalMixer/images/performance.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 40 KiB |
BIN
benchmarks/helicalMixer/images/phasicFlow_snapshot.png
Normal file
BIN
benchmarks/helicalMixer/images/phasicFlow_snapshot.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 206 KiB |
@ -1 +1,101 @@
|
|||||||
# Helical Mixer Benchmark (phasicFlow v-1.0)
|
# Helical Mixer Benchmark (phasicFlow v-1.0)
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
This benchmark compares the performance of phasicFlow with a well-stablished commercial DEM software for simulating a helical mixer with varying particle counts (250k to 4M particles). The benchmark measures both computational efficiency and memory usage across different hardware configurations.
|
||||||
|
|
||||||
|
**Summary of Results:**
|
||||||
|
|
||||||
|
- phasicFlow achieves similar performance to the commercial DEM software on the same hardware.
|
||||||
|
- phasicFlow shows a 30% performance improvement when using the NVIDIA RTX A4000 compared to the RTX 4050Ti.
|
||||||
|
- Memory usage is approximately 50% lower in phasicFlow compared to the commercial software, with phasicFlow using about 0.7 GB of memory per million particles, while the commercial software uses about 1.5 GB per million particles.
|
||||||
|
|
||||||
|
## Simulation Setup
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
<img src="./images/commericalDEMsnapshot.png"/>
|
||||||
|
<div align="center">
|
||||||
|
<p>Figure 1. Commercial DEM simulation snapshot</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
<img src="./images/phasicFlow_snapshot.png"/>
|
||||||
|
<div align="center">
|
||||||
|
<p>Figure 2. phasicFlow simulation snapshot and visualized using Paraview</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
### Hardware Specifications
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
Table 1. Hardware specifications used for benchmarking.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
| System | CPU | GPU | Operating System |
|
||||||
|
| :---------: | :----------------------: | :--------------------------: | :--------------: |
|
||||||
|
| Laptop | Intel i9-13900HX 2.2 GHz | NVIDIA GeForce RTX 4050Ti 6G | Windows 11 24H2 |
|
||||||
|
| Workstation | Intel Xeon 4210 2.2 GHz | NVIDIA RTX A4000 16G | Ubuntu 22.04 |
|
||||||
|
|
||||||
|
### Simulation Parameters
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
Table 2. Parameters for helical mixer simulations.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
| Case | Particle Diameter | Particle Count |
|
||||||
|
| :-------: | :---------------: | :--------------: |
|
||||||
|
| 250k | 6 mm | 250,000 |
|
||||||
|
| 500k | 5 mm | 500,000 |
|
||||||
|
| 1M | 4 mm | 1,000,000 |
|
||||||
|
| 2M | 3 mm | 2,000,000 |
|
||||||
|
| 4M | 2 mm | 4,000,000 |
|
||||||
|
|
||||||
|
The time step for all simulations was set to 1.0e-5 seconds and the simulation ran for 7.5 seconds.
|
||||||
|
|
||||||
|
## Performance Comparison
|
||||||
|
|
||||||
|
### Execution Time
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
Table 3. Total calculation time (minutes) for different configurations.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
| Software | 250k | 500k | 1M | 2M | 4M |
|
||||||
|
| :---------------: | :----: | :-----: | :-----: | :-----: | :-----: |
|
||||||
|
| phasicFlow-4050Ti | 110 min | 215 min | 413 min | - | - |
|
||||||
|
| Commercial DEM-4050Ti | 111 min | 210 min | 415 min | - | - |
|
||||||
|
| phasicFlow-A4000 | 82 min | 150 min | 300 min | 613 min | 1236 min |
|
||||||
|
|
||||||
|
The execution time scales linearly with particle count. phasicFlow demonstrates approximately:
|
||||||
|
|
||||||
|
- the computing speed is basically the same as well-established commercial DEM software on the same hardware
|
||||||
|
- 30% performance improvement when using the NVIDIA RTX A4000 compared to the RTX 4050Ti
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
<img src="./images/performance.png"/>
|
||||||
|
<p>Figure 3. Calculation time comparison between phasicFlow and the well-established commercial DEM software.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
### Memory Usage
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
Table 4. Memory consumption for different configurations.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
| Software | 250k | 500k | 1M | 2M | 4M |
|
||||||
|
| :---------------: | :-----: | :-----: | :-----: | :-----: | :-----: |
|
||||||
|
| phasicFlow-4050Ti | 260 MB | 404 MB | 710 MB | - | - |
|
||||||
|
| Commercial DEM-4050Ti | 460 MB | 920 MB | 1574 MB | - | - |
|
||||||
|
| phasicFlow-A4000 | 352 MB | 496 MB | 802 MB | 1376 MB | 2310 MB |
|
||||||
|
|
||||||
|
Memory efficiency comparison:
|
||||||
|
|
||||||
|
- phasicFlow uses approximately 0.7 GB of memory per million particles
|
||||||
|
- Commercial DEM software uses approximately 1.5 GB of memory per million particles
|
||||||
|
- phasicFlow shows ~50% lower memory consumption compared to the commercial alternative
|
||||||
|
- The memory usage scales linearly with particle count in both software packages. But due to memory limitations on GPUs, it is possible to run larger simulation on GPUs with phasicFlow.
|
||||||
|
|
||||||
|
## Run Your Own Benchmarks
|
||||||
|
|
||||||
|
The simulation case setup files are available in this folder for users interested in performing similar benchmarks on their own hardware. These files can be used to reproduce the tests and compare performance across different systems.
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
|
|
||||||
# Benchmarks
|
# Benchmarks
|
||||||
|
|
||||||
Benchmakrs has been done on two different simulations: a simulation with simple geometry (rotating drum) and a simulation with complex geometry (helical mixer).
|
Benchmakrs has been done on two different simulations: simulation with simple geometry (rotating drum) and a simulation with complex geometry (helical mixer). These benchmarks are used to show how PhasicFlow performs in different scenarios.
|
||||||
|
|
||||||
- [rotating drum](./rotatingDrum/readme.md)
|
- [rotating drum](./rotatingDrum/)
|
||||||
- [helical mixer](./helicalMixer/readme.md)
|
- [helical mixer](./helicalMixer/)
|
||||||
|
|
||||||
|
**Note:** If you have performed benchmarks with PhasicFlow using other hardware or software other than PhasicFlow, we would be happy to include them in this section. Please open an issue for more arrangements or send a pull request with the benchmarks results.
|
||||||
|
@ -4,6 +4,12 @@
|
|||||||
|
|
||||||
This benchmark compares the performance of phasicFlow with a well-stablished commercial DEM software for simulating a rotating drum with varying particle counts (250k to 8M particles). The benchmark measures both computational efficiency and memory usage across different hardware configurations.
|
This benchmark compares the performance of phasicFlow with a well-stablished commercial DEM software for simulating a rotating drum with varying particle counts (250k to 8M particles). The benchmark measures both computational efficiency and memory usage across different hardware configurations.
|
||||||
|
|
||||||
|
**Summary of Results:**
|
||||||
|
|
||||||
|
- phasicFlow achieves approximately 20% faster calculation than the commercial DEM software on the same hardware.
|
||||||
|
- phasicFlow shows a 30% performance improvement when using the NVIDIA RTX A4000 compared to the RTX 4050Ti.
|
||||||
|
- Memory usage is approximately 42% lower in phasicFlow compared to the commercial software, with phasicFlow using about 0.7 GB of memory per million particles, while the commercial software uses about 1.2 GB per million particles
|
||||||
|
|
||||||
## Simulation Setup
|
## Simulation Setup
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
@ -48,10 +48,17 @@ bool pFlow::positionFile::positionPointsFile()
|
|||||||
|
|
||||||
is >> tok;
|
is >> tok;
|
||||||
if(tok.good()&& tok.isNumber()&& !is.eof())
|
if(tok.good()&& tok.isNumber()&& !is.eof())
|
||||||
|
{
|
||||||
|
if(tok.isReal())
|
||||||
{
|
{
|
||||||
tempPoint.x() = tok.realToken();
|
tempPoint.x() = tok.realToken();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
tempPoint.x() = static_cast<real>(tok.int64Token());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
ioErrorInFile(is.name(), is.lineNumber())<< "Bad char or end of file in reading position x!\n";
|
ioErrorInFile(is.name(), is.lineNumber())<< "Bad char or end of file in reading position x!\n";
|
||||||
return false;
|
return false;
|
||||||
@ -70,10 +77,17 @@ bool pFlow::positionFile::positionPointsFile()
|
|||||||
// read position y
|
// read position y
|
||||||
is >> tok;
|
is >> tok;
|
||||||
if(tok.good()&& tok.isNumber()&& !is.eof())
|
if(tok.good()&& tok.isNumber()&& !is.eof())
|
||||||
|
{
|
||||||
|
if(tok.isReal())
|
||||||
{
|
{
|
||||||
tempPoint.y() = tok.realToken();
|
tempPoint.y() = tok.realToken();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
tempPoint.y() = static_cast<real>(tok.int64Token());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
ioErrorInFile(is.name(), is.lineNumber())<< "Bad char or end of file in reading position y!\n";
|
ioErrorInFile(is.name(), is.lineNumber())<< "Bad char or end of file in reading position y!\n";
|
||||||
return false;
|
return false;
|
||||||
@ -92,10 +106,17 @@ bool pFlow::positionFile::positionPointsFile()
|
|||||||
// read position z
|
// read position z
|
||||||
is >> tok;
|
is >> tok;
|
||||||
if(tok.good()&& tok.isNumber()&& !is.eof())
|
if(tok.good()&& tok.isNumber()&& !is.eof())
|
||||||
|
{
|
||||||
|
if(tok.isReal())
|
||||||
{
|
{
|
||||||
tempPoint.z() = tok.realToken();
|
tempPoint.z() = tok.realToken();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
tempPoint.z() = static_cast<real>(tok.int64Token());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
ioErrorInFile(is.name(), is.lineNumber())<< "Bad char or end of file in reading position z!\n";
|
ioErrorInFile(is.name(), is.lineNumber())<< "Bad char or end of file in reading position z!\n";
|
||||||
return false;
|
return false;
|
||||||
|
Reference in New Issue
Block a user