Source code for pyfem.elements.CondensationManager

# SPDX-License-Identifier: MIT
# Copyright (c) 2011–2026 Joris J.C. Remmers


from numpy import zeros,dot
from scipy.linalg import eigvals,inv

#==============================================================================
#
#==============================================================================

[docs] class CondensationManager(): def __init__( self , condDOF , totDOF ): self.condDOF = condDOF self.totDOF = totDOF self.intDOF = self.totDOF - self.condDOF self.kwuold = zeros( shape=( self.condDOF , self.intDOF ) ) self.kwwinvold = zeros( shape=( self.intDOF , self.intDOF ) ) self.fwold = zeros( self.intDOF ) self.kwunew = zeros( shape=( self.condDOF , self.intDOF ) ) self.kwwinvnew = zeros( shape=( self.intDOF , self.intDOF ) ) self.fwnew = zeros( self.intDOF ) self.uold = zeros( self.condDOF ) self.wold = zeros( self.intDOF ) self.unew = zeros( self.condDOF ) self.wnew = zeros( self.intDOF ) self.activeFlag= False #------------------------------------------------------------------------------ # #------------------------------------------------------------------------------
[docs] def decondensate( self , elemdat ): self.storeU( elemdat.state ) elemdat.state0 = elemdat.state - elemdat.Dstate if self.activeFlag: tmpArray = dot( self.getKwu().T , elemdat.Dstate ) tmpArray += self.getFw() elemdat.dw = -1.*dot( self.getKwwinv() , tmpArray ) elemdat.w = self.getWold() + elemdat.dw else: elemdat.dw = zeros( self.intDOF ) elemdat.w = zeros( self.intDOF ) self.storeW( elemdat.w ) elemdat.fullstiff = zeros( shape=( self.totDOF , self.totDOF ) ) elemdat.fullfint = zeros( self.totDOF )
#------------------------------------------------------------------------------ # #------------------------------------------------------------------------------
[docs] def condensate( self , elemdat ): if self.activeFlag: kwwinv = inv( elemdat.fullstiff[self.condDOF:,self.condDOF:] ) kwu = elemdat.fullstiff[self.condDOF:,:self.condDOF] fw = elemdat.fullfint[self.condDOF:] self.storeKwwinv( kwwinv ) self.storeKwu ( kwu ) self.storeFw ( fw ) elemdat.stiff = elemdat.fullstiff[:self.condDOF,:self.condDOF] - \ dot( elemdat.fullstiff[:self.condDOF, self.condDOF:] , \ dot( kwwinv , kwu ) ) elemdat.fint = elemdat.fullfint[:self.condDOF] - \ dot( elemdat.fullstiff[:self.condDOF,self.condDOF:] , \ dot( kwwinv , fw ) ) else: elemdat.stiff = elemdat.fullstiff[:self.condDOF,:self.condDOF] elemdat.fint = elemdat.fullfint[:self.condDOF]
#------------------------------------------------------------------------------ # #------------------------------------------------------------------------------
[docs] def commit( self ): self.kwuold , self.kwunew = self.kwunew , self.kwuold self.kwwinvold , self.kwwinvnew = self.kwwinvnew , self.kwwinvold self.fwold , self.fwnew = self.fwnew , self.fwold self.uold , self.unew = self.unew , self.uold self.wold , self.wnew = self.wnew , self.wold self.activeFlag = True
#------------------------------------------------------------------------------ # #------------------------------------------------------------------------------
[docs] def storeU( self , u ): self.unew = u
#------------------------------------------------------------------------------ # #------------------------------------------------------------------------------
[docs] def storeW( self , w ): self.wnew = w
#------------------------------------------------------------------------------ # #------------------------------------------------------------------------------
[docs] def storeKwu( self , kwu ): self.kwunew = kwu
#------------------------------------------------------------------------------ # #------------------------------------------------------------------------------
[docs] def storeKwwinv( self , kwwinv ): self.kwwinvnew = kwwinv
#------------------------------------------------------------------------------ # #------------------------------------------------------------------------------
[docs] def storeFw( self , fw ): self.fwnew = fw
#------------------------------------------------------------------------------ # #------------------------------------------------------------------------------
[docs] def getUold( self ): return self.uold
#------------------------------------------------------------------------------ # #------------------------------------------------------------------------------
[docs] def getWold( self ): return self.wold
#------------------------------------------------------------------------------ # #------------------------------------------------------------------------------
[docs] def getKwu( self ): return self.kwuold
#------------------------------------------------------------------------------ # #------------------------------------------------------------------------------
[docs] def getKwwinv( self ): return self.kwwinvold
#------------------------------------------------------------------------------ # #------------------------------------------------------------------------------
[docs] def getFw( self ): return self.fwold