From ea4f34e865851f73afa59662b0e60c91a67b1e42 Mon Sep 17 00:00:00 2001 From: dkunhamb Date: Wed, 10 Jan 2024 23:28:15 -0600 Subject: [PATCH 01/13] draft contact debonding example --- examples/basic/contact_debonding.py | 299 ++++++++++++++++++++++++++++ 1 file changed, 299 insertions(+) create mode 100644 examples/basic/contact_debonding.py diff --git a/examples/basic/contact_debonding.py b/examples/basic/contact_debonding.py new file mode 100644 index 00000000..3b93802c --- /dev/null +++ b/examples/basic/contact_debonding.py @@ -0,0 +1,299 @@ +""" .. _ref_contact: + +Basic Valve Implementation +-------------------------- + +This example demonstrates a basic implementation of a valve in Python. +""" +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=241) +globals().update(mech.global_variables(app, True)) +print(app) + + +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() + + +cwd = os.path.join(os.getcwd(), "out") + +# IMPORT GEOMETRY AND Materials +geometry_path = r"/install/ansys_inc/v241/aisol/pymechanical-embedding-examples/examples/basic/Contact_Debonding_Example.agdb" +mat1_path = r"/install/ansys_inc/v241/aisol/pymechanical-embedding-examples/examples/basic/Contact_Debonding_Example_Mat1.xml" +mat2_path = r"/install/ansys_inc/v241/aisol/pymechanical-embedding-examples/examples/basic/Contact_Debonding_Example_Mat2.xml" + + +# setup graphics + +ExtAPI.Graphics.Camera.SetSpecificViewOrientation( + Ansys.Mechanical.DataModel.Enums.ViewOrientationType.Iso +) +ExtAPI.Graphics.Camera.SetFit() +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 + +# import geometry +geometry_import_group = Model.GeometryImportGroup +geometry_import = geometry_import_group.AddGeometryImport() +geometry_import_format = ( + Ansys.Mechanical.DataModel.Enums.GeometryImportPreference.Format.Automatic +) +geometry_import_preferences = Ansys.ACT.Mechanical.Utilities.GeometryImportPreferences() +geometry_import_preferences.ProcessNamedSelections = True +geometry_import_preferences.AnalysisType = ( + Ansys.Mechanical.DataModel.Enums.GeometryImportPreference.AnalysisType.Type2D +) +geometry_import.Import( + geometry_path, geometry_import_format, geometry_import_preferences +) + +ExtAPI.Graphics.Camera.SetFit() +ExtAPI.Graphics.ExportImage( + os.path.join(cwd, "geometry.png"), image_export_format, settings_720p +) +display_image("geometry.png") +# Scenario 1 Store main Tree Object items + +MODEL = Model +GEOMETRY = Model.Geometry +PART = [x for x in ExtAPI.DataModel.Tree.AllObjects if x.Name == "Part 2"][0] + +MAT_GRP = MODEL.Materials +MAT_GRP.Import(mat1_path) +MAT_GRP.Import(mat2_path) +MAT_BODY = [ + i + for i in MAT_GRP.GetChildren[Ansys.ACT.Automation.Mechanical.Material](True) + if i.Name == "Interface Body Material" +][0] +MAT_CZM = [ + i + for i in MAT_GRP.GetChildren[Ansys.ACT.Automation.Mechanical.Material](True) + if i.Name == "CZM Crack Material" +][0] + +connections = MODEL.AddConnections() +CONNECTIONS_GRP = connections.AddConnectionGroup() +MODEL.Connections.CreateAutomaticConnections() +CONNECTIONS_GRP = ExtAPI.DataModel.Project.Model.Connections +CONTACTS = [ + i + for i in CONNECTIONS_GRP.GetChildren[ + Ansys.ACT.Automation.Mechanical.Connections.ConnectionGroup + ](True) + if i.Name == "Contacts" +][0] +CONTACT_REGION = [ + i + for i in CONTACTS.GetChildren[ + Ansys.ACT.Automation.Mechanical.Connections.ContactRegion + ](True) + if i.Name == "Contact Region" +][0] + +MESH = Model.Mesh + +NAMED_SELECTIONS = ExtAPI.DataModel.Project.Model.NamedSelections +NS_EDGE_HIGH = [ + i + for i in NAMED_SELECTIONS.GetChildren[ + Ansys.ACT.Automation.Mechanical.NamedSelection + ](True) + if i.Name == "High_Edge" +][0] +NS_EDGE_LOW = [ + i + for i in NAMED_SELECTIONS.GetChildren[ + Ansys.ACT.Automation.Mechanical.NamedSelection + ](True) + if i.Name == "Low_Edge" +][0] +NS_EDGES_SHORT = [ + i + for i in NAMED_SELECTIONS.GetChildren[ + Ansys.ACT.Automation.Mechanical.NamedSelection + ](True) + if i.Name == "Short_Edges" +][0] +NS_EDGES_LONG = [ + i + for i in NAMED_SELECTIONS.GetChildren[ + Ansys.ACT.Automation.Mechanical.NamedSelection + ](True) + if i.Name == "Long_Edges" +][0] +NS_EDGES_FIXED = [ + i + for i in NAMED_SELECTIONS.GetChildren[ + Ansys.ACT.Automation.Mechanical.NamedSelection + ](True) + if i.Name == "Fixed_Edges" +][0] +NS_VERTEX_DISP1 = [ + i + for i in NAMED_SELECTIONS.GetChildren[ + Ansys.ACT.Automation.Mechanical.NamedSelection + ](True) + if i.Name == "Disp1_Vertex" +][0] +NS_VERTEX_DISP2 = [ + i + for i in NAMED_SELECTIONS.GetChildren[ + Ansys.ACT.Automation.Mechanical.NamedSelection + ](True) + if i.Name == "Disp2_Vertex" +][0] +NS_FACES_BOTH = [ + i + for i in NAMED_SELECTIONS.GetChildren[ + Ansys.ACT.Automation.Mechanical.NamedSelection + ](True) + if i.Name == "Both_Faces" +][0] + +MODEL.AddStaticStructuralAnalysis() +STATIC_STRUCTURAL = ExtAPI.DataModel.AnalysisByName("Static Structural") +ANALYSIS_SETTINGS = STATIC_STRUCTURAL.AnalysisSettings +SOLUTION = STATIC_STRUCTURAL.Solution + +# Scenario 2 Set Display Unit +ExtAPI.Application.ActiveUnitSystem = MechanicalUnitSystem.StandardNMM + +# Scenario 3 Set 2D Behavior +GEOMETRY.Activate() +GEOMETRY.Model2DBehavior = Model2DBehavior.PlaneStrain + +# Scenario 4 Assign Material +PART.Activate() +PART.Material = MAT_BODY.Name + +# Scenario 5 Define Contact Region +CONTACT_REGION.Activate() +CONTACT_REGION.SourceLocation = NS_EDGE_HIGH +CONTACT_REGION.TargetLocation = NS_EDGE_LOW +CONTACT_REGION.ContactType = ContactType.Bonded +CONTACT_REGION.ContactFormulation = ContactFormulation.PurePenalty + +# Scenario 6 Define Mesh controls and generate mesh +MESH.Activate() +MESH.ElementOrder = ElementOrder.Quadratic +MESH.UseAdaptiveSizing = False +MESH.ElementSize = Quantity("0.75 [mm]") + +SIZING_MESH = MESH.AddSizing() +SIZING_MESH.Location = NS_EDGES_SHORT +SIZING_MESH.ElementSize = Quantity("0.75 [mm]") +SIZING_MESH.Behavior = SizingBehavior.Hard + +SIZING_MESH2 = MESH.AddSizing() +SIZING_MESH2.Location = NS_EDGES_LONG +SIZING_MESH2.ElementSize = Quantity("0.5 [mm]") +SIZING_MESH2.Behavior = SizingBehavior.Hard + +FACE_MESHING = MESH.AddFaceMeshing() +FACE_MESHING.Location = NS_FACES_BOTH +FACE_MESHING.Method = FaceMeshingMethod.Quadrilaterals + +MESH.Activate() +MESH.GenerateMesh() +ExtAPI.Graphics.Camera.SetFit() +ExtAPI.Graphics.ExportImage( + os.path.join(cwd, "mesh.png"), image_export_format, settings_720p +) +display_image("mesh.png") +# Scenario 7 Add Contact Debonding object +MODEL.Activate() +FRACTURE = MODEL.AddFracture() + +CONTACT_DEBONDING = FRACTURE.AddContactDebonding() +CONTACT_DEBONDING.Material = MAT_CZM.Name +CONTACT_DEBONDING.ContactRegion = CONTACT_REGION + +# Scenario 8 Define Analysis Settings +ANALYSIS_SETTINGS.Activate() +ANALYSIS_SETTINGS.AutomaticTimeStepping = AutomaticTimeStepping.On +ANALYSIS_SETTINGS.DefineBy = TimeStepDefineByType.Substeps +ANALYSIS_SETTINGS.MaximumSubsteps = 100 +ANALYSIS_SETTINGS.InitialSubsteps = 100 +ANALYSIS_SETTINGS.MinimumSubsteps = 100 +ANALYSIS_SETTINGS.LargeDeflection = True + +# Scenario 9 Define boundary conditions +STATIC_STRUCTURAL.Activate() +FIXED_SUPPORT = STATIC_STRUCTURAL.AddFixedSupport() +FIXED_SUPPORT.Location = NS_EDGES_FIXED + +STATIC_STRUCTURAL.Activate() +DISPLACEMENT = STATIC_STRUCTURAL.AddDisplacement() +DISPLACEMENT.Location = NS_VERTEX_DISP1 +DISPLACEMENT.DefineBy = LoadDefineBy.Components +DISPLACEMENT.YComponent.Output.DiscreteValues = [Quantity("10 [mm]")] + +STATIC_STRUCTURAL.Activate() +DISPLACEMENT2 = STATIC_STRUCTURAL.AddDisplacement() +DISPLACEMENT2.Location = NS_VERTEX_DISP2 +DISPLACEMENT2.DefineBy = LoadDefineBy.Components +DISPLACEMENT2.YComponent.Output.DiscreteValues = [Quantity("-10 [mm]")] + +# Scenario 10 Add results +SOLUTION.Activate() +DIRECTIONAL_DEFORMATION = SOLUTION.AddDirectionalDeformation() +DIRECTIONAL_DEFORMATION.NormalOrientation = NormalOrientationType.YAxis + +FORCE_REACTION = SOLUTION.AddForceReaction() +FORCE_REACTION.BoundaryConditionSelection = DISPLACEMENT + +# Scenario 11 Solve and review results +STATIC_STRUCTURAL.Activate() +STATIC_STRUCTURAL.Solve(True) + +DIRECTIONAL_DEFORMATION.Activate() +MIN_DIRECTIONAL_DEFORMATION = DIRECTIONAL_DEFORMATION.Minimum.Value +MAX_DIRECTIONAL_DEFORMATION = DIRECTIONAL_DEFORMATION.Maximum.Value + +FORCE_REACTION.Activate() +Y_AXIS_FORCE_REACTION = FORCE_REACTION.YAxis.Value +MOT_Y_AXIS_FORCE_REACTION = FORCE_REACTION.MaximumYAxis.Value +ExtAPI.Graphics.Camera.SetFit() +ExtAPI.Graphics.ExportImage( + os.path.join(cwd, "contact_force.png"), image_export_format, settings_720p +) +display_image("contact_force.png") + +# %% +# Export animation +animation_export_format = ( + Ansys.Mechanical.DataModel.Enums.GraphicsAnimationExportFormat.GIF +) +settings_720p = Ansys.Mechanical.Graphics.AnimationExportSettings() +settings_720p.Width = 1280 +settings_720p.Height = 720 + +FORCE_REACTION.ExportAnimation( + os.path.join(cwd, "force.gif"), animation_export_format, settings_720p +) + +## add messages in between + +app.save(os.path.join(cwd, "debonding.mechdat")) +app.new() From 3516334535833c13c14cd4500e2995070595b839 Mon Sep 17 00:00:00 2001 From: dkunhamb Date: Wed, 10 Jan 2024 23:31:29 -0600 Subject: [PATCH 02/13] removing local file paths --- examples/basic/contact_debonding.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/examples/basic/contact_debonding.py b/examples/basic/contact_debonding.py index 3b93802c..d609b415 100644 --- a/examples/basic/contact_debonding.py +++ b/examples/basic/contact_debonding.py @@ -1,9 +1,9 @@ """ .. _ref_contact: -Basic Valve Implementation +Contact debonding -------------------------- -This example demonstrates a basic implementation of a valve in Python. +This example demonstrates a basic implementation contact debonding in Python. """ import os @@ -30,10 +30,7 @@ def display_image(image_name): cwd = os.path.join(os.getcwd(), "out") # IMPORT GEOMETRY AND Materials -geometry_path = r"/install/ansys_inc/v241/aisol/pymechanical-embedding-examples/examples/basic/Contact_Debonding_Example.agdb" -mat1_path = r"/install/ansys_inc/v241/aisol/pymechanical-embedding-examples/examples/basic/Contact_Debonding_Example_Mat1.xml" -mat2_path = r"/install/ansys_inc/v241/aisol/pymechanical-embedding-examples/examples/basic/Contact_Debonding_Example_Mat2.xml" - +# Add geom from cloud # setup graphics From ae7567d67913f0920b7592e556bd7c84567460ad Mon Sep 17 00:00:00 2001 From: dkunhamb Date: Sat, 13 Jan 2024 14:17:07 -0600 Subject: [PATCH 03/13] add mat files --- examples/basic/contact_debonding.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/examples/basic/contact_debonding.py b/examples/basic/contact_debonding.py index d609b415..c767fefb 100644 --- a/examples/basic/contact_debonding.py +++ b/examples/basic/contact_debonding.py @@ -13,7 +13,7 @@ from matplotlib import pyplot as plt # Embed Mechanical and set global variables -app = mech.App(version=241) +app = mech.App(version=232) globals().update(mech.global_variables(app, True)) print(app) @@ -24,7 +24,7 @@ def display_image(image_name): plt.figure(figsize=(15, 15)) plt.axis("off") plt.imshow(image) - plt.show() + # plt.show() cwd = os.path.join(os.getcwd(), "out") @@ -32,6 +32,15 @@ def display_image(image_name): # IMPORT GEOMETRY AND Materials # Add geom from cloud +geometry_path = download_file( + "Contact_Debonding_Example.agdb", "pymechanical", "embedding" +) +mat1_path = download_file( + "Contact_Debonding_Example_Mat1.xml", "pymechanical", "embedding" +) +mat2_path = download_file( + "Contact_Debonding_Example_Mat2.xml", "pymechanical", "embedding" +) # setup graphics ExtAPI.Graphics.Camera.SetSpecificViewOrientation( @@ -294,3 +303,6 @@ def display_image(image_name): app.save(os.path.join(cwd, "debonding.mechdat")) app.new() + +# delete example file +delete_downloads() From 9dc66f12152df7dc5e575c4a35adb2d5bad0cf21 Mon Sep 17 00:00:00 2001 From: dkunhamb Date: Sun, 21 Jan 2024 13:32:39 -0600 Subject: [PATCH 04/13] Adjust graphics enums --- examples/basic/contact_debonding.py | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/examples/basic/contact_debonding.py b/examples/basic/contact_debonding.py index c767fefb..db1f40b3 100644 --- a/examples/basic/contact_debonding.py +++ b/examples/basic/contact_debonding.py @@ -13,18 +13,18 @@ from matplotlib import pyplot as plt # Embed Mechanical and set global variables -app = mech.App(version=232) +app = mech.App(version=241) globals().update(mech.global_variables(app, True)) print(app) 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.figure(figsize=(16, 9)) + plt.imshow(mpimg.imread(os.path.join(cwd, image_name))) + plt.xticks([]) + plt.yticks([]) plt.axis("off") - plt.imshow(image) - # plt.show() + plt.show() cwd = os.path.join(os.getcwd(), "out") @@ -61,14 +61,10 @@ def display_image(image_name): # import geometry geometry_import_group = Model.GeometryImportGroup geometry_import = geometry_import_group.AddGeometryImport() -geometry_import_format = ( - Ansys.Mechanical.DataModel.Enums.GeometryImportPreference.Format.Automatic -) +geometry_import_format = GeometryImportPreference.Format.Automatic geometry_import_preferences = Ansys.ACT.Mechanical.Utilities.GeometryImportPreferences() geometry_import_preferences.ProcessNamedSelections = True -geometry_import_preferences.AnalysisType = ( - Ansys.Mechanical.DataModel.Enums.GeometryImportPreference.AnalysisType.Type2D -) +geometry_import_preferences.AnalysisType = GeometryImportPreference.AnalysisType.Type2D geometry_import.Import( geometry_path, geometry_import_format, geometry_import_preferences ) @@ -227,6 +223,7 @@ def display_image(image_name): os.path.join(cwd, "mesh.png"), image_export_format, settings_720p ) display_image("mesh.png") + # Scenario 7 Add Contact Debonding object MODEL.Activate() FRACTURE = MODEL.AddFracture() @@ -288,9 +285,7 @@ def display_image(image_name): # %% # Export animation -animation_export_format = ( - Ansys.Mechanical.DataModel.Enums.GraphicsAnimationExportFormat.GIF -) +animation_export_format = GraphicsAnimationExportFormat.GIF settings_720p = Ansys.Mechanical.Graphics.AnimationExportSettings() settings_720p.Width = 1280 settings_720p.Height = 720 @@ -301,7 +296,7 @@ def display_image(image_name): ## add messages in between -app.save(os.path.join(cwd, "debonding.mechdat")) +app.save(os.path.join(cwd, "contact_debonding.mechdat")) app.new() # delete example file From 502e1e4ae0b24a3da84670f7c4d9e3463fb993f0 Mon Sep 17 00:00:00 2001 From: dkunhamb Date: Sun, 21 Jan 2024 13:55:30 -0600 Subject: [PATCH 05/13] Adjust graphics enums --- examples/basic/contact_debonding.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/examples/basic/contact_debonding.py b/examples/basic/contact_debonding.py index db1f40b3..38e712ac 100644 --- a/examples/basic/contact_debonding.py +++ b/examples/basic/contact_debonding.py @@ -41,8 +41,8 @@ def display_image(image_name): mat2_path = download_file( "Contact_Debonding_Example_Mat2.xml", "pymechanical", "embedding" ) -# setup graphics +# setup graphics ExtAPI.Graphics.Camera.SetSpecificViewOrientation( Ansys.Mechanical.DataModel.Enums.ViewOrientationType.Iso ) @@ -59,16 +59,22 @@ def display_image(image_name): settings_720p.CurrentGraphicsDisplay = False # import geometry -geometry_import_group = Model.GeometryImportGroup -geometry_import = geometry_import_group.AddGeometryImport() -geometry_import_format = GeometryImportPreference.Format.Automatic +# Import geometry +geometry_file = geometry_path +geometry_import = Model.GeometryImportGroup.AddGeometryImport() +geometry_import_format = ( + Ansys.Mechanical.DataModel.Enums.GeometryImportPreference.Format.Automatic +) geometry_import_preferences = Ansys.ACT.Mechanical.Utilities.GeometryImportPreferences() geometry_import_preferences.ProcessNamedSelections = True -geometry_import_preferences.AnalysisType = GeometryImportPreference.AnalysisType.Type2D +geometry_import_preferences.AnalysisType = ( + Ansys.Mechanical.DataModel.Enums.GeometryImportPreference.AnalysisType.Type2D +) geometry_import.Import( - geometry_path, geometry_import_format, geometry_import_preferences + geometry_file, geometry_import_format, geometry_import_preferences ) + ExtAPI.Graphics.Camera.SetFit() ExtAPI.Graphics.ExportImage( os.path.join(cwd, "geometry.png"), image_export_format, settings_720p @@ -285,7 +291,9 @@ def display_image(image_name): # %% # Export animation -animation_export_format = GraphicsAnimationExportFormat.GIF +animation_export_format = ( + Ansys.Mechanical.DataModel.Enums.GraphicsAnimationExportFormat.GIF +) settings_720p = Ansys.Mechanical.Graphics.AnimationExportSettings() settings_720p.Width = 1280 settings_720p.Height = 720 From 74adc114e614b831b6368f296420faefb67919f0 Mon Sep 17 00:00:00 2001 From: dkunhamb Date: Sun, 21 Jan 2024 14:08:25 -0600 Subject: [PATCH 06/13] add gif --- examples/basic/contact_debonding.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/examples/basic/contact_debonding.py b/examples/basic/contact_debonding.py index 38e712ac..b0151408 100644 --- a/examples/basic/contact_debonding.py +++ b/examples/basic/contact_debonding.py @@ -301,6 +301,22 @@ def display_image(image_name): FORCE_REACTION.ExportAnimation( os.path.join(cwd, "force.gif"), animation_export_format, settings_720p ) +gif = Image.open(os.path.join(cwd, "force.gif")) +fig, ax = plt.subplots(figsize=(16, 9)) +ax.axis("off") +img = ax.imshow(gif.convert("RGBA")) + + +def update(frame): + gif.seek(frame) + img.set_array(gif.convert("RGBA")) + return [img] + + +ani = FuncAnimation( + fig, update, frames=range(gif.n_frames), interval=100, repeat=True, blit=True +) +plt.show() ## add messages in between From 6fd36bb8026c25e0b1de0c3e55d2fb7fe7a77db1 Mon Sep 17 00:00:00 2001 From: dkunhamb Date: Sun, 21 Jan 2024 14:38:55 -0600 Subject: [PATCH 07/13] add dependency package --- examples/basic/contact_debonding.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/basic/contact_debonding.py b/examples/basic/contact_debonding.py index b0151408..1c1e9030 100644 --- a/examples/basic/contact_debonding.py +++ b/examples/basic/contact_debonding.py @@ -7,10 +7,12 @@ """ import os +from PIL import Image 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 +from matplotlib.animation import FuncAnimation # Embed Mechanical and set global variables app = mech.App(version=241) From 59cd23c93fc79f06c39391b9de84d6fbbdfa2eb3 Mon Sep 17 00:00:00 2001 From: dkunhamb Date: Mon, 22 Jan 2024 00:49:38 -0600 Subject: [PATCH 08/13] cleanup --- .pre-commit-config.yaml | 3 +- ...=> fracture_analysis_contact_debonding.py} | 166 +++++++++++++----- 2 files changed, 122 insertions(+), 47 deletions(-) rename examples/basic/{contact_debonding.py => fracture_analysis_contact_debonding.py} (76%) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4ca97d7a..6812cb76 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,13 +4,12 @@ repos: rev: 23.12.1 hooks: - id: black - args: ["doc/source/conf.py"] - repo: https://github.com/adamchainz/blacken-docs rev: 1.16.0 hooks: - id: blacken-docs - additional_dependencies: [black==23.7.0] + additional_dependencies: [black==23.12.1] - repo: https://github.com/pycqa/isort rev: 5.13.2 diff --git a/examples/basic/contact_debonding.py b/examples/basic/fracture_analysis_contact_debonding.py similarity index 76% rename from examples/basic/contact_debonding.py rename to examples/basic/fracture_analysis_contact_debonding.py index 1c1e9030..58a11a48 100644 --- a/examples/basic/contact_debonding.py +++ b/examples/basic/fracture_analysis_contact_debonding.py @@ -1,9 +1,12 @@ """ .. _ref_contact: -Contact debonding --------------------------- +Fracture Analysis - Contact debonding +------------------------------------- -This example demonstrates a basic implementation contact debonding in Python. +This example demonstrates will demonstrate +Contact Debonding in ANSYS Mechanical using the +Cohesive Zone Material (CZM) method by displacing two +two-dimensional parts on a double cantilever beam. """ import os @@ -31,8 +34,24 @@ def display_image(image_name): cwd = os.path.join(os.getcwd(), "out") -# IMPORT GEOMETRY AND Materials -# Add geom from cloud + +# %% +# Configure graphics for image export +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +ExtAPI.Graphics.Camera.SetSpecificViewOrientation(ViewOrientationType.Front) + +image_export_format = GraphicsImageExportFormat.PNG +settings_720p = Ansys.Mechanical.Graphics.GraphicsImageExportSettings() +settings_720p.Resolution = GraphicsResolutionType.EnhancedResolution +settings_720p.Background = GraphicsBackgroundType.White +settings_720p.Width = 1280 +settings_720p.Height = 720 +settings_720p.CurrentGraphicsDisplay = False + +# %% +# Download geometry and materials files +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ geometry_path = download_file( "Contact_Debonding_Example.agdb", "pymechanical", "embedding" @@ -44,24 +63,11 @@ def display_image(image_name): "Contact_Debonding_Example_Mat2.xml", "pymechanical", "embedding" ) -# setup graphics -ExtAPI.Graphics.Camera.SetSpecificViewOrientation( - Ansys.Mechanical.DataModel.Enums.ViewOrientationType.Iso -) -ExtAPI.Graphics.Camera.SetFit() -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 -# import geometry -# Import geometry +# %% +# Import the geometry and material +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# Import material geometry_file = geometry_path geometry_import = Model.GeometryImportGroup.AddGeometryImport() geometry_import_format = ( @@ -76,21 +82,24 @@ def display_image(image_name): geometry_file, geometry_import_format, geometry_import_preferences ) - ExtAPI.Graphics.Camera.SetFit() ExtAPI.Graphics.ExportImage( os.path.join(cwd, "geometry.png"), image_export_format, settings_720p ) display_image("geometry.png") -# Scenario 1 Store main Tree Object items + +# %% +# Material import , named selections, materials and connections +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# Import materials MODEL = Model GEOMETRY = Model.Geometry -PART = [x for x in ExtAPI.DataModel.Tree.AllObjects if x.Name == "Part 2"][0] - MAT_GRP = MODEL.Materials MAT_GRP.Import(mat1_path) MAT_GRP.Import(mat2_path) + +PART = [x for x in ExtAPI.DataModel.Tree.AllObjects if x.Name == "Part 2"][0] MAT_BODY = [ i for i in MAT_GRP.GetChildren[Ansys.ACT.Automation.Mechanical.Material](True) @@ -102,6 +111,9 @@ def display_image(image_name): if i.Name == "CZM Crack Material" ][0] +# %% +# Connections + connections = MODEL.AddConnections() CONNECTIONS_GRP = connections.AddConnectionGroup() MODEL.Connections.CreateAutomaticConnections() @@ -121,7 +133,8 @@ def display_image(image_name): if i.Name == "Contact Region" ][0] -MESH = Model.Mesh +# %% +# Named selections NAMED_SELECTIONS = ExtAPI.DataModel.Project.Model.NamedSelections NS_EDGE_HIGH = [ @@ -181,30 +194,42 @@ def display_image(image_name): if i.Name == "Both_Faces" ][0] +# %% +# Define static structural analysis and settings +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + MODEL.AddStaticStructuralAnalysis() STATIC_STRUCTURAL = ExtAPI.DataModel.AnalysisByName("Static Structural") ANALYSIS_SETTINGS = STATIC_STRUCTURAL.AnalysisSettings SOLUTION = STATIC_STRUCTURAL.Solution +MESH = Model.Mesh + +# Set Unit System -# Scenario 2 Set Display Unit ExtAPI.Application.ActiveUnitSystem = MechanicalUnitSystem.StandardNMM -# Scenario 3 Set 2D Behavior +# Set 2D Behavior + GEOMETRY.Activate() GEOMETRY.Model2DBehavior = Model2DBehavior.PlaneStrain -# Scenario 4 Assign Material +# Assign Material + PART.Activate() PART.Material = MAT_BODY.Name -# Scenario 5 Define Contact Region +# Define Contact Region + CONTACT_REGION.Activate() CONTACT_REGION.SourceLocation = NS_EDGE_HIGH CONTACT_REGION.TargetLocation = NS_EDGE_LOW CONTACT_REGION.ContactType = ContactType.Bonded CONTACT_REGION.ContactFormulation = ContactFormulation.PurePenalty -# Scenario 6 Define Mesh controls and generate mesh +# %% +# Define mesh controls and generate mesh +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + MESH.Activate() MESH.ElementOrder = ElementOrder.Quadratic MESH.UseAdaptiveSizing = False @@ -226,13 +251,17 @@ def display_image(image_name): MESH.Activate() MESH.GenerateMesh() + ExtAPI.Graphics.Camera.SetFit() ExtAPI.Graphics.ExportImage( os.path.join(cwd, "mesh.png"), image_export_format, settings_720p ) display_image("mesh.png") -# Scenario 7 Add Contact Debonding object +# %% +# Add Contact Debonding object +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + MODEL.Activate() FRACTURE = MODEL.AddFracture() @@ -240,7 +269,10 @@ def display_image(image_name): CONTACT_DEBONDING.Material = MAT_CZM.Name CONTACT_DEBONDING.ContactRegion = CONTACT_REGION -# Scenario 8 Define Analysis Settings +# %% +# Define Analysis Settings +# ~~~~~~~~~~~~~~~~~~~~~~~~ + ANALYSIS_SETTINGS.Activate() ANALYSIS_SETTINGS.AutomaticTimeStepping = AutomaticTimeStepping.On ANALYSIS_SETTINGS.DefineBy = TimeStepDefineByType.Substeps @@ -249,11 +281,18 @@ def display_image(image_name): ANALYSIS_SETTINGS.MinimumSubsteps = 100 ANALYSIS_SETTINGS.LargeDeflection = True -# Scenario 9 Define boundary conditions +# %% +# Define boundary conditions +# ~~~~~~~~~~~~~~~~~~~~~~~~~~ +# Add fixed support + STATIC_STRUCTURAL.Activate() FIXED_SUPPORT = STATIC_STRUCTURAL.AddFixedSupport() FIXED_SUPPORT.Location = NS_EDGES_FIXED +# %% +# Add displacement + STATIC_STRUCTURAL.Activate() DISPLACEMENT = STATIC_STRUCTURAL.AddDisplacement() DISPLACEMENT.Location = NS_VERTEX_DISP1 @@ -266,7 +305,18 @@ def display_image(image_name): DISPLACEMENT2.DefineBy = LoadDefineBy.Components DISPLACEMENT2.YComponent.Output.DiscreteValues = [Quantity("-10 [mm]")] -# Scenario 10 Add results +STATIC_STRUCTURAL.Activate() + +ExtAPI.Graphics.Camera.SetFit() +ExtAPI.Graphics.ExportImage( + os.path.join(cwd, "boundary_conditions.png"), image_export_format, settings_720p +) +display_image("boundary_conditions.png") + +# %% +# Add results +# ~~~~~~~~~~~ + SOLUTION.Activate() DIRECTIONAL_DEFORMATION = SOLUTION.AddDirectionalDeformation() DIRECTIONAL_DEFORMATION.NormalOrientation = NormalOrientationType.YAxis @@ -274,25 +324,52 @@ def display_image(image_name): FORCE_REACTION = SOLUTION.AddForceReaction() FORCE_REACTION.BoundaryConditionSelection = DISPLACEMENT -# Scenario 11 Solve and review results +# %% +# Solve +# ~~~~~ + STATIC_STRUCTURAL.Activate() -STATIC_STRUCTURAL.Solve(True) +SOLUTION.Solve(True) + +# sphinx_gallery_start_ignore +assert str(SOLUTION.Status) == "Done", "Solution status is not 'Done'" +# sphinx_gallery_end_ignore + +# %% +# Messages and warning +# ~~~~~~~~~~~~~~~~~~~~ + +listMessages = ExtAPI.Application.Messages +for message in listMessages: + print(f"[{message.Severity}] {message.DisplayString}") + +# %% +# Display results +# ~~~~~~~~~~~~~~~ +# Directional deformation DIRECTIONAL_DEFORMATION.Activate() -MIN_DIRECTIONAL_DEFORMATION = DIRECTIONAL_DEFORMATION.Minimum.Value -MAX_DIRECTIONAL_DEFORMATION = DIRECTIONAL_DEFORMATION.Maximum.Value + +ExtAPI.Graphics.ExportImage( + os.path.join(cwd, "directional_deformation.png"), image_export_format, settings_720p +) +display_image("directional_deformation.png") + +# %% +# Force reaction FORCE_REACTION.Activate() -Y_AXIS_FORCE_REACTION = FORCE_REACTION.YAxis.Value -MOT_Y_AXIS_FORCE_REACTION = FORCE_REACTION.MaximumYAxis.Value + ExtAPI.Graphics.Camera.SetFit() ExtAPI.Graphics.ExportImage( - os.path.join(cwd, "contact_force.png"), image_export_format, settings_720p + os.path.join(cwd, "force_reaction.png"), image_export_format, settings_720p ) -display_image("contact_force.png") +display_image("force_reaction.png") # %% # Export animation +# ~~~~~~~~~~~~~~~~ + animation_export_format = ( Ansys.Mechanical.DataModel.Enums.GraphicsAnimationExportFormat.GIF ) @@ -320,7 +397,6 @@ def update(frame): ) plt.show() -## add messages in between app.save(os.path.join(cwd, "contact_debonding.mechdat")) app.new() From 5d07244ae1025c53af94d48020c523bd97a813fc Mon Sep 17 00:00:00 2001 From: dkunhamb Date: Mon, 22 Jan 2024 09:41:16 -0600 Subject: [PATCH 09/13] review feedback --- .../fracture_analysis_contact_debonding.py | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/examples/basic/fracture_analysis_contact_debonding.py b/examples/basic/fracture_analysis_contact_debonding.py index 58a11a48..8f00a7c7 100644 --- a/examples/basic/fracture_analysis_contact_debonding.py +++ b/examples/basic/fracture_analysis_contact_debonding.py @@ -17,7 +17,7 @@ from matplotlib import pyplot as plt from matplotlib.animation import FuncAnimation -# Embed Mechanical and set global variables +# Embed mechanical and set global variables app = mech.App(version=241) globals().update(mech.global_variables(app, True)) print(app) @@ -89,7 +89,7 @@ def display_image(image_name): display_image("geometry.png") # %% -# Material import , named selections, materials and connections +# Material import, named selections, and connections # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Import materials @@ -204,11 +204,11 @@ def display_image(image_name): SOLUTION = STATIC_STRUCTURAL.Solution MESH = Model.Mesh -# Set Unit System +# Set unit system ExtAPI.Application.ActiveUnitSystem = MechanicalUnitSystem.StandardNMM -# Set 2D Behavior +# Set 2D behavior GEOMETRY.Activate() GEOMETRY.Model2DBehavior = Model2DBehavior.PlaneStrain @@ -218,7 +218,7 @@ def display_image(image_name): PART.Activate() PART.Material = MAT_BODY.Name -# Define Contact Region +# Define contact Region CONTACT_REGION.Activate() CONTACT_REGION.SourceLocation = NS_EDGE_HIGH @@ -259,7 +259,7 @@ def display_image(image_name): display_image("mesh.png") # %% -# Add Contact Debonding object +# Add contact debonding object # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ MODEL.Activate() @@ -270,7 +270,7 @@ def display_image(image_name): CONTACT_DEBONDING.ContactRegion = CONTACT_REGION # %% -# Define Analysis Settings +# Define analysis settings # ~~~~~~~~~~~~~~~~~~~~~~~~ ANALYSIS_SETTINGS.Activate() @@ -378,9 +378,9 @@ def display_image(image_name): settings_720p.Height = 720 FORCE_REACTION.ExportAnimation( - os.path.join(cwd, "force.gif"), animation_export_format, settings_720p + os.path.join(cwd, "force_reaction.gif"), animation_export_format, settings_720p ) -gif = Image.open(os.path.join(cwd, "force.gif")) +gif = Image.open(os.path.join(cwd, "force_reaction.gif")) fig, ax = plt.subplots(figsize=(16, 9)) ax.axis("off") img = ax.imshow(gif.convert("RGBA")) @@ -398,8 +398,15 @@ def update(frame): plt.show() +# %% +# Cleanup +# ~~~~~~~ +# Save project + app.save(os.path.join(cwd, "contact_debonding.mechdat")) app.new() -# delete example file +# %% +# Delete example file + delete_downloads() From 4704ff9f1a541882e44362087dc9edcc7e8076e8 Mon Sep 17 00:00:00 2001 From: Dipin <26918585+dipinknair@users.noreply.github.com> Date: Mon, 22 Jan 2024 09:43:29 -0600 Subject: [PATCH 10/13] Update examples/basic/fracture_analysis_contact_debonding.py Co-authored-by: Kerry McAdams <58492561+klmcadams@users.noreply.github.com> --- examples/basic/fracture_analysis_contact_debonding.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/basic/fracture_analysis_contact_debonding.py b/examples/basic/fracture_analysis_contact_debonding.py index 8f00a7c7..140050c0 100644 --- a/examples/basic/fracture_analysis_contact_debonding.py +++ b/examples/basic/fracture_analysis_contact_debonding.py @@ -213,7 +213,7 @@ def display_image(image_name): GEOMETRY.Activate() GEOMETRY.Model2DBehavior = Model2DBehavior.PlaneStrain -# Assign Material +# Assign material PART.Activate() PART.Material = MAT_BODY.Name From b224f895d414bace63a05596b91f56a15e33a229 Mon Sep 17 00:00:00 2001 From: dkunhamb Date: Mon, 22 Jan 2024 09:45:42 -0600 Subject: [PATCH 11/13] modify subsection title --- examples/basic/fracture_analysis_contact_debonding.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/basic/fracture_analysis_contact_debonding.py b/examples/basic/fracture_analysis_contact_debonding.py index 140050c0..90249952 100644 --- a/examples/basic/fracture_analysis_contact_debonding.py +++ b/examples/basic/fracture_analysis_contact_debonding.py @@ -336,8 +336,8 @@ def display_image(image_name): # sphinx_gallery_end_ignore # %% -# Messages and warning -# ~~~~~~~~~~~~~~~~~~~~ +# Messages +# ~~~~~~~~ listMessages = ExtAPI.Application.Messages for message in listMessages: From 73e9b80b95f9ccc9d06041bcdd8f61860549e2b5 Mon Sep 17 00:00:00 2001 From: dkunhamb Date: Wed, 24 Jan 2024 18:09:33 -0600 Subject: [PATCH 12/13] review feedback from @sbradrick --- examples/basic/fracture_analysis_contact_debonding.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/basic/fracture_analysis_contact_debonding.py b/examples/basic/fracture_analysis_contact_debonding.py index 90249952..2368722d 100644 --- a/examples/basic/fracture_analysis_contact_debonding.py +++ b/examples/basic/fracture_analysis_contact_debonding.py @@ -3,10 +3,10 @@ Fracture Analysis - Contact debonding ------------------------------------- -This example demonstrates will demonstrate -Contact Debonding in ANSYS Mechanical using the -Cohesive Zone Material (CZM) method by displacing two -two-dimensional parts on a double cantilever beam. +The following example demonstrates the use of Contact Debonding +featuring in Mechanical using the Cohesive Zone Material (CZM) method. +This example displaces two two-dimensional parts on a +double cantilever beam. """ import os From 550efb2d26aa144c191ed7c1ce9f994cbc18d209 Mon Sep 17 00:00:00 2001 From: dkunhamb Date: Wed, 24 Jan 2024 22:27:13 -0600 Subject: [PATCH 13/13] review feedback --- examples/README.txt | 2 +- examples/basic/fracture_analysis_contact_debonding.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/README.txt b/examples/README.txt index 49980b87..3b97e990 100644 --- a/examples/README.txt +++ b/examples/README.txt @@ -1,5 +1,5 @@ Examples ========= -**Embedding examples** for `PyMechanical <_pymechanical_docs>`_ are contained in this repository. +Embedding examples for `PyMechanical <_pymechanical_docs>`_ are contained in this repository. These end-to-end examples show how you can use ``ansys-mechanical-core``. diff --git a/examples/basic/fracture_analysis_contact_debonding.py b/examples/basic/fracture_analysis_contact_debonding.py index 2368722d..bf65d74d 100644 --- a/examples/basic/fracture_analysis_contact_debonding.py +++ b/examples/basic/fracture_analysis_contact_debonding.py @@ -3,7 +3,7 @@ Fracture Analysis - Contact debonding ------------------------------------- -The following example demonstrates the use of Contact Debonding +The following example demonstrates the use of the Contact Debonding featuring in Mechanical using the Cohesive Zone Material (CZM) method. This example displaces two two-dimensional parts on a double cantilever beam.