7.1 潰壩 官網 目錄:$FOAM_TUTORIALS/multiphase/interFoam/laminar/damBreak 7.1.1 介紹 本案例使用interFoam兩相演算法,基於流體體積分數(VOF)法,每個網格中的相體積分數(alpha)通過求解一個組分運輸方程確定。物理屬性基於這 ...
7.1 潰壩
官網
目錄:$FOAM_TUTORIALS/multiphase/interFoam/laminar/damBreak
7.1.1 介紹
本案例使用interFoam兩相演算法,基於流體體積分數(VOF)法,每個網格中的相體積分數(alpha)通過求解一個組分運輸方程確定。物理屬性基於這個相分數通過加權平均計算。
7.1.2 網格生成
blockMesh
7.1.3 邊界條件
最頂端atmosphere邊界設置為patch
// 0/U
boundaryField
{
...
atmosphere
{
type pressureInletOutletVelocity; // 對所有分量應用zeroGradient條件,當流動為入流時,對邊界切向的分量應用fixedValue;
value uniform (0 0 0);
}
defaultFaces
{
type empty;
}
}
// 0/p_rgh
boundaryField
{
...
atmosphere
{
type totalPressure; // 一種fixedValue條件,利用指定的總壓p0和當地速度U計算獲得;
p0 uniform 0;
}
defaultFaces
{
type empty;
}
}
// 0/alpha.water.orig
boundaryField
{
...
atmosphere
{
type inletOutlet; // 出流時為zeroGradient,入流時則為fixedValue條件;
inletValue uniform 0;
value uniform 0;
}
defaultFaces
{
type empty;
}
}
// ************************************************************************* //
所有壁面邊界處,壓力場採用fixedFluxPressure邊界條件,它自動調整壓力梯度使邊界通量符合速度邊界條件。
boundaryField
{
leftWall
{
type fixedFluxPressure; //
value uniform 0;
}
rightWall
{
type fixedFluxPressure;
value uniform 0;
}
lowerWall
{
type fixedFluxPressure;
value uniform 0;
}
}
defaultFaces代表此2維問題的前後面,像往常一樣,是empty類型
defaultFaces
{
type empty;
}
7.1.4 設置初場
相當於fluent中的patch,patch出一個水域。
boxToCell通過定義一個最小和最大的向量來創建一個盒子區域,在此區域內為水相,water被設置為1.
在執行setFields
之前,先備份0目錄下的alpha.water.org(備份文件)為alpha.water。因為setFields工具從文件讀取場並重新定義這些場,然後把它們重新寫入文件,原始文件會被覆蓋,所以需要備份。
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: 9
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
format ascii;
class dictionary;
location "system";
object setFieldsDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
defaultFieldValues
(
volScalarFieldValue alpha.water 0 // 場內預設為空氣
);
regions
(
boxToCell
{
box (0 0 -1) (0.1461 0.292 1); // 對應坐標如下
fieldValues
(
volScalarFieldValue alpha.water 1
);
}
);
// ************************************************************************* //
使用
paraFoam -builtin
後處理查看
7.1.5 流體特性
constant/transportProperties
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: 9
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
format ascii;
class dictionary;
location "constant";
object transportProperties;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
phases (water air); // 兩相
water
{
transportModel Newtonian; // 牛頓流體
nu 1e-06; // 運動粘度
rho 1000; // 密度
}
air
{
transportModel Newtonian;
nu 1.48e-05;
rho 1;
}
sigma 0.07; // 錶面張力
// ************************************************************************* //
Newtonian為牛頓流體,CrossPowerLawCoeffs為非牛頓流體。
重力場
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: 9
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
format ascii;
class uniformDimensionedVectorField;
location "constant";
object g;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 1 -2 0 0 0 0];
value (0 -9.81 0);
// ************************************************************************* //
7.1.6 湍流模型
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: 9
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
format ascii;
class dictionary;
location "constant";
object momentumTransport;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
simulationType laminar; // 層流
// ************************************************************************* //
7.1.7 時間步長
設置adjustTimeStep為on,表示自動調整時間步長,並設置最大庫郎書和最大相場庫郎數為1.
設置writeContral為adjustableRunTime,表示強制調整一時間點正好為輸出結果的時間。因為自動調整時間步長之後,如果按照固定時間步長間隔保存結果會比較亂,所以需要強制調整。
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: 9
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
format ascii;
class dictionary;
location "system";
object controlDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
application interFoam;
startFrom startTime;
startTime 0;
stopAt endTime;
endTime 1;
deltaT 0.001;
writeControl adjustableRunTime; // 重點
writeInterval 0.05;
purgeWrite 0;
writeFormat binary;
writePrecision 6;
writeCompression off;
timeFormat general;
timePrecision 6;
runTimeModifiable yes;
adjustTimeStep yes; // 重點
maxCo 1; // 重點
maxAlphaCo 1; // 重點
maxDeltaT 1;
// ************************************************************************* //
7.1.8 離散求解
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: 9
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
format ascii;
class dictionary;
location "system";
object fvSchemes;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
ddtSchemes
{
default Euler;
}
gradSchemes
{
default Gauss linear;
}
divSchemes
{
div(rhoPhi,U) Gauss linearUpwind grad(U);
div(phi,alpha) Gauss interfaceCompression vanLeer 1;
div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear;
}
laplacianSchemes
{
default Gauss linear corrected;
}
interpolationSchemes
{
default linear;
}
snGradSchemes
{
default corrected;
}
// ************************************************************************* //
7.1.9 矩陣求解
nAlphaSubCycles:a方程中子迴圈的數目,子迴圈是一個給定時間步內對一個方程附加求解。可以再不降低時間步長的情況下保證解的穩定性。
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: 9
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
format ascii;
class dictionary;
location "system";
object fvSolution;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
solvers
{
"alpha.water.*"
{
nAlphaCorr 2;
nAlphaSubCycles 1;
MULESCorr yes;
nLimiterIter 5;
solver smoothSolver;
smoother symGaussSeidel;
tolerance 1e-8;
relTol 0;
}
"pcorr.*"
{
solver PCG;
preconditioner DIC;
tolerance 1e-5;
relTol 0;
}
p_rgh
{
solver PCG;
preconditioner DIC;
tolerance 1e-07;
relTol 0.05;
}
p_rghFinal
{
$p_rgh;
relTol 0;
}
U
{
solver smoothSolver;
smoother symGaussSeidel;
tolerance 1e-06;
relTol 0;
}
}
PIMPLE
{
momentumPredictor no;
nOuterCorrectors 1;
nCorrectors 3;
nNonOrthogonalCorrectors 0;
}
relaxationFactors
{
equations
{
".*" 1;
}
}
// ************************************************************************* //
7.1.10 計算
interFoam | tee log
7.1.11 並行計算
如果採用並行計算,程式根據system/decomposeParDict求解.
numberOfSubdomains:指定算例分割子區域數量,即處理器數
simpleCoeffs中,應滿足x * y = numberOfSubdomains
這個算例使用2個處理器並行計算。
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: 9
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
format ascii;
class dictionary;
location "system";
object decomposeParDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
numberOfSubdomains 2; // 重點
method simple;
simpleCoeffs
{
n (1 2 1); // 重點
}
hierarchicalCoeffs
{
n (1 1 1);
order xyz;
}
manualCoeffs
{
dataFile "";
}
distributed no;
roots ( );
// ************************************************************************* //
如果使用4個,我這裡使用的虛擬機,會報錯,提示核數不夠。
分割
decomposePar
並行計算
mpirun -np 2 interFoam -parallel > log
查看paraFoam -builtin -case processor0,為一半
合併結果
reconstructPar
後處理
paraFoam -builtin