ToBoundaryMesh[r]
境界のElementMeshオブジェクトを領域 r の境界から生成する.
ToBoundaryMesh[r,{{xmin,xmax},…}]
境界ボックス
に制約された領域 r の境界から境界のElementMeshオブジェクトを生成する.
ToBoundaryMesh[rules]
座標と境界要素を指定する rules の集合から境界のElementMeshオブジェクトを生成する.
ToBoundaryMesh[emesh]
既存のElementMesh,MeshRegion,BoundaryMeshRegionのいずれかから,新しい境界のElementMeshオブジェクトを生成する.
ToBoundaryMesh
ToBoundaryMesh[r]
境界のElementMeshオブジェクトを領域 r の境界から生成する.
ToBoundaryMesh[r,{{xmin,xmax},…}]
境界ボックス
に制約された領域 r の境界から境界のElementMeshオブジェクトを生成する.
ToBoundaryMesh[rules]
座標と境界要素を指定する rules の集合から境界のElementMeshオブジェクトを生成する.
ToBoundaryMesh[emesh]
既存のElementMesh,MeshRegion,BoundaryMeshRegionのいずれかから,新しい境界のElementMeshオブジェクトを生成する.
詳細とオプション
- ToBoundaryMesh[r]は,記号的である可能性のある領域 r の境界を近似する境界のElementMeshオブジェクトを生成する.境界ElementMeshでは,"MeshElements"はAutomaticに設定され,ToElementMeshを使って計算することができる.
- 領域の指定には,幾何学領域とImplicitRegionによって説明されるオブジェクトを含む.
- 領域 r は,ConstantRegionQがTrueを与える定数領域でなければならない.
- ToBoundaryMesh[rules]では,rules は以下の順序で与えられなければならない.
-
"Coordinates"->{c1,c2,…} 座標が c1,c2,…になるように指定する必要がある "BoundaryElements"->{b1,…} メッシュの境界要素が b1,…になるように指定する必要がある "PointElements"->{p1,…} メッシュの点要素が p1,…になるように指定する(必須ではない) - 1D境界要素メッシュでは,"BoundaryElements"はPointElementである.
- 2D境界要素メッシュでは,"BoundaryElements"はLineElementである.
- 3D境界要素メッシュでは,"BoundaryElements"はTriangleElementでもQuadElementでもよい.
- ToBoundaryMesh[emesh]を使って,さまざまな方法で,境界の抽出やマーカーの追加も含めて,ElementMeshオブジェクトemesh を修正することができる.
- ToBoundaryMeshには次のオプションがある.
-
AccuracyGoal Infinity 目標確度の桁数 "BoundaryGroupingThreshold" Automatic 法線の方向で境界のグループ分けを制御する "BoundaryMarkerFunction" None 境界要素のマーカーを計算する関数 "BoundaryMeshGenerator" Automatic 境界のElementMeshを生成する関数 "CheckIntersections" Automatic 交差する境界の検定を制御する "DeleteDuplicateCoordinates" True 重複する座標を削除する "IncludePoints" {} 境界の一部として含まれ,考慮される点 "MaxBoundaryCellMeasure" Automatic 境界要素のサイズを制御する MaxCellMeasure Automatic メッシュ要素のサイズを制御する "MeshOrder" Automatic 要素メッシュの次数 "MessageHead" Automatic メッセージ用のシンボル "PointMarkerFunction" None 点要素のマーカーを計算する関数 PrecisionGoal Automatic 目標精度の桁数 "RegionHoles" Automatic 領域の穴を指定する - MaxCellMeasure->m では,領域次元 d で作成されたセルの大きさは最高でも m である.d-1次元の境界表現セルの大きさは,デフォルトで大きさが m の高品質の d 次元のセルと互換性があるものが選ばれる.特定次元の限度は,MaxCellMeasure->{"Volume"->v,"Area"->a,"Length"->l}を使って指定することができる.
- AccuracyGoal->a と PrecisionGoal->p では,領域 r あるいは離散化された領域 dreg と,RegionSymmetricDifference[r,dreg]内の任意の点との間の最大距離が,
より小さくなるように保とうとされる.この場合,
は境界ボックスの対角の長さである. - オプションの1つをToBoundaryMeshに指定することで,さまざまな方法で,ToBoundaryMesh[bmesh,opts]あるいはToBoundaryMesh[emesh,opts]を使って,境界のElementMeshオブジェクト bmesh を修正するか,完全なElementMeshオブジェクト emesh から境界を抽出するかすることができる.
- ToBoundaryMeshがElementMeshを生成できない場合には,$Failedが返される.
- EmptyRegionに対してToBoundaryMeshを呼び出すと,EmptyRegionが返される.
- ToBoundaryMeshに与えられるオプションは,"MeshOptions"を指定することによってNDSolveに与えることができる. »
- NDSolveおよび関連の関数からToBoundaryMeshのオプションを設定することについては,有限要素のためのNDSolveオプションに説明がある.
例題
すべて開く すべて閉じる例 (4)
<<NDSolve`FEM`Diskの境界要素メッシュを作成する:
bmesh = ToBoundaryMesh[Disk[]]bmesh["Wireframe"]ToElementMesh[bmesh]["Wireframe"]DiskとRectangleの和集合の境界メッシュを作成する:
ToBoundaryMesh[RegionUnion[Disk[], Rectangle[{0, 0}, {2, 2}]]]%["Wireframe"]明示的に境界要素を指定することによって境界メッシュを作成する:
bmesh = ToBoundaryMesh[
"Coordinates" -> {{0., 0.}, {1., 0.}, {1., 0.2}, {1., 1.}, {0., 1.}, {0., 0.22}, {0.3, 0.22}, {0.3, 0.2}, {0., 0.2}},
"BoundaryElements" -> {LineElement[{{1, 2}, {2, 3}, {3, 4}, {4, 5}, {5, 6}, {6, 7}, {7, 8}, {8, 9}, {9, 1}, {3, 8}}]}
]bmesh["Wireframe"]境界メッシュから完全な要素メッシュを作成し,結果の要素メッシュを可視化する:
ToElementMesh[bmesh]["Wireframe"]ToBoundaryMesh[Cylinder[]]["Wireframe"]スコープ (15)
Diskの境界メッシュを生成する:
ToBoundaryMesh[Disk[]]["Wireframe"]ImplicitRegionを明示的な境界ボックスで変換する:
ToBoundaryMesh[ImplicitRegion[x < y ^ 2, {x, y}], {{-1 / 2, 1}, {-1, 1}}]["Wireframe"]GraphicsComplexを境界要素メッシュに変換する:
ToBoundaryMesh[DiscretizeGraphics[GraphicsComplex[{{0, 0}, {1, 0}, {2, 2}, {0, 1}}, Polygon[{1, 2, 3, 4}]]]]["Wireframe"]TransformedRegionを境界要素メッシュに変換する:
ToBoundaryMesh[TransformedRegion[Disk[{1, 1}, 4], {Indexed[#, 1] Indexed[#, 2], Indexed[#, 1] + Indexed[#, 2]}&]]["Wireframe"]3DのBallを境界要素メッシュに変換する:
ToBoundaryMesh[Ball[{0, 0, 0}, 1]]%["Wireframe"]3DのGraphicsComplexを境界要素メッシュに変換する:
ToBoundaryMesh[DiscretizeGraphics[GraphicsComplex[{{0, 0, 0}, {20, 0, 0}, {20, 2, 0}, {0, 2, 0}, {0, 0, 1}, {20, 0, 1}, {20, 2, 1}, {0, 2, 1}}, Polygon[{{4, 1, 5, 8}, {2, 3, 7, 6}, {1, 2, 3, 4}, {5, 6, 7, 8}, {1, 2, 6, 5}, {3, 4, 8, 7}}]]]]["Wireframe"]3DのTransformedRegionを境界要素メッシュに変換する:
ToBoundaryMesh[TransformedRegion[Cuboid[], ShearingTransform[30Degree, {1, 0, 0}, {0, 1, 1}]]]["Wireframe"]境界要素メッシュを,4つの座標と1つの境界要素から作成する:
ToBoundaryMesh["Coordinates" -> {{0., 0.}, {1., 0.}, {1., 1.}, {0., 1.}}, "BoundaryElements" -> {LineElement[{{1, 2}, {2, 3}, {3, 4}, {4, 1}}]}]%["Wireframe"]点集合については,ToBoundaryMeshは凸包を返す:
ToBoundaryMesh["Coordinates" -> RandomReal[{-1, 1}, {10, 2}]]["Wireframe"]1Dの点要素の境界メッシュ (2)
ToBoundaryMesh["Coordinates" -> {{0.}, {1.}}, "BoundaryElements" -> {PointElement[{{1}, {2}}]}, "MeshOrder" -> 1]%["Wireframe"]ToBoundaryMesh[ImplicitRegion[(x < -5) || (-1 ≤ x ≤ 1) || (x > 5), {x}], {{-10, 10}}]%["Wireframe"]2Dの線分要素の境界メッシュ (1)
領域の中に追加のノードがある,線分要素の境界メッシュを作成する:
bmesh = ToBoundaryMesh["Coordinates" -> {{1.293, 0.228}, {1., 0.}, {0.94, 0.342}, {1.293, 0.}, {1.215, 0.442}, {2., 0.}, {1.879, 0.684}}, "BoundaryElements" -> {LineElement[{{3, 2}, {2, 4}, {4, 6}, {6, 7}, {7, 5}, {5, 3}}]}]Show[bmesh["Wireframe"], bmesh["Wireframe"["MeshElement" -> "PointElements"]]]2Dの高次の境界要素メッシュ (1)
bmesh = ToBoundaryMesh["Coordinates" -> {{0., 0.}, {1., 0.}, {2., 0.}, {2.5, 0.5}, {0., 1.}, {3., 1.}, {2.5, 1.5}, {0., 2.}, {1., 2.}, {2., 2.}, {0., 0.5}, {0., 1.5}, {0.5, 0.}, {0.5, 2.}, {1.5, 0.}, {1.5, 2.}, {2.25, 0.25}, {2.25, 1.75}, {2.75, 0.75}, {2.75, 1.25}}, "BoundaryElements" -> {LineElement[{{3, 4, 17}, {4, 6, 19}, {7, 10, 18}, {6, 7, 20}, {1, 2, 13}, {5, 1, 11}, {2, 3, 15}, {9, 8, 14}, {8, 5, 12}, {10, 9, 16}}]}]Show[bmesh["Wireframe"],
bmesh["Wireframe"["MeshElement" -> "PointElements", "MeshElementStyle" -> Directive[Red, PointSize[0.02]], "MeshElementIDStyle" -> Blue]]]境界マーカー (1)
境界マーカーは,領域境界上でNeumannValueを指定するのに便利であり,「要素メッシュの生成」の「マーカー」セクションに詳しく説明されている.
境界要素マーカーと領域内に1つの追加のノードを含んだ矩形を作成する:
boundaryMarker = {1, 1, 2, 2, 3, 3, 4, 4}bcEle = {LineElement[{{1, 2}, {2, 3}, {3, 6}, {6, 9}, {9, 8}, {8, 7}, {7, 4}, {4, 1}}, boundaryMarker]}bmesh = ToBoundaryMesh["Coordinates" -> {{0., 0.}, {1., 0.}, {2., 0.}, {0., 1.}, {1., 1.}, {2., 1.}, {0., 2.}, {1., 2.}, {2., 2.}}, "BoundaryElements" -> bcEle]Show[
bmesh["Wireframe"["MeshElement" -> "BoundaryElements", "MeshElementMarkerStyle" -> Red]],
bmesh["Wireframe"["MeshElement" -> "PointElements", "MeshElementStyle" -> Directive[PointSize[0.02]],
"MeshElementIDStyle" -> Blue
]]]点マーカー (1)
点マーカーは,領域境界上でDirichletConditionを指定するのに便利であり,「要素メッシュの生成」の「マーカー」セクションに詳しく説明されている.
マーカー付きの境界要素と点要素,および領域内に1つの追加のノードを含む矩形を作成する:
pointMarkers = {1, 1, 1, 4, 0, 2, 3, 3, 3};
pEle = {PointElement[{{1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}}, pointMarkers]}bmesh = ToBoundaryMesh["Coordinates" -> {{0., 0.}, {1., 0.}, {2., 0.}, {0., 1.}, {1., 1.}, {2., 1.}, {0., 2.}, {1., 2.}, {2., 2.}}, "BoundaryElements" -> {LineElement[{{1, 2}, {2, 3}, {3, 6}, {6, 9}, {9, 8}, {8, 7}, {7, 4}, {4, 1}}]}, "PointElements" -> pEle]ノード番号を青で,マーカーを赤で示し,境界メッシュ内の点要素を可視化する:
Show[
bmesh["Wireframe"],
bmesh["Wireframe"["MeshElement" -> "PointElements", "MeshElementMarkerStyle" -> Red]],
bmesh["Wireframe"["MeshElement" -> "PointElements", "MeshElementStyle" -> Directive[PointSize[0.02]],
"MeshElementIDStyle" -> Blue
]]]オプション (27)
"AccuracyGoal" (1)
bem = ToBoundaryMesh[Disk[], AccuracyGoal -> 2];
bem["Wireframe"]centroid = Compile[{{coords, _Real, 2}, {inci, _Integer, 1}}, Total[coords[[inci]]] / 2, RuntimeAttributes -> Listable];ListPlot[Map[{ArcTan@@#, Norm[#] - 1}&, centroid[bem["Coordinates"], Join@@ElementIncidents[bem["BoundaryElements"]]]]]目標確度を大きくすると,より多くの点を使うことによってエラーが減る:
bem = ToBoundaryMesh[Disk[], AccuracyGoal -> 4];
ListPlot[Map[{ArcTan@@#, Norm[#] - 1}&, centroid[bem["Coordinates"], Join@@ElementIncidents[bem["BoundaryElements"]]]]]"BoundaryGroupingThreashold" (7)
ToBoundaryMeshは,境界法線ベクトルを比べることによって,隣接する境界セグメントのグループに自動的にマーカーを割り当てる.
nr = ToNumericalRegion[ImplicitRegion[And@@(# ≤ 0& /@ {-y, 1 / 25 - (-3 / 2 + x) ^ 2 - y ^ 2, 1 - x ^ 2 - y ^ 2, -4 + x ^ 2 + y ^ 2, (-x + 2 * y) / Sqrt[5]}), {x, y}], {{0.8, 2.2}, {-0.2, 1.}}];bmesh = ToBoundaryMesh[nr];groups = bmesh["BoundaryElementMarkerUnion"]bmesh["Wireframe"["MeshElementStyle" -> "BoundaryGrouping"]]bmesh["Wireframe"[Or@@(ElementMarker == #& /@ {2, 4})]]groups = bmesh["PointElementMarkerUnion"]temp = Most[Range[0, 1, 1 / (Length[groups])]];
colors = ColorData["BrightBands"][#]& /@ tempbmesh["Wireframe"["MeshElement" -> "PointElements", "MeshElementStyle" -> (Directive /@ colors)]]NDSolveValueでの境界条件を指定するために要素マーカーを使用する:
mesh = ToElementMesh[nr];
ufun = NDSolveValue[{Laplacian[u[x, y], {x, y}] == 1, DirichletCondition[u[x, y] == 1, Or@@(ElementMarker == #& /@ {2, 4})]}, u, {x, y}∈mesh];NeumannValueとPeriodicBoundaryConditionが境界要素マーカーを抽出するのに対し,DirichletConditionは点の要素マーカーを抽出する.
ContourPlot[ufun[x, y], {x, y}∈mesh]点の要素マーカー(赤)は,境界マーカー(青)から推測される.ノードの接続された境界要素マーカーが同じである場合には,ノードは同じマーカーを持つ.コーナー部分では,通常接続された境界マーカーは異なり,使用可能なマーカーに対して任意の選択がなされる:
bmesh = ToBoundaryMesh[Rectangle[], "MaxCellMeasure" -> 0.25];
Show[bmesh["Wireframe"], bmesh["Wireframe"["MeshElement" -> "BoundaryElements", "MeshElementMarkerStyle" -> Blue]], bmesh["Wireframe"["MeshElement" -> "PointElements", "MeshElementMarkerStyle" -> Red]]]どのマーカーがコーナーのノードに割り当てられるかを制御するために,"PointMarkerFunction"を指定することができる.次の例では,左側のノードはすべて2のマーカーになり,右側は4のマーカーになる.残りのマーカーは,自動的に計算されるものが使われる.
pointMarkerFunction = Compile[{{coords, _Real, 2}, {pMarker, _Integer, 1}}, MapThread[Which[#[[1]] == 0., 2, #[[1]] == 1., 4, True, #2]&, {coords, pMarker}]];
bmesh = ToBoundaryMesh[Rectangle[], "PointMarkerFunction" -> pointMarkerFunction, "MaxCellMeasure" -> 0.25];
Show[bmesh["Wireframe"],
bmesh["Wireframe"["MeshElement" -> "BoundaryElements", "MeshElementMarkerStyle" -> Blue]], bmesh["Wireframe"["MeshElement" -> "PointElements", "MeshElementMarkerStyle" -> Red]]]bmesh = ToBoundaryMesh[Rectangle[], "BoundaryGroupingThreshold" -> None]bmesh["BoundaryElementMarkerUnion"]自動の境界のグループ分けは,境界セグメントの法線を計算してから,隣接するセグメントのドット積を計算することにより,隣接する境界セグメントを選ぶ.ドット積が閾値
を超える場合,連続するセグメントは隣接していると見なされる.
閾値が
である場合に境界要素がグループ分けされる粗い境界メッシュを作成する:
bmesh = ToBoundaryMesh[Disk[], AccuracyGoal -> 1, "MaxBoundaryCellMeasure" -> 0.4, "BoundaryGroupingThreshold" -> 0.8]bmesh["BoundaryElementMarkerUnion"]閾値が
である場合に境界要素がグループ分けされる粗い境界メッシュを作成する:
bmesh = ToBoundaryMesh[Disk[], AccuracyGoal -> 1, "MaxBoundaryCellMeasure" -> 0.4, "BoundaryGroupingThreshold" -> 0.95]bmesh["BoundaryElementMarkerUnion"]bmesh = ToBoundaryMesh["Coordinates" -> {{0.}, {1.}, {3.}}, "BoundaryElements" -> {PointElement[{{1}, {3}}], PointElement[{{2}}]}]境界要素には1.0(指数 (index 2)における内部境界が含まれる:
bmesh["BoundaryElements"]bmesh["BoundaryNormals"]bmesh["BoundaryElementMarkerUnion"]離散化されたグラフィックスから3Dの境界要素メッシュを作成する:
gr = ExampleData[{"Geometry3D", "SpaceShuttle"}]
bmesh = ToBoundaryMesh[DiscretizeGraphics[gr]]groups = bmesh["BoundaryElementMarkerUnion"];
temp = Most[Range[0, 1, 1 / (Length[groups])]];
Short[colors = ColorData["BrightBands"][#]& /@ temp]bmesh["Wireframe"["MeshElementStyle" -> (Directive[FaceForm[#], EdgeForm[]]& /@ colors)]]bmesh["Wireframe"[ElementMarker == 1]]Needs["NDSolve`FEM`"]
Manipulate[Show[glider["Wireframe"],
glider["Wireframe"[ElementMarker == m, "MeshElementStyle" -> Directive[FaceForm[colors[[m]]], EdgeForm[]], PlotRange -> glider["Bounds"]]]], {{m, 15}, 1, groups, 1}, Initialization :> (Needs["NDSolve`FEM`"];glider := ToBoundaryMesh[DiscretizeGraphics[ExampleData[{"Geometry3D", "SpaceShuttle"}]]];
groups := Length[glider["BoundaryElementMarkerUnion"]];
colors := ColorData["BrightBands"][#]& /@ Most[Range[0, 1, 1 / groups]];), SaveDefinitions -> True]自動の境界のグループ分けは,数多くのグループを含む複雑な形状においても役に立つことがある.歯車を要素メッシュとしてインポートする:
bmesh = ToBoundaryMesh[Import["http://exampledata.wolfram.com/gear.1", {"STL"}]]bmesh["Wireframe"["MeshElementStyle" -> "BoundaryGrouping"]]"BoundaryMarkerFunction" (1)
境界マーカーは,領域境界上でNeumannValueを指定するのに便利であり,「要素メッシュの生成」の「マーカー」セクションに詳しく説明されている.
以下は,辺要素の座標によって,辺の整数マーカーを計算する関数である:
boundaryMarkerFunction = Compile[{{boundaryElementCoords, _Real, 3}, {pointMarkres, _Integer, 2}},
Module[{pt1 = #[[1]], pt2 = #[[2]]},
Which[
pt1[[1]] > 0.9 && pt2[[1]] > 0.9, 2,
pt1[[1]] < 0.1 && pt2[[1]] < 0.1, 3,
True, 4 ]]& /@ boundaryElementCoords];bmesh = ToBoundaryMesh[FullRegion[2], {{0, 1}, {0, 1}},
"BoundaryMarkerFunction" -> boundaryMarkerFunction,
"MaxBoundaryCellMeasure" -> 0.2
]Show[bmesh["Wireframe"],
bmesh["Wireframe"["MeshElement" -> "BoundaryElements", "MeshElementMarkerStyle" -> Red]]]bmesh["BoundaryElements"]"PointElementMarkers"も計算された場合には,それらは,"BoundaryMarkerFunction"に与えられる関数の第2引数としてアクセス可能である:
"BoundaryMeshGenerator" (8)
"Continuation"メソッドは,多くの場合にコーナー,尖点,急な変化をかなりうまく処理することができる曲線継続法を使う:
ℛ = ImplicitRegion[-1 + 2 x^2 ≤ y ≤ x^2, {{x, -1, 1}, {y, -1, 1}}];ToBoundaryMesh[ℛ, "BoundaryMeshGenerator" -> "Continuation"]["Wireframe"]"RegionPlot"メソッドは,RegionPlotからの出力を改善することに基づいており,より速い場合もある:
ToBoundaryMesh[ℛ, "BoundaryMeshGenerator" -> "RegionPlot"]["Wireframe"]"RegionPlot"メソッドは,境界メッシュの質を改善するサブオプションを持つ:
ℛ = ImplicitRegion[-1 + 2 x^2 ≤ y ≤ x^2, {{x, -1, 1}, {y, -1, 1}}];ToBoundaryMesh[ℛ, "BoundaryMeshGenerator" -> {"RegionPlot", "SamplePoints" -> 41}]["Wireframe"]ToBoundaryMesh[ℛ, "BoundaryMeshGenerator" -> {"RegionPlot", MaxRecursion -> 7}]["Wireframe"]BoundaryDiscretizeRegionの境界メッシュ生成器にメソッドオプションを渡す:
ToBoundaryMesh[ImplicitRegion[{2 Round[x] + y + z ≥ 1}, {x, y, z}], {{-1, 1}, {-1, 1}, {-1, 1}}, "BoundaryMeshGenerator" -> {"BoundaryDiscretizeRegion", Method -> "PostProcessing" -> None}]Ω = RegionDifference[RegionDifference[RegionUnion[Cylinder[{{0, 0, 0}, {0, 0, 10}}, 5], Cylinder[{{0, 0, 5}, {0, -6, 5}}, 3]], Cylinder[{{0, 0, 0}, {0, 0, 10}}, 2]], Cylinder[{{0, 0, 5}, {0, -6, 5}}, 2]];メソッドオプションをBoundaryDiscretizeRegionの境界メッシュ生成器に渡して,離散化アルゴリズムを細かく調整する:
bmesh = ToBoundaryMesh[Ω, "BoundaryMeshGenerator" -> {"BoundaryDiscretizeRegion", Method -> {"MarchingCubes", PlotPoints -> 33}}]MeshRegion[bmesh]"OpenCascade"の境界メッシュ生成器は,GraphicsまたはGraphics3Dのプリミティブからなる2Dまたは3DのBooleanRegion式を扱うのに大変適している.
Ω = RegionDifference[RegionDifference[RegionUnion[Cylinder[{{0, 0, 0}, {0, 0, 10}}, 5], Cylinder[{{0, 0, 5}, {0, -6, 5}}, 3]], Cylinder[{{0, 0, 0}, {0, 0, 10}}, 2]], Cylinder[{{0, 0, 5}, {0, -6, 5}}, 2]];bmesh = ToBoundaryMesh[Ω, "BoundaryMeshGenerator" -> {"OpenCascade"}]groups = bmesh["BoundaryElementMarkerUnion"];
temp = Most[Range[0, 1, 1 / (Length[groups])]];
colors = ColorData["BrightBands"][#]& /@ temp境界マーカーをハイライトした,境界要素メッシュを可視化する:
bmesh["Wireframe"["MeshElementStyle" -> FaceForm /@ colors]]"OpenCascade"の境界メッシュ生成器のオプションは以下の通りである:
"BoundaryMeshGenerator" -> {"OpenCascade", "ShapeSurfaceMeshOptions" -> {"AngularDeflection" -> 0.25, "LinearDeflection" -> 0.005}}境界メッシュ生成のオプションの詳細は,OpenCascadeLinkのチュートリアルの曲面メッシュについてのセクションに記載されている.
DiskとRectangleの結合体に"OpenCascade"の境界メッシュ生成器を使う:
bmesh = ToBoundaryMesh[RegionUnion[Disk[], Rectangle[{0, 0}, {2, 2}]], "BoundaryMeshGenerator" -> {"OpenCascade"}]bmesh["Wireframe"]"OpenCascade"の境界メッシュ生成器は,内部境界と領域の穴を区別することができない:
bmesh = ToBoundaryMesh[RegionDifference[RegionUnion[Disk[], Rectangle[{0, 0}, {2, 2}]], Disk[{1.5, 1.5}, 1 / 5]], "BoundaryMeshGenerator" -> {"OpenCascade"}]bmesh["Wireframe"]完全なメッシュが生成されると,領域全体にメッシュが掛けられる:
ToElementMesh[bmesh]["Wireframe"]"RegionHoles"を設定することで,手作業で領域の穴を指定する:
bmesh = ToBoundaryMesh[RegionDifference[RegionUnion[Disk[], Rectangle[{0, 0}, {2, 2}]], Disk[{1.5, 1.5}, 1 / 5]], "BoundaryMeshGenerator" -> {"OpenCascade"}, "RegionHoles" -> None]完全なメッシュが領域の穴と材料の境界を認識するようになった:
ToElementMesh[bmesh]["Wireframe"]内部境界メッシュ生成器を,カスタムメッシュ生成器に置き換える:
boundaryMeshGenerator[region_, opts : OptionsPattern[]] := Module[{},
Print[region];
ToBoundaryMesh[region]
]ToBoundaryMesh[FullRegion[2], {{0, 1}, {0, 1}}, "BoundaryMeshGenerator" -> boundaryMeshGenerator]Options[boundaryMeshGenerator] = {"MyOption" -> Automatic, MaxCellMeasure -> Automatic};
boundaryMeshGenerator[region_, opts : OptionsPattern[]] := Module[{},
Print[{opts}];
ToBoundaryMesh[region]
]ToBoundaryMesh[FullRegion[2], {{0, 1}, {0, 1}}, "BoundaryMeshGenerator" -> {boundaryMeshGenerator, "MyOption" -> "Test", MaxCellMeasure -> 0.1}]"DeleteDuplicateCoordinates" (2)
一般に,重複する座標を持つメッシュは,メッシュ生成プロセスに予測がきかなくなるため,望ましくない.デフォルトで,重複する座標は削除される:
bm = ToBoundaryMesh["Coordinates" -> {{0, 0}, {1, 0}, {1, 1}, {0, 1}, {0, 0}}, "BoundaryElements" -> {LineElement[{{1, 2}, {2, 3}, {3, 4}, {4, 1}}]}];bm["Coordinates"]bm = ToBoundaryMesh["Coordinates" -> {{0, 0}, {1, 0}, {1, 1}, {0, 1}, {0, 0}}, "BoundaryElements" -> {LineElement[{{1, 2}, {2, 3}, {3, 4}, {4, 1}}]}, "DeleteDuplicateCoordinates" -> False]bm["Coordinates"]重複する座標が削除された場合には,要素のインシデントの指標は付け直されることがある:
bm = ToBoundaryMesh["Coordinates" -> {{0, 0}, {1, 0}, {1, 1}, {0, 1}, {0, 0}}, "BoundaryElements" -> {LineElement[{{1, 2}, {2, 3}, {3, 4}, {4, 5}}]}];bm["BoundaryElements"]"IncludePoints" (1)
nr = ToNumericalRegion[ImplicitRegion[And@@(# ≤ 0& /@ {-y, 1 / 25 - (-3 / 2 + x) ^ 2 - y ^ 2, 1 - x ^ 2 - y ^ 2, -4 + x ^ 2 + y ^ 2, (-x + 2 * y) / Sqrt[5]}), {x, y}], {{0.8, 2.2}, {-0.2, 1.}}];ToBoundaryMesh[nr]["Wireframe"]additionalPoints = DeleteDuplicates[Table[{1.5 + 0.2Sin[ϕ], 0.4 + 0.2Cos[ϕ]}, {ϕ, 0, 2π, π / 25}]];bmesh = ToBoundaryMesh[nr, "IncludePoints" -> additionalPoints];Show[bmesh["Wireframe"],
bmesh["Wireframe"["MeshElement" -> "PointElements"]]
]追加されたこれらの点は,境界の一部として見なされるが,実際の境界上にある必要はない."IncludePoints"では,陰的な領域によって指定された境界上に追加の点を加えることはできないことに注意する.つまり,すべての"IncludePoints"のインスタンスは厳密に境界領域内になければならない.
ToElementMesh[nr]["Wireframe"]"IncludePoints"を使って加えられた点は,DirichletConditionで使える.さらに,DirichletConditionの述部がTrueであれば,境界条件は加えられた点において有効となる.
"MaxBoundaryCellMeasure" (2)
"MaxCellMeasure" (2)
MaxCellMeasure->m で,セルの大きさが選ばれ,境界セルの大きさが埋込み次元内の高品質セルに適切なものに設定される:
bem = ToBoundaryMesh[Disk[], MaxCellMeasure -> .2, AccuracyGoal -> 1];
bem["Wireframe"]em = ToElementMesh[Disk[], MaxCellMeasure -> .2, AccuracyGoal -> 1];
em["Wireframe"]特定の長さは,MaxCellMeasure->{"Length"->len}で指定することができる:
bem = ToBoundaryMesh[Disk[], MaxCellMeasure -> {"Length" -> .05}];
bem["Wireframe"]length = Compile[{{coords, _Real, 2}, {inci, _Integer, 1}},
Block[{p1, p2}, {p1, p2} = coords[[inci]];
Sqrt[Total[(p2 - p1) ^ 2]]], RuntimeAttributes -> Listable];Max[length[bem["Coordinates"], Join@@ElementIncidents[bem["BoundaryElements"]]]]ToElementMesh[bem]["Wireframe"]"MeshOrder" (1)
ToBoundaryMeshはデフォルトで一次境界メッシュを生成する:
bmesh = ToBoundaryMesh[Disk[]]%["MeshOrder"]2π - NIntegrate[1, {x, y}∈bmesh]二次境界メッシュを得るために,オプション"MeshOrder"を使うことができる:
bmesh = ToBoundaryMesh[Disk[], "MeshOrder" -> 2]%["MeshOrder"]2π - NIntegrate[1, {x, y}∈bmesh]"MeshOrder"オプションの詳細については,要素メッシュの生成と要素メッシュの可視化のチュートリアルを参照されたい.
"PointMarkerFunction" (1)
点マーカーは,領域境界上でDirichletConditionを指定するのに便利であり,「要素メッシュの生成」の「マーカー」セクションに詳しく説明されている.
以下は,辺のノードの座標によって,点要素の整数マーカーを計算する関数である:
pointMarkerFunction = Compile[{{coords, _Real, 2}, {pMarker, _Integer, 1}},
Which[
#[[1]] == 1., 2,
#[[1]] == 0., 3,
True, 4 ]& /@ coords];bmesh = ToBoundaryMesh[ImplicitRegion[True, {{x, 0, 1}, {y, 0, 1}}],
"PointMarkerFunction" -> pointMarkerFunction,
"MaxCellMeasure" -> {"Length" -> 0.25},
"MeshOrder" -> 1
]Show[bmesh["Wireframe"],
bmesh["Wireframe"["MeshElement" -> "PointElements", "MeshElementMarkerStyle" -> Blue]]]bmesh["PointElements"]"RegionHoles" (1)
bmesh = ToBoundaryMesh["Coordinates" -> {{-1, -1}, {1, -1}, {1, 1}, {-1, 1}, {-1 / 2, -1 / 2}, {1 / 2, -1 / 2}, {1 / 2, 1 / 2}, {-1 / 2, 1 / 2}}, "BoundaryElements" -> {LineElement[{{1, 2}, {2, 3}, {3, 4}, {4, 1}}], LineElement[{{5, 6}, {6, 7}, {7, 8}, {8, 5}}]}];
bmesh["Wireframe"]ToElementMesh[bmesh]["Wireframe"]bmesh = ToBoundaryMesh["Coordinates" -> {{-1, -1}, {1, -1}, {1, 1}, {-1, 1}, {-1 / 2, -1 / 2}, {1 / 2, -1 / 2}, {1 / 2, 1 / 2}, {-1 / 2, 1 / 2}}, "BoundaryElements" -> {LineElement[{{1, 2}, {2, 3}, {3, 4}, {4, 1}}], LineElement[{{5, 6}, {6, 7}, {7, 8}, {8, 5}}]}, "RegionHoles" -> {{0, 0}}];
bmesh["Wireframe"]bmesh["RegionHoles"]ToElementMesh[bmesh]["Wireframe"]アプリケーション (1)
で2つのネストした半環帯の境界メッシュを生成する.それぞれの環帯は異なる部分領域を表す.1つ目の部分領域は内半径が
で外半径が
,2つ目の部分領域は内半径が
,外半径が
である.
まず3つの半円盤を作成し,次に3つの部分領域の和を生成し,最後に2つの環帯を作成するために最初の半円盤を穴とする.
Subscript[r, 1] = 3 / 1000;
Subscript[r, 2] = 10 / 1000;Subscript[r, 3] = 12 / 1000;Circleを使って半円盤を作成する:
c = Circle[{0, 0}, #, {-π / 2, π / 2}]& /@ {Subscript[r, 1], Subscript[r, 2], Subscript[r, 3]};半円盤の和が作成されると,左の境界は自動的に和から削除される.このため,領域をもう一度繋げるために,線分が作成され,半円盤の和に繋げられる.1つ目の半円盤に穴を開けるために,和を
から
まで,および
から
まで
方向に繋げ,1つ目の半円盤を脇にのける.
l = {Line[{{0, Subscript[r, 1]}, {0, Subscript[r, 3]}}], Line[{{0, -Subscript[r, 1]}, {0, -Subscript[r, 3]}}]};ru = RegionUnion[Flatten[{l, c}]];bmesh = ToBoundaryMesh[ru, {{-0.01, Subscript[r, 3]}, {-Subscript[r, 3], Subscript[r, 3]}}]bmesh["Wireframe"]特性と関係 (1)
ToBoundaryMeshのオプションをNDSolveに渡して,定常偏微分方程式を解く:
if = NDSolveValue[{-(D[u[x, y], x, x] + D[u[x, y], y, y]) == 1, DirichletCondition[u[x, y] == 0, True]}, u, {x, y}∈Disk[], Method -> {"FiniteElement", "MeshOptions" -> {"MaxBoundaryCellMeasure" -> 0.05, "MaxCellMeasure" -> 0.1}}]if["ElementMesh"]["Wireframe"]考えられる問題 (6)
入力の記号的な領域に境界がなければ,デフォルトの
からの境界ボックスが各空間方向に想定される:
ToBoundaryMesh[ImplicitRegion[x ≤ 1 / 3 || 2 / 3 ≤ x, {x, y}]]["Wireframe"]
明示的な境界ボックスを指定することによって,デフォルトが無効になる:
ToBoundaryMesh[ImplicitRegion[x ≤ 1 / 3 || 2 / 3 ≤ x, {x, y}], {{0, 1}, {0, 1}}]["Wireframe"]bem = ToBoundaryMesh[ImplicitRegion[!((x - 0.2) ^ 2 + (y - 0.2) ^ 2 ≤ 0.05 ^ 2), {{x, 0, 2.2}, {y, 0, 0.41}}], "BoundaryMeshGenerator" -> {"RegionPlot"}];
bem["Wireframe"[PlotRange -> {{0, 0.5}, {-0.01, 0.42}}]]境界要素の大きさを設定し,サンプル点を増やすとうまくいくかもしれない:
bem = ToBoundaryMesh[ImplicitRegion[!((x - 0.2) ^ 2 + (y - 0.2) ^ 2 ≤ 0.05 ^ 2), {{x, 0, 2.2}, {y, 0, 0.41}}],
"MaxBoundaryCellMeasure" -> 0.01,
"BoundaryMeshGenerator" -> {"RegionPlot", "SamplePoints" -> 43}];
bem["Wireframe"[PlotRange -> {{0, 0.5}, {-0.01, 0.42}}]]あるいは,"Continuation"の境界メッシュ生成器を使った方がうまくいくかもしれない:
bem = ToBoundaryMesh[ImplicitRegion[!((x - 0.2) ^ 2 + (y - 0.2) ^ 2 ≤ 0.05 ^ 2), {{x, 0, 2.2}, {y, 0, 0.41}}],
"BoundaryMeshGenerator" -> "Continuation", AccuracyGoal -> 4];
bem["Wireframe"[PlotRange -> {{0, 0.5}, {-0.01, 0.42}}]]指定された領域の境界上にある"IncludePoints"を指定することによって,完全なメッシュに変換することができない境界メッシュが作成されることがある:
includePoint = N[4 * {Cos[π / 7], Sin[π / 7]}];bmesh = ToBoundaryMesh[Circle[{0, 0}, 4], "IncludePoints" -> {includePoint}]ToElementMesh[bmesh]
指定された"IncludePoints"は,領域内部になければならない:
bmesh = ToBoundaryMesh[Circle[{0, 0}, 4], "IncludePoints" -> {includePoint - 0.01}]ToElementMesh[bmesh]領域のどの程度内部に"IncludePoints"がなければならないかは,メッシュの曲率の確度によって異なる.
ToBoundaryMeshの引数は規則として指定し,正しい順序("Coordinates","BoundaryElements"の順序で,次にオプショナルの規則"PointElements"を加える)で与えなければならない:
ToBoundaryMesh["BoundaryElements" -> {LineElement[{{1, 2}, {2, 3}, {3, 4}, {4, 1}}]}, "Coordinates" -> {{0., 0.}, {1., 0.}, {1., 1.}, {0., 1.}}]ToBoundaryMesh["Coordinates" -> {{0., 0.}, {1., 0.}, {1., 1.}, {0., 1.}}, "BoundaryElements" -> {LineElement[{{1, 2}, {2, 3}, {3, 4}, {4, 1}}]}]境界マーカーの自動割当ては,2つの境界要素に同じ境界マーカーが割り当てられているかどうかを見極める閾値に依存する.以下の境界メッシュについて考える:
coordinates = {{1 / 3, 0}, {1, 0}, {1, 1 / 2}, {0, 1 / 2}, {0, 1 / 20}};
lineSegments = {{1, 2}, {2, 3}, {3, 4}, {4, 5}, {5, 1}};
bmesh = ToBoundaryMesh["Coordinates" -> coordinates, "BoundaryElements" -> {LineElement[lineSegments]}];境界マーカーが青,点のノード番号が赤のメッシュを可視化する:
Show[bmesh["Wireframe"["MeshElement" -> "BoundaryElements", "MeshElementMarkerStyle" -> Blue]],
bmesh["Wireframe"["MeshElement" -> "PointElements", "MeshElementIDStyle" -> Red]]]ノード5とノード1,およびノード1とノード2の間の辺はどちらも境界マーカー1になっていることに注意する.オプション"BoundaryGroupingThreshold"を使うと,閾値を変更することができる:
bmesh = ToBoundaryMesh["Coordinates" -> coordinates, "BoundaryElements" -> {LineElement[lineSegments]}, "BoundaryGroupingThreshold" -> 0.99];
Show[bmesh["Wireframe"["MeshElement" -> "BoundaryElements", "MeshElementMarkerStyle" -> Blue]],
bmesh["Wireframe"["MeshElement" -> "PointElements", "MeshElementIDStyle" -> Red]]]もう一つの方法として,入力の際に予め境界マーカーを指定することもできる:
bmesh = ToBoundaryMesh["Coordinates" -> coordinates, "BoundaryElements" -> {LineElement[lineSegments, {1, 2, 3, 4, 5}]}];
Show[bmesh["Wireframe"["MeshElement" -> "BoundaryElements", "MeshElementMarkerStyle" -> Blue]],
bmesh["Wireframe"["MeshElement" -> "PointElements", "MeshElementIDStyle" -> Red]]]テクニカルノート
関連するガイド
-
▪
- 有限要素法
テキスト
Wolfram Research (2014), ToBoundaryMesh, Wolfram言語関数, https://reference.wolfram.com/language/FEMDocumentation/ref/ToBoundaryMesh.html (2024年に更新).
CMS
Wolfram Language. 2014. "ToBoundaryMesh." Wolfram Language & System Documentation Center. Wolfram Research. Last Modified 2024. https://reference.wolfram.com/language/FEMDocumentation/ref/ToBoundaryMesh.html.
APA
Wolfram Language. (2014). ToBoundaryMesh. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/FEMDocumentation/ref/ToBoundaryMesh.html
BibTeX
@misc{reference.wolfram_2026_toboundarymesh, author="Wolfram Research", title="{ToBoundaryMesh}", year="2024", howpublished="\url{https://reference.wolfram.com/language/FEMDocumentation/ref/ToBoundaryMesh.html}", note=[Accessed: 18-August-2026]}
BibLaTeX
@online{reference.wolfram_2026_toboundarymesh, organization={Wolfram Research}, title={ToBoundaryMesh}, year={2024}, url={https://reference.wolfram.com/language/FEMDocumentation/ref/ToBoundaryMesh.html}, note=[Accessed: 18-August-2026]}