Changeset 29286 in project


Ignore:
Timestamp:
06/30/13 11:34:03 (8 years ago)
Author:
Ivan Raikov
Message:

nemo: adding unit information to Golgi model example

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

Legend:

Unmodified
Added
Removed
  • release/4/nemo/trunk/examples/Golgi/Golgi_DeSouza10.nemo

    r29256 r29286  
    2323   
    2424   (component (type defaults)
    25       (const V_t = -35)
    26       (const celsius = 23)
    27       (const Ra = 0.01)
     25      (const V_t     = -35 (unit mV))
     26      (const celsius = 23 (unit degC))
     27      (const Ra      = 0.01)
    2828      (output celsius V_t Ra)
    2929      )
    3030
    3131   (component (type membrane-capacitance)
    32          (const c = 1)
     32         (const c = 1 (unit uf/cm2))
    3333         (output c  ))
    3434
    3535
    3636   (component (type geometry) (name soma)
    37          (const L = 27)
    38          (const diam = 27)
     37         (const L = 27    (unit um))
     38         (const diam = 27 (unit um))
    3939         (output L diam ))
    4040
     
    4444        (input (w from event))
    4545
    46         (const tauA = 0.03) ;; rise time
    47         (const tauB = 0.5) ;; decay time
    48 
    49         (const  e = 0)
    50 
    51         (const tau1 = (if ((tauA / tauB) > .9999) then (0.9999 * tauB) else tauA))
    52         (const tau2 = tauB)
     46        (const tauA = 0.03 (unit ms)) ;; rise time
     47        (const tauB = 0.5  (unit ms)) ;; decay time
     48
     49        (const  e = 0 (unit mV))
     50
     51        (const tau1 = (if ((tauA / tauB) > .9999) then (0.9999 * tauB) else tauA) (unit ms))
     52        (const tau2 = tauB (unit ms))
    5353
    5454        (const tp = ((tau1 * tau2) / (tau2 - tau1) * ln (tau2 / tau1)))
    5555        (const scale_factor  = (1 / (neg (exp(neg (tp) / tau1)) + exp (neg (tp) / tau2))))
    5656
    57         (transient (A) = (neg (A) / tau1) (onevent (A + (w * scale_factor))) (initial 0))
    58         (transient (B) = (neg (B) / tau2) (onevent (B + (w * scale_factor))) (initial 0))
    59 
    60         (g =  (B - A))
     57        (transient (A) = (neg (A) / tau1) (onevent (A + (w * scale_factor))) (initial 0) (unit uS))
     58        (transient (B) = (neg (B) / tau2) (onevent (B + (w * scale_factor))) (initial 0) (unit uS))
     59
     60        (g =  (B - A) (unit uS))
    6161
    6262        (output g e scale_factor)
     
    6868      (input (ica from ion-currents))
    6969
    70       (const  d       = .2)
    71       (const  cao     = 2.)
    72       (const  cai0    = 5e-5)
    73       (const  beta    = 1.3)
     70      (const  d       = 0.2  (unit um))
     71      (const  cao     = 2.0  (unit mM))
     72      (const  cai0    = 5e-5 (unit mM))
     73      (const  beta    = 1.3  (unit /ms))
    7474     
    7575      (d (ca) =  ((neg (ica) / (2 * F * d)) * 1e4 -
     
    8686
    8787      (const valence  = 2)
    88       (const  d       = .2)
    89       (const  ca2o    = 2.)
    90       (const  ca2i0   = 5e-5)
    91       (const  beta    = 1.3)
     88      (const  d       = 0.2  (unit um))
     89      (const  ca2o    = 2.0  (unit mM))
     90      (const  ca2i0   = 5e-5 (unit mM))
     91      (const  beta    = 1.3  (unit /ms))
    9292     
    9393      (d (ca2) =  ((neg (ica2) / (2 * F * d)) * 1e4 -
    9494                   (beta * (ca2 - ca2i0)))
    95          (initial ca2i0))
     95         (initial ca2i0) (unit mM))
    9696     
    9797      (output ca2 ca2o valence)
     
    103103      (input (ina from ion-currents))
    104104
    105       (const  d       = .2)
    106       (const  nao0    = 140.)
    107       (const  nai0    = 5.)
    108       (const  beta    = 0.075)
     105      (const  d       = 0.2   (unit um))
     106      (const  nao0    = 140.0 (unit mM))
     107      (const  nai0    = 5.0   (unit mM))
     108      (const  beta    = 0.075 (unit /ms))
    109109     
    110110      (d (nai) =  ((neg (ina) / (2 * F * d)) * 1e4 - (beta * (nai - nai0)))
    111          (initial nai0))
     111         (initial nai0) (unit mM))
    112112     
    113113      (d (nao) =  ((ina / (2 * F * d)) * 1e4 - (beta * (nao - nao0)))
    114          (initial nao0))
     114         (initial nao0) (unit mM))
    115115     
    116116      (output nai nao)
     
    122122      (input (ik from ion-currents))
    123123
    124       (const  d       = .2)
    125       (const  ko0     = 5.)
    126       (const  ki0     = 140.)
    127       (const  beta    = 0.075)
     124      (const  d       = 0.2   (unit um))
     125      (const  ko0     = 5.0   (unit mM))
     126      (const  ki0     = 140.0 (unit mM))
     127      (const  beta    = 0.075 (unit /ms))
    128128     
    129129      (d (ki) =  ((neg (ik) / (2 * F * d)) * 1e4 - (beta * (ki - ki0)))
    130          (initial ki0))
     130         (initial ki0) (unit mM))
    131131     
    132132      (d (ko) =  ((ik / (2 * F * d)) * 1e4 - (beta * (ko - ko0)))
    133          (initial ko0))
     133         (initial ko0) (unit mM))
    134134     
    135135      (output ki ko)
     
    149149                 (Q10 = (pow (3 ((celsius - 20) / 10))))
    150150                 
    151                  (const Aalpha_s  = 0.04944)
    152                  (const Kalpha_s  =  15.87301587302)
    153                  (const V0alpha_s = -29.06)
     151                 (const Aalpha_s  = 0.04944 (unit /ms))
     152                 (const Kalpha_s  = 15.87301587302 (unit mV))
     153                 (const V0alpha_s = -29.06 (unit mV))
    154154                 
    155                  (const Abeta_s  = 0.08298)
    156                  (const Kbeta_s  =  -25.641)
    157                  (const V0beta_s = -18.66)
     155                 (const Abeta_s  = 0.08298 (unit /ms))
     156                 (const Kbeta_s  = -25.641 (unit mV))
     157                 (const V0beta_s = -18.66  (unit mV))
    158158                 
    159                  (const Aalpha_u  = 0.0013)
    160                  (const Kalpha_u  =  -18.183)
    161                  (const V0alpha_u = -48)
     159                 (const Aalpha_u  = 0.0013  (unit /ms))
     160                 (const Kalpha_u  = -18.183 (unit mV))
     161                 (const V0alpha_u = -48     (unit mV))
    162162                 
    163                  (const Abeta_u = 0.0013)
    164                  (const Kbeta_u = 83.33)
    165                  (const V0beta_u = -48)
     163                 (const Abeta_u   = 0.0013  (unit /ms))
     164                 (const Kbeta_u   = 83.33   (unit mV))
     165                 (const V0beta_u  = -48     (unit mV))
    166166                 
    167167                 ;; rate functions
    168168                 
    169169                 (defun alpha_s (v Q10)
    170                    (Q10 * Aalpha_s * exp((v - V0alpha_s) / Kalpha_s)))
     170                   (Q10 * Aalpha_s * exp ((v - V0alpha_s) / Kalpha_s)))
    171171                 
    172172                 (defun beta_s (v Q10)
    173                    (Q10 * Abeta_s * exp((v - V0beta_s) / Kbeta_s)))
     173                   (Q10 * Abeta_s * exp ((v - V0beta_s) / Kbeta_s)))
    174174                 
    175175                 (defun alpha_u (v Q10)
    176                    (Q10 * Aalpha_u * exp((v - V0alpha_u) / Kalpha_u)))
     176                   (Q10 * Aalpha_u * exp ((v - V0alpha_u) / Kalpha_u)))
    177177                 
    178178                 (defun beta_u (v Q10)
    179                    (Q10 * Abeta_u * exp((v - V0beta_u) / Kbeta_u)))
    180 
    181                  (s_inf = ((alpha_s (v Q10))/(alpha_s (v Q10) + beta_s (v Q10))))
    182                  (tau_s = (1 / (alpha_s (v Q10) + beta_s (v Q10)) ))
    183 
    184                  (u_inf = ((alpha_u (v Q10))/(alpha_u (v Q10) + beta_u (v Q10)) ))
    185                  (tau_u = (1 / (alpha_u (v Q10) + beta_u (v Q10)) ))
     179                   (Q10 * Abeta_u * exp ((v - V0beta_u) / Kbeta_u)))
     180
     181                 (s_inf = ((alpha_s (v Q10)) / (alpha_s (v Q10) + beta_s (v Q10))))
     182                 (tau_s = (1 / (alpha_s (v Q10) + beta_s (v Q10)) ) (unit ms))
     183
     184                 (u_inf = ((alpha_u (v Q10)) / (alpha_u (v Q10) + beta_u (v Q10)) ))
     185                 (tau_u = (1 / (alpha_u (v Q10) + beta_u (v Q10)) ) (unit ms))
    186186
    187187                 (hh-ionic-gate
     
    200200             
    201201              (component (type pore)
    202                          (const  gbar  = 460e-6)
     202                         (const  gbar  = 460e-6 (unit S/cm2))
    203203                         (output gbar ))
    204204             
    205205              (component (type permeating-ion) (name ca)
    206                          (e = (nernst (celsius cai cao 2)))
     206                         (e = (nernst (celsius cai cao 2)) (unit mV))
    207207                         (output e)
    208208                         )
     
    237237      (component (type gate)
    238238
    239                  (const shift   = 2) ; screening charge for Ca_o = 2 mM
     239                 (const shift   = 2 (unit mV)) ; screening charge for Ca_o = 2 mM
    240240                 
    241                  (const v0_m_inf = -50)
    242                  (const v0_h_inf = -78)
    243                  (const k_m_inf  = -7.4)
    244                  (const k_h_inf  = 5.0)
     241                 (const v0_m_inf = -50  (unit mV))
     242                 (const v0_h_inf = -78  (unit mV))
     243                 (const k_m_inf  = -7.4 (unit mV))
     244                 (const k_h_inf  = 5.0  (unit mV))
    245245       
    246246                 (const C_tau_m   = 3)
    247247                 (const A_tau_m   = 1.0)
    248                  (const v0_tau_m1 = -25)
    249                  (const v0_tau_m2 = -100)
    250                  (const k_tau_m1  = 10)
    251                  (const k_tau_m2 = -15)
     248                 (const v0_tau_m1 = -25  (unit mV))
     249                 (const v0_tau_m2 = -100 (unit mV))
     250                 (const k_tau_m1  = 10   (unit mV))
     251                 (const k_tau_m2 = -15   (unit mV))
    252252                 
    253253                 (const C_tau_h   = 85)
    254                  (const A_tau_h   = 1.0)
    255                  (const v0_tau_h1 = -46)
    256                  (const v0_tau_h2 = -405)
    257                  (const k_tau_h1  = 4)
    258                  (const k_tau_h2  = -50)
    259                  
     254                 (const A_tau_h   = 1.0  (unit mV))
     255                 (const v0_tau_h1 = -46  (unit mV))
     256                 (const v0_tau_h2 = -405 (unit mV))
     257                 (const k_tau_h1  = 4    (unit mV))
     258                 (const k_tau_h2  = -50  (unit mV))
    260259                         
    261260                 ;; rate functions
     
    268267                 
    269268                 (tau_m = ( (C_tau_m + A_tau_m / ( exp ((v + shift - v0_tau_m1) / k_tau_m1) +
    270                                                        exp ((v + shift - v0_tau_m2) / k_tau_m2) ) ) / phi_m) )
     269                                                       exp ((v + shift - v0_tau_m2) / k_tau_m2) ) ) / phi_m)
     270                        (unit ms))
    271271                 
    272272                 (tau_h = ( (C_tau_h + A_tau_h / ( exp ((v + shift - v0_tau_h1 ) / k_tau_h1) +
    273                                                        exp ((v + shift - v0_tau_h2) / k_tau_h2) ) ) / phi_h) )
     273                                                       exp ((v + shift - v0_tau_h2) / k_tau_h2) ) ) / phi_h)
     274                        (unit ms))
    274275                 
    275276
     
    289290     
    290291      (component (type pore)
    291                  (const  gbar  = 2.5e-4)
     292                 (const  gbar  = 2.5e-4 (unit S/cm2))
    292293                 (output gbar ))
    293294
     
    295296      (component (type permeating-ion) (name ca2)
    296297                 (const valence = 2)
    297                  (e = (nernst (celsius ca2i ca2o valence)))
     298                 (e = (nernst (celsius ca2i ca2o valence)) (unit mV))
    298299                 (output e valence))
    299300
     
    324325   (component (type ionic-current) (name HCN1)
    325326
    326               (const Ehalf = -72.49)
    327               (const c = 0.11305)
    328              
    329               (const rA = 0.002096)
    330               (const rB = 0.97596)
     327              (const Ehalf = -72.49 (unit mV))
     328              (const c     = 0.11305 (unit /mV))
     329             
     330              (const rA = 0.002096 (unit /mV))
     331              (const rB = 0.97596 )
    331332             
    332333              (defun r (potential)
     
    345346       
    346347                         (const tCs = 0.01451)
    347                          (const tDs = -4.056)
    348                          (const tEs = 2.302585092)
     348                         (const tDs = -4.056 (unit mV))
     349                         (const tEs = 2.302585092 (unit /mV))
    349350
    350351                         (o_slow_inf = ((1 - r (v)) * o_inf (v Ehalf c)))
     
    365366       
    366367                         (const tCf = 0.01371)
    367                          (const tDf = -3.368)
    368                          (const tEf = 2.302585092)
     368                         (const tDf = -3.368      (unit mV))
     369                         (const tEf = 2.302585092 (unit /mV))
    369370
    370371                         (o_fast_inf = (r (v) * o_inf (v Ehalf c)))
    371372                       
    372                          (tau_f =  (tau (v tCf tDf tEf)) )
     373                         (tau_f =  (tau (v tCf tDf tEf)) (unit ms))
    373374
    374375                         (d (o_fast) = ((o_fast_inf - o_fast) / tau_f)
     
    380381             
    381382              (component (type pore)
    382                          (const  gbar  = 5e-5)
     383                         (const  gbar  = 5e-5 (unit S/cm2))
    383384                         (output gbar))
    384385             
    385386              (component (type permeating-ion) (name non-specific)
    386                          (const e = -20)
     387                         (const e = -20 (unit mV))
    387388                         (output e ))
    388389             
     
    408409                         
    409410
    410               (const Ehalf = -81.95)
    411               (const c = 0.1661)
     411              (const Ehalf = -81.95 (unit mV))
     412              (const c     = 0.1661 (unit /mV))
    412413             
    413414              ;; rate constants
    414415
    415               (const rA = -0.0227)
    416               (const rB = -1.4694)
     416              (const rA = -0.0227 (unit /mV))
     417              (const rB = -1.4694 )
    417418
    418419              (defun r (potential r1 r2)
     
    428429              (component (type gate)
    429430                         
    430 
    431431                         ;; rate constants
    432 
    433                          (const tCs = 0.0152)
    434                          (const tDs = -5.2944)
    435                          (const tEs = 2.3026)
     432                         
     433                         (const tCs = 0.0152 )
     434                         (const tDs = -5.2944 (unit mV))
     435                         (const tEs = 2.3026  (unit /mV))
    436436                         
    437437                         (defun tau_slow (potential t1 t2 t3)
     
    440440                         (o_slow_inf = ((1 - r (v rA rB)) * o_inf (v Ehalf c)))
    441441
    442                          (tau_s =  (tau_slow(v tCs tDs tEs)))
     442                         (tau_s =  (tau_slow (v tCs tDs tEs)) (unit ms))
    443443
    444444                         (d (o_slow) = ((o_slow_inf - o_slow) / tau_s)
     
    455455
    456456                         (const tCf = 0.0269)
    457                          (const tDf = -5.6111)
    458                          (const tEf = 2.3026)
     457                         (const tDf = -5.6111 (unit mV))
     458                         (const tEf = 2.3026  (unit /mV))
    459459                         
    460460                         (defun tau_fast (potential t1 t2 t3)
     
    463463                         (o_fast_inf = (r (v rA rB) * o_inf (v Ehalf c)))
    464464
    465                          (tau_f =  (tau_fast(v tCf tDf tEf)))
     465                         (tau_f =  (tau_fast (v tCf tDf tEf)) (unit ms))
    466466
    467467                         (d (o_fast) = ((o_fast_inf - o_fast) / tau_f)
     
    473473             
    474474              (component (type pore)
    475                          (const  gbar  = 8e-5)
     475                         (const  gbar  = 8e-5 (unit S/cm2))
    476476                         (output gbar))
    477477             
    478478              (component (type permeating-ion) (name non-specific)
    479                          (const e = -20)
     479                         (const e = -20 (unit mV))
    480480                         (output e ))
    481481             
     
    515515                         (Q10 = (pow (3 ((celsius - 25.5) / 10))))
    516516
    517                          (const Aalpha_a  = 0.8147)
    518                          (const Kalpha_a  = -23.32708)
    519                          (const V0alpha_a = -9.17203)
    520                          (const Abeta_a   = 0.1655)
    521                          (const Kbeta_a   = 19.47175)
    522                          (const V0beta_a  = -18.27914)
    523 
    524                          (const Aalpha_b  = 0.0368)
    525                          (const Kalpha_b  = 12.8433)
    526                          (const V0alpha_b = -111.33209)
    527                          (const Abeta_b   = 0.0345)
    528                          (const Kbeta_b   = -8.90123)
    529                          (const V0beta_b  = -49.9537)
    530 
    531                          (const V0_ainf = -38)
    532                          (const  K_ainf = -17)
    533 
    534                          (const V0_binf   = -78.8)
    535                          (const K_binf    = 8.4)
     517                         (const Aalpha_a  = 0.8147    (unit /ms))
     518                         (const Kalpha_a  = -23.32708 (unit mV))
     519                         (const V0alpha_a = -9.17203  (unit mV))
     520                         (const Abeta_a   = 0.1655    (unit /ms))
     521                         (const Kbeta_a   = 19.47175  (unit mV))
     522                         (const V0beta_a  = -18.27914 (unit mV))
     523
     524                         (const Aalpha_b  = 0.0368    (unit /ms))
     525                         (const Kalpha_b  = 12.8433   (unit mV))
     526                         (const V0alpha_b = -111.33209 (unit mV))
     527                         (const Abeta_b   = 0.0345    (unit /ms))
     528                         (const Kbeta_b   = -8.90123  (unit mV))
     529                         (const V0beta_b  = -49.9537  (unit mV))
     530
     531                         (const V0_ainf = -38 (unit mV))
     532                         (const  K_ainf = -17 (unit mV))
     533
     534                         (const V0_binf   = -78.8 (unit mV))
     535                         (const K_binf    = 8.4   (unit mV))
    536536
    537537                         
     
    574574                     
    575575              (component (type pore)
    576                          (const  gbar  = 0.008)
     576                         (const  gbar  = 0.008 (unit S/cm2))
    577577                         (output gbar ))
    578578
    579579             
    580580              (component (type permeating-ion) (name k)
    581                          (e = (nernst (celsius ki ko 1)))
     581                         (e = (nernst (celsius ki ko 1)) (unit mV))
    582582                         (output e ))
    583583             
     
    618618                 (Q10 = (pow (3 ((celsius - 30) / 10))))
    619619                 
    620                  (const Aalpha_c = 7)
    621                  (const Balpha_c = 1.5e-3)
     620                 (const Aalpha_c = 7 (unit /ms))
     621                 (const Balpha_c = 1.5e-3 (unit mM))
    622622                 
    623                  (const Kalpha_c =  -11.765)
     623                 (const Kalpha_c =  -11.765 (unit mV))
    624624                 
    625                  (const Abeta_c = 1.)
    626                  (const Bbeta_c = 0.15e-3)
    627 
    628                  (const Kbeta_c = -11.765)
     625                 (const Abeta_c = 1.9 (unit /ms))
     626                 (const Bbeta_c = 0.15e-3 (unit mM))
     627
     628                 (const Kbeta_c = -11.765 (unit mV))
    629629                 
    630630                 ;; rate functions
     
    636636             
    637637                 (c_inf = ((alpha_c (v cai Q10)) / (alpha_c (v cai Q10) + beta_c (v cai Q10)) ))
    638                  (tau_c = (1 / (alpha_c (v cai Q10) + beta_c (v cai Q10)) ))
     638                 (tau_c = (1 / (alpha_c (v cai Q10) + beta_c (v cai Q10))) (unit ms))
    639639
    640640                 (hh-ionic-gate
     
    650650     
    651651      (component (type pore)
    652                  (const  gbar  = 0.003)
     652                 (const  gbar  = 0.003 (unit S/cm2))
    653653                 (output gbar ))
    654654     
    655655     
    656656      (component (type permeating-ion) (name k)
    657                  (e = (nernst (celsius ki ko 1)))
     657                 (e = (nernst (celsius ki ko 1)) (unit mV))
    658658                 (output e ))
    659659     
     
    661661     
    662662      ) ;; end KCa current
     663
    663664   
    664665   (component (type voltage-clamp) (name KCa)
     
    697698
    698699                         ;; rate constants
    699                          (const Aalpha_n = 0.0033)
    700 
    701                          (const Kalpha_n  = 40)
    702                          (const V0alpha_n = -30)
    703                          (const Abeta_n   = 0.0033)
    704 
    705                          (const Kbeta_n  = -20)
    706                          (const V0beta_n = -30)
    707                          (const V0_ninf  = -35)
    708                          (const   B_ninf = 6)
     700                         (const Aalpha_n = 0.0033 (unit /ms))
     701
     702                         (const Kalpha_n  = 40  (unit mV))
     703                         (const V0alpha_n = -30 (unit mV))
     704                         (const Abeta_n   = 0.0033 (unit /ms))
     705
     706                         (const Kbeta_n  = -20 (unit mV))
     707                         (const V0beta_n = -30 (unit mV))
     708                         (const V0_ninf  = -35 (unit mV))
     709                         (const B_ninf   = 6   (unit mV))
    709710                         
    710711                         (Q10 = (pow (3 ((celsius - 22) / 10))))
     
    728729             
    729730              (component (type pore)
    730                          (const  gbar  = 0.001)
     731                         (const  gbar  = 0.001 (unit S/cm2))
    731732                         (output gbar ))
    732733             
    733734              (component (type permeating-ion) (name k)
    734                          (e = (nernst (celsius ki ko 1)))
     735                         (e = (nernst (celsius ki ko 1)) (unit mV))
    735736                         (output e ))
    736737             
  • release/4/nemo/trunk/nemo-core.scm

    r29158 r29286  
    132132  (LABEL      (v symbol?))
    133133  (CONST      (name symbol?) (value number?) (u nemo:unit?))
    134   (ASGN       (name symbol?) (value number?) (rhs rhs?))
     134  (ASGN       (name symbol?) (value number?) (rhs rhs?) (u nemo:unit?))
    135135  (REACTION   (name symbol?)
    136136              (initial      (lambda (x) (or (rhs? x) (not x))))
     
    139139              (conserve     (lambda (x) (or (not x) (and (list? x) (every conseq? x)))))
    140140              (power        integer?)
     141              (u            nemo:unit?)
    141142              )
    142143  (RATE       (name symbol?)
     
    144145              (rhs          rhs?)
    145146              (power       (lambda (x) (or (integer? x) (not x))))
     147              (u           nemo:unit?)
    146148              )
    147149  (TRANSIENT  (name symbol?)
     
    150152              (asgn         rhs?)
    151153              (power       (lambda (x) (or (integer? x) (not x))))
     154              (u           nemo:unit?)
    152155              )
    153156  (PRIM       (name symbol?) (value identity))
     
    457460            (nemo:error 'env-extend! ": quantity " sym " already defined")
    458461            (match type
     462
    459463              (('label)   (begin
    460464                            (if (not (symbol? initial))
     
    484488                            ))
    485489
    486               (('asgn)    (let ((rhs (lookup-def 'rhs alst)))
     490              (('asgn)    (let* ((usym (lookup-def 'unit alst))
     491                                 (u    (or (and usym (let ((v (hash-table-ref nemo-env usym)))
     492                                                       (or v (nemo:error 'env-extend! ": invalid unit name in assignment definition" name usym))))
     493                                           nemo:unitless))
     494                                 (rhs (lookup-def 'rhs alst)))
    487495
    488496                            (if (not (eq? initial 'none))
     
    492500                                (nemo:error 'env-extend! ": state function definitions require an equation"))
    493501                            (let ((expr1 (normalize-expr rhs (sprintf "assignment ~A" sym))))
    494                               (hash-table-set! nemo-env sym (ASGN name 0.0 expr1)))
     502                              (hash-table-set! nemo-env sym (ASGN name 0.0 expr1 u)))
    495503                            ))
    496504
    497               (('rate)    (let* ((rhs (lookup-def 'rhs alst))
     505              (('rate)    (let* ((usym (lookup-def 'unit alst))
     506                                 (u    (or (and usym (let ((v (hash-table-ref nemo-env usym)))
     507                                                       (or v (nemo:error 'env-extend! ": invalid unit name in rate equation definition" name usym))))
     508                                           nemo:unitless))
     509                                 (rhs (lookup-def 'rhs alst))
    498510                                 (power (lookup-def 'power alst))
    499511                                 (local-env (let ((local-env (hash-table-copy nemo-env)))
     
    502514                                 (symbol-check (make-symbol-check local-env))
    503515                                 (normalize-expr (make-normalize-expr arity-check symbol-check))
     516                                 
    504517                                 )
    505518
     
    512525                                                        (sprintf "initial value for rate equation ~A" sym))))
    513526                                  (rhs-expr (normalize-expr rhs (sprintf "rate equation ~A" sym))))
    514                               (hash-table-set! nemo-env sym (RATE name initial-expr rhs-expr power)))
     527                              (hash-table-set! nemo-env sym (RATE name initial-expr rhs-expr power u)))
    515528
    516529                            ))
    517530
    518               (('transient)  (let* ((rhs     (lookup-def 'rhs alst))
     531              (('transient)  (let* ((usym (lookup-def 'unit alst))
     532                                    (u    (or (and usym (let ((v (hash-table-ref nemo-env usym)))
     533                                                          (or v (nemo:error 'env-extend! ": invalid unit name in transient definition" name usym))))
     534                                              nemo:unitless))                                   
     535                                    (rhs     (lookup-def 'rhs alst))
    519536                                    (asgn    (lookup-def 'asgn alst))
    520537                                    (power   (lookup-def 'power alst))
     
    524541                                    (symbol-check (make-symbol-check local-env))
    525542                                    (normalize-expr (make-normalize-expr arity-check symbol-check))
     543                                   
    526544                                    )
    527545
     
    540558                                  )
    541559                              (hash-table-set! nemo-env sym (TRANSIENT name initial-expr rhs-expr
    542                                                                        asgn-expr power)))
     560                                                                       asgn-expr power u)))
    543561
    544562                            ))
    545563
    546564              (('reaction)  (begin
    547                             (let ((power         (or (lookup-def 'power alst) 1))
    548                                   (transitions   
     565                            (let* ((usym   (lookup-def 'unit alst))
     566                                   (u      (or (and usym
     567                                                    (let ((v (hash-table-ref nemo-env usym)))
     568                                                      (or v (nemo:error 'env-extend! ": invalid unit name in reaction definition" name usym))))
     569                                               nemo:unitless))
     570                                   (power  (or (lookup-def 'power alst) 1))
     571                                   (transitions   
    549572                                   (map (lambda (t)
    550573                                          (match t
     
    585608                              (let ((en (REACTION name (and initial (normalize-expr initial (sprintf "initial value for reaction ~A" sym)))
    586609                                                  open transitions
    587                                                   (and conserve (list conserve)) power)))
     610                                                  (and conserve (list conserve)) power u)))
    588611                                (hash-table-set! nemo-env sym en)))))
    589612
     
    13431366                           
    13441367                            ;; constant during integration
    1345                             (((or 'const 'CONST) (and id (? symbol?)) '= (and expr (? expr? )))
     1368                            (((or 'const 'CONST) (and id (? symbol?)) '= (and expr (? expr? )) . rest)
    13461369                             (let* ((qid    (compute-qid id scope scope-subst))
    13471370                                    (qexpr  (subst-expr (parse-expr expr `(const ,qid)) scope-subst))
    1348                                     (qval   (eval-const qexpr id)))
    1349                                (env-extend! qid '(const) qval)
     1371                                    (qval   (eval-const qexpr id))
     1372                                    (alst   (filter identity rest))
     1373                                    (u      (lookup-def 'unit alst))
     1374                                    )
     1375                               (apply env-extend! (cons* qid '(const) qval (or (and u `((unit ,u))) '())))
    13501376                               (list (cons qid qs) (update-subst id qid scope-subst))
    13511377                               ))
    13521378
    13531379                            ;; state transition complex
    1354                             (((or 'reaction 'REACTION) ((and id (? symbol?)) . alst) )
     1380                            (((or 'reaction 'REACTION) ((and id (? symbol?)) . rest) )
    13551381                             (let* ((loc          `(reaction ,id))
    1356                                     (alst         (filter identity alst))
     1382                                    (alst         (filter identity rest))
     1383                                    (u            (lookup-def 'unit alst))
    13571384                                    (initial      (lookup-def 'initial alst))
    13581385                                    (conserve-eq  (lookup-def 'conserve alst))
     
    14001427                                 
    14011428                                 (if (and (list? conserve-eq) (not (every conseq? conserve-eq)))
    1402                                      (nemo:error 'env-extend!
     1429                                     (nemo:error 'eval-nemo-system-decls
    14031430                                                 ": conservation equation for " id
    14041431                                                 " must be a linear equation: " conserve-eq))
     
    14101437                                        (initial-val  (and initial-expr (eval-const initial-expr
    14111438                                                                                    (sprintf "~A.initial" id)))))
    1412                                    (let ((lst (cons* qid '(reaction) initial-val
    1413                                                      `(power ,power-val)
    1414                                                      (if conserve-eq `(conserve ,@conserve-eq)
    1415                                                          `(conserve #f))
    1416                                                      `(transitions ,@transitions) alst)))
    1417                                      (apply env-extend! lst))
     1439
     1440                                   (apply env-extend!
     1441                                          (cons* qid '(reaction) initial-val
     1442                                                 `(power ,power-val)
     1443                                                 (if conserve-eq `(conserve ,@conserve-eq)
     1444                                                     `(conserve #f))
     1445                                                 `(transitions ,@transitions)
     1446                                                 (or (and u `((unit ,u))) '())
     1447                                                 ))
     1448
    14181449                                   (list (cons qid qs) (update-subst id qid scope-subst))))))
    14191450                           
    14201451                           
    14211452                            ;; rate equation
    1422                             (((or 'd 'D) ((and id (? symbol?))) '= (and expr (? expr?) )
    1423                               . rest)
     1453                            (((or 'd 'D) ((and id (? symbol?))) '= (and expr (? expr?) ) . rest)
    14241454
    14251455                             (let* ((qid     (compute-qid id scope scope-subst))
    14261456                                    (scope-subst1 (update-subst id qid scope-subst))
    14271457                                    (qexpr   (subst-expr (parse-expr expr `(rate ,id)) scope-subst1))
    1428                                     (rest    (filter identity rest))
     1458                                    (alst    (filter identity rest))
    14291459                                    (initial ((lambda (x) (and x (subst-expr (parse-expr x `(rate ,id)) scope-subst)))
    1430                                               (lookup-def 'initial rest))))
    1431 
    1432                                (env-extend! qid '(rate)
    1433                                             (and initial (eval-const initial (sprintf "~A.initial" id)) )
    1434                                             `(rhs ,qexpr))
    1435                                            
     1460                                              (lookup-def 'initial alst)))
     1461                                    (u       (lookup-def 'unit alst))
     1462                                    )
     1463
     1464                               (apply env-extend!
     1465                                      (cons* qid '(rate)
     1466                                             (and initial (eval-const initial (sprintf "~A.initial" id)) )
     1467                                             `(rhs ,qexpr)
     1468                                             (or (and u `((unit ,u))) '())
     1469                                             ))
    14361470                               (list (cons qid qs) scope-subst1)))
    14371471                           
    14381472                            ;; transient equation
    1439                             (((or 't 'T 'transient) ((and id (? symbol?))) '= (and expr (? expr?) )
    1440                               . rest)
     1473                            (((or 't 'T 'transient) ((and id (? symbol?))) '= (and expr (? expr?) ) . rest)
    14411474
    14421475                             (let* ((qid     (compute-qid id scope scope-subst))
    14431476                                    (scope-subst1 (update-subst id qid scope-subst))
    14441477                                    (qexpr   (subst-expr (parse-expr expr `(transient ,id)) scope-subst1))
    1445                                     (rest    (filter identity rest))
     1478                                    (alst    (filter identity rest))
    14461479                                    (initial ((lambda (x) (and x (subst-expr (parse-expr x `(transient ,id)) scope-subst)))
    1447                                               (lookup-def 'initial rest)))
    1448                                     (asgn ((lambda (x) (and x (subst-expr (parse-expr x `(transient ,id)) scope-subst1)))
    1449                                            (lookup-def 'onevent rest)))
     1480                                              (lookup-def 'initial alst)))
     1481                                    (asgn    ((lambda (x) (and x (subst-expr (parse-expr x `(transient ,id)) scope-subst1)))
     1482                                              (lookup-def 'onevent alst)))
     1483                                    (u       (lookup-def 'unit alst))
    14501484                                    )
    14511485
    1452                                (env-extend! qid '(transient)
    1453                                             (and initial (eval-const initial (sprintf "~A.initial" id)) )
    1454                                             `(rhs ,qexpr)
    1455                                             `(asgn ,asgn))
     1486                               (apply env-extend!
     1487                                      (cons* qid '(transient)
     1488                                             (and initial (eval-const initial (sprintf "~A.initial" id)) )
     1489                                             `(rhs ,qexpr)
     1490                                             `(asgn ,asgn)
     1491                                             (or (and u `((unit ,u)) '()))
     1492                                             ))
    14561493                                           
    14571494                               (list (cons qid qs) scope-subst1)))
    14581495                           
    14591496                            ;; algebraic assignment
    1460                             (((and id (? symbol?)) '= (and expr (? expr?) ))
     1497                            (((and id (? symbol?)) '= (and expr (? expr?) ) . rest)
    14611498                             (let* ((qid    (compute-qid id scope scope-subst))
    1462                                     (qexpr  (subst-expr (parse-expr expr `(asgn ,id)) scope-subst)))
    1463                                (env-extend! qid '(asgn) 'none `(rhs ,qexpr))
     1499                                    (qexpr  (subst-expr (parse-expr expr `(asgn ,id)) scope-subst))
     1500                                    (alst   (filter identity rest))
     1501                                    (u      (lookup-def 'unit alst))
     1502                                    )
     1503                               (apply env-extend!
     1504                                      (cons* qid '(asgn) 'none `(rhs ,qexpr)
     1505                                             (or (and u `((unit ,u)) '()))))
    14641506                               (list (cons qid qs) (update-subst id qid scope-subst))))
    14651507                           
  • release/4/nemo/trunk/nemo-units.scm

    r29162 r29286  
    3838(define-unit-prefix    micro siemens uS)
    3939(define-unit-prefix    milli mole    mM)
    40 (define-unit-prefix    micro siemens uS)
    41 
     40 
    4241(define-quantity   CurrentDensity        (/ Current Area))
    4342(define-quantity   CapacitanceArea       (/ Capacitance Area))
    4443(define-quantity   ConductanceArea       (/ Conductance Area))
    4544(define-quantity   Resistivity           (* Resistance Length))
     45(define-quantity   ReactionRate          (** Time -1))
     46(define-quantity   InversePotential      (** Potential -1))
    4647
    4748(define-unit milliamp-per-square-centimeter   CurrentDensity  (/ mA (* cm cm)) mA/cm2)
     
    5051(define-unit ohm.cm                           Resistivity     (* ohm cm) ohm.cm)
    5152
     53(define-unit degC Temperature  1.0 C)
     54(define-unit /ms  ReactionRate 1000.0)
     55(define-unit /mV  InversePotential 1000.0)
    5256
    5357(define nemo:basic-units
    5458  (zip
    55    `(ms mV mA/cm2 nA mM uf/cm2 um S/cm2 uS ohm.cm ohm)
    56    (list ms mV mA/cm2 nA mM uf/cm2 um S/cm2 uS ohm.cm ohm )))
     59   `(ms mV mA/cm2 nA mM uf/cm2 um S/cm2 uS ohm.cm ohm degC /ms /mV)
     60   (list ms mV mA/cm2 nA mM uf/cm2 um S/cm2 uS ohm.cm ohm degC /ms /mV)))
    5761     
    5862(define nemo:unitless unitless)
Note: See TracChangeset for help on using the changeset viewer.