Fluidity を使ってみる

2013年11月2日

はじめに

Fluidity を使ってみる。

バージョン

Fluidity 4.1.103

ファイル

問題

キャビティ問題を解く。モデルは 0.1 x 0.1 x 0.01 の直方体モデルで、3 次元モデルとして作るが 2 次元的に解く。上面 x 方向速度を 1 m/s とし、側面は non slip、奥行き両面は z 方向速度 0 とする。動粘性係数は 0.01 とする。時間刻みは 0.005 s とし、0.5 s まで計算する。

メッシュの作成

Gmsh でモデルを作る。

cavity.geo

Point(1) = {0, 0, 0, 1.0};
Point(2) = {0.1, 0, 0, 1.0};
Point(3) = {0.1, 0.1, 0, 1.0};
Point(4) = {0, 0.1, 0, 1.0};

Line(1) = {1, 2};
Line(2) = {2, 3};
Line(3) = {3, 4};
Line(4) = {4, 1};

Line Loop(5) = {1, 2, 3, 4};
Plane Surface(6) = {5};

Extrude {0, 0, 0.01} {
  Surface{6};
}

Physical Surface(29) = {23};
Physical Surface(30) = {27, 15, 19};
Physical Surface(31) = {28, 6};
Physical Volume(32) = {1};

Mesh.CharacteristicLengthMin = 0.;
Mesh.CharacteristicLengthMax = 5e-3;

メッシュの作成。

$ gmsh -3 -optimize cavity.geo

ケースの設定

diamond を起動。

$ diamond

以下のように設定。

  • fluidity_options
    • simulation_name : cavity
    • problem_type : fluids
    • geometry
      • dimension : 3
      • mesh
        • from_file : cavity
          • format(gmsh)
      • mesh(VelocityMesh)
        • from_mesh
          • mesh(CoordinateMesh)
      • mesh(PressureMesh)
        • from_mesh
          • mesh(CoordinateMesh)
      • quadrature
          degree : 3
    • io
      • dump_period
        • constant : 0.1
    • timestepping
      • current_time : 0
      • timestep : 0.005
      • finish_time : 0.5
      • nonlinear_iterations : 2
    • material_phase : fluid
      • equation_of_state
        • fluids
          • linear
            • reference_density : 1
      • scalar_field(Pressure)
        • prognostic
          • reference_node : 1
          • scheme
            • poisson_pressure_solution : only first timestep
          • solver
            • preconditioner(mg)
            • relative_error : 1e-6
            • max_iterations : 1000
      • scalar_field(Density)
      • vector_field(Velocity)
        • prognostic
          • spatial_discretisation
            • continuous_galerkin
              • mass_terms
                • lump_mass_matrix
            • conservative_advection : 0
          • temporal_discretisation
            • theta : 0.5
            • relaxation : 0.5
          • solver
            • iterative_method(gmres)
              • restart : 30
            • relative_error : 1e-6
            • max_iterations : 1000
          • initial_conditions(WholeMesh)
            • constant 0 0 0
          • boundary_conditions : move_wall
            • surface_ids : 29
            • type(dirichlet)
              • align_bc_with_cartesian
                • x_component
                  • constant : 1
                • y_component
                  • constant : 0
                • z_component
                  • constant : 0
          • boundary_conditions : side_wall
            • surface_ids : 30
            • type(dirichlet)
              • align_bc_with_cartesian
                • x_component
                  • constant : 0
                • y_component
                  • constant : 0
                • z_component
                  • constant : 0
          • boundary_conditions : front_and_back
            • surface_ids : 31
            • type(dirichlet)
              • z_component
                • constant : 0
      • tensor_field(Viscosity)
        • prescribed
          • value(WholeMesh)
            • isotropic
              • consant : 0.01

cavity.flml として保存する。

実行

ここでは 2 ケース計算を実行するために、実行用ディレクトリを作る。

$ mkdir case1
$ cd case1
$ ln -s ../cavity.flml
$ ln -s ../cavity.msh

実行。

$ fluidity -v2 -l cavity.flml &

オプション "-v2" は表示の詳細レベルの指定、"-l" はログを書き出すことを指示する。ログは "fluidity.log-0"、"fluidity.err-0" などといった名前で書き出される。

計算結果を見るには、ParaView で "cavity_*.vtu" ファイルを開く。

比較のため、OpenFOAM の icoFoam による結果を示す。

並列計算

並列計算を行うには、まず領域分割を行う (ここでは 2 並列)。

$ mpirun -np 2 flredecomp -i 1 -o 2 cavity cavity_decomp

cavity_decomp.flml というファイルができる。

実行。

$ mpirun -np 2 fluidity -v2 -l cavity_decomp.flml

計算結果を見るには、ParaView で "cavity_*.pvtu" ファイルを開く。