---
# System prepended metadata

title: OpenFOAM C1測試文件

---

OpenFOAM C1測試文件
==

**Application  : OpenFOAM
Chart Versions : 1.0.0
Application Version : 1.0.0**

## **OpenFOAM Background介紹**
OpenFOAM（Open Field Operation And Manipulation）是一個用於計算流體動力學（CFD）模擬的開源軟體。它廣泛應用於工程和科學領域，用於模擬各種流體動力學問題。

OpenFOAM 提供了豐富的數值方法庫，支持各種物理現象的模擬，如湍流、熱傳遞、化學反應、多相流等。其靈活的模組化架構允許用戶根據需求進行擴展和定制，使其成為科研和工程應用中的首選工具。

在此選擇**OpenCFD版本的OpenFOAM**作為HPC app工具使用，docker image使用**2312**版本。
[Official](https://gatk.broadinstitute.org/hc/en-us)
[docker image](https://hub.docker.com/layers/opencfd/openfoam-default/2312/images/sha256-280e6f45f7614086cb74c20a074f445900c1597ef339b609634f8aa03e8d3172?context=explore)


<br>
<br>
<br>
<br>

## **Printer case介紹**
[StdToolheadOpenfoam]( https://github.com/yellowfish543/StdToolheadOpenfoam)

該案例旨在為3D印表機工具刷頭的CFD分析提供一個標準化的工作流程。通過使用一系列特定的軟件工具和步驟，用戶可以高效、系統地完成CFD分析。

<br>
<br>
<br>
<br>

## **Printer case submit job步驟**
1. 進入rancher UI頁面

pic 1

2. 點選左邊欄位「Apps」，「Charts」

pic 2

3. 在右上角欄位「Filter」內輸入"hpc" ，尋找「OpenFOAM」後點選進入

pic 3

4. 點選右上角「Install」

pic 4

5. 「Install: Step 1」，選取對應「Namespace」欄位，輸入名稱於「Name」欄位

pic 5

6. 「Install: Step 2」
「Edit Options」方框 (「Edit YAML」不需變動 ) 
**General**
  「Name」: job的名稱
  「Worker Replicas」: Worker平行運算的數量
  「CPU Minimum Require for Master」: Master最少CPU需求數量
  「Memory Minimum Require for Master」: Master最少Mem需求數量
  「GPU Minimum Require for Master」: Master最少GPU需求數量
  「CPU Minimum Require for Worker」: Worker最少CPU需求數量
  「Memory Minimum Require for Worker」: Worker最少Mem需求數量
  「GPU Minimum Require for Worker」: Worker最少GPU需求數量
**Input/Output Data**
  「NFS Server IP」: 資料儲存IP地址 (GSX storage)
  「NFS Path」: 資料儲存目錄路徑
  「Mount Path」: 掛載於Pod上的目錄路徑
**APP Setting**
  「Command」: 使用者輸入工作命令

完成之後點選右下角「install」

pic 6

7. 完成後畫面顯示剛剛install的app job

pic 7

8. 於「Workloads」，「Pods」查看，State欄位下顯示的是job的pod狀態，通常會在一開始維持藍色橢圓框的"ContainerCreating"，過一陣子即轉變成綠色橢圓框的"Running"，若job執行完畢則會轉變為同樣綠色橢圓框的"Completed"狀態

pic 8-1 dashboard
pic 8-2 completed

9. 點擊Pod的最右邊三個點，點選「View Logs」，在下方會顯示當前job的pod執行log，log只會顯示於”帶有master名稱的pod”，”帶有worker名稱的pod”只負責執行計算並不會顯示log

pic 9

10. 點選"pod名稱"進入頁面查看其他資訊，點選「Metrics」可查看pod的不同種類使用量變化，”CPU Utilization”，”Memory Utilization”，”Network Traffic”，”Network I/O”，”Disk I/O”

pic 10

11. 若想刪除已經install的app(job)，可於「Apps」，「installed Apps」內點選欲刪除之installed app，在點擊「Delete」即可

pic 11

<br>
<br>
<br>
<br>

## **Printer case job執行畫面**

1. 點選master pod的”View Logs”查看輸出資訊，若開始出現如圖所示代表成功開始執行資料前處理步驟(畫面中執行指令為”blockMesh”)

pic 1

2. 若出現如圖所示，代表成功執行模擬階段(畫面中執行指令為"pimpleFoam -parallel")

pic 2-1
pic 2-2

3. 若出現如圖所示，代表job成功執行完畢，在資料夾內會生成以下資料

pic 3-1 ~ 3-4

<br>
<br>
<br>
<br>

## **Printer case 測試參數**




| Parameter                     | Description                       | Default                                    |
| ----------------------------- | --------------------------------- | ------------------------------------------ |
| job.name                      | Name of the job                   | openfoam-hpc-job-printer                   |
| master.name                   | Name of the master                | master                                     |
| master.replica                | Number of master replicas         | 1                                          |
| master.image                  | Pod base image                    | infortrend/base_image_vnc_login:v3.2       |
| master.resources.cpu          | CPU required by master            | 1                                          |
| master.resources.memory       | Memory required by master         | 8Gi                                        |
| commands                      | Commands to run in the master pod | See the detailed commands below            |
| worker.name                   | Name of the worker                | worker                                     |
| worker.replica                | Number of worker replicas         | 2                                          |
| worker.image                  | Pod base image                    | infortrend/base_image_vnc_login:v3.2       |
| worker.resources.cpu          | CPU required by worker            | 2                                          |
| worker.resources.memory       | Memory required by worker         | 8Gi                                        |
| hpcAppVolume.name             | Name of the HPC image volume      | hpc-image                                  |
| hpcAppVolume.nfs.path         | HPC image NFS path                | /ForRDA25/hpc/hpc/Willie/images            |
| hpcAppVolume.nfs.server       | HPC image NFS server              | 172.27.115.31                              |
| hpcAppvolumeMount.name        | Name of the HPC image volume mount| hpc-image                                  |
| hpcAppvolumeMount.mountPath   | HPC image mount path              | /img                                       |
| volumes.name                  | Name of the data volume           | hpc-data                                   |
| volumes.nfs.path              | Data NFS path                     | /ForRDA25/hpc/hpc/Willie/StdToolheadOpenfoam_test |
| volumes.nfs.server            | Data NFS server                   | 172.27.115.31                              |
| volumeMounts.name             | Name of the data volume mount     | hpc-data                                   |
| volumeMounts.mountPath        | Data mount path                   | /data                                      |


<br>
<br>
<br>
<br>

## **Printer case commands 解釋**

**SINGULARITY="singularity run -B /data:/mnt --pwd /mnt/02_Run /img/openfoam-default-2312.sif";**
定義環境變數SINGULARITY，用來運行Singularity容器的指令，-B /data:/mnt是將本地的/data目錄綁定到容器內的/mnt目錄，–pwd /mnt/02_Run設置容器內的工作目錄為/mnt/02_Run，並指定Singularity image文件為/img/openfoam-default-2312.sif

**cd /data/02_Run** 
進入主要工作的目錄

**rm -rf ./processor\* ./dynamicCode ./0 ;**
做資料清理，主要清理舊的運行數據

**rm -rf ./processor\* ./constant/extendedFeatureEdgeMesh ./constant/polyMesh ./constant/triSurface/\* ./logs ./log\* ./postProcessing ;**
同上，清理舊的運行數據

**mkdir -p ./constant/triSurface/ ;**
建立目錄

**cp -rf ../01_Geometry/\* ./constant/triSurface/ ;**
複製資料

**${SINGULARITY} blockMesh ;**
運行openfoam指令blockMesh，用來生成網格結構

**${SINGULARITY} surfaceFeatureExtract ;**
運行openfoam指令surfaceFeatureExtract，用來提取表面特徵

**${SINGULARITY} decomposePar ;**
運行openfoam指令decomposePar，用來分解域以便進行平行運算

**mpirun --allow-run-as-root --host ${MPI_HOST} -np 2 ${SINGULARITY} bash -c "snappyHexMesh -overwrite -parallel" ;**
使用mpirun指令在指定的host(MPI_HOST內記錄著worker資訊)上運行snappyHexMesh，使用平行處理生成網格結構，overwrite表示覆蓋，parallel表示平行運算

**mpirun --allow-run-as-root --host ${MPI_HOST} -np 2 ${SINGULARITY} bash -c "checkMesh -parallel -allTopology -allGeometry -writeSets vtk" ;**
使用mpirun指令在指定的host(MPI_HOST內記錄著worker資訊)上運行checkMesh，檢查網格結構並輸出為 vtk 格式。-allTopology 和 -allGeometry 表示檢查所有的拓撲和幾何結構，-writeSets vtk 表示輸出為 vtk 格式。



**${SINGULARITY} bash -c "reconstructParMesh -constant" ;**
運行openfoam指令reconstructParMesh -constant，用來重建後平行運算後的網格結構

**rm -rf ./processor\* ./postProcessing ./0 ;**
清理數據

**cp -r 0.org/. 0 ;**
複製資料

**${SINGULARITY} decomposePar ;**
運行openfoam指令decomposePar，用來分解域以便進行平行運算

**mpirun --allow-run-as-root --host ${MPI_HOST} -np 2 ${SINGULARITY} bash -c "renumberMesh -overwrite -parallel" ;**
使用mpirun指令在指定的host(MPI_HOST內記錄著worker資訊)上運行renumberMesh，用來重新編號網格結構overwrite表示覆蓋，parallel表示平行運算

**mpirun --allow-run-as-root --host ${MPI_HOST} -np 2 ${SINGULARITY} bash -c "potentialFoam -parallel -initialiseUBCs" ;**
使用mpirun指令在指定的host(MPI_HOST內記錄著worker資訊)上運行potentialFoam，用來進行初始的速度邊界條件計算，parallel表示平行運算，l-initialiseUBCs表示初始化速度邊界條件

**mpirun --allow-run-as-root --host ${MPI_HOST} -np 2 ${SINGULARITY} bash -c "pimpleFoam -parallel" ;**
使用mpirun指令在指定的host(MPI_HOST內記錄著worker資訊)上運行pimpleFoam，進行主要模擬計算，parallel表示平行運算

**${SINGULARITY} reconstructParMesh ;**
運行openfoam指令reconstructParMesh，用來重建平行處理，將前面分解的計算域重新組合成一個原本完整的域

<br>
<br>
<br>
<br>

#### 備註1 : 若要自行找OpenFOAM的case，請尋找CFD OpenFOAM 版本編寫的檔案，否則極大機率因版本不同而發生錯誤停止

#### 備註2 : 若要修改mpirun -np數量，請修改case/system/decomposeParDict檔案中的變數值，修改成2，ex. numberOfSubdomains 2，即可使用mpirun -np2，數字沒有對應在parallel模擬時會發生錯誤
