From b12769d0578cf73522e79664bed507424282805b Mon Sep 17 00:00:00 2001 From: dkunhamb Date: Mon, 16 Oct 2023 09:02:00 -0500 Subject: [PATCH 01/16] adding topo file --- .../topology_optimization_cantilever.py | 158 ++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 examples/technology_showcase/topology_optimization_cantilever.py diff --git a/examples/technology_showcase/topology_optimization_cantilever.py b/examples/technology_showcase/topology_optimization_cantilever.py new file mode 100644 index 00000000..febe9521 --- /dev/null +++ b/examples/technology_showcase/topology_optimization_cantilever.py @@ -0,0 +1,158 @@ + +import os +import ansys.mechanical.core as mech +from ansys.mechanical.core.examples import delete_downloads, download_file + +from matplotlib import image as mpimg +from matplotlib import pyplot as plt +#Embed Mechanical and set global variables +app = mech.App(version=232) +globals().update(mech.global_variables(app)) +print(app) +from Ansys.ACT.Interfaces.Common import * +from Ansys.ACT.Mechanical.Fields import * +from Ansys.Mechanical.DataModel.Enums import * +from Ansys.Mechanical.DataModel.MechanicalEnums import * +from Ansys.ACT.Automation.Mechanical import * + +cwd = os.path.join(os.getcwd(), "out") +def display_image(image_name): + path = os.path.join(os.path.join(cwd, image_name)) + image = mpimg.imread(path) + plt.figure(figsize=(15, 15)) + plt.axis("off") + plt.imshow(image) + plt.show() + +structural_mechdat_file = download_file("cantilever.mechdat", "pymechanical", "embedding") +app.open(structural_mechdat_file) +structural_analysis = ExtAPI.DataModel.Project.Model.Analyses[0] +STRUCT_ID = structural_analysis.Id +structural_analysis.Solve() + +############################################## +# Configure graphics for image export +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +ExtAPI.Graphics.Camera.SetSpecificViewOrientation( + Ansys.Mechanical.DataModel.Enums.ViewOrientationType.Iso +) +image_export_format = Ansys.Mechanical.DataModel.Enums.GraphicsImageExportFormat.PNG +settings_720p = Ansys.Mechanical.Graphics.GraphicsImageExportSettings() +settings_720p.Resolution = ( + Ansys.Mechanical.DataModel.Enums.GraphicsResolutionType.EnhancedResolution +) +settings_720p.Background = Ansys.Mechanical.DataModel.Enums.GraphicsBackgroundType.White +settings_720p.Width = 1280 +settings_720p.Capture = Ansys.Mechanical.DataModel.Enums.GraphicsCaptureType.ImageOnly +settings_720p.Height = 720 +settings_720p.CurrentGraphicsDisplay = False +################################################################################### +# Structural Analsys Results +structural_solution = structural_analysis.Solution +# Total Deformation +structural_solution.Children[1].Activate() +ExtAPI.Graphics.Camera.SetFit() +ExtAPI.Graphics.ExportImage( + os.path.join(cwd, "total_deformation.png"), image_export_format, settings_720p +) +# Equivalent Stress +structural_solution.Children[2].Activate() +ExtAPI.Graphics.Camera.SetFit() +ExtAPI.Graphics.ExportImage( + os.path.join(cwd, "equivalent_stress.png"), image_export_format, settings_720p +) +display_image("equivalent_stress.png") +############################################################## +# Topology Optimization + +# Set MKS Unit System +ExtAPI.Application.ActiveUnitSystem = MechanicalUnitSystem.StandardMKS + +# Store all main tree nodes as variables" +GEOM = ExtAPI.DataModel.Project.Model.Geometry +MSH = ExtAPI.DataModel.Project.Model.Mesh +NS_GRP = ExtAPI.DataModel.Project.Model.NamedSelections +CONN_GRP = ExtAPI.DataModel.Project.Model.Connections + + +MY_TOTAL_VOL = GEOM.Volume.Value +MY_TOTAL_MA = GEOM.Mass.Value +#Get Sturctural Analysis and link to Topo +TOPO_OPT = ExtAPI.DataModel.Project.Model.AddTopologyOptimizationAnalysis() +TOPO_OPT.TransferDataFrom(structural_analysis) + +# Set None for Optimization Region Boundary Condition Exclusion Region +#Optimization Region +OPT_REG=TOPO_OPT.Children[1] +# OPT_REG.BoundaryCondition=BoundaryConditionType.None +# Using getattr since pythonnet doesn not support enum None +OPT_REG.BoundaryCondition=getattr(BoundaryConditionType,'None') + +# Insert Volume Response Constraint Object for Topology Optimization" +#Delete Mass Response Constraint +MASS_CONSTRN=TOPO_OPT.Children[3] +MASS_CONSTRN.Delete() +#Add Volume Response Constraint +VOL_CONSTRN=TOPO_OPT.AddVolumeConstraint() +#VOL_CONSTRN.DefineBy=ResponseConstraintDefineBy.Constant +#VOL_CONSTRN.PercentageToRetain=50 + +#Insert Member Size Manufacturing Constraint +MEM_SIZE_MFG_CONSTRN=TOPO_OPT.AddMemberSizeManufacturingConstraint() +MEM_SIZE_MFG_CONSTRN.Minimum=ManuMemberSizeControlledType.Manual +MEM_SIZE_MFG_CONSTRN.MinSize=Quantity("2.4 [m]") + +# Store Coordinate System ID for use in Symmetry Manufacturing Constraint +Coordinate_Systems=DataModel.Project.Model.CoordinateSystems +coord_sys7=Coordinate_Systems.Children[7] + +#Insert Symmetry Manufacturing Constraint +SYMM_MFG_CONSTRN=TOPO_OPT.AddSymmetryManufacturingConstraint() +SYMM_MFG_CONSTRN.CoordinateSystem=coord_sys7 + +# Setting different Coordinate System Axis for Symmetry Manufacturing Constraint +SYMM_MFG_CONSTRN_axis = str(SYMM_MFG_CONSTRN.Axis) +# Verify default Axis for Symmetry Manufacturing Constraint", SYMM_MFG_CONSTRN_axis, "PositiveXAxis +SYMM_MFG_CONSTRN.Axis=CoordinateSystemAxisType.PositiveYAxis +SYMM_MFG_CONSTRN_axis = str(SYMM_MFG_CONSTRN.Axis) +SYMM_MFG_CONSTRN.Axis=CoordinateSystemAxisType.PositiveXAxis + + +TOPO_OPT.Solution.Solve(True) + +#Go to first Topology Density Result +TOPO_OPT.Solution.Children[1].Activate() +TOPO_DENS = TOPO_OPT.Solution.Children[1] +# Adding smoothing the STL +TOPO_DENS.AddSmoothing() +TOPO_OPT.Solution.EvaluateAllResults() +TOPO_DENS.Children[0].Activate() +ExtAPI.Graphics.Camera.SetFit() +ExtAPI.Graphics.ExportImage( + os.path.join(cwd, "topo_opitimized_smooth.png"), image_export_format, settings_720p +) +display_image("topo_opitimized_smooth.png") +########################################################################## +# Compare the results +TOPO_DENS_min = TOPO_DENS.Minimum +TOPO_DENS_max = TOPO_DENS.Maximum +TOPO_DENS_ov = TOPO_DENS.OriginalVolume.Value +TOPO_DENS_fv = TOPO_DENS.FinalVolume.Value +TOPO_DENS_pvo = TOPO_DENS.PercentVolumeOfOriginal +TOPO_DENS_om = TOPO_DENS.OriginalMass.Value +TOPO_DENS_fm = TOPO_DENS.FinalMass.Value +TOPO_DENS_pmo = TOPO_DENS.PercentMassOfOriginal +TOPO_DENS_itrn = TOPO_DENS.IterationNumber +print("Original Volume for Topology Density Result", TOPO_DENS_ov) +print("Final Volume for Topology Density Result", TOPO_DENS_fv) +print("Percent Volume of Original for Topology Density Result", TOPO_DENS_pvo) +print("Original Mass for Topology Density Result", TOPO_DENS_om) +print("Final Mass for Topology Density Result", TOPO_DENS_fm) +print("Percent Mass of Original for Topology Density Result", TOPO_DENS_pmo) + +# Save project +app.save(os.path.join(os.getcwd(), "cantilever_topology_optimization.mechdat")) +app.new() + +# delete example file +delete_downloads() \ No newline at end of file From 8b3e6b264e6a927615e877bb5c127822f34713af Mon Sep 17 00:00:00 2001 From: dkunhamb Date: Mon, 16 Oct 2023 09:05:09 -0500 Subject: [PATCH 02/16] adding topo file --- .../topology_optimization_cantilever.py | 63 ++++++++++--------- 1 file changed, 34 insertions(+), 29 deletions(-) diff --git a/examples/technology_showcase/topology_optimization_cantilever.py b/examples/technology_showcase/topology_optimization_cantilever.py index febe9521..99ec6607 100644 --- a/examples/technology_showcase/topology_optimization_cantilever.py +++ b/examples/technology_showcase/topology_optimization_cantilever.py @@ -1,21 +1,23 @@ - import os + import ansys.mechanical.core as mech from ansys.mechanical.core.examples import delete_downloads, download_file - from matplotlib import image as mpimg from matplotlib import pyplot as plt -#Embed Mechanical and set global variables + +# Embed Mechanical and set global variables app = mech.App(version=232) globals().update(mech.global_variables(app)) print(app) +from Ansys.ACT.Automation.Mechanical import * from Ansys.ACT.Interfaces.Common import * from Ansys.ACT.Mechanical.Fields import * from Ansys.Mechanical.DataModel.Enums import * from Ansys.Mechanical.DataModel.MechanicalEnums import * -from Ansys.ACT.Automation.Mechanical import * cwd = os.path.join(os.getcwd(), "out") + + def display_image(image_name): path = os.path.join(os.path.join(cwd, image_name)) image = mpimg.imread(path) @@ -24,7 +26,10 @@ def display_image(image_name): plt.imshow(image) plt.show() -structural_mechdat_file = download_file("cantilever.mechdat", "pymechanical", "embedding") + +structural_mechdat_file = download_file( + "cantilever.mechdat", "pymechanical", "embedding" +) app.open(structural_mechdat_file) structural_analysis = ExtAPI.DataModel.Project.Model.Analyses[0] STRUCT_ID = structural_analysis.Id @@ -77,50 +82,50 @@ def display_image(image_name): MY_TOTAL_VOL = GEOM.Volume.Value MY_TOTAL_MA = GEOM.Mass.Value -#Get Sturctural Analysis and link to Topo +# Get Structural Analysis and link to Topo TOPO_OPT = ExtAPI.DataModel.Project.Model.AddTopologyOptimizationAnalysis() TOPO_OPT.TransferDataFrom(structural_analysis) # Set None for Optimization Region Boundary Condition Exclusion Region -#Optimization Region -OPT_REG=TOPO_OPT.Children[1] +# Optimization Region +OPT_REG = TOPO_OPT.Children[1] # OPT_REG.BoundaryCondition=BoundaryConditionType.None # Using getattr since pythonnet doesn not support enum None -OPT_REG.BoundaryCondition=getattr(BoundaryConditionType,'None') +OPT_REG.BoundaryCondition = getattr(BoundaryConditionType, "None") -# Insert Volume Response Constraint Object for Topology Optimization" -#Delete Mass Response Constraint -MASS_CONSTRN=TOPO_OPT.Children[3] +# Insert Volume Response Constraint Object for Topology Optimization" +# Delete Mass Response Constraint +MASS_CONSTRN = TOPO_OPT.Children[3] MASS_CONSTRN.Delete() -#Add Volume Response Constraint -VOL_CONSTRN=TOPO_OPT.AddVolumeConstraint() -#VOL_CONSTRN.DefineBy=ResponseConstraintDefineBy.Constant -#VOL_CONSTRN.PercentageToRetain=50 +# Add Volume Response Constraint +VOL_CONSTRN = TOPO_OPT.AddVolumeConstraint() +# VOL_CONSTRN.DefineBy=ResponseConstraintDefineBy.Constant +# VOL_CONSTRN.PercentageToRetain=50 -#Insert Member Size Manufacturing Constraint -MEM_SIZE_MFG_CONSTRN=TOPO_OPT.AddMemberSizeManufacturingConstraint() -MEM_SIZE_MFG_CONSTRN.Minimum=ManuMemberSizeControlledType.Manual -MEM_SIZE_MFG_CONSTRN.MinSize=Quantity("2.4 [m]") +# Insert Member Size Manufacturing Constraint +MEM_SIZE_MFG_CONSTRN = TOPO_OPT.AddMemberSizeManufacturingConstraint() +MEM_SIZE_MFG_CONSTRN.Minimum = ManuMemberSizeControlledType.Manual +MEM_SIZE_MFG_CONSTRN.MinSize = Quantity("2.4 [m]") # Store Coordinate System ID for use in Symmetry Manufacturing Constraint -Coordinate_Systems=DataModel.Project.Model.CoordinateSystems -coord_sys7=Coordinate_Systems.Children[7] +Coordinate_Systems = DataModel.Project.Model.CoordinateSystems +coord_sys7 = Coordinate_Systems.Children[7] -#Insert Symmetry Manufacturing Constraint -SYMM_MFG_CONSTRN=TOPO_OPT.AddSymmetryManufacturingConstraint() -SYMM_MFG_CONSTRN.CoordinateSystem=coord_sys7 +# Insert Symmetry Manufacturing Constraint +SYMM_MFG_CONSTRN = TOPO_OPT.AddSymmetryManufacturingConstraint() +SYMM_MFG_CONSTRN.CoordinateSystem = coord_sys7 # Setting different Coordinate System Axis for Symmetry Manufacturing Constraint SYMM_MFG_CONSTRN_axis = str(SYMM_MFG_CONSTRN.Axis) # Verify default Axis for Symmetry Manufacturing Constraint", SYMM_MFG_CONSTRN_axis, "PositiveXAxis -SYMM_MFG_CONSTRN.Axis=CoordinateSystemAxisType.PositiveYAxis +SYMM_MFG_CONSTRN.Axis = CoordinateSystemAxisType.PositiveYAxis SYMM_MFG_CONSTRN_axis = str(SYMM_MFG_CONSTRN.Axis) -SYMM_MFG_CONSTRN.Axis=CoordinateSystemAxisType.PositiveXAxis +SYMM_MFG_CONSTRN.Axis = CoordinateSystemAxisType.PositiveXAxis TOPO_OPT.Solution.Solve(True) -#Go to first Topology Density Result +# Go to first Topology Density Result TOPO_OPT.Solution.Children[1].Activate() TOPO_DENS = TOPO_OPT.Solution.Children[1] # Adding smoothing the STL @@ -155,4 +160,4 @@ def display_image(image_name): app.new() # delete example file -delete_downloads() \ No newline at end of file +delete_downloads() From 8bb1ed0fa25c5fcd82fbc18c33195032fa1dc206 Mon Sep 17 00:00:00 2001 From: dkunhamb Date: Mon, 16 Oct 2023 09:43:46 -0500 Subject: [PATCH 03/16] Adding docstring --- .gitignore | 2 +- .../topology_optimization_cantilever.py | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index c6480381..098807c6 100644 --- a/.gitignore +++ b/.gitignore @@ -154,7 +154,7 @@ cython_debug/ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ +.idea/ # VSCode .vscode diff --git a/examples/technology_showcase/topology_optimization_cantilever.py b/examples/technology_showcase/topology_optimization_cantilever.py index 99ec6607..d4d4a993 100644 --- a/examples/technology_showcase/topology_optimization_cantilever.py +++ b/examples/technology_showcase/topology_optimization_cantilever.py @@ -1,3 +1,14 @@ +""" .. _ref_topology_optimization: + +Topology Optimization of a Simple Cantilever +--------------------------------------------------------------------------------------- +Description: + +This example demonstrates the Structural Optimization of simple +cantilver. The Structural Analysis is performed with basic constraints and +load then transferred to topology optimization. +""" + import os import ansys.mechanical.core as mech @@ -156,7 +167,7 @@ def display_image(image_name): print("Percent Mass of Original for Topology Density Result", TOPO_DENS_pmo) # Save project -app.save(os.path.join(os.getcwd(), "cantilever_topology_optimization.mechdat")) +app.save(os.path.join(cwd, "cantilever_topology_optimization.mechdat")) app.new() # delete example file From 19f9c2657689a23680b14b19210d3654ceeb2fa9 Mon Sep 17 00:00:00 2001 From: dkunhamb Date: Mon, 16 Oct 2023 09:45:26 -0500 Subject: [PATCH 04/16] changing to basic example --- .../topology_optimization_cantilever.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename examples/{technology_showcase => basic}/topology_optimization_cantilever.py (100%) diff --git a/examples/technology_showcase/topology_optimization_cantilever.py b/examples/basic/topology_optimization_cantilever.py similarity index 100% rename from examples/technology_showcase/topology_optimization_cantilever.py rename to examples/basic/topology_optimization_cantilever.py From 4c419216a5780e063d23cb6269bf202db949edc2 Mon Sep 17 00:00:00 2001 From: dkunhamb Date: Mon, 16 Oct 2023 10:42:00 -0500 Subject: [PATCH 05/16] adding subsection --- .../basic/topology_optimization_cantilever.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/examples/basic/topology_optimization_cantilever.py b/examples/basic/topology_optimization_cantilever.py index d4d4a993..321e7bac 100644 --- a/examples/basic/topology_optimization_cantilever.py +++ b/examples/basic/topology_optimization_cantilever.py @@ -48,7 +48,6 @@ def display_image(image_name): ############################################## # Configure graphics for image export -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ExtAPI.Graphics.Camera.SetSpecificViewOrientation( Ansys.Mechanical.DataModel.Enums.ViewOrientationType.Iso ) @@ -62,15 +61,19 @@ def display_image(image_name): settings_720p.Capture = Ansys.Mechanical.DataModel.Enums.GraphicsCaptureType.ImageOnly settings_720p.Height = 720 settings_720p.CurrentGraphicsDisplay = False -################################################################################### +############################### # Structural Analsys Results +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~ structural_solution = structural_analysis.Solution +############################### # Total Deformation structural_solution.Children[1].Activate() ExtAPI.Graphics.Camera.SetFit() ExtAPI.Graphics.ExportImage( os.path.join(cwd, "total_deformation.png"), image_export_format, settings_720p ) +display_image("total_deformation.png") +############################### # Equivalent Stress structural_solution.Children[2].Activate() ExtAPI.Graphics.Camera.SetFit() @@ -80,6 +83,7 @@ def display_image(image_name): display_image("equivalent_stress.png") ############################################################## # Topology Optimization +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Set MKS Unit System ExtAPI.Application.ActiveUnitSystem = MechanicalUnitSystem.StandardMKS @@ -90,10 +94,9 @@ def display_image(image_name): NS_GRP = ExtAPI.DataModel.Project.Model.NamedSelections CONN_GRP = ExtAPI.DataModel.Project.Model.Connections - MY_TOTAL_VOL = GEOM.Volume.Value MY_TOTAL_MA = GEOM.Mass.Value -# Get Structural Analysis and link to Topo +# Get Structural Analysis and link to Topology optimization TOPO_OPT = ExtAPI.DataModel.Project.Model.AddTopologyOptimizationAnalysis() TOPO_OPT.TransferDataFrom(structural_analysis) @@ -133,12 +136,14 @@ def display_image(image_name): SYMM_MFG_CONSTRN_axis = str(SYMM_MFG_CONSTRN.Axis) SYMM_MFG_CONSTRN.Axis = CoordinateSystemAxisType.PositiveXAxis - TOPO_OPT.Solution.Solve(True) -# Go to first Topology Density Result +############################################################## +# Results +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~ TOPO_OPT.Solution.Children[1].Activate() TOPO_DENS = TOPO_OPT.Solution.Children[1] +################################### # Adding smoothing the STL TOPO_DENS.AddSmoothing() TOPO_OPT.Solution.EvaluateAllResults() From 46072a9acf373d0ba1e20b56d1eea9bd81169758 Mon Sep 17 00:00:00 2001 From: Dipin <26918585+dipinknair@users.noreply.github.com> Date: Mon, 16 Oct 2023 13:09:14 -0500 Subject: [PATCH 06/16] Apply suggestions from code review Co-authored-by: Kerry McAdams <58492561+klmcadams@users.noreply.github.com> --- .../basic/topology_optimization_cantilever.py | 57 +++++++++++-------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/examples/basic/topology_optimization_cantilever.py b/examples/basic/topology_optimization_cantilever.py index 321e7bac..dfe7a7e4 100644 --- a/examples/basic/topology_optimization_cantilever.py +++ b/examples/basic/topology_optimization_cantilever.py @@ -1,12 +1,11 @@ """ .. _ref_topology_optimization: Topology Optimization of a Simple Cantilever ---------------------------------------------------------------------------------------- -Description: +-------------------------------------------- -This example demonstrates the Structural Optimization of simple -cantilver. The Structural Analysis is performed with basic constraints and -load then transferred to topology optimization. +This example demonstrates the structural topology optimization of a simple +cantilever. The structural analysis is performed with basic constraints and +load, which is then transferred to topology optimization. """ import os @@ -48,6 +47,7 @@ def display_image(image_name): ############################################## # Configure graphics for image export + ExtAPI.Graphics.Camera.SetSpecificViewOrientation( Ansys.Mechanical.DataModel.Enums.ViewOrientationType.Iso ) @@ -61,26 +61,33 @@ def display_image(image_name): settings_720p.Capture = Ansys.Mechanical.DataModel.Enums.GraphicsCaptureType.ImageOnly settings_720p.Height = 720 settings_720p.CurrentGraphicsDisplay = False + ############################### # Structural Analsys Results # ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + structural_solution = structural_analysis.Solution + ############################### # Total Deformation + structural_solution.Children[1].Activate() ExtAPI.Graphics.Camera.SetFit() ExtAPI.Graphics.ExportImage( os.path.join(cwd, "total_deformation.png"), image_export_format, settings_720p ) display_image("total_deformation.png") + ############################### # Equivalent Stress + structural_solution.Children[2].Activate() ExtAPI.Graphics.Camera.SetFit() ExtAPI.Graphics.ExportImage( os.path.join(cwd, "equivalent_stress.png"), image_export_format, settings_720p ) display_image("equivalent_stress.png") + ############################################################## # Topology Optimization # ~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -88,7 +95,7 @@ def display_image(image_name): # Set MKS Unit System ExtAPI.Application.ActiveUnitSystem = MechanicalUnitSystem.StandardMKS -# Store all main tree nodes as variables" +# Store all main tree nodes as variables GEOM = ExtAPI.DataModel.Project.Model.Geometry MSH = ExtAPI.DataModel.Project.Model.Mesh NS_GRP = ExtAPI.DataModel.Project.Model.NamedSelections @@ -140,11 +147,14 @@ def display_image(image_name): ############################################################## # Results -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# ~~~~~~~ + TOPO_OPT.Solution.Children[1].Activate() TOPO_DENS = TOPO_OPT.Solution.Children[1] + ################################### -# Adding smoothing the STL +# Add smoothing to the STL + TOPO_DENS.AddSmoothing() TOPO_OPT.Solution.EvaluateAllResults() TOPO_DENS.Children[0].Activate() @@ -153,27 +163,26 @@ def display_image(image_name): os.path.join(cwd, "topo_opitimized_smooth.png"), image_export_format, settings_720p ) display_image("topo_opitimized_smooth.png") + ########################################################################## # Compare the results -TOPO_DENS_min = TOPO_DENS.Minimum -TOPO_DENS_max = TOPO_DENS.Maximum -TOPO_DENS_ov = TOPO_DENS.OriginalVolume.Value -TOPO_DENS_fv = TOPO_DENS.FinalVolume.Value -TOPO_DENS_pvo = TOPO_DENS.PercentVolumeOfOriginal -TOPO_DENS_om = TOPO_DENS.OriginalMass.Value -TOPO_DENS_fm = TOPO_DENS.FinalMass.Value -TOPO_DENS_pmo = TOPO_DENS.PercentMassOfOriginal -TOPO_DENS_itrn = TOPO_DENS.IterationNumber -print("Original Volume for Topology Density Result", TOPO_DENS_ov) -print("Final Volume for Topology Density Result", TOPO_DENS_fv) -print("Percent Volume of Original for Topology Density Result", TOPO_DENS_pvo) -print("Original Mass for Topology Density Result", TOPO_DENS_om) -print("Final Mass for Topology Density Result", TOPO_DENS_fm) -print("Percent Mass of Original for Topology Density Result", TOPO_DENS_pmo) + + +# Print topology density results +print("Topology Density Results") +print("Minimum Density: ", TOPO_DENS.Minimum) +print("Maximum Density: ", TOPO_DENS.Maximum) +print("Iteration Number: ", TOPO_DENS.IterationNumber) +print("Original Volume: ", TOPO_DENS.OriginalVolume.Value) +print("Final Volume: ", TOPO_DENS.FinalVolume.Value) +print("Percent Volume of Original: ", TOPO_DENS.PercentVolumeOfOriginal) +print("Original Mass: ", TOPO_DENS.OriginalMass.Value) +print("Final Mass: ", TOPO_DENS.FinalMass.Value) +print("Percent Mass of Original: ", TOPO_DENS.PercentMassOfOriginal) # Save project app.save(os.path.join(cwd, "cantilever_topology_optimization.mechdat")) app.new() -# delete example file +# Delete the example file delete_downloads() From 7641658f33be2db76cfb0297745db2b139482e8c Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 16 Oct 2023 18:09:30 +0000 Subject: [PATCH 07/16] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- examples/basic/topology_optimization_cantilever.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/basic/topology_optimization_cantilever.py b/examples/basic/topology_optimization_cantilever.py index dfe7a7e4..8d8bb745 100644 --- a/examples/basic/topology_optimization_cantilever.py +++ b/examples/basic/topology_optimization_cantilever.py @@ -168,7 +168,7 @@ def display_image(image_name): # Compare the results -# Print topology density results +# Print topology density results print("Topology Density Results") print("Minimum Density: ", TOPO_DENS.Minimum) print("Maximum Density: ", TOPO_DENS.Maximum) From 175e4fd652d3d545f96824b1f432dd180bf236ac Mon Sep 17 00:00:00 2001 From: dkunhamb Date: Mon, 16 Oct 2023 14:08:56 -0500 Subject: [PATCH 08/16] Adding checkpoints --- .../basic/topology_optimization_cantilever.py | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/examples/basic/topology_optimization_cantilever.py b/examples/basic/topology_optimization_cantilever.py index 8d8bb745..b6ff40d0 100644 --- a/examples/basic/topology_optimization_cantilever.py +++ b/examples/basic/topology_optimization_cantilever.py @@ -41,9 +41,11 @@ def display_image(image_name): "cantilever.mechdat", "pymechanical", "embedding" ) app.open(structural_mechdat_file) -structural_analysis = ExtAPI.DataModel.Project.Model.Analyses[0] -STRUCT_ID = structural_analysis.Id -structural_analysis.Solve() +STRUCT = ExtAPI.DataModel.Project.Model.Analyses[0] +assert str(STRUCT.ObjectState) == "Solved" +STRUCT_SLN = STRUCT.Solution +STRUCT_SLN.Solve(True) +assert str(STRUCT_SLN.Status) == "Done", "Solution status is not 'Done'" ############################################## # Configure graphics for image export @@ -66,12 +68,10 @@ def display_image(image_name): # Structural Analsys Results # ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -structural_solution = structural_analysis.Solution - ############################### # Total Deformation -structural_solution.Children[1].Activate() +STRUCT_SLN.Children[1].Activate() ExtAPI.Graphics.Camera.SetFit() ExtAPI.Graphics.ExportImage( os.path.join(cwd, "total_deformation.png"), image_export_format, settings_720p @@ -81,7 +81,7 @@ def display_image(image_name): ############################### # Equivalent Stress -structural_solution.Children[2].Activate() +STRUCT_SLN.Children[2].Activate() ExtAPI.Graphics.Camera.SetFit() ExtAPI.Graphics.ExportImage( os.path.join(cwd, "equivalent_stress.png"), image_export_format, settings_720p @@ -105,7 +105,8 @@ def display_image(image_name): MY_TOTAL_MA = GEOM.Mass.Value # Get Structural Analysis and link to Topology optimization TOPO_OPT = ExtAPI.DataModel.Project.Model.AddTopologyOptimizationAnalysis() -TOPO_OPT.TransferDataFrom(structural_analysis) +TOPO_OPT.TransferDataFrom(STRUCT) +assert str(TOPO_OPT.ObjectState) == "NotSolved" # Set None for Optimization Region Boundary Condition Exclusion Region # Optimization Region @@ -143,14 +144,16 @@ def display_image(image_name): SYMM_MFG_CONSTRN_axis = str(SYMM_MFG_CONSTRN.Axis) SYMM_MFG_CONSTRN.Axis = CoordinateSystemAxisType.PositiveXAxis -TOPO_OPT.Solution.Solve(True) +TOPO_OPT_SLN = TOPO_OPT.Solution +TOPO_OPT_SLN.Solve(True) +assert str(TOPO_OPT_SLN.Status) == "Done", "Solution status is not 'Done'" ############################################################## # Results # ~~~~~~~ -TOPO_OPT.Solution.Children[1].Activate() -TOPO_DENS = TOPO_OPT.Solution.Children[1] +TOPO_OPT_SLN.Children[1].Activate() +TOPO_DENS = TOPO_OPT_SLN.Children[1] ################################### # Add smoothing to the STL From 6ddb955daadebf679d03aaee52b86f62fc8fa0cd Mon Sep 17 00:00:00 2001 From: dkunhamb Date: Mon, 16 Oct 2023 18:50:09 -0500 Subject: [PATCH 09/16] test mechdat file --- .github/workflows/ci_cd.yml | 17 +++- examples/basic/test.py | 193 ++++++++++++++++++++++++++++++++++++ 2 files changed, 209 insertions(+), 1 deletion(-) create mode 100644 examples/basic/test.py diff --git a/.github/workflows/ci_cd.yml b/.github/workflows/ci_cd.yml index 5bcb63d8..8733a64d 100644 --- a/.github/workflows/ci_cd.yml +++ b/.github/workflows/ci_cd.yml @@ -103,6 +103,21 @@ jobs: # key: doc-build-v${{ env.RESET_DOC_BUILD_CACHE }}-${{ env.PYMECHANICAL_VERSION }}-${{ github.sha }} # restore-keys: | # doc-build-v${{ env.RESET_DOC_BUILD_CACHE }}-${{ env.PYMECHANICAL_VERSION }} + - name: test cantilever + env: + LICENSE_SERVER: ${{ secrets.LICENSE_SERVER }} + ANSYSCL232_DIR: /install/ansys_inc/v232/licensingclient + ANSYSLMD_LICENSE_FILE: 1055@${{ secrets.LICENSE_SERVER }} + ANSYS_WORKBENCH_LOGGING_FILTER_LEVEL: 0 + run: | + xvfb-run /install/ansys_inc/v232/aisol/.workbench_lite python examples/basic/test.py || true + + - name: Upload mechdat + uses: actions/upload-artifact@v3 + with: + name: output + path: out + retention-days: 7 - name: Build docs env: @@ -159,4 +174,4 @@ jobs: branch: gh-pages folder: documentation-html/ clean: true - single-commit: true + single-commit: true \ No newline at end of file diff --git a/examples/basic/test.py b/examples/basic/test.py new file mode 100644 index 00000000..00eb0c38 --- /dev/null +++ b/examples/basic/test.py @@ -0,0 +1,193 @@ +""" .. _ref_topology_optimization: + +Topology Optimization of a Simple Cantilever +-------------------------------------------- + +This example demonstrates the structural topology optimization of a simple +cantilever. The structural analysis is performed with basic constraints and +load, which is then transferred to topology optimization. +""" + +import os + +import ansys.mechanical.core as mech +from ansys.mechanical.core.examples import delete_downloads, download_file +from matplotlib import image as mpimg +from matplotlib import pyplot as plt + +# Embed Mechanical and set global variables +app = mech.App(version=232) +globals().update(mech.global_variables(app)) +print(app) +# from Ansys.ACT.Automation.Mechanical import * +# from Ansys.ACT.Interfaces.Common import * +# from Ansys.ACT.Mechanical.Fields import * +# from Ansys.Mechanical.DataModel.Enums import * +# from Ansys.Mechanical.DataModel.MechanicalEnums import * + +cwd = os.path.join(os.getcwd(), "out") + + +def display_image(image_name): + path = os.path.join(os.path.join(cwd, image_name)) + image = mpimg.imread(path) + plt.figure(figsize=(15, 15)) + plt.axis("off") + plt.imshow(image) + plt.show() + + +structural_mechdat_file = download_file( + "cantilever.mechdat", "pymechanical", "embedding" +) +app.open(structural_mechdat_file) +# STRUCT = ExtAPI.DataModel.Project.Model.Analyses[0] +# assert str(STRUCT.ObjectState) == "Solved" +# STRUCT_SLN = STRUCT.Solution +# STRUCT_SLN.Solve(True) +# assert str(STRUCT_SLN.Status) == "Done", "Solution status is not 'Done'" + +# ############################################## +# # Configure graphics for image export + +# ExtAPI.Graphics.Camera.SetSpecificViewOrientation( +# Ansys.Mechanical.DataModel.Enums.ViewOrientationType.Iso +# ) +# image_export_format = Ansys.Mechanical.DataModel.Enums.GraphicsImageExportFormat.PNG +# settings_720p = Ansys.Mechanical.Graphics.GraphicsImageExportSettings() +# settings_720p.Resolution = ( +# Ansys.Mechanical.DataModel.Enums.GraphicsResolutionType.EnhancedResolution +# ) +# settings_720p.Background = Ansys.Mechanical.DataModel.Enums.GraphicsBackgroundType.White +# settings_720p.Width = 1280 +# settings_720p.Capture = Ansys.Mechanical.DataModel.Enums.GraphicsCaptureType.ImageOnly +# settings_720p.Height = 720 +# settings_720p.CurrentGraphicsDisplay = False + +# ############################### +# # Structural Analsys Results +# # ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# ############################### +# # Total Deformation + +# STRUCT_SLN.Children[1].Activate() +# ExtAPI.Graphics.Camera.SetFit() +# ExtAPI.Graphics.ExportImage( +# os.path.join(cwd, "total_deformation.png"), image_export_format, settings_720p +# ) +# display_image("total_deformation.png") + +# ############################### +# # Equivalent Stress + +# STRUCT_SLN.Children[2].Activate() +# ExtAPI.Graphics.Camera.SetFit() +# ExtAPI.Graphics.ExportImage( +# os.path.join(cwd, "equivalent_stress.png"), image_export_format, settings_720p +# ) +# display_image("equivalent_stress.png") + +# ############################################################## +# # Topology Optimization +# # ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# # Set MKS Unit System +# ExtAPI.Application.ActiveUnitSystem = MechanicalUnitSystem.StandardMKS + +# # Store all main tree nodes as variables +# GEOM = ExtAPI.DataModel.Project.Model.Geometry +# MSH = ExtAPI.DataModel.Project.Model.Mesh +# NS_GRP = ExtAPI.DataModel.Project.Model.NamedSelections +# CONN_GRP = ExtAPI.DataModel.Project.Model.Connections + +# MY_TOTAL_VOL = GEOM.Volume.Value +# MY_TOTAL_MA = GEOM.Mass.Value +# # Get Structural Analysis and link to Topology optimization +# TOPO_OPT = ExtAPI.DataModel.Project.Model.AddTopologyOptimizationAnalysis() +# TOPO_OPT.TransferDataFrom(STRUCT) +# assert str(TOPO_OPT.ObjectState) == "NotSolved" + +# # Set None for Optimization Region Boundary Condition Exclusion Region +# # Optimization Region +# OPT_REG = TOPO_OPT.Children[1] +# # OPT_REG.BoundaryCondition=BoundaryConditionType.None +# # Using getattr since pythonnet doesn not support enum None +# OPT_REG.BoundaryCondition = getattr(BoundaryConditionType, "None") + +# # Insert Volume Response Constraint Object for Topology Optimization" +# # Delete Mass Response Constraint +# MASS_CONSTRN = TOPO_OPT.Children[3] +# MASS_CONSTRN.Delete() +# # Add Volume Response Constraint +# VOL_CONSTRN = TOPO_OPT.AddVolumeConstraint() +# # VOL_CONSTRN.DefineBy=ResponseConstraintDefineBy.Constant +# # VOL_CONSTRN.PercentageToRetain=50 + +# # Insert Member Size Manufacturing Constraint +# MEM_SIZE_MFG_CONSTRN = TOPO_OPT.AddMemberSizeManufacturingConstraint() +# MEM_SIZE_MFG_CONSTRN.Minimum = ManuMemberSizeControlledType.Manual +# MEM_SIZE_MFG_CONSTRN.MinSize = Quantity("2.4 [m]") + +# # Store Coordinate System ID for use in Symmetry Manufacturing Constraint +# Coordinate_Systems = DataModel.Project.Model.CoordinateSystems +# coord_sys7 = Coordinate_Systems.Children[7] + +# # Insert Symmetry Manufacturing Constraint +# SYMM_MFG_CONSTRN = TOPO_OPT.AddSymmetryManufacturingConstraint() +# SYMM_MFG_CONSTRN.CoordinateSystem = coord_sys7 + +# # Setting different Coordinate System Axis for Symmetry Manufacturing Constraint +# SYMM_MFG_CONSTRN_axis = str(SYMM_MFG_CONSTRN.Axis) +# # Verify default Axis for Symmetry Manufacturing Constraint +# ", SYMM_MFG_CONSTRN_axis, "PositiveXAxis +# SYMM_MFG_CONSTRN.Axis = CoordinateSystemAxisType.PositiveYAxis +# SYMM_MFG_CONSTRN_axis = str(SYMM_MFG_CONSTRN.Axis) +# SYMM_MFG_CONSTRN.Axis = CoordinateSystemAxisType.PositiveXAxis + +# TOPO_OPT_SLN = TOPO_OPT.Solution +# TOPO_OPT_SLN.Solve(True) +# assert str(TOPO_OPT_SLN.Status) == "Done", "Solution status is not 'Done'" + +# ############################################################## +# # Results +# # ~~~~~~~ + +# TOPO_OPT_SLN.Children[1].Activate() +# TOPO_DENS = TOPO_OPT_SLN.Children[1] + +# ################################### +# # Add smoothing to the STL + +# TOPO_DENS.AddSmoothing() +# TOPO_OPT.Solution.EvaluateAllResults() +# TOPO_DENS.Children[0].Activate() +# ExtAPI.Graphics.Camera.SetFit() +# ExtAPI.Graphics.ExportImage( +# os.path.join(cwd, "topo_opitimized_smooth.png"), image_export_format, settings_720p +# ) +# display_image("topo_opitimized_smooth.png") + +# ########################################################################## +# # Compare the results + + +# # Print topology density results +# print("Topology Density Results") +# print("Minimum Density: ", TOPO_DENS.Minimum) +# print("Maximum Density: ", TOPO_DENS.Maximum) +# print("Iteration Number: ", TOPO_DENS.IterationNumber) +# print("Original Volume: ", TOPO_DENS.OriginalVolume.Value) +# print("Final Volume: ", TOPO_DENS.FinalVolume.Value) +# print("Percent Volume of Original: ", TOPO_DENS.PercentVolumeOfOriginal) +# print("Original Mass: ", TOPO_DENS.OriginalMass.Value) +# print("Final Mass: ", TOPO_DENS.FinalMass.Value) +# print("Percent Mass of Original: ", TOPO_DENS.PercentMassOfOriginal) + +# Save project +os.makedirs(cwd) +app.save(os.path.join(cwd, "cantilever_topology_optimization.mechdat")) +app.new() + +# Delete the example file +delete_downloads() From 22da2c5a69acf13f39f20b5be1cedb5cca90e53b Mon Sep 17 00:00:00 2001 From: dkunhamb Date: Mon, 16 Oct 2023 19:08:59 -0500 Subject: [PATCH 10/16] saving mechdat after solve --- examples/basic/test.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/basic/test.py b/examples/basic/test.py index 00eb0c38..a28e676d 100644 --- a/examples/basic/test.py +++ b/examples/basic/test.py @@ -41,7 +41,8 @@ def display_image(image_name): "cantilever.mechdat", "pymechanical", "embedding" ) app.open(structural_mechdat_file) -# STRUCT = ExtAPI.DataModel.Project.Model.Analyses[0] +STRUCT = ExtAPI.DataModel.Project.Model.Analyses[0] +STRUCT.Solve(True) # assert str(STRUCT.ObjectState) == "Solved" # STRUCT_SLN = STRUCT.Solution # STRUCT_SLN.Solve(True) From 9b72ec2438ee3fe0f60edd7125f8af8e83026808 Mon Sep 17 00:00:00 2001 From: dkunhamb Date: Mon, 16 Oct 2023 19:43:50 -0500 Subject: [PATCH 11/16] changing cores of runner --- .github/workflows/ci_cd.yml | 2 +- .pre-commit-config.yaml | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci_cd.yml b/.github/workflows/ci_cd.yml index 8733a64d..9a67234f 100644 --- a/.github/workflows/ci_cd.yml +++ b/.github/workflows/ci_cd.yml @@ -49,7 +49,7 @@ jobs: doc-build: name: Documentation building - runs-on: ubuntu-latest + runs-on: public-ubuntu-latest-8-cores container: image: ghcr.io/ansys/mechanical:23.2.0 options: --entrypoint /bin/bash diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3c56e564..07b13222 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -38,9 +38,4 @@ repos: - id: check-merge-conflict - id: debug-statements - id: check-yaml - - id: trailing-whitespace - -- repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.27.0 - hooks: - - id: check-github-workflows + - id: trailing-whitespace \ No newline at end of file From b8a80ef228a8f44fe2bcbf01908fe1de0b18aac2 Mon Sep 17 00:00:00 2001 From: dkunhamb Date: Mon, 16 Oct 2023 20:51:26 -0500 Subject: [PATCH 12/16] revert test and ci-cd --- .github/workflows/ci_cd.yml | 15 -- examples/basic/test.py | 194 ------------------ .../basic/topology_optimization_cantilever.py | 21 +- 3 files changed, 9 insertions(+), 221 deletions(-) delete mode 100644 examples/basic/test.py diff --git a/.github/workflows/ci_cd.yml b/.github/workflows/ci_cd.yml index 9a67234f..46dfc1a6 100644 --- a/.github/workflows/ci_cd.yml +++ b/.github/workflows/ci_cd.yml @@ -103,21 +103,6 @@ jobs: # key: doc-build-v${{ env.RESET_DOC_BUILD_CACHE }}-${{ env.PYMECHANICAL_VERSION }}-${{ github.sha }} # restore-keys: | # doc-build-v${{ env.RESET_DOC_BUILD_CACHE }}-${{ env.PYMECHANICAL_VERSION }} - - name: test cantilever - env: - LICENSE_SERVER: ${{ secrets.LICENSE_SERVER }} - ANSYSCL232_DIR: /install/ansys_inc/v232/licensingclient - ANSYSLMD_LICENSE_FILE: 1055@${{ secrets.LICENSE_SERVER }} - ANSYS_WORKBENCH_LOGGING_FILTER_LEVEL: 0 - run: | - xvfb-run /install/ansys_inc/v232/aisol/.workbench_lite python examples/basic/test.py || true - - - name: Upload mechdat - uses: actions/upload-artifact@v3 - with: - name: output - path: out - retention-days: 7 - name: Build docs env: diff --git a/examples/basic/test.py b/examples/basic/test.py deleted file mode 100644 index a28e676d..00000000 --- a/examples/basic/test.py +++ /dev/null @@ -1,194 +0,0 @@ -""" .. _ref_topology_optimization: - -Topology Optimization of a Simple Cantilever --------------------------------------------- - -This example demonstrates the structural topology optimization of a simple -cantilever. The structural analysis is performed with basic constraints and -load, which is then transferred to topology optimization. -""" - -import os - -import ansys.mechanical.core as mech -from ansys.mechanical.core.examples import delete_downloads, download_file -from matplotlib import image as mpimg -from matplotlib import pyplot as plt - -# Embed Mechanical and set global variables -app = mech.App(version=232) -globals().update(mech.global_variables(app)) -print(app) -# from Ansys.ACT.Automation.Mechanical import * -# from Ansys.ACT.Interfaces.Common import * -# from Ansys.ACT.Mechanical.Fields import * -# from Ansys.Mechanical.DataModel.Enums import * -# from Ansys.Mechanical.DataModel.MechanicalEnums import * - -cwd = os.path.join(os.getcwd(), "out") - - -def display_image(image_name): - path = os.path.join(os.path.join(cwd, image_name)) - image = mpimg.imread(path) - plt.figure(figsize=(15, 15)) - plt.axis("off") - plt.imshow(image) - plt.show() - - -structural_mechdat_file = download_file( - "cantilever.mechdat", "pymechanical", "embedding" -) -app.open(structural_mechdat_file) -STRUCT = ExtAPI.DataModel.Project.Model.Analyses[0] -STRUCT.Solve(True) -# assert str(STRUCT.ObjectState) == "Solved" -# STRUCT_SLN = STRUCT.Solution -# STRUCT_SLN.Solve(True) -# assert str(STRUCT_SLN.Status) == "Done", "Solution status is not 'Done'" - -# ############################################## -# # Configure graphics for image export - -# ExtAPI.Graphics.Camera.SetSpecificViewOrientation( -# Ansys.Mechanical.DataModel.Enums.ViewOrientationType.Iso -# ) -# image_export_format = Ansys.Mechanical.DataModel.Enums.GraphicsImageExportFormat.PNG -# settings_720p = Ansys.Mechanical.Graphics.GraphicsImageExportSettings() -# settings_720p.Resolution = ( -# Ansys.Mechanical.DataModel.Enums.GraphicsResolutionType.EnhancedResolution -# ) -# settings_720p.Background = Ansys.Mechanical.DataModel.Enums.GraphicsBackgroundType.White -# settings_720p.Width = 1280 -# settings_720p.Capture = Ansys.Mechanical.DataModel.Enums.GraphicsCaptureType.ImageOnly -# settings_720p.Height = 720 -# settings_720p.CurrentGraphicsDisplay = False - -# ############################### -# # Structural Analsys Results -# # ~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -# ############################### -# # Total Deformation - -# STRUCT_SLN.Children[1].Activate() -# ExtAPI.Graphics.Camera.SetFit() -# ExtAPI.Graphics.ExportImage( -# os.path.join(cwd, "total_deformation.png"), image_export_format, settings_720p -# ) -# display_image("total_deformation.png") - -# ############################### -# # Equivalent Stress - -# STRUCT_SLN.Children[2].Activate() -# ExtAPI.Graphics.Camera.SetFit() -# ExtAPI.Graphics.ExportImage( -# os.path.join(cwd, "equivalent_stress.png"), image_export_format, settings_720p -# ) -# display_image("equivalent_stress.png") - -# ############################################################## -# # Topology Optimization -# # ~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -# # Set MKS Unit System -# ExtAPI.Application.ActiveUnitSystem = MechanicalUnitSystem.StandardMKS - -# # Store all main tree nodes as variables -# GEOM = ExtAPI.DataModel.Project.Model.Geometry -# MSH = ExtAPI.DataModel.Project.Model.Mesh -# NS_GRP = ExtAPI.DataModel.Project.Model.NamedSelections -# CONN_GRP = ExtAPI.DataModel.Project.Model.Connections - -# MY_TOTAL_VOL = GEOM.Volume.Value -# MY_TOTAL_MA = GEOM.Mass.Value -# # Get Structural Analysis and link to Topology optimization -# TOPO_OPT = ExtAPI.DataModel.Project.Model.AddTopologyOptimizationAnalysis() -# TOPO_OPT.TransferDataFrom(STRUCT) -# assert str(TOPO_OPT.ObjectState) == "NotSolved" - -# # Set None for Optimization Region Boundary Condition Exclusion Region -# # Optimization Region -# OPT_REG = TOPO_OPT.Children[1] -# # OPT_REG.BoundaryCondition=BoundaryConditionType.None -# # Using getattr since pythonnet doesn not support enum None -# OPT_REG.BoundaryCondition = getattr(BoundaryConditionType, "None") - -# # Insert Volume Response Constraint Object for Topology Optimization" -# # Delete Mass Response Constraint -# MASS_CONSTRN = TOPO_OPT.Children[3] -# MASS_CONSTRN.Delete() -# # Add Volume Response Constraint -# VOL_CONSTRN = TOPO_OPT.AddVolumeConstraint() -# # VOL_CONSTRN.DefineBy=ResponseConstraintDefineBy.Constant -# # VOL_CONSTRN.PercentageToRetain=50 - -# # Insert Member Size Manufacturing Constraint -# MEM_SIZE_MFG_CONSTRN = TOPO_OPT.AddMemberSizeManufacturingConstraint() -# MEM_SIZE_MFG_CONSTRN.Minimum = ManuMemberSizeControlledType.Manual -# MEM_SIZE_MFG_CONSTRN.MinSize = Quantity("2.4 [m]") - -# # Store Coordinate System ID for use in Symmetry Manufacturing Constraint -# Coordinate_Systems = DataModel.Project.Model.CoordinateSystems -# coord_sys7 = Coordinate_Systems.Children[7] - -# # Insert Symmetry Manufacturing Constraint -# SYMM_MFG_CONSTRN = TOPO_OPT.AddSymmetryManufacturingConstraint() -# SYMM_MFG_CONSTRN.CoordinateSystem = coord_sys7 - -# # Setting different Coordinate System Axis for Symmetry Manufacturing Constraint -# SYMM_MFG_CONSTRN_axis = str(SYMM_MFG_CONSTRN.Axis) -# # Verify default Axis for Symmetry Manufacturing Constraint -# ", SYMM_MFG_CONSTRN_axis, "PositiveXAxis -# SYMM_MFG_CONSTRN.Axis = CoordinateSystemAxisType.PositiveYAxis -# SYMM_MFG_CONSTRN_axis = str(SYMM_MFG_CONSTRN.Axis) -# SYMM_MFG_CONSTRN.Axis = CoordinateSystemAxisType.PositiveXAxis - -# TOPO_OPT_SLN = TOPO_OPT.Solution -# TOPO_OPT_SLN.Solve(True) -# assert str(TOPO_OPT_SLN.Status) == "Done", "Solution status is not 'Done'" - -# ############################################################## -# # Results -# # ~~~~~~~ - -# TOPO_OPT_SLN.Children[1].Activate() -# TOPO_DENS = TOPO_OPT_SLN.Children[1] - -# ################################### -# # Add smoothing to the STL - -# TOPO_DENS.AddSmoothing() -# TOPO_OPT.Solution.EvaluateAllResults() -# TOPO_DENS.Children[0].Activate() -# ExtAPI.Graphics.Camera.SetFit() -# ExtAPI.Graphics.ExportImage( -# os.path.join(cwd, "topo_opitimized_smooth.png"), image_export_format, settings_720p -# ) -# display_image("topo_opitimized_smooth.png") - -# ########################################################################## -# # Compare the results - - -# # Print topology density results -# print("Topology Density Results") -# print("Minimum Density: ", TOPO_DENS.Minimum) -# print("Maximum Density: ", TOPO_DENS.Maximum) -# print("Iteration Number: ", TOPO_DENS.IterationNumber) -# print("Original Volume: ", TOPO_DENS.OriginalVolume.Value) -# print("Final Volume: ", TOPO_DENS.FinalVolume.Value) -# print("Percent Volume of Original: ", TOPO_DENS.PercentVolumeOfOriginal) -# print("Original Mass: ", TOPO_DENS.OriginalMass.Value) -# print("Final Mass: ", TOPO_DENS.FinalMass.Value) -# print("Percent Mass of Original: ", TOPO_DENS.PercentMassOfOriginal) - -# Save project -os.makedirs(cwd) -app.save(os.path.join(cwd, "cantilever_topology_optimization.mechdat")) -app.new() - -# Delete the example file -delete_downloads() diff --git a/examples/basic/topology_optimization_cantilever.py b/examples/basic/topology_optimization_cantilever.py index b6ff40d0..85092b2b 100644 --- a/examples/basic/topology_optimization_cantilever.py +++ b/examples/basic/topology_optimization_cantilever.py @@ -7,7 +7,6 @@ cantilever. The structural analysis is performed with basic constraints and load, which is then transferred to topology optimization. """ - import os import ansys.mechanical.core as mech @@ -19,14 +18,13 @@ app = mech.App(version=232) globals().update(mech.global_variables(app)) print(app) + from Ansys.ACT.Automation.Mechanical import * from Ansys.ACT.Interfaces.Common import * from Ansys.ACT.Mechanical.Fields import * from Ansys.Mechanical.DataModel.Enums import * from Ansys.Mechanical.DataModel.MechanicalEnums import * -cwd = os.path.join(os.getcwd(), "out") - def display_image(image_name): path = os.path.join(os.path.join(cwd, image_name)) @@ -37,6 +35,8 @@ def display_image(image_name): plt.show() +cwd = os.path.join(os.getcwd(), "out") + structural_mechdat_file = download_file( "cantilever.mechdat", "pymechanical", "embedding" ) @@ -100,9 +100,9 @@ def display_image(image_name): MSH = ExtAPI.DataModel.Project.Model.Mesh NS_GRP = ExtAPI.DataModel.Project.Model.NamedSelections CONN_GRP = ExtAPI.DataModel.Project.Model.Connections - MY_TOTAL_VOL = GEOM.Volume.Value MY_TOTAL_MA = GEOM.Mass.Value + # Get Structural Analysis and link to Topology optimization TOPO_OPT = ExtAPI.DataModel.Project.Model.AddTopologyOptimizationAnalysis() TOPO_OPT.TransferDataFrom(STRUCT) @@ -119,6 +119,7 @@ def display_image(image_name): # Delete Mass Response Constraint MASS_CONSTRN = TOPO_OPT.Children[3] MASS_CONSTRN.Delete() + # Add Volume Response Constraint VOL_CONSTRN = TOPO_OPT.AddVolumeConstraint() # VOL_CONSTRN.DefineBy=ResponseConstraintDefineBy.Constant @@ -137,25 +138,21 @@ def display_image(image_name): SYMM_MFG_CONSTRN = TOPO_OPT.AddSymmetryManufacturingConstraint() SYMM_MFG_CONSTRN.CoordinateSystem = coord_sys7 -# Setting different Coordinate System Axis for Symmetry Manufacturing Constraint -SYMM_MFG_CONSTRN_axis = str(SYMM_MFG_CONSTRN.Axis) -# Verify default Axis for Symmetry Manufacturing Constraint", SYMM_MFG_CONSTRN_axis, "PositiveXAxis -SYMM_MFG_CONSTRN.Axis = CoordinateSystemAxisType.PositiveYAxis -SYMM_MFG_CONSTRN_axis = str(SYMM_MFG_CONSTRN.Axis) -SYMM_MFG_CONSTRN.Axis = CoordinateSystemAxisType.PositiveXAxis +######## +# Solve TOPO_OPT_SLN = TOPO_OPT.Solution TOPO_OPT_SLN.Solve(True) assert str(TOPO_OPT_SLN.Status) == "Done", "Solution status is not 'Done'" -############################################################## +########## # Results # ~~~~~~~ TOPO_OPT_SLN.Children[1].Activate() TOPO_DENS = TOPO_OPT_SLN.Children[1] -################################### +########################### # Add smoothing to the STL TOPO_DENS.AddSmoothing() From fbddf3d746f5c83fd635372132e83d32302daf5b Mon Sep 17 00:00:00 2001 From: dkunhamb Date: Mon, 16 Oct 2023 21:11:41 -0500 Subject: [PATCH 13/16] doc minor fix --- examples/basic/topology_optimization_cantilever.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/basic/topology_optimization_cantilever.py b/examples/basic/topology_optimization_cantilever.py index 85092b2b..e1288b39 100644 --- a/examples/basic/topology_optimization_cantilever.py +++ b/examples/basic/topology_optimization_cantilever.py @@ -145,9 +145,9 @@ def display_image(image_name): TOPO_OPT_SLN.Solve(True) assert str(TOPO_OPT_SLN.Status) == "Done", "Solution status is not 'Done'" -########## +############################### # Results -# ~~~~~~~ +# ~~~~~~~~ TOPO_OPT_SLN.Children[1].Activate() TOPO_DENS = TOPO_OPT_SLN.Children[1] From 9486bafe1d7626185321301d4571e098d18838c4 Mon Sep 17 00:00:00 2001 From: dkunhamb Date: Tue, 17 Oct 2023 09:29:53 -0500 Subject: [PATCH 14/16] review changes --- ... topology_optimization_cantilever_beam.py} | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) rename examples/basic/{topology_optimization_cantilever.py => topology_optimization_cantilever_beam.py} (91%) diff --git a/examples/basic/topology_optimization_cantilever.py b/examples/basic/topology_optimization_cantilever_beam.py similarity index 91% rename from examples/basic/topology_optimization_cantilever.py rename to examples/basic/topology_optimization_cantilever_beam.py index e1288b39..a246c9cd 100644 --- a/examples/basic/topology_optimization_cantilever.py +++ b/examples/basic/topology_optimization_cantilever_beam.py @@ -1,6 +1,6 @@ """ .. _ref_topology_optimization: -Topology Optimization of a Simple Cantilever +Topology Optimization of a Simple Cantilever Beam -------------------------------------------- This example demonstrates the structural topology optimization of a simple @@ -113,7 +113,7 @@ def display_image(image_name): OPT_REG = TOPO_OPT.Children[1] # OPT_REG.BoundaryCondition=BoundaryConditionType.None # Using getattr since pythonnet doesn not support enum None -OPT_REG.BoundaryCondition = getattr(BoundaryConditionType, "None") +OPT_REG.BoundaryCondition = BoundaryConditionType.AllLoadsAndSupports # Insert Volume Response Constraint Object for Topology Optimization" # Delete Mass Response Constraint @@ -130,13 +130,13 @@ def display_image(image_name): MEM_SIZE_MFG_CONSTRN.Minimum = ManuMemberSizeControlledType.Manual MEM_SIZE_MFG_CONSTRN.MinSize = Quantity("2.4 [m]") -# Store Coordinate System ID for use in Symmetry Manufacturing Constraint -Coordinate_Systems = DataModel.Project.Model.CoordinateSystems -coord_sys7 = Coordinate_Systems.Children[7] +# # Store Coordinate System ID for use in Symmetry Manufacturing Constraint +# Coordinate_Systems = DataModel.Project.Model.CoordinateSystems +# coord_sys7 = Coordinate_Systems.Children[7] -# Insert Symmetry Manufacturing Constraint -SYMM_MFG_CONSTRN = TOPO_OPT.AddSymmetryManufacturingConstraint() -SYMM_MFG_CONSTRN.CoordinateSystem = coord_sys7 +# # Insert Symmetry Manufacturing Constraint +# SYMM_MFG_CONSTRN = TOPO_OPT.AddSymmetryManufacturingConstraint() +# SYMM_MFG_CONSTRN.CoordinateSystem = coord_sys7 ######## # Solve @@ -165,7 +165,7 @@ def display_image(image_name): display_image("topo_opitimized_smooth.png") ########################################################################## -# Compare the results +# Review the results # Print topology density results @@ -181,7 +181,7 @@ def display_image(image_name): print("Percent Mass of Original: ", TOPO_DENS.PercentMassOfOriginal) # Save project -app.save(os.path.join(cwd, "cantilever_topology_optimization.mechdat")) +app.save(os.path.join(cwd, "cantilever_beam_topology_optimization.mechdat")) app.new() # Delete the example file From 58eb2bf62c5dfd250833c5aecdcd49a9e1183d2d Mon Sep 17 00:00:00 2001 From: dkunhamb Date: Tue, 17 Oct 2023 09:29:53 -0500 Subject: [PATCH 15/16] review changes --- ... topology_optimization_cantilever_beam.py} | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) rename examples/basic/{topology_optimization_cantilever.py => topology_optimization_cantilever_beam.py} (89%) diff --git a/examples/basic/topology_optimization_cantilever.py b/examples/basic/topology_optimization_cantilever_beam.py similarity index 89% rename from examples/basic/topology_optimization_cantilever.py rename to examples/basic/topology_optimization_cantilever_beam.py index e1288b39..e0f19117 100644 --- a/examples/basic/topology_optimization_cantilever.py +++ b/examples/basic/topology_optimization_cantilever_beam.py @@ -1,10 +1,10 @@ """ .. _ref_topology_optimization: -Topology Optimization of a Simple Cantilever +Topology Optimization of a Simple Cantilever Beam -------------------------------------------- This example demonstrates the structural topology optimization of a simple -cantilever. The structural analysis is performed with basic constraints and +cantilever beam. The structural analysis is performed with basic constraints and load, which is then transferred to topology optimization. """ import os @@ -113,7 +113,7 @@ def display_image(image_name): OPT_REG = TOPO_OPT.Children[1] # OPT_REG.BoundaryCondition=BoundaryConditionType.None # Using getattr since pythonnet doesn not support enum None -OPT_REG.BoundaryCondition = getattr(BoundaryConditionType, "None") +OPT_REG.BoundaryCondition = BoundaryConditionType.AllLoadsAndSupports # Insert Volume Response Constraint Object for Topology Optimization" # Delete Mass Response Constraint @@ -130,13 +130,13 @@ def display_image(image_name): MEM_SIZE_MFG_CONSTRN.Minimum = ManuMemberSizeControlledType.Manual MEM_SIZE_MFG_CONSTRN.MinSize = Quantity("2.4 [m]") -# Store Coordinate System ID for use in Symmetry Manufacturing Constraint -Coordinate_Systems = DataModel.Project.Model.CoordinateSystems -coord_sys7 = Coordinate_Systems.Children[7] +# # Store Coordinate System ID for use in Symmetry Manufacturing Constraint +# Coordinate_Systems = DataModel.Project.Model.CoordinateSystems +# coord_sys7 = Coordinate_Systems.Children[7] -# Insert Symmetry Manufacturing Constraint -SYMM_MFG_CONSTRN = TOPO_OPT.AddSymmetryManufacturingConstraint() -SYMM_MFG_CONSTRN.CoordinateSystem = coord_sys7 +# # Insert Symmetry Manufacturing Constraint +# SYMM_MFG_CONSTRN = TOPO_OPT.AddSymmetryManufacturingConstraint() +# SYMM_MFG_CONSTRN.CoordinateSystem = coord_sys7 ######## # Solve @@ -165,7 +165,7 @@ def display_image(image_name): display_image("topo_opitimized_smooth.png") ########################################################################## -# Compare the results +# Review the results # Print topology density results @@ -181,7 +181,7 @@ def display_image(image_name): print("Percent Mass of Original: ", TOPO_DENS.PercentMassOfOriginal) # Save project -app.save(os.path.join(cwd, "cantilever_topology_optimization.mechdat")) +app.save(os.path.join(cwd, "cantilever_beam_topology_optimization.mechdat")) app.new() # Delete the example file From bdeaecd489aa279159c00802a5f480e7383d44e1 Mon Sep 17 00:00:00 2001 From: Dipin <26918585+dipinknair@users.noreply.github.com> Date: Tue, 17 Oct 2023 10:15:03 -0500 Subject: [PATCH 16/16] Apply suggestions from code review Co-authored-by: Kathy Pippert <84872299+PipKat@users.noreply.github.com> --- .../topology_optimization_cantilever_beam.py | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/examples/basic/topology_optimization_cantilever_beam.py b/examples/basic/topology_optimization_cantilever_beam.py index e0f19117..bb81ae5e 100644 --- a/examples/basic/topology_optimization_cantilever_beam.py +++ b/examples/basic/topology_optimization_cantilever_beam.py @@ -1,11 +1,11 @@ """ .. _ref_topology_optimization: -Topology Optimization of a Simple Cantilever Beam --------------------------------------------- +Topology optimization of a simple cantilever beam +------------------------------------------------- This example demonstrates the structural topology optimization of a simple cantilever beam. The structural analysis is performed with basic constraints and -load, which is then transferred to topology optimization. +load, which is then transferred to the topology optimization. """ import os @@ -65,11 +65,11 @@ def display_image(image_name): settings_720p.CurrentGraphicsDisplay = False ############################### -# Structural Analsys Results -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# Structural analsys results +# ~~~~~~~~~~~~~~~~~~~~~~~~~~ ############################### -# Total Deformation +# Total deformation STRUCT_SLN.Children[1].Activate() ExtAPI.Graphics.Camera.SetFit() @@ -79,7 +79,7 @@ def display_image(image_name): display_image("total_deformation.png") ############################### -# Equivalent Stress +# Equivalent stress STRUCT_SLN.Children[2].Activate() ExtAPI.Graphics.Camera.SetFit() @@ -89,10 +89,10 @@ def display_image(image_name): display_image("equivalent_stress.png") ############################################################## -# Topology Optimization -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# Topology optimization +# ~~~~~~~~~~~~~~~~~~~~~ -# Set MKS Unit System +# Set MKS unit system ExtAPI.Application.ActiveUnitSystem = MechanicalUnitSystem.StandardMKS # Store all main tree nodes as variables @@ -103,38 +103,38 @@ def display_image(image_name): MY_TOTAL_VOL = GEOM.Volume.Value MY_TOTAL_MA = GEOM.Mass.Value -# Get Structural Analysis and link to Topology optimization +# Get structural analysis and link to topology optimization TOPO_OPT = ExtAPI.DataModel.Project.Model.AddTopologyOptimizationAnalysis() TOPO_OPT.TransferDataFrom(STRUCT) assert str(TOPO_OPT.ObjectState) == "NotSolved" -# Set None for Optimization Region Boundary Condition Exclusion Region -# Optimization Region +# Set ``None`` for optimization region boundary condition exclusion region +# Optimization region OPT_REG = TOPO_OPT.Children[1] # OPT_REG.BoundaryCondition=BoundaryConditionType.None -# Using getattr since pythonnet doesn not support enum None +# Using ``getattr`` because Python.Net does not support the ``None`` enum OPT_REG.BoundaryCondition = BoundaryConditionType.AllLoadsAndSupports -# Insert Volume Response Constraint Object for Topology Optimization" -# Delete Mass Response Constraint +# Insert volume response constraint object for topology optimization +# Delete mass response constraint MASS_CONSTRN = TOPO_OPT.Children[3] MASS_CONSTRN.Delete() -# Add Volume Response Constraint +# Add volume response constraint VOL_CONSTRN = TOPO_OPT.AddVolumeConstraint() # VOL_CONSTRN.DefineBy=ResponseConstraintDefineBy.Constant # VOL_CONSTRN.PercentageToRetain=50 -# Insert Member Size Manufacturing Constraint +# Insert member size manufacturing constraint MEM_SIZE_MFG_CONSTRN = TOPO_OPT.AddMemberSizeManufacturingConstraint() MEM_SIZE_MFG_CONSTRN.Minimum = ManuMemberSizeControlledType.Manual MEM_SIZE_MFG_CONSTRN.MinSize = Quantity("2.4 [m]") -# # Store Coordinate System ID for use in Symmetry Manufacturing Constraint +# # Store coordinate system ID for use in symmetry manufacturing constraint # Coordinate_Systems = DataModel.Project.Model.CoordinateSystems # coord_sys7 = Coordinate_Systems.Children[7] -# # Insert Symmetry Manufacturing Constraint +# # Insert symmetry manufacturing constraint # SYMM_MFG_CONSTRN = TOPO_OPT.AddSymmetryManufacturingConstraint() # SYMM_MFG_CONSTRN.CoordinateSystem = coord_sys7 @@ -147,7 +147,7 @@ def display_image(image_name): ############################### # Results -# ~~~~~~~~ +# ~~~~~~~ TOPO_OPT_SLN.Children[1].Activate() TOPO_DENS = TOPO_OPT_SLN.Children[1]