Yamamoto's Laboratory
 
メッシュ生成
 Netgen
 
 
定常伝熱問題
 
その他
 
 
研究内容 有限要素法 メッシュ生成::Netgen

メッシュ生成Netgen3-D finite element mesh generator

有限要素法に使うメッシュジェネレーター Netgen のインストールと使い方を説明します.

目次


はじめに

有限要素法 (FIM: Finite Element Method) のプログラム作成で,最も面倒なのはメッシュ生成の部分です.以前は自分でメッシュ生成のプログラムも書いていましたが,しばらくプログラム作成に離れると,メッシュ生成のソースコードの修正が面倒になりました.そんな折,急ぎで有限要素法のプログラムの作成が必要となりました.「自作するかフリーのプログラム使うか?」選択に迫られました.時間は1日,フリーのプログラムを使うことに決定.

ネットで調べたところ,(1) NETGEN – automatic mesh generator,(2) Triangle (A Two-Dimensional Quality Mesh Generator and Delaunay Triangulator) が良さそうです.

インストール

Linux

私の ubuntu 14.04 には,Joachim Schöberl/ngsolve-docu の installdebian に従い Netgen と NGSolve をインストールしました.もし,Netgen のみであれば,「sudo apt-get install netgen」でインストールできます.

  1. gcc の準備: 以下のコマンドを順番に実行します.
    $ sudo apt-add-repository ppa:ubuntu-toolchain-r/test
    $ sudo apt-get update
    $ sudo apt-get install gcc-4.9 g++-4.9
  2. Netgen と NGSolve のインストール: 以下のコマンドを順番に実行します.
    $ sudo apt-add-repository universe
    $ sudo apt-add-repository "deb http://asc.tuwien.ac.at/~mhochsteger/ubuntu `lsb_release -sc`_`dpkg --print-architecture`/"
    $ sudo apt-get update
    $ sudo apt-get install netgen ngsolve

Windows

Windows へのインストールは,結構問題があります.私は上手くどうさせることができていません.

とりあえず実行してみよう

Tutorial on Using NGSpy にあるサンプルファイルを使い Netgen/NGSolve の実行の確認をしましょう.

解くべき問題 (ラプラス方程式)

1と式(\ref{eq:laplace})–(\ref{eq:G2})に,解くべき問題の領域及び境界条件を示します.二次元ラプラス方程式を特問題です.

\begin{align} -\nabla\cdot(\varepsilon\nabla u)&=0 &&\text{on}\,\Omega \label{eq:laplace}\\ \cfrac{\partial u}{\partial\vm{n}}&=0 &&\text{on}\,\Gamma_0 \label{eq:G0}\\ u&=1 &&\text{on}\,\Gamma_1 \label{eq:G1}\\ u&=0 &&\text{on}\,\Gamma_2 \label{eq:G2} \end{align}

ここで,\(u\)はポテンシャル (電圧です).内部には二つの電極があり,それぞれ 1 [V] と 0 [V] の電位が与えられています.比誘電率 (\(\varepsilon\)) が 1 と 10 と異なる領域に分かれています.計算領域の外周では,電場の法線成分がゼロという境界条件が課せられています.このような条件で,ポテンシャル \(u\) を計算せよ — というのが問題です.

問題の設定
図1: 問題の設定

メッシュ生成

実行

先に示したポテンシャルを有限要素法で計算します.そのためには,最初にメッシュ生成を行わたくてあなりません.ここでは,Netgen を使いメッシュを生成します.手順は,以下のとおりです.

  1. Tutorial on Using NGSpy にある 5 Files for download の ファイル「circleplate.in2d」(リスト1)を,適当なディレクトリーにダウンロードします.
  2. Netgen を起動します.
    $ netgen
  3. Netgen (NGSolve) のメニューの File > Load Geometry を選択します.すると,形状を示すファイルの入力が求められるので,ダウンロードしたファイル「circleplate.in2d」を指定します.
  4. 次に,メニューの Mesh > Generate Mesh を選択します.すると,三角形メッシュで計算領域が分割されます (図2).
  5. 作成されたメッシュを保存します.メニューの File > Save Mesh を選択します.そして,ファイ名「circleplate.vol.gz」で保存します.

以上で,メッシュの生成は完了です.Netgen はそのまま (停止しないで) ,次のラプラス方程式の有限要素法の計算を行います.

Netgen によるメッシュ生成
図2: Netgen によるメッシュ生成

インプットファイル

蛇足ですが,インプットファイルの文法について簡単に説明します.

メッシュを生成する Netgen の入力ファイル

001   # FILE NAME: circleplate.in2d.  (Geometry for electrostatics problem.)
002   
003   # keyword for 2D geometry, version 2
004   splinecurves2dv2
005   
006   # a global grading factor
007   2
008   
009   
010   #          +-------------------------------------------+ (2,2)
011   #          |11                                        10 |
012   #          |       Subdomain 1                         |
013   #          |                                           |
014   #          |                                           |
015   #          |                                           |
016   #          |                                           |
017   #          |                4   3   2                  |
018   #          |                   ---      Disk of radius |
019   #          |                5(  o  )1   0.25 centered  |
020   #          |                   ---      at o=origin    |
021   #          |12              6   7   8                9 |
022   #          +-------------------------------------------+ (2,-0.35)
023   #          |         15 +----------------+ (0.5,-0.5)  |
024   #          |            +----------------+ (0.5,-0.6)  |
025   #          |         16                  13            |
026   #          |                                           |
027   #          |                                           |
028   #          |                                           |
029   #          |17     Subdomain 2                      18 |
030   #          +-------------------------------------------+ (2,-2)
031   #     (-2,-2)
032   
033   
034   
035   
036   points
037   # FORMAT FOR THIS SECTION:
038   #  <pn>   <px>    <py>  -maxh=<ph>
039   #                                    <pn> = point number
040   #                                    <px> = x coordinate
041   #                                    <py> = y coordinate
042   #                                    <ph> = local mesh size
043   1   +0.25   +0.00
044   2   +0.25   +0.25
045   3   +0.00   +0.25
046   4   -0.25   +0.25
047   5   -0.25   +0.00
048   6   -0.25   -0.25
049   7   +0.00   -0.25
050   8   +0.25   -0.25
051   9   +2.00   -0.35
052   10  +2.00   +2.00
053   11  -2.00   +2.00
054   12  -2.00   -0.35
055   13  +0.50   -0.60
056   14  +0.50   -0.50
057   15  -0.50   -0.50
058   16  -0.50   -0.60
059   17  -2.00   -2.00
060   18  +2.00   -2.00
061   
062   segments
063   # FORMAT FOR THIS SECTION:
064   #
065   # <ml>  <mr>  <nc>     <p1>    <p2>    <p3>     -bc=<en>   -maxh=<eh>
066   #
067   # Curved or straight segments, either on boundary,
068   # or on material interfaces, are defined by two or more control points, using:
069   #          <p1> : starting point of the segment
070   #    <p2>, <p3> : if <p3> is omitted,
071   #                         then <p2> is endpoint of a straight segment,
072   #                 if <p3> is included,
073   #                         then <p2> is middle control point where tangents
074   #                         of the curved segment at <p1> and <p3> meet.
075   #          <ml> : number of left material when traversing segment
076   #                 starting  from <p1>. (Note that region outside meshing
077   #                 domain has material number  0.)
078   #          <mr> : number of material on the right.
079   #      -bc=<en> : boundary condition number on this segment.
080   #    -maxh=<eh> : local mesh size near this segment.
081   #
082   #
083   # <ml>  <mr>  <nc>  <p1>  <p2>  <p3>  -bc=<en>  -maxh=<eh>
084   #
085   0   1   3   1   2   3   -bc=1       -maxh=0.05
086   0   1   3   3   4   5   -bc=1       -maxh=0.05
087   0   1   3   5   6   7   -bc=1       -maxh=0.05
088   0   1   3   7   8   1   -bc=1       -maxh=0.05
089   1   0   2   9   10
090   1   0   2   10  11
091   1   0   2   11  12
092   1   2   2   12  9
093   0   2   2   13  14      -bc=2       -maxh=0.05
094   0   2   2   14  15      -bc=2       -maxh=0.05
095   0   2   2   15  16      -bc=2       -maxh=0.05
096   0   2   2   16  13      -bc=2   
097   2   0   2   17  18
098   2   0   2   18  9
099   2   0   2   12  17
100   
101   materials
102   1   upper   -maxh=0.3
103   2   lower   -maxh=0.3
  • splinecurves2dv2” describes this file as a 2D spline geometry file

有限要素法の計算

実行

  1. Tutorial on Using NGSpy にある 5 Files for download の ファイル「circleplate.pde」を,先ほどのファイル (circleplate.in2d, circleplate.vol.gz) のあるディレクトリーにダウンロードします.
  2. Netgen (NGSolve) のメニューの Solve > Load PDE を選択します.すると,形状を示すファイルの入力が求められるので,ダウンロードしたファイル「circleplate.pde」を指定します.
  3. そして,メニューの Solve > Solve PDE を選択します.そして,有限要素法の計算が実行され,ポテンシャルの図が表示されます(図3).
NGSolve ラプラス方程式の計算
図3: NGSolve ラプラス方程式の計算

インプットファイル

蛇足ですが,インプットファイルの文法について簡単に説明します.

\begin{align} \int_\Omega\varepsilon\nabla U\cdot\nabla v\,\diff V+\int_{\partial \Omega}\alpha uv\,\diff s=\int_\Omega fv\,\diff V \label{eq:MWR} \end{align}

有限要素法の計算を行う NGSolve の入力ファイル

001   geometry = circleplate.in2d
002   mesh =  circleplate.vol.gz
003   
004   fespace V -type=h1ho -order=2 -dirichlet=[1,2]
005   
006   coefficient dielectric
007   1.0, 10.0
008   
009   bilinearform a -fespace=V -symmetric
010   laplace dielectric
011   
012   linearform f -fespace=V
013   source (0.0)
014   
015   coefficient extendone
016   1.0, 0.0
017   
018   gridfunction ue -fespace=V 
019   
020   numproc setvalues n1 -gridfunction=ue -coefficient=extendone -boundary
021   
022   # see the extension
023   
024   numproc bvp n2 -bilinearform=a -linearform=f -gridfunction=ue -solver=direct
025   
026   numproc drawflux np2 -bilinearform=a -solution=ue -label=flux -applyd
027   
028   numproc visualization npv1 -scalarfunction=ue -subdivision=2 -nolineartexture

インプットファイルの各行の意味は,以下のとおりです.

  • 001行目: 計算領域の幾何形状を表すファイル指定です.
  • 002行目: Netgen で作成したメッシュのデータファイル指定です.
  • 004行目: この行で有限要素空間 (Finite Element Spaces) を定義しています.有限要素空間の定義は,「fespace <name> <flaglist>」です.この行の「V」は有限要素空間の名前を表します.フラグ「-type=h1ho」は任意オーダーの連続要素を表してます.「-order=2」は要素を二次の多項式で近似,「-dirichlet=[1,2]」は幾何形状を表すインプットファイルのセグメントの境界条件が「-bc=1」と「-bc=2」をディレクレ条件にします.
  • 006007行目: 係数 dielectric を定義します.領域 \(\Omega_1\) と \(\Omega_2\) の誘電率です.
  • 009010行目: 双線型形式 (bilinear form) を定義します.式(\ref{eq:MWR})の左辺です.その定義は,「bilinearform <name> <flaglist>」と記述します.そして,integrator が続きます.この行の「a」は名前を表します.フラグ「-fespace=V」は有限要素空間を決めています.フラグ「-symmetric」は,双線型形式が対称 (下三角行列) を示しています.次の行で,双線形形式の積分 (integrator) を決めます.「laplace dielectric」は,\(\int_\Omega \varepsilon\nabla u\cdot \nabla v\diff V\)です.これは式(\ref{eq:MWR})の左辺第一項です.第二項は次の行に「robin alpha」と記述することで,反映できます.ここでは記述されていませんので,ゼロ(?)となります.
  • 012013行目: 線形汎関数? (linear form) を定義します.式(\ref{eq:MWR})の右辺です.その定義は,「linearform <name> <flaglist>」と記述します.そして,integrator が続きます.この行の「f」は名前を表します.フラグ「-fespace=V」は有限要素空間を決めています.次の行で,線形汎関数の積分 (integrator) を決めます.「source (0.0)」は,\(\int_\Omega fv\diff V\)です.「0.0」は係数を表します.
  • 015016行目: 係数 extendone を定義します.「1.0, 0.0」は,境界 \(\Gamma_1\) と \(\Gamma_2\) のポテンシャルです.

二次元のメッシュ生成

有限要素フラグ

フラグ 有限要素空間
フラグ無し アイテムに対する説明
アイテム アイテムに対する説明

ページ作成情報

参考資料

  1. 最初に,NETGEN のホームページを見ることを勧めます.
  2. インストールは,「installdebian」を参考にしました.
  3. Tutorial on Using NGSpy にあるファイルを使いました.
  4. NETGEN/NGSolve Manualは,2D/3D の形状の入力と NGSolve を使った計算の参考になります.
  5. NGSolve の文法については,NGSolve - 3D Finite Element Solveronline manual が参考になります.
  6. Netgen/NGSolve: Mesh Generator and Finite Element Solverは,処理の流れを分かりやすく解説しています.

更新履歴

2016年06月02日 ページの新規作成


no counter