PROGRAM Series_RLC_Circuit

   LIBRARY "CMPLXLIB*"
   SET MODE "LACEHIGH4"
   DECLARE FUNCTION RLC$, CABS, COUT$

   LET R  = 50         ! Ohms
   LET C  = 1E-6       ! Farads
   LET L  = 2E-3       ! Henrys
   LET F1 = 100        ! Hertz
   LET F2 = 100000     ! Hertz
   LET ZMIN = 0        ! Ohms
   LET ZMAX = 1000     ! Ohms

   CALL Construct_Log_Chart(F1, F2, ZMIN, ZMAX)
   
   !
   ! Calculate and present impedance plot
   !
   SET COLOR "RED"
   LET Freq = F1
   DO
      PLOT log10(Freq),CABS(RLC$(R,L,C,Freq));
      LET Freq = Freq * 1.1
   
   LOOP until Freq > F2
   

END



SUB Construct_Log_Chart(Low_Freq, High_Freq, Low_Linear, High_Linear)

    ! Simple error checking
    !
    IF Low_Freq < 0 OR High_Freq <= Low_Freq THEN EXIT SUB

    ! Scaling the screen
    !
    LET xmin = LOG10(Low_Freq)
    LET xmax = LOG10(High_Freq)
    LET ymin = Low_Linear
    LET ymax = High_Linear
    LET Delta_Linear = (High_Linear-Low_Linear)/10
    LET MaxCycle = int(LOG10(High_Freq)-LOG10(Low_Freq))
    SET WINDOW xmin, xmax, ymin, ymax

    ! Drawing horizontal lines
    !
    FOR y = ymin TO ymax STEP Delta_Linear
        PLOT xmin,y; xmax,y
    NEXT y

    ! Drawing vertical lines
    !
    FOR freq = Low_Freq TO 10*Low_Freq step Low_Freq
        FOR Cycle = 0 to MaxCycle
            LET x = LOG10(10^Cycle * freq)
            PLOT x,ymin; x,ymax
        NEXT Cycle
    NEXT freq

END SUB



FUNCTION RLC$(R, L, C, F)

   LIBRARY "CMPLXLIB*"
   DECLARE FUNCTION COMP$

   LET OMEGA = 2*PI*F

   ! Return impedance as a complex number
   !
   IF F = 0 OR C = 0 THEN
      LET RLC$ = COMP$(R,-1E9)
   ELSE
      LET RLC$ = COMP$(R, OMEGA*L - 1/(OMEGA*C))
   END IF

END FUNCTION

