粒子投入設定

2011年11月11日

はじめに

粒子投入 (injection) の設定について。

使用バージョン

OpenFOAM 2.0.1

使用ソルバー

icoUncoupledKinematicParcelFoam

粒子投入設定

粒子投入設定は constant/kinematicCloudProperties で行う。このファイル名はソルバーによって異なるが、似たような名前 (たとえば reactingParcelFoam ならば reactingCloud1Properties ) になっており、中身も似ている。

ここでは「粒子」と書いているが、正確には "parcel" で、これは "particle" (粒子) の集合として考えられている。粒子のようにふるまうが、粒子そのものというよりは粒子集合の代表粒子といったものである。

粒子投入のモデル

粒子投入モデルには次のようなものがある。

  • patchInjection
  • kinematicLookupTableInjection
  • manualInjection

patchInjection

パッチから粒子を飛ばす。パッチに接するセル中心から粒子が投入される。設定は次のように行う。

subModels
{
    ...

    injectionModel patchInjection;

    ...

    patchInjectionCoeffs
    {
        massTotal       0.01;
        SOI             0;
        parcelBasisType mass;
        patchName       in;
        duration        1;
        parcelsPerSecond 100;
        U0              ( 0 -1 0 );
        flowRateProfile constant 1;
        sizeDistribution
        {
            type        fixedValue;
            fixedValueDistribution
            {
                value   1e-3;
            }
        }
    }

patchName が patchInjection 特有のパラメタで、パッチの名前を指定する。その他の設定は以下の通り。

  • massTotal : 投入する全質量。他の設定によっては無視される。
  • SOI : Start Of Injection。投入開始時刻。
  • parcelBasisType : 粒子投入タイプ。後述。
  • duration : 投入継続時間。つまり、SOI から duration の間で粒子が投入される。
  • parcelsPerSecond : 1 秒に投入する粒子数。
  • U0 : 粒子の初速。
  • flowRateProfile : よくわからない (たぶん patchInjection 用パラメタ)。
  • sizeDistribution : 粒子径。後述。

kinematicLookupTableInjection

テーブルで粒子投入条件を指定する。

subModels
{
    ...

    injectionModel kinematicLookupTableInjection;

    ...

    kinematicLookupTableInjectionCoeffs
    {
        massTotal       0;
        SOI             0;
        parcelBasisType fixed;
        nParticle       1;
        inputFile       "parcelInjectionProperties";
        duration        1;
        parcelsPerSecond 100;
    }

inputFile で粒子投入条件が書かれたファイル名を指定している。このファイルは次のようになっている。

FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    location    "constant";
    object      scalarListList;
}

// (x y z) (u v w) d rho mDot
(
    (0.025 0.075 0.005) (0 0 0) 1e-3 964 1
    (0.05  0.075 0.005) (0 0 0) 1e-3 964 1
    (0.075 0.075 0.005) (0 0 0) 1e-3 964 1
);

コメントにあるように、1 行に粒子投入位置、初期速度、径、密度、質量流量 (?) を指定する。mDot を 0 にすると粒子が出なくなる。また、mDot を変えても粒子の流入質量に影響を与えないように見える。

ここでの parcelsPerSecond は、投入位置 1 つあたりの値である。parcelsPerSecond が 100 で粒子投入位置が 3 つあれば、1 秒間で 300 個の粒子が投入されることになる。

1 時間ステップあたりに投入される粒子数が粒子投入位置の数と同じになるように時間刻みを調整しないと、粒子投入位置が偏る (最初の投入位置ばかりから出たりする)。言い換えると、1 時間ステップあたりに各粒子投入位置から粒子がちょうど 1 個出てくるようにする。つまり 時間刻みに parcelPerSecond の逆数を設定する。

粒子投入条件テーブルの作成

粒子投入条件テーブルを作成するには、次のような Python スクリプトを用意すると楽である。

#!/usr/bin/python
# create parcel injections

from random import random

# input start
minx = 0
maxx = 0.05
miny = 0.075
maxy = 0.075
minz = 0
maxz = 0.1

nx = 3 
ny = 1
nz = 1

turbdx = 1e-4
turbdy = 0
turbdz = 0

d = 1e-3
v = (0, -1, 0)
rho = 964
mdot = 1
# input end


rangex = maxx - minx
rangey = maxy - miny
rangez = maxz - minz

dx = rangex/(nx + 1)
dy = rangey/(ny + 1)
dz = rangez/(nz + 1)

for i in range(0, nx):
  for j in range(0, ny):
    for k in range(0, nz):
      x = minx + dx*(i + 1) + turbdx*random()
      y = miny + dy*(j + 1) + turbdy*random()
      z = minz + dz*(k + 1) + turbdz*random()
      print "(%f %f %f) (%f %f %f) %e %f %e" % ¥
        (x, y, z, v[0], v[1], v[2], d, rho, mdot)

これは格子状に粒子投入位置を作成する。乱数で位置をずらして不整を作っている。

入力値

  • minx, maxx : X 範囲
  • minx, maxy : Y 範囲
  • minz, maxz : Z 範囲
  • nx, ny, nz : X, Y, Z 方向点数
  • turbdx, turbdy, turbdz : 位置の最大不整量
  • d, v, rho, mdot : 粒子条件

manualInjection

粒子の配置を指定する。

subModels
{
    ...

    injectionModel manualInjection;

    ...

    manualInjectionCoeffs
    {
        massTotal       0;
  SOI             0;
        parcelBasisType fixed;
        nParticle       1;
        positionsFile   "kinematicCloudPositions";
        U0              ( 0 0 0 );
        sizeDistribution
        {
            type        fixedValue;
            fixedValueDistribution
            {
                value   1e-3;
            }
        }
    }

positionFile で粒子位置を記述したファイルの名前を指定する。このファイルは次のようになっている。

FoamFile
{
    version     2.0;
    format      ascii;
    class       vectorField;
    object      kinematicCloudPositions;
}

(
(0.025  0.075 0.005)
(0.05   0.075 0.005)
(0.075  0.075 0.005)
)

これは粒子を直接配置するものである。kinematicLookupTableInjection のように粒子をどんどん投入するようなことはできない。

粒子位置ファイルの作成

kinematicLookupTableInjection の粒子投入条件テーブル作成スクリプトを改造して使えばよい。

粒子投入のタイプ

上記設定において、parcelBasisType で次のような粒子投入のタイプを指定できる。

  • mass
  • fixed

mass

質量ベース。粒子をすべて入れ終わる (SOI から during だけ時間が経過する) と、投入質量は massTotal で指定したものに一致する。粒子個数は parcelsPerSecond の値で決まるが、それでなぜ質量が massTotal になるかというと、代表粒子 (parcel) に含まれる粒子 (particle) の個数が調整されるからである。

fixed

代表粒子 (parcel) に含まれる粒子 (particle) の個数が固定される。パラメタ nParticle で particle の数を指定する。ふつう nParticle は 1 に設定されるが、この場合は parcel = particle となり、見たまんまとなる。DEM 解析で使われる。massTotal は無視され、投入質量は入れた分で計算される。

粒径分布 のタイプ

粒径分布指定 sizeDistribution には次のようなタイプがある。

  • fixedValue
  • general
  • RosinRammler

fixedValue

粒径固定。

  sizeDistribution
        {
            type        fixedValue;
            fixedValueDistribution
            {
                value   1e-3;
            }
        }

general

粒径ごとに質量分率 (%) を指定する (たぶん)。

        sizeDistribution
        {
            type        general;
            generalDistribution
            {
                distribution
                (
                    (10e-06      0.0025)
                    (15e-06      0.0528)
                    (20e-06      0.2795)
                    (25e-06      1.0918)
                    (30e-06      2.3988)
                    (35e-06      4.4227)
                    (40e-06      6.3888)
                    (45e-06      8.6721)
                    (50e-06      10.3153)
                    (55e-06      11.6259)
                    (60e-06      12.0030)
                    (65e-06      10.4175)
                    (70e-06      10.8427)
                    (75e-06      8.0016)
                    (80e-06      6.1333)
                    (85e-06      3.8827)
                    (90e-06      3.4688)
                );
            }
        }

RosinRammler

Rosin-Rammler 分布。

  sizeDistribution
  {
      type        RosinRammler;
      RosinRammlerDistribution
      {
          minValue        5e-06;
          maxValue        0.000565;
          d               4.8e-05;
          n               0.5;
      }
  }