インクジェット吐出計算-その1(blueCFD-core2024)

日本画像学会で毎年開催しているインクジェットシミュレーション (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コメント

  • 1000 / 1000