;; (bib ;; (author "Morris, C" "Lecar, H") ;; (title "Voltage oscillations in the barnacle giant muscle fiber") ;; (journal "Biophys J") ;; (year "1981") ;; (volume "35") ;; (pages "193-213") ;; (bibtype "article")) (use signal-diagram signal-diagram-dynamics mathh) (define (Morris-Lecar81:construct gl gk gca vl vk vca v1 v2 v3 v4 phi c Isyn) `((f . ,(DAE h t (minf (v) (* 0.5 (+ 1 (tanh (/ (- v v1) v2))))) (winf (v) (* 0.5 (+ 1 (tanh (/ (- v v3) v4))))) (lamw (v) (* phi (cosh (/ (- v v3) (* 2 v4))))) (ica (v) (* gca (* (minf v) (- vca v)))) (ik (v) (* gk (* w (- vk v )))) (v (/ (+ Isyn (* gl (- vl v)) (ica v) (ik v)) c)) (w (* (lamw v) (- (winf v) w))))) (initial . ((t 0.0) (h 1e-3) (v -60.899) (w 0.0149) (Isyn ,Isyn) (vk ,vk) (vl ,vl) (vca ,vca) (gk ,gk) (gl ,gl) (gca ,gca) (c ,c) (v1 ,v1) (v2 ,v2) (v3 ,v3) (v4 ,v4) (phi ,phi)))) ) (define (dataflow model) (let* ((f (alist-ref 'f model)) (initial (alist-ref 'initial model)) (input (map car initial))) (print "input = " input) (print "dataflow f: " (dataflow (construct f) input)) )) (define (codegen name model #!key (language 'scheme) (solver 'rk3)) (let* ((f (alist-ref 'f model)) (initial (alist-ref 'initial model)) (input (map car initial))) (let ((codegen (case language ((octave Octave) codegen/Octave) ((scheme Scheme) codegen/scheme) ((ML) codegen/ML)))) (codegen name (construct f) initial: initial solver: solver )) )) ;; gl gk gca vl vk vca v1 v2 v3 v4 phi c Isyn (define Morris-Lecar81 (Morris-Lecar81:construct 2.0 8.0 4.0 -50.0 -70.0 100.0 -1.0 15.0 10.0 14.5 0.0667 20.0 50.0)) (with-output-to-file "Morris-Lecar81_solver.m" (lambda () (codegen 'Morris_Lecar81 Morris-Lecar81 language: 'octave solver: #f))) (with-output-to-file "Morris-Lecar81_solver.scm" (lambda () (codegen 'Morris_Lecar81 Morris-Lecar81 language: 'scheme))) (with-output-to-file "Morris-Lecar81_solver.sml" (lambda () (codegen 'Morris-Lecar81 Morris-Lecar81 language: 'ML)))