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
Example #2
0
    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
Example #3
0
    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
Example #4
0
 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)
Example #5
0
 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()
Example #7
0
    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