🧙‍♂️

Salome:任意の密度関数で不均一なメッシュを切る

2022/11/08に公開

1.概要

本記事は図1-1のようなメッシュをSalome-Meca(ver.2021)で作成したときの記録です.図1-1では密度関数(Density Function)を指定し,その密度関数に従って不均一なメッシュを作っています.以前書いた記事参考[1])ではPartitionで区切って不均一メッシュを作成する方法を紹介しましたが,Partiton分けが少し面倒でした.


図1-1. 密度関数を使用した不均一メッシュの完成イメージ

密度関数を使う方法だとPartition分けがいらないので色んな種類の不均一メッシュを作りたいときに便利です.なお,図1-1ではメッシュの不均一性を分かりやすくするために,密度関数としてf(t)={\rm exp}(-3t)を採用していますが,この記事ではf(t)=-t^{0.1}+1のような密度関数を例に説明を進めていきます.今回も下記のようなメッシュを作りたいものとします.

  • なるべく6面体でメッシュを作りたい.
  • 円柱表面のメッシュを細かく作りたい.

また,密度関数(Density Function)の仕様などは公式ヘルプから見られます.ネット上からだとこちらから見られますが(参考[2]),少しversionが古いです.新しいversionのヘルプもネット上のどこかに多分ありますが,どこにあるか探してません.Salome-Mecaを既に持っている人はhelpボタンを押せば,自分が使っているversionでほぼ同じ情報が見られます.後述しますが,密度関数には高校で習うような初等関数(log, exp, sin, tのべき乗, 絶対値関数など)であれば指定できることを確認しました.

2.Geometry作成

まずはGeometryモジュールでメッシュを切る対象の形状を作ります.今回は半径が50,高さが300の円柱を例に説明します.2-2節で面グループを作っていますが,この面グループはMeshモジュールで,押し出しでメッシュ作成をするときに使用します.

2-1.Geometry作成

半径が50,高さが300の円柱を作る手順および設定は下記です(図2-1).

  • Geometryモジュールに入る
  • Create a cylinderをクリック
  • Nameを入力:今回はCylinder(Nameは任意)
  • Radiusを入力:今回は50
  • Heightを入力:今回は300


図2-1. 円柱の作成

2-2.Face Group作成

押し出しメッシュを作るときに使用する面グループを作ります.円柱の上面と底面のどちらでも良いですが,今回は円柱上面のグループを作成し,そのグループに名前を付けます.手順および設定は下記です(図2-2).

  • グループを作る形状を選択:今回はCylinderを選択
  • 右クリックからCreate Groupを選択
  • Shape Type:Faceを選択
  • 今回作るGroupにNameを付ける:今回はtop_faceとする(Nameは任意)
  • Main Shapeにグループを作る形状(Cylinder)が選択されていることを確認
  • 円柱上部表面を選択してAddする


図2-2. Face Groupの作成

3.Mesh作成

今回は2Dメッシュを押し出すことで全体のメッシュを作成します.2Dメッシュはサブメッシュとして作成します.親となるメッシュで押し出しでメッシュ作成することを指定します(Extrusion 3D).下記の順番で設定およびメッシュの計算(作成)をします.

  • 親メッシュの設定:押し出しでメッシュ作成することを指定(Extrusion 3D)
  • サブメッシュの設定:密度関数を指定する(Distribution with analytic density)
  • メッシュの計算(作成):サブメッシュ→親メッシュの順に計算(作成)

今回は円柱を下記のように分割することを目標にします.メッシュの完成図は図3-1です.

  • 高さ方向に10分割(等間隔に分割):親メッシュで指定
  • 半径方向に25分割(密度関数で不均一分割):サブメッシュで指定
  • 周方向に40分割(等間隔に分割):サブメッシュで指定


図3-1. メッシュの完成図

3-1.親メッシュの設定

親となるメッシュで押し出しでメッシュを作ることを指定します.「3D」と「1D」の設定をします.「3D」で押し出しでメッシュを作成することを指定し(図3-2),「1D」で高さ方向の分割について指定します(図3-3).手順および設定は下記です.

  • Meshモジュールに入る

  • メッシュを切る対象を選択:今回はCylinderを選択

  • Create Meshを選択

  • 親メッシュにNameを付ける:今回はMesh_allとする(Nameは任意)

  • Geometryにメッシュを切る対象(今回はCylinder)が選択されていることを確認

  • 「3D」の設定をしていることを確認

  • AlgorithmはExtrusion 3Dを選択(押し出しでメッシュすることを指定している)

    図3-2. 親メッシュの設定(押し出しでメッシュの指定):「3D」の設定

  • 「3D」の設定から「1D」の設定に移る

  • 選択しているGeometryが変わっていないことを確認(今回はCylinder)

  • AlgorithmはWire Discretisationを選択

  • 歯車マークからNumber of Segmentsを選択

  • 「分割を指定する設定」にNameを付ける:今回はheight_numberとする(Nameは任意)

  • Number of Segmentsで高さ方向の分割数を指定:今回は10とする

    図3-3. 親メッシュの設定(高さ方向の分割数指定):「1D」の設定

3-2.サブメッシュの設定

次はサブメッシュの設定をします.サブメッシュは円柱上部の円形表面に対して作成します.この円形表面には,Geometryモジュールで「top_face」というNameを付けています.この2Dのサブメッシュの設定で,半径方向の分割数と円周方向の分割数を指定します.半径方向の分割には密度関数を使用して不均一な分割を行い,円周方向の分割は等間隔にします.半径方向の分割は「2D」で指定し(図3-4, 3-5, 3-6),円周方向の分割は「1D」で指定します(図3-7).手順および設定は下記です.

  • 親メッシュを選択:今回はMesh_allを選択

  • 右クリックからCreate Sub-meshを選択

  • 作成するSub-meshにNameを付ける:今回はmesh_top_faceとする(Nameは任意)

  • Geometryは円柱上部表面の面グループを選択:今回はtop_faceを選択

  • 「2D」の設定をしていることを確認

  • AlgorithmはRadial Quadrangle 1D-2Dを選択(円形形状に対し4角形メッシュが優先的に作成される)

  • 歯車マークからDistribution of Layersを選択

    図3-4. サブメッシュの設定(半径方向の分割):「2D」の設定

  • 「半径方向の分割を指定する設定」にNameを付ける:今回はradial_numberとする(Nameは任意)

  • 1D HypothesisのChange TypeからNumber of Segmentsを選択

  • Number of Segmentsで半径方向の分割数を指定:今回は25分割する

  • Type of distributionからDistribution with analytic densityを選択

    図3-5. サブメッシュの設定(半径方向の分割):「2D」の設定,分割タイプの選択

  • 密度関数を指定する:今回はf(t)=-t^{0.1}+1とする

  • Conversion modeでCut negativeが選択されていることを確認

    図3-6. サブメッシュの設定(半径方向の分割):「2D」の設定,密度関数の指定

  • 「2D」の設定から「1D」の設定に移る
  • Name, Mesh, Geometryが「2D」の設定をしていた時から変わっていないことを確認
  • AlgorithmはWire Discretisationを選択
  • 歯車マークからNumber of Segmentsを選択
  • 「周方向の分割を指定する設定」にNameを付ける:今回はcircumference_numberとする(Nameは任意)
  • Number of Segmentsで周方向の分割数を指定:今回は40分割する

    図3-7. サブメッシュの設定(周方向の分割):「1D」の設定

3-3.メッシュの計算(作成)

親メッシュとサブメッシュの設定が終わったのでメッシュの計算(作成)をします.サブメッシュ→親メッシュの順にメッシュを作成していきます.まずはサブメッシュの作成からです.サブメッシュの作成手順は下記です(図3-12).図3-12のように周方向の分割は等間隔に40分割され,半径方向の分割は密度関数に従い不均一なメッシュで25分割されます.

  • サブメッシュを選択:今回の場合はmesh_top_faceを選択
  • 右クリックからCompute Sub-meshを選択


図3-12. サブメッシュの計算(作成)手順

次は親メッシュを計算(作成)します.親メッシュの作成手順は下記です(図3-13).図3-13のように高さ方向に10層のメッシュが押し出されて作成されます.

  • 親メッシュを選択:今回の場合はMesh_allを選択
  • 右クリックからComputeを選択

    図3-13. 親メッシュの計算(作成)手順

4.おまけ

ここでは下記3点を実施します.必要に応じて実施してください.

  • 全ての要素を2次要素化
  • 作成したメッシュ情報の確認
  • メッシュのエキスポート

まずは全ての要素を2次要素化します.今回の手順で作成したメッシュは全て1次要素になります.すべての要素を2次要素に変換するための手順は下記です(図4-1).

  • 親メッシュを選択:今回の場合はMesh_allを選択
  • 右クリックからConvert to/from quadraticを選択
  • Mesh or Sub-meshに変換したいメッシュが選択されていることを確認:今回の場合はMesh_allが選択されていることを確認
  • Convert to quadraticを選択


図4-1. 1次要素から2次要素へ変換するための手順

次は作成したメッシュ情報を確認します.そのための手順は下記です(図4-2).全節点は43,021個,全要素は10,000個,6面体2次要素が9,600個,プリズム2次要素が400個作成されていることが分かります.

  • 親メッシュを選択:今回の場合はMesh_allを選択
  • 右クリックからMesh Informationを選択

    図4-2. メッシュ情報の確認

最後は作成したメッシュのエキスポートです.今回作ったメッシュを他のCAEソフト等で使用したい場合になどに実施します.今回はunv形式でメッシュをエキスポートします.そのための手順は下記です(図4-3).

  • 親メッシュを選択:今回の場合はMesh_allを選択
  • 右クリックからExport → UNV fileを選択
  • エキスポートするファイルのディレクトリを選択
  • エキスポートするファイルのファイル名を入力


図4-3. メッシュのエキスポート(unv形式)

感想

そういえばAbaqusのメッシャーで密度関数に応じた不均一なメッシュを作れたな,ということを思い出し,Salome-Mecaにも同様の機能があるはずだと思い色々設定を探していたらやっぱりあった.本格的にSalome-Mecaを使い始めて2週間くらいだが,まだまだ知らない便利な機能がありそうだ.便利機能をみつけたら,使い方を忘れないうちに,その都度記録していこうと思う.

環境

・Salome-Meca(ver.2021), Salome(ver.9.7.0)
・Windows 10 Home

参考

[1]. Salome:円柱の外側と内側でメッシュサイズを変える(6面体)
[2]. 1D Meshing Hypotheses: Arbitrary distribution --> Distribution with Analytic Density (Salome Platform Documentation)

Discussion