Cooled turbine blade#
This notebook demonstrates the process of using the Workbench client to upload project files, run scripts, start services, and handle output files. It also includes launching PyMechanical to solve models and visualize results.
First, import the necessary modules. We import pathlib
for handling filesystem paths and os
for interacting with the operating system. The launch_workbench
function from ansys.workbench.core
is imported to start a Workbench session, and launch_mechanical
from ansys.mechanical.core
to start a Mechanical session.
[1]:
import os
import pathlib
[2]:
from ansys.workbench.core import launch_workbench
from ansys.mechanical.core import launch_mechanical
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
Cell In[2], line 1
----> 1 from ansys.workbench.core import launch_workbench
2 from ansys.mechanical.core import launch_mechanical
ModuleNotFoundError: No module named 'ansys'
Launch the Workbench service on the local machine, using some options. Define several directories that will be used during the session. workdir
is set to the parent directory of the current file. assets
, scripts
, and wbpz
are subdirectories within the working directory. The launch_workbench
function is called to start a Workbench session with specified directory.
[3]:
workdir = pathlib.Path("__file__").parent
[4]:
assets = workdir / "assets"
scripts = workdir / "scripts"
[5]:
wb = launch_workbench(client_workdir=str(workdir.absolute()))
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[5], line 1
----> 1 wb = launch_workbench(client_workdir=str(workdir.absolute()))
NameError: name 'launch_workbench' is not defined
Upload the project files to the server using the upload_file_from_example_repo
method. The file to upload is cooled_turbine_blade.wbpz
.
[6]:
wb.upload_file_from_example_repo("cooled-turbine-blade/wbpz/cooled_turbine_blade.wbpz")
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[6], line 1
----> 1 wb.upload_file_from_example_repo("cooled-turbine-blade/wbpz/cooled_turbine_blade.wbpz")
NameError: name 'wb' is not defined
Execute a Workbench script (project.wbjn
) to define the project and load the geometry using the run_script_file
method. The set_log_file
method is used to direct the logs to wb_log_file.log
. The name of the system created is stored in sys_name
and printed.
[7]:
export_path = 'wb_log_file.log'
wb.set_log_file(export_path)
sys_name = wb.run_script_file(str((assets / "project.wbjn").absolute()), log_level='info')
print(sys_name)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[7], line 2
1 export_path = 'wb_log_file.log'
----> 2 wb.set_log_file(export_path)
3 sys_name = wb.run_script_file(str((assets / "project.wbjn").absolute()), log_level='info')
4 print(sys_name)
NameError: name 'wb' is not defined
Start a PyMechanical server for the system using the start_mechanical_server
method. Create a PyMechanical client session connected to this server using launch_mechanical
. The project directory is printed to verify the connection.
[8]:
server_port = wb.start_mechanical_server(system_name=sys_name)
mechanical = launch_mechanical(start_instance=False, ip='localhost', port=server_port)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[8], line 1
----> 1 server_port = wb.start_mechanical_server(system_name=sys_name)
2 mechanical = launch_mechanical(start_instance=False, ip='localhost', port=server_port)
NameError: name 'wb' is not defined
[9]:
print(mechanical.project_directory)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[9], line 1
----> 1 print(mechanical.project_directory)
NameError: name 'mechanical' is not defined
Read and execute the script cooled_turbine_blade.py
via the PyMechanical client using run_python_script
. This script typically contains commands to mesh and solve the turbine blade model. The output of the script is printed.
[10]:
with open(scripts / "cooled_turbine_blade.py") as sf:
mech_script = sf.read()
mech_output = mechanical.run_python_script(mech_script)
print(mech_output)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[10], line 3
1 with open(scripts / "cooled_turbine_blade.py") as sf:
2 mech_script = sf.read()
----> 3 mech_output = mechanical.run_python_script(mech_script)
4 print(mech_output)
NameError: name 'mechanical' is not defined
Specify the Mechanical directory and run a script to fetch the working directory path. The path where all solver files are stored on the server is printed. Download the solver output file (solve.out
) from the server to the client’s current working directory and print its contents.
[11]:
mechanical.run_python_script(f"solve_dir=ExtAPI.DataModel.AnalysisList[1].WorkingDir")
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[11], line 1
----> 1 mechanical.run_python_script(f"solve_dir=ExtAPI.DataModel.AnalysisList[1].WorkingDir")
NameError: name 'mechanical' is not defined
[12]:
result_solve_dir_server = mechanical.run_python_script(f"solve_dir")
print(f"All solver files are stored on the server at: {result_solve_dir_server}")
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[12], line 1
----> 1 result_solve_dir_server = mechanical.run_python_script(f"solve_dir")
2 print(f"All solver files are stored on the server at: {result_solve_dir_server}")
NameError: name 'mechanical' is not defined
[13]:
solve_out_path = os.path.join(result_solve_dir_server, "solve.out")
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[13], line 1
----> 1 solve_out_path = os.path.join(result_solve_dir_server, "solve.out")
NameError: name 'result_solve_dir_server' is not defined
[14]:
def write_file_contents_to_console(path):
"""Write file contents to console."""
with open(path, "rt") as file:
for line in file:
print(line, end="")
[15]:
current_working_directory = os.getcwd()
mechanical.download(solve_out_path, target_dir=current_working_directory)
solve_out_local_path = os.path.join(current_working_directory, "solve.out")
write_file_contents_to_console(solve_out_local_path)
os.remove(solve_out_local_path)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[15], line 2
1 current_working_directory = os.getcwd()
----> 2 mechanical.download(solve_out_path, target_dir=current_working_directory)
3 solve_out_local_path = os.path.join(current_working_directory, "solve.out")
4 write_file_contents_to_console(solve_out_local_path)
NameError: name 'mechanical' is not defined
Specify the Mechanical directory path for images and run a script to fetch the directory path. The path where images are stored on the server is printed. Download an image file (stress.png
) from the server to the client’s current working directory and display it using matplotlib
.
[16]:
from matplotlib import image as mpimg
from matplotlib import pyplot as plt
[17]:
mechanical.run_python_script(f"image_dir=ExtAPI.DataModel.AnalysisList[1].WorkingDir")
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[17], line 1
----> 1 mechanical.run_python_script(f"image_dir=ExtAPI.DataModel.AnalysisList[1].WorkingDir")
NameError: name 'mechanical' is not defined
[18]:
result_image_dir_server = mechanical.run_python_script(f"image_dir")
print(f"Images are stored on the server at: {result_image_dir_server}")
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[18], line 1
----> 1 result_image_dir_server = mechanical.run_python_script(f"image_dir")
2 print(f"Images are stored on the server at: {result_image_dir_server}")
NameError: name 'mechanical' is not defined
[19]:
def get_image_path(image_name):
return os.path.join(result_image_dir_server, image_name)
[20]:
def display_image(path):
print(f"Printing {path} using matplotlib")
image1 = mpimg.imread(path)
plt.figure(figsize=(15, 15))
plt.axis("off")
plt.imshow(image1)
plt.show()
[21]:
image_name = "stress.png"
image_path_server = get_image_path(image_name)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[21], line 2
1 image_name = "stress.png"
----> 2 image_path_server = get_image_path(image_name)
Cell In[19], line 2, in get_image_path(image_name)
1 def get_image_path(image_name):
----> 2 return os.path.join(result_image_dir_server, image_name)
NameError: name 'result_image_dir_server' is not defined
[22]:
if image_path_server != "":
current_working_directory = os.getcwd()
local_file_path_list = mechanical.download(
image_path_server, target_dir=current_working_directory
)
image_local_path = local_file_path_list[0]
print(f"Local image path : {image_local_path}")
display_image(image_local_path)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[22], line 1
----> 1 if image_path_server != "":
2 current_working_directory = os.getcwd()
4 local_file_path_list = mechanical.download(
5 image_path_server, target_dir=current_working_directory
6 )
NameError: name 'image_path_server' is not defined
Download all the files from the server to the current working directory. Verify the target and source paths and copy all files from the server to the client.
[23]:
import shutil
import glob
[24]:
current_working_directory = os.getcwd()
target_dir2 = current_working_directory
print(f"Files to be copied from server path at: {target_dir2}")
Files to be copied from server path at: C:\Users\ansys\actions-runner\_work\pyworkbench-examples\pyworkbench-examples\pyworkbench-examples\doc\source\examples\cooled-turbine-blade
[25]:
print(f"All the solver file is stored on the server at: {result_solve_dir_server}")
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[25], line 1
----> 1 print(f"All the solver file is stored on the server at: {result_solve_dir_server}")
NameError: name 'result_solve_dir_server' is not defined
[26]:
source_dir = result_solve_dir_server
destination_dir = target_dir2
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[26], line 1
----> 1 source_dir = result_solve_dir_server
2 destination_dir = target_dir2
NameError: name 'result_solve_dir_server' is not defined
[27]:
for file in glob.glob(source_dir + '/*'):
shutil.copy(file, destination_dir)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[27], line 1
----> 1 for file in glob.glob(source_dir + '/*'):
2 shutil.copy(file, destination_dir)
NameError: name 'source_dir' is not defined
Finally, the exit
method is called on both the PyMechanical and Workbench clients to gracefully shut down the services, ensuring that all resources are properly released.
[28]:
mechanical.exit()
wb.exit()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[28], line 1
----> 1 mechanical.exit()
2 wb.exit()
NameError: name 'mechanical' is not defined