Changeset 11857 in project


Ignore:
Timestamp:
09/02/08 03:05:56 (13 years ago)
Author:
Ivan Raikov
Message:

Initial support for interpolation tables in the NMODL backend.

Location:
release/3/nemo/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • release/3/nemo/trunk/examples/AKP06/PotIhCa.scm

    r11849 r11857  
    264264
    265265
    266        #|
    267 
    268 
    269        (component (type decaying-pool-model) ;; Ca buffer
    270 
    271          (const r = (/ diam 2))
    272          (const thickness = 1000)
    273          (const shell_inner_r = (/ (- diam (* 2 thickness)) 2))
    274          (const volume = (- (* r r r (/ 3.14159 6) (* shell_inner_r shell_inner_r shell_inner_r (/ 3.14159 6)))))
    275          (const surf_area = (* r r 3.14159))
    276 
    277          (const tau = 1)
    278          (const rest_conc = 1e-4)
    279 
    280          (drive_channel = (let ((x (neg (* ica 10000.0 (/ surf_area (* 2 F volume))))))
    281                             (if (<= x 0) 0 x)))
    282 
    283          ;cai' = (- drive_channel (/ (- cai rest_conc) tau) )
    284 
    285          (state-complex (cai (transitions (-> CaB CaPlusB  drive_channel)
    286                                           (-> CaPlusB CaB  (/ rest_conc tau)))
    287                              (initial    rest_conc)
    288                              (open CaB)  (power 1)))
    289          
    290 
    291          (output cai)
    292          )
    293 
    294        
    295 |#
    296 
    297266
    298267       )
     
    306275                    (print "component " x " subcomponents: " ((nemo 'component-subcomps) PotIhCa-1 (second x))))
    307276                  ((nemo 'components) PotIhCa-1))
    308         (nemo:nmodl-translator PotIhCa-1)
     277        (nemo:nmodl-translator PotIhCa-1 'cnexp #t -150 150 1)
    309278       
    310279        ))
  • release/3/nemo/trunk/nmodl.scm

    r11850 r11857  
    309309 
    310310
    311 (define (define-fn indent n proc)
    312   (let ((lst (procedure-data proc))
    313         (indent+ (+ 2 indent)))
    314     (let ((rt       (lookup-def 'rt lst))
    315           (formals  (lookup-def 'formals lst))
    316           (vars     (lookup-def 'vars lst))
    317           (body     (lookup-def 'body lst)))
    318       (pp indent ,nl (FUNCTION ,n (,(sl\ ", " vars)) "{" ))
    319       (let* ((body1 (canonicalize-expr/NMODL (rhsexpr body)))
    320              (lbs   (enumbnds body1 (list))))
    321         (if (not (null? lbs)) (pp indent+ (LOCAL ,(sl\ ", " lbs))))
    322         (pp indent+ ,(expr->string/NMODL body1 n)))
    323       (pp indent "}")))  )
    324 
     311(define (make-define-fn table? min-v max-v with depend)
     312  (lambda (indent n proc)
     313    (let ((lst (procedure-data proc))
     314          (indent+ (+ 2 indent)))
     315      (let ((rt       (lookup-def 'rt lst))
     316            (formals  (lookup-def 'formals lst))
     317            (vars     (lookup-def 'vars lst))
     318            (body     (lookup-def 'body lst)))
     319        (pp indent ,nl (FUNCTION ,n (,(sl\ ", " vars)) "{" ))
     320        (let* ((body1 (canonicalize-expr/NMODL (rhsexpr body)))
     321               (lbs   (enumbnds body1 (list))))
     322          (if (not (null? lbs)) (pp indent+ (LOCAL ,(sl\ ", " lbs))))
     323          (if (and table? min-v max-v with)
     324              (match vars
     325                     (('v)  (pp indent+ (TABLE ,@(if depend `(DEPEND ,depend) `(""))
     326                                               FROM ,min-v TO ,max-v WITH ,with)))
     327                     (else  (void))))
     328          (pp indent+ ,(expr->string/NMODL body1 n)))
     329        (pp indent "}"))) 
     330    ))
    325331
    326332(define (define-state indent n)
     
    484490
    485491(define (nemo:nmodl-translator sys . rest)
    486   (let-optionals? rest ((method 'cnexp) (table? #f) (max-v -100) (min-v 100) (step 0.5))
     492  (let-optionals rest ((method 'cnexp) (table? #f) (min-v -100) (max-v 100) (step 0.5) (depend #f) )
    487493  (match-let ((($ nemo:quantity 'DISPATCH  dis) (environment-ref sys (nemo-intern 'dispatch))))
    488494    (let ((imports  ((dis 'imports)  sys))
     
    497503             (states  ((dis 'states) sys))
    498504             (stcomps ((dis 'stcomps) sys))
     505             (defuns  ((dis 'defuns) sys))
    499506             (components ((dis 'components) sys))
    500507             (ionchs  (filter-map (match-lambda (('ion-channel name) name) (else #f)) components)))
     
    502509        (match-let (((state-list asgn-list g) deps*))
    503510         (let* ((poset          (vector->list ((dis 'depgraph->bfs-dist-poset) g)))
    504                 (asgn-eq-defs   (poset->asgn-eq-defs poset sys)) 
     511                (asgn-eq-defs   (poset->asgn-eq-defs poset sys))
    505512                (perm-ions (delete-duplicates
    506513                            (fold (lambda (n ax)
     
    578585               (pp indent "}")
    579586
    580                (for-each (lambda (fndef)
    581                            (if (not (member (car fndef) builtin-fns))
    582                                (apply define-fn (cons indent fndef))))
    583                          ((dis 'defuns) sys))
     587               (let* ((with      (inexact->exact (round (/ (abs (- max-v min-v)) step))))
     588                      (define-fn (make-define-fn table? min-v max-v with depend)))
     589                 (for-each (lambda (fndef)
     590                             (if (not (member (car fndef) builtin-fns))
     591                                 (apply define-fn (cons indent fndef))))
     592                           defuns))
     593
    584594
    585595               (pp indent ,nl (STATE "{"))
     
    595605                                      (map second acc-ions) (map fourth acc-ions)))
    596606                      (asgns1 (delete-duplicates asgns0)))
    597                  (for-each (lambda (x) (pp indent+ ,x)) asgns1))
     607                 (for-each (lambda (x) (pp indent+ ,x)) asgns1)
    598608               (pp indent "}")
    599609
     
    602612                     (pp indent ,nl (PROCEDURE rates () "{"))
    603613                     (let ((locals    (find-locals asgn-eq-defs)))
    604                        (if (not (null? locals)) (pp indent+ (LOCAL ,(sl\ ", " locals))))
    605                        (for-each (lambda (def)
    606                              (let ((n (first def)) (b (second def)))
    607                                (pp indent+ ,(expr->string/NMODL b n)))) asgn-eq-defs))
    608 
     614                       (if (not (null? locals)) (pp indent+ (LOCAL ,(sl\ ", " locals)))))
     615                     (for-each (lambda (def)
     616                                 (let ((n (first def))
     617                                       (b (second def)))
     618                                   (pp indent+ ,(expr->string/NMODL b n)))) asgn-eq-defs)
    609619                     (pp indent "}")))
    610620
     
    706716
    707717               )))
    708          ))))))
     718         )))))))
Note: See TracChangeset for help on using the changeset viewer.