diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 33c2cc57a34c..623207b94e18 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -664,8 +664,8 @@ jobs: needs: [test, update-changelog] runs-on: ubuntu-latest permissions: - id-token: write # required for trusted publishing - contents: write # required for GitHub release upload + id-token: write # required for trusted publishing + contents: write # required for GitHub release upload steps: - name: Set up Python diff --git a/.github/workflows/execute-examples-weekly.yml b/.github/workflows/execute-examples-weekly.yml index 86753c0d93b1..a47b96667329 100644 --- a/.github/workflows/execute-examples-weekly.yml +++ b/.github/workflows/execute-examples-weekly.yml @@ -165,6 +165,9 @@ jobs: run: | python examples/00-fluent/steady_vortex.py + - name: Execute fsi_1way_workflow.py + run: | + python examples/00-fluent/fsi_1way_workflow.py # https://github.com/ansys/pyfluent/issues/4157 # - name: Execute conjugate_heat_transfer.py @@ -186,4 +189,4 @@ jobs: - name: Remove all docker images if: always() - run: make docker-clean-images + run: make docker-clean-images \ No newline at end of file diff --git a/doc/changelog.d/4407.documentation.md b/doc/changelog.d/4407.documentation.md new file mode 100644 index 000000000000..4d2257f36944 --- /dev/null +++ b/doc/changelog.d/4407.documentation.md @@ -0,0 +1 @@ +Added example on one way fsi diff --git a/doc/source/_static/fsi_1way_1.png b/doc/source/_static/fsi_1way_1.png new file mode 100644 index 000000000000..a5b2445ceaf4 Binary files /dev/null and b/doc/source/_static/fsi_1way_1.png differ diff --git a/doc/source/_static/fsi_1way_2.png b/doc/source/_static/fsi_1way_2.png new file mode 100644 index 000000000000..0c4f224af68a Binary files /dev/null and b/doc/source/_static/fsi_1way_2.png differ diff --git a/doc/source/_static/fsi_1way_3.png b/doc/source/_static/fsi_1way_3.png new file mode 100644 index 000000000000..f2c98f60545f Binary files /dev/null and b/doc/source/_static/fsi_1way_3.png differ diff --git a/doc/source/conf.py b/doc/source/conf.py index 8ca0ee047746..2f43bd30c1f9 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -152,7 +152,7 @@ def _stop_fluent_container(gallery_conf, fname): # path where to save gallery generated examples "gallery_dirs": ["examples"], # Pattern to search for example files - "filename_pattern": r"exhaust_system_settings_api\.py|external_compressible_flow\.py|mixing_elbow_settings_api\.py|modeling_cavitation\.py|species_transport\.py|ahmed_body_workflow\.py|brake\.py|DOE_ML\.py|radiation_headlamp\.py|parametric_static_mixer_1\.py|conjugate_heat_transfer\.py|tyler_sofrin_modes\.py|lunar_lander_thermal\.py|modeling_ablation\.py|frozen_rotor_workflow\.py|mixing_tank_workflow\.py|single_battery_cell_workflow\.py|steady_vortex\.py", + "filename_pattern": r"exhaust_system_settings_api\.py|external_compressible_flow\.py|mixing_elbow_settings_api\.py|modeling_cavitation\.py|species_transport\.py|ahmed_body_workflow\.py|brake\.py|DOE_ML\.py|radiation_headlamp\.py|parametric_static_mixer_1\.py|conjugate_heat_transfer\.py|tyler_sofrin_modes\.py|lunar_lander_thermal\.py|modeling_ablation\.py|frozen_rotor_workflow\.py|mixing_tank_workflow\.py|single_battery_cell_workflow\.py|steady_vortex\.py|fsi_1way_workflow\.py", # Do not execute examples "plot_gallery": False, # Remove the "Download all examples" button from the top level gallery diff --git a/doc/source/contributing/environment_variables.rst b/doc/source/contributing/environment_variables.rst index 29f42cbdb216..99cfd5b3ae3a 100644 --- a/doc/source/contributing/environment_variables.rst +++ b/doc/source/contributing/environment_variables.rst @@ -77,4 +77,4 @@ control the behavior of PyFluent within the same Python process. Please see the * - REMOTING_SERVER_ADDRESS - Specifies the IP address of the Fluent server while launching Fluent in :func:`launch_fluent() `. * - SERVER_INFO_DIR - - Specifies the directory where the server-info file is created while launching Fluent in :func:`launch_fluent() `. + - Specifies the directory where the server-info file is created while launching Fluent in :func:`launch_fluent() `. \ No newline at end of file diff --git a/examples/00-fluent/fsi_1way_workflow.py b/examples/00-fluent/fsi_1way_workflow.py new file mode 100644 index 000000000000..42bb4440df25 --- /dev/null +++ b/examples/00-fluent/fsi_1way_workflow.py @@ -0,0 +1,261 @@ +# Copyright (C) 2021 - 2025 ANSYS, Inc. and/or its affiliates. +# SPDX-License-Identifier: MIT +# +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +""".. _One_Way_FSI_Simulation: + +Modeling One-Way Fluid-Structure Interaction +------------------------------------------------------------- +""" + +# %% +# Objective +# --------- +# +# This example models turbulent airflow through a cylindrical test chamber +# that contains a steel probe. The airflow generates aerodynamic forces on +# the probe, causing it to deform. In this case, the deformation is expected +# to be small compared with the overall flow field. Because the probe’s motion +# does not significantly alter the airflow, we can treat the problem using +# a one-way fluid–structure interaction (FSI) approach. +# +# In a one-way FSI analysis, the fluid flow is solved first and the +# resulting forces are transferred to the structural model. The +# structural response is then computed independently, without feeding +# back into the fluid solution. This contrasts with a two-way FSI +# analysis, where structural deformation and fluid flow are solved +# in a fully coupled manner. The one-way approach is computationally +# more efficient and appropriate when structural feedback on the flow +# can be neglected. + +# %% +# Problem Description +# ------------------- +# +# The cylindrical test chamber is 20 cm long, with a diameter of 10 cm. +# Turbulent air enters the chamber at 100 m/s, flows around and through +# the steel probe, and exits through a pressure outlet. +# +# +# .. image:: ../../_static/fsi_1way_1.png +# :align: center +# :alt: One-Way Fluid-Structure Interaction Model + +# %% +# Import modules +# -------------- +# +# .. note:: +# Importing the following classes offer streamlined access to key solver settings, +# eliminating the need to manually browse through the full settings structure. + +import os + +import ansys.fluent.core as pyfluent +from ansys.fluent.core import FluentMode, Precision, examples +from ansys.fluent.core.solver import ( + BoundaryConditions, + Contour, + Graphics, + Initialization, + RunCalculation, + Setup, + Solution, + VelocityInlet, +) + +# %% +# Launch Fluent session in solver mode +# ------------------------------------ + +solver = pyfluent.launch_fluent( + precision=Precision.DOUBLE, + mode=FluentMode.SOLVER, +) + +# %% +# Download and read the mesh file +# ------------------------------- + +mesh_file = examples.download_file( + "fsi_1way.msh.h5", + "pyfluent/fsi_1way", + save_path=os.getcwd(), +) +solver.settings.file.read_case(file_name=mesh_file) + +# %% +# Configure solver settings for fluid flow +# ---------------------------------------- + +velocity_inlet = VelocityInlet(solver, name="velocity_inlet") +velocity_inlet.momentum.velocity_magnitude = 100.0 # High-speed inlet flow (m/s) +velocity_inlet.turbulence.turbulent_viscosity_ratio = ( + 5 # Dimensionless, typically 1-10 for moderate turbulence +) + +# %% +# Initialize and run fluid flow simulation +# ---------------------------------------- + +initialize = Initialization(solver) +initialize.hybrid_initialize() + +calculation = RunCalculation(solver) +calculation.iterate(iter_count=100) + +# %% +# Post-processing +# --------------- + +graphics = Graphics(solver) +graphics.picture.x_resolution = 650 # Horizontal resolution for clear visualization +graphics.picture.y_resolution = 450 # Vertical resolution matching typical aspect ratio + +graphics.contour["contour-vel"] = { + "field": "velocity-magnitude", + "surfaces_list": ["fluid-symmetry"], + "coloring": {"option": "banded"}, +} + +graphics.contour["contour-vel"].display() +graphics.views.restore_view(view_name="front") + +graphics.picture.save_picture(file_name="fsi_1way_2.png") + + +# %% +# .. image:: ../../_static/fsi_1way_2.png +# :align: center +# :alt: Velocity Contour + +# %% +# Structural model and material setup +# ----------------------------------- +# To analyze the deformation of a steel probe under fluid flow, +# Linear Elasticity Structural model is chosen + +setup = Setup(solver) +setup.models.structure.model = "linear-elasticity" + +# Copy materials from the database and assign to solid zone + +setup.materials.database.copy_by_name(type="solid", name="steel") +setup.cell_zone_conditions.solid["solid"] = {"general": {"material": "steel"}} + +# %% +# Structural boundary conditions +# ------------------------------ +# configure Fluent to define the steel probe's support and movement using +# structural boundary conditions + +wall_boundary = BoundaryConditions(solver) + +# Configure solid-symmetry boundary +wall_boundary.wall["solid-symmetry"] = { + "structure": { + "z_disp_boundary_value": 0, + "z_disp_boundary_condition": "Node Z-Displacement", + } +} + +# Set solid-top boundary (fully fixed) +wall_boundary.wall["solid-top"] = { + "structure": { + "z_disp_boundary_value": 0, + "z_disp_boundary_condition": "Node Z-Displacement", + "y_disp_boundary_value": 0, + "y_disp_boundary_condition": "Node Y-Displacement", + "x_disp_boundary_value": 0, + "x_disp_boundary_condition": "Node X-Displacement", + } +} + +# Copy boundary conditions from solid-symmetry to solid-symmetry:011 +wall_boundary.copy(from_="solid-symmetry", to=["solid-symmetry:011"]) + +# Configure FSI surface +wall_boundary.wall["fsisurface-solid"] = { + "structure": { + "x_disp_boundary_condition": "Intrinsic FSI", + "y_disp_boundary_condition": "Intrinsic FSI", + "z_disp_boundary_condition": "Intrinsic FSI", + } +} + +# %% +# Inclusion of Operating Pressure in Fluid-Structure Interaction Forces +# --------------------------------------------------------------------- +# Fluent uses gauge pressure for fluid-structure interaction force calculations. +# By setting ``include_pop_in_fsi_force`` to ``True``, Fluent uses absolute pressure. + +setup.models.structure.expert.include_pop_in_fsi_force = True + +# %% +# Configure flow settings +# ----------------------- +# Disable flow equations for structural simulation + +solution = Solution(solver) +solution.controls.equations["flow"] = False +solution.controls.equations["kw"] = False + +# %% +# Run FSI simulation +# ------------------ + +solver.settings.file.write_case(file_name="probe_fsi_1way.cas.h5") + +calculation.iterate(iter_count=2) + +# %% +# Structural Postprocessing +# ------------------------- + +displacement_contour = Contour(solver, new_instance_name="displacement_contour") + +displacement_contour.field = "total-displacement" +displacement_contour.surfaces_list = ["fsisurface-solid"] + +displacement_contour.display() +graphics.views.restore_view(view_name="isometric") +graphics.picture.save_picture(file_name="fsi_1way_3.png") + +# save the case and data file +solver.settings.file.write_case_data(file_name="probe_fsi_1way") + +# %% +# .. image:: ../../_static/fsi_1way_3.png +# :align: center +# :alt: Structural Displacement Contour + +# %% +# Close Fluent +# ------------ +solver.exit() + +####################################################################################### +# References: +# ===================================================================================== +# .. _Reference: +# [1] Modeling One-Way Fluid-Structure Interaction (FSI) Within Fluent, `Ansys Fluent documentation​ `_. + +# sphinx_gallery_thumbnail_path = '_static/fsi_1way_2.png'