def __GetLocalStiffness__(self, function_space, material, LagrangeElemCoords, EulerELemCoords, fem_solver, elem=0): """Get stiffness matrix of the system""" # GET LOCAL KINEMATICS SpatialGradient, F, detJ, dV = _KinematicMeasures_( function_space.Jm, function_space.AllGauss[:, 0], LagrangeElemCoords, EulerELemCoords, fem_solver.requires_geometry_update) # PARAMETERS FOR INCOMPRESSIBILITY (MEAN DILATATION METHOD HU-WASHIZU) if material.is_nearly_incompressible: stiffness_k = self.VolumetricStiffnessIntegrand( material, SpatialGradient, detJ, dV) # COMPUTE WORK-CONJUGATES AND HESSIAN AT THIS GAUSS POINT CauchyStressTensor, H_Voigt = material.KineticMeasures(F, elem=elem) # COMPUTE LOCAL CONSTITUTIVE STIFFNESS AND TRACTION stiffness, tractionforce = __ConstitutiveStiffnessIntegrandDF__( SpatialGradient, CauchyStressTensor, H_Voigt, detJ, self.nvar, fem_solver.requires_geometry_update) # COMPUTE GEOMETRIC STIFFNESS if material.nature != "linear": stiffness += self.__GeometricStiffnessIntegrand__( SpatialGradient, CauchyStressTensor, detJ) if material.is_nearly_incompressible: stiffness += stiffness_k return stiffness, tractionforce
def __GetLocalStiffness__(self, function_space, material, LagrangeElemCoords, EulerELemCoords, ElectricPotentialElem, fem_solver, elem=0): """Get stiffness matrix of the system""" # GET LOCAL KINEMATICS SpatialGradient, F, detJ = _KinematicMeasures_( function_space.Jm, function_space.AllGauss[:, 0], LagrangeElemCoords, EulerELemCoords, fem_solver.requires_geometry_update) # GET ELECTRIC FIELD ElectricFieldx = -np.einsum('ijk,j', SpatialGradient, ElectricPotentialElem) # COMPUTE WORK-CONJUGATES AND HESSIAN AT THIS GAUSS POINT ElectricDisplacementx, _, H_Voigt = material.KineticMeasures( F, ElectricFieldx, elem=elem) # COMPUTE LOCAL CONSTITUTIVE STIFFNESS AND TRACTION stiffness, tractionforce = __ConstitutiveStiffnessIntegrandLaplacian__( SpatialGradient, ElectricDisplacementx, H_Voigt, detJ, self.nvar, fem_solver.requires_geometry_update) return stiffness, tractionforce
def __GetLocalTraction__(self, function_space, material, LagrangeElemCoords, EulerELemCoords, ElectricPotentialElem, fem_solver, elem=0): """Get traction vector of the system""" # GET LOCAL KINEMATICS SpatialGradient, F, detJ = _KinematicMeasures_( function_space.Jm, function_space.AllGauss[:, 0], LagrangeElemCoords, EulerELemCoords, fem_solver.requires_geometry_update) # GET ELECTRIC FIELD ElectricFieldx = -np.einsum('ijk,j', SpatialGradient, ElectricPotentialElem) # COMPUTE WORK-CONJUGATES AND HESSIAN AT THIS GAUSS POINT ElectricDisplacementx, CauchyStressTensor, _ = material.KineticMeasures( F, ElectricFieldx, elem=elem) # COMPUTE LOCAL CONSTITUTIVE STIFFNESS AND TRACTION tractionforce = __TractionIntegrandDPF__( SpatialGradient, ElectricDisplacementx, CauchyStressTensor, detJ, material.H_VoigtSize, self.nvar, fem_solver.requires_geometry_update) return tractionforce
def __GetLocalMass__(self, function_space, material, LagrangeElemCoords, EulerELemCoords, fem_solver, elem): # GET LOCAL KINEMATICS _, _, detJ = _KinematicMeasures_(function_space.Jm, function_space.AllGauss[:, 0], LagrangeElemCoords, EulerELemCoords, False) return __MassIntegrand__(material.rho, function_space.Bases, detJ, material.ndim, material.nvar)
def __GetLocalMass_Efficient__(self, function_space, material, LagrangeElemCoords, EulerELemCoords, fem_solver, elem): """Computes elemental mass matrix in a very efficient way by computing rhoNN only once""" # GET LOCAL KINEMATICS _, _, detJ = _KinematicMeasures_(function_space.Jm, function_space.AllGauss[:, 0], LagrangeElemCoords, EulerELemCoords, False) return __ConstantMassIntegrand__(self.constant_mass_integrand, detJ)
def GetAverageJacobian(self, function_space, LagrangeElemCoords, EulerELemCoords, requires_geometry_update, elem=0): """ Find the average Jacobian of element [could be curved or straight] """ # GET LOCAL KINEMATICS detJ = _KinematicMeasures_(function_space.Jm, function_space.AllGauss[:, 0], LagrangeElemCoords, EulerELemCoords, requires_geometry_update)[2] return detJ.mean()
def GetVolume(self, function_space, LagrangeElemCoords, EulerELemCoords, requires_geometry_update, elem=0): """ Find the volume (area in 2D) of element [could be curved or straight] """ # GET LOCAL KINEMATICS detJ = _KinematicMeasures_(function_space.Jm, function_space.AllGauss[:,0], LagrangeElemCoords, EulerELemCoords, requires_geometry_update)[2] # volume = 0. # LOOP OVER GAUSS POINTS # for counter in range(function_space.AllGauss.shape[0]): # volume += detJ[counter] # return volume return detJ.sum()
def K_uu(self, material, fem_solver, Eulerx, Eulerp=None, elem=0): """Get stiffness matrix of the system""" meshes = self.meshes mesh = self.meshes[0] function_spaces = self.function_spaces function_space = self.function_spaces[0] ndim = self.ndim nvar = self.nvar nodeperelem = meshes[0].elements.shape[1] # print nodeperelem # GET THE FIELDS AT THE ELEMENT LEVEL LagrangeElemCoords = mesh.points[mesh.elements[elem,:],:] EulerELemCoords = Eulerx[mesh.elements[elem,:],:] Jm = function_spaces[0].Jm AllGauss = function_space.AllGauss # GET LOCAL KINEMATICS SpatialGradient, F, detJ = _KinematicMeasures_(Jm, AllGauss[:,0], LagrangeElemCoords, EulerELemCoords, fem_solver.requires_geometry_update) # COMPUTE WORK-CONJUGATES AND HESSIAN AT THIS GAUSS POINT CauchyStressTensor, H_Voigt, _ = material.KineticMeasures(F,elem=elem) # COMPUTE LOCAL CONSTITUTIVE STIFFNESS AND TRACTION stiffness, tractionforce = __ConstitutiveStiffnessIntegrandDF__(SpatialGradient, CauchyStressTensor,H_Voigt,detJ,self.nvar,fem_solver.requires_geometry_update) # # COMPUTE GEOMETRIC STIFFNESS # if fem_solver.requires_geometry_update: # stiffness += self.__GeometricStiffnessIntegrand__(SpatialGradient,CauchyStressTensor,detJ) # SAVE AT THIS GAUSS POINT self.SpatialGradient = SpatialGradient self.detJ = detJ return stiffness, tractionforce