• 検索結果がありません。

controlDict, fvScheme, fvSolutionの設定について

N/A
N/A
Protected

Academic year: 2021

シェア "controlDict, fvScheme, fvSolutionの設定について"

Copied!
19
0
0

読み込み中.... (全文を見る)

全文

(1)

メッシュ生成用STL ファイルの

自前での作成方法について

一関高専・若嶋振一郎([email protected])

事例報告 ※ 「自前で」とありますが、サーフェスをメッシュ分割するアルゴリズム(Delaunay分割など)に ついては含んでいません。STLの記述についてのお話です。

(2)

OpenFOAMにおけるメッシュ生成方法

1.

まずはともあれ“blockMesh”コマンドを使いこなそう!

• 最近multi gradingを搭載したので使いやすくなりました • 派生として“extBlockMesh”・・・メッシュスムージング+Objファイルへのプロジェク ション機能

2.

市販・フリーメッシャーから出力もしくはネイティブフォーマットを変換

• ICEM CFD • Pointwise/gridgen • Netgen • enGrid :

3. フリー3D-CAD(アカデミック)>STL出力>sHM/cfMesh

• STLファイルの品質が重要

(3)

STLファイルとは?

STL=“Stereolithography ”

三次元形状を小さな三角形の集合体(ポリゴン)として表現

• 色やトポロジーデータなどは表現不可

• カーブ形状などの表現不可(微小三角形平面で近似)

→ 曲面(曲率半径大)では十分な解像度の三角形を出力する

• データ構造が簡単で3Dプリンタ用データなどによく用いられる

ASCII形式・・・・可読性あり、データ量多、読み込み遅

Binary形式・・・可読性なし、データ量少、読み込み早

たいていの3D-CAD・CGには出力機能あり

OpenFOAMではsHMやcfMeshのメッシュ生成用データとして利用

(4)

STLファイルの例

3Dモデル STL形式出力 STLファイルの中身(ASCII)

solid Part1

facet normal -5.000000e-001 8.660254e-001 0.000000e+000 outer loop

vertex 0.000000e+000 8.660254e+000 5.000000e+000 vertex 5.000000e+000 1.154701e+001 5.000000e+000 vertex 0.000000e+000 8.660254e+000 -1.734723e-015 endloop

endfacet :

facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 outer loop

vertex 1.000000e+001 2.886751e+000 0.000000e+000 vertex 5.000000e+000 1.154701e+001 0.000000e+000 vertex 1.000000e+001 8.660254e+000 0.000000e+000 endloop endfacet endsolid 1個1個の三角形パッチは Facetと呼ばれる 1つの物体はsolidと呼ばれる

(5)

STLファイルの基本構造(ASCII形式)

solid

NAME

facet normal

nx ny nz

outer loop

vertex v0x v0y v0z

vertex v1x v1y v1z

vertex v2x v2y v1z

endloop

endfacet

:

endsolid

solid ブロック名 三角形(facet)の単位法線ベクトル(表) 三角形(facet)を形成する3つの点の座標 ※ 右ねじ回りに指定 ※ 法線ベクトルや座標はe表記法(例:1.000000e+01 )で表記 ※ 改行コードはCR+LFが無難? (nx ny nz) (v0x v0y v0z) (v1x v1y v1z) (v2x v2y v2z)

(6)

STLファイルの基本構造(BINARY形式)

参考:http://www.fabbers.com/tech/STL_Format ヘッダー部(任意文字列) facetの数 facetの数分だけのデータを繰り返す - facetの単位法線ベクトル3成分 - 節点1の座標3成分 - 節点2の座標3成分 - 節点3の座標3成分 - 2byte分の追加データ(通常は0埋め) この部分に色情報を埋め込んだ color STL 形式というものもある。

(7)

CFD(OpenFOAM)用に用いるSTLファイルの注意点

単位系

STLファイルで用いる数値は単位系が記述されていないので、[mm]なのか[m]なの か[inch]なのか、間違いやすいため注意が必要です

三角形ポリゴンで囲まれた空間の表面・裏面の統一

三角形パッチの節点の並び方(右ねじ)と、法線の指定の仕方に矛盾があると、 メッシュ生成ができないことがあります(反転ポリゴン)

三角形ポリゴン同士の干渉・不整合・低品質

あるポリゴンが他のポリゴンとクロスしている場合(ポリゴンの交差) あるポリゴンの節点が他のポリゴンの節点と同じ値を持つ場合(ポリゴンの重複) ポリゴンによって空間が閉じられていない場合(ポリゴンの欠落) ポリゴン座標データに同じものが入っている(点ポリゴン、線ポリゴン) 微小・鋭角三角形 目視での確認・修正は非常に困難 (とくに複雑形状になればなるほど) 3D-CAD/modeler ソフトで再作成 (ヒーリングツール) 修正ツールを利用

(8)

STLファイルの修正ツール

• MeshLab( http://meshlab.sourceforge.net/ )

• MeshMagic( http://www.nchsoftware.com/meshmagic3d/ )

• MiniMagics(http://www.vector.co.jp/soft/winnt/business/se453733.html)

・・・非OSSで要登録。エラーチェック機能のみ?

• netfabb basic(http://www.3ds.co.jp/netfabb/index.htm)

• OpenSTL(http://sourceforge.net/projects/openstl/)

・・・Viewer機能のみ?

など

※ 有償Softwareは高機能な分、高価(O(10~100)万円)

※ OpenFOAMにもSTL関係のUtility(surface mesh tools)が存在

→ http://cfd.direct/openfoam/user-guide/standard-utilities/

surfaceCheck, surfaceClean, surfaceMeshConvert , ……….

(9)

STLファイルの作成法(python)

• 構造が分かれば,ASCIIでファイルを作成を作成可能

• pythonでのSTL出力パッケージが多数存在

• pythonでの点列計算→STL出力→sHM/cfMesh→OpenFOAM solverの自動化 • https://github.com/telefab/ImageExtruder/blob/master/photomaton/stl_writer.py #!/usr/bin/env python # coding:utf-8

# Purpose: Export 3D objects, build of faces with 3 or 4 vertices, as ASCII or Binary STL file. # License: MIT License

# http://code.activestate.com/recipes/578246/

import struct

ASCII_FACET = """facet normal 0 0 0 outer loop

vertex {face[0][0]:.4f} {face[0][1]:.4f} {face[0][2]:.4f} vertex {face[1][0]:.4f} {face[1][1]:.4f} {face[1][2]:.4f} vertex {face[2][0]:.4f} {face[2][1]:.4f} {face[2][2]:.4f} endloop endfacet """ BINARY_HEADER ="80sI" BINARY_FACET = "12fH" facetのNormal Vectorを 別に計算する必要があるため そのあたりも追記して改造した サンプルを公開します (@勉強会HP?)

(10)

(cont.)

class ASCIISTLWriter:

""" Export 3D objects build of 3 or 4 vertices as ASCII STL file.

"""

def __init__(self, stream):

self.fp = stream self._write_header() def _write_header(self): self.fp.write("solid python¥n") def close(self): self.fp.write("endsolid python¥n")

def _write(self, face):

self.fp.write(ASCII_FACET.format(face=face))

def _split(self, face):

p1, p2, p3, p4 = face

return (p1, p2, p3), (p3, p4, p1)

def add_face(self, face):

""" Add one face with 3 or 4 vertices. """ if len(face) == 4:

face1, face2 = self._split(face) self._write(face1)

self._write(face2) elif len(face) == 3:

self._write(face) else:

raise ValueError('only 3 or 4 vertices for each face')

def add_faces(self, faces):

""" Add many faces. """ for face in faces:

self.add_face(face) 入出力ストリームの初期化 (ファイルストリーム) ヘッダー出力(solid名は決め打ち) STLファイル終了 Facetデータ出力 四角形を三角形に分割 facet追加 Facet複数追加

(11)

(cont.)

class BinarySTLWriter(ASCIISTLWriter): """

Export 3D objects build of 3 or 4 vertices as binary STL file. """

def __init__(self, stream): self.counter = 0 super(Binary_STL_Writer, self).__init__(stream) def close(self): self._write_header() def _write_header(self): self.fp.seek(0)

self.fp.write(struct.pack(BINARY_HEADER, b'Python Binary STL Writer', self.counter))

def _write(self, face): self.counter += 1 data = [

0., 0., 0.,

face[0][0], face[0][1], face[0][2], face[1][0], face[1][1], face[1][2], face[2][0], face[2][1], face[2][2], 0 ] self.fp.write(struct.pack(BINARY_FACET, *data)) 入出力ストリームの初期化 (ファイルストリーム) ヘッダー出力 STLファイル終了 Facetデータ出力

(12)

Appendix: MeshLabによるSTLデータ修正

• 公開3D STLデータの例 Honda NSX Consept( http://www.honda-3d.com/ )

• nsx_concept_LOW.stl

(13)

Close Holes

• Filters → Remeshing,simpl・・・ → Close Holes

• 欠落したfaceを再構成

修正後

欠損したface

修正前

(14)

Mesh reduction

• Filters → Remeshing,simpl・・・ → QuadricEdgeCollapseDecimation

• Target number of facesを修正(もしくはpercentage of reduction)

• Preserve boundary of the meshにチェックをいれる

(15)

Mesh subdivision

• Filters → Remeshing,simpl・・・ → Subdivision Surfaces: midpoint

• Face edgeの中点を使ってメッシュを細分化

(16)

Mesh smoothing

• Filters → Smoothing,Fairing・・・ → Laplacian smooth (surface preserving)

• ラプラス方程式を用いたメッシュスムージング

(17)

そのほかの修正コマンド

Non manifoldなメッシュの除去

• Filters -> Cleaning and Repairing -> Remove Non Manifold Faces • Filters -> Cleaning and Repairing -> Remove Non Manifold Vertices 法線ベクトルの裏表の整列

• Filters->Normals, Curvatures and Orientation->Re-Orient All Faces Coherently メッシュの粗粒化(形状変更を伴うことが多い)

• Filters -> Rendering, simplification and reconstruction -> Quadric Edge Collapse Decimation

(18)

Manifold conditions

① Each edge is incident to only one or two faces

② The faces incident to a vertex form a closed or an open fan

このようなメッシュ(黄色)は”Non-Manifold mesh”となり,しばしばエラーになります.

(19)

参考文献/URL

− http://www-bl20.spring8.or.jp/~sp8ct/tmp/stl.pdf

− http://www.fabbers.com/tech/STL_Format

− http://www.hiramine.com/programming/3dmodelfileformat/stlfileformat.html

− https://ja.wikipedia.org/wiki/Standard_Triangulated_Language

次回は、STLファイルを使ってsHMもしくはcfMeshによるメッシュ生成や 境界生成(autoPatchコマンドなど)のまとめについてお話しする予定です。

参照

関連したドキュメント

これはつまり十進法ではなく、一進法を用いて自然数を表記するということである。とは いえ数が大きくなると見にくくなるので、.. 0, 1,

1 単元について 【単元観】 本単元では,積極的に「好きなもの」につ

【その他の意見】 ・安心して使用できる。

能率競争の確保 競争者の競争単位としての存立の確保について︑述べる︒

単に,南北を指す磁石くらいはあったのではないかと思

都調査において、稲わら等のバイオ燃焼については、検出された元素数が少なか

自分ではおかしいと思って も、「自分の体は汚れてい るのではないか」「ひどい ことを周りの人にしたので

  NACCS を利用している事業者が 49%、 netNACCS と併用している事業者が 35%おり、 NACCS の利用者は 84%に達している。netNACCS の利用者は netNACCS