Stripline velocity goes as 1/rootK, but microstrip is part epoxy, part air, so
it's more complex.
True.
Try this, adapted from a Philips (Mullard) research publication of the 1970s.
Ported by me from FortranIV to Fortran77. Dimensions changed from cm to mm.
Stated to run in 2-3 seconds, on an IBM360, runs like lightning on a PC ;-)
I'd be interested to see how it compares with what you use.
Any old F77 compiler will compile it.
* Program for computing the dimensions
* of microstrip couplers using Schwartzmann's
* formulae
*
100 format(20X,'Give data in the following order:'//
+' Relative dielectric constant'/
+' thickness of dielectric in mms'/
+' Thickness of copper layer in mms'/' coupling in - dB'/
+' Center frequency of operation in Hz'/
+' Coupler impedance in ohms'///)
200 format(///' Relative dielectric constant = ',F6.3/
+' Thickness of dielectric = ',F8.5,' mm'/
+' Thickness of copper layer = ',F8.5,' mm'/
+' Coupling coefficient = ',F8.5,' or',F8.3,' dB'/
+' Frequency of operation = ',E10.3,' Hz'/
+' Coupler impedance = ',F8.3,' ohms'///)
300 format(20X,'Number of allowed iterations exceeded'//)
400 format(35X,'Results :'//' Width of lines = ',F8.3, 'mm'/
+' Spacing between lines = ',F8.3,' mm'/
+' Length of coupling region = ',F8.3,' mm (odd mode)'/
+' Even mode impedance = ',F8.3,' ohms'/
+' Odd mode impedance = ',F8.3,' ohms'/)
500 format(1H ,'Width of',F8.3,' ohm connecting line = ',
+F8.5,' mm'/)
write(*,100)
read(*,*)er,h,t,db,freq,z0
x=db/20.0
couple=10.0**x
write(*,200)er,h,t,couple,db,freq,z0
b=376.6/sqrt(er)
d=1.0/(3.0*sqrt(er))
f=1.35/alog(4.0*h/t)
zoe=z0*sqrt(1.0+couple)/sqrt(1.0-couple)
zoo=z0*sqrt(1.0-couple)/sqrt(1.0+couple)
k=1
w=0.0
m=0
step=0.01
8 if(k.gt.1000)go to 1
go to 2
1 write(*,300)
go to 3
2 w=w+step
a=w/h
g=(a+1.0)*(a+1.0)
aa=d*(a-(1.0/g))
bb=d/g
cc=a+aa+0.5*d*a-bb+1.5*f
dd=0.5*d*a+0.5*f
x=((b/zoe)-cc)/dd
y=1.0/x
xx=4.0*(y-1.0)
s=w/xx
if(s)13,13,14
13 teszoo=1.0e10
go to 15
14 zcppu=2.0*aa
m=m+1
zcppud=4.0*d/((s/w)+1.0)
zcdf=1.35/alog(4.0*s/(3.141592*t))
teszoo=b/(a+zcppu+f+zcppud+zcdf)
if(m.eq.1)step=step/10.0
15 check=(teszoo-zoo)/zoo
chabs=abs(check)
if(chabs.le.0.01)go to 4
if(check)5,4,7
if(m.eq.1)step=step*10.0
5 w=w-step
step=step/10.0
k=k+1
go to 8
7 k=k+1
go to 8
4 const=er/(2.998e8*376.6)
cppu=2.0*const*aa
cdppu=8.0*d*const/((s/w)+1.0)
cpp=const*w/h
cf=const*2.7/alog(4.0*h/t)
cdf=const*2.7/alog(4.0*s/(3.141592*t))
coo=cpp+cppu+0.5*cf+0.5*cdppu+0.5*cdf
aloo=1.0/(1.0+((cppu+cdppu)*(1.0-(1.0/sqrt(er)))/(2.0*coo)))
akoo=1.00/sqrt(1.0+aloo*aloo*(er-1.0))
cleng=0.25*2.998e11*akoo/freq
write(*,400)w,s,cleng,zoe,zoo
l=1
w0=0.0
stepj=0.1
9 if (l.gt.1000)go to 1
w0=w0+stepj
a0=w0/h
g0=(a0+1.0)*(a0+1.0)
aa0=d*(a0-(1.0/g0))
tz0=b/(a0+2.0*aa0+2.0*f)
che=(tz0-z0)/z0
cheab=abs(che)
if(cheab.le.0.01)go to10
if(cheab)11,10,12
11 w0=w0-stepj
stepj=stepj/10.0
l=l+1
go to 9
12 l=l+1
go to 9
10 write(*,500)z0,w0
3 stop
end