import numpy as np from pyems.simulation import Simulation from pyems.structure import PCB, Microstrip, ViaWall from pyems.coordinate import Coordinate2, Coordinate3, Box2, Box3, Axis from pyems.pcb import common_pcbs from pyems.mesh import Mesh from pyems.utilities import print_table, mil_to_mm from pyems.field_dump import FieldDump freq = np.arange(0, 18e9, 1e7) sim = Simulation(freq=freq, unit=1e-3) pcb_prop = common_pcbs["oshpark4"] pcb_len = 20 pcb_width = 5 trace_width = 0.34 gap = mil_to_mm(6) via_gap = 0.4 pcb = PCB( sim=sim, pcb_prop=pcb_prop, length=pcb_len, width=pcb_width, layers=range(3), ) box = Box2( Coordinate2(-pcb_len / 2, -trace_width / 2), Coordinate2(pcb_len / 2, trace_width / 2), ) Microstrip( pcb=pcb,
) from pyems.coordinate import Coordinate2, Axis, Box3, Coordinate3 from pyems.utilities import print_table, mil_to_mm from pyems.field_dump import FieldDump, DumpType from pyems.mesh import Mesh freq = np.arange(4e9, 18e9, 10e6) unit = 1e-3 ref_freq = 5.6e9 sim = Simulation(freq=freq, unit=unit, reference_frequency=ref_freq) pcb_len = 30 pcb_width = 10 trace_width = 0.85 gnd_gap = mil_to_mm(6) trace_gap = mil_to_mm(6) via_gap = 0.4 cap_dim = common_smd_passives["0402C"] cap_dim.set_unit(unit) pad_length = 0.6 pad_width = trace_width pcb_prop = common_pcbs["oshpark4"] pcb = PCB( sim=sim, pcb_prop=pcb_prop, length=pcb_len, width=pcb_width, layers=range(3),
add_conducting_sheet, colors, construct_box, construct_cylinder, ) freq = np.arange(0, 18e9, 1e7) ref_freq = 5.6e9 unit = 1e-3 sim = Simulation(freq=freq, unit=unit, reference_frequency=ref_freq) coax_len = 10 trace_width = 0.38 coax_dielectric = common_dielectrics["PTFE"] coax_rad = mil_to_mm(190 / 2) # RG-141 core_rad = (coax_core_diameter( 2 * coax_rad, coax_dielectric.epsr_at_freq(sim.reference_frequency)) / 2) sma_lead_len = 1.9 sma_lead_width = 0.51 sma_lead_height = 0.25 # sma_keepout_width = sma_lead_width + 2 * gap sma_rect_width = 9.53 sma_rect_height = 7.92 sma_rect_length = 0.4 sma_gnd_prong_len = 4.74 sma_gnd_prong_width = 1.02 sma_gnd_prong_height = 1.02 # sma_cutout_width = 0 * sma_keepout_width
from pyems.pcb import common_pcbs from pyems.simulation import Simulation from pyems.field_dump import FieldDump from pyems.utilities import print_table, mil_to_mm from pyems.structure import PCB, Microstrip, Via from pyems.coordinate import Box2, Coordinate2, Axis from pyems.mesh import Mesh unit = 1e-3 pcb_prop = common_pcbs["oshpark4"] z0_ref = 50 freq = np.linspace(4e9, 8e9, 501) pcb_len = 40 pcb_width = 10 gcpw_width = 0.34 gcpw_gap = mil_to_mm(6) via_gap = 0.4 # drill_radius = gcpw_width / 2 - pcb_prop.via_plating_thickness(unit) drill_radius = 0.13 drill_diam = 2 * drill_radius annular_width = 0.145 antipad = gcpw_gap keepout_radius = drill_radius + annular_width + antipad via_sep = 0.76 via_fence_sep = via_sep * 2 sim = Simulation(freq=freq, unit=unit) pcb = PCB(sim=sim, pcb_prop=pcb_prop, length=pcb_len, width=pcb_width) box = Box2( Coordinate2(-pcb_len / 2, -gcpw_width / 2), Coordinate2(pcb_len / 4, gcpw_width / 2),
from pyems.structure import PCB, Microstrip, Via from pyems.coordinate import Box2, Axis from pyems.mesh import Mesh unit = 1e-3 pcb_prop = common_pcbs["oshpark4"] z0_ref = 50 freq = np.linspace(0, 18e9, 501) pcb_len = 20 pcb_width = 10 microstrip_width = 0.38 drill_radius = 0.13 drill_diam = 2 * drill_radius annular_width = 0.145 antipad = mil_to_mm(6) keepout_radius = drill_radius + annular_width + antipad via_sep = 0.76 sim = Simulation(freq=freq, unit=unit) pcb = PCB( sim=sim, pcb_prop=pcb_prop, length=pcb_len, width=pcb_width, omit_copper=[0, 3], ) box = Box2((-pcb_len / 2, -microstrip_width / 2), (0, microstrip_width / 2)) Microstrip( pcb=pcb, position=box.center(),
from pyems.structure import DifferentialMicrostrip, PCB from pyems.coordinate import Coordinate2, Axis, Box3, Coordinate3 from pyems.utilities import print_table, mil_to_mm from pyems.field_dump import FieldDump, DumpType from pyems.mesh import Mesh freq = np.arange(0, 18e9, 10e6) unit = 1e-3 ref_freq = 5.6e9 sim = Simulation(freq=freq, unit=unit, reference_frequency=ref_freq) pcb_len = 10 pcb_width = 10 trace_width = 0.85 trace_gap = mil_to_mm(5) pcb_prop = common_pcbs["oshpark4"] pcb = PCB( sim=sim, pcb_prop=pcb_prop, length=pcb_len, width=pcb_width, layers=range(3), omit_copper=[0], ) DifferentialMicrostrip( pcb=pcb, position=Coordinate2(0, 0), length=pcb_len,
def sim_func(cutout_width: float): """ """ sim = Simulation(freq=freq, unit=unit, reference_frequency=ref_freq) core_rad = (coax_core_diameter( 2 * coax_rad, coax_dielectric.epsr_at_freq(sim.reference_frequency)) / 2) pcb_prop = common_pcbs["oshpark4"] pcb = PCB( sim=sim, pcb_prop=pcb_prop, length=pcb_len, width=pcb_width, layers=range(3), omit_copper=[0], ) Microstrip( pcb=pcb, position=Coordinate2(0, 0), length=pcb_len, width=trace_width, propagation_axis=Axis("x"), trace_layer=0, gnd_layer=1, port_number=1, ref_impedance=50, excite=True, ) # Mueller BU-1420701851 edge mount SMA pad = sim.csx.AddConductingSheet( "pad", conductivity=pcb_prop.metal_conductivity(), thickness=pcb_prop.copper_thickness(0), ) pad.AddBox( priority=priorities["trace"], start=[pcb_len / 2 - sma_lead_len / 2, -sma_lead_width / 2, 0], stop=[pcb_len / 2, sma_lead_width / 2, 0], ) pad_cutout = sim.csx.AddMaterial( "gnd_cutout", epsilon=pcb_prop.substrate.epsr_at_freq(ref_freq), kappa=pcb_prop.substrate.kappa_at_freq(ref_freq), ) pad_cutout.AddBox( priority=priorities["keepout"], start=[ pcb_len / 2 - sma_lead_len / 2, -cutout_width / 2, pcb.copper_layer_elevation(1), ], stop=[pcb_len / 2, cutout_width / 2, pcb.copper_layer_elevation(1)], ) sma_box = sim.csx.AddMetal("sma_box") sma_box.AddBox( priority=priorities["ground"], start=[ pcb_len / 2, -sma_rect_width / 2, -sma_rect_height / 2 + sma_lead_height / 2, ], stop=[ pcb_len / 2 + sma_rect_length, sma_rect_width / 2, sma_rect_height / 2 + sma_lead_height / 2, ], ) sma_keepout = sim.csx.AddMaterial( "sma_keepout", epsilon=coax_dielectric.epsr_at_freq(ref_freq), kappa=coax_dielectric.kappa_at_freq(ref_freq), ) sma_keepout.AddCylinder( priority=priorities["keepout"], start=[pcb_len / 2, 0, sma_lead_height / 2], stop=[pcb_len / 2 + sma_rect_length, 0, sma_lead_height / 2], radius=coax_rad, ) for ypos in [ -sma_rect_width / 2, sma_rect_width / 2 - sma_gnd_prong_width, ]: # sma_box.AddBox( # priority=priorities["ground"], # start=[pcb_len / 2 - sma_gnd_prong_len, ypos, 0], # stop=[ # pcb_len / 2, # ypos + sma_gnd_prong_width, # sma_gnd_prong_height # ], # ) # sma_box.AddBox( # priority=priorities["ground"], # start=[ # pcb_len / 2 - sma_gnd_prong_len, # ypos, # pcb.copper_layer_elevation(1) # ], # stop=[ # pcb_len / 2, # ypos + sma_gnd_prong_width, # pcb.copper_layer_elevation(1) - sma_gnd_prong_height, # ], # ) sma_box.AddBox( priority=priorities["ground"], start=[ pcb_len / 2 - sma_gnd_prong_len, ypos, pcb.copper_layer_elevation(1) - sma_gnd_prong_height, ], stop=[ pcb_len / 2, ypos + sma_gnd_prong_width, sma_gnd_prong_height, ], ) lead = sim.csx.AddMetal("lead") lead.AddBox( priority=priorities["trace"], start=[pcb_len / 2 - sma_lead_len / 2, -sma_lead_width / 2, 0], stop=[ pcb_len / 2 + sma_rect_length, sma_lead_width / 2, sma_lead_height, ], ) # coax port Coax( sim=sim, position=Coordinate3( pcb_len / 2 + sma_rect_length + coax_len / 2, 0, sma_lead_height / 2, ), length=coax_len, radius=coax_rad, core_radius=core_rad, shield_thickness=mil_to_mm(5), dielectric=coax_dielectric, propagation_axis=Axis("x", direction=-1), port_number=2, ref_impedance=50, ) mesh = Mesh( sim=sim, metal_res=1 / 120, nonmetal_res=1 / 10, min_lines=5, expand_bounds=((0, 0), (0, 0), (10, 10)), ) box = mesh.sim_box(include_pml=False) sim.run(csx=False) s11 = sim.s_param(1, 1) s21 = sim.s_param(2, 1) print("cutout width: {}".format(cutout_width)) print_table( data=[sim.freq / 1e9, s11, s21], col_names=["freq", "s11", "s21"], prec=[4, 4, 4], ) return np.sum(s11)
from pyems.coordinate import Coordinate2, Axis, Coordinate3 from pyems.calc import coax_core_diameter, minimize from pyems.material import common_dielectrics from pyems.mesh import Mesh from pyems.field_dump import FieldDump, DumpType from pyems.utilities import print_table, mil_to_mm freq = np.arange(0, 18e9, 1e7) ref_freq = 5.6e9 unit = 1e-3 coax_len = 10 trace_width = 0.38 coax_dielectric = common_dielectrics["PTFE"] coax_rad = mil_to_mm(190 / 2) # RG-141 sma_lead_len = 1.9 sma_lead_width = 0.51 sma_lead_height = 0.25 sma_rect_width = 9.53 sma_rect_height = 7.92 sma_rect_length = 0.4 sma_gnd_prong_len = 4.74 sma_gnd_prong_width = 1.02 sma_gnd_prong_height = 1.02 pcb_len = 10 pcb_width = 2 * sma_rect_width