mirror of
https://github.com/PhasicFlow/phasicFlow.git
synced 2025-06-22 16:28:30 +00:00
153
.github/scripts/sync-wiki.py
vendored
Executable file
153
.github/scripts/sync-wiki.py
vendored
Executable file
@ -0,0 +1,153 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import yaml
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# Constants
|
||||||
|
REPO_URL = "https://github.com/PhasicFlow/phasicFlow"
|
||||||
|
REPO_PATH = os.path.join(os.environ.get("GITHUB_WORKSPACE", ""), "repo")
|
||||||
|
WIKI_PATH = os.path.join(os.environ.get("GITHUB_WORKSPACE", ""), "wiki")
|
||||||
|
MAPPING_FILE = os.path.join(REPO_PATH, ".github/workflows/markdownList.yml")
|
||||||
|
|
||||||
|
def load_mapping():
|
||||||
|
"""Load the markdown to wiki page mapping file."""
|
||||||
|
try:
|
||||||
|
with open(MAPPING_FILE, 'r') as f:
|
||||||
|
data = yaml.safe_load(f)
|
||||||
|
return data.get('mappings', [])
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error loading mapping file: {e}")
|
||||||
|
return []
|
||||||
|
|
||||||
|
def convert_relative_links(content, source_path):
|
||||||
|
"""Convert relative links in markdown content to absolute URLs."""
|
||||||
|
# Find markdown links with regex pattern [text](url)
|
||||||
|
md_pattern = r'\[([^\]]+)\]\(([^)]+)\)'
|
||||||
|
|
||||||
|
# Find HTML img tags
|
||||||
|
img_pattern = r'<img\s+src=[\'"]([^\'"]+)[\'"]'
|
||||||
|
|
||||||
|
def replace_link(match):
|
||||||
|
link_text = match.group(1)
|
||||||
|
link_url = match.group(2)
|
||||||
|
|
||||||
|
# Skip if already absolute URL or anchor
|
||||||
|
if link_url.startswith(('http://', 'https://', '#', 'mailto:')):
|
||||||
|
return match.group(0)
|
||||||
|
|
||||||
|
# Get the directory of the source file
|
||||||
|
source_dir = os.path.dirname(source_path)
|
||||||
|
|
||||||
|
# Create absolute path from repository root
|
||||||
|
if link_url.startswith('/'):
|
||||||
|
# If link starts with /, it's already relative to repo root
|
||||||
|
abs_path = link_url
|
||||||
|
else:
|
||||||
|
# Otherwise, it's relative to the file location
|
||||||
|
abs_path = os.path.normpath(os.path.join(source_dir, link_url))
|
||||||
|
if not abs_path.startswith('/'):
|
||||||
|
abs_path = '/' + abs_path
|
||||||
|
|
||||||
|
# Convert to GitHub URL
|
||||||
|
github_url = f"{REPO_URL}/blob/main{abs_path}"
|
||||||
|
return f"[{link_text}]({github_url})"
|
||||||
|
|
||||||
|
def replace_img_src(match):
|
||||||
|
img_src = match.group(1)
|
||||||
|
|
||||||
|
# Skip if already absolute URL
|
||||||
|
if img_src.startswith(('http://', 'https://')):
|
||||||
|
return match.group(0)
|
||||||
|
|
||||||
|
# Get the directory of the source file
|
||||||
|
source_dir = os.path.dirname(source_path)
|
||||||
|
|
||||||
|
# Create absolute path from repository root
|
||||||
|
if img_src.startswith('/'):
|
||||||
|
# If link starts with /, it's already relative to repo root
|
||||||
|
abs_path = img_src
|
||||||
|
else:
|
||||||
|
# Otherwise, it's relative to the file location
|
||||||
|
abs_path = os.path.normpath(os.path.join(source_dir, img_src))
|
||||||
|
if not abs_path.startswith('/'):
|
||||||
|
abs_path = '/' + abs_path
|
||||||
|
|
||||||
|
# Convert to GitHub URL (use raw URL for images)
|
||||||
|
github_url = f"{REPO_URL}/raw/main{abs_path}"
|
||||||
|
return f'<img src="{github_url}"'
|
||||||
|
|
||||||
|
# Replace all markdown links
|
||||||
|
content = re.sub(md_pattern, replace_link, content)
|
||||||
|
|
||||||
|
# Replace all img src tags
|
||||||
|
content = re.sub(img_pattern, replace_img_src, content)
|
||||||
|
|
||||||
|
return content
|
||||||
|
|
||||||
|
def process_file(source_file, target_wiki_page):
|
||||||
|
"""Process a markdown file and copy its contents to a wiki page."""
|
||||||
|
source_path = os.path.join(REPO_PATH, source_file)
|
||||||
|
target_path = os.path.join(WIKI_PATH, f"{target_wiki_page}.md")
|
||||||
|
|
||||||
|
print(f"Processing {source_path} -> {target_path}")
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Check if source exists
|
||||||
|
if not os.path.exists(source_path):
|
||||||
|
print(f"Source file not found: {source_path}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Read source content
|
||||||
|
with open(source_path, 'r') as f:
|
||||||
|
content = f.read()
|
||||||
|
|
||||||
|
# Convert relative links
|
||||||
|
content = convert_relative_links(content, source_file)
|
||||||
|
|
||||||
|
# Write to wiki page
|
||||||
|
with open(target_path, 'w') as f:
|
||||||
|
f.write(content)
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error processing {source_file}: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
def main():
|
||||||
|
# Check if wiki directory exists
|
||||||
|
if not os.path.exists(WIKI_PATH):
|
||||||
|
print(f"Wiki path not found: {WIKI_PATH}")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
# Load mapping
|
||||||
|
mappings = load_mapping()
|
||||||
|
if not mappings:
|
||||||
|
print("No mappings found in the mapping file")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
print(f"Found {len(mappings)} mappings to process")
|
||||||
|
|
||||||
|
# Process each mapping
|
||||||
|
success_count = 0
|
||||||
|
for mapping in mappings:
|
||||||
|
source = mapping.get('source')
|
||||||
|
target = mapping.get('target')
|
||||||
|
|
||||||
|
if not source or not target:
|
||||||
|
print(f"Invalid mapping: {mapping}")
|
||||||
|
continue
|
||||||
|
|
||||||
|
if process_file(source, target):
|
||||||
|
success_count += 1
|
||||||
|
|
||||||
|
print(f"Successfully processed {success_count} of {len(mappings)} files")
|
||||||
|
|
||||||
|
# Exit with error if any file failed
|
||||||
|
if success_count < len(mappings):
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
18
.github/workflows/markdownList.yml
vendored
Normal file
18
.github/workflows/markdownList.yml
vendored
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# This file maps source markdown files to their target wiki pages
|
||||||
|
# format:
|
||||||
|
# - source: path/to/markdown/file.md
|
||||||
|
# target: Wiki-Page-Name
|
||||||
|
mappings:
|
||||||
|
- source: benchmarks/readme.md
|
||||||
|
target: Performance-of-phasicFlow
|
||||||
|
- source: benchmarks/helicalMixer/readme.md
|
||||||
|
target: Helical-Mixer-Benchmark
|
||||||
|
- source: benchmarks/rotatingDrum/readme.md
|
||||||
|
target: Rotating-Drum-Benchmark
|
||||||
|
- source: doc/mdDocs/howToBuild-V1.0.md
|
||||||
|
target: How-to-build-PhasicFlow‐v‐1.0
|
||||||
|
- source: tutorials/README.md
|
||||||
|
target: Tutorials
|
||||||
|
- source: doc/mdDocs/phasicFlowFeatures.md
|
||||||
|
target: Features-of-PhasicFlow
|
||||||
|
# Add more mappings as needed
|
60
.github/workflows/sync-wiki.yml
vendored
Normal file
60
.github/workflows/sync-wiki.yml
vendored
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
name: Sync-Wiki
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
paths:
|
||||||
|
- "**/*.md"
|
||||||
|
- ".github/workflows/sync-wiki.yml"
|
||||||
|
- ".github/workflows/markdownList.yml"
|
||||||
|
- ".github/scripts/sync-wiki.py"
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
sync-wiki:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout Repository
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
path: repo
|
||||||
|
- name: Checkout Wiki
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
repository: ${{ github.repository }}.wiki
|
||||||
|
path: wiki
|
||||||
|
continue-on-error: true
|
||||||
|
- name: Create Wiki Directory if Not Exists
|
||||||
|
run: |
|
||||||
|
if [ ! -d "wiki" ]; then
|
||||||
|
mkdir -p wiki
|
||||||
|
cd wiki
|
||||||
|
git init
|
||||||
|
git config user.name "${{ github.actor }}"
|
||||||
|
git config user.email "${{ github.actor }}@users.noreply.github.com"
|
||||||
|
git remote add origin "https://github.com/${{ github.repository }}.wiki.git"
|
||||||
|
fi
|
||||||
|
- name: Set up Python
|
||||||
|
uses: actions/setup-python@v4
|
||||||
|
with:
|
||||||
|
python-version: '3.10'
|
||||||
|
- name: Install dependencies
|
||||||
|
run: pip install pyyaml
|
||||||
|
- name: Sync markdown files to Wiki
|
||||||
|
run: |
|
||||||
|
python $GITHUB_WORKSPACE/repo/.github/scripts/sync-wiki.py
|
||||||
|
env:
|
||||||
|
GITHUB_REPOSITORY: ${{ github.repository }}
|
||||||
|
- name: Push changes to wiki
|
||||||
|
run: |
|
||||||
|
cd wiki
|
||||||
|
git config user.name "${{ github.actor }}"
|
||||||
|
git config user.email "${{ github.actor }}@users.noreply.github.com"
|
||||||
|
git add .
|
||||||
|
if git status --porcelain | grep .; then
|
||||||
|
git commit -m "Auto sync wiki from main repository"
|
||||||
|
git push --set-upstream https://${{ github.actor }}:${{ github.token }}@github.com/${{ github.repository }}.wiki.git master -f
|
||||||
|
else
|
||||||
|
echo "No changes to commit"
|
||||||
|
fi
|
@ -3,30 +3,17 @@ cmake_minimum_required(VERSION 3.16 FATAL_ERROR)
|
|||||||
# set the project name and version
|
# set the project name and version
|
||||||
project(phasicFlow VERSION 1.0 )
|
project(phasicFlow VERSION 1.0 )
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 17 CACHE STRING "" FORCE)
|
set(CMAKE_CXX_STANDARD 20 CACHE STRING "" FORCE)
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED True)
|
set(CMAKE_CXX_STANDARD_REQUIRED True)
|
||||||
set(CMAKE_INSTALL_PREFIX ${phasicFlow_SOURCE_DIR} CACHE PATH "Install path of phasicFlow" FORCE)
|
set(CMAKE_INSTALL_PREFIX ${phasicFlow_SOURCE_DIR} CACHE PATH "Install path of phasicFlow" FORCE)
|
||||||
set(CMAKE_BUILD_TYPE Release CACHE STRING "build type" FORCE)
|
set(CMAKE_BUILD_TYPE Release CACHE STRING "build type")
|
||||||
set(BUILD_SHARED_LIBS ON CACHE BOOL "Build using shared libraries" FORCE)
|
set(BUILD_SHARED_LIBS ON CACHE BOOL "Build using shared libraries" FORCE)
|
||||||
mark_as_advanced(FORCE var BUILD_SHARED_LIBS)
|
mark_as_advanced(FORCE var BUILD_SHARED_LIBS)
|
||||||
|
|
||||||
message(STATUS ${CMAKE_INSTALL_PREFIX})
|
message(STATUS "Install prefix is:" ${CMAKE_INSTALL_PREFIX})
|
||||||
|
|
||||||
include(cmake/globals.cmake)
|
include(cmake/globals.cmake)
|
||||||
|
|
||||||
#Kokkos directory to be included
|
|
||||||
set(Kokkos_Source_DIR)
|
|
||||||
|
|
||||||
if(DEFINED ENV{Kokkos_DIR})
|
|
||||||
set(Kokkos_Source_DIR $ENV{Kokkos_DIR})
|
|
||||||
else()
|
|
||||||
set(Kokkos_Source_DIR $ENV{HOME}/Kokkos/kokkos)
|
|
||||||
endif()
|
|
||||||
message(STATUS "Kokkos source directory is ${Kokkos_Source_DIR}")
|
|
||||||
add_subdirectory(${Kokkos_Source_DIR} ./kokkos)
|
|
||||||
Kokkos_cmake_settings()
|
|
||||||
|
|
||||||
|
|
||||||
option(pFlow_STD_Parallel_Alg "Use TTB std parallel algorithms" ON)
|
option(pFlow_STD_Parallel_Alg "Use TTB std parallel algorithms" ON)
|
||||||
option(pFlow_Build_Serial "Build phasicFlow and backends for serial execution" OFF)
|
option(pFlow_Build_Serial "Build phasicFlow and backends for serial execution" OFF)
|
||||||
option(pFlow_Build_OpenMP "Build phasicFlow and backends for OpenMP execution" OFF)
|
option(pFlow_Build_OpenMP "Build phasicFlow and backends for OpenMP execution" OFF)
|
||||||
@ -34,6 +21,8 @@ option(pFlow_Build_Cuda "Build phasicFlow and backends for Cuda execution" OFF
|
|||||||
option(pFlow_Build_Double "Build phasicFlow with double precision floating-oint variables" ON)
|
option(pFlow_Build_Double "Build phasicFlow with double precision floating-oint variables" ON)
|
||||||
option(pFlow_Build_MPI "Build for MPI parallelization. This will enable multi-gpu run, CPU run on clusters (distributed memory machine). Use this combination Cuda+MPI, OpenMP + MPI or Serial+MPI " OFF)
|
option(pFlow_Build_MPI "Build for MPI parallelization. This will enable multi-gpu run, CPU run on clusters (distributed memory machine). Use this combination Cuda+MPI, OpenMP + MPI or Serial+MPI " OFF)
|
||||||
|
|
||||||
|
#for installing the required packages
|
||||||
|
include(cmake/preReq.cmake)
|
||||||
|
|
||||||
if(pFlow_Build_Serial)
|
if(pFlow_Build_Serial)
|
||||||
set(Kokkos_ENABLE_SERIAL ON CACHE BOOL "Serial execution" FORCE)
|
set(Kokkos_ENABLE_SERIAL ON CACHE BOOL "Serial execution" FORCE)
|
||||||
@ -46,7 +35,8 @@ elseif(pFlow_Build_OpenMP )
|
|||||||
set(Kokkos_ENABLE_OPENMP ON CACHE BOOL "OpenMP execution" FORCE)
|
set(Kokkos_ENABLE_OPENMP ON CACHE BOOL "OpenMP execution" FORCE)
|
||||||
set(Kokkos_ENABLE_CUDA OFF CACHE BOOL "Cuda execution" FORCE)
|
set(Kokkos_ENABLE_CUDA OFF CACHE BOOL "Cuda execution" FORCE)
|
||||||
set(Kokkos_ENABLE_CUDA_LAMBDA OFF CACHE BOOL "Cuda execution" FORCE)
|
set(Kokkos_ENABLE_CUDA_LAMBDA OFF CACHE BOOL "Cuda execution" FORCE)
|
||||||
set(Kokkos_DEFAULT_HOST_PARALLEL_EXECUTION_SPACE SERIAL CACHE STRING "" FORCE)
|
set(Kokkos_DEFAULT_HOST_PARALLEL_EXECUTION_SPACE Serial CACHE STRING "" FORCE)
|
||||||
|
set(Kokkos_DEFAULT_DEVICE_PARALLEL_EXECUTION_SPACE OpenMP CACHE STRING "" FORCE)
|
||||||
set(Kokkos_ENABLE_CUDA_CONSTEXPR OFF CACHE BOOL "Enable constexpr on cuda code" FORCE)
|
set(Kokkos_ENABLE_CUDA_CONSTEXPR OFF CACHE BOOL "Enable constexpr on cuda code" FORCE)
|
||||||
elseif(pFlow_Build_Cuda)
|
elseif(pFlow_Build_Cuda)
|
||||||
set(Kokkos_ENABLE_SERIAL ON CACHE BOOL "Serial execution" FORCE)
|
set(Kokkos_ENABLE_SERIAL ON CACHE BOOL "Serial execution" FORCE)
|
||||||
@ -65,6 +55,7 @@ include(cmake/makeExecutableGlobals.cmake)
|
|||||||
|
|
||||||
configure_file(phasicFlowConfig.H.in phasicFlowConfig.H)
|
configure_file(phasicFlowConfig.H.in phasicFlowConfig.H)
|
||||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||||
|
|
||||||
#add a global include directory
|
#add a global include directory
|
||||||
include_directories(src/setHelpers src/demComponent "${PROJECT_BINARY_DIR}")
|
include_directories(src/setHelpers src/demComponent "${PROJECT_BINARY_DIR}")
|
||||||
|
|
||||||
|
@ -183,4 +183,4 @@ public:
|
|||||||
|
|
||||||
} // pFlow
|
} // pFlow
|
||||||
|
|
||||||
#endif // __DEMSystem_hpp__
|
#endif // __DEMSystem_hpp__
|
||||||
|
96
README.md
96
README.md
@ -1,48 +1,76 @@
|
|||||||
<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.
|
||||||
|
|
||||||
## Supporting packages
|
* **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).
|
||||||
* [Kokkos](https://github.com/kokkos/kokkos) from National Technology & Engineering Solutions of Sandia, LLC (NTESS)
|
* **Latest Release (v-0.1):** Detailed build instructions are available [here](https://github.com/PhasicFlow/phasicFlow/wiki/How-to-Build-PhasicFlow).
|
||||||
* [CLI11 1.8](https://github.com/CLIUtils/CLI11) from University of Cincinnati.
|
|
||||||
|
## **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).
|
||||||
|
|
||||||
|
## Contributing to PhasicFlow
|
||||||
|
We welcome contributions to PhasicFlow! Whether you're a developer or a new user, there are many ways to get involved. Here's how you can help:
|
||||||
|
1. Bug Reports
|
||||||
|
2. Suggestions for better user experience
|
||||||
|
3. Feature request and algorithm improvements
|
||||||
|
4. Tutorials, Simulation Case Setups and documentation
|
||||||
|
5. Direct Code Contributions
|
||||||
|
|
||||||
|
For more details on how you can contribute to PhasicFlow see [this page](https://github.com/PhasicFlow/phasicFlow/wiki/How-to-contribute-to-PhasicFlow).
|
||||||
|
|
||||||
|
## **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).
|
||||||
|
|
||||||
|
## 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):
|
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 community-led performance portability ecosystem within the Linux Foundation's High-Performance Software Foundation (HPSF). ([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))
|
||||||
|
1
benchmarks/helicalMixer/readme.md
Normal file
1
benchmarks/helicalMixer/readme.md
Normal file
@ -0,0 +1 @@
|
|||||||
|
# Helical Mixer Benchmark (phasicFlow v-1.0)
|
7
benchmarks/readme.md
Normal file
7
benchmarks/readme.md
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
# Benchmarks
|
||||||
|
|
||||||
|
Benchmakrs has been done on two different simulations: a simulation with simple geometry (rotating drum) and a simulation with complex geometry (helical mixer).
|
||||||
|
|
||||||
|
- [rotating drum](./rotatingDrum/readme.md)
|
||||||
|
- [helical mixer](./helicalMixer/readme.md)
|
BIN
benchmarks/rotatingDrum/images/commericalDEMsnapshot.png
Normal file
BIN
benchmarks/rotatingDrum/images/commericalDEMsnapshot.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 124 KiB |
BIN
benchmarks/rotatingDrum/images/performance1.png
Normal file
BIN
benchmarks/rotatingDrum/images/performance1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 55 KiB |
BIN
benchmarks/rotatingDrum/images/phasicFlow_snapshot.png
Normal file
BIN
benchmarks/rotatingDrum/images/phasicFlow_snapshot.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 180 KiB |
96
benchmarks/rotatingDrum/readme.md
Normal file
96
benchmarks/rotatingDrum/readme.md
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
# Rotating Drum Benchmark (phasicFlow v-1.0)
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
## 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 rotating drum simulations.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
| Case | Particle Diameter | Particle Count | Drum Length | Drum Radius |
|
||||||
|
| :-------: | :---------------: | :--------------: | :------------------: | :------------------: |
|
||||||
|
| 250k | 6 mm | 250,000 | 0.8 m | 0.2 m |
|
||||||
|
| 500k | 5 mm | 500,000 | 0.8 m | 0.2 m |
|
||||||
|
| 1M | 4 mm | 1,000,000 | 0.8 m | 0.2 m |
|
||||||
|
| 2M | 3 mm | 2,000,000 | 1.2 m | 0.2 m |
|
||||||
|
| 4M | 3 mm | 4,000,000 | 1.6 m | 0.2 m |
|
||||||
|
| 8M | 2 mm | 8,000,000 | 1.6 m | 0.2 m |
|
||||||
|
|
||||||
|
The time step for all simulations was set to 1.0e-5 seconds and the simulation ran for 4 seconds.
|
||||||
|
|
||||||
|
## Performance Comparison
|
||||||
|
|
||||||
|
### Execution Time
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
Table 3. Total calculation time (minutes) for different configurations.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
| Software | 250k | 500k | 1M | 2M | 4M | 8M |
|
||||||
|
| :---------------: | :----: | :-----: | :-----: | :-----: | :-----: | :------: |
|
||||||
|
| phasicFlow-4050Ti | 54 min | 111 min | 216 min | 432 min | - | - |
|
||||||
|
| Commercial DEM-4050Ti | 68 min | 136 min | 275 min | 570 min | - | - |
|
||||||
|
| phasicFlow-A4000 | 38 min | 73 min | 146 min | 293 min | 589 min | 1188 min |
|
||||||
|
|
||||||
|
The execution time scales linearly with particle count. phasicFlow demonstrates approximately:
|
||||||
|
|
||||||
|
- 20% faster calculation than the 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/performance1.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 | 8M |
|
||||||
|
| :---------------: | :-----: | :-----: | :-----: | :-----: | :-----: | :-----: |
|
||||||
|
| phasicFlow-4050Ti | 252 MB | 412 MB | 710 MB | 1292 MB | - | - |
|
||||||
|
| Commercial DEM-4050Ti | 485 MB | 897 MB | 1525 MB | 2724 MB | - | - |
|
||||||
|
| phasicFlow-A4000 | 344 MB | 480 MB | 802 MB | 1386 MB | 2590 MB | 4966 MB |
|
||||||
|
|
||||||
|
Memory efficiency comparison:
|
||||||
|
|
||||||
|
- phasicFlow uses approximately 0.7 GB of memory per million particles
|
||||||
|
- Commercial DEM software uses approximately 1.2 GB of memory per million particles
|
||||||
|
- phasicFlow shows ~42% 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.
|
@ -0,0 +1,60 @@
|
|||||||
|
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||||
|
| phasicFlow File |
|
||||||
|
| copyright: www.cemf.ir |
|
||||||
|
\* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
contactSearch
|
||||||
|
{
|
||||||
|
method NBS;
|
||||||
|
|
||||||
|
updateInterval 20;
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
@ -2,12 +2,14 @@
|
|||||||
| phasicFlow File |
|
| phasicFlow File |
|
||||||
| copyright: www.cemf.ir |
|
| copyright: www.cemf.ir |
|
||||||
\* ------------------------------------------------------------------------- */
|
\* ------------------------------------------------------------------------- */
|
||||||
objectName particleInsertion;
|
|
||||||
objectType dicrionary;
|
objectName shapes;
|
||||||
fileFormat ASCII;
|
objectType dictionary;
|
||||||
|
fileFormat ASCII;
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
active No; // is insertion active -> Yes or No
|
|
||||||
|
|
||||||
collisionCheck No; // is checked -> Yes or No
|
names (glassBead); // names of shapes
|
||||||
|
|
||||||
|
diameters (0.004); // diameter of shapes
|
||||||
|
|
||||||
|
materials (glassMat); // material names for shapes
|
@ -0,0 +1,50 @@
|
|||||||
|
/* -------------------------------*- 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 0.8);
|
||||||
|
}
|
||||||
|
|
||||||
|
boundaries
|
||||||
|
{
|
||||||
|
neighborListUpdateInterval 200;
|
||||||
|
|
||||||
|
updateInterval 20;
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,86 @@
|
|||||||
|
/* -------------------------------*- 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
|
||||||
|
{
|
||||||
|
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; // type of the wall
|
||||||
|
|
||||||
|
p1 (0.0 0.0 0.0); // begin point of cylinder axis
|
||||||
|
|
||||||
|
p2 (0.0 0.0 0.8); // end point of cylinder axis
|
||||||
|
|
||||||
|
radius1 0.2; // radius at p1
|
||||||
|
|
||||||
|
radius2 0.2; // radius at p2
|
||||||
|
|
||||||
|
resolution 60; // number of divisions
|
||||||
|
|
||||||
|
material wallMat; // material name of this wall
|
||||||
|
|
||||||
|
motion rotAxis; // motion component name
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
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; // type of the wall
|
||||||
|
|
||||||
|
p1 (-0.2 -0.2 0.8); // first point of the wall
|
||||||
|
|
||||||
|
p2 ( 0.2 -0.2 0.8); // second point
|
||||||
|
|
||||||
|
p3 ( 0.2 0.2 0.8); // third point
|
||||||
|
|
||||||
|
p4 (-0.2 0.2 0.8); // fourth point
|
||||||
|
|
||||||
|
material wallMat; // material name of the wall
|
||||||
|
|
||||||
|
motion rotAxis; // motion component name
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,47 @@
|
|||||||
|
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||||
|
| phasicFlow File |
|
||||||
|
| copyright: www.cemf.ir |
|
||||||
|
\* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
selectors
|
||||||
|
{}
|
||||||
|
}
|
||||||
|
|
||||||
|
positionParticles
|
||||||
|
{
|
||||||
|
method ordered;
|
||||||
|
|
||||||
|
orderedInfo
|
||||||
|
{
|
||||||
|
distance 0.004; // minimum space between centers of particles
|
||||||
|
|
||||||
|
numPoints 1000000; // 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 0.79); // upper corner point of the box
|
||||||
|
|
||||||
|
radius 0.195; // radius of cylinder
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||||
|
| phasicFlow File |
|
||||||
|
| copyright: www.cemf.ir |
|
||||||
|
\* ------------------------------------------------------------------------- */
|
||||||
|
objectName settingsDict;
|
||||||
|
objectType dictionary;
|
||||||
|
fileFormat ASCII;
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
run rotatingDrum_1mParticles;
|
||||||
|
|
||||||
|
dt 0.00001; // time step for integration (s)
|
||||||
|
|
||||||
|
startTime 0; // start time for simulation
|
||||||
|
|
||||||
|
endTime 4; // end time for simulation
|
||||||
|
|
||||||
|
saveInterval 0.2; // time interval for saving the simulation
|
||||||
|
|
||||||
|
timePrecision 5; // maximum number of digits for time folder
|
||||||
|
|
||||||
|
g (0 -9.8 0); // gravity vector (m/s2)
|
||||||
|
|
||||||
|
includeObjects (diameter); // save necessary (i.e., required) data on disk
|
||||||
|
|
||||||
|
// exclude unnecessary data from saving on disk
|
||||||
|
excludeObjects (rVelocity.dy1 pStructPosition.dy1 pStructVelocity.dy1);
|
||||||
|
|
||||||
|
integrationMethod AdamsBashforth2; // integration method
|
||||||
|
|
||||||
|
writeFormat binary; // data writting format (ascii or binary)
|
||||||
|
|
||||||
|
timersReport Yes;
|
||||||
|
|
||||||
|
timersReportInterval 0.01;
|
@ -0,0 +1,60 @@
|
|||||||
|
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||||
|
| phasicFlow File |
|
||||||
|
| copyright: www.cemf.ir |
|
||||||
|
\* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
contactSearch
|
||||||
|
{
|
||||||
|
method NBS;
|
||||||
|
|
||||||
|
updateInterval 20;
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
@ -2,12 +2,14 @@
|
|||||||
| phasicFlow File |
|
| phasicFlow File |
|
||||||
| copyright: www.cemf.ir |
|
| copyright: www.cemf.ir |
|
||||||
\* ------------------------------------------------------------------------- */
|
\* ------------------------------------------------------------------------- */
|
||||||
objectName particleInsertion;
|
|
||||||
objectType dicrionary;
|
objectName shapes;
|
||||||
fileFormat ASCII;
|
objectType dictionary;
|
||||||
|
fileFormat ASCII;
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
active No; // is insertion active -> Yes or No
|
|
||||||
|
|
||||||
collisionCheck No; // is checked -> Yes or No
|
names (glassBead); // names of shapes
|
||||||
|
|
||||||
|
diameters (0.006); // diameter of shapes
|
||||||
|
|
||||||
|
materials (glassMat); // material names for shapes
|
0
tutorials/sphereGranFlow/toteblender/cleanThisCase → benchmarks/rotatingDrum/rotatingDrum_250kParticles/cleanThisCase
Normal file → Executable file
0
tutorials/sphereGranFlow/toteblender/cleanThisCase → benchmarks/rotatingDrum/rotatingDrum_250kParticles/cleanThisCase
Normal file → Executable file
0
tutorials/sphereGranFlow/toteblender/runThisCase → benchmarks/rotatingDrum/rotatingDrum_250kParticles/runThisCase
Normal file → Executable file
0
tutorials/sphereGranFlow/toteblender/runThisCase → benchmarks/rotatingDrum/rotatingDrum_250kParticles/runThisCase
Normal file → Executable file
@ -0,0 +1,50 @@
|
|||||||
|
/* -------------------------------*- 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 0.8);
|
||||||
|
}
|
||||||
|
|
||||||
|
boundaries
|
||||||
|
{
|
||||||
|
neighborListUpdateInterval 200;
|
||||||
|
|
||||||
|
updateInterval 20;
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,86 @@
|
|||||||
|
/* -------------------------------*- 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
|
||||||
|
{
|
||||||
|
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; // type of the wall
|
||||||
|
|
||||||
|
p1 (0.0 0.0 0.0); // begin point of cylinder axis
|
||||||
|
|
||||||
|
p2 (0.0 0.0 0.8); // end point of cylinder axis
|
||||||
|
|
||||||
|
radius1 0.2; // radius at p1
|
||||||
|
|
||||||
|
radius2 0.2; // radius at p2
|
||||||
|
|
||||||
|
resolution 60; // number of divisions
|
||||||
|
|
||||||
|
material wallMat; // material name of this wall
|
||||||
|
|
||||||
|
motion rotAxis; // motion component name
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
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; // type of the wall
|
||||||
|
|
||||||
|
p1 (-0.2 -0.2 0.8); // first point of the wall
|
||||||
|
|
||||||
|
p2 ( 0.2 -0.2 0.8); // second point
|
||||||
|
|
||||||
|
p3 ( 0.2 0.2 0.8); // third point
|
||||||
|
|
||||||
|
p4 (-0.2 0.2 0.8); // fourth point
|
||||||
|
|
||||||
|
material wallMat; // material name of the wall
|
||||||
|
|
||||||
|
motion rotAxis; // motion component name
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,47 @@
|
|||||||
|
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||||
|
| phasicFlow File |
|
||||||
|
| copyright: www.cemf.ir |
|
||||||
|
\* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
selectors
|
||||||
|
{}
|
||||||
|
}
|
||||||
|
|
||||||
|
positionParticles
|
||||||
|
{
|
||||||
|
method ordered;
|
||||||
|
|
||||||
|
orderedInfo
|
||||||
|
{
|
||||||
|
distance 0.006; // minimum space between centers of particles
|
||||||
|
|
||||||
|
numPoints 250000; // 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 0.79); // upper corner point of the box
|
||||||
|
|
||||||
|
radius 0.195; // radius of cylinder
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||||
|
| phasicFlow File |
|
||||||
|
| copyright: www.cemf.ir |
|
||||||
|
\* ------------------------------------------------------------------------- */
|
||||||
|
objectName settingsDict;
|
||||||
|
objectType dictionary;
|
||||||
|
fileFormat ASCII;
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
run rotatingDrum_250KParticles;
|
||||||
|
|
||||||
|
dt 0.00001; // time step for integration (s)
|
||||||
|
|
||||||
|
startTime 0; // start time for simulation
|
||||||
|
|
||||||
|
endTime 4; // end time for simulation
|
||||||
|
|
||||||
|
saveInterval 0.2; // time interval for saving the simulation
|
||||||
|
|
||||||
|
timePrecision 5; // maximum number of digits for time folder
|
||||||
|
|
||||||
|
g (0 -9.8 0); // gravity vector (m/s2)
|
||||||
|
|
||||||
|
includeObjects (diameter); // save necessary (i.e., required) data on disk
|
||||||
|
|
||||||
|
// exclude unnecessary data from saving on disk
|
||||||
|
excludeObjects (rVelocity.dy1 pStructPosition.dy1 pStructVelocity.dy1);
|
||||||
|
|
||||||
|
integrationMethod AdamsBashforth2; // integration method
|
||||||
|
|
||||||
|
writeFormat binary; // data writting format (ascii or binary)
|
||||||
|
|
||||||
|
timersReport Yes;
|
||||||
|
|
||||||
|
timersReportInterval 0.01;
|
@ -0,0 +1,60 @@
|
|||||||
|
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||||
|
| phasicFlow File |
|
||||||
|
| copyright: www.cemf.ir |
|
||||||
|
\* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
contactSearch
|
||||||
|
{
|
||||||
|
method NBS;
|
||||||
|
|
||||||
|
updateInterval 20;
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
15
tutorials/sphereGranFlow/rotatingDrumSmall/caseSetup/sphereShape → benchmarks/rotatingDrum/rotatingDrum_2mParticles/caseSetup/shapes
Executable file → Normal file
15
tutorials/sphereGranFlow/rotatingDrumSmall/caseSetup/sphereShape → benchmarks/rotatingDrum/rotatingDrum_2mParticles/caseSetup/shapes
Executable file → Normal file
@ -2,11 +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;
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
names (sphere1); // names of shapes
|
names (glassBead); // names of shapes
|
||||||
diameters (0.004); // diameter of shapes
|
|
||||||
materials (prop1); // material names for shapes
|
diameters (0.003); // diameter of shapes
|
||||||
|
|
||||||
|
materials (glassMat); // material names for shapes
|
7
benchmarks/rotatingDrum/rotatingDrum_2mParticles/cleanThisCase
Executable file
7
benchmarks/rotatingDrum/rotatingDrum_2mParticles/cleanThisCase
Executable file
@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
cd ${0%/*} || exit 1 # Run from this directory
|
||||||
|
|
||||||
|
ls | grep -P "^(([0-9]+\.?[0-9]*)|(\.[0-9]+))$" | xargs -d"\n" rm -rf
|
||||||
|
rm -rf VTK
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
21
benchmarks/rotatingDrum/rotatingDrum_2mParticles/runThisCase
Executable file
21
benchmarks/rotatingDrum/rotatingDrum_2mParticles/runThisCase
Executable file
@ -0,0 +1,21 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
cd ${0%/*} || exit 1 # Run from this directory
|
||||||
|
echo "\n<--------------------------------------------------------------------->"
|
||||||
|
echo "1) Creating particles"
|
||||||
|
echo "<--------------------------------------------------------------------->\n"
|
||||||
|
particlesPhasicFlow
|
||||||
|
|
||||||
|
echo "\n<--------------------------------------------------------------------->"
|
||||||
|
echo "2) Creating geometry"
|
||||||
|
echo "<--------------------------------------------------------------------->\n"
|
||||||
|
geometryPhasicFlow
|
||||||
|
|
||||||
|
echo "\n<--------------------------------------------------------------------->"
|
||||||
|
echo "3) Running the case"
|
||||||
|
echo "<--------------------------------------------------------------------->\n"
|
||||||
|
sphereGranFlow
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
@ -0,0 +1,50 @@
|
|||||||
|
/* -------------------------------*- 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.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
boundaries
|
||||||
|
{
|
||||||
|
neighborListUpdateInterval 200;
|
||||||
|
|
||||||
|
updateInterval 20;
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,86 @@
|
|||||||
|
/* -------------------------------*- 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
|
||||||
|
{
|
||||||
|
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; // type of the wall
|
||||||
|
|
||||||
|
p1 (0.0 0.0 0.0); // begin point of cylinder axis
|
||||||
|
|
||||||
|
p2 (0.0 0.0 1.2); // end point of cylinder axis
|
||||||
|
|
||||||
|
radius1 0.2; // radius at p1
|
||||||
|
|
||||||
|
radius2 0.2; // radius at p2
|
||||||
|
|
||||||
|
resolution 60; // number of divisions
|
||||||
|
|
||||||
|
material wallMat; // material name of this wall
|
||||||
|
|
||||||
|
motion rotAxis; // motion component name
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
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; // type of the wall
|
||||||
|
|
||||||
|
p1 (-0.2 -0.2 1.2); // first point of the wall
|
||||||
|
|
||||||
|
p2 ( 0.2 -0.2 1.2); // second point
|
||||||
|
|
||||||
|
p3 ( 0.2 0.2 1.2); // third point
|
||||||
|
|
||||||
|
p4 (-0.2 0.2 1.2); // fourth point
|
||||||
|
|
||||||
|
material wallMat; // material name of the wall
|
||||||
|
|
||||||
|
motion rotAxis; // motion component name
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,47 @@
|
|||||||
|
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||||
|
| phasicFlow File |
|
||||||
|
| copyright: www.cemf.ir |
|
||||||
|
\* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
selectors
|
||||||
|
{}
|
||||||
|
}
|
||||||
|
|
||||||
|
positionParticles
|
||||||
|
{
|
||||||
|
method ordered;
|
||||||
|
|
||||||
|
orderedInfo
|
||||||
|
{
|
||||||
|
distance 0.003; // minimum space between centers of particles
|
||||||
|
|
||||||
|
numPoints 2000000; // 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.19); // upper corner point of the box
|
||||||
|
|
||||||
|
radius 0.195; // radius of cylinder
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||||
|
| phasicFlow File |
|
||||||
|
| copyright: www.cemf.ir |
|
||||||
|
\* ------------------------------------------------------------------------- */
|
||||||
|
objectName settingsDict;
|
||||||
|
objectType dictionary;
|
||||||
|
fileFormat ASCII;
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
run rotatingDrum_2mParticles;
|
||||||
|
|
||||||
|
dt 0.00001; // time step for integration (s)
|
||||||
|
|
||||||
|
startTime 0; // start time for simulation
|
||||||
|
|
||||||
|
endTime 4; // end time for simulation
|
||||||
|
|
||||||
|
saveInterval 0.2; // time interval for saving the simulation
|
||||||
|
|
||||||
|
timePrecision 5; // maximum number of digits for time folder
|
||||||
|
|
||||||
|
g (0 -9.8 0); // gravity vector (m/s2)
|
||||||
|
|
||||||
|
includeObjects (diameter); // save necessary (i.e., required) data on disk
|
||||||
|
|
||||||
|
// exclude unnecessary data from saving on disk
|
||||||
|
excludeObjects (rVelocity.dy1 pStructPosition.dy1 pStructVelocity.dy1);
|
||||||
|
|
||||||
|
integrationMethod AdamsBashforth2; // integration method
|
||||||
|
|
||||||
|
writeFormat binary; // data writting format (ascii or binary)
|
||||||
|
|
||||||
|
timersReport Yes;
|
||||||
|
|
||||||
|
timersReportInterval 0.01;
|
@ -0,0 +1,60 @@
|
|||||||
|
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||||
|
| phasicFlow File |
|
||||||
|
| copyright: www.cemf.ir |
|
||||||
|
\* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
contactSearch
|
||||||
|
{
|
||||||
|
method NBS;
|
||||||
|
|
||||||
|
updateInterval 20;
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,15 @@
|
|||||||
|
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||||
|
| phasicFlow File |
|
||||||
|
| copyright: www.cemf.ir |
|
||||||
|
\* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
objectName shapes;
|
||||||
|
objectType dictionary;
|
||||||
|
fileFormat ASCII;
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
names (glassBead); // names of shapes
|
||||||
|
|
||||||
|
diameters (0.003); // diameter of shapes
|
||||||
|
|
||||||
|
materials (glassMat); // material names for shapes
|
7
benchmarks/rotatingDrum/rotatingDrum_4mParticles/cleanThisCase
Executable file
7
benchmarks/rotatingDrum/rotatingDrum_4mParticles/cleanThisCase
Executable file
@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
cd ${0%/*} || exit 1 # Run from this directory
|
||||||
|
|
||||||
|
ls | grep -P "^(([0-9]+\.?[0-9]*)|(\.[0-9]+))$" | xargs -d"\n" rm -rf
|
||||||
|
rm -rf VTK
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
21
benchmarks/rotatingDrum/rotatingDrum_4mParticles/runThisCase
Executable file
21
benchmarks/rotatingDrum/rotatingDrum_4mParticles/runThisCase
Executable file
@ -0,0 +1,21 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
cd ${0%/*} || exit 1 # Run from this directory
|
||||||
|
echo "\n<--------------------------------------------------------------------->"
|
||||||
|
echo "1) Creating particles"
|
||||||
|
echo "<--------------------------------------------------------------------->\n"
|
||||||
|
particlesPhasicFlow
|
||||||
|
|
||||||
|
echo "\n<--------------------------------------------------------------------->"
|
||||||
|
echo "2) Creating geometry"
|
||||||
|
echo "<--------------------------------------------------------------------->\n"
|
||||||
|
geometryPhasicFlow
|
||||||
|
|
||||||
|
echo "\n<--------------------------------------------------------------------->"
|
||||||
|
echo "3) Running the case"
|
||||||
|
echo "<--------------------------------------------------------------------->\n"
|
||||||
|
sphereGranFlow
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
@ -0,0 +1,50 @@
|
|||||||
|
/* -------------------------------*- 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
|
||||||
|
{
|
||||||
|
neighborListUpdateInterval 200;
|
||||||
|
|
||||||
|
updateInterval 20;
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,86 @@
|
|||||||
|
/* -------------------------------*- 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
|
||||||
|
{
|
||||||
|
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; // 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 60; // number of divisions
|
||||||
|
|
||||||
|
material wallMat; // material name of this wall
|
||||||
|
|
||||||
|
motion rotAxis; // motion component name
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
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; // 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
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,47 @@
|
|||||||
|
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||||
|
| phasicFlow File |
|
||||||
|
| copyright: www.cemf.ir |
|
||||||
|
\* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
selectors
|
||||||
|
{}
|
||||||
|
}
|
||||||
|
|
||||||
|
positionParticles
|
||||||
|
{
|
||||||
|
method ordered;
|
||||||
|
|
||||||
|
orderedInfo
|
||||||
|
{
|
||||||
|
distance 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
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||||
|
| phasicFlow File |
|
||||||
|
| copyright: www.cemf.ir |
|
||||||
|
\* ------------------------------------------------------------------------- */
|
||||||
|
objectName settingsDict;
|
||||||
|
objectType dictionary;
|
||||||
|
fileFormat ASCII;
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
run rotatingDrum_4mParticles;
|
||||||
|
|
||||||
|
dt 0.00001; // time step for integration (s)
|
||||||
|
|
||||||
|
startTime 0; // start time for simulation
|
||||||
|
|
||||||
|
endTime 4; // end time for simulation
|
||||||
|
|
||||||
|
saveInterval 0.2; // time interval for saving the simulation
|
||||||
|
|
||||||
|
timePrecision 5; // maximum number of digits for time folder
|
||||||
|
|
||||||
|
g (0 -9.8 0); // gravity vector (m/s2)
|
||||||
|
|
||||||
|
includeObjects (diameter); // save necessary (i.e., required) data on disk
|
||||||
|
|
||||||
|
// exclude unnecessary data from saving on disk
|
||||||
|
excludeObjects (rVelocity.dy1 pStructPosition.dy1 pStructVelocity.dy1);
|
||||||
|
|
||||||
|
integrationMethod AdamsBashforth2; // integration method
|
||||||
|
|
||||||
|
writeFormat binary; // data writting format (ascii or binary)
|
||||||
|
|
||||||
|
timersReport Yes;
|
||||||
|
|
||||||
|
timersReportInterval 0.01;
|
@ -0,0 +1,60 @@
|
|||||||
|
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||||
|
| phasicFlow File |
|
||||||
|
| copyright: www.cemf.ir |
|
||||||
|
\* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
contactSearch
|
||||||
|
{
|
||||||
|
method NBS;
|
||||||
|
|
||||||
|
updateInterval 20;
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,15 @@
|
|||||||
|
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||||
|
| phasicFlow File |
|
||||||
|
| copyright: www.cemf.ir |
|
||||||
|
\* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
objectName shapes;
|
||||||
|
objectType dictionary;
|
||||||
|
fileFormat ASCII;
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
names (glassBead); // names of shapes
|
||||||
|
|
||||||
|
diameters (0.005); // diameter of shapes
|
||||||
|
|
||||||
|
materials (glassMat); // material names for shapes
|
7
benchmarks/rotatingDrum/rotatingDrum_500kParticles/cleanThisCase
Executable file
7
benchmarks/rotatingDrum/rotatingDrum_500kParticles/cleanThisCase
Executable file
@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
cd ${0%/*} || exit 1 # Run from this directory
|
||||||
|
|
||||||
|
ls | grep -P "^(([0-9]+\.?[0-9]*)|(\.[0-9]+))$" | xargs -d"\n" rm -rf
|
||||||
|
rm -rf VTK
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
21
benchmarks/rotatingDrum/rotatingDrum_500kParticles/runThisCase
Executable file
21
benchmarks/rotatingDrum/rotatingDrum_500kParticles/runThisCase
Executable file
@ -0,0 +1,21 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
cd ${0%/*} || exit 1 # Run from this directory
|
||||||
|
echo "\n<--------------------------------------------------------------------->"
|
||||||
|
echo "1) Creating particles"
|
||||||
|
echo "<--------------------------------------------------------------------->\n"
|
||||||
|
particlesPhasicFlow
|
||||||
|
|
||||||
|
echo "\n<--------------------------------------------------------------------->"
|
||||||
|
echo "2) Creating geometry"
|
||||||
|
echo "<--------------------------------------------------------------------->\n"
|
||||||
|
geometryPhasicFlow
|
||||||
|
|
||||||
|
echo "\n<--------------------------------------------------------------------->"
|
||||||
|
echo "3) Running the case"
|
||||||
|
echo "<--------------------------------------------------------------------->\n"
|
||||||
|
sphereGranFlow
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
@ -0,0 +1,50 @@
|
|||||||
|
/* -------------------------------*- 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 0.8);
|
||||||
|
}
|
||||||
|
|
||||||
|
boundaries
|
||||||
|
{
|
||||||
|
neighborListUpdateInterval 200;
|
||||||
|
|
||||||
|
updateInterval 20;
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,86 @@
|
|||||||
|
/* -------------------------------*- 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
|
||||||
|
{
|
||||||
|
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; // type of the wall
|
||||||
|
|
||||||
|
p1 (0.0 0.0 0.0); // begin point of cylinder axis
|
||||||
|
|
||||||
|
p2 (0.0 0.0 0.8); // end point of cylinder axis
|
||||||
|
|
||||||
|
radius1 0.2; // radius at p1
|
||||||
|
|
||||||
|
radius2 0.2; // radius at p2
|
||||||
|
|
||||||
|
resolution 60; // number of divisions
|
||||||
|
|
||||||
|
material wallMat; // material name of this wall
|
||||||
|
|
||||||
|
motion rotAxis; // motion component name
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
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; // type of the wall
|
||||||
|
|
||||||
|
p1 (-0.2 -0.2 0.8); // first point of the wall
|
||||||
|
|
||||||
|
p2 ( 0.2 -0.2 0.8); // second point
|
||||||
|
|
||||||
|
p3 ( 0.2 0.2 0.8); // third point
|
||||||
|
|
||||||
|
p4 (-0.2 0.2 0.8); // fourth point
|
||||||
|
|
||||||
|
material wallMat; // material name of the wall
|
||||||
|
|
||||||
|
motion rotAxis; // motion component name
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,47 @@
|
|||||||
|
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||||
|
| phasicFlow File |
|
||||||
|
| copyright: www.cemf.ir |
|
||||||
|
\* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
selectors
|
||||||
|
{}
|
||||||
|
}
|
||||||
|
|
||||||
|
positionParticles
|
||||||
|
{
|
||||||
|
method ordered;
|
||||||
|
|
||||||
|
orderedInfo
|
||||||
|
{
|
||||||
|
distance 0.005; // minimum space between centers of particles
|
||||||
|
|
||||||
|
numPoints 500000; // 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 0.79); // upper corner point of the box
|
||||||
|
|
||||||
|
radius 0.195; // radius of cylinder
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||||
|
| phasicFlow File |
|
||||||
|
| copyright: www.cemf.ir |
|
||||||
|
\* ------------------------------------------------------------------------- */
|
||||||
|
objectName settingsDict;
|
||||||
|
objectType dictionary;
|
||||||
|
fileFormat ASCII;
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
run rotatingDrum_500KParticles;
|
||||||
|
|
||||||
|
dt 0.00001; // time step for integration (s)
|
||||||
|
|
||||||
|
startTime 0; // start time for simulation
|
||||||
|
|
||||||
|
endTime 4; // end time for simulation
|
||||||
|
|
||||||
|
saveInterval 0.2; // time interval for saving the simulation
|
||||||
|
|
||||||
|
timePrecision 5; // maximum number of digits for time folder
|
||||||
|
|
||||||
|
g (0 -9.8 0); // gravity vector (m/s2)
|
||||||
|
|
||||||
|
includeObjects (diameter); // save necessary (i.e., required) data on disk
|
||||||
|
|
||||||
|
// exclude unnecessary data from saving on disk
|
||||||
|
excludeObjects (rVelocity.dy1 pStructPosition.dy1 pStructVelocity.dy1);
|
||||||
|
|
||||||
|
integrationMethod AdamsBashforth2; // integration method
|
||||||
|
|
||||||
|
writeFormat binary; // data writting format (ascii or binary)
|
||||||
|
|
||||||
|
timersReport Yes;
|
||||||
|
|
||||||
|
timersReportInterval 0.01;
|
@ -0,0 +1,60 @@
|
|||||||
|
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||||
|
| phasicFlow File |
|
||||||
|
| copyright: www.cemf.ir |
|
||||||
|
\* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
contactSearch
|
||||||
|
{
|
||||||
|
method NBS;
|
||||||
|
|
||||||
|
updateInterval 20;
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,15 @@
|
|||||||
|
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||||
|
| phasicFlow File |
|
||||||
|
| copyright: www.cemf.ir |
|
||||||
|
\* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
objectName shapes;
|
||||||
|
objectType dictionary;
|
||||||
|
fileFormat ASCII;
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
names (glassBead); // names of shapes
|
||||||
|
|
||||||
|
diameters (0.002); // diameter of shapes
|
||||||
|
|
||||||
|
materials (glassMat); // material names for shapes
|
7
benchmarks/rotatingDrum/rotatingDrum_8mParticles/cleanThisCase
Executable file
7
benchmarks/rotatingDrum/rotatingDrum_8mParticles/cleanThisCase
Executable file
@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
cd ${0%/*} || exit 1 # Run from this directory
|
||||||
|
|
||||||
|
ls | grep -P "^(([0-9]+\.?[0-9]*)|(\.[0-9]+))$" | xargs -d"\n" rm -rf
|
||||||
|
rm -rf VTK
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
21
benchmarks/rotatingDrum/rotatingDrum_8mParticles/runThisCase
Executable file
21
benchmarks/rotatingDrum/rotatingDrum_8mParticles/runThisCase
Executable file
@ -0,0 +1,21 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
cd ${0%/*} || exit 1 # Run from this directory
|
||||||
|
echo "\n<--------------------------------------------------------------------->"
|
||||||
|
echo "1) Creating particles"
|
||||||
|
echo "<--------------------------------------------------------------------->\n"
|
||||||
|
particlesPhasicFlow
|
||||||
|
|
||||||
|
echo "\n<--------------------------------------------------------------------->"
|
||||||
|
echo "2) Creating geometry"
|
||||||
|
echo "<--------------------------------------------------------------------->\n"
|
||||||
|
geometryPhasicFlow
|
||||||
|
|
||||||
|
echo "\n<--------------------------------------------------------------------->"
|
||||||
|
echo "3) Running the case"
|
||||||
|
echo "<--------------------------------------------------------------------->\n"
|
||||||
|
sphereGranFlow
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
@ -0,0 +1,50 @@
|
|||||||
|
/* -------------------------------*- 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
|
||||||
|
{
|
||||||
|
neighborListUpdateInterval 200;
|
||||||
|
|
||||||
|
updateInterval 20;
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,86 @@
|
|||||||
|
/* -------------------------------*- 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
|
||||||
|
{
|
||||||
|
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; // 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 60; // number of divisions
|
||||||
|
|
||||||
|
material wallMat; // material name of this wall
|
||||||
|
|
||||||
|
motion rotAxis; // motion component name
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
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; // 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
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,47 @@
|
|||||||
|
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||||
|
| phasicFlow File |
|
||||||
|
| copyright: www.cemf.ir |
|
||||||
|
\* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
selectors
|
||||||
|
{}
|
||||||
|
}
|
||||||
|
|
||||||
|
positionParticles
|
||||||
|
{
|
||||||
|
method ordered;
|
||||||
|
|
||||||
|
orderedInfo
|
||||||
|
{
|
||||||
|
distance 0.003; // minimum space between centers of particles
|
||||||
|
|
||||||
|
numPoints 6000000; // 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
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
/* -------------------------------*- C++ -*--------------------------------- *\
|
||||||
|
| phasicFlow File |
|
||||||
|
| copyright: www.cemf.ir |
|
||||||
|
\* ------------------------------------------------------------------------- */
|
||||||
|
objectName settingsDict;
|
||||||
|
objectType dictionary;
|
||||||
|
fileFormat ASCII;
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
run rotatingDrum_4mParticles;
|
||||||
|
|
||||||
|
dt 0.00001; // time step for integration (s)
|
||||||
|
|
||||||
|
startTime 0; // start time for simulation
|
||||||
|
|
||||||
|
endTime 4; // end time for simulation
|
||||||
|
|
||||||
|
saveInterval 0.2; // time interval for saving the simulation
|
||||||
|
|
||||||
|
timePrecision 5; // maximum number of digits for time folder
|
||||||
|
|
||||||
|
g (0 -9.8 0); // gravity vector (m/s2)
|
||||||
|
|
||||||
|
includeObjects (diameter); // save necessary (i.e., required) data on disk
|
||||||
|
|
||||||
|
// exclude unnecessary data from saving on disk
|
||||||
|
excludeObjects (rVelocity.dy1 pStructPosition.dy1 pStructVelocity.dy1);
|
||||||
|
|
||||||
|
integrationMethod AdamsBashforth2; // integration method
|
||||||
|
|
||||||
|
writeFormat binary; // data writting format (ascii or binary)
|
||||||
|
|
||||||
|
timersReport Yes;
|
||||||
|
|
||||||
|
timersReportInterval 0.01;
|
@ -1,59 +0,0 @@
|
|||||||
/* -------------------------------*- C++ -*--------------------------------- *\
|
|
||||||
| phasicFlow File |
|
|
||||||
| copyright: www.cemf.ir |
|
|
||||||
\* ------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
objectName interaction;
|
|
||||||
objectType dicrionary;
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
NBSInfo
|
|
||||||
{
|
|
||||||
updateFrequency 10; // each 20 timesteps, update neighbor list
|
|
||||||
sizeRatio 1.05; // bounding box size to particle diameter (max)
|
|
||||||
}
|
|
||||||
|
|
||||||
cellMappingInfo
|
|
||||||
{
|
|
||||||
updateFrequency 10; // each 20 timesteps, update neighbor list
|
|
||||||
cellExtent 0.6; // bounding box for particle-wall search (> 0.5)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
/* -------------------------------*- C++ -*--------------------------------- *\
|
|
||||||
| phasicFlow File |
|
|
||||||
| copyright: www.cemf.ir |
|
|
||||||
\* ------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
objectName particleInsertion;
|
|
||||||
objectType dicrionary;
|
|
||||||
|
|
||||||
|
|
||||||
active no; // is insertion active?
|
|
||||||
|
|
||||||
collisionCheck No; // not implemented for yes
|
|
||||||
|
|
||||||
|
|
@ -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
|
|
@ -1,63 +0,0 @@
|
|||||||
/* -------------------------------*- C++ -*--------------------------------- *\
|
|
||||||
| phasicFlow File |
|
|
||||||
| copyright: www.cemf.ir |
|
|
||||||
\* ------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
objectName geometryDict;
|
|
||||||
objectType dictionary;
|
|
||||||
|
|
||||||
motionModel rotatingAxisMotion;
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
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 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,44 +0,0 @@
|
|||||||
/* -------------------------------*- C++ -*--------------------------------- *\
|
|
||||||
| phasicFlow File |
|
|
||||||
| copyright: www.cemf.ir |
|
|
||||||
\* ------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
objectName particlesDict;
|
|
||||||
objectType dictionary;
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
selectors
|
|
||||||
{}
|
|
||||||
}
|
|
||||||
|
|
||||||
positionParticles
|
|
||||||
{
|
|
||||||
method positionOrdered;
|
|
||||||
|
|
||||||
maxNumberOfParticles 4000001;
|
|
||||||
mortonSorting Yes;
|
|
||||||
|
|
||||||
cylinder // box for positioning particles
|
|
||||||
{
|
|
||||||
p1 ( 0.0 0.0 0.01); // lower corner point of the box
|
|
||||||
p2 ( 0.0 0.0 1.59); // upper corner point of the box
|
|
||||||
radius 0.195;
|
|
||||||
}
|
|
||||||
|
|
||||||
positionOrderedInfo
|
|
||||||
{
|
|
||||||
diameter 0.003; // minimum space between centers of particles
|
|
||||||
numPoints 4000000; // number of particles in the simulation
|
|
||||||
axisOrder (z x y); // axis order for filling the space with particles
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,32 +0,0 @@
|
|||||||
/* -------------------------------*- C++ -*--------------------------------- *\
|
|
||||||
| phasicFlow File |
|
|
||||||
| copyright: www.cemf.ir |
|
|
||||||
\* ------------------------------------------------------------------------- */
|
|
||||||
objectName settingsDict;
|
|
||||||
objectType dictionary;;
|
|
||||||
|
|
||||||
run rotatingDrum_1;
|
|
||||||
|
|
||||||
dt 0.00001; // time step for integration (s)
|
|
||||||
|
|
||||||
startTime 0; // start time for simulation
|
|
||||||
|
|
||||||
endTime 10; // end time for simulation
|
|
||||||
|
|
||||||
saveInterval 0.2; // time interval for saving the simulation
|
|
||||||
|
|
||||||
timePrecision 5; // maximum number of digits for time folder
|
|
||||||
|
|
||||||
g (0 -9.8 0); // gravity vector (m/s2)
|
|
||||||
|
|
||||||
domain
|
|
||||||
{
|
|
||||||
min (-0.2 -0.2 -0.0);
|
|
||||||
max ( 0.2 0.2 1.6);
|
|
||||||
}
|
|
||||||
|
|
||||||
integrationMethod AdamsBashforth3; // integration method
|
|
||||||
|
|
||||||
timersReport Yes;
|
|
||||||
|
|
||||||
timersReportInterval 0.01;
|
|
@ -1,48 +1,89 @@
|
|||||||
PF_cFlags="--description --help --version"
|
PF_cFlags="--description --help --version"
|
||||||
AllTimeFolders=
|
AllTimeFolders=
|
||||||
__getAllTime(){
|
__getAllTime(){
|
||||||
files=( $(ls) )
|
# Initialize empty array for time folders
|
||||||
deleteFiles=(settings caseSetup cleanThisCase VTK runThisCase stl postprocess postProcess)
|
local time_folders=()
|
||||||
declare -A delk
|
|
||||||
for del in "${deleteFiles[@]}" ; do delk[$del]=1 ; done
|
# Loop through all directories in current folder
|
||||||
# Tag items to remove, based on
|
for dir in */; do
|
||||||
for k in "${!files[@]}" ; do
|
# Remove trailing slash
|
||||||
[ "${delk[${files[$k]}]-}" ] && unset 'files[k]'
|
dir=${dir%/}
|
||||||
done
|
|
||||||
# Compaction
|
# Check if directory name is a valid floating point number
|
||||||
COMPREPLY=("${files[@]}")
|
# This pattern matches integers and floating point numbers
|
||||||
AllTimeFolders="${files[@]}"
|
if [[ $dir =~ ^[0-9]+(\.[0-9]+)?$ ]]; then
|
||||||
|
time_folders+=("$dir")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Set completion reply to the time folders
|
||||||
|
COMPREPLY=("${time_folders[@]}")
|
||||||
|
AllTimeFolders="${time_folders[@]}"
|
||||||
}
|
}
|
||||||
|
|
||||||
__getFields(){
|
__getFields(){
|
||||||
__getAllTime
|
__getAllTime
|
||||||
local -A unique_files=()
|
local -A unique_files=()
|
||||||
|
# Files to exclude from suggestions
|
||||||
|
local exclude_files=("shapeHash" "pStructure" "particleInsertion" "p" "alpha" "U" "Sp" "Su" "phi")
|
||||||
|
declare -A exclude_dict
|
||||||
|
|
||||||
|
# Build exclude dictionary for faster lookups
|
||||||
|
for file in "${exclude_files[@]}"; do
|
||||||
|
exclude_dict["$file"]=1
|
||||||
|
done
|
||||||
|
|
||||||
for dir in $AllTimeFolders; do
|
for dir in $AllTimeFolders; do
|
||||||
# Check if the directory exists
|
# Skip if not a directory
|
||||||
if [ ! -d "$dir" ]; then
|
[ ! -d "$dir" ] && continue
|
||||||
continue # Skip to the next directory
|
|
||||||
fi
|
# Find all files in this time directory
|
||||||
|
while IFS= read -r filename; do
|
||||||
files_in_dir=$(find "$dir" -maxdepth 1 -type f -printf '%f\n' | sort -u)
|
# Skip empty lines and excluded files
|
||||||
|
[ -z "$filename" ] || [ "${exclude_dict[$filename]+exists}" ] && continue
|
||||||
# Add filenames to the associative array (duplicates will be overwritten)
|
|
||||||
while IFS= read -r filename; do
|
# Add to unique files
|
||||||
unique_files["$filename"]=1 # Just the key is important, value can be anything
|
unique_files["$filename"]=1
|
||||||
done <<< "$files_in_dir"
|
done < <(find "$dir" -maxdepth 1 -type f -printf '%f\n')
|
||||||
|
done
|
||||||
done
|
|
||||||
COMPREPLY=("${!unique_files[@]}")
|
# Set completion reply to the unique filenames
|
||||||
AllTimeFolders=
|
COMPREPLY=(${!unique_files[@]})
|
||||||
|
|
||||||
|
# Clear global variable
|
||||||
|
AllTimeFolders=
|
||||||
}
|
}
|
||||||
|
|
||||||
_pFlowToVTK(){
|
_pFlowToVTK(){
|
||||||
if [ "$3" == "--time" ] ; then
|
local cur="${COMP_WORDS[COMP_CWORD]}"
|
||||||
|
local prev="${COMP_WORDS[COMP_CWORD-1]}"
|
||||||
|
|
||||||
|
# Check if we're completing a field
|
||||||
|
local is_field=0
|
||||||
|
for ((i=1; i<COMP_CWORD; i++)); do
|
||||||
|
if [[ "${COMP_WORDS[i]}" == "--fields" ]]; then
|
||||||
|
is_field=1
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$prev" == "--time" ]; then
|
||||||
__getAllTime
|
__getAllTime
|
||||||
elif [ "$3" == "--fields" ]; then
|
elif [ "$prev" == "--fields" ] || [ $is_field -eq 1 ]; then
|
||||||
__getFields
|
# We're completing field names
|
||||||
|
__getFields
|
||||||
|
# Filter the results based on the current word prefix
|
||||||
|
if [ -n "$cur" ]; then
|
||||||
|
local filtered=()
|
||||||
|
for item in "${COMPREPLY[@]}"; do
|
||||||
|
if [[ "$item" == "$cur"* ]]; then
|
||||||
|
filtered+=("$item")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
COMPREPLY=("${filtered[@]}")
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
COMPREPLY=( $(compgen -W "$PF_cFlags --binary --no-geometry --no-particles --out-folder --time --separate-surfaces --fields" -- "$2") )
|
COMPREPLY=( $(compgen -W "$PF_cFlags --binary --no-geometry --no-particles --out-folder --time --separate-surfaces --fields" -- "$cur") )
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
complete -F _pFlowToVTK pFlowToVTK
|
complete -F _pFlowToVTK pFlowToVTK
|
||||||
|
54
cmake/preReq.cmake
Normal file
54
cmake/preReq.cmake
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
if(pFlow_STD_Parallel_Alg)
|
||||||
|
# Check if libtbb-dev is installed
|
||||||
|
execute_process(
|
||||||
|
COMMAND dpkg -s libtbb-dev
|
||||||
|
RESULT_VARIABLE TBB_IS_INSTALLED
|
||||||
|
OUTPUT_QUIET
|
||||||
|
ERROR_QUIET)
|
||||||
|
|
||||||
|
if(NOT TBB_IS_INSTALLED EQUAL 0)
|
||||||
|
message(STATUS "libtbb-dev not found. Installing libtbb-dev...")
|
||||||
|
execute_process(
|
||||||
|
COMMAND sudo apt-get update
|
||||||
|
COMMAND sudo apt-get install -y libtbb-dev
|
||||||
|
RESULT_VARIABLE TBB_INSTALL_RESULT)
|
||||||
|
|
||||||
|
if(NOT TBB_INSTALL_RESULT EQUAL 0)
|
||||||
|
message(FATAL_ERROR "Failed to install libtbb-dev")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
message(STATUS "libtbb-dev is already installed.")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
# Kokkos folder creation
|
||||||
|
set(Kokkos_Source_DIR $ENV{HOME}/Kokkos/kokkos)
|
||||||
|
|
||||||
|
if(NOT EXISTS "${Kokkos_Source_DIR}/CMakeLists.txt")
|
||||||
|
|
||||||
|
# Check CMake version and set policy CMP0169 if CMake version is 3.30 or higher
|
||||||
|
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.30")
|
||||||
|
cmake_policy(SET CMP0169 OLD)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include(FetchContent)
|
||||||
|
FetchContent_Declare(
|
||||||
|
kokkos
|
||||||
|
GIT_REPOSITORY https://github.com/kokkos/kokkos.git
|
||||||
|
GIT_TAG 4.4.01
|
||||||
|
)
|
||||||
|
|
||||||
|
FetchContent_GetProperties(kokkos)
|
||||||
|
if(NOT kokkos_POPULATED)
|
||||||
|
message(STATUS "Kokkos source directory not found. Downloading Kokkos version 4.4.1 ...")
|
||||||
|
FetchContent_Populate(kokkos)
|
||||||
|
set(Kokkos_Source_DIR ${kokkos_SOURCE_DIR})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
endif()
|
||||||
|
|
||||||
|
message(STATUS "Kokkos source directory is ${Kokkos_Source_DIR}")
|
||||||
|
add_subdirectory(${Kokkos_Source_DIR} ./kokkos)
|
||||||
|
#Kokkos_cmake_settings()
|
||||||
|
|
231
doc/mdDocs/codingStyle.md
Normal file
231
doc/mdDocs/codingStyle.md
Normal file
@ -0,0 +1,231 @@
|
|||||||
|
# PhasicFlow Coding Style Guidelines
|
||||||
|
This document outlines the coding style guidelines for the PhasicFlow codebase.
|
||||||
|
Adhering to these guidelines ensures consistency, readability, and maintainability of the project.
|
||||||
|
## 1. FormattingIndentation:
|
||||||
|
* Use 4 spaces for every logical level and block.
|
||||||
|
* Line Spacing: Leave two empty lines between sections (e.g., between functions in a .cpp file, between class members).
|
||||||
|
|
||||||
|
## 2. Naming ConventionsGeneral Naming:
|
||||||
|
* All names should start with lowercase letters, except for special names (e.g., Ergun, Hertz).
|
||||||
|
* Macro names start with Upper case or all the letters are in UPPER case.
|
||||||
|
* Compound Names: For compound names, the first word starts with a lowercase letter, and subsequent words start with an uppercase letter (e.g., boundaryBase, motionModel).
|
||||||
|
|
||||||
|
## 3. File Structure
|
||||||
|
* Header Files: Use the .hpp extension for header files.
|
||||||
|
* Source Files: Use the .cpp extension for source files.
|
||||||
|
* Header and Source File Headers: All header and source files must include a standardized header that describes the project's intention and licensing information.
|
||||||
|
* File Naming: Header and source file names should correspond to the class they contain. Aim for one class per file.
|
||||||
|
* Inline Functions: Place inline functions in a separate classNameI.hpp file to avoid cluttering the main header file.
|
||||||
|
|
||||||
|
## 4. Class DesignClass Member Order:
|
||||||
|
* Private members and methods
|
||||||
|
* Private static members and methods
|
||||||
|
* Public methods
|
||||||
|
* Public static methods
|
||||||
|
* Enumerations and Nested Classes: Declare enumerations and nested classes before all class members and methods.
|
||||||
|
* Special Functions: Each class must explicitly define all special functions:Constructor, Copy constructor and assignment operator, Move constructor and assignment operator
|
||||||
|
* Destructor: Each class must have an explicit destructor declaration:`~className() = default`; or `~className();`
|
||||||
|
* Interface classes or classes with virtual methods must have a virtual destructor.
|
||||||
|
* Virtual Method Overrides: When implementing a `virtual` method from a base class in a derived class, use the `override` keyword. The same applies to derived class destructors.
|
||||||
|
## 5. NamespacesOfficial Namespace:
|
||||||
|
The official namespace for the codebase is pFlow. All entities should be defined within this namespace.
|
||||||
|
|
||||||
|
### Example File Structure
|
||||||
|
```
|
||||||
|
src/
|
||||||
|
├── componentName1/
|
||||||
|
│ ├── componentName1.hpp
|
||||||
|
│ ├── componentName1.cpp
|
||||||
|
│ ├── componentName1I.hpp
|
||||||
|
│ └── ...
|
||||||
|
└── componentName2/
|
||||||
|
├── componentName2.hpp
|
||||||
|
├── componentName2.cpp
|
||||||
|
└── ...
|
||||||
|
```
|
||||||
|
### Example Class Structure
|
||||||
|
```C++
|
||||||
|
namespace pFlow
|
||||||
|
{
|
||||||
|
|
||||||
|
class MyClass
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum class MyEnum
|
||||||
|
{
|
||||||
|
Value1,
|
||||||
|
Value2
|
||||||
|
};
|
||||||
|
|
||||||
|
class NestedClass
|
||||||
|
{
|
||||||
|
// ...
|
||||||
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
|
int privateMember_;
|
||||||
|
|
||||||
|
void privateMethod();
|
||||||
|
|
||||||
|
|
||||||
|
static int privateStaticMember_;
|
||||||
|
|
||||||
|
static void privateStaticMethod();
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
MyClass();
|
||||||
|
|
||||||
|
MyClass(const MyClass& other);
|
||||||
|
|
||||||
|
MyClass(MyClass&& other);
|
||||||
|
|
||||||
|
MyClass& operator=(const MyClass& other);
|
||||||
|
|
||||||
|
MyClass& operator=(MyClass&& other);
|
||||||
|
|
||||||
|
~MyClass();
|
||||||
|
|
||||||
|
|
||||||
|
void publicMethod();
|
||||||
|
|
||||||
|
static void publicStaticMethod();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// assuming base class has virtual methods
|
||||||
|
class DerivedClass
|
||||||
|
:
|
||||||
|
public BaseClass
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
~DerivedClass() override;
|
||||||
|
|
||||||
|
void virtualMethod() override;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace pFlow
|
||||||
|
```
|
||||||
|
|
||||||
|
## 6. Doxygen Documentation
|
||||||
|
|
||||||
|
### 6.1. Ruls
|
||||||
|
provide the documentations in the header files only. In rare cases where you are generating documentations for executables, the doxygen documentation can be supplied in the .cpp file.
|
||||||
|
|
||||||
|
* **General Doxygen Style:**
|
||||||
|
|
||||||
|
* Use `///` for short documentations for methods and members.
|
||||||
|
|
||||||
|
* Use `/** */` for classes and main methods which play a significant role in the class or code.
|
||||||
|
|
||||||
|
* Place Doxygen comments *before* the declaration of the entity being documented (e.g., class, function, variable).
|
||||||
|
|
||||||
|
* Use `@param` to document function parameters, `@return` for return values, `@brief` for a short description, and `@details` for a more in-depth explanation.
|
||||||
|
|
||||||
|
* Use Markdown syntax within Doxygen comments for formatting.
|
||||||
|
|
||||||
|
* **File Headers:** Each file should contain a Doxygen comment at the top, including:
|
||||||
|
|
||||||
|
* `@file` : The name of the file.
|
||||||
|
|
||||||
|
* `@brief`: A brief description of the file's purpose.
|
||||||
|
|
||||||
|
* `@author`: The author(s) of the file.
|
||||||
|
|
||||||
|
* `@date` : The date of creation or last modification.
|
||||||
|
|
||||||
|
* **Class Documentation:**
|
||||||
|
|
||||||
|
* Use `/** */` for class documentation.
|
||||||
|
|
||||||
|
* Provide a `@brief` description of the class.
|
||||||
|
|
||||||
|
* Use `@tparam` to document template parameters.
|
||||||
|
|
||||||
|
* Document the purpose of the class, its invariants, and how it should be used.
|
||||||
|
|
||||||
|
* **Function/Method Documentation:**
|
||||||
|
|
||||||
|
* Use `///` for short documentations.
|
||||||
|
|
||||||
|
* Use `/** */` for main methods which play a significant role.
|
||||||
|
|
||||||
|
* Provide a `@brief` description of the function.
|
||||||
|
|
||||||
|
* Use `@param` to describe each parameter, including its purpose and whether it is an input, output, or input/output parameter.
|
||||||
|
|
||||||
|
* Use `@return` to describe the return value, including its meaning and possible values.
|
||||||
|
|
||||||
|
* Use `@pre` to document any preconditions that must be met before calling the function.
|
||||||
|
|
||||||
|
* Use `@post` to document any postconditions that will be true after the function returns.
|
||||||
|
|
||||||
|
* Use `@throws` to document any exceptions that the function may throw.
|
||||||
|
|
||||||
|
* Use `@details` for a more detailed explanation of the function's behavior, algorithms, or any other relevant information.
|
||||||
|
|
||||||
|
* **Variable Documentation:**
|
||||||
|
|
||||||
|
* Use `///<` for single-line documentation of variables.
|
||||||
|
|
||||||
|
### 6.2. Doxygen Documentation Examples
|
||||||
|
|
||||||
|
* **Class example**
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
/**
|
||||||
|
* @brief Represents a particle in the simulation.
|
||||||
|
* @details This class stores the position, velocity, and other physical
|
||||||
|
* properties of a particle.
|
||||||
|
*/
|
||||||
|
class Particle
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
Point position_; ///< The current position of the particle.
|
||||||
|
|
||||||
|
Vector velocity_; ///< The current velocity of the particle.
|
||||||
|
|
||||||
|
double mass_; ///< The mass of the particle.
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/// Constructs a particle with default values.
|
||||||
|
Particle();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Updates the position of the particle based on its velocity
|
||||||
|
* and the given time step.
|
||||||
|
* @param deltaTime The time elapsed since the last update, in seconds.
|
||||||
|
*/
|
||||||
|
void updatePosition(const timeInfo& ti );
|
||||||
|
|
||||||
|
/// Gets the current position of the particle.
|
||||||
|
Point getPosition() const;
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
* **Function Example**
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
/**
|
||||||
|
* @brief Calculates the distance between two points.
|
||||||
|
* @param p1 The first point.
|
||||||
|
* @param p2 The second point.
|
||||||
|
* @return The distance between the two points.
|
||||||
|
*/
|
||||||
|
double calculateDistance(const Point& p1, const Point& p2)
|
||||||
|
{
|
||||||
|
// Implementation
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns the velocity of the particle.
|
||||||
|
Vector getVelocity() const
|
||||||
|
{
|
||||||
|
return velocity_;
|
||||||
|
}
|
||||||
|
```
|
136
doc/mdDocs/howToBuild-V1.0.md
Normal file
136
doc/mdDocs/howToBuild-V1.0.md
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
# How to build PhasicFlow-v-1.0
|
||||||
|
|
||||||
|
You can build PhasicFlow for CPU or GPU. You can have a single build or oven multiple builds on a machine. Here you learn how to have a single build of PhasicFlow, in various modes of execution. You can install PhasicFlow-v-1.0 on **Ubuntu-22.04 LTS** and **Ubuntu-24.04 LTS**. Installing it on older versions of Ubuntu needs some additional steps to meet the requirements which are not covered here.
|
||||||
|
|
||||||
|
If you want to install PhasicFlow on **Windows OS**, just see [this page](https://www.cemf.ir/installing-phasicflow-v-1-0-on-ubuntu/) for more information.
|
||||||
|
|
||||||
|
# Required packages
|
||||||
|
|
||||||
|
You need a list of packages installed on your computer before building PhasicFlow:
|
||||||
|
|
||||||
|
* git, for cloning the code and package management
|
||||||
|
* g++, for compiling the code
|
||||||
|
* cmake, for generating build system
|
||||||
|
* Cuda-12.x or above (if GPU is targeted), for compiling the code for CUDA execution.
|
||||||
|
|
||||||
|
### Installing packages
|
||||||
|
|
||||||
|
Execute the following commands to install the required packages (Except Cuda). tbb is installed automatically.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install -y git g++ cmake cmake-qt-gui
|
||||||
|
```
|
||||||
|
|
||||||
|
### Installing Cuda for GPU execution
|
||||||
|
|
||||||
|
If you want to build PhasicFlow to be executed on an nvidia-GPU, you need to install the latest version of Cuda compiler (Version 12.x or above), which is compatible with your hardware and OS, on your computer.
|
||||||
|
|
||||||
|
# How to build?
|
||||||
|
|
||||||
|
Here you will learn how to build PhasicFlow for single execution mode. Follow the steps below to install it on your computer.
|
||||||
|
Tested operating systems are:
|
||||||
|
* Ubuntu-22.04 LTS
|
||||||
|
* Ubuntu-24.04 LTS
|
||||||
|
|
||||||
|
### Step 1: Package check
|
||||||
|
Make sure that you have installed all the required packages on your computer. See above for more information.
|
||||||
|
|
||||||
|
|
||||||
|
### Step 2: Cloning PhasicFlow
|
||||||
|
Create the PhasicFlow folder in your home folder and then clone the source code into that folder:
|
||||||
|
```bash
|
||||||
|
cd ~
|
||||||
|
mkdir PhasicFlow
|
||||||
|
cd PhasicFlow
|
||||||
|
git clone https://github.com/PhasicFlow/phasicFlow.git
|
||||||
|
mv phasicFlow phasicFlow-v-1.0
|
||||||
|
```
|
||||||
|
### Step 3: Environmental variables
|
||||||
|
Opne the bashrc file using the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ gedit ~/.bashrc
|
||||||
|
```
|
||||||
|
|
||||||
|
and add the following line to the end of the file, **save** and **close** it.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
source $HOME/PhasicFlow/phasicFlow-v-1.0/cmake/bashrc
|
||||||
|
```
|
||||||
|
|
||||||
|
this will introduce a new source file for setting the environmental variables of PhasicFlow. If you want to load these variables in the current open terminal, you need to source it. Or, simply **close the terminal** and **open a new terminal**.
|
||||||
|
|
||||||
|
### Step 4: Building PhasicFlow
|
||||||
|
Follow one of the followings to build PhasicFlow for one mode of execution.
|
||||||
|
|
||||||
|
#### Serial build for CPU
|
||||||
|
In a **new terminal** enter the following commands:
|
||||||
|
```bash
|
||||||
|
cd ~/PhasicFlow/phasicFlow-v-1.0
|
||||||
|
mkdir build
|
||||||
|
cd build
|
||||||
|
cmake ../ -DpFlow_Build_Serial=On -DCMAKE_BUILD_TYPE=Release
|
||||||
|
make install -j4
|
||||||
|
```
|
||||||
|
For faster builds, use `make install -j`. This will use all the CPU cores on your computer for building.
|
||||||
|
|
||||||
|
#### OpenMP build for CPU
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ~/PhasicFlow/phasicFlow-v-1.0
|
||||||
|
mkdir build
|
||||||
|
cd build
|
||||||
|
cmake ../ -DpFlow_Build_OpenMP=On -DCMAKE_BUILD_TYPE=Release
|
||||||
|
make install -j4
|
||||||
|
```
|
||||||
|
|
||||||
|
#### GPU build for parallel execution on CUDA-enabled GPUs
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ~/PhasicFlow/phasicFlow-v-1.0
|
||||||
|
mkdir build
|
||||||
|
cd build
|
||||||
|
cmake ../ -DpFlow_Build_Cuda=On -DCMAKE_BUILD_TYPE=Release
|
||||||
|
cmake ../ -DpFlow_Build_Cuda=On -DCMAKE_BUILD_TYPE=Release
|
||||||
|
make install -j4
|
||||||
|
```
|
||||||
|
|
||||||
|
After building, `bin`, `include`, and `lib` folders will be created in `~/PhasicFlow/phasicFlow-v-1.0/` folder. Now you are ready to use PhasicFlow.
|
||||||
|
|
||||||
|
**note 1**: When compiling the code in parallel, you need to have enough RAM on your computer. As a rule, you need 1 GB free RAM per each processor on your computer for compiling in parallel.
|
||||||
|
You may want to use fewer number of cores on your computer by using the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make install -j3
|
||||||
|
```
|
||||||
|
|
||||||
|
the above command only uses 3 cores for compiling.
|
||||||
|
|
||||||
|
**note 2**: By default PhasicFlow is compiled with **double** as floating point variable. You can compile it with **float**. Just in the command line of camke added `-DpFlow_Build_Double=Off` flag to compile it with float. For example if you are building for cuda, you can enter the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cmake ../ -DpFlow_Build_Cuda=On -DpFlow_Build_Double=Off
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 5: Testing
|
||||||
|
|
||||||
|
In the current terminal or a new terminal enter the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
checkPhasicFlow
|
||||||
|
```
|
||||||
|
|
||||||
|
This command shows the host and device environments and software version. If PhasicFlow was build correctly, you would get the following output:
|
||||||
|
|
||||||
|
```
|
||||||
|
Initializing host/device execution spaces . . .
|
||||||
|
Host execution space is Serial
|
||||||
|
Device execution space is Serial
|
||||||
|
|
||||||
|
You are using phasicFlow v-1.0 (copyright(C): www.cemf.ir)
|
||||||
|
In this build, double is used for floating point operations and uint32for indexing.
|
||||||
|
This is not a build for MPI execution
|
||||||
|
|
||||||
|
Finalizing host/device execution space ....
|
||||||
|
```
|
@ -1,151 +0,0 @@
|
|||||||
# How to build PhasicFlow {#howToBuildPhasicFlow}
|
|
||||||
|
|
||||||
You can build PhasicFlow for CPU or GPU. You can have a single build or oven multiple builds on a machine. Here you learn how to have a single build of PhasicFlow, in various modes of execution.
|
|
||||||
|
|
||||||
# Required packages
|
|
||||||
You need a list of packaged installed on your computer before building PhasicFlow:
|
|
||||||
* git, for cloning the code and package management
|
|
||||||
* g++, for compiling the code
|
|
||||||
* cmake, for generating build system
|
|
||||||
* tbb, a parallel library for STL algorithms
|
|
||||||
* Cuda (if GPU is targeted), for compiling the code for CUDA execution.
|
|
||||||
* Kokkos, the parallelization backend of PhasicFlow
|
|
||||||
|
|
||||||
### git
|
|
||||||
if git is not installed on your computer, enter the following commands
|
|
||||||
```
|
|
||||||
$ sudo apt update
|
|
||||||
$ sudo apt install git
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
### g++ (C++ compiler)
|
|
||||||
The code is tested with g++ (gnu C++ compiler). The default version of g++ on Ubuntu 18.04 LTS or upper is sufficient for compiling. If it is not installed on your operating system, enter the following command:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ sudo apt update
|
|
||||||
$ sudo apt install g++
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
### CMake
|
|
||||||
You also need to have CMake-3.22 or higher installed on your computer.
|
|
||||||
```
|
|
||||||
$ sudo apt update
|
|
||||||
$ sudo apt install cmake
|
|
||||||
```
|
|
||||||
|
|
||||||
### tbb (2020.1-2 or higher)
|
|
||||||
For **Ubuntu 20.04 LTS or higher versions**, you can install tbb using apt. For now, some parallel algorithms on host side rely on tbb parallel library (C++ parallel backend). Use e following commands to install it:
|
|
||||||
```
|
|
||||||
$ sudo apt update
|
|
||||||
$ sudo apt install libtbb-dev
|
|
||||||
```
|
|
||||||
If you are compiling on **Ubuntu-18.04 LTS**, you need to enter the following commands to get the right version (2020.1-2 or higher) of tbb:
|
|
||||||
```
|
|
||||||
$ wget "http://archive.ubuntu.com/ubuntu/pool/universe/t/tbb/libtbb2_2020.1-2_amd64.deb"
|
|
||||||
$ sudo dpkg --install libtbb2_2020.1-2_amd64.deb
|
|
||||||
$ wget "http://archive.ubuntu.com/ubuntu/pool/universe/t/tbb/libtbb-dev_2020.1-2_amd64.deb"
|
|
||||||
$ sudo dpkg --install libtbb-dev_2020.1-2_amd64.deb
|
|
||||||
```
|
|
||||||
### Cuda
|
|
||||||
If you want to build PhasicFlow to be executed on an nvidia-GPU, you need to install the latest version of Cuda compiler, which is compatible with your hardware and OS, on your computer.
|
|
||||||
|
|
||||||
# How to build?
|
|
||||||
Here you will learn how to build PhasicFlow for single execution mode. Follow the steps below to install it on your computer.
|
|
||||||
Tested operating systems are:
|
|
||||||
* Ubuntu 18.04 LTS
|
|
||||||
* Ubuntu 20.04 LTS
|
|
||||||
* Ubuntu 22.04 LTS
|
|
||||||
|
|
||||||
### Step 1: Package check
|
|
||||||
Make sure that you have installed all the required packages on your computer. See above for more information.
|
|
||||||
|
|
||||||
### Step 2: Cloning Kokkos
|
|
||||||
It is assumed that Kokkos source is located in the home folder of your computer. Clone the latest version of Kokkos into your home folder:
|
|
||||||
```
|
|
||||||
$ cd ~
|
|
||||||
$ mkdir Kokkos
|
|
||||||
$ cd Kokkos
|
|
||||||
$ git clone https://github.com/kokkos/kokkos.git
|
|
||||||
```
|
|
||||||
or simply download and extract the source code of Kokkos in `~/Kokkos` folder. In the end, the top level CMakeLists.txt file should be located in `~/Kokkos/kokkos` folder.
|
|
||||||
|
|
||||||
### Step 3: Cloning PhasicFlow
|
|
||||||
Create the PhasicFlow folder in your home folder and then clone the source code into that folder:
|
|
||||||
```
|
|
||||||
$ cd ~
|
|
||||||
$ mkdir PhasicFlow
|
|
||||||
$ cd PhasicFlow
|
|
||||||
$ git clone https://github.com/PhasicFlow/phasicFlow.git
|
|
||||||
```
|
|
||||||
### Step 4: Environmental variables
|
|
||||||
Opne the bashrc file using the following command:
|
|
||||||
|
|
||||||
`$ gedit ~/.bashrc`
|
|
||||||
|
|
||||||
and add the following line to the end of the file, **save** and **close** it.
|
|
||||||
|
|
||||||
`source $HOME/PhasicFlow/phasicFlow/cmake/bashrc`
|
|
||||||
|
|
||||||
this will introduce a new source file for setting the environmental variables of PhasicFlow. If you want to load these variables in the current open terminal, you need to source it. Or, simply **close the terminal** and **open a new terminal**.
|
|
||||||
|
|
||||||
### Step 5: Building PhasicFlow
|
|
||||||
Follow one of the followings to build PhasicFlow for one mode of execution.
|
|
||||||
#### Serial build for CPU
|
|
||||||
In a **new terminal** enter the following commands:
|
|
||||||
```
|
|
||||||
$ cd ~/PhasicFlow/phasicFlow
|
|
||||||
$ mkdir build
|
|
||||||
$ cd build
|
|
||||||
$ cmake ../ -DpFlow_Build_Serial=On
|
|
||||||
$ make install
|
|
||||||
```
|
|
||||||
For faster builds, use `make install -j`. This will use all the CPU cores on your computer for building.
|
|
||||||
#### OpenMP build for CPU
|
|
||||||
```
|
|
||||||
$ cd ~/PhasicFlow/phasicFlow
|
|
||||||
$ mkdir build
|
|
||||||
$ cd build
|
|
||||||
$ cmake ../ -DpFlow_Build_OpenMP=On
|
|
||||||
$ make install
|
|
||||||
```
|
|
||||||
#### GPU build for parallel execution on CUDA-enabled GPUs
|
|
||||||
```
|
|
||||||
$ cd ~/PhasicFlow/phasicFlow
|
|
||||||
$ mkdir build
|
|
||||||
$ cd build
|
|
||||||
$ cmake ../ -DpFlow_Build_Cuda=On
|
|
||||||
$ make install
|
|
||||||
```
|
|
||||||
|
|
||||||
After building, `bin`, `include`, and `lib` folders will be created in `~/PhasicFlow/phasicFlow/` folder. Now you are ready to use PhasicFlow.
|
|
||||||
|
|
||||||
**note 1**: When compiling the code in parallel, you need to have enough RAM on your computer. As a rule, you need 1 GB free RAM per each processor in your computer for compiling in parallel.
|
|
||||||
You may want to use fewer number of cores on your computer by using the following command:
|
|
||||||
|
|
||||||
`$ make install -j 3`
|
|
||||||
|
|
||||||
the above command only uses 3 cores for compiling.
|
|
||||||
|
|
||||||
**note 2**: By default PhasicFlow is compiled with **double** as floating point variable. You can compile it with **float**. Just in the command line of camke added `-DpFlow_Build_Double=Off` flag to compile it with float. For example if you are building for cuda, you can enter the following command:
|
|
||||||
|
|
||||||
`$ cmake ../ -DpFlow_Build_Cuda=On -DpFlow_Build_Double=Off`
|
|
||||||
|
|
||||||
### Step 6: Testing
|
|
||||||
In the current terminal or a new terminal enter the following command:
|
|
||||||
|
|
||||||
`$ checkPhasicFlow`
|
|
||||||
|
|
||||||
This command shows the host and device environments and software version. If PhasicFlow was build correctly, you would get the following output:
|
|
||||||
```
|
|
||||||
Initializing host/device execution spaces . . .
|
|
||||||
Host execution space is Serial
|
|
||||||
Device execution space is Cuda
|
|
||||||
|
|
||||||
ou are using phasicFlow v-0.1 (copyright(C): www.cemf.ir)
|
|
||||||
In this build, double is used for floating point operations.
|
|
||||||
|
|
||||||
|
|
||||||
Finalizing host/device execution space ....
|
|
||||||
```
|
|
@ -1,64 +1,116 @@
|
|||||||
# PhasicFlow Features {#phasicFlowFeatures}
|
# PhasicFlow Features (v-1.0)
|
||||||
|
|
||||||
|
The features of PhasicFlow described here are the main features that are implemented in the code for version 1.0. This document is not a complete list of all the features of PhasicFlow. The features are being added to the code continuously and this document may be behind the latest updates. Of course, the code review will give you the complete list.
|
||||||
|
|
||||||
|
## Table of Contents
|
||||||
|
|
||||||
|
- [1. Building options](#1-building-options)
|
||||||
|
- [2. Preprocessing tools](#2-preprocessing-tools)
|
||||||
|
- [3. Solvers for simulations](#3-solvers-for-simulations)
|
||||||
|
- [4. Postprocessing tools](#4-postprocessing-tools)
|
||||||
|
- [5. Models and features for simulations](#5-models-and-features-for-simulations)
|
||||||
|
- [5.1. General representation of walls](#51-general-representation-of-walls)
|
||||||
|
- [5.2. High precision integeration methods](#52-high-precision-integeration-methods)
|
||||||
|
- [5.3. Contact force models](#53-contact-force-models-needs-improvement)
|
||||||
|
- [5.4. Particle insertion](#54-particle-insertion)
|
||||||
|
- [5.5. Restarting/resuming a simulation](#55-restartingresuming-a-simulation)
|
||||||
|
- [5.6. Postprocessing data during simulation](#56-postprocessing-data-during-simulation)
|
||||||
|
|
||||||
|
## 1. Building options
|
||||||
|
|
||||||
|
You can build PhasicFlow to be executed on multi-core CPUs or GPUs. It is also possible to select the type of floating point variables in PhasicFlow: double or float. float type requires less memory and mostly consumes less time of a processor to complete a mathematical operation. So, there is a benefit for using floats in DEM simulation specially when GPU is targeted for computations.
|
||||||
|
|
||||||
## Building options
|
|
||||||
You can build PhasicFlow to be executed on multi-core CPUs or GPUs. It is also possible to select the type of floating point variables in PhasicFlow: double or float. float type requires less memory and mostly consumes less time of a processor to complete a mathematical operation. So, there is a benefit for using floats in DEM simulation specially when GPU is targeted for computations.
|
|
||||||
Build options for PhasicFlow:
|
Build options for PhasicFlow:
|
||||||
* **serial (double or float type)**: execution on one cpu core
|
|
||||||
* **OpenMp (double or float type)**: execution on multiple cores of a CPU
|
|
||||||
* **cuda (double or float type)**: execution on cuda-enabled GPUs
|
|
||||||
|
|
||||||
|
- **serial (double or float type)**: execution on one cpu core
|
||||||
|
- **OpenMp (double or float type)**: execution on multiple cores of a CPU
|
||||||
|
- **cuda (double or float type)**: execution on cuda-enabled GPUs
|
||||||
|
|
||||||
|
for more information on building PhasicFlow, please refer to the [installation guide](./howToBuild-V1.0.md).
|
||||||
|
|
||||||
## Preprocessing tools
|
## 2. Preprocessing tools
|
||||||
Preprocessing tools are used to facilitate the process of case setup. They include tools for defining initial state of particles and geometry conversion.
|
|
||||||
* **particlesPhasicFlow** tool can be used to define the initial position of particles (for example at t = 0 s) and to set the initial field values for particles (like velocity, orientation, acceleration and etc).
|
|
||||||
* **geometryPhasicFlow** converts user inputs for walls into a data structures that is used by PhasicFlow.
|
|
||||||
|
|
||||||
|
PhasicFlow provides a set of tools for preprocessing the simulation case. These tools are used to define the initial state of particles, walls and other parameters that are required for running a simulation.
|
||||||
|
|
||||||
|
- [**particlesPhasicFlow**](./../../utilities/particlesPhasicFlow/) tool can be used to define the initial position of particles (for example at t = 0 s) and to set the initial field values for particles (like velocity, orientation, acceleration, etc.).
|
||||||
|
|
||||||
## Models and features for simulations
|
- [**geometryPhasicFlow**](./../../utilities/geometryPhasicFlow/) converts user inputs for walls into a data structure that is used by PhasicFlow.
|
||||||
|
|
||||||
|
## 3. Solvers for simulations
|
||||||
|
|
||||||
### General representation of walls
|
- [**sphereGranFlow**](./../../solvers/sphereGranFlow/) is a solver for simulating the flow of spherical particles with particle insertion mechanism. A full set of tutorial on various possible simulations can be found here: [sphereGranFlow tutorial](./../../tutorials/sphereGranFlow/).
|
||||||
|
- [**grainGranFlow**](./../../solvers/grainGranFlow/) is a solver for simulating the flow of course-grained particles with particle insertion mechanism. A full set of tutorial on various possible simulations can be found here: [grainGranFlow tutorial](./../../tutorials/grainGranFlow/).
|
||||||
|
- [**iterateGeometry**](./../../solvers/iterateGeometry/) is a solver testing motion of walls without simulating particles. Since simulating with particles may take a long time and we may want to check the motion of geometry to be correct before actual simulation, we created this utility to test the motion of walls. A set of tutorial on various possible simulations can be found here: [iterateGeometry tutorial](./../../tutorials/iterateGeometry/).
|
||||||
|
|
||||||
|
## 4. Postprocessing tools
|
||||||
|
|
||||||
|
- [**pFlowToVTK**](./../../utilities/pFlowToVTK) is used to convert simulation results into vtk file format. vtk file format can be read by Paraview for visualizing the results.
|
||||||
|
- [**postprocessPhasicFlow**](./../../utilities/postprocessPhasicFlow/) is a tool for performing various averaging and summation on the fields. Particle probing is also possible.
|
||||||
|
|
||||||
|
## 5. Models and features for simulations
|
||||||
|
|
||||||
|
### 5.1. General representation of walls
|
||||||
|
|
||||||
Walls can be defined in three ways in PhasicFlow:
|
Walls can be defined in three ways in PhasicFlow:
|
||||||
* **Builtin walls** in PhasicFlow that include plane wall, cylinder/cone wall, cuboid, circle.
|
|
||||||
* **stl wall** that reads the data of the wall from an ASCII stl file.
|
|
||||||
* **foamPatch wall** that reads the OpenFOAM mesh and converts the boundary patches into PhasicFlow walls (this feature is only available when performing CFD-DEM simulation using OpenFOAM).
|
|
||||||
|
|
||||||
Walls can be fixed or in motion during simulations. Various motion models are implemented to cover most of the wall motions in phasicFlow ([see the source code] (./../../../src/MotionModel/)):
|
- **Builtin walls** in PhasicFlow that include plane wall, cylinder/cone wall, cuboid, circle.
|
||||||
* **fixedWall** model, in which all walls are fixed. This model is mostly useful for granular flow under gravity or gas-solid flows (CFD-DEM).
|
- **stl wall** that reads the data of the wall from an ASCII stl file.
|
||||||
* **rotatingAxisMotion** model, in which walls are rotating around an axis of rotation with specified rotation speed. This model covers a wide range of granular flows in which the whole or a part of geometry is rotating, like mixers.
|
- **foamPatch wall** that reads the OpenFOAM mesh and converts the boundary patches into PhasicFlow walls (this feature is only available when performing CFD-DEM simulation using OpenFOAM).
|
||||||
* **multiRotatingAxisMotion** model, in which a combination of rotations can be specified. One axis of rotation can itself have another axis of rotation, and so on. This creates the possibility of defining very complex motion pattern for walls, like what we see in Nauta blenders.
|
|
||||||
* **vibratingMotion** model, in which walls vibrates based on a sinusoidal model with specified frequency and amplitude.
|
|
||||||
In addition to these models, the user can add other motion models to the code based on their need.
|
|
||||||
|
|
||||||
|
Walls can be fixed or in motion during simulations. Various motion models are implemented to cover most of the wall motions in phasicFlow ([see the source code](./../../src/MotionModel/)):
|
||||||
|
|
||||||
|
- **stationay** model, in which all walls are fixed. This model is mostly useful for granular flow under gravity or gas-solid flows (CFD-DEM).
|
||||||
|
- **rotatingAxis** model, in which walls are rotating around an axis of rotation with specified rotation speed. This model covers a wide range of granular flows in which the whole or a part of geometry is rotating, like mixers.
|
||||||
|
- **multiRotatingAxis** model, in which a combination of rotations can be specified. One axis of rotation can itself have another axis of rotation, and so on. This creates the possibility of defining very complex motion pattern for walls, like what we see in Nauta blenders.
|
||||||
|
- **vibrating** model, in which walls vibrates based on a sinusoidal model with specified frequency and amplitude.
|
||||||
|
In addition to these models, the user can add other motion models to the code based on their need.
|
||||||
|
|
||||||
|
### 5.2. High precision integeration methods
|
||||||
|
|
||||||
|
The precision of integration in a DEM simulation is very important. Since sudden changes in the interaction forces occur during simulations (when objects contact or when they rebound). High precision integration methods makes it possible to accurately track position and velocity of objects (specially when they are in contact). When using these methods, it is possible to choose larger time steps for integration without loosing accuracy and causing instability in the simulation. Although a high-precision integration requires more computations, but the benefits of choosing larger time steps in simulation can totally compensate it.
|
||||||
|
|
||||||
### High precision integeration methods
|
|
||||||
The precision of integration in a DEM simulation is very important. Since sudden changes in the interaction forces occur during simulations (when objects contact or when they rebound). High precision integration methods makes it possible to accurately track position and velocity of objects (specially when they are in contact). When using these methods, it is possible to choose larger time steps for integration without loosing accuracy and causing instability in the simulation. Although a high-precision integration requires more computations, but the benefits of choosing larger time steps in simulation can totally compensate it.
|
|
||||||
Various integration methods are implemented in PhasicFlow:
|
Various integration methods are implemented in PhasicFlow:
|
||||||
|
|
||||||
| Integration Method | Order | Type|
|
|Integration Method | Order | Type|
|
||||||
| :--- | :---: | :---: |
|
| :--- | :---: | :---: |
|
||||||
| AdamsBashforth2 | 2 | one-step |
|
| AdamsBashforth2 | 2 | one-step |
|
||||||
| AdamsBashforth3 | 3 | one-step |
|
| AdamsBashforth3 | 3 | one-step |
|
||||||
| AdamsBashforth4 | 4 | one-step |
|
| AdamsBashforth4 | 4 | one-step |
|
||||||
| AdamsBashforth5 | 5 | one-step |
|
| AdamsBashforth5 | 5 | one-step |
|
||||||
| AdamsMoulton3 | 3 | predictor-corrector |
|
| AdamsMoulton3 | 3 | predictor-corrector (not active)|
|
||||||
| AdamsMoulton4 | 4 | predictor-corrector |
|
| AdamsMoulton4 | 4 | predictor-corrector (not active)|
|
||||||
| AdamsMoulton5 | 5 | predictor-corrector |
|
| AdamsMoulton5 | 5 | predictor-corrector (not active)|
|
||||||
|
|
||||||
|
### 5.3. Contact force models (needs improvement)
|
||||||
|
|
||||||
### Contact force models
|
Linear and non-linear visco-elastic contact force models are considered in the simulation. In addition to these, limited and non-limited Coulomb's friction model can be used to account for the friction between objects. For spherical objects, rolling friction can also be specified between bodies in contact.
|
||||||
Linear and non-linear visco-elastic contact force models are considered in the simulation. In addition to these, limited and non-limited Coulomb's friction model can be used to account for the friction between objects. For spherical objects, rolling friction can also be specified between bodies in contact.
|
In addition, for course-grained particles simulation, we developed a speciall set of***
|
||||||
|
|
||||||
### Particle insertion
|
### 5.4. Particle insertion
|
||||||
Particles can be inserted during simulation from specified region at specified rate and time interval. Any number of insertion regions can be defined in a simulation. Various region types are considered here: box, cylinder and sphere. Particles are inserted into the simulation through the specified region.
|
|
||||||
|
|
||||||
### restarting/resuming a simulation
|
Particles can be inserted during simulation from specified region at specified rate and time interval. Any number of insertion regions can be defined in a simulation. Various region types are considered here: `box`, `cylinder` and `sphere`. Particles are inserted into the simulation through the specified region.
|
||||||
It is possible to resume a simulation fron any time-folder that is avaiable in the simulation case setup directory. PhasicFlow restart the simulation from that time folder.
|
|
||||||
|
|
||||||
## Postprocessing tools
|
### 5.5. restarting/resuming a simulation
|
||||||
|
|
||||||
* **pFlowToVTK** is used to convert simulation results into vtk file format. vtk file format can be read by Paraview for visualizing the results.
|
It is possible to resume a simulation from any time-folder that is available in the simulation case setup directory. PhasicFlow restarts the simulation from that time folder.
|
||||||
* **postprocessPhasicFlow** is a tool for performing various cell-based averaging on the fields.
|
|
||||||
|
### 5.6. Postprocessing data during simulation
|
||||||
|
|
||||||
|
PhasicFlow provides a powerful in-simulation postprocessing module that allows users to analyze particle data in real-time while the simulation is running. This feature enables:
|
||||||
|
|
||||||
|
- **Real-time data analysis** without waiting for simulation completion
|
||||||
|
- **Region-based processing** in spheres, along lines, or at specific points
|
||||||
|
- **Various statistical operations** including weighted averages and sums of particle properties
|
||||||
|
- **Individual particle tracking** to monitor specific particles throughout simulation
|
||||||
|
- **Multiple processing methods** including arithmetic mean, uniform distribution, and Gaussian distribution
|
||||||
|
- **Particle filtering** based on properties like diameter, mass, etc.
|
||||||
|
- **Flexible time control** options for when postprocessing should be executed
|
||||||
|
|
||||||
|
To activate in-simulation postprocessing, users need to:
|
||||||
|
|
||||||
|
1. Create a `postprocessDataDict` file in the `settings` directory with appropriate configurations
|
||||||
|
2. Add `libs ("libPostprocessData.so")` and `auxFunctions postprocessData` to the `settings/settingsDict` file
|
||||||
|
|
||||||
|
Results are written to output files in the case directory with timestamps, allowing users to monitor simulation behavior as it progresses without interrupting the simulation. for more information on how to use this feature, please refer to the [PostprocessData](./../../src/PostprocessData/) module.
|
||||||
|
|
||||||
|
The same postprocessing module can also be used after simulation completion through the [`postprocessPhasicFlow`](./../../utilities/postprocessPhasicFlow/) utility.
|
||||||
|
@ -13,3 +13,5 @@ add_subdirectory(Interaction)
|
|||||||
|
|
||||||
add_subdirectory(MotionModel)
|
add_subdirectory(MotionModel)
|
||||||
|
|
||||||
|
add_subdirectory(PostprocessData)
|
||||||
|
|
||||||
|
@ -21,7 +21,6 @@ Licence:
|
|||||||
template<typename MotionModel>
|
template<typename MotionModel>
|
||||||
bool pFlow::geometryMotion<MotionModel>::findMotionIndex()
|
bool pFlow::geometryMotion<MotionModel>::findMotionIndex()
|
||||||
{
|
{
|
||||||
|
|
||||||
if(motionComponentName().size() != numSurfaces() )
|
if(motionComponentName().size() != numSurfaces() )
|
||||||
{
|
{
|
||||||
fatalErrorInFunction<<
|
fatalErrorInFunction<<
|
||||||
|
@ -28,4 +28,4 @@ template class pFlow::geometryMotion<pFlow::stationaryWall>;
|
|||||||
|
|
||||||
template class pFlow::geometryMotion<pFlow::conveyorBeltMotion>;
|
template class pFlow::geometryMotion<pFlow::conveyorBeltMotion>;
|
||||||
|
|
||||||
//template class pFlow::geometryMotion<pFlow::multiRotatingAxisMotion>;
|
template class pFlow::geometryMotion<pFlow::multiRotatingAxisMotion>;
|
||||||
|
@ -25,7 +25,7 @@ Licence:
|
|||||||
#include "stationaryWall.hpp"
|
#include "stationaryWall.hpp"
|
||||||
#include "rotatingAxisMotion.hpp"
|
#include "rotatingAxisMotion.hpp"
|
||||||
#include "conveyorBeltMotion.hpp"
|
#include "conveyorBeltMotion.hpp"
|
||||||
//#include "multiRotatingAxisMotion.hpp"
|
#include "multiRotatingAxisMotion.hpp"
|
||||||
#include "vibratingMotion.hpp"
|
#include "vibratingMotion.hpp"
|
||||||
|
|
||||||
|
|
||||||
@ -40,10 +40,7 @@ using stationaryGeometry = geometryMotion<stationaryWall>;
|
|||||||
|
|
||||||
using conveyorBeltMotionGeometry = geometryMotion<conveyorBeltMotion>;
|
using conveyorBeltMotionGeometry = geometryMotion<conveyorBeltMotion>;
|
||||||
|
|
||||||
//typedef geometryMotion<multiRotatingAxisMotion> multiRotationAxisMotionGeometry;
|
using multiRotationAxisMotionGeometry = geometryMotion<multiRotatingAxisMotion>;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,10 +97,11 @@ pFlow::AdamsBashforth2::AdamsBashforth2
|
|||||||
const word& baseName,
|
const word& baseName,
|
||||||
pointStructure& pStruct,
|
pointStructure& pStruct,
|
||||||
const word& method,
|
const word& method,
|
||||||
const realx3Field_D& initialValField
|
const realx3Field_D& initialValField,
|
||||||
|
bool keepHistory
|
||||||
)
|
)
|
||||||
:
|
:
|
||||||
integration(baseName, pStruct, method, initialValField),
|
integration(baseName, pStruct, method, initialValField, keepHistory),
|
||||||
realx3PointField_D
|
realx3PointField_D
|
||||||
(
|
(
|
||||||
objectFile
|
objectFile
|
||||||
@ -108,7 +109,7 @@ pFlow::AdamsBashforth2::AdamsBashforth2
|
|||||||
groupNames(baseName,"dy1"),
|
groupNames(baseName,"dy1"),
|
||||||
pStruct.time().integrationFolder(),
|
pStruct.time().integrationFolder(),
|
||||||
objectFile::READ_IF_PRESENT,
|
objectFile::READ_IF_PRESENT,
|
||||||
objectFile::WRITE_ALWAYS
|
keepHistory?objectFile::WRITE_ALWAYS:objectFile::WRITE_NEVER
|
||||||
),
|
),
|
||||||
pStruct,
|
pStruct,
|
||||||
zero3,
|
zero3,
|
||||||
|
@ -81,7 +81,8 @@ public:
|
|||||||
const word& baseName,
|
const word& baseName,
|
||||||
pointStructure& pStruct,
|
pointStructure& pStruct,
|
||||||
const word& method,
|
const word& method,
|
||||||
const realx3Field_D& initialValField);
|
const realx3Field_D& initialValField,
|
||||||
|
bool keepHistory);
|
||||||
|
|
||||||
/// Destructor
|
/// Destructor
|
||||||
~AdamsBashforth2()override = default;
|
~AdamsBashforth2()override = default;
|
||||||
|
@ -109,10 +109,11 @@ pFlow::AdamsBashforth3::AdamsBashforth3
|
|||||||
const word& baseName,
|
const word& baseName,
|
||||||
pointStructure& pStruct,
|
pointStructure& pStruct,
|
||||||
const word& method,
|
const word& method,
|
||||||
const realx3Field_D& initialValField
|
const realx3Field_D& initialValField,
|
||||||
|
bool keepHistory
|
||||||
)
|
)
|
||||||
:
|
:
|
||||||
AdamsBashforth2(baseName, pStruct, method, initialValField),
|
AdamsBashforth2(baseName, pStruct, method, initialValField, keepHistory),
|
||||||
dy2_
|
dy2_
|
||||||
(
|
(
|
||||||
objectFile
|
objectFile
|
||||||
@ -120,7 +121,7 @@ pFlow::AdamsBashforth3::AdamsBashforth3
|
|||||||
groupNames(baseName,"dy2"),
|
groupNames(baseName,"dy2"),
|
||||||
pStruct.time().integrationFolder(),
|
pStruct.time().integrationFolder(),
|
||||||
objectFile::READ_IF_PRESENT,
|
objectFile::READ_IF_PRESENT,
|
||||||
objectFile::WRITE_ALWAYS
|
keepHistory ? objectFile::WRITE_ALWAYS : objectFile::WRITE_NEVER
|
||||||
),
|
),
|
||||||
pStruct,
|
pStruct,
|
||||||
zero3,
|
zero3,
|
||||||
|
@ -71,7 +71,8 @@ public:
|
|||||||
const word& baseName,
|
const word& baseName,
|
||||||
pointStructure& pStruct,
|
pointStructure& pStruct,
|
||||||
const word& method,
|
const word& method,
|
||||||
const realx3Field_D& initialValField);
|
const realx3Field_D& initialValField,
|
||||||
|
bool keepHistory);
|
||||||
|
|
||||||
|
|
||||||
/// Destructor
|
/// Destructor
|
||||||
|
@ -115,10 +115,11 @@ pFlow::AdamsBashforth4::AdamsBashforth4
|
|||||||
const word& baseName,
|
const word& baseName,
|
||||||
pointStructure& pStruct,
|
pointStructure& pStruct,
|
||||||
const word& method,
|
const word& method,
|
||||||
const realx3Field_D& initialValField
|
const realx3Field_D& initialValField,
|
||||||
|
bool keepHistory
|
||||||
)
|
)
|
||||||
:
|
:
|
||||||
AdamsBashforth3(baseName, pStruct, method, initialValField),
|
AdamsBashforth3(baseName, pStruct, method, initialValField, keepHistory),
|
||||||
dy3_
|
dy3_
|
||||||
(
|
(
|
||||||
objectFile
|
objectFile
|
||||||
@ -126,7 +127,7 @@ pFlow::AdamsBashforth4::AdamsBashforth4
|
|||||||
groupNames(baseName,"dy3"),
|
groupNames(baseName,"dy3"),
|
||||||
pStruct.time().integrationFolder(),
|
pStruct.time().integrationFolder(),
|
||||||
objectFile::READ_IF_PRESENT,
|
objectFile::READ_IF_PRESENT,
|
||||||
objectFile::WRITE_ALWAYS
|
keepHistory?objectFile::WRITE_ALWAYS:objectFile::WRITE_NEVER
|
||||||
),
|
),
|
||||||
pStruct,
|
pStruct,
|
||||||
zero3,
|
zero3,
|
||||||
|
@ -69,7 +69,8 @@ public:
|
|||||||
const word& baseName,
|
const word& baseName,
|
||||||
pointStructure& pStruct,
|
pointStructure& pStruct,
|
||||||
const word& method,
|
const word& method,
|
||||||
const realx3Field_D& initialValField);
|
const realx3Field_D& initialValField,
|
||||||
|
bool keepHistory);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -123,10 +123,11 @@ pFlow::AdamsBashforth5::AdamsBashforth5
|
|||||||
const word &baseName,
|
const word &baseName,
|
||||||
pointStructure &pStruct,
|
pointStructure &pStruct,
|
||||||
const word &method,
|
const word &method,
|
||||||
const realx3Field_D &initialValField
|
const realx3Field_D &initialValField,
|
||||||
|
bool keepHistory
|
||||||
)
|
)
|
||||||
:
|
:
|
||||||
AdamsBashforth4(baseName, pStruct, method, initialValField),
|
AdamsBashforth4(baseName, pStruct, method, initialValField, keepHistory),
|
||||||
dy4_
|
dy4_
|
||||||
(
|
(
|
||||||
objectFile
|
objectFile
|
||||||
@ -134,7 +135,7 @@ pFlow::AdamsBashforth5::AdamsBashforth5
|
|||||||
groupNames(baseName,"dy4"),
|
groupNames(baseName,"dy4"),
|
||||||
pStruct.time().integrationFolder(),
|
pStruct.time().integrationFolder(),
|
||||||
objectFile::READ_IF_PRESENT,
|
objectFile::READ_IF_PRESENT,
|
||||||
objectFile::WRITE_ALWAYS
|
keepHistory?objectFile::WRITE_ALWAYS:objectFile::WRITE_NEVER
|
||||||
),
|
),
|
||||||
pStruct,
|
pStruct,
|
||||||
zero3,
|
zero3,
|
||||||
|
@ -68,7 +68,8 @@ public:
|
|||||||
const word& baseName,
|
const word& baseName,
|
||||||
pointStructure& pStruct,
|
pointStructure& pStruct,
|
||||||
const word& method,
|
const word& method,
|
||||||
const realx3Field_D& initialValField);
|
const realx3Field_D& initialValField,
|
||||||
|
bool keepHistory);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -51,10 +51,12 @@ pFlow::integration::integration(
|
|||||||
const word &baseName,
|
const word &baseName,
|
||||||
pointStructure &pStruct,
|
pointStructure &pStruct,
|
||||||
const word &,
|
const word &,
|
||||||
const realx3Field_D &)
|
const realx3Field_D &,
|
||||||
|
bool keepHistory)
|
||||||
: owner_(*pStruct.owner()),
|
: owner_(*pStruct.owner()),
|
||||||
pStruct_(pStruct),
|
pStruct_(pStruct),
|
||||||
baseName_(baseName)
|
baseName_(baseName),
|
||||||
|
keepHistory_(keepHistory)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
@ -64,12 +66,13 @@ pFlow::uniquePtr<pFlow::integration>
|
|||||||
const word& baseName,
|
const word& baseName,
|
||||||
pointStructure& pStruct,
|
pointStructure& pStruct,
|
||||||
const word& method,
|
const word& method,
|
||||||
const realx3Field_D& initialValField
|
const realx3Field_D& initialValField,
|
||||||
|
bool keepHistory
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if( wordvCtorSelector_.search(method) )
|
if( wordvCtorSelector_.search(method) )
|
||||||
{
|
{
|
||||||
return wordvCtorSelector_[method] (baseName, pStruct, method, initialValField);
|
return wordvCtorSelector_[method] (baseName, pStruct, method, initialValField, keepHistory);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -24,6 +24,7 @@ Licence:
|
|||||||
|
|
||||||
#include "virtualConstructor.hpp"
|
#include "virtualConstructor.hpp"
|
||||||
#include "pointFields.hpp"
|
#include "pointFields.hpp"
|
||||||
|
#include "Logical.hpp"
|
||||||
|
|
||||||
|
|
||||||
namespace pFlow
|
namespace pFlow
|
||||||
@ -63,6 +64,8 @@ private:
|
|||||||
/// The base name for integration
|
/// The base name for integration
|
||||||
const word baseName_;
|
const word baseName_;
|
||||||
|
|
||||||
|
bool keepHistory_;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
bool insertValues(
|
bool insertValues(
|
||||||
@ -83,7 +86,8 @@ public:
|
|||||||
const word& baseName,
|
const word& baseName,
|
||||||
pointStructure& pStruct,
|
pointStructure& pStruct,
|
||||||
const word& method,
|
const word& method,
|
||||||
const realx3Field_D& initialValField);
|
const realx3Field_D& initialValField,
|
||||||
|
bool keepHistory);
|
||||||
|
|
||||||
/// Copy constructor
|
/// Copy constructor
|
||||||
integration(const integration&) = default;
|
integration(const integration&) = default;
|
||||||
@ -109,9 +113,10 @@ public:
|
|||||||
const word& baseName,
|
const word& baseName,
|
||||||
pointStructure& pStruct,
|
pointStructure& pStruct,
|
||||||
const word& method,
|
const word& method,
|
||||||
const realx3Field_D& initialValField
|
const realx3Field_D& initialValField,
|
||||||
|
bool keepHistory
|
||||||
),
|
),
|
||||||
(baseName, pStruct, method, initialValField)
|
(baseName, pStruct, method, initialValField, keepHistory)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
@ -138,6 +143,11 @@ public:
|
|||||||
return owner_;
|
return owner_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool keepHistory()const
|
||||||
|
{
|
||||||
|
return keepHistory_;
|
||||||
|
}
|
||||||
|
|
||||||
virtual
|
virtual
|
||||||
void updateBoundariesSlaveToMasterIfRequested() = 0;
|
void updateBoundariesSlaveToMasterIfRequested() = 0;
|
||||||
/// return integration method
|
/// return integration method
|
||||||
@ -164,7 +174,8 @@ public:
|
|||||||
const word& baseName,
|
const word& baseName,
|
||||||
pointStructure& pStruct,
|
pointStructure& pStruct,
|
||||||
const word& method,
|
const word& method,
|
||||||
const realx3Field_D& initialValField);
|
const realx3Field_D& initialValField,
|
||||||
|
bool keepHistory);
|
||||||
|
|
||||||
}; // integration
|
}; // integration
|
||||||
|
|
||||||
|
@ -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()
|
||||||
|
@ -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())
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
@ -193,7 +193,7 @@ public:
|
|||||||
|
|
||||||
if( capacity+1 > flags_.size() )
|
if( capacity+1 > flags_.size() )
|
||||||
{
|
{
|
||||||
reallocNoInit(flags_, capacity+1);
|
reallocInit(flags_, capacity+1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// fill the flags
|
// fill the flags
|
||||||
@ -219,7 +219,7 @@ public:
|
|||||||
{
|
{
|
||||||
// get more space to prevent reallocations in next iterations
|
// get more space to prevent reallocations in next iterations
|
||||||
uint32 len = size_*1.1+1;
|
uint32 len = size_*1.1+1;
|
||||||
reallocNoInit(sortedPairs_, len);
|
reallocInit(sortedPairs_, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
Kokkos::parallel_for(
|
Kokkos::parallel_for(
|
||||||
@ -231,6 +231,7 @@ public:
|
|||||||
// - sort paris based on the first and second
|
// - sort paris based on the first and second
|
||||||
sort(sortedPairs_, 0, size_ );
|
sort(sortedPairs_, 0, size_ );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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())
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user