Using meshing workflows#
PyFluent supports accessing all Fluent meshing functionalities, including guided meshing workflows.
Watertight geometry meshing workflow#
This simple example shows how you use the watertight geometry meshing workflow.
Import geometry#
import ansys.fluent.core as pyfluent
from ansys.fluent.core import examples
import_filename = examples.download_file('mixing_elbow.pmdb', 'pyfluent/mixing_elbow')
meshing = pyfluent.launch_fluent(
mode="meshing", precision='double', processor_count=2
)
meshing.workflow.InitializeWorkflow(WorkflowType='Watertight Geometry')
meshing.workflow.TaskObject['Import Geometry'].Arguments = dict(
FileName=import_filename, LengthUnit='in'
)
meshing.workflow.TaskObject['Import Geometry'].Execute()
Add local sizing#
meshing.workflow.TaskObject['Add Local Sizing'].AddChildToTask()
meshing.workflow.TaskObject['Add Local Sizing'].Execute()
Generate surface mesh#
meshing.workflow.TaskObject['Generate the Surface Mesh'].Arguments = {
'CFDSurfaceMeshControls': {'MaxSize': 0.3}
}
meshing.workflow.TaskObject['Generate the Surface Mesh'].Execute()
Describe geometry#
meshing.workflow.TaskObject['Describe Geometry'].UpdateChildTasks(
SetupTypeChanged=False
)
meshing.workflow.TaskObject['Describe Geometry'].Arguments = dict(
SetupType='The geometry consists of only fluid regions with no voids'
)
meshing.workflow.TaskObject['Describe Geometry'].UpdateChildTasks(
SetupTypeChanged=True
)
meshing.workflow.TaskObject['Describe Geometry'].Execute()
Update boundaries#
meshing.workflow.TaskObject['Update Boundaries'].Arguments = {
'BoundaryLabelList': ['wall-inlet'],
'BoundaryLabelTypeList': ['wall'],
'OldBoundaryLabelList': ['wall-inlet'],
'OldBoundaryLabelTypeList': ['velocity-inlet'],
}
meshing.workflow.TaskObject['Update Boundaries'].Execute()
Update regions#
meshing.workflow.TaskObject['Update Regions'].Execute()
Add boundary layers#
meshing.workflow.TaskObject['Add Boundary Layers'].AddChildToTask()
meshing.workflow.TaskObject['Add Boundary Layers'].InsertCompoundChildTask()
meshing.workflow.TaskObject['smooth-transition_1'].Arguments = {
'BLControlName': 'smooth-transition_1',
}
meshing.workflow.TaskObject['Add Boundary Layers'].Arguments = {}
meshing.workflow.TaskObject['smooth-transition_1'].Execute()
Generate volume mesh#
meshing.workflow.TaskObject['Generate the Volume Mesh'].Arguments = {
'VolumeFill': 'poly-hexcore',
'VolumeFillControls': {
'HexMaxCellLength': 0.3,
},
}
meshing.workflow.TaskObject['Generate the Volume Mesh'].Execute()
Switch to solution mode#
solver = meshing.switch_to_solver()
Fault-tolerant meshing workflow#
This simple example shows how you use the fault-tolerant meshing workflow.
Import CAD and part management#
import ansys.fluent.core as pyfluent
from ansys.fluent.core import examples
import_filename = examples.download_file(
'exhaust_system.fmd', 'pyfluent/exhaust_system'
)
meshing = pyfluent.launch_fluent(
precision='double', processor_count=2, mode="meshing"
)
meshing.workflow.InitializeWorkflow(WorkflowType='Fault-tolerant Meshing')
meshing.PartManagement.InputFileChanged(
FilePath=import_filename, IgnoreSolidNames=False, PartPerBody=False
)
meshing.PMFileManagement.FileManager.LoadFiles()
meshing.PartManagement.Node['Meshing Model'].Copy(
Paths=[
'/dirty_manifold-for-wrapper,' + '1/dirty_manifold-for-wrapper,1/main,1',
'/dirty_manifold-for-wrapper,' + '1/dirty_manifold-for-wrapper,1/flow-pipe,1',
'/dirty_manifold-for-wrapper,' + '1/dirty_manifold-for-wrapper,1/outpipe3,1',
'/dirty_manifold-for-wrapper,' + '1/dirty_manifold-for-wrapper,1/object2,1',
'/dirty_manifold-for-wrapper,' + '1/dirty_manifold-for-wrapper,1/object1,1',
]
)
meshing.PartManagement.ObjectSetting[
'DefaultObjectSetting'
].OneZonePer.setState('part')
meshing.workflow.TaskObject[
'Import CAD and Part Management'
].Arguments.setState(
{
'Context': 0,
'CreateObjectPer': 'Custom',
'FMDFileName': import_filename,
'FileLoaded': 'yes',
'ObjectSetting': 'DefaultObjectSetting',
'Options': {
'Line': False,
'Solid': False,
'Surface': False,
},
}
)
meshing.workflow.TaskObject['Import CAD and Part Management'].Execute()
Describe geometry and flow#
meshing.workflow.TaskObject['Describe Geometry and Flow'].Arguments.setState(
{
'AddEnclosure': 'No',
'CloseCaps': 'Yes',
'FlowType': 'Internal flow through the object',
}
)
meshing.workflow.TaskObject['Describe Geometry and Flow'].UpdateChildTasks(
SetupTypeChanged=False
)
meshing.workflow.TaskObject['Describe Geometry and Flow'].Arguments.setState(
{
'AddEnclosure': 'No',
'CloseCaps': 'Yes',
'DescribeGeometryAndFlowOptions': {
'AdvancedOptions': True,
'ExtractEdgeFeatures': 'Yes',
},
'FlowType': 'Internal flow through the object',
}
)
meshing.workflow.TaskObject['Describe Geometry and Flow'].UpdateChildTasks(
SetupTypeChanged=False
)
meshing.workflow.TaskObject['Describe Geometry and Flow'].Execute()
Enclose fluid regions (capping)#
meshing.workflow.TaskObject[
'Enclose Fluid Regions (Capping)'
].Arguments.setState(
{
'CreatePatchPreferences': {
'ShowCreatePatchPreferences': False,
},
'PatchName': 'inlet-1',
'SelectionType': 'zone',
'ZoneSelectionList': ['inlet.1'],
}
)
meshing.workflow.TaskObject[
'Enclose Fluid Regions (Capping)'
].Arguments.setState(
{
'CreatePatchPreferences': {
'ShowCreatePatchPreferences': False,
},
'PatchName': 'inlet-1',
'SelectionType': 'zone',
'ZoneLocation': [
'1',
'351.68205',
'-361.34322',
'-301.88668',
'396.96205',
'-332.84759',
'-266.69751',
'inlet.1',
],
'ZoneSelectionList': ['inlet.1'],
}
)
meshing.workflow.TaskObject['Enclose Fluid Regions (Capping)'].AddChildToTask()
meshing.workflow.TaskObject[
'Enclose Fluid Regions (Capping)'
].InsertCompoundChildTask()
meshing.workflow.TaskObject[
'Enclose Fluid Regions (Capping)'
].Arguments.setState({})
meshing.workflow.TaskObject['inlet-1'].Execute()
meshing.workflow.TaskObject[
'Enclose Fluid Regions (Capping)'
].Arguments.setState(
{
'PatchName': 'inlet-2',
'SelectionType': 'zone',
'ZoneSelectionList': ['inlet.2'],
}
)
meshing.workflow.TaskObject[
'Enclose Fluid Regions (Capping)'
].Arguments.setState(
{
'PatchName': 'inlet-2',
'SelectionType': 'zone',
'ZoneLocation': [
'1',
'441.68205',
'-361.34322',
'-301.88668',
'486.96205',
'-332.84759',
'-266.69751',
'inlet.2',
],
'ZoneSelectionList': ['inlet.2'],
}
)
meshing.workflow.TaskObject['Enclose Fluid Regions (Capping)'].AddChildToTask()
meshing.workflow.TaskObject[
'Enclose Fluid Regions (Capping)'
].InsertCompoundChildTask()
meshing.workflow.TaskObject[
'Enclose Fluid Regions (Capping)'
].Arguments.setState({})
meshing.workflow.TaskObject['inlet-2'].Execute()
meshing.workflow.TaskObject[
'Enclose Fluid Regions (Capping)'
].Arguments.setState(
{
'PatchName': 'inlet-3',
'SelectionType': 'zone',
'ZoneSelectionList': ['inlet'],
}
)
meshing.workflow.TaskObject[
'Enclose Fluid Regions (Capping)'
].Arguments.setState(
{
'PatchName': 'inlet-3',
'SelectionType': 'zone',
'ZoneLocation': [
'1',
'261.68205',
'-361.34322',
'-301.88668',
'306.96205',
'-332.84759',
'-266.69751',
'inlet',
],
'ZoneSelectionList': ['inlet'],
}
)
meshing.workflow.TaskObject['Enclose Fluid Regions (Capping)'].AddChildToTask()
meshing.workflow.TaskObject[
'Enclose Fluid Regions (Capping)'
].InsertCompoundChildTask()
meshing.workflow.TaskObject[
'Enclose Fluid Regions (Capping)'
].Arguments.setState({})
meshing.workflow.TaskObject['inlet-3'].Execute()
meshing.workflow.TaskObject[
'Enclose Fluid Regions (Capping)'
].Arguments.setState(
{
'PatchName': 'outlet-1',
'SelectionType': 'zone',
'ZoneSelectionList': ['outlet'],
'ZoneType': 'pressure-outlet',
}
)
meshing.workflow.TaskObject[
'Enclose Fluid Regions (Capping)'
].Arguments.setState(
{
'PatchName': 'outlet-1',
'SelectionType': 'zone',
'ZoneLocation': [
'1',
'352.22702',
'-197.8957',
'84.102381',
'394.41707',
'-155.70565',
'84.102381',
'outlet',
],
'ZoneSelectionList': ['outlet'],
'ZoneType': 'pressure-outlet',
}
)
meshing.workflow.TaskObject['Enclose Fluid Regions (Capping)'].AddChildToTask()
meshing.workflow.TaskObject[
'Enclose Fluid Regions (Capping)'
].InsertCompoundChildTask()
meshing.workflow.TaskObject[
'Enclose Fluid Regions (Capping)'
].Arguments.setState({})
meshing.workflow.TaskObject['outlet-1'].Execute()
Extract edge features#
meshing.workflow.TaskObject['Extract Edge Features'].Arguments.setState(
{
'ExtractMethodType': 'Intersection Loops',
'ObjectSelectionList': ['flow_pipe', 'main'],
}
)
meshing.workflow.TaskObject['Extract Edge Features'].AddChildToTask()
meshing.workflow.TaskObject['Extract Edge Features'].InsertCompoundChildTask()
meshing.workflow.TaskObject['edge-group-1'].Arguments.setState(
{
'ExtractEdgesName': 'edge-group-1',
'ExtractMethodType': 'Intersection Loops',
'ObjectSelectionList': ['flow_pipe', 'main'],
}
)
meshing.workflow.TaskObject['Extract Edge Features'].Arguments.setState({})
meshing.workflow.TaskObject['edge-group-1'].Execute()
Identify regions#
meshing.workflow.TaskObject['Identify Regions'].Arguments.setState(
{
'SelectionType': 'zone',
'X': 377.322045740589,
'Y': -176.800676988458,
'Z': -37.0764628583475,
'ZoneSelectionList': ['main.1'],
}
)
meshing.workflow.TaskObject['Identify Regions'].Arguments.setState(
{
'SelectionType': 'zone',
'X': 377.322045740589,
'Y': -176.800676988458,
'Z': -37.0764628583475,
'ZoneLocation': [
'1',
'213.32205',
'-225.28068',
'-158.25531',
'541.32205',
'-128.32068',
'84.102381',
'main.1',
],
'ZoneSelectionList': ['main.1'],
}
)
meshing.workflow.TaskObject['Identify Regions'].AddChildToTask()
meshing.workflow.TaskObject['Identify Regions'].InsertCompoundChildTask()
meshing.workflow.TaskObject['fluid-region-1'].Arguments.setState(
{
'MaterialPointsName': 'fluid-region-1',
'SelectionType': 'zone',
'X': 377.322045740589,
'Y': -176.800676988458,
'Z': -37.0764628583475,
'ZoneLocation': [
'1',
'213.32205',
'-225.28068',
'-158.25531',
'541.32205',
'-128.32068',
'84.102381',
'main.1',
],
'ZoneSelectionList': ['main.1'],
}
)
meshing.workflow.TaskObject['Identify Regions'].Arguments.setState({})
meshing.workflow.TaskObject['fluid-region-1'].Execute()
meshing.workflow.TaskObject['Identify Regions'].Arguments.setState(
{
'MaterialPointsName': 'void-region-1',
'NewRegionType': 'void',
'ObjectSelectionList': ['inlet-1', 'inlet-2', 'inlet-3', 'main'],
'X': 374.722045740589,
'Y': -278.9775145640143,
'Z': -161.1700719416913,
}
)
meshing.workflow.TaskObject['Identify Regions'].AddChildToTask()
meshing.workflow.TaskObject['Identify Regions'].InsertCompoundChildTask()
meshing.workflow.TaskObject['Identify Regions'].Arguments.setState({})
meshing.workflow.TaskObject['void-region-1'].Execute()
Define leakage threshold#
meshing.workflow.TaskObject['Define Leakage Threshold'].Arguments.setState(
{
'AddChild': 'yes',
'FlipDirection': True,
'PlaneDirection': 'X',
'RegionSelectionSingle': 'void-region-1',
}
)
meshing.workflow.TaskObject['Define Leakage Threshold'].AddChildToTask()
meshing.workflow.TaskObject[
'Define Leakage Threshold'
].InsertCompoundChildTask()
meshing.workflow.TaskObject['leakage-1'].Arguments.setState(
{
'AddChild': 'yes',
'FlipDirection': True,
'LeakageName': 'leakage-1',
'PlaneDirection': 'X',
'RegionSelectionSingle': 'void-region-1',
}
)
meshing.workflow.TaskObject['Define Leakage Threshold'].Arguments.setState(
{
'AddChild': 'yes',
}
)
meshing.workflow.TaskObject['leakage-1'].Execute()
Update regions settings#
meshing.workflow.TaskObject['Update Region Settings'].Arguments.setState(
{
'AllRegionFilterCategories': ['2'] * 5 + ['1'] * 2,
'AllRegionLeakageSizeList': ['none'] * 6 + ['6.4'],
'AllRegionLinkedConstructionSurfaceList': ['n/a'] * 6 + ['no'],
'AllRegionMeshMethodList': ['none'] * 6 + ['wrap'],
'AllRegionNameList': [
'main',
'flow_pipe',
'outpipe3',
'object2',
'object1',
'void-region-1',
'fluid-region-1',
],
'AllRegionOversetComponenList': ['no'] * 7,
'AllRegionSourceList': ['object'] * 5 + ['mpt'] * 2,
'AllRegionTypeList': ['void'] * 6 + ['fluid'],
'AllRegionVolumeFillList': ['none'] * 6 + ['tet'],
'FilterCategory': 'Identified Regions',
'OldRegionLeakageSizeList': [''],
'OldRegionMeshMethodList': ['wrap'],
'OldRegionNameList': ['fluid-region-1'],
'OldRegionOversetComponenList': ['no'],
'OldRegionTypeList': ['fluid'],
'OldRegionVolumeFillList': ['hexcore'],
'RegionLeakageSizeList': [''],
'RegionMeshMethodList': ['wrap'],
'RegionNameList': ['fluid-region-1'],
'RegionOversetComponenList': ['no'],
'RegionTypeList': ['fluid'],
'RegionVolumeFillList': ['tet'],
}
)
meshing.workflow.TaskObject['Update Region Settings'].Execute()
Choose mesh control options#
meshing.workflow.TaskObject['Choose Mesh Control Options'].Execute()
Generating surface mesh#
meshing.workflow.TaskObject['Generate the Surface Mesh'].Execute()
Update boundaries#
meshing.workflow.TaskObject['Update Boundaries'].Execute()
Add boundary layers#
meshing.workflow.TaskObject['Add Boundary Layers'].AddChildToTask()
meshing.workflow.TaskObject['Add Boundary Layers'].InsertCompoundChildTask()
meshing.workflow.TaskObject['aspect-ratio_1'].Arguments.setState(
{
'BLControlName': 'aspect-ratio_1',
}
)
meshing.workflow.TaskObject['Add Boundary Layers'].Arguments.setState({})
meshing.workflow.TaskObject['aspect-ratio_1'].Execute()
Generate volume mesh#
meshing.workflow.TaskObject['Generate the Volume Mesh'].Arguments.setState(
{
'AllRegionNameList': [
'main',
'flow_pipe',
'outpipe3',
'object2',
'object1',
'void-region-1',
'fluid-region-1',
],
'AllRegionSizeList': ['11.33375'] * 7,
'AllRegionVolumeFillList': ['none'] * 6 + ['tet'],
'EnableParallel': True,
}
)
meshing.workflow.TaskObject['Generate the Volume Mesh'].Execute()
Switch to solution mode#
solver = meshing.switch_to_solver()