1 ;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10; Package: rlc -*-
2 ;;;; *************************************************************************
3 ;;;; FILE IDENTIFICATION
6 ;;;; Purpose: RLC Functions
7 ;;;; Programmer: Kevin M. Rosenberg
8 ;;;; Date Started: Jan 2003
10 ;;;; $Id: kboot.lisp 8414 2003-12-28 19:46:57Z kevin $
11 ;;;; *************************************************************************
15 (defun plot-series-rlc-current (v r l c t-inc t-end &optional (t-start 0)
16 (graph-function 'run-xgraph))
17 (let ((path (make-pathname
18 :directory '(:absolute "tmp")
20 (concatenate 'string "rlc-data-"
21 (write-to-string (get-universal-time)))
23 (write-series-rlc-current-graph path v r l c t-inc t-end t-start)
24 (funcall graph-function path)
28 (defun run-xgraph (path)
29 (kl::run-shell-command "xgraph ~A" (namestring path)))
31 (defun write-series-rlc-current-graph (path v r l c t-inc t-end
32 &optional (t-start 0))
33 (with-open-file (out path :direction :output :if-exists :supersede
34 :if-does-not-exist :create)
35 (write-series-rlc-current-graph-stream out v r l c t-inc t-end t-start)))
37 (defun write-series-rlc-current-graph-stream (out v r l c t-inc t-end
38 &optional (t-start 0))
39 (multiple-value-bind (x y)
40 (series-rlc-current-graph-data v r l c t-inc t-end t-start)
41 (dotimes (i (length x))
42 (format out "~D ~D~%" (aref x i) (aref y i)))))
44 (defun series-rlc-current-graph-data (v r l c t-inc t-end &optional (t-start 0))
45 (let* ((formula-list (series-rlc-current-formula v r l c))
46 (formula-eval (eval formula-list))
47 (formula (compile nil formula-eval))
48 (n (ceiling (- t-end t-start) t-inc)))
50 (tm t-start (+ tm t-inc))
51 (x-pts (make-array n))
52 (y-pts (make-array n)))
55 (setf (aref x-pts i) tm)
56 (setf (aref y-pts i) (funcall formula tm)))))
58 (defun series-rlc-current-time (v r l c tm)
59 (let* ((formula-list (series-rlc-current-formula v r l c))
60 (formula (eval formula-list)))
61 (funcall formula tm)))
63 (defun circuit-type (r l c)
65 ((and (zerop r) (zerop l) (zerop c))
67 ((and (/= 0 r) (zerop l) (zerop c))
69 ((and (zerop r) (/= 0 l) (zerop c))
71 ((and (zerop r) (zerop l) (/= 0 c))
73 ((and (/= 0 r) (/= 0 l) (zerop c))
75 ((and (/= 0 r) (zerop l) (/= 0 c))
77 ((and (zerop r) (/= 0 l) (/= 0 c))
82 (defun series-rlc-current-formula (v r l c)
83 "Returns formula for currrent through a series RLC circuit with a step-voltage applied at time 0."
84 (ecase (circuit-type r l c)
86 `(lambda (tm) (declare (ignore tm)) ,v))
88 `(lambda (tm) (declare (ignore tm)) ,(/ v r)))
99 (* ,(/ v r) (- 1 (exp (- (* tm ,(/ r l))))))))
101 `(lambda (tm) (* ,(/ v r) (exp (- (* tm ,(/ 1 r c)))))))
103 (let ((lc-root (sqrt (* l c))))
105 (* ,(/ (* v lc-root) l) (sin (* tm ,(/ 1 lc-root)))))))
107 (let* ((r/2l (when (/= 0 l) (/ r (+ l l))))
108 (rr/4ll (when r/2l (* r/2l r/2l)))
109 (v/l (when (/= 0 l) (/ v l)))
110 (1/lc (when (and (/= 0 l) (/= 0 c)) (/ 1 (* l c)))))
115 (let* ((root (sqrt (- rr/4ll 1/lc)))
116 (p1 (+ (- r/2l) root))
117 (p2 (- (- r/2l) root)))
119 (* ,(/ v/l (- p1 p2))
120 (- (exp (* ,p1 tm)) (exp (* ,p2 tm)))))))
121 ;; RLC critcally-damped
126 (exp (- (* tm ,r/2l))))))
129 (let ((diff (- 1/lc rr/4ll)))
131 (* ,(/ v/l (sqrt diff))
132 (exp (- (* tm ,r/2l)))
133 (sin (* tm ,(sqrt diff))))))))))))