# SPDX-License-Identifier: MIT
# Copyright (c) 2011–2026 Joris J.C. Remmers
from numpy import outer, ones, zeros
from pyfem.materials.MaterialManager import MaterialManager
[docs]
class elementData:
outputNames = []
#------------------------------------------------------------------------------
#
#------------------------------------------------------------------------------
[docs]
class Element ( list ):
dofTypes = []
#------------------------------------------------------------------------------
#
#------------------------------------------------------------------------------
def __init__ ( self, elnodes , props ):
list.__init__( self, elnodes )
self.family = "CONTINUUM"
self.history = {}
self.current = {}
self.solverStat = props.solverStat
for name,val in props:
if name == "material":
self.matProps = val
self.matProps.rank = props.rank
self.matProps.solverStat = self.solverStat
self.mat = MaterialManager( self.matProps )
setattr( self, name, val )
#------------------------------------------------------------------------------
#
#------------------------------------------------------------------------------
[docs]
def dofCount ( self ):
return len( self ) * len( self.dofTypes )
#------------------------------------------------------------------------------
#
#------------------------------------------------------------------------------
[docs]
def getNodes ( self ):
return self
#------------------------------------------------------------------------------
#
#------------------------------------------------------------------------------
[docs]
def getType ( self ):
return self.elemType
#------------------------------------------------------------------------------
#
#------------------------------------------------------------------------------
[docs]
def appendNodalOutput( self , labels , data , weight = 1.0 ):
for i,name in enumerate(labels):
if not hasattr( self.globdat , name ):
self.globdat.outputNames.append( name )
setattr( self.globdat, name , zeros( len(self.globdat.nodes) ) )
setattr( self.globdat, name + 'Weights' , zeros( len(self.globdat.nodes) ) )
outMat = getattr( self.globdat , name )
outWeights = getattr( self.globdat , name + 'Weights' )
if data.ndim == 1:
for idx in self.globdat.nodes.getIndices( self ):
outMat[ idx ] += data[i]
outWeights[ idx ] += weight
else:
for j,idx in enumerate(self.globdat.nodes.getIndices( self )):
outMat[ idx ] += data[j,i]
outWeights[ idx ] += weight
#------------------------------------------------------------------------------
#
#------------------------------------------------------------------------------
[docs]
def appendElementOutput( self , labels , data , weight = 1.0 ):
if not hasattr( self.globdat , "elementData" ):
setattr( self.globdat, "elementData" , elementData() )
elemData = getattr( self.globdat , "elementData" )
for i,name in enumerate(labels):
if not hasattr( elemData , name ):
elemData.outputNames.append( name )
setattr( elemData, name , zeros( len(self.globdat.elements) ) )
setattr( elemData, name + 'Weights' , zeros( len(self.globdat.elements) ) )
outMat = getattr( elemData , name )
outWeights = getattr( elemData , name + 'Weights' )
if data.ndim == 1:
outMat[ self.iElm ] += data[i]
outWeights[ self.iElm ] += weight
#------------------------------------------------------------------------------
#
#------------------------------------------------------------------------------
[docs]
def setHistoryParameter ( self, name, val ):
self.current[name] = val
#------------------------------------------------------------------------------
#
#------------------------------------------------------------------------------
[docs]
def getHistoryParameter ( self, name ):
return self.history[name]
#------------------------------------------------------------------------------
#
#------------------------------------------------------------------------------
[docs]
def commitHistory ( self ):
self.history = self.current.copy()
self.current = {}
if hasattr( self , "mat" ):
self.mat.commitHistory()
[docs]
def commit ( self, elemdat ):
pass
#
#
#
[docs]
def loadFactor( self ):
return self.solverStat.lam