Parallel network simulations with NEURON (Migliore et al 2006)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:64229
The NEURON simulation environment has been extended to support parallel network simulations. The performance of three published network models with very different spike patterns exhibits superlinear speedup on Beowulf clusters.
Reference:
1 . Migliore M, Cannia C, Lytton WW, Markram H, Hines ML (2006) Parallel network simulations with NEURON. J Comput Neurosci 21:119-29 [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism:
Cell Type(s):
Channel(s):
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: NEURON;
Model Concept(s): Methods;
Implementer(s): Hines, Michael [Michael.Hines at Yale.edu];
/
netmod
parbulbNet
README *
cadecay.mod *
flushf.mod *
kA.mod *
kca.mod *
kfasttab.mod *
kM.mod *
kslowtab.mod *
lcafixed.mod *
nafast.mod *
nagran.mod *
nmdanet.mod *
bulb.hoc
calcisilag.hoc *
ddi_baseline.gnu *
ddi_baseline.ses *
experiment_ddi_baseline.hoc *
experiment_odour_baseline.hoc *
granule.tem *
init.hoc *
input.hoc *
input1 *
mathslib.hoc *
mitral.tem *
modstat
mosinit.hoc *
odour_baseline.gnu *
odour_baseline.ses *
par_batch1.hoc
par_bulb.hoc
par_calcisilag.hoc
par_experiment_ddi_baseline.hoc
par_granule.tem
par_init.hoc
par_input.hoc
par_mitral.tem
par_netpar.hoc
par_notes
parameters_ddi_baseline.hoc *
parameters_odour_baseline.hoc *
screenshot.png *
tabchannels.dat *
tabchannels.hoc *
test1.sh
                            
// input.hoc
// Olfactory bulb network model: define procedures to set-up input
// Andrew Davison, The Babraham Institute, 2000.

strdef odourfile,inputfile
objref odour, inputarray
objref A, X, S
odour = new Vector(nof)
inputarray = new Matrix(nmitx,nmity)


proc set_no_input() {
  for i = 0, nmitx-1 {
    for j = 0, nmity-1 {
      inputarray.x[i][j] = 0.0
	if (input[i][j] != nil) {
      input[i][j].amp = inputarray.x[i][j]
	}
    }
  }
}


proc add_uniform_input() { local i,j // 2 args - min and max input
  for i = 0, nmitx-1 {
    for j = 0, nmity-1 {
      inputarray.x[i][j] += random.uniform($1,$2)
	if (input[i][j] != nil) {
      input[i][j].amp = inputarray.x[i][j]
	}
    }
  }
}


proc add_focal_input() {  // 4 args - max input, centre coords and half-width of spot
  for i = 0, nmitx-1 {
    for j = 0, nmity-1 {
      inputarray.x[i][j] += $1*exp(-2.77259*((i-$3)*(i-$3)+(j-$2)*(j-$2))/($2*$2))
	if (input[i][j] != nil) {
      input[i][j].amp = inputarray.x[i][j]
      //print i,j,input[i][j].amp
	}
    }
  }
}



proc generate_odour_matrix() { local i,j,r,ix,iy,k,l,min,max
  A = new Matrix(nglom,nof) 	// A is set here and should
                		// not be changed elsewhere
  S = new Matrix(nmitx,nmity)   // X and S are local
  X = new Vector(nglom)     	// matrices

  r = random.normal(0.0,0.5)

  // Generate original matrix
  for i = 0,nglom-1 for j = 0,nof-1 {
    r = random.repick()
    if (r < 0) {r = 0}
    A.x[i][j] = r
  }

  // Average to obtain similar responses of nearby glomeruli
  blur = 2

  for j = 0,nof-1 {
    X = A.getcol(j)
    for ix = 0,nmitx-1 for iy = 0,nmity-1 {
      S.x[ix][iy] = X.x[ix*nmity+iy]
    }
    for ix = 0,nmitx-1 for iy = 0,nmity-1 {
      X.x[ix*nmity+iy] = 0
      for k = -1,1 for l = -1,1 {
        kx = mod(ix+k,nmitx)
        ly = mod(iy+l,nmity)
        X.x[ix*nmity+iy] += ( S.x[kx][ly] * exp(-blur*sqrt(k^2+l^2)) )
      }
    }
    A.setcol(j,X)
  }

  max = arraymax(A)
  min = arraymin(A)
  print "min, max ",min,max
  for i=0,nglom-1 for j=0,nof-1 {
    A.x[i][j] += -min
  }
  A.muls(1/(max-min))
}


proc read_odour_file() {
  sprint(odourfile,"odour%d",$1)
  ropen(odourfile)
  for i = 0,nof-1 {
    odour.x[i] = fscan()
  }
  ropen()
  printf("Odour %d loaded:\n",$1)
  odour.printf("%6.3f")
}

proc map_odour_to_input() { local i,j // 2 args - odour vector and odour intensity
  X = A.mulv($o1)
  for i = 0, nmitx-1 {
    for j = 0, nmity-1 {
      inputarray.x[i][j] += $2 * X.x[i*nmity+j]
      input[i][j].amp = inputarray.x[i][j]
    }
  }
}

proc add_odour_input() { // 2 args - odour number and input intensity
  generate_odour_matrix()
  read_odour_file($1)
  map_odour_to_input(odour,$2)
}

proc add_fixed_input() { local i,j // 2 args - input vector and input intensity
  sprint(inputfile,"input%d",$1)
  ropen(inputfile)
  for i = 0, nmitx-1 {
    for j = 0, nmity-1 {
      inputarray.x[i][j] = fscan()
      input[i][j].amp = $2*inputarray.x[i][j]
    }
  }
  ropen()
  printf("Input %d loaded:\n",$1)
  inputarray.printf("%6.3f")
}

proc glomshock() { local i,j // 3 args - amplitude, delay and duration
  for i = 0, nmitx-1 {
    for j = 0, nmity-1 {
	if (pnm.gid_exists(mitgid.x[i][j])) {
      inputarray.x[i][j] = $1
      input[i][j].amp = inputarray.x[i][j]
      input[i][j].del = $2
      input[i][j].dur = $3
	}
    }
  }
}