begintemplate DipoleForCell
public bd, seclist, rotmat 
//external fill_ztan
objref bd,  seclist, point, rotmat //rotmat is incase I want a rotation matx

proc init() {
	//rotmat = new Matrix(3,3)
	//rotmat.ident
	point = new Vector(3)
	seclist = new SectionList()
	seclist.wholetree
	bd=new List()
	forsec seclist {
		insert dipole
		bd.append(new Dipole(1))
	}
	setup_dipole() // must be called whenever nseg changes
	fill_ztan() //must also be called whenever nseg changes?
}


proc setup_dipole() { local i, j, x, xold  localobj d
	j=0
	forsec seclist {
		d= bd.object(j) //branch point (1) dipoles via point processes 
		j += 1
		d.ri=ri(1)
		setpointer d.pv,v(0.999)	
		i += 1
		//ri_dipole below is non branch point 
		//dipoles via density mechanisms
		xold=0
		for(x, 0) {// runs over non branch point dipoles via suffix
			ri_dipole(x)=ri(x) // ri avail for use: diameters taken 
			setpointer pv_dipole(x),v(xold) //points pv to parent 
			setpointer Qsum_dipole(x), d.Qsum
			xold=x
		}
	}
}

proc fill_ztan() {local i, j, x  localobj xvec, z3dvec, a3dvec, d  
	j=0
	forsec seclist {
   		xvec = new Vector(nseg+2)  // a vec of L*x values for a single section
  		z3dvec = new Vector(n3d()) // the 3-d z points for a single section
  		a3dvec = new Vector(n3d()) // the 3-d arc pos for a single section
   		i = 0
   		for(x) { 
			xvec.x[i] = x*L   //Is L a global thingy??
			i += 1 
		}    		
		for i=0, n3d()-1 { 
			point.x[0] = x3d(i)
			point.x[1] = y3d(i)
			point.x[2] = z3d(i)
			//rotmat.mulv(point, point)
			z3dvec.x[i] = point.x[1]   //**THIS IS Y DIRECTION FOR NOW
			a3dvec.x[i] = arc3d(i) 
		}
   		z3dvec.interpolate(xvec, a3dvec) // now it is z for the centers,0and1
		z3dvec.deriv(1,1) // now it is dz with nseg-1 (nseg+2-1)?? elements
  		i = 0
   		for (x, 0) { ztan_dipole(x) = z3dvec.x[i]   i += 1 }
		d= bd.object(j)
		j += 1
		d.ztan = z3dvec.x[i]
	} //end forsec
}


endtemplate DipoleForCell