콘텐츠로 이동

3.3 자동 격자 생성

3.3.1 Overview

Flow360은 CAD 지오메트리부터 표면 메시, 마지막으로 부피 메시까지의 자동 메싱을 제공합니다. 지원되는 CAD 형식은 CSM과 EGADS입니다. 출력 부피 메시는 CGNS 형식입니다.

3.3.2 형상

Engineering Sketch Pad (ESP)는 파라미터 기반 기하학을 구축하기 위한 웹 활성화된 솔리드 모델링, 특징 기반 시스템입니다. 독자들은 사전 빌드된 ESP를 다운로드할 수 있으므로 소스 코드를 컴파일할 필요가 없습니다. CSM 파일에는 기하학을 구성하는 모든 작업이 포함되어 있습니다. CSM 파일을 준비하는 튜토리얼은 ESP의 공식 웹사이트에서 찾을 수 있습니다. 여기 예제 CSM 파일이 있습니다.

sphere 0 -1 0 0.5
attribute groupName $sphere

box -0.5 0.5 -0.5 1 1 1
attribute groupName $box

select face 6
attribute faceName $top

이 예제에는 두 개의 솔리드 바디가 포함되어 있습니다: 구와 상자입니다. 구는 (0, -1, 0)을 중심으로 하고 반지름은 0.5입니다. 상자의 모서리는 (-0.5, 0.5, 0.5)에 위치하며 상자의 x, y, z 방향으로의 치수는 각각 [1, 1, 1]입니다.

[!Note]

외부 유동에서는 여러 개의 솔리드 바디가 허용됩니다. 내부 유동의 경우 유체/공기를 나타내는 하나의 솔리드 바디만 허용됩니다.

Fig. 3.3.1 Box and sphere in ESP.

그림 3.3.1에 나와 있는 것처럼, 다른 groupName을 가진 면은 CGNS 파일을 내보낼 때 서로 다른 경계 조건으로 "그룹화"됩니다. faceName을 가진 면은 표면 메시를 생성할 때 추가적인 정제를 받습니다.

3.3.3 표면 격자 (Surface Meshing)

표면 메셔는 기하 파일과 surfaceMesh.json을 입력으로 받아 표면 메시를 생성합니다. surfaceMesh.json은 표면 메시 해상도를 제어합니다. surfaceMesh.json의 전체 설명은 JSON surface mesher에서 확인할 수 있습니다. 여기 예제 surfaceMesh.json이 있습니다:

{
    "maxEdgeLength": 0.05, 
    "curvatureResolutionAngle": 15,
    "growthRate": 1.2, 
    "faces": {
        "top": {
            "maxEdgeLength": 0.01
        }
    }
}

위의 JSON 파일에서 보듯이, 기본 maxEdgeLength는 0.05입니다. 상자의 윗면에 대해 maxEdgeLength = 0.01로 추가적인 정제가 적용됩니다.

표면 메시는 PythonAPI를 통해 geometry 파일과 surfaceMesh.json을 제출하여 생성할 수 있습니다.

import flow360client
surfaceMeshId = flow360client.NewSurfaceMeshFromGeometry("path/to/geometry.csm", "surfaceMesh.json", surfaceMeshName="my_surface_mesh")

Inputs

  • geometry.csm file
  • surfaceMesh.json (or a Python dictionary)

Outpust

  • surface mesh on cluster
  • return the surfaceMeshId

Fig. 3.3.2 Auto-generated surface mesh. An extra refinement is applied to the top face of the box.

3.3.4 체적 격자 (Volume Meshing)

부피 메셔는 surfaceMeshId와 volumeMesh.json을 입력으로 받아 부피 메시를 생성합니다. volumeMesh.json은 부피 메시 해상도를 결정합니다. 이 파일에는 3D 이방성 레이어의 첫 번째 레이어 두께와 성장률, 정제 영역의 크기/위치/해상도 등이 포함됩니다.

volumeMesh.json의 전체 설명은 JSON volume mesher에서 확인할 수 있습니다. 아래는 예제 volumeMesh.json입니다.

{
    "volume": {
        "firstLayerThickness": 1e-3,
        "growthRate": 1.2
    },
    "refinement": [
        {
            "size": [6, 4, 2],
            "center": [1, 0, -1],
            "axisOfRotation": [0, 1, 0],
            "angleOfRotation": 45,
            "spacing": 0.1
        }
    ]
}

위의 JSON 파일에서, (1,0,-1)을 중심으로 한 6x4x2 부피 메시 정제 영역이 있습니다. 이 정제 상자는 y-축을 중심으로 45도 회전합니다. 이 정제 영역 내의 메시 크기는 0.1로 제한됩니다.

[Notes]

  1. 기본적으로 ESP의 모든 면은 noSlipWall로 취급되며 프리즘 레이어가 이러한 면에서 성장합니다. 내부 유동의 경우 사용자는 어떤 면이 noSlipWall이 아닌지 지정하고 프리즘 레이어를 비활성화할 수 있습니다.

  2. 기본적으로 부피 메셔에 의해 멀리 있는 모양은 자동으로 결정됩니다. 필요한 경우 사용자는 멀리 있는 모양을 지정할 수 있습니다.

    • auto: 메셔는 기하의 바운딩 박스를 기반으로 구 또는 반구를 생성합니다.
      • min{Y} < 0 이고 max{Y} > 0이면 전체 구형
      • min{Y} = 0 이고 max{Y} > 0이면 +Y 반구형
      • min{Y} <> 0 이고 max{Y} = 0이면 -Y 반구형
    • quasi-3d: 준 3D 경우에는 얇은 디스크가 생성됩니다. 멀리 있는 디스크의 양쪽 면은 "대칭 평면"으로 처리됩니다.
    • user-defined: 사용자가 ESP에서 멀리 있는 모양을 제공합니다.

부피 메시는 PythonAPI를 사용하여 surfaceMeshId와 volumeMesh.json을 제출하여 생성할 수 있습니다.

volumeMeshId = flow360client.NewMeshFromSurface(surfaceMeshId, "volumeMesh.json", meshName="my_volume_mesh")

Inputs * surfaceMeshId * volumeMesh.json (or a Python dictionary)

Outputs * volume mesh on cluster (in CGNS format) * Flow360Mesh.json on cluster * return the volumeMeshId

Fig. 3.3.3 Left: WebUI showing the refinement zone. Right: auto-generated volume mesh.

Fig. 3.3.4 Auto-generated volume mesh. Left: sliced at y=1. Right: sliced at y=-1.

3.3.5 JSON 표면 격자 생성기

Options Default Description
maxEdgeLength Required 표면 셀의 전역 최대 가장자리 길이입니다. 이 값은 면 하위 섹션의 지역 maxEdgeLength에 의해 덮어씌워집니다.
curvatureResolutionAngle Required 각도의 전역 최대 편차(도). 이 값은 다음을 제한합니다:(1) 셀의 법선과 해당 기저 표면 법선 사이의 각도 (2) 선분의 법선과 해당 기저 곡선 법선 사이의 각도
growthRate Required 가장자리에서 성장하는 이방성 레이어의 성장률
edges [] edgeName 속성을 가진 가장자리에 대한 추가 처리
faces [] faceName 속성을 가진 면에 대한 추가 정제

3.3.5.1 선(edges)

하위 섹션 엣지는 딕셔너리이며, 이 딕셔너리의 키는 CSM 파일의 edgeName 속성과 일치해야 합니다. 사용자가 특정 가장자리에 특별한 처리를 적용하려면 ESP에서 해당 가장자리에 edgeName 속성을 추가해야 합니다. 그런 다음 이 섹션에서 원하는 처리 유형을 지정할 수 있습니다.

Options Default Description
type Required [string] aniso 또는 projectAnisoSpacing (1) aniso: 가장자리에 직교하는 이방성 레이어를 성장시킵니다. 그림 3.3.5를 참조하세요. (2) projectAnisoSpacing: 이방성 간격을 이웃한 면에서 가장자리로 투영합니다. 그림 3.3.6을 참조하세요.
method Required [string] angle, height 또는 aspectRatio (1) angle: 각도 단위의 곡률 해상도 (2) height: 이방성 레이어의 첫 번째 층 높이 (3) aspectRatio: 이방성 셀의 최대 종횡비
value Required 해당 방법에 대한 입력 값
"edges": {
    "leadingEdge":  {
        "type": "aniso",
        "method": "angle",
        "value": 1
    },
    "trailingEdge":  {
        "type": "aniso",
        "method": "height",
        "value": 1e-3
    },
    "hubCircle": {
        "type": "aniso",
        "method": "height",
        "value": 0.1
    },
    "hubSplitEdge": {
        "type": "projectAnisoSpacing"
    }
}

Fig. 3.3.5 Surface mesh on a wing. Anisotropic layers are growing from leading and trailing edges.

Fig. 3.3.6 Surface mesh on a hub. Anisotropic layers are growing from hubCircle (green). The anisotropic spacing on the neighboring patches is “projected” to hubSplitEdge (red) and updates the nodes distribution along hubSplitEdge.

3.3.5.2 면(faces)

faceName 속성과 일치해야 하는 하위 섹션 faces는 딕셔너리입니다. 기본적으로 전역 maxEdgeLength가 모든 면에 적용됩니다. 사용자가 특정 면에 추가 정제를 원하는 경우, 해당 면에 ESP에서 faceName 속성을 추가하고 이 섹션에서 대상 지역 maxEdgeLength를 지정해야 합니다.

Options Default Description
maxEdgeLength Reqauired 지역 최대 가장자리 길이입니다. 이 값은 전역 maxEdgeLength를 덮어씁니다.
"faces": {
    "rightWing": {
        "maxEdgeLength": 0.05
    },
    "fuselage": {
        "maxEdgeLength": 0.05
    }
}

3.3.6 JSON 체적 격자 생성기

Options Default Description
refinementFactor 1 refinementFactor=r가 제공되면 정제 영역의 모든 간격과 첫 번째 레이어 두께가 r배 미세한 메시를 생성하도록 조정됩니다. 예를 들어, refinementFactor=2인 경우 모든 간격은 1.26만큼의 간격으로 나누어져서, 결과 메시는 대략적으로 2배 더 많은 노드를 갖게 됩니다.
farfield->type auto auto, quasi-3d or user-defined, (1) auto: 기하가 전체/양반/+Y 반/−Y 반 비행기인지 자동으로 감지하고, 그에 따라 멀리 있는 영역을 생성합니다. (2) quasi-3d: 최소/최대 Y 위치에 미끄럼벽을 두 개 생성합니다. (3) user-defined: ESP에서 사용자가 제공한 멀리 있는 영역 기하입니다.
volume Required 부피 격자 생성기의 전역 매개변수
faces {} faceName 속성을 가진 면에 대한 특별한 처리
refinement {} refinement에 대한 설명
rotorDisks {} rotorDisk에 대한 설명
slidingInterfaces {} Sliding Interfaces에 대한 설명

3.3.6.1 체적

Options Default Description
firstLayerThickness Required 부피형 이방성 레이어의 첫 번째 층 두께입니다.
growthRate Required 부피 프리즘 레이어의 성장률입니다.
gapTreatmentStrength 0 근접한 두 표면이 있을 때 사용되는 좁은 간격 처리 강도입니다. 값은 0에서 1 사이의 값을 사용하며, 0은 처리가 없음을 나타내고 1은 가장 보수적인 처리를 의미합니다. 이 매개변수는 이방성 메시에서 이등방성 메시로의 전환에 전역적인 영향을 미칩니다. 그러나 근접하지 않은 영역에 대한 영향은 무시할 수 있습니다. 아래 예제를 참조하세요.

gapTreatment 예제 Fig. 3.3.7 Different gapTreatmentStrength strength. The larger gapTreatmentStrength is, the more space is dedicated to isotropic mesh than anisotropic mesh in narrow gaps.

## 3.3.6.2 면

faces 하위 섹션은 딕셔너리이며, 그 키는 CSM 파일의 faceName 속성과 일치해야 합니다. 기본적으로 모든 면은 이방성으로 처리되며 전역 firstLayerThickness가 적용됩니다. 사용자가 특정 면에 대해 전역 firstLayerThickness를 덮어쓰고 싶으면 ESP에서 해당 faceName 속성을 추가하고 이 섹션에서 지역 firstLayerThickness를 지정해야 합니다. 또한 사용자는 면 유형을 변경하여 이방성 레이어를 비활성화할 수도 있습니다.

Options Default Description
type Required aniso, projectAnisoSpacing 혹은 none, (1) aniso: 면에 수직으로 이방성 레이어를 성장시킵니다. (2) projectAnisoSpacing: 이 면에 대한 이방성 레이어 성장을 비활성화합니다. 인접한 부피에서 이 면으로 이방성 간격을 투영합니다. 그림 7.7.2를 참조하세요. (3) none: 이 면에 대한 이방성 레이어 성장을 비활성화합니다. 부피 메시를 생성할 때 표면 메시는 변경되지 않습니다.
firstLayerThickness Required 지역 첫 번째 레이어 두께로, 이는 전역 값이 덮어씁니다.

부피 Mesh.json의 faces 하위 섹션 사용에 대한 자세한 내용은 "내부 유동을 위한 자동 메싱"을 참조하십시오.

3.3.6.3 Refinement

  1. Refinement 영역 내부의 메시는 균일하게 정제됩니다.
  2. Refinement 영역은 다른 객체를 포함하거나 교차할 수 있습니다.
Options Default Description
type box Refinement 영역의 모양은 상자(box) 또는 원기둥(cylinder)일 수 있습니다.
center Required 기하하적 중심
spacing Required Refinement 영역의 셀 간격
size Required x, y, z 방향으로의 크기
axisOfRotation Required for box Refinement 박스의 회전축
angleOfRotation Required for box Refinement 박스의 회전 반경
radius Required for cylinder Refinement 실린더 반경
length Required for cylinder Refinement 실린더 길이
axis Required for cylinder Refinement 실린더 축
"refinement": [
 {
     "size": [4, 3, 2],
     "center": [2, 0, 0],
     "spacing": 0.05,
     "axisOfRotation": [ 0, 0, 1 ],
     "angleOfRotation": 45
 },
 {
     "type": "cylinder",
     "radius": 4,
     "length": 5,
     "center": [5, 0, 0],
     "spacing": 0.05,
     "axis": [1, 0, 0]
 }]

3.3.6.4 rotorDisks

  1. rotorDisk 내부의 격자는 semi-structured 될 수 있습니다.

  2. rotorDisk는 다른 객체를 포함하거나 교차할 수 없습니다.

  3. 사용자는 도넛 모양의 로터 디스크를 만들고 중심부에 허브/센터바디를 배치할 수 있습니다.

  4. rotorDisk는 Actuator나 BET Disk를 위해 축 방향으로 강한 유동 변화를 해결하기 위해 사용됩니다.

  5. 축 방향, 반경 방향 및 주위 방향의 간격은 별도로 조절할 수 있습니다.

Options Default Description
name index rotor disk의 이름입니다. 경계 이름은 rotorDisk가 됩니다.
innerRadius Required rotor disk의 내부 반지름입니다. 값이 0보다 크면 "도넛"이 생성됩니다.
outerRadius Required rotor disk의 외부 반지름입니다.
thickness Required rotor disk의 두께
axisThrust Required 축방향 rotor disk의 추력
center Required rotor disk의 중심점
spacingAxial Required 축방향으로의 셀 간격
spacingRadial Required 회전 반경 방향으로의 셀 간격
spacingCircumferential Required 원주 방향으로의 셀 간격
"rotorDisks": [
     {
         "name": "enclosed",
         "innerRadius": 0,
         "outerRadius": 0.75,
         "thickness": 0.1,
         "axisThrust": [1, 0, 0],
         "center": [0, 5.0, 0],
         "spacingAxial": 0.1,
         "spacingRadial": 0.1,
         "spacingCircumferential": 0.1
     },
     {
         "innerRadius": 0,
         "outerRadius": 0.75,
         "thickness": 0.1,
         "axisThrust": [0, 0, 1],
         "center": [0, -5, 0],
         "spacingAxial": 0.1,
         "spacingRadial": 0.1,
         "spacingCircumferential": 0.1
     }
 ],

3.3.6.5 slidingInterfaces

  1. 슬라이딩 인터페이스 격자는 동심원이어야 합니다.

  2. 슬라이딩 인터페이스는 서로 다른 영역이 공통으로 공유하는 면입니다.

  3. 사용자는 도넛 모양의 슬라이딩 인터페이스를 만들고, 도넛의 중심부에 정지한 물체를 배치할 수 있습니다.

Options Default Description
name index sliding interface의 이름입니다. 경계 이름은 sliding interface가 됩니다.
innerRadius Required sliding interface의 내부 반지름입니다. 값이 0보다 크면 "도넛"이 생성됩니다.
outerRadius Required sliding interface의 외부 반지름입니다.
thickness Required sliding interface의 두께
axisOfRotation Required sliding interface의 회전 축입니다. 원통 모양은 그 축이 회전 축과 일치하도록 배치됩니다.
center Required sliding interface의 중심점
spacingAxial Required 축방향으로의 셀 간격
spacingRadial Required 회전 반경 방향으로의 셀 간격
spacingCircumferential Required 원주 방향으로의 셀 간격
enclosedObjects Required 이 슬라이딩 인터페이스에 포함된 객체입니다. 면, 다른 슬라이딩 인터페이스 또는 로터 디스크가 될 수 있습니다.

예시

"slidingInterfaces": [
    {
        "name": "inner",
        "innerRadius": 0,
        "outerRadius": 0.75,
        "thickness": 0.5,
        "axisOfRotation": [0, 0, 1],
        "center": [0, 0, 0],
        "spacingAxial": 0.2,
        "spacingRadial": 0.2,
        "spacingCircumferential": 0.2,
        "enclosedObjects": ["hub", "blade1", "blade2", "blade3"]
    }, {
        "name": "mid",
        "innerRadius": 0,
        "outerRadius": 2.0,
        "thickness": 2.0,
        "axisOfRotation": [0, 1, 0],
        "center": [0, 0, 0],
        "spacingAxial": 0.2,
        "spacingRadial": 0.2,
        "spacingCircumferential": 0.2,
        "enclosedObjects": ["slidingInterface-inner"]
    }, {
        "innerRadius": 0,
        "outerRadius": 2.0,
        "thickness": 2.0,
        "axisOfRotation": [0, 1, 0],
        "center": [0, 5, 0],
        "spacingAxial": 0.2,
        "spacingRadial": 0.2,
        "spacingCircumferential": 0.2,
        "enclosedObjects": ["rotorDisk-enclosed"]
    }, {
        "innerRadius": 1.5,
        "outerRadius": 2.0,
        "thickness": 2.0,
        "axisOfRotation": [0, 1, 0],
        "center": [0, -5, 0],
        "spacingAxial": 0.2,
        "spacingRadial": 0.2,
        "spacingCircumferential": 0.2,
        "enclosedObjects": []
    }, {
        "name": "outer",
        "innerRadius": 0,
        "outerRadius": 8,
        "thickness": 6,
        "axisOfRotation": [1, 0, 0],
        "center": [0, 0, 0],
        "spacingAxial": 0.4,
        "spacingRadial": 0.4,
        "spacingCircumferential": 0.4,
        "enclosedObjects": ["slidingInterface-mid", "rotorDisk-1", "slidingInterface-2", "slidingInterface-3"]
    }
],
Fig. 3.3.8 Rotor disks and sliding interfaces generated according to the above configuration.