Py学习  »  Python

CST2026与python联合仿真使用串联馈电贴片阵列的1X3雷达阵列天线的学习笔记

微波射频仿真工坊 • 3 周前 • 85 次点击  

1.运行后,模型如下:

2.运行后,结果如下:

1) 子阵列1#

2) 子阵列2#

3) 子阵列3#

"""使用串联馈电贴片阵列天线的雷达阵列三天线的 CST 自动化建模与仿真 Demo========================================工作频率: 8 GHz介质基板: RO4350:εr = 3.66,厚度 = 2.2 mm求解器: 时域求解器"""
from py4cst.cst import Interface, Projectfrom py4cst.cst.wrappers import Brick, DiscretePort, Material, Units, Solver, Boundary, MeshSettings, Monitor, Transformfrom py4cst import cst, material_utils, material_libraryimport os
# ============================================================# 1. 初始化 CST 接口并创建 Microwave Studio 项目# ============================================================print("=" * 60)print("步骤 1: 初始化 CST 接口并创建项目")print("=" * 60)
ifc = Interface(start_mode=Interface.StartMode.ExistingOrNew)ifc.set_quiet_mode(False)
try:    proj = ifc.get_active_project()    print("使用当前活动项目") except RuntimeError:    proj = ifc.new_microwave_studio_project()    print("创建新的 Microwave Studio 项目")
print(f"  应用名称: {proj.get_application_name()}")print(f"  应用版本: {proj.get_application_version()}")
# ============================================================# 2. 设置项目单位# ============================================================print("\n" + "=" * 60)print("步骤 2: 设置项目单位 (mm, GHz)")print("=" * 60)
units = Units(proj)units.set_geometry_unit(cst.units.GEOMETRY_MILLIMETER)units.set_frequency_unit(cst.units.FREQUENCY_GIGAHERTZ)print("  几何单位: mm")print("  频率单位: GHz")
# ============================================================# 3. 设置频率范围# ============================================================print("\n" + "=" * 60)print("步骤 3: 设置频率范围")print("=" * 60)f_min = 0   # GHzf_max = 10.0   # GHz
# ============================================================# 4. 定义天线参数# ============================================================print("\n" + "=" * 60)print("步骤 4: 定义天线参数")print("=" * 60)
# 设计参数freq_ghz = 8                  # 中心频率 (GHz)freq_farfield1 = 7.95          # 三个远场监视器频点freq_farfield2 = freq_ghz      # 三个远场监视器频点freq_farfield3 = 8.05          # 三个远场监视器频点
c = 3e8f = freq_ghz * 1e9
er = 3.66                 # 相对介电常数h = 2.2                  # 基板厚度 (mm)copper_t = 0.035         # 铜箔厚度 (mm)---1oz
# 串馈阵列:等间距阵列方案N = 6feedline_w1 = 1                    # 所有馈线统一宽度feedline_l1 = 11.9                 # 所有馈线统一长度patch_l1 = 9.2                    # 所有贴片统一纵向长度
patch_w1 = 5.0                  # 阵元1#宽度@top层patch_w2 = 7.2                  # 阵元2#宽度@top层patch_w3 = 9.0                  # 阵元3#宽度@top层patch_w4 = patch_w3             # 阵元4#宽度@top层patch_w5 = patch_w2             # 阵元5#宽度@top层patch_w6 = patch_w1             # 阵元6#宽度@top层
patch_w_list = [    patch_w1,    patch_w2,    patch_w3,    patch_w4,    patch_w5,    patch_w6]
cell_distance = feedline_l1 + patch_l1              # 阵元与阵元等间距
half_lamda = c / (2 * f)  * 1000translate_x_x1 = -half_lamda        # 1X3第一组偏移:半波长,复制2次
gnd_feedline_gap = 0.1    # 主板区域与阵列馈线gap,for Port#地板gnd_wadd = 10.0           # 基板边缘余量 (mm)gnd_lmain = 10          # 主板区域长度gnd_ladd_end = 3        # 长度延伸量gnd_w = 2 * gnd_wadd + max(patch_w_list) + 2 * abs(translate_x_x1)          # 地板宽度@bottom层array_l = N * cell_distance                                                # 阵列总长度gnd_l = gnd_lmain + gnd_feedline_gap + array_l + gnd_ladd_end              # 地板总长度
print(f"  阵元数量 N: {N}")print(f"  阵元间距: {cell_distance:.2f}  mm")print(f"  各贴片宽度列表: {patch_w_list}")print(f"  第一组RX平移X = {translate_x_x1} mm,复制2次")
# 将参数存储到 CST 参数系统中params = proj.get_parameters()params.store('freq', freq_ghz)params.store('er', er)params.store('h', h)params.store('copper_t', copper_t)params.store('N', N)params.store('feedline_w1', feedline_w1)params.store('feedline_l1', feedline_l1)params.store('patch_l1', patch_l1)params.store('patch_w1', patch_w1)params.store('patch_w2', patch_w2)params.store('patch_w3', patch_w3)params.store('patch_w4', patch_w4)params.store('patch_w5', patch_w5)params.store('patch_w6', patch_w6)params.store('cell_distance', cell_distance)params.store('half_lamda', half_lamda)params.store('translate_x_x1', translate_x_x1)params.store('gnd_feedline_gap', gnd_feedline_gap)params.store('gnd_wadd', gnd_wadd)params.store('gnd_lmain', gnd_lmain)params.store('gnd_ladd_end', gnd_ladd_end)params.store('gnd_w', gnd_w)params.store('array_l', array_l)params.store('gnd_l', gnd_l)print("  参数已存储到 CST 参数系统")
# ============================================================# 5. 创建材料# ============================================================print("\n" + "=" * 60)print("步骤 5: 创建材料")print("=" * 60)
material = Material(proj)
# 使用CST 材料库自带的 Copper铜箔材料mat_copper = material_library.Material()copper_mtd_path = material_library.get_material_path(proj, "Copper (annealed)")mat_copper.load_from_file(copper_mtd_path)mat_copper.import_to_project(proj)
# 创建介质基板材料material_utils.prepare_simple_material(material, rel_permitivity=er, rel_permeability=1.0)material.set_name('Substrate')material.create()print(f"  创建介质材料 'Substrate': εr={er}, μr=1.0")

# ============================================================# 6. 创建 3D 几何结构# ============================================================print("\n" + "=" * 60)print("步骤 6: 创建 3D 几何结构 - 原始TX阵列")print("=" * 60)
brick = Brick(proj)
# --- 6.1 介质基板 ---brick.reset()brick.set_name('substrate')brick.set_component('antenna')brick.set_material('Substrate')brick.set_x_range(-2 * gnd_wadd - 2 * abs(translate_x_x1), 2 * gnd_wadd)brick.set_y_range(-gnd_lmain, gnd_l - gnd_lmain)brick.set_z_range(0, h)brick.create()print(f"  创建介质基板: {gnd_w:.2f} x {gnd_l:.2f} x {h} mm")
# --- 6.2 接地板 (@bottom层)  ---brick.reset()brick.set_name('ground') brick.set_component('antenna')brick.set_material('Copper (annealed)')brick.set_x_range(-2 * gnd_wadd - 2 * abs(translate_x_x1), 2 * gnd_wadd)brick.set_y_range(-gnd_lmain, gnd_l - gnd_lmain)brick.set_z_range(-copper_t, 0)brick.create()print(f"  创建接地板")
# --- 6.3 主板区域  ---brick.reset()brick.set_name('mainboard')brick.set_component('antenna')brick.set_material('Copper (annealed)')brick.set_x_range(-2 * gnd_wadd - 2 * abs(translate_x_x1), 2 * gnd_wadd)brick.set_y_range(-gnd_lmain, 0)brick.set_z_range(-copper_t, h + copper_t)brick.create()print(f"  创建主板区域")
# ===================== 生成所有馈线+贴片(原始阵列) =====================print(f"  开始循环生成 {N} 组馈线与辐射贴片(原始阵列)")# i 直接取 1,2,3...6,对应 feedline1~feedline6, patch1~patch6src_shape_full_names = []for i in range(1, N + 1):    idx = i - 1    y_base = gnd_feedline_gap + idx * cell_distance    current_patch_w = patch_w_list[idx]
    # 1. 创建第 i 根馈线 feedline(i)    brick.reset()    brick.set_name(f'feedline{i}')    brick.set_component('antenna')    brick.set_material('Copper (annealed)')    brick.set_x_range(-feedline_w1 / 2, feedline_w1 / 2)    brick.set_y_range(y_base, y_base + feedline_l1)    brick.set_z_range(h, h + copper_t)    brick.create()    src_shape_full_names.append(f"antenna:feedline{i}")    print(f"    创建馈线 {i}")
    # 2. 创建第 i 个贴片 patch(i)    brick.reset()    brick.set_name(f'patch{i}')    brick.set_component('antenna')    brick.set_material('Copper (annealed)')    brick.set_x_range(-current_patch_w / 2, current_patch_w / 2)    brick.set_y_range(y_base + feedline_l1, y_base + cell_distance)    brick.set_z_range(h, h + copper_t)    brick.create()    src_shape_full_names.append(f"antenna:patch{i}")    print(f"    创建辐射贴片 {i} 宽度={current_patch_w} mm")# ==========================================================================
# ============================================================# 7. 批量创建3组离散端口 Port1(TX)、Port2(RX1)、Port3(RX2)# ============================================================print("\n" + "=" * 60)print("步骤 7: 批量创建3组50Ω离散端口,永久保存不丢失")print("=" * 60)
# 1X3阵列X中心偏移:原始、第2列、第3列port_x_offset_list = [    0.0,                     # Port1 原始阵列 X=0    translate_x_x1,          # Port2 第2列 X=-half_lamda    2 * translate_x_x1       # Port3 第3列 X=-2*half_lamda]
for port_idx, x_off in enumerate(port_x_offset_list):    port_num = port_idx + 1    discrete_port = DiscretePort(proj)    discrete_port.reset()    discrete_port.port_number(port_num)    discrete_port.type(DiscretePort.PortType.SPARAMETER)    discrete_port.impedance(50)    discrete_port.monitor(True)    discrete_port.radius(0)    # X坐标叠加阵列偏移,Y/Z不变,匹配平移后的馈电位置    discrete_port.set_p1(False, x_off, 0, h + copper_t)    discrete_port.set_p2(False, x_off, gnd_feedline_gap, h + copper_t)    discrete_port.create()    print(f"  端口  {port_num}: 50Ω 离散端口,X偏移={x_off:.3f} mm")

# ============================================================# 8. 生成1X3雷达阵列三天线# ============================================================print("\n" + "=" * 60)print("步骤 8: 生成1X3雷达阵列三天线")print("=" * 60)# ===================== 8.1 第一组复制:重复2次  =====================print(f"\n  --- 第一组复制:X={translate_x_x1} mm,重复2次 ---")# 批量复制所有Shape(馈线+贴片)trans_shape_rx1 = Transform(proj)trans_shape_rx1.reset()trans_shape_rx1.set_save_history(True)        # 写入 History List# 第一个源物体trans_shape_rx1.set_name(src_shape_full_names[0])# 追加剩余所有馈线、贴片for obj_fullname in src_shape_full_names[1:]:    trans_shape_rx1.add_name(obj_fullname)trans_shape_rx1.set_use_picked_points(False)trans_shape_rx1.set_invert_picked_points(False)trans_shape_rx1.set_multiple_objects(True)    # Copy开启,保留原物体trans_shape_rx1.set_group_objects(False)      # 复制后不合并trans_shape_rx1.set_origin(Transform.Origin.FREE)trans_shape_rx1.set_vector((translate_x_x1, 0.00.0))trans_shape_rx1.set_number_of_repetitions(2)  # 复制2次,生成2组阵列trans_shape_rx1.transform(Transform.What.SHAPE, Transform.How.TRANSLATE)#trans_shape_rx1.flush_cache("Translate RX1 shape batch copy execute")print(f"  完成馈线+贴片批量复制,X偏移 {translate_x_x1} mm,生成2套RX几何阵列")# ============================================================# 9. 设置边界条件# ============================================================print("\n" + "=" * 60)print("步骤 9: 设置边界条件 (开放空间)")print("=" * 60)boundary = Boundary(proj)boundary.set_symmetry_x(Boundary.SymmetryType.NONE)boundary.set_symmetry_y(Boundary.SymmetryType.NONE)boundary.set_symmetry_z(Boundary.SymmetryType.NONE)boundary.set_apply_in_all_directions(False)boundary.set_type_x_min(Boundary.BoundaryType.EXPANDED_OPEN)boundary.set_type_x_max(Boundary.BoundaryType.EXPANDED_OPEN)boundary.set_type_y_min(Boundary.BoundaryType.EXPANDED_OPEN)boundary.set_type_y_max(Boundary.BoundaryType.EXPANDED_OPEN)boundary.set_type_z_min(Boundary.BoundaryType.EXPANDED_OPEN)boundary.set_type_z_max(Boundary.BoundaryType.EXPANDED_OPEN)print("  所有方向: 开放边界 (expanded open)")print("  对称面: 无")# ============================================================# 10. 设置远场监视器# ============================================================print("\n" + "=" * 60)print("步骤 10: 设置远场监视器")print("=" * 60)# 三个目标频点列表# 关键修复:开启历史记录,使其能够写入 History List 并随工程保存ff_freq_list = [freq_farfield1, freq_farfield2, freq_farfield3]for ff_freq in ff_freq_list:    monitor = Monitor(proj)    monitor.reset()    monitor.set_save_history(True)              # 写入 History List    monitor.set_name(f"farfield (f={ff_freq})")    monitor.set_field_type(Monitor.FieldType.FARFIELD)    monitor.set_domain(Monitor.Domain.FREQUENCY)    monitor.set_frequency(ff_freq)    monitor.set_compute_transient_farfield(True)    monitor.create()    print(f"  已创建远场监视器:farfield (f={ff_freq})")print


    
("  说明:仅添加Farfield远场监视器,时域求解完成后才会输出3D方向图结果")# ============================================================# 11. 设置网格# ============================================================print("\n" + "=" * 60)print("步骤 11: 设置网格参数")print("=" * 60)mesh_settings = MeshSettings(proj)mesh_settings.set_mesh_type(MeshSettings.MeshType.HEX)#配置Mesh properties-> Maximum Cellmesh_settings.set_steps_per_wave_near(30)mesh_settings.set_steps_per_wave_far(5)mesh_settings.set_wavelength_refinement_same_as_near(False)mesh_settings.set_steps_per_box_near(20)#配置Mesh properties-> Minimum Cell# ->absolute value in XYZmesh_settings.set_use_same_min_step_geometry(False)mesh_settings.set_use_ratio_limit_geometry(False)mesh_settings.set_min_step_geometry_x(0.5)mesh_settings.set_min_step_geometry_y(0.5)mesh_settings.set_min_step_geometry_z(0.035)print("  网格类型: 六面体 (Hexahedral)")# ============================================================# 12. 设置求解器类型并运行仿真# ============================================================print("\n" + "=" * 60)print("步骤 12: 设置求解器并运行仿真")print("=" * 60)hf_solver = Solver(proj)hf_solver.set_save_history(True)         # 写入 History Listhf_solver.set_frequency_range(f_min, f_max)print(f"  频率范围: {f_min} ~ {f_max} GHz")proj.set_solver_type(Project.SolverType.HF_TIME_DOMAIN)print(f"  求解器类型: {proj.get_solver_type().value}")modeler = proj.get_modeler()print("  启动求解器...")modeler.run_solver()  # 仿真注释print("  建模完成,可手动启动仿真!")# ============================================================# 13. 保存项目# ============================================================print("\n" + "=" * 60)print("步骤 13: 保存项目")print("=" * 60)save_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'ThreeArrayRadar_SeriesFedPatchArray.cst')proj.save(save_path, include_results=True)print(f"  项目已保存至: {save_path}")

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/199269