{load_file("netparmpi.hoc")} objref pnm pnm = new ParallelNetManager(0) proc want_all_spikes() {local gid, i for pcitr(&gid, &i) { pc.spike_record(gid, pnm.spikevec, pnm.idvec) } } proc spike2file() { localobj outf, s s = new String() sprint(s.s, "out%d.dat", pc.nhost) outf = new File() if (pc.id == 0) {outf.wopen(s.s) outf.close } // start new file for pnm.serialize() { outf.aopen(s.s) for i=0, pnm.idvec.size-1 { outf.printf("%g %d\n", pnm.spikevec.x[i], pnm.idvec.x[i]) } outf.close } } objref tdat_ tdat_ = new Vector(6) proc prun() {local tnext pc.setup_transfer() pc.set_maxstep(200) runtime=startsw() tdat_.x[0] = pc.wait_time stdinit() while(t < tstop) { tnext = t + checkpoint_interval if (tnext > tstop) { tnext = tstop } if (pc.id == 0) printf("tnext = %g\n", tnext) pc.psolve(tnext) spike2file(pnm.spikevec, pnm.idvec) trajec_out("v") } tdat_.x[0] = pc.wait_time - tdat_.x[0] runtime = startsw() - runtime tdat_.x[1] = pc.step_time tdat_.x[2] = pc.send_time tdat_.x[3] = pc.vtransfer_time(0) // for gaps tdat_.x[4] = pc.vtransfer_time(1) // for splitcells // printf("%d wtime %g\n", pnm.myid, waittime) } mindelay_ = 1e9 func mindelay() {local i, md if (pc.nhost > 1) { pc.context("{pc.post(\"mindelay\", mindelay_)}") for i=1, pc.nhost-1 { pc.take("mindelay", &md) if (md < mindelay_) { mindelay_ = md } } } return mindelay_ // see nc_append } objref tavg_stat, tmin_stat, tmax_stat, idmin_stat, idmax_stat proc poststat() { pnm.pc.post("poststat", pnm.myid, tdat_) } proc getstat() {local i, j, id localobj tdat tdat = tdat_.c tavg_stat = tdat_.c tmin_stat = tdat_.c tmax_stat = tdat_.c idmin_stat = tdat_.c.fill(0) idmax_stat = tdat_.c.fill(0) if (pnm.nwork > 1) { pnm.pc.context("poststat()\n") for i=0, pnm.nwork-2 { pnm.pc.take("poststat", &id, tdat) tavg_stat.add(tdat) for j = 0, tdat_.size-1 { if (tdat.x[j] > tmax_stat.x[j]) { idmax_stat.x[j] = id tmax_stat.x[j] = tdat.x[j] } if (tdat.x[j] < tmin_stat.x[j]) { idmin_stat.x[j] = id tmin_stat.x[j] = tdat.x[j] } } } } tavg_stat.div(pnm.nhost) } proc print_spike_stat_info() {local i, j, id localobj spstat, sum, min, max, idmin, idmax, label printf("\n%-10s %-10s %-10s %-10s %-10s %-10s %-10s %-10s\n",\ "setup", "run", "avgspkxfr", "avgcomp", "avgx2q", "avgvxfr", "avgsplit", "avgcmplx") printf("%-10.4g %-10.4g", setuptime, runtime) for i=0, tdat_.size-1 { printf(" %-10.4g", tavg_stat.x[i]) } printf("\n\n%5s %-15s %-15s %-15s %-15s %-15s %-15s\n", \ "", "id spkxfr", "id com", "id x2q", "id vxfr", "id split", "id cmplx") printf("%-5s", "min") for i=0, tdat_.size-1 { printf(" %-4d %-10.4g", idmin_stat.x[i], tmin_stat.x[i]) } printf("\n%-5s", "max") for i=0, tdat_.size-1 { printf(" %-4d %-10.4g", idmax_stat.x[i], tmax_stat.x[i]) } printf("\n") } proc perf2file() { local i localobj perf perf = new File() perf.aopen("perf.dat") perf.printf("%d %d %d %d %g %g ",pnm.nhost, pnm.ncell, load_balance_phase, use_gap, setuptime, runtime) for i=0, tdat_.size-1 { perf.printf(" %g", tavg_stat.x[i]) } perf.printf(" ") for i=0, tdat_.size-1 { perf.printf(" %d %g ", idmin_stat.x[i], tmin_stat.x[i]) } perf.printf(" ") for i=0, tdat_.size-1 { perf.printf(" %d %g ", idmax_stat.x[i], tmax_stat.x[i]) } perf.printf("\n") perf.close } //voltage for cell x, y objref trajec_list, trajec_id trajec_id = new Vector() trajec_list = new List() proc vrecord() { local gid localobj cell, vec gid = loc2gid($1, $2) if (!pc.gid_exists(gid)) return printf("%d vrecord %d %d gid=%d\n", pc.id, $1, $2, gid) cell = pc.gid2cell(gid) if (trajec_list.count == 0) { vec = new Vector() cell.soma vec.record(&t) trajec_list.append(vec) } vec = new Vector() trajec_id.append(gid) cell.soma vec.record(&v(.5)) trajec_list.append(vec) } // arg is prefix name of output file, actual name will be // $s1_ix_iy.dat trajec_out_time = 0 trajec_out_ncall = 0 trajec_out_size = 0 proc trajec_out() {local i, j, ix, iy, gid, ts localobj f, fname, tvec, vvec if (trajec_list.count == 0) return ts = startsw() fname = new String() tvec = trajec_list.o(0) trajec_out_size += tvec.size for i=0, trajec_id.size-1 { gid = trajec_id.x[i] ix = gid2ix(gid) iy = gid2iy(gid) printf("%d trajec_out %d %d gid=%d\n", pc.id, ix, iy, gid) sprint(fname.s, "%s_%04d_%04d.dat", $s1, ix, iy) f = new File() vvec = trajec_list.o(i+1) if (trajec_out_ncall == 0) { f.wopen(fname.s) f.printf("%d\n", tvec.size) }else{ f.aopen(fname.s) } for j=0, tvec.size-1 { f.printf("%g %g\n", tvec.x[j], vvec.x[j]) } f.close } for i=0, trajec_list.count - 1 { trajec_list.o(i).resize(0) } trajec_out_ncall += 1 ts = startsw() - ts if (pc.id == 0) { printf("trajec_out call %d at t=%g , time(sec) %g\n", trajec_out_ncall, t, ts) } trajec_out_time += ts }