Program SpirlInd;  {  Program to Calculate Inductance of Spirals   }


var      No_turns            : integer; { Number of Turns in Spiral Inductor }
         Ro                  : real;    { Beginning Inside Radius            }
         Cond_Wid            : real;    { Width of Conductor of Inductor     }
         Spac_Wid            : real;    { Space-Width of Inductor            }
         Sum,Sum1            : real;
         a,b,k1,k2,k3        : real;    { Arbitrary Variables for Calculations}
         i,j,k               : integer; { Looping Parameters                 }
         Mt                  : real;    { Mutual Inductance for n Loops      }
         c                   : real;    { Distance Variable Used in Ext Ind C}
         LSI                 : real;    { External Self Inductance           }
         aR,bR               : real;    { Distance Variables in Ground Plane }
         Sub_thick           : real;    { Substrate Thickness                }
         Mr                  : real;    { Negative Mutual Inductance Due to  }
                                        { Presence of Ground Plane           }
         L_tot               : real;    { Total Inductance of Spiral Inductor}
         Uo                  : real;
         w1                  : real;

Function Elp1(X: real): real;  { Complete Elliptic Integral of First Kind  }

var      a0,a1,a2,a3,a4      : real;
         b0,b1,b2,b3,b4      : real;
         x1,x2,x3,x4         : real;
         ab,ac               : real;

begin
         X:=  1 - X;
         a0:= 1.38629436112;   a1:= 0.09666344259;   a2:= 0.03590092383;
         a3:= 0.03742563713; a4:= 0.01451196212;
         b0:= 0.5;   b1:= 0.12498593597;   b2:= 0.06880248576;  b3:= 0.03328355346;
         b4:= 0.00441787012;
         x1:= X;
         x2:= X*x1;
         x3:= X*x2;
         x4:= X*x3;
         ab:= a0 + a1 * x1 + a2 * x2 + a3 * x3 + a4 * x4;
         ac:= (b0+b1*x1+b2*x2+b3*x3+b4*x4)*Ln(1/x1);
         ab:= ab + ac;
         Elp1:= ab;
end;

Function Elp2(X: real): real;  { Complete Elliptic Integral of Second Kind  }

var      a1,a2,a3,a4         : real;
         b1,b2,b3,b4         : real;
         x1,x2,x3,x4         : real;

begin
    X:=  1 - X;
    a1:= 0.44325141463;   a2:= 0.0626060122;   a3:= 0.04757383546;
    a4:= 0.01736506451;
    b1:= 0.2499836831;    b2:= 0.09200180037;  b3:= 0.04069697526;
    b4:= 0.00526449639;
    x1:= X;
    x2:= X*x1;
    x3:= X*x2;
    x4:= X*x3;
    Elp2:=1.0+a1*x1+a2*x2+a3*x3+a4*x4 + (b1*x1+b2*x2+b3*x3+b4*x4)*Ln(1/x1);
end;
begin
clrscr;
writeln;
writeln('                         Enter All Dimensions in Mils ');
writeln;
write('           Enter Number of Spirals ');
readln(No_turns);
write('           Enter Beginning Inside Radius of Spiral,  Conductor Width ');
readln(Ro,Cond_Wid);
write('           Enter The Space Width Between Turns,  Substrate Thickness ');
readln(Spac_Wid,Sub_thick);
Ro:= Ro*0.0254/1000.0;
Cond_Wid:= Cond_Wid*0.0254/1000.0;
Spac_Wid:= Spac_Wid*0.0254/1000.0;
Sub_thick:= Sub_thick*0.0254/1000.0;
Uo:= 4*Pi*1.E-7;
Sum1:= 0.0;            {  Calculation of Mutual Inductance for n Loops  }
for k:= 1 to No_turns-1  do
    begin
    Sum:= 0.0;
    a:= Ro + (k-0.5)*(Cond_Wid + Spac_Wid);
    for j:= k+1 to No_turns do
         begin
         b:= Ro + (j-0.5)*(Cond_Wid + Spac_Wid);
         k1:= sqrt(4*a*b)/(a+b);
         Sum:= Sum + Uo*sqrt(a*b)*((2/k1-1)*Elp1(k1) - 2/k1*Elp2(k1));
         end;
    Sum1:= Sum1 + Sum;
    end;
Mt:= 2*Sum1;
writeln;
writeln('               Mutual Inductance = ',Mt);
writeln;
                          { Calculation of External Self Inductance       }
w1:= Cond_Wid/2;
Sum:= 0.0;
for k:= 1 to No_turns do
    begin
    c:= Ro + (k-0.5)*(Cond_Wid + SPac_Wid);
    k2:= sqrt(4*c*(c-w1))/(2*c-w1);
    Sum:= Sum + Uo*(2*c-w1)*((1-k2*k2/2)*Elp1(k2) - Elp2(k2));
    end;
LSI:= Sum;
writeln('               External Self-Inductance = ',LSI);
writeln;
                          {  Calculation of Ground Plane Effect           }
Sum1:= 0.0;
for i:= 1 to No_turns do
    begin
    Sum:= 0.0;
    aR:= Ro + (i-0.5)*(Cond_Wid + Spac_Wid);
    for j:= 1 to No_turns do
         begin
         bR:= Ro + (j-0.5)*(Cond_WId + Spac_Wid);
         k3:= sqrt(4*aR*bR/(sqr(2*Sub_thick) + sqr(aR + bR)));
         Sum:= Sum + Uo*sqrt(aR*bR)*((2/k3-1)*Elp1(k3) - 2/k3*Elp2(k3));
         end;
    Sum1:= Sum1 + Sum;
    end;
Mr:= Sum1;
writeln('               Ground Plane Effect  = -',Mr);
writeln;
writeln;
writeln('                    Spiral Inductor Calculation Results ');
writeln;
writeln;
writeln;
writeln('            Spiral Inductor w/Ground Plane =   ',Mt+LSI-Mr);
end.
