移動メッシュ2015年2月6日 | |
はじめに移動メッシュについて。 使用バージョンOpenFOAM 2.3.1 ファイル
移動メッシュ移動メッシュは、それに対応したソルバーで利用できる。標準ソルバーでは interDyMFoam など、"DyM" の文字が付いたものがそれに当たる。移動メッシュだけを扱いたければ、moveDynamicMesh というユーティリティが使える。 移動メッシュの設定は constant/dynamicMeshDict で行う。
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object dynamicMeshDict;
}
dynamicFvMesh dynamicMotionSolverFvMesh;
motionSolverLibs ("libfvMotionSolvers.so");
solver velocityComponentLaplacian;
velocityComponentLaplacianCoeffs
{
component x;
diffusivity inverseDistance (move);
}
dynamicFvMesh では以下のものを指定できる。
staticFvMesh は移動メッシュを用いないという意味である。dynamicRefineFvMesh はいわゆるアダプティブメッシュを用いるためのものである。ここでは dynamicMotionSolverFvMesh と solidBodyMotionFvMesh、multiSolidBodyMotionFvMesh についてだけ考える。 solver では以下のものを指定できる。
それぞれ要求されるファイルが異なる。velocityComponentLaplacian は時刻フォルダに pointMotionUx などを要求し、velocityLaplacian は pointMotionU を、displacementLaplacian は pointDisplacement を要求する。 motionSolverLibs に "libsixDoFRigidBodyMotion.so" を指定しておけば、solver で sixDoFRigidBodyMotion を指定できる。 velocityComponentLaplacianvelocityComponentLaplacian は x、y、z いずれかの成分の移動速度を指定できるものである。設定は以下の通りである。
solver velocityComponentLaplacian;
velocityComponentLaplacianCoeffs
{
component x;
diffusivity inverseDistance (move);
}
速度の指定は 0/pointMotionUx などで行う。
FoamFile
{
version 2.0;
format ascii;
class pointScalarField;
object pointMotionU;
}
dimensions [0 1 -1 0 0 0 0];
internalField uniform 0;
boundaryField
{
#include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
".*"
{
type uniformFixedValue;
uniformValue constant 0;
}
move
{
type uniformFixedValue;
uniformValue constant 0.3;
}
}
velocityComponentLaplacianCoeffs の diffusivity はメッシュを変形させる方法の指定で、以下のようなものを指定できる。
quadratic と exponential は、それぞれの手法の前に付けるものである。 次のモデルを用いて、diffusivity の比較を行う。 ![]() uniform
diffusivity uniform;
![]() メッシュがゆがんでいる。 directional
diffusivity directional ( 1 1 0 );
![]() パラメタ調整可能。この場合 uniform と変わらない。 inverseDistance
diffusivity inverseDistance (move);
![]() 境界の指定が必要。 inverseFaceDistance
diffusivity inverseFaceDistance (move);
![]() inverseDistance と変わらない。 inversePointDistance
diffusivity inversePointDistance (move);
![]() inverseDistance と変わらない。 inverseVolume
diffusivity inverseVolume;
![]() quadratic
diffusivity quadratic inverseDistance (move);
![]() inverseDistance とあまり変わらない。 exponential
diffusivity exponential 10 inverseDistance (move);
![]() パラメタ調整可能。ここでは inverseDistance とあまり変わらない。 上下面 slip![]() 上下面を slip にした場合の inverseDistance の結果。上下の拘束が緩くなった分、全体的にゆがみが緩和されている。 velocityLaplacianvelocityLaplacian は、移動速度をベクトルで指定できる。設定は以下の通りである。
solver velocityLaplacian;
velocityLaplacianCoeffs
{
diffusivity inverseDistance (move);
}
速度の指定は 0/pointMotionU で行う。
FoamFile
{
version 2.0;
format ascii;
class pointVectorField;
object pointMotionU;
}
dimensions [0 1 -1 0 0 0 0];
internalField uniform (0 0 0);
boundaryField
{
#include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
".*"
{
type uniformFixedValue;
uniformValue constant (0 0 0);
}
move
{
type uniformFixedValue;
uniformValue constant (0.3 0.3 0);
}
}
velocityLaplacianCoeffs の diffusivity は、以下のようなものを指定できる。
quadratic と exponential は、それぞれの手法の前に付けるものである。 上述のモデルで、diffusivity の比較を行う。 uniform
diffusivity uniform;
![]() メッシュがゆがんで境界に重なってしまっている。 directional
diffusivity directional ( 1 1 0 );
![]() uniform と変わらない。 motionDirectional
diffusivity motionDirectional ( 1 1 0 );
![]() motionDirectional と変わらない。 inverseDistance
diffusivity inverseDistance (move);
![]() inverseFaceDistance
diffusivity inverseFaceDistance (move);
![]() inverseDistance と変わらない。 inversePointDistance
diffusivity inversePointDistance (move);
![]() inverseDistance と変わらない。 inverseVolume
diffusivity inverseVolume;
![]() メッシュが破綻してしまった。 quadratic
diffusivity quadratic inverseDistance (move);
![]() inverseDistance とあまり変わらない。 exponential
diffusivity exponential 10 inverseDistance (move);
![]() inverseDistance とあまり変わらない。 diffusivity のまとめ以上で示した例では、inverseDistance が無難そうである。 displacementLaplaciandisplacementLaplacian は、移動変位を指定できる。設定は以下のとおりである。
solver displacementLaplacian;
displacementLaplacianCoeffs
{
diffusivity inverseDistance (move);
}
移動変位は 0/pointDisplacement で指定する。
FoamFile
{
version 2.0;
format ascii;
class pointVectorField;
object pointDisplacement;
}
dimensions [0 1 0 0 0 0 0];
internalField uniform (0 0 0);
boundaryField
{
#include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes"
".*"
{
type uniformFixedValue;
uniformValue constant (0 0 0);
}
move
{
type oscillatingDisplacement;
amplitude (0.1 0 0);
omega 6.25;
value uniform (0 0 0);
}
}
移動変位指定の type では、以下のようなものを指定できる。 oscillatingDisplacement
move
{
type oscillatingDisplacement;
amplitude (0.1 0 0);
omega 6.25; // 2*pi/T [rad/s]
value uniform (0 0 0);
}
振動変位を与える。 angularOscillatingDisplacement
move
{
type angularOscillatingDisplacement;
axis (0 0 1);
origin (0.5 0.5 0);
angle0 0; [rad]
amplitude 0.785; [rad]
omega 6.25; 2*pi/T [rad/s]
value uniform (0 0 0);
}
回転の振動変位を与える。 solidBodyMotionDisplacementsolidBodyMotionDisplacement は、solidBodyMotionFunction により様々な変位の与え方ができる。 linearMotion
move
{
type solidBodyMotionDisplacement;
solidBodyMotionFunction linearMotion;
linearMotionCoeffs
{
velocity (0.3 0 0);
}
}
線形の変位を与える。 rotatingMotion
move
{
type solidBodyMotionDisplacement;
solidBodyMotionFunction rotatingMotion;
rotatingMotionCoeffs
{
origin (0.5 0.5 0);
axis (0 0 1);
omega 0.785; [rad/s]
}
}
回転を与える。 axisRotationMotion
move
{
type solidBodyMotionDisplacement;
solidBodyMotionFunction axisRotationMotion;
axisRotationMotionCoeffs
{
origin (0.5 0.5 0);
radialVelocity (0 0 45); [deg/s]
}
}
回転を与える。 oscillatingLinearMotion
move
{
type solidBodyMotionDisplacement;
solidBodyMotionFunction oscillatingLinearMotion;
oscillatingLinearMotionCoeffs
{
amplitude (0.1 0 0);
omega 6.25; [rad/s]
}
}
振動変位を与える。 oscillatingRotatingMotion
move
{
type solidBodyMotionDisplacement;
solidBodyMotionFunction oscillatingRotatingMotion;
oscillatingRotatingMotionCoeffs
{
origin (0.5 0.5 0);
amplitude (0 0 45); [deg]
omega 6.25; [rad/s]
}
}
回転の振動変位を与える。 multiMotion
move
{
type solidBodyMotionDisplacement;
solidBodyMotionFunction multiMotion;
multiMotionCoeffs
{
linear
{
solidBodyMotionFunction oscillatingLinearMotion;
oscillatingLinearMotionCoeffs
{
amplitude (0.1 0 0);
omega 6.25; [rad/s]
}
}
rotating
{
solidBodyMotionFunction oscillatingRotatingMotion;
oscillatingRotatingMotionCoeffs
{
origin (0.5 0.5 0);
amplitude (0 0 45); [deg]
omega 6.25; [rad/s]
}
}
}
}
solidBodyMotionFunction を組み合わせることができる。上記の例では oscillatingLinearMotion と oscillatingRotatingMotion で回転させながら左右に移動させている。波括弧の頭についている "linear"、"rotating" は任意の名前。 tabulated6DoFMotion
move
{
type solidBodyMotionDisplacement;
solidBodyMotionFunction tabulated6DoFMotion;
tabulated6DoFMotionCoeffs
{
timeDataFileName "$FOAM_CASE/constant/6DoF.dat";
CofG (0.5 0.5 0);
}
}
constant/6DoF.dat // x = 0.1*sin(2*pi*t) // rz = 45*sin(2*pi*t) ( (0.0 (( 0.000 0 0) (0 0 0.00))) (0.1 (( 0.059 0 0) (0 0 26.45))) (0.2 (( 0.095 0 0) (0 0 42.80))) (0.3 (( 0.095 0 0) (0 0 42.80))) (0.4 (( 0.059 0 0) (0 0 26.45))) (0.5 (( 0.000 0 0) (0 0 00.00))) (0.6 ((-0.059 0 0) (0 0 -26.45))) (0.7 ((-0.095 0 0) (0 0 -42.80))) (0.8 ((-0.095 0 0) (0 0 -42.80))) (0.9 ((-0.059 0 0) (0 0 -26.45))) (1.0 (( 0.000 0 0) (0 0 0.00))) ) テーブルで時刻に応じた並進 3 方向、回転 3 方向を与える。上記の例は、multiMotion の例を再現したものである。 displacementSBRStressdisplacementSBRStress は、displacementLaplacian と使い方は同じだが、メッシュの変形の仕方が異なるようである。
solver displacementSBRStress;
displacementSBRStressCoeffs
{
diffusivity inverseDistance (move);
}
solidBodyMotionsolidBodyMotionFvMesh、multiSolidBodyMotionFvMesh は、セルの剛体移動を行うためのものである。上述の dynamicMotionSolverFvMesh はパッチの移動を扱うが、こちらはセルの移動を扱う。 solidBodyMotionFvMesh の設定は以下の通りである。 constant/dynamicMeshDict
dynamicFvMesh solidBodyMotionFvMesh;
solidBodyMotionFvMeshCoeffs
{
cellZone move;
solidBodyMotionFunction rotatingMotion;
rotatingMotionCoeffs
{
origin (0 0 0);
axis (0 0 1);
omega 0.785; // [rad/s]
}
}
cellZone で移動させるセルゾーンを指定する。使い方は dynamicMotionSolverFvMesh の solver である displacementLaplacian の solidBodyMotionDisplacement 同様である。 multiSolidBodyMotionFvMesh は、移動させるセルゾーンが複数ある場合に使用する。
dynamicFvMesh multiSolidBodyMotionFvMesh;
multiSolidBodyMotionFvMeshCoeffs
{
move
{
solidBodyMotionFunction rotatingMotion;
rotatingMotionCoeffs
{
origin (0 0 0);
axis (0 0 1);
omega 0.785; [rad/s]
}
}
}
波括弧の上の "move" の部分は、セルゾーンの名前を指定する必要がある。 cyclicAMI と組み合わせて物体の回転運動を表現することができる。 ![]() ![]() pimpleDyMFoam で左から右に向かう流れを作っている。中央の四角の穴を含む丸い領域が移動するセルゾーンで、界面が cyclicAMI になっている。アニメーションのコンターは速度である。 中央の四角の壁の速度の境界条件は、movingWallVelocity にしている。
move
{
type movingWallVelocity;
value uniform (0 0 0);
}
dynamicMotionSolverFvMesh と大きく異なるのは、セルゾーンを移動させても周りのメッシュは変形してくれないことである。したがって solidBodyMotionFvMesh の場合、スライディングインターフェイス (cyclicAMI や cyclicACMI) と組み合わせる必要がある。 | |
| PENGUINITIS | |