永久磁石とコイン
この例では,永久磁石とその前に置かれたコインを作成する.これは
面と
面で対称である形状であるので,1/4の形状のみを作成する.磁石は,磁化を持つ部分と鉄でできた部分の2つの領域からなる.
Needs["OpenCascadeLink`"]
Needs["NDSolve`FEM`"]まず,
面に磁石の面を作成し,その後曲線に沿って面を通し,磁石領域全体の立体コンポーネントを取得する.
bcurve = BezierCurve[{{0.01, 0.02, 0.005}, {0.04, 0.03, 0.005}, {0.09, 0.03, 0.005}, {0.09, 0, 0.005}}];
Graphics3D[bcurve]surface = Polygon [{{0.08, 0, 0}, {0.1, 0, 0}, {0.1, 0, 0.01}, {0.08, 0, 0.01}}];
Graphics3D[{surface, bcurve}]path = OpenCascadeShape[bcurve];
face = OpenCascadeShape[surface];
magnetShape = OpenCascadeShapePathSweep[face, path]gr = OpenCascadeShapeSurfaceMeshToBoundaryMesh[magnetShape]["Edgeframe"]次に,磁石は磁化を持つことになる部分と残りの部分に分けられる.
division = Polygon[{{0.05, 0, -0.01}, {0.04, 0.05, -0.01}, {0.04, 0.05, 0.02}, {0.05, 0., 0.02}}];
Show[gr, Graphics3D[division]]divisionShape = OpenCascadeShape[division];
divisionFace = OpenCascadeShapeIntersection[magnetShape, divisionShape]この分割は後ほど使う.一方,磁石の前にコインを置く.このコインの形状も完全なコインの1/4である.
coin = Disk[{-0.03, 0}, 0.01, {0, Pi}];shape = OpenCascadeShape[coin];
direction = {{0, 0, 0}, {0, 0, 0.005}};
coinShape = OpenCascadeShapeLinearSweep[shape, direction]gr = Show[OpenCascadeShapeSurfaceMeshToBoundaryMesh[coinShape]["Edgeframe"], gr]air = Cuboid[{-0.05, 0, 0}, {0.12, 0.1, 0.06}];
Show[gr, Graphics3D[{Opacity[0.2], air}]]airShape = OpenCascadeShape[air]次のステップでは,すべてのコンポーネントを合体させて,幾何モデルを作る.
faces = Flatten[{OpenCascadeShapeFaces /@ {magnetShape, coinShape, airShape}, divisionFace}];union = OpenCascadeShapeUnion[faces]bmesh = OpenCascadeShapeSurfaceMeshToBoundaryMesh[union, "ShapeSurfaceMeshOptions" -> {"AngularDeflection" -> 0.1}]outline = Show[bmesh["Edgeframe"], bmesh["Wireframe"["MeshElementStyle" -> Directive[Opacity[0.2], FaceForm[LightBlue], EdgeForm[]]]], Axes -> True, AxesLabel -> {x, y, z}]幾何モデルには馬蹄形の永久磁石,その前に置かれたコイン,境界ボックスの1/4 の形状が含まれる.1/4の形状に縮小することは,形状が対称性を持つため可能である.対称性を持つ1つの面は
面であり,もう一つの対称な面は
面である.実際の計算には1/4の形状のみが使われるが,完全な形状を可視化することは可能である.
bmesh2 = ElementMeshProjection[bmesh, ReflectionTransform[{0, 1, 0}]];
bmesh3 = ElementMeshProjection[bmesh, ReflectionTransform[{0, 0, 1}]];
bmesh4 = ElementMeshProjection[bmesh3, ReflectionTransform[{0, 1, 0}]];Show[bmesh["Edgeframe"], bmesh2["Edgeframe"], bmesh3["Edgeframe"], bmesh4["Edgeframe"]]形状には,2つの鉄の領域が含まれる.1つは馬蹄形の磁石で,もう一つはコインである.実際の磁石の領域は馬蹄形磁石の先にあり,取り囲む部分は空気からなる.
1点注意しなければならないのは,幾何モデルに使われた縮尺である.境界メッシュの長さが例えばメートルの単位であれば,材料のパラメータも一貫する単位で指定される必要がある.この特定の場合には,境界メッシュの単位はメートルである.
メッシュ生成
有限要素解析を行うために,幾何モデルの境界メッシュ表現はメッシュに離散化される必要がある.この同じ過程では,さまざまな材料領域が要素マーカーで指定される.
regionMarker = <|"IronCoin" -> 1, "Iron" -> 2, "Magnet" -> 3, "Air" -> 4|>;それぞれの材料領域の整数マーカーは,その領域の任意座標に関係している.
mesh = ToElementMesh[bmesh, "RegionMarker" -> {{{-0.03, 0.005, 0.003}, regionMarker["IronCoin"]}, {{0.06, 0.03, 0.005}, regionMarker["Iron"]}, {{0.02, 0.03, 0.005}, regionMarker["Magnet"]}, {{0, 0.05, 0.05}, regionMarker["Air"]}}]parts = Map[mesh["Wireframe"[ElementMarker == #[[1]], "MeshElement" -> "MeshElements", "ElementMeshDirective" -> Directive[EdgeForm[], FaceForm[#[[2]]]]]]&, {{1, Gray}, {2, Gray}, {3, Red}, {4, LightBlue}}]Show[mesh["Edgeframe"], parts[[1 ;; 3]]]メッシュ生成の過程の詳細については,要素メッシュの生成についてのチュートリアルに記載されている.