def Step2Operators(self,node,elemp,dofmap,elemu=None): if elemu==None: elemu = elemp mpdata = basic.DelayedAssm(elemp,1) kpdata = basic.DelayedAssm(elemp,1) gpdata = basic.DelayedAssm(elemp,self.sdim) etype = None ee=0 for e in elemp: ecoord = node[e.Connectivity(),:] if ( not etype==e.Type() ): etype = e.Type() qr = e.QuadratureRule(2*(e.Order())) nne = e.NumNodes() me = np.zeros((nne,nne),basic.FLOAT_TYPE) ke = np.zeros((nne,nne),basic.FLOAT_TYPE) ge = np.zeros((nne,self.sdim*nne),basic.FLOAT_TYPE) for q in xrange(qr[1].size): qpt = qr[0][q] qwt = qr[1][q] N = e.N(qpt) Nu = elemu[ee].N(qpt) dNdx, jac = e.dNdx(ecoord,qpt) c=1.0 # ????^-1QUE???? me = me + (1/c**2)*(np.outer(N,N))*jac*qwt ke = ke + np.dot(dNdx,dNdx.T)*jac*qwt for i in xrange(self.sdim): ge[:,i::self.sdim] = ge[:,i::self.sdim] + (np.outer(dNdx[:,i],Nu))*jac*qwt sctru = dofmap.Sctr(e.Connectivity()) sctrp = e.Connectivity() mpdata.AddLocalMatrix(me,sctrp) kpdata.AddLocalMatrix(ke,sctrp) gpdata.AddLocalMatrix(ge,sctrp,sctru) ee=ee+1 return [ mpdata.GetCsrMatrix(), kpdata.GetCsrMatrix(), gpdata.GetCsrMatrix() ] def Step2Influx(self,node,inflowbc): return []
def ComputeStiffness(self, elements, node, dofMap): kdata = basic.DelayedAssm(elements, self.dpn) etype = None mtype = None for eid, e in elements.iteritems(): if (not etype == e.Type()): etype = e.Type() qr = e.QuadratureRule(2 * (e.Order())) nne = e.NumNodes() if (not e.Material() == mtype): mtype = e.prop['Matl'] k = mtype['kappa'] ecoord = node[e.Connectivity()] sctr = dofMap.Sctr(e.Connectivity(), [0]) ke = np.zeros((nne, nne)) for q in xrange(qr[1].size): qpt = qr[0][q] qwt = qr[1][q] [dNdx, jac] = e.dNdx(ecoord, qpt) ke = ke + np.dot(dNdx, dNdx.T) * k * jac * qwt # scatter ke into K kdata.AddLocalMatrix(ke, sctr) return kdata.GetCsrMatrix()
def ComputeMass(self, node, element, dofMap=None): etype = None mtype = None if (dofMap == None): dofMap = dmap.FixedDofMap(self.dpn) #mespace = len(element)*(element[0].NumNodes()*self.dpn)**2 mdata = basic.DelayedAssm(element, self.dpn) for e in element: ecoord = node[e.Connectivity(), :] if (not etype == e.Type()): etype = e.Type() qr = e.QuadratureRule(2 * (e.Order())) nne = e.NumNodes() if (not e.Material() == mtype): mtype = e.prop.material rho = mtype.matprop['rho'] me = np.zeros((nne, nne)) for q in xrange(qr[1].size): qpt = qr[0][q] qwt = qr[1][q] jac = e.Jacobian(ecoord, qpt) N = e.N(qpt) me = me + rho * np.outer(N, N) * jac * qwt # scatter me into M for s in self.SpacialDim(): sctr = dofMap.Sctr(e.Connectivity(), s) mdata.AddLocalMatrix(me, sctr) return mdata.GetCsrMatrix()
def ComputeStiffness(self, node, element, dofMap=None): etype = None mtype = None if (dofMap == None): dofMap = dmap.FixedDofMap(self.dpn) #kespace = len(element)*(element[0].NumNodes()*self.dpn)**2 kdata = basic.DelayedAssm(element, self.dpn) for e in element: ecoord = node[e.Connectivity(), :] #pdb.set_trace() sctr = dofMap.Sctr(e.Connectivity(), dofMap.LDOFs()) if (not etype == e.Type()): etype = e.Type() qr = e.QuadratureRule(2 * (e.Order())) kdim = e.NumNodes() * self.dpn if (not e.Material() == mtype): mtype = e.prop.material C = self.GetMaterialStiffness(e) ke = np.zeros((kdim, kdim)) for q in xrange(qr[1].size): qpt = qr[0][q] qwt = qr[1][q] ipm = e.BMat(ecoord, qpt) jac = ipm[1] B = ipm[0] ke = ke + np.dot(np.dot(B.T, C), B) * jac * qwt # scatter ke into K kdata.AddLocalMatrix(ke, sctr) return kdata.GetCsrMatrix()