Note
Go to the end to download the full example code.
Icepak: setup from Sherlock inputs#
This example shows how you can create an Icepak project from Sherlock files (STEP and CSV) and an AEDB board.
Perform required imports#
Perform required imports and set paths.
import time
import os
import pyaedt
import datetime
# Set paths
project_folder = pyaedt.generate_unique_folder_name()
input_dir = pyaedt.downloads.download_sherlock(destination=project_folder)
Set AEDT version#
Set AEDT version.
aedt_version = "2024.1"
Set non-graphical mode#
Set non-graphical mode.
You can set non_graphical
value either to True
or False
.
non_graphical = False
Define variables#
Define input variables. The following code creates all input variables that are needed to run this example.
material_name = "MaterialExport.csv"
component_properties = "TutorialBoardPartsList.csv"
component_step = "TutorialBoard.stp"
aedt_odb_project = "SherlockTutorial.aedt"
aedt_odb_design_name = "PCB"
stackup_thickness = 2.11836
outline_polygon_name = "poly_14188"
Launch AEDT#
Launch AEDT 2023 R2 in graphical mode.
d = pyaedt.launch_desktop(specified_version=aedt_version, non_graphical=non_graphical, new_desktop_session=True)
start = time.time()
material_list = os.path.join(input_dir, material_name)
component_list = os.path.join(input_dir, component_properties)
validation = os.path.join(project_folder, "validation.log")
file_path = os.path.join(input_dir, component_step)
project_name = os.path.join(project_folder, component_step[:-3] + "aedt")
C:\actions-runner\_work\_tool\Python\3.10.9\x64\lib\subprocess.py:1072: ResourceWarning: subprocess 9008 is still running
_warn("subprocess %s is still running" % self.pid,
C:\actions-runner\_work\pyaedt\pyaedt\.venv\lib\site-packages\pyaedt\generic\settings.py:383: ResourceWarning: unclosed file <_io.TextIOWrapper name='D:\\Temp\\pyaedt_ansys.log' mode='a' encoding='cp1252'>
self._logger = val
Create Icepak project#
Create an Icepak project.
ipk = pyaedt.Icepak(project_name)
Delete region to speed up import#
Delete the region and disable autosave to speed up the import.
d.disable_autosave()
ipk.modeler.delete("Region")
component_name = "from_ODB"
Import PCB from AEDB file#
Import a PCB from an AEDB file.
odb_path = os.path.join(input_dir, aedt_odb_project)
ipk.create_pcb_from_3dlayout(component_name=component_name, project_name=odb_path, design_name=aedt_odb_design_name,
extenttype="Polygon")
C:\actions-runner\_work\pyaedt\pyaedt\.venv\lib\site-packages\pyaedt\icepak.py:2561: DeprecationWarning: ``extenttype`` was deprecated in 0.6.43. Use ``extent_type`` instead.
warnings.warn(
<pyaedt.modules.Boundary.NativeComponentObject object at 0x000002260162E8C0>
Create offset coordinate system#
Create an offset coordinate system to match ODB++ with the Sherlock STEP file.
ipk.modeler.create_coordinate_system(origin=[0, 0, stackup_thickness / 2], mode="view", view="XY")
<pyaedt.modeler.cad.Modeler.CoordinateSystem object at 0x000002264A685930>
Import CAD file#
Import a CAD file.
ipk.modeler.import_3d_cad(file_path, refresh_all_ids=False)
True
Save CAD file#
Save the CAD file and refresh the properties from the parsing of the AEDT file.
ipk.save_project(refresh_obj_ids_after_save=True)
True
Plot model#
Plot the model.
ipk.plot(show=False, export_path=os.path.join(project_folder, "Sherlock_Example.jpg"), plot_air_objects=False)

<pyaedt.generic.plot.ModelPlotter object at 0x000002260162DB70>
Delete PCB objects#
Delete the PCB objects.
ipk.modeler.delete_objects_containing("pcb", False)
True
Create region#
Create an air region.
ipk.modeler.create_air_region(*[20, 20, 300, 20, 20, 300])
<pyaedt.modeler.cad.object3d.Object3d object at 0x0000022602D12DD0>
Assign materials#
Assign materials from Sherlock file.
ipk.assignmaterial_from_sherlock_files(component_list, material_list)
True
Delete objects with no material assignments#
Delete objects with no materials assignments.
no_material_objs = ipk.modeler.get_objects_by_material("")
ipk.modeler.delete(no_material_objs)
ipk.save_project()
True
Assign power to component blocks#
Assign power to component blocks.
all_objects = ipk.modeler.object_names
Assign power blocks#
Assign power blocks from the Sherlock file.
total_power = ipk.assign_block_from_sherlock_file(csv_name=component_list)
Plot model#
Plot the model again now that materials are assigned.
ipk.plot(show=False, export_path=os.path.join(project_folder, "Sherlock_Example.jpg"), plot_air_objects=False)

<pyaedt.generic.plot.ModelPlotter object at 0x000002264FBBAE00>
Set up boundaries#
Set up boundaries.
# Mesh settings that is tailored for PCB
# Max iterations is set to 20 for quick demonstration, please increase to at least 100 for better accuracy.
ipk.globalMeshSettings(3, gap_min_elements='1', noOgrids=True, MLM_en=True,
MLM_Type='2D', edge_min_elements='2', object='Region')
setup1 = ipk.create_setup()
setup1.props["Solution Initialization - Y Velocity"] = "1m_per_sec"
setup1.props["Radiation Model"] = "Discrete Ordinates Model"
setup1.props["Include Gravity"] = True
setup1.props["Secondary Gradient"] = True
setup1.props["Convergence Criteria - Max Iterations"] = 10
ipk.assign_openings(ipk.modeler.get_object_faces("Region"))
<pyaedt.modules.Boundary.BoundaryObject object at 0x000002266025D9F0>
Create point monitor#
point1 = ipk.assign_point_monitor(ipk.modeler["COMP_U10"].top_face_z.center, monitor_name="Point1")
ipk.modeler.set_working_coordinate_system("Global")
line = ipk.modeler.create_polyline(
[ipk.modeler["COMP_U10"].top_face_z.vertices[0].position, ipk.modeler["COMP_U10"].top_face_z.vertices[2].position],
non_model=True)
ipk.post.create_report(expressions="Point1.Temperature", primary_sweep_variable="X")
<pyaedt.modules.report_templates.Standard object at 0x000002266020ABC0>
Check for intersections#
Check for intersections using validation and fix them by assigning priorities.
ipk.assign_priority_on_intersections()
True
Compute power budget#
power_budget, total = ipk.post.power_budget("W" )
print(total)
98.50000000000057
Analyze the model#
ipk.analyze(cores=4, tasks=4)
ipk.save_project()
True
Get solution data and plots#
plot1 = ipk.post.create_fieldplot_surface(ipk.modeler["COMP_U10"].faces, "SurfTemperature")
ipk.post.plot_field("SurfPressure", ipk.modeler["COMP_U10"].faces, show=False, export_path=ipk.working_directory)

<pyaedt.generic.plot.ModelPlotter object at 0x000002266020BA00>
Save project and release AEDT#
Save the project and release AEDT.
ipk.save_project()
end = time.time() - start
print("Elapsed time: {}".format(datetime.timedelta(seconds=end)))
print("Project Saved in {} ".format(ipk.project_file))
ipk.release_desktop()
Elapsed time: 0:19:14.242801
Project Saved in D:/Temp/pyaedt_prj_2D3/TutorialBoard.aedt
True
Total running time of the script: (19 minutes 30.642 seconds)