def smp_connector(em, x, y, z, zmax, coax_port_length=0.2e-3, pin_diameter=0.85e-3): copper_shield = openems.Metal(em, 'smp_shield') copper = openems.Metal(em, 'smp_pin') lcp = openems.Dielectric(em, 'lcp', eps_r=3.2) # shield outside = np.array([[-2.5, 1.0], [-2.5, 2.5], [2.5, 2.5], [2.5, -2.5], [-2.5, -2.5], [-2.5, -1.0]]) * 1e-3 angle = np.arcsin(1.0 / 2.25) inside = openems.arc(0, 0, 4.5e-3 / 2.0, -np.pi + angle, np.pi - angle) openems.Polygon(copper_shield, priority=9, pcb_layer=None, points=[x, y] + np.concatenate((inside, outside)), elevation=[z, z + 0.9e-3], normal_direction='z') outside = np.array([[0, 2.5], [2.5, 2.5], [2.5, -2.5], [0, -2.5]]) * 1e-3 inside = openems.arc(0, 0, 1.95e-3 / 2.0, -np.pi * 0.5, np.pi * 0.5) openems.Polygon(copper_shield, priority=9, pcb_layer=None, points=[x, y] + np.concatenate((inside, outside)), elevation=[z + 0.9e-3, zmax], normal_direction='z').duplicate().mirror('x') # pin start = np.array([x, y, zmax - coax_port_length]) stop = np.array([x, y, z + 0.9e-3]) copper.AddCylinder(start, stop, 0.5 * pin_diameter, priority=9) # smaller part of pin stop[2] = z copper.AddCylinder(start, stop, 0.5 * 0.8e-3, priority=9) # insulator start = np.array([x, y, z]) stop = np.array([x, y, z + 0.9e-3]) lcp.AddCylinder(start, stop, 4.5e-3 * 0.5, priority=1) if coax_port_length != 0: # port (coax) start = [ x + 0.5 * coax_port_length, y + 0.5 * coax_port_length, zmax - coax_port_length ] stop = [x - 0.5 * coax_port_length, y - 0.5 * coax_port_length, zmax] openems.Port(em, start, stop, direction='z', z=50) em.mesh.AddLine('z', start[2])
#!/usr/bin/env python3 import sys import openems import numpy as np mm = 1e-3 # default unit is the meter em = openems.OpenEMS(sys.argv[1], EndCriteria = 1e-6, fmin = 0e6, fmax = 60e9) em.fsteps = 801 copper = openems.Metal(em, 'copper') sub = openems.Dielectric(em, 'substrate', eps_r=3.2) mask = openems.Dielectric(em, 'mask', eps_r=3.3) air = openems.Dielectric(em, 'air', eps_r=1.0006) foil_thickness = 0.035*mm port_length = 0.05*mm box_length = 5*mm box_width = 1.5*mm ms_width = 0.190*mm box_top = 1.5*mm # dimensions Z substrate_top = 0.102*mm foil_top = substrate_top + foil_thickness em.resolution = 50e-6 em.mesh.AddLine('z', foil_top + box_top) em.mesh.AddLine('z', -0.5*mm) # substrate start = np.array([-0.5*box_length, 0.5*box_width, 0]) stop = np.array([0.5*box_length, -0.5*box_width, substrate_top])
def generate( em, substrate, z, # [bottom of substrate, top of substrate, top of metal] y1=5.5 * mm, y2=0.9 * mm, r=0.5 * mm, rv=[200, 200, 200, 200], w=[0.127 * mm, 0.152 * mm, 0.19 * mm, 0.23 * mm], port_length=0.2 * mm, ms_width=0.36 * mm, endspace=0.5 * mm, resistor_size='0402'): alumina = openems.Dielectric(em, 'alumina', eps_r=9.8) metal = openems.Metal(em, 'pec_wilkinson') n = len(rv) # substrate start = np.array([(n * 4 - 1) * r + endspace, y1 + r + endspace, z[0]]) stop = np.array([-1.0 * endspace, -1.0 * start[1], z[1]]) substrate.AddBox(start, stop, 1) # common port line (pad 1) start = np.array([-1.0 * endspace + port_length, 0.5 * ms_width, z[1]]) stop = np.array([0, -0.5 * ms_width, z[2]]) metal.AddBox(start, stop, priority=9, padname='1') lo = arc(r, -y1, r + 0.5 * w[0], pi, 2 * pi, 16) li = arc(r, -y1, r - 0.5 * w[0], pi, 2 * pi, 16) lo = cat((lo, arc(3 * r, -y2, r - 0.5 * w[0], pi, 0.55 * pi, 16))) li = cat((li, arc(3 * r, -y2, r + 0.5 * w[0], pi, 0.55 * pi, 16))) for i in range(n - 1): x = (4 * i + 3) * r w2 = w[1 + i] em.mesh.AddLine('x', x + r - 0.5 * w2) em.mesh.AddLine('x', x + r + 0.5 * w2) em.mesh.AddLine('x', x + 3 * r - 0.5 * w2) em.mesh.AddLine('x', x + 3 * r + 0.5 * w2) lo = cat((lo, arc(x, -y2, r - 0.5 * w2, 0.45 * pi, 0, 16))) li = cat((li, arc(x, -y2, r + 0.5 * w2, 0.45 * pi, 0, 16))) lo = cat((lo, arc(2 * r + x, -y1, r + 0.5 * w2, pi, 2 * pi, 16))) li = cat((li, arc(2 * r + x, -y1, r - 0.5 * w2, pi, 2 * pi, 16))) lo = cat((lo, arc(4 * r + x, -y2, r - 0.5 * w2, pi, 0.55 * pi, 16))) li = cat((li, arc(4 * r + x, -y2, r + 0.5 * w2, pi, 0.55 * pi, 16))) l = cat((lo, li[::-1])) l = cat((l[::-1] * [1, -1], l)) openems.Polygon(metal, priority=9, points=l, elevation=z[1:], normal_direction='z', pcb_layer='F.Cu', pcb_width=0.001) # x at 2 port side x0 = (n * 4 - 1) * r + endspace x1 = x0 - port_length # output lines for (ym, padname) in [(1, 2), (-1, 3)]: start = np.array([x1, ym * 0.2 * mm, z[1]]) stop = np.array([(n * 4 - 1) * r - 0.1 * mm, ym * (0.2 * mm + ms_width), z[2]]) lp2 = metal.AddBox(start, stop, priority=9, padname=padname) # main line port start = [-1.0 * endspace, -0.5 * ms_width, z[1]] stop = [-1.0 * endspace + port_length, 0.5 * ms_width, z[2]] openems.Port(em, start, stop, direction='x', z=50) # coupled line ports for ym in [-1, 1]: start = [x0 - port_length, ym * 0.2 * mm, z[1]] stop = [x0, ym * (0.2 * mm + ms_width), z[2]] openems.Port(em, start, stop, direction='x', z=50) for i in range(n): if not rv[i]: continue em.add_resistor('r{}'.format(i), origin=np.array([4 * r * i + 3 * r, 0, z[2]]), direction='y', value=rv[i], invert=False, priority=9, dielectric=alumina, metal=metal, element_down=False, size=resistor_size)
fc = 6e9 foil_thickness = 35e-6 substrate_thickness = 100e-6 z = np.zeros(6) z[1] = 1.6e-3 z[2] = z[1] + foil_thickness z[3] = z[2] + substrate_thickness z[4] = z[3] + foil_thickness z[5] = z[4] + 1.6e-3 openems.LPF_DGS_bowtie.generate( em, sub = openems.Dielectric(em, 'polyimide', eps_r=3.2, tand=0.002, fc=fc), mask = openems.Dielectric(em, 'soldermask', eps_r=3.3, tand=0.020, fc=fc), min_width = 152e-6, cutout_width = 1.0e-3, inductors = 0.15e-3 + 1.55*np.array([1.7e-3, 1.96e-3, 2e-3]), capacitors = 1.45*np.array([0.47e-3, 0.77e-3, 0.81e-3, 0.82e-3]), z = z, port_length = 75e-6, ms_width = 195e-6, box_width = 3e-3) em.write_kicad(em.name) command = 'view solve' if len(sys.argv) > 1: command = sys.argv[1] em.run_openems(command)
#!/usr/bin/env python3 import sys from scipy.constants import pi, c, epsilon_0, mu_0, mil, inch mm = 0.001 import openems import openems.lpf import numpy as np em = openems.OpenEMS('lpf_6') em.end_criteria = 1e-6 em.fmin = 1e6 em.fmax = 20e9 em.fsteps = 1601 fc = 6e9 sub = openems.Dielectric(em, 'fr408', eps_r=3.66, tand=0.012, fc=fc) foil_thickness = 0.035 * mm substrate_thickness = 6.6 * mil ms_air_above = 1.0 * mm z = [0.0, substrate_thickness, substrate_thickness + foil_thickness] em.mesh.AddLine('z', z[2] + ms_air_above) from math import sqrt em.resolution = c / (em.fmax * sqrt(3.0)) / 100.0 lpf = openems.lpf.generate(em, sub=sub, z=z, port_length=0.1 * mm,
#!/usr/bin/env python3 # Common SMA edge launch to OSHPark 4 layer import sys from scipy.constants import mil import openems import numpy as np em = openems.OpenEMS('sma_el', EndCriteria=1e-6, fmin=0, fmax=20e9, fsteps=1001) em.resolution = 8e-5 copper = openems.Metal(em, 'copper') copper_shield = openems.Metal(em, 'copper_shield') sub = openems.Dielectric(em, 'ro4350b', eps_r=3.66, tand=0.0035, fc=em.fmax) teflon = openems.Dielectric(em, 'teflon', eps_r=2.1, tand=0.0002, fc=em.fmax) foil_thickness = 35e-6 substrate_thickness = 62 * mil - 7 * mil port_length = 300e-6 box_length = 10e-3 box_width = 6e-3 box_height = 6e-3 ms_width = 1.0e-3 board_gap = 0.0 # coax coax_scale = 2.0 pin_diameter = 0.5e-3 * coax_scale dielectric_diameter = 1.67e-3 * coax_scale
#!/usr/bin/env python3 import sys from scipy.constants import pi, c, epsilon_0, mu_0, mil, inch mm = 0.001 import openems import openems.miter import numpy as np em = openems.OpenEMS('miter_6.6') em.end_criteria = 1e-6 em.fmin = 0 em.fmax = 40e9 em.fsteps = 1601 fc = 40e9 pec = openems.Metal(em, 'pec') sub = openems.Dielectric(em, 'ro4350b', eps_r=3.66, tand=0.0035, fc=fc) foil_thickness = 0.033*mm substrate_thickness = 6.6*mil ms_air_above = 1.0*mm z = [0.0, substrate_thickness, substrate_thickness + foil_thickness] em.mesh.AddLine('z', z[2] + ms_air_above) em.resolution = 50e-6 openems.miter.generate( em, pec, sub, miter = 0.35 * mm, z = z,
import sys mm = 0.001 # mm in meters mil = 25.4e-6 # mil in meters import openems import openems.geometries import numpy as np em = openems.OpenEMS('via_1_3_oshpark', EndCriteria=1e-4, fmin=0e6, fmax=40e9, boundaries=['PEC', 'PEC', 'PEC', 'PEC', 'PEC', 'PEC'], fsteps=801) copper = openems.Metal(em, 'copper') pcopper = openems.Metal(em, 'pcopper') sub1 = openems.Dielectric(em, 'substrate', eps_r=3.2) sub2 = openems.Dielectric(em, 'substrate', eps_r=4) sub1t = 0.166 * mm sub2t = 47 * mil ifoil = 0.0125 * mm ofoil = 0.035 * mm port_length = 0.1 * mm box_length = 5 * mm box_width = 2 * mm sl_width = 0.24 * mm ms_width = 0.35 * mm airspace = 1 * mm bt = sub1t + ofoil
mm = 0.001 import openems import openems.idbpf import numpy as np em = openems.OpenEMS('idbpf_b3', fmin=1e6, fmax=16e9) em.end_criteria = 1e-10 em.fsteps = 1601 fc = 7.12e9 eps_r = 3.66 #em.add_lossy_metal('copper', frequency=fc, conductivity=56e6/3, ur=1.0) openems.Metal(em, 'copper') openems.Metal(em, 'pec') #em.via_offset_x = 5*mil #em.via_offset_y = 5*mil openems.Dielectric(em, 'sub', eps_r=eps_r).set_tanD(0.0035, freq=fc) foil_thickness = 0.035 * mm substrate_thickness = 22 * mil ms_air_above = 2.0 * mm via = 0.3 * mm via_pad = 0.6 * mm # dimensions Z substrate_bottom = 0.0 substrate_top = substrate_bottom + substrate_thickness foil_top = substrate_top + foil_thickness em.mesh.add_z(foil_top + ms_air_above) from math import sqrt
#!/usr/bin/env python3 import sys from scipy.constants import pi, c, epsilon_0, mu_0, mil, inch mm = 0.001 import openems import openems.idbpf_tapped import numpy as np idx = int(sys.argv[1]) name = 'idbpf_{}'.format(idx) fmax = [0, 0, 0, 8e9, 8e9, 10e9, 12e9][idx] em = openems.OpenEMS(name, fmin=0, fmax=fmax, fsteps=400, EndCriteria=1e-5) fc = [0, 0, 0, 3e9, 4e9, 5e9, 6e9][idx] pec = openems.Metal(em, 'pec') sub = openems.Dielectric(em, 'sub', eps_r=3.3, tand=0.012, fc=fc) foil_thickness = 0.04 * mm substrate_thickness = 0.18 * mm ms_air_above = 1.0 * mm via = 0.4 * mm via_pad = 0.8 * mm # dimensions Z substrate_bottom = 0.0 substrate_top = substrate_bottom + substrate_thickness foil_top = substrate_top + foil_thickness em.mesh.AddLine('z', foil_top + ms_air_above) em.resolution = [0.1 * mm, 0.04 * mm, 0.5 * mm] rl = [0, 0, 0, 14.4 * mm, 10.8 * mm, 8.5 * mm, 7.1 * mm][idx]
#!/usr/bin/env python3 import sys from scipy.constants import pi, c, epsilon_0, mu_0, mil mm = 0.001 import openems import numpy as np em = openems.OpenEMS('line', EndCriteria = 1e-6) em.fmin = 1e6 em.fmax = 40e9 em.fsteps = 1601 fc = 40e9 pec = openems.Metal(em, 'pec') sub = openems.Dielectric(em, 'fr4', eps_r=3.9, tand=0.0035, fc=fc) foil_thickness = 0.6*mil substrate_thickness = 0.2*mm ms_air_above = 0.36*mm port_length = 0.1*mm box_length = 10*mm box_width = 1*mm ms_width = 0.2*mm # dimensions Z substrate_bottom = 0.0 substrate_top = substrate_bottom + substrate_thickness foil_top = substrate_top + foil_thickness from math import sqrt em.resolution = c/(em.fmax*sqrt(3.0))/100.0 # substrate start = np.array([0.5*box_length, 0.5*box_width, substrate_bottom])