The solution of conductance equations is done by looping over the byte-code in an array called ops. The number of entries in this array can be found by inspecting the field nops:
genesis > showfield solve nops [ /Purkinje/solve ] nops = 127132
The byte-code in the ops array walks over the conductance equations for all compartments. For the purposes of efficiency, the conductance equations are grouped per compartment and these groups are put in the same order as the compartments in the funcs array. Every time a new group is encountered, the next membrane potential is fetched from the vm array. The groups are separated with COMPT_OP operations (and sometimes other operations with a resembling name). Disassembling the opcodes gives something like the following output:
genesis > printops solve 0 25 00000 :: 101 FCOMPT_OP 00001 :: 3001 CHAN_EK_OP 00002 :: 4101 0 -1 1 0 SYN3_OP 0 -1 1 0 00007 :: 100 COMPT_OP 00008 :: 100 COMPT_OP 00009 :: 5100 NEWVOLT_OP 00010 :: 3001 CHAN_EK_OP 00011 :: 4001 4 1 IPOL1V_OP 4 1 00014 :: 3200 ADD_CURR_OP 00015 :: 1000 0 CONC_VAL_OP 0 00017 :: 5110 NEWCONC1_OP 00018 :: 3000 CHAN_OP 00019 :: 4001 6 1 IPOL1V_OP 6 1 00022 :: 4002 0 2 IPOL1C_OP 0 2 00025 :: 3200 ADD_CURR_OP
The first opcode FCOMPT_OP simply loads the first membrane potential from the vm array. Then we encounter a compartment that contains a single synaptic channel (SYN3_OP opcode). Then we encounter two consecutive COMPT_OP opcodes, indicating the presence of a passive compartment : if you inspect the Purkinje cell tutorial, you see that there are lots of spines consisting of a spine head that contains a synaptic channel and a spine neck that is a passive compartment. The way hines numbering is implemented in hsolve forces the computations for the dendritic tips to be done first. In the Purkinje cell tutorial all dendritic tips are spines which explains why we encounter a compartment with a single synaptic channel followed by a passive compartment.
Next we encounter a NEWVOLT_OP. This operation loads a pointer to a table that contains an entry for each tabulated channel type in the model and that corresponds to the membrane potential of the current compartment. The CHAN_EK_OP loads the maximal conductance and the reversal potential (that come from the current entries in the chip array). Then the IPOL1V_OP computes a gate factor from a one-dimensional table (the table type is , the exponent is ). The next operation, ADD_CURR_OP, computes the current contribution for the channel. After this we see opcodes encoding an analog scenario for a concentration dependent conductance.
The emulation of this byte-code is done in the source file
hines_chip.c.
NOTE: The printfuncs and printops commands are not available in release 2.2 of Genesis. |