Пример #1
0
    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 []
Пример #2
0
    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()
Пример #3
0
    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()
Пример #4
0
    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()