Structural Optimization (Level Set Based) Analysis

In this example, using the support files, you perform a Structural Optimization analysis in Mechanical using a sequence of python journal commands that will define and solve the analysis. This analysis uses the Topology Optimization - Level Set Based method.

This example begins in the Mechanical application. It requires you to download the following Ansys DesignModeler and python files.

  • Structural_Optimization_Level_Set.agdb

  • Structural_Optimization_Level_Set.py

These files are available here.

Procedure

The following procedure assumes you understand how to add a system in Workbench and make changes to system cells and properties as well as saving the support files to a known location.

  1. Add a Static Structural analysis to the Project Schematic. Drag and drop a Structural Optimization system onto the static system as shown.

  2. Right-click the Geometry cell of the static system and select Import Geometry > Browse and select the Structural_Optimization_Level_Set.agdb file.

  3. Right-click the Model cell and select Edit. This action launches the Mechanical application.

  4. In Mechanical, select the Automation tab and select the Scripting option to open the Mechanical Scripting pane.

  5. Select the Open Script option ( ) from the Editor toolbar. Navigate to the proper folder location and select Structural_Optimization_Level_Set.py.

  6. Select the Run Script option ( ) from the Editor toolbar.

Scripts Illustrated

In this example, the python file automatically performs the following actions:

#Scenario 1 Store all main tree nodes as variables
GEOMETRY = Model.Geometry
MESH = Model.Mesh
NAMED_SELECTIONS = Model.NamedSelections
CONNECTIONS = Model.Connections
COORDINATE_SYSTEMS = Model.CoordinateSystems
GLOBAL_COORDINATE_SYSTEM = COORDINATE_SYSTEMS.Children[0]


#Scenario 2 Select Unit System
ExtAPI.Application.ActiveUnitSystem = MechanicalUnitSystem.StandardMKS


#Scenario 3 Store Named selections as variable
Fixed_Support_1 = [i for i in NAMED_SELECTIONS.GetChildren[Ansys.ACT.Automation.Mechanical.NamedSelection](True) if i.Name == 'Fixed_Support_1'][0]
Fixed_Support_2 = [i for i in NAMED_SELECTIONS.GetChildren[Ansys.ACT.Automation.Mechanical.NamedSelection](True) if i.Name == 'Fixed_Support_2'][0]
Force = [i for i in NAMED_SELECTIONS.GetChildren[Ansys.ACT.Automation.Mechanical.NamedSelection](True) if i.Name == 'Force'][0]


#Scenario 4 Add mesh method
MESH.ElementSize = Quantity('0.005 [m]')
MESH.UseAdaptiveSizing = False


#Scenario 5 Setup Static Structural analysis
STATIC_STRUCTURAL = Model.Analyses[0]

FIXED_SUPPORT1 = STATIC_STRUCTURAL.AddFixedSupport()
FIXED_SUPPORT1.Location = Fixed_Support_1

FIXED_SUPPORT2 = STATIC_STRUCTURAL.AddFixedSupport()
FIXED_SUPPORT2.Location = Fixed_Support_2

FORCE1 = STATIC_STRUCTURAL.AddForce()
FORCE1.Location = Force
FORCE1.DefineBy = LoadDefineBy.Components
FORCE1.XComponent.Output.DiscreteValues = [Quantity("-1000 [N]")]

SOLUTION1 = STATIC_STRUCTURAL.Solution
TOTAL_DEFORMATION = SOLUTION1.AddTotalDeformation()
EQUIVALENT_STRESS = SOLUTION1.AddEquivalentStress()


#Scenario 6 Setup Topology Opimization analysis
TOPOLOGY_OPTIMIZATION = Model.Analyses[1]

OPTIMIZATION_REGION1 = TOPOLOGY_OPTIMIZATION.Children[1]
OPTIMIZATION_REGION1.BoundaryCondition = BoundaryConditionType.AllLoadsAndSupports
OPTIMIZATION_REGION1.OptimizationType = OptimizationType.TopologyLevelSet

# Mass Constraint
RESPONSE_CONSTRAINT1 = TOPOLOGY_OPTIMIZATION.Children[3]
RESPONSE_CONSTRAINT1.DefineBy = ResponseConstraintDefineBy.Range
RESPONSE_CONSTRAINT1.PercentageToRetainMin = 50
RESPONSE_CONSTRAINT1.PercentageToRetainMax = 70

# Insert Reaction Force Constraint
RESPONSE_CONSTRAINT2 = TOPOLOGY_OPTIMIZATION.AddReactionForceConstraint()
RESPONSE_CONSTRAINT2.Location = Fixed_Support_1
RESPONSE_CONSTRAINT2.AxisSelection = AxisSelectionType.XAxis
RESPONSE_CONSTRAINT2.ReactionForceCriteria = ReactionForceCriteriaType.Sum
RESPONSE_CONSTRAINT2.BoundType = TopoBoundType.LowerBound
RESPONSE_CONSTRAINT2.XComponentMax.Output.DiscreteValues=[Quantity ("500 [N]")]
	
# Insert Reaction Force Constraint
RESPONSE_CONSTRAINT3 = TOPOLOGY_OPTIMIZATION.AddReactionForceConstraint()
RESPONSE_CONSTRAINT3.Location = Fixed_Support_2
RESPONSE_CONSTRAINT3.AxisSelection = AxisSelectionType.XAxis
RESPONSE_CONSTRAINT3.ReactionForceCriteria = ReactionForceCriteriaType.Sum
RESPONSE_CONSTRAINT3.BoundType = TopoBoundType.LowerBound
RESPONSE_CONSTRAINT3.XComponentMax.Output.DiscreteValues=[Quantity ("100 [N]")]

# Get Tracker and Result
SOLUTION2 = TOPOLOGY_OPTIMIZATION.Solution
SOLUTION_INFORMATION2 = SOLUTION2.SolutionInformation
TOPOLOGY_DENSITY_TRACKER1 = SOLUTION_INFORMATION2.Children[0]

TOPOLOGY_DENSITY1 = SOLUTION2.Children[1]

# Insert Smoothing
SMOOTHING1 = TOPOLOGY_DENSITY1.AddSmoothing()


#Scenario 7 Solve and Review Results

SOLUTION2.Solve(True)

TOPO_DENS1_OV = TOPOLOGY_DENSITY1.OriginalVolume.Value
TOPO_DENS1_FV = TOPOLOGY_DENSITY1.FinalVolume.Value
TOPO_DENS1_PVO = TOPOLOGY_DENSITY1.PercentVolumeOfOriginal

TOPO_DENS1_OM = TOPOLOGY_DENSITY1.OriginalMass.Value
TOPO_DENS1_FM = TOPOLOGY_DENSITY1.FinalMass.Value
TOPO_DENS1_PMO = TOPOLOGY_DENSITY1.PercentMassOfOriginal

Summary

This example demonstrates how scripting in Mechanical can be used to automate your actions.