#define a procedure to help evaluate Arrhenius parameters inside diffusion
#proc Arrhenius {pre act} {
#    set temp [simGetDouble Diffuse temp]
#    return [expr $pre * exp( -$act / (8.617383e-05 * ($temp +273.0)))]
#}
#
#proc Arr {pre act} {
#    set temp [simGetDouble Diffuse temp]
#    return [expr $pre * exp( -$act / (8.617383e-05 * ($temp +273.0)))]
#}

#define a procedure for numerical lookup in a table
#table is defined to be a series of index value pairs, in increasing order
proc Table {x table} {
    set opair [lindex $table 0]
    if { $x < [lindex $opair 0] } {return [lindex $opair 1]} 
    set ltab [lrange $table 1 end]
    foreach pair $ltab {
	set ox [lindex $opair 0]
	set ov [lindex $opair 1]
	set nx [lindex $pair 0]
	set nv [lindex $pair 1]

	if { $x >= $ox && $x <= $nx } {
	    return [expr ($x - $ox) * ($nv - $ov) / ($nx - $ox) + $ov]
	}
	set opair $pair
    }
}

proc DiffLimit {Mat Species Barrier} {
    set Dbase 0.0
    foreach sol $Species {
	#set Dbase [expr $Dbase + [pdbGetDouble $Mat $sol D0]]
	set Dbase [format "(%s + [pdbGetDouble $Mat $sol D0])" $Dbase]
    }

    set Lspa [pdbGetDouble $Mat LatticeSpacing]

    set result [format {[Arrhenius {(4.0 * 3.14159 * %s * %s)} %s]} $Dbase \
 $Lspa $Barrier]
    return $result

    #return [Arrhenius [expr 4.0 * 3.14159 * $Dbase * $Lspa] $Barrier]
}

proc ConcBind {Mat Entropy Binding} {
    set Dens [pdbGetDouble $Mat LatticeDensity]

    set result [format {[Arrhenius {(%s * exp(%s))} %s]} $Dens $Entropy $Binding]
    return $result
    
    #return [Arrhenius [expr $Dens * exp($Entropy)] $Binding]
}

proc SurfDiffLimit {Mat Side Sol Barrier} {
    set Dbase [pdbGetDouble $Side $Sol D0]
    set Lspa [pdbGetDouble $Side LatticeSpacing]
    set Kink [pdbGetDouble $Mat $Sol KinkSite]

    set result [format {[Arrhenius {(3.14159 * %s * %s * %s)} %s]} $Dbase \
 $Lspa $Kink $Barrier]
    return $result

    #return [Arrhenius [expr 3.14159 * $Dbase * $Lspa * $Kink] $Barrier]
}
