日本画像学会で毎年開催しているインクジェットシミュレーション (blueCFD-core-2020版)で気になる点を修正し,blueCFD-core-2024 版として書き直してみました.
このチュートリアルでこんな計算ができるようになります.
このチュートリアルをやるまえに,”capillaryRiseを軸対称2Dに変更しよ”をやっておくことを強くお勧めします.
1 準備
・前のチュートリアルで使ったcapillaryRise2D を コピーしてIJeject と名前を変える.
・ターミナルを開き,カレントディレクトリを IJeject にする.
・前の計算結果が残っていたら,./Allcleant ⏎を実行して初期化しておきます.
2 計算対象の把握
(手っ取り早く計算したい場合,この章は飛ばして3章に進んでください)
・下左図のようなインクジェットを考える.ヘッド液室形状は円柱状でインクが重点されている.液室先端にノズルがあり,液室内の圧力波が作用することで,吐出空間(空気)に液滴を吐出する.
・吐出空間,ノズル,液室を軸対称2次元(2D)で計算する.右図のように楔形の領域を計算対象とする.計算領域は5つのブロックからなり,図のように各点に番号をつける.
・実際のディメンジョンと分割数を以下のように想定します.
(注意:座標軸と点の位置が実際と対応していないので後日修正)
・各点の座標を計算しておきます.ここは面倒なので後で自動計算する方法を紹介します.
・5つのブロックを構成する点をピックアップします.
・境界(boundary)を定義します.
・front と backを構成する面を定義しておきます.front はz座標が負,backは正とします.
・axis, atmosphere, walls, inlet を定義します.
3 blockMeshDictの修正
・system\blockMeshDict を開く .
・数値の単位をµm ( 1e-6 ) にする .
・頂点の座標を設定します.
・5つのブロックの頂点6つ,分割数を設定します.
・境界(boundary)を定義します.
・blockMeshDictは以下のようになります.自分で考えて入力するのが面倒だったらコピー&ペーストしましょう.
convertToMeters 1e-6;
vertices (
( 0 0 0)
( 0 300 0)
(10 0 -0.4366)
(10 300 -0.4366)
(40 0 -1.7464)
(40 300 -1.7464)
(10 0 0.4366)
(10 300 0.4366)
(40 0 -1.7464)
(40 300 -1.7464)
(0 -50 0)
(10 -50 -0.4366)
(10 -50 0.4366)
(100 -50 -4.366)
(100 -50 4.366)
( 0 -150 0)
( 10 -150 -0.4366)
( 10 -150 0.4366)
( 100 -150 -4.366)
( 100 -150 4.366)
);
blocks (
hex (0 2 3 1 0 6 7 1) (10 150 1) simpleGrading (1 1 1)
hex (2 4 5 3 6 8 9 7) (30 150 1) simpleGrading (1 1 1)
hex (10 11 2 0 10 12 6 0) (10 25 1) simpleGrading (1 1 1)
hex (15 16 11 10 15 17 12 10) (10 50 1) simpleGrading (1 1 1)
hex (16 18 13 11 17 19 14 12) (90 50 1) simpleGrading (1 1 1)
);
boundary (
inlet { type patch; faces ( (15 16 17 15) (16 18 19 17) ); }
atmosphere { type patch; faces ( (1 7 3 1) (7 9 5 3) (9 8 4 5) ); }
walls { type wall; faces ( (2 4 8 6) (2 6 12 11) (12 14 13 11) (14 19 18 13) ); }
front { type wedge; faces ( (1 3 2 0) (3 5 4 2) (0 2 11 10) (10 11 16 15) (11 13 18 16) ); }
back { type wedge; faces ( (1 0 6 7) (7 6 8 9) (0 10 12 6) (10 15 17 12) (12 17 19 14) ); }
axis { type empty; faces ( (0 1 1 0) (10 0 0 10) (15 10 10 15) ); }
);
・blockMeshを実行すると,膨大なワーニングがでる.
数分かかる?我慢する・・・ ・
実は controlDict で以下に設定するとこのワーニングは消える.
writePrecision 10;
・ End で終わればOK
・paraFoam でメッシュ確認.全体が均一なメッシュで分割されていればOK.マウスで視点を変えて,楔形になっていることも確認すること.
3 境界条件設定
・alpha.water.orig が 0フォルダの外にでていることを確認. 0フォルダには aloha.water.orig がなくてIJejectの直下にあること.こうなっていないとparaviewで0フォルダのVOF値がうまく表示されない.
・alpha.water.orig を開き,以下の3つの境界があることを確認する. capillaryRise2Dのチュートリアルからもってきていればあるはず. なければ以下をコピー&ペーストする.
front { type wedge; }
back { type wedge; }
axis { type empty; }
・接触角(theta0)を45度にする.
walls {
type contactAngle;
theta0 45;
limit gradient;
value uniform 0;
}
・0\p_rghファイルを開き,front, back, axisの境界があることを確認する. capillaryRise2Dのチュートリアルからもってきていればあるはず. なければalpha.water.orig からコピー&ペーストする.
・0\p_rghファイルの inlet 境界を対称境界(zeroGradient)にする.
inlet {
// type fixedValue;
// value uniform 0;
type zeroGradient;
}
・0\Uのファイルを開き,front, back, axisの境界があることを確認する. capillaryRise2Dのチュートリアルからもってきていればあるはず. なければalpha.water.orig からコピー&ペーストする.
・inlet 境界を以下に修正
inlet {
// type pressureInletOutletVelocity;
type fixedValue;
value uniform (0 0.1 0);
}
4 流体設定
・setFieldsDict を開き以下に修正
regions (
boxToCell {
box (0 -1 -1) (1 0 1);
fieldValues ( volScalarFieldValue alpha.water 1 );
}
);
5 初期化
・ ./Allclean を実行
・paraFoamでメッシュ,VOF値を確認 Skip Zero Time のチェックを外さないとVOF値は見えないので注意.
6 物性値設定
・constant\phaseProperties を開き以下に修正する.単位は[N/m]=[kg m/s2 /m]=[kg/s2].
phases (water air);
sigma 0.05;
・physicalProperties.waterを開き以下に修正する.値は動粘度 [m2/s] なので注意.
viscosityModel constant;
nu 5e-06;
rho 1000;
7 計算条件設定
・controlDict を開き,以下に修正
application foamRun;
solver incompressibleVoF;
//startFrom startTime;
startFrom latestTime;
startTime 0;
stopAt endTime;
endTime 50e-6;
deltaT 1e-6;
writeControl adjustableRunTime;
writeInterval 2e-6;
purgeWrite 0;
writeFormat ascii;
・foamRunを実行する 計算が終わったらparaFoamで確認.以下のようにノズルから液柱が吐出していればOK.一定速度のインクが流入しているので,液滴にならず液柱として吐出している. 次は液滴が形成できるように境界条件を変更しよう.
8 切断波形を設定
・0\Uを開きinletを以下のように修正する.
inlet {
// type pressureInletOutletVelocity;
// type fixedValue;
// value uniform (0 0.1 0);
type uniformFixedValue;
uniformValue table
(
(0 (0 0.1 0))
(10e-6 (0 0.1 0))
(11e-6 (0 -0.1 0))
(20e-6 (0 -0.025 0))
(30e-6 (0 0 0))
(50e-6 (0 0 0)) );
value uniform (0 0 0);
}
・foamRun 実行
・paraFoam で結果確認.今度は液滴が切断される.
9 圧力境界条件で液滴切断
・どのくらいの圧力で吐出しているのだろう? 圧力(p_rgh)色分け表示で だいたいの圧力を見積もると,3e5 [Pa] 以上の圧力がかかっていることがわかる.この圧力を境界条件に設定して吐出させてみよう.
・Uの境界条件変更 pressureInletOutletVelocity に戻す
inlet {
type pressureInletOutletVelocity;
value uniform (0 0 0);
}
・p_rghの境界条件を変更 する.
inlet {
// type fixedValue;
// value uniform 0;
// type zeroGradient;
type uniformFixedValue;
uniformValue table
(
(0 4e5)
(10e-6 4e5)
(11e-6 -8e4)
(30e-6 0e4)
(50e-6 0e5)
);
value uniform 0;
}
・./Allclean foamRun で計算実行し,paraFoam で結果確認する.以下のように吐出すればOK.
10 パラメータスタディー
・ノズルやヘッドの形状を色々変えて吐出への影響をみてみよう.
★裏技
●blockMeshの座標を自動的に計算する方法
形状を変えるたびに座標を計算するのが大変なので,点情報を自動的に算出するように変更する.
convertToMeters 1.0e-6;
x_air 40.0; // air field radius
y_air 300.0; // air field length
x_nozzle 10.0; //
nozzle radius y_nozzle 50.0; // nozzle length
x_cavity 100.0; // cavity radius
y_cavity 150.0; // cavity length
//----- Don't change below
theta 2.5;
z_air_p #calc " $x_air *sin(degToRad($theta))";
z_air_n #neg $z_air_p;
z_nozzle_p #calc " $x_nozzle*sin(degToRad($theta))";
z_nozzle_n #neg $z_nozzle_p;
z_cavity_p #calc " $x_cavity*sin(degToRad($theta))";
z_cavity_n #neg $z_cavity_p;
y_nozzle_n #neg $y_nozzle;
y_cavity_n #neg $y_cavity;
vertices (
( 0 0 0) //0
( 0 $y_air 0) //1
($x_nozzle 0 $z_nozzle_n) //2
($x_nozzle $y_air $z_nozzle_n) //3
($x_air 0 $z_air_n) //4
($x_air $y_air $z_air_n) //5
($x_nozzle 0 $z_nozzle_p) //6
($x_nozzle $y_air $z_nozzle_p) //7
($x_air 0 $z_air_p) //8
($x_air $y_air $z_air_p) //9
(0 $y_nozzle_n 0) //10
($x_nozzle $y_nozzle_n $z_nozzle_n) //11
($x_nozzle $y_nozzle_n $z_nozzle_p) //12
($x_cavity $y_nozzle_n $z_cavity_n) //13
($x_cavity $y_nozzle_n $z_cavity_p) //14
( 0 $y_cavity_n 0) //15
($x_nozzle $y_cavity_n $z_nozzle_n) //16
($x_nozzle $y_cavity_n $z_nozzle_p) //17
($x_cavity $y_cavity_n $z_cavity_n) //18
($x_cavity $y_cavity_n $z_cavity_p) //19
);
11 3次元表示
・せっかくなので3Dで迫力ある動画をつくってみよう.
・まずSliceでZ軸を通る断面を作成する
・TransformでX軸回り90度回転させる.
・Contourでalpha=0.5の境界線を作成し,RotationalExtrusionで360度回転させると立体になる.
・もう一回 foam を読み込んで,壁だけ表示させて・・・ TransformでX軸回り90度回転 RotationalExtrusion で360度回転 壁を半透明にしてインクをマゼンタ色にすると こんな絵もできる.動画にすると素敵💛.
・お疲れ様でした.
0コメント