Cyclic symmetry analysis#

This notebook demonstrates how to use the Workbench client to manage projects on a remote host, run scripts, and handle output files. It covers launching services, uploading files, executing scripts, and visualizing results using PyMechanical.

[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 a remote host machine, specifying the remote host machine name and user login credentials. Define several directories that will be used during the session. workdir is set to the parent directory of the current file. assets, scripts, and cdb 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 sector_model.cdb.

[6]:
wb.upload_file_from_example_repo("cyclic-symmetry-analysis/cdb/sector_model.cdb")
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[6], line 1
----> 1 wb.upload_file_from_example_repo("cyclic-symmetry-analysis/cdb/sector_model.cdb")

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 cyclic_symmetry_analysis.py via the PyMechanical client using run_python_script. This script typically contains commands to mesh and solve the model. The output of the script is printed.

[10]:
with open(scripts / "cyclic_symmetry_analysis.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 / "cyclic_symmetry_analysis.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[5].WorkingDir")
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[11], line 1
----> 1 mechanical.run_python_script(f"solve_dir=ExtAPI.DataModel.AnalysisList[5].WorkingDir")
      2 result_solve_dir_server = mechanical.run_python_script(f"solve_dir")
      3 print(f"All solver files are stored on the server at: {result_solve_dir_server}")

NameError: name 'mechanical' is not defined
[12]:
solve_out_path = os.path.join(result_solve_dir_server, "solve.out")
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[12], line 1
----> 1 solve_out_path = os.path.join(result_solve_dir_server, "solve.out")

NameError: name 'result_solve_dir_server' is not defined
[13]:
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="")
[14]:
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[14], 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 (deformation.png) from the server to the client’s current working directory and display it using matplotlib.

[15]:
from matplotlib import image as mpimg
from matplotlib import pyplot as plt
[16]:
mechanical.run_python_script(f"image_dir=ExtAPI.DataModel.AnalysisList[5].WorkingDir")
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[16], line 1
----> 1 mechanical.run_python_script(f"image_dir=ExtAPI.DataModel.AnalysisList[5].WorkingDir")
      2 result_image_dir_server = mechanical.run_python_script(f"image_dir")
      3 print(f"Images are stored on the server at: {result_image_dir_server}")

NameError: name 'mechanical' is not defined
[17]:
def get_image_path(image_name):
    return os.path.join(result_image_dir_server, image_name)
[18]:
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()
[19]:
image_name = "deformation.png"
image_path_server = get_image_path(image_name)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[19], line 2
      1 image_name = "deformation.png"
----> 2 image_path_server = get_image_path(image_name)

Cell In[17], 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
[20]:
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[20], 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 source path for the directory and copy all files from the server to the client.

[21]:
mechanical.run_python_script(f"solve_dir=ExtAPI.DataModel.AnalysisList[5].WorkingDir")
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[21], line 1
----> 1 mechanical.run_python_script(f"solve_dir=ExtAPI.DataModel.AnalysisList[5].WorkingDir")
      2 result_solve_dir_server = mechanical.run_python_script(f"solve_dir")
      3 print(f"All solver files are stored on the server at: {result_solve_dir_server}")

NameError: name 'mechanical' is not defined
[22]:
solve_out_path = os.path.join(result_solve_dir_server, "*.*")
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[22], line 1
----> 1 solve_out_path = os.path.join(result_solve_dir_server, "*.*")

NameError: name 'result_solve_dir_server' is not defined
[23]:
current_working_directory = os.getcwd()
mechanical.download(solve_out_path, target_dir=current_working_directory)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[23], line 2
      1 current_working_directory = os.getcwd()
----> 2 mechanical.download(solve_out_path, target_dir=current_working_directory)

NameError: name 'mechanical' 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.

[24]:
mechanical.exit()
wb.exit()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[24], line 1
----> 1 mechanical.exit()
      2 wb.exit()

NameError: name 'mechanical' is not defined