def getRadialOrthoradialDict(cell,targetid, large = False):
	primordiafacelist= sf.getSeparatePrimordiaBoundaryFaceList(cell, targetid, large=large)
	orthoradialDict = {}
	radialDict = {}
	targetface = sf.getFace(cell,targetid)
	targetcentroid = np.array([targetface.getXCentralised(), targetface.getYCentralised(),targetface.getZCentralised()])
	############################################################
	for listiter in range(len(primordiafacelist)):
		facelist = primordiafacelist[listiter]
		########################################################
		for count in range(len(facelist)):
			face = facelist[count]
			#nextface = facelist[(count+1)%len(facelist)]
			normal = face.getNormal()
			normalvec = np.array([qd.doublearray_getitem(normal,0),
							qd.doublearray_getitem(normal,1),
							qd.doublearray_getitem(normal,2)])
			########################################################
			facecentroid = np.array([face.getXCentralised(), face.getYCentralised(),face.getZCentralised()])
			#Calculating direction Vector to primordia centroid
			direcvec = np.subtract(targetcentroid,facecentroid)
			direcvec = direcvec/np.linalg.norm(direcvec)
			#Radial Vec to on-plane unitvector
			radialvec = direcvec - normalvec*(np.dot(direcvec,normalvec))
			radialvec = radialvec/np.linalg.norm(radialvec)
			########################################################
			crossvec = np.cross(radialvec,normalvec)
			crossvec = crossvec/np.linalg.norm(crossvec)
			orthoradialDict[face.getID()] = crossvec
			radialDict[face.getID()]= radialvec
	return radialDict,orthoradialDict
Example #2
0
def getMatrixDifferenceEllipsePoints(cell,targetface, diffmatrix,primordialfaceid = 135,zoomfactor=1.):
	#getting the Target Form Matrix
	faces = qd.CellFaceIterator(cell)
	face = faces.next()
	while True:
		if face.getID() == targetface:
			break
		face = faces.next()
	#print "Face Id : ", face.getID()
	targetformmatrix = diffmatrix
	unitx = face.getUnitx()
	unity = face.getUnity()
	unitz = face.getUnitz()
	unit_mat = np.matrix([[qd.doublearray_getitem(unitx,0),qd.doublearray_getitem(unitx,1),qd.doublearray_getitem(unitx,2)],
						 [qd.doublearray_getitem(unity,0),qd.doublearray_getitem(unity,1),qd.doublearray_getitem(unity,2)],
						 [qd.doublearray_getitem(unitz,0),qd.doublearray_getitem(unitz,1),qd.doublearray_getitem(unitz,2)]])
	#transposing unitmatrix
	transpose_unitmat = np.matrix(np.transpose(unit_mat))
	#Getting Centroid of face
	xcent = face.getXCentralised()
	ycent = face.getYCentralised()
	zcent = face.getZCentralised()
	##### getting data from ellipse & getting transformed coordinate to 3d Cartesian
	data = ep.plot_ellipse(cov=targetformmatrix, data_out=True,norm = True)
	points = zoomfactor*np.matrix(np.vstack((data,np.zeros(len(data[0])))))
	transformedpoints = transpose_unitmat*points
	transformedpoints[0]+= xcent
	transformedpoints[1]+= ycent
	transformedpoints[2]+= zcent
	return transformedpoints
def getRadialOrthoradialStress(face,
                               radialDict,
                               orthoradialDict,
                               vectors=False):
    eigenvec1 = face.getStressEigenVector1()
    eigenvec2 = face.getStressEigenVector2()
    eigenvalue1 = face.getStressEigenValue1()
    eigenvalue2 = face.getStressEigenValue2()
    vec1 = eigenvalue1 * np.array([
        qd.doublearray_getitem(eigenvec1, 0),
        qd.doublearray_getitem(eigenvec1, 1),
        qd.doublearray_getitem(eigenvec1, 2)
    ])
    vec2 = eigenvalue2 * np.array([
        qd.doublearray_getitem(eigenvec2, 0),
        qd.doublearray_getitem(eigenvec2, 1),
        qd.doublearray_getitem(eigenvec2, 2)
    ])
    radialvec = np.copy(radialDict[face.getID()])
    orthoradialvec = np.copy(orthoradialDict[face.getID()])
    #print radialvec,orthoradialvec
    ############################################
    radialComp = np.dot(radialvec, vec1) + np.dot(radialvec, vec2)
    orthoradialComp = np.dot(orthoradialvec, vec1) + np.dot(
        orthoradialvec, vec2)
    ############################################
    if vectors:
        radialvec = radialComp * radialvec
        orthoradialvec = orthoradialComp * orthoradialvec
        return radialvec, orthoradialvec
    ############################################
    return radialComp, orthoradialComp  #radialvec,orthoradialvec
Example #4
0
def getTargetFormMatrixEllipsePoints(targetface=10):
    #getting the Target Form Matrix
    faces = qd.CellFaceIterator(cell)
    face = faces.next()
    while True:
        if face.getID() == targetface:
            break
        face = faces.next()
    #print "Face Id : ", face.getID()
    targetformmatrix = np.array([[
        qd.getTargetFormMatrix(face, 0, 0),
        qd.getTargetFormMatrix(face, 0, 1)
    ], [
        qd.getTargetFormMatrix(face, 1, 0),
        qd.getTargetFormMatrix(face, 1, 1)
    ]])
    unitx = face.getUnitx()
    unity = face.getUnity()
    unitz = face.getUnitz()
    unit_mat = np.matrix([[
        qd.doublearray_getitem(unitx, 0),
        qd.doublearray_getitem(unitx, 1),
        qd.doublearray_getitem(unitx, 2)
    ],
                          [
                              qd.doublearray_getitem(unity, 0),
                              qd.doublearray_getitem(unity, 1),
                              qd.doublearray_getitem(unity, 2)
                          ],
                          [
                              qd.doublearray_getitem(unitz, 0),
                              qd.doublearray_getitem(unitz, 1),
                              qd.doublearray_getitem(unitz, 2)
                          ]])
    ##### getting data from ellipse
    data = plot_ellipse(cov=targetformmatrix, data_out=True)
    ################################
    return data
Example #5
0
def getRadialOrthoradialGrowth(face, radialDict,orthoradialDict, vectors = False):
    eigenvec1 = face.getRotGrowthEigenVector1()
    eigenvec2 = face.getRotGrowthEigenVector2()
    eigenvalue1 = face.getRotGrowthEigenValue1()
    eigenvalue2 = face.getRotGrowthEigenValue2()
    vec1unit = np.array([qd.doublearray_getitem(eigenvec1,0),
                    qd.doublearray_getitem(eigenvec1,1),
                    qd.doublearray_getitem(eigenvec1,2)])
    vec2unit = np.array([qd.doublearray_getitem(eigenvec2,0),
                    qd.doublearray_getitem(eigenvec2,1),
                    qd.doublearray_getitem(eigenvec2,2)])
    vec1 =eigenvalue1*vec1unit
    vec2 = eigenvalue2*vec2unit
    #print vec1unit
    radialvec = np.copy(radialDict[face.getID()])
    orthoradialvec = np.copy(orthoradialDict[face.getID()])
    #print radialvec,orthoradialvec
    ########################################################################################
    # sign change if needed : 
    #       if EigenVector and RadialVec are opposite facing
    ########################################################################################
    #print "rad.vec1 :",np.dot(radialvec, vec1unit), 'rad.vec2',np.dot(radialvec, vec2unit), np.dot(vec1unit,vec2unit)
    ########################################################################################
    radsign1 = (np.dot(radialvec, vec1unit)<0.)*(-1)+(np.dot(radialvec, vec1unit)>0.)*(1)
    radsign2 = (np.dot(radialvec, vec2unit)<0.)*(-1)+(np.dot(radialvec, vec2unit)>0.)*(1)
    orthosign1 = (np.dot(orthoradialvec, vec1unit)<0.)*(-1)+(np.dot(orthoradialvec, vec1unit)>0.)*(1)
    orthosign2 = (np.dot(orthoradialvec, vec2unit)<0.)*(-1)+(np.dot(orthoradialvec, vec2unit)>0.)*(1)
    #print radsign1, radsign2, orthosign1, orthosign2
    ########################################################################################
    radialComp = np.dot(radialvec,vec1)*radsign1+np.dot(radialvec,vec2)*radsign2
    orthoradialComp = np.dot(orthoradialvec,vec1)*orthosign1+np.dot(orthoradialvec,vec2)*orthosign2
    ############################################
    if vectors:
        radialvec = radialComp*radialvec
        orthoradialvec = orthoradialComp*orthoradialvec
        return radialvec, orthoradialvec
    ############################################
    return radialComp, orthoradialComp#radialvec,orthoradialvec
Example #6
0
def plotGrowthDirection(cell, diffmatrix, plotdiff,step,targetface, azim = -60, elev = 30, saveDirectory = None):
	# Iterating over Face
	# getting neighbourhood of fast groing cell
	######### Color Map ####################################
	import matplotlib.colors as colors
	import matplotlib.cm as cmx
	jet = cm = plt.get_cmap('viridis') 
	maxvalue = 1.#np.pi/2
	minvalue = 0.#-1.*np.pi
	cNorm  = colors.Normalize(vmin=minvalue, vmax=maxvalue)
	scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=jet)
	########################################################
	faceidarray = getNeighbourFaces(cell,targetface)
	primordialface = sf.getFace(cell,targetface)
	px = primordialface.getXCentralised()
	py = primordialface.getYCentralised()
	pz = primordialface.getZCentralised()
	plotdiff.scatter(px,py,pz,marker='*', c= 'm',s = 30)
	faces = qd.CellFaceIterator(cell)
	face = faces.next()
	while face != None:
		if face.getID() == 1: 
			face = faces.next()
			continue
		faceid = face.getID()
		if faceid in faceidarray:
			c = 'g'
			lw = 3
			zoomfactor = 1
		else:
			c = 'k'
			lw = 1.5
			zoomfactor = 1
		#######################################################
		# Calculation of eigen vecs 
		#######################################################
		facediffmatrix = diffmatrix[face.getID()]
		#########################################
		#Getting points to plot ellipse
		ellipsepoints = getMatrixDifferenceEllipsePoints(cell,face.getID(),facediffmatrix,primordialfaceid = targetface,zoomfactor = zoomfactor)
		###############################
		eigvec, eigval, u = np.linalg.svd(facediffmatrix)
		eigval = np.divide(eigval,np.max(eigval))
		eigval = 10*eigval
		#######################################################
		# Getting the unit matrix for transformation
		#######################################################
		unitx = face.getUnitx()
		unity = face.getUnity()
		unitz = face.getUnitz()
		transformMatrix = np.transpose(np.matrix(
							[[qd.doublearray_getitem(unitx,0),qd.doublearray_getitem(unitx,1),qd.doublearray_getitem(unitx,2)],
							 [qd.doublearray_getitem(unity,0),qd.doublearray_getitem(unity,1),qd.doublearray_getitem(unity,2)],
							 [qd.doublearray_getitem(unitz,0),qd.doublearray_getitem(unitz,1),qd.doublearray_getitem(unitz,2)]]))
		#################################
		#print "#################################"
		#print eigvec
		eigvec = np.matrix(np.vstack((eigvec.T, [0,0])))
		#print eigvec
		eigvec = np.matmul(transformMatrix,eigvec).T
		#print eigvec
		#print transformMatrix
		#################################
		# Now plotting the eigenvecs
		#################################
		xmean = face.getXCentralised()
		ymean = face.getYCentralised()
		zmean = face.getZCentralised()
		plotdiff.scatter(xmean,ymean,zmean,marker='*', c= 'b',s = 30)
		################################################################################################
		# Plotting the angle between the radial and primary direction
		################################################################################################
		################################################################################################
		# Getting the angle for between radial and primary growth direction
		################################################################################################
		#print px, py, pz
		############################################################
		radialvec = np.array([px-xmean,py-ymean,pz-zmean])
		try:
			radialvec /= np.linalg.norm(radialvec)
		except RuntimeWarning:
			print px, py, pz
			print xmean, ymean, zmean
			radialvec = np.array([0.,0.,0.])
		primaryvec = np.array([eigvec[0,0],eigvec[0,1],eigvec[0,2]])
		primaryvec /= np.linalg.norm(primaryvec)
		############################################################
		# angle : here it means dot product
		############################################################
		angle= np.abs(np.dot(radialvec,primaryvec))
		#print px, py, pz, xmean, ymean, zmean, "radialvec ", radialvec
		#print "="*20
		#print faceid, angle
		color = scalarMap.to_rgba(angle)
		#print eigvec, eigvec.shape, eigvec[0],eigval
		xlist = []
		ylist = []
		zlist = []
		edges = qd.FaceEdgeIterator(face)
		edge = edges.next()
		while edge != None:
			####grabbing the origin of edge####
			#centralised coordiante
			vertex = edge.Org()
			#print vertex.getID()
			xCoord1 = vertex.getXcoordinate()
			yCoord1 = vertex.getYcoordinate()
			zCoord1 = vertex.getZcoordinate()
			xlist.append(xCoord1)
			ylist.append(yCoord1)
			zlist.append(zCoord1)
			edge = edges.next()
		xlist.append(xlist[0])
		ylist.append(ylist[0])
		zlist.append(zlist[0])
		plotdiff.text(xmean,ymean,zmean, "%.2f"%angle)
		verts = [zip(xlist, ylist,zlist)]
		#plotdiff.text(xmean, ymean, zmean, "%.2f"%(angle))
		#verts = [zip(np.array(ellipsepoints[0])[0],np.array(ellipsepoints[1])[0], np.array(ellipsepoints[2])[0])]
		pc = Poly3DCollection(verts,alpha = .7,linewidths=1, facecolor = color,zorder = 10)
		pc.set_edgecolor(color)
		plotdiff.add_collection3d(pc)
		############################################################
		# For now just plotting Principal direction of Growth
		############################################################
		"""plotdiff.quiver(xmean,ymean,zmean,
													radialvec[0],radialvec[1],radialvec[2],
							color='b',length = 1,pivot='tail',zorder=-1)"""
		if eigval[0]> eigval[1]:
									colorvec1 = 'r'
									vec1 = plotdiff.quiver(xmean,ymean,zmean,
												eigvec[0,0],eigvec[0,1],eigvec[0,2],
												color=colorvec1,length = 1,pivot='tail',zorder=-1)
									#colorvec2 = 'b'
		else:
									colorvec2 = 'r'	
									vec2 =plotdiff.quiver(xmean,ymean,zmean,
												eigvec[1,0],eigvec[1,1],eigvec[1,2],
												color=colorvec2,length = 1,pivot='tail',zorder=-1)
		############################################################
		# Plotting face
		############################################################
		xlist = []
		ylist = []
		zlist = []
		edges = qd.FaceEdgeIterator(face)
		edge = edges.next()
		while edge != None:
			####grabbing the origin of edge####
			#centralised coordiante
			vertex = edge.Org()
			#print vertex.getID()
			xCoord1 = vertex.getXcoordinate()
			yCoord1 = vertex.getYcoordinate()
			zCoord1 = vertex.getZcoordinate()
			xlist.append(xCoord1)
			ylist.append(yCoord1)
			zlist.append(zCoord1)
			edge = edges.next()
		xlist.append(xlist[0])
		ylist.append(ylist[0])
		zlist.append(zlist[0])
		if faceid in faceidarray:
			line, = plotdiff.plot(xlist,ylist,zlist,c=c,lw = lw)
		else:
			plotdiff.plot(xlist,ylist,zlist,c=c,lw = lw)
		face = faces.next()
	plotdiff.view_init(azim = azim, elev= elev)
	
	#plotdiff.legend((vec1,vec2,line),("major direction","minor direction","Fast Growing"),bbox_to_anchor=(0.87, 0.95))
	########################################################################
	plt.savefig(saveDirectory+r"/principalGrowth_step=%03d.png"%(step),transparent=True)
	del plotdiff.collections[:]
	plotdiff.lines = []
	return plotdiff
Example #7
0
def plotStrainSurface(cell,
                      numOfLayer,
                      step=None,
                      alpha=0.8,
                      Length=1.0,
                      save=False,
                      azim=-70,
                      elev=50):
    import matplotlib.colors as colors
    import matplotlib.cm as cmx
    #import the libraries
    from mpl_toolkits.mplot3d import Axes3D
    import matplotlib as mpl
    from mpl_toolkits.mplot3d.art3d import Poly3DCollection
    import numpy as np
    import matplotlib.pyplot as plt
    #limits of the plot
    radius = (numOfLayer >
              1) * (np.sqrt(3.) * (numOfLayer - 1) -
                    Length) + Length  #the radius of circle to be projected on
    #plotting part
    fig = plt.figure(frameon=False, figsize=(10, 8))
    fig.subplots_adjust(left=0, right=1, bottom=0, top=1)
    ax = Axes3D(fig)
    ax.set_xlim((-0.7 * radius, 0.7 * radius))
    ax.set_ylim((-0.7 * radius, 0.7 * radius))
    ax.set_zlim((-0., 1.4 * radius))
    ax.axis('off')
    ax.xaxis.pane.set_edgecolor('black')
    ax.yaxis.pane.set_edgecolor('black')
    #ax.xaxis.pane.fill = False
    #ax.yaxis.pane.fill = False
    #ax.zaxis.pane.fill = False
    ########################################################################
    #                    Plotting the Strain vectors                       #
    ########################################################################
    X = []
    Y = []
    Z = []
    U = []
    V = []
    W = []
    eigenvalue = []
    eigenvalue1array = []
    eigenvalue2array = []
    eigenvalueratioarray = []
    faces = qd.CellFaceIterator(cell)
    face = faces.next()
    while face != None:
        if face.getID() == 1:
            face = faces.next()
            continue
        if sf.checkExternalFace(face):
            face = faces.next()
            continue
        eigenvec1 = face.getStrainEigenVector1()
        eigenvec2 = face.getStrainEigenVector2()
        eigenvalue1 = face.getStrainEigenValue1()
        eigenvalue2 = face.getStrainEigenValue2()
        eigenvalue.append(eigenvalue1)
        eigenvalue.append(eigenvalue2)
        eigenvalue1array.append(eigenvalue1)
        eigenvalue2array.append(eigenvalue2)
        ratio = abs(
            max(eigenvalue1, eigenvalue2) -
            min(eigenvalue1, eigenvalue2)) / max(abs(eigenvalue1),
                                                 abs(eigenvalue2))
        eigenvalueratioarray.append(ratio)
        #########~~~ EIGEN VEC 1 ~~~#########
        #getting the centralised coordinate of centroid
        X.append(face.getXCentralised())
        Y.append(face.getYCentralised())
        Z.append(face.getZCentralised())
        #getting the vector headings
        U.append(qd.doublearray_getitem(eigenvec1, 0))
        V.append(qd.doublearray_getitem(eigenvec1, 1))
        W.append(qd.doublearray_getitem(eigenvec1, 2))
        #########~~~ EIGEN VEC 2 ~~~#########
        #getting the centralised coordinate of centroid
        X.append(face.getXCentralised())
        Y.append(face.getYCentralised())
        Z.append(face.getZCentralised())
        #getting the vector headings
        U.append(qd.doublearray_getitem(eigenvec2, 0))
        V.append(qd.doublearray_getitem(eigenvec2, 1))
        W.append(qd.doublearray_getitem(eigenvec2, 2))
        #ax.scatter(X[-1],Y[-1],Z[-1])
        face = faces.next()
    ###getting Maximum Eigenvalue ratio
    maxEigenValueRatio = (max(eigenvalueratioarray))
    minEigenValueRatio = (min(eigenvalueratioarray))
    maxEigenValue = max(map(abs, eigenvalue))
    #print "Max Eigen Value Ration :", maxEigenValueRatio
    #print "Min Eigen Value Ratio :", minEigenValueRatio
    ########    ########    ########    ########    ########
    #                 Plotting the Cell                    #
    ########    ########    ########    ########    ########
    ######### Color Map
    jet = cm = plt.get_cmap('plasma')
    maxvalue = 1  #maxEigenValueRatio
    minvalue = 0  #minEigenValueRatio
    normMax = 2  # value to normalize by
    cNorm = colors.Normalize(vmin=minvalue, vmax=maxvalue)
    scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=jet)
    faces = qd.CellFaceIterator(cell)
    ###################
    face = faces.next()
    xcenarray = []
    ycenarray = []
    zcenarray = []
    while (face != None):
        if face.getID() == 1:
            face = faces.next()
            continue
        faceid = face.getID()  #grabbing face id
        xlist = []
        ylist = []
        zlist = []
        xproj = []
        yproj = []
        zproj = []
        #print "== Face ID : ", faceid, "=="
        xmean = face.getXCentralised()
        ymean = face.getYCentralised()
        zmean = face.getZCentralised()
        edges = qd.FaceEdgeIterator(face)
        edge = edges.next()
        while edge != None:
            ####grabbing the origin of edge####
            #centralised coordiante
            vertex = edge.Org()
            #print vertex.getID()
            xCoord1 = vertex.getXcoordinate()
            yCoord1 = vertex.getYcoordinate()
            zCoord1 = vertex.getZcoordinate()
            xlist.append(xCoord1)
            ylist.append(yCoord1)
            zlist.append(zCoord1)
            edge = edges.next()
        xlist.append(xlist[0])
        ylist.append(ylist[0])
        zlist.append(zlist[0])
        verts = [zip(xlist, ylist, zlist)]
        #adding to 3d plot
        xcenarray.append(face.getXCentralised())
        ycenarray.append(face.getYCentralised())
        zcenarray.append(face.getZCentralised())
        #print face.getZCentralised()
        eigenvalue1 = face.getStrainEigenValue1()
        eigenvalue2 = face.getStrainEigenValue2()
        ratio = abs(
            max(eigenvalue1, eigenvalue2) - min(eigenvalue1, eigenvalue2)) / (
                normMax * max(abs(eigenvalue1), abs(eigenvalue2)))
        if sf.checkExternalFace(face):
            ratio = 0.
        #print "face ID : ", face.getID(), " ratio : ", ratio
        color = scalarMap.to_rgba(ratio)
        #print face.getZCentralised(), alpha_fac
        #ax.add_collection3d(arrow(xcen-0.5,ycen-0.5,zcen-0.5,xcen+0.5,ycen+0.5,zcen+0.5))
        pc = Poly3DCollection(verts,
                              alpha=alpha,
                              facecolor=color,
                              linewidths=1,
                              zorder=0)
        pc.set_edgecolor('k')
        ax.add_collection3d(pc)
        ax.scatter(xcenarray[-1], ycenarray[-1], zcenarray[-1], c='r')
        face = faces.next()
        #if face.getID() == 1: break
    #plt.clf()
    for i in range(len(X)):
        veclength = np.sqrt((U[i])**2 + (V[i])**2 + (W[i])**2)
        #print " veclength : ", veclength, (eigenvalue[i]/maxEigenValue)
        veclength *= (eigenvalue[i] / maxEigenValue)
        if veclength <= 0:
            colorvec = 'r'
        else:
            colorvec = 'k'
        ax.quiver(X[i],
                  Y[i],
                  Z[i],
                  U[i],
                  V[i],
                  W[i],
                  color=colorvec,
                  length=veclength,
                  pivot='tail',
                  zorder=-1)
        #ax.quiver(X[i], Y[i], Z[i], U[i], V[i], W[i],color='k',pivot='tail',zorder=4)# for older matplotlib
    scalarMap._A = []
    cbar_ax = fig.add_axes([0.873, 0.2, 0.04, 0.55])
    #clrbar = plt.colorbar(scalarMap,shrink=0.5, aspect=10)
    clrbar = plt.colorbar(
        scalarMap, cax=cbar_ax)  #,orientation='horizontal',cax = cbar_ax)
    clrbar.set_label("Magnitude of Stress Anisotrophy", fontsize=18)
    clrbar.ax.tick_params(labelsize=14)
    #ax.set_title("Time %d : Anisotrophy of Strain : Max %.4f Min %.4f"%(step,maxEigenValueRatio,minEigenValueRatio), fontsize = 20)
    #print xcenarray-0.5
    #plt.close("all")
    ax.view_init(azim=azim, elev=elev)
    if save:
        saveDirectory = "strainFigures_u%02d_v%02d" % (
            azim, elev) + r"/stressSurface"
        import os
        if not os.path.exists(saveDirectory):
            os.makedirs(saveDirectory)
        plt.savefig(saveDirectory + r"/strainSurface_Time=%03d.png" % (step),
                    transparent=True)
        plt.close()
    return
Example #8
0
def plotAbsAnisotropyStress(cell, numOfLayer,step = None, alpha = 0.8, Length=1.0,save=False,azim = -60, elev=50,
					  colormap = 'magma'):
	import matplotlib.colors as colors
	import matplotlib.cm as cmx
	#import the libraries
	from mpl_toolkits.mplot3d import Axes3D
	import matplotlib as mpl
	from mpl_toolkits.mplot3d.art3d import Poly3DCollection
	import numpy as np
	import matplotlib.pyplot as plt
	#limits of the plot
	radius = (numOfLayer>1)*(np.sqrt(3.)*(numOfLayer-1)-Length)+Length#the radius of circle to be projected on
	#plotting part
	fig = plt.figure(frameon=True,figsize=(22,10))
	#fig.subplots_adjust(left=0, right=1, bottom=0, top=1)
	ax1 = fig.add_subplot(121,projection='3d')
	ax2 = fig.add_subplot(122,projection='3d')
	#ax = Axes3D(fig)
	xlim = 0.5
	ax1.set_xlim((-xlim*radius,xlim*radius))
	ax1.set_ylim((-xlim*radius,xlim*radius))
	ax1.set_zlim((-0.3*radius,0.7*radius))
	ax1.axis('off')
	ax1.xaxis.pane.set_edgecolor('black')
	ax1.yaxis.pane.set_edgecolor('black')
	#################################################
	ax2.set_xlim((-xlim*radius,xlim*radius))
	ax2.set_ylim((-xlim*radius,xlim*radius))
	ax2.set_zlim((-0.3*radius,.7*radius))
	ax2.axis('off')
	ax2.xaxis.pane.set_edgecolor('black')
	ax2.yaxis.pane.set_edgecolor('black')
	#ax.xaxis.pane.fill = False
	#ax.yaxis.pane.fill = False
	#ax.zaxis.pane.fill = False
	########################################################################
	#                    Plotting the Strain vectors                       #
	########################################################################
	X = []
	Y = []
	Z = []
	U = []
	V = []
	W = []
	eigenvalue =[]
	eigenvalue1array = []
	eigenvalue2array = []
	eigenvalueratioarray = []
	eigenvaluedifferencearray = []
	faces = qd.CellFaceIterator(cell)
	face = faces.next()
	while face != None:
		if face.getID() == 1:
			face  = faces.next()
			continue
		if sf.checkExternalFace(face):
			face  = faces.next()
			continue
		eigenvec1 = face.getStressEigenVector1()
		eigenvec2 = face.getStressEigenVector2()
		eigenvalue1 = face.getStressEigenValue1()
		eigenvalue2 = face.getStressEigenValue2()
		eigenvalue.append(eigenvalue1)
		eigenvalue.append(eigenvalue2) 
		eigenvalue1array.append(eigenvalue1)
		eigenvalue2array.append(eigenvalue2)
		eigen1 = eigenvalue1
		eigen2 = eigenvalue2
		#ratio = (max(eigen1,eigen2)- min(eigen1,eigen2))/max(eigen1,eigen2)
		ratio = getAbsAnistropy(eigen1,eigen2)#(max(eigen1,eigen2)- min(eigen1,eigen2))/(eigen1+eigen2)
		diff = getDifference(eigen1,eigen2)
		eigenvalueratioarray.append(ratio)
		eigenvaluedifferencearray.append(diff)
		#########~~~ EIGEN VEC 1 ~~~#########
		#getting the centralised coordinate of centroid
		X.append(face.getXCentralised())
		Y.append(face.getYCentralised())
		Z.append(face.getZCentralised())
		#getting the vector headings
		U.append(qd.doublearray_getitem(eigenvec1,0))
		V.append(qd.doublearray_getitem(eigenvec1,1))
		W.append(qd.doublearray_getitem(eigenvec1,2))
		 #########~~~ EIGEN VEC 2 ~~~#########
		#getting the centralised coordinate of centroid
		X.append(face.getXCentralised())
		Y.append(face.getYCentralised())
		Z.append(face.getZCentralised())
		#getting the vector headings
		U.append(qd.doublearray_getitem(eigenvec2,0))
		V.append(qd.doublearray_getitem(eigenvec2,1))
		W.append(qd.doublearray_getitem(eigenvec2,2))
		#ax.scatter(X[-1],Y[-1],Z[-1])
		face = faces.next()
	###getting Maximum Eigenvalue ratio
	maxEigenValueRatio = (max(eigenvalueratioarray))
	minEigenValueRatio = (min(eigenvalueratioarray))
	maxEigenValue = max(map(abs,eigenvalue))
	maxEigendiff = max(eigenvaluedifferencearray)
	minEigendiff = min(eigenvaluedifferencearray)
	#print "Max Eigen Value Ration :", maxEigenValueRatio
	#print "Min Eigen Value Ratio :", minEigenValueRatio
	############################################
	#                 Plotting the Cell        #
	############################################
	######### Color Map A ######################
	jet1 = cm1 = plt.get_cmap(colormap) 
	maxvalue = 1.0
	minvalue = 0.
	normMax = 1 # value to normalize by
	cNorm1  = colors.Normalize(vmin=minvalue, vmax=maxvalue)
	scalarMap1 = cmx.ScalarMappable(norm=cNorm1, cmap=jet1)
	######### Color Map B ######################
	jet2 = cm2 = plt.get_cmap(colormap) 
	maxvalue = maxEigendiff
	minvalue = minEigendiff
	normMax = 1 # value to normalize by
	cNorm2  = colors.Normalize(vmin=minvalue, vmax=maxvalue)
	scalarMap2 = cmx.ScalarMappable(norm=cNorm2, cmap=jet2)
	###################
	faces = qd.CellFaceIterator(cell)
	###################
	face = faces.next()
	xcenarray = []
	ycenarray = []
	zcenarray = []
	while (face != None):
		if face.getID() == 1:
			face  = faces.next()
			continue
		faceid = face.getID()#grabbing face id
		xlist = []
		ylist = []
		zlist = []
		xproj = []
		yproj = []
		zproj = []
		#print "== Face ID : ", faceid, "=="
		xmean = face.getXCentralised()
		ymean = face.getYCentralised()
		zmean = face.getZCentralised()
		edges = qd.FaceEdgeIterator(face)
		edge = edges.next()
		while edge != None:
			####grabbing the origin of edge####
			#centralised coordiante
			vertex = edge.Org()
			#print vertex.getID()
			xCoord1 = vertex.getXcoordinate()
			yCoord1 = vertex.getYcoordinate()
			zCoord1 = vertex.getZcoordinate()
			xlist.append(xCoord1)
			ylist.append(yCoord1)
			zlist.append(zCoord1)
			edge = edges.next()
		xlist.append(xlist[0])
		ylist.append(ylist[0])
		zlist.append(zlist[0])
		verts = [zip(xlist, ylist,zlist)]
		#adding to 3d plot
		xcenarray.append(face.getXCentralised())
		ycenarray.append(face.getYCentralised())
		zcenarray.append(face.getZCentralised())
		eigenvec1 = face.getStressEigenVector1()
		eigenvec2 = face.getStressEigenVector2()
		eigenvalue1 = face.getStressEigenValue1()
		eigenvalue2 = face.getStressEigenValue2()
		eigenvalue.append(eigenvalue1)
		eigenvalue.append(eigenvalue2) 
		eigenvalue1array.append(eigenvalue1)
		eigenvalue2array.append(eigenvalue2)
		eigen1 = eigenvalue1
		eigen2 = eigenvalue2
		#ratio = (max(eigen1,eigen2)- min(eigen1,eigen2))/max(eigen1,eigen2)
		absratio = getAbsAnistropy(eigen1,eigen2)#(max(eigen1,eigen2)- min(eigen1,eigen2))/(eigen1+eigen2)
		diffratio = getDifference(eigen1,eigen2)#(max(eigen1,eigen2)- min(eigen1,eigen2))/(eigen1+eigen2)
		#####################################################################
		if sf.checkExternalFace(face):
			absratio = 0.
			diffratio = 0.
		#print "face ID : ", face.getID(), " ratio : ", ratio
		color1 = scalarMap1.to_rgba(absratio)
		color2 = scalarMap2.to_rgba(diffratio)
		#print face.getID(), ratio
		#print face.getZCentralised(), alpha_fac
		#ax.add_collection3d(arrow(xcen-0.5,ycen-0.5,zcen-0.5,xcen+0.5,ycen+0.5,zcen+0.5))
		pc = Poly3DCollection(verts,alpha = alpha,facecolor = color1,linewidths=1,zorder=0)
		pc.set_edgecolor('k')
		ax1.add_collection3d(pc)
		ax1.scatter(xcenarray[-1], ycenarray[-1],zcenarray[-1],c='r')
		###########################################################################################
		pc = Poly3DCollection(verts,alpha = alpha,facecolor = color2,linewidths=1,zorder=0)
		pc.set_edgecolor('k')
		ax2.add_collection3d(pc)
		ax2.scatter(xcenarray[-1], ycenarray[-1],zcenarray[-1],c='r')
		#ax.text(xcenarray[-1], ycenarray[-1],zcenarray[-1],face.getID(),fontsize = 18)        
		face = faces.next()
		#if face.getID() == 1: break
	#plt.clf()
	for i in range(len(X)):
		veclength = np.sqrt((U[i])**2+(V[i])**2+(W[i])**2)
		#print " veclength : ", veclength, (eigenvalue[i]/maxEigenValue)
		veclength *= (eigenvalue[i]/maxEigenValue)
		if veclength <= 0:
			colorvec = 'r'
		else:
			colorvec = 'k'
		plot1 = ax1.quiver(X[i], Y[i], Z[i], U[i], V[i], W[i],color=colorvec,length = veclength,pivot='tail',zorder=-1)
		plot2 = ax2.quiver(X[i], Y[i], Z[i], U[i], V[i], W[i],color=colorvec,length = veclength,pivot='tail',zorder=-1)
		#ax.quiver(X[i], Y[i], Z[i], U[i], V[i], W[i],color='k',pivot='tail',zorder=4)# for older matplotlib
	scalarMap1._A = []
	scalarMap2._A = []
	#cbar_ax = fig.add_axes([0.78, 0.2, 0.04, 0.55])
	#clrbar = plt.colorbar(scalarMap,shrink=0.5, aspect=10)
	#clrbar = plt.colorbar(scalarMap,cax = cbar_ax,ticks=np.linspace(minvalue,maxvalue,5))#,orientation='horizontal',cax = cbar_ax)
	clrbar1 = plt.colorbar(scalarMap1, ax=ax1,shrink = 0.5,aspect = 10,ticks=np.linspace(0,1,5))#,orientation='horizontal',cax = cbar_ax)
	clrbar1.set_label(r"Stress Anisotrophy $(s_a)$")
	clrbar2 = plt.colorbar(scalarMap2, ax=ax2,shrink = 0.5,aspect = 10, ticks=np.linspace(minvalue,maxvalue,5))#,orientation='horizontal',cax = cbar_ax)
	clrbar2.set_label(r"Stress Difference $(s_d)$")
	#ax.set_title("Time %d : Anisotrophy of Strain : Max %.4f Min %.4f"%(step,maxEigenValueRatio,minEigenValueRatio), fontsize = 20)
	#print xcenarray-0.5
	#plt.close("all")
	ax1.view_init(azim = azim, elev= elev)
	ax2.view_init(azim = azim, elev= elev)
	if save:
		saveDirectory = "strainFigures_u=%03d_v=%03d"%(azim,elev)+r"/stressSurface"
		import os
		if not os.path.exists(saveDirectory):
			os.makedirs(saveDirectory)
		#plt.tight_layout()
		#plt.savefig(saveDirectory+r"/strainSurface_Time=%03d.eps"%(step),dpi = 500,format='eps', transparent=True)
		plt.savefig(saveDirectory+r"/stressAnisotropy_Time=%03d.png"%(step),dpi = 500,format='png', transparent=True)
		plt.close()
	return# eigenvalueratioarray