begintemplate TwoElectrodeIdealVClamp public xmeasure, xinject, set_vc, vc, ic, valid // usage: // e = TwoElectrodeIdealVClamp() // section e.xmeasure(x) // measurement electrode location // section e.xinject(x) // current injection electrode location // e.set_vc(control_potential) // sets the value of b.x[2] // e.vc() // returns the value of b.x[2] // e.ic() // returns the value of y.x[2] // e.valid() returns true if the clamp is part of the simulation public b, y // if you want to use the addresses instead of the // functions for plotting. They are necessary for // recording the current into a Vector, or playing a Vector into // the control potential. objref c, g, y, b, model, nil objref sec[2], x, sl proc init() { print "init" c = new Matrix(5,5,2) //sparse g = new Matrix(5,5) y = new Vector(5) b = new Vector(5) g.x[1][3] = 1 g.x[2][4] = 1 g.x[3][0] = -1e+06 g.x[3][1] = 1 g.x[3][2] = 1e+06 g.x[4][2] = 1 g.printf x = new Vector(2) print "init return" } proc install() { if (sec[0] != nil && sec[1] != nil) { sl = new SectionList() sec[0].sec sl.append() sec[1].sec sl.append() model = new LinearMechanism(c, g, y, b, sl, x) print "attached TEVC to cell" } } proc xmeasure() { x.x[0] = $1 sec[0] = new SectionRef() install() } proc xinject() { local a x.x[1] = $1 sec[1] = new SectionRef() a = area(x.x[1]) print "area at current injection electorde ", a g.x[1][3]=-100/a print "g" g.printf install() } proc set_vc() { b.x[4] = $1 } func vc() { return b.x[4] } func ic() { return y.x[3] } func valid() { if (model != nil) { return model.valid } return 0 } endtemplate TwoElectrodeIdealVClamp