StiffnessMatrixClass.f90 Source File


Contents


Source Code

module StiffnessMatrixClass
    use ShapeFunctionClass
    use MeshClass
    use StressClass
    use StrainClass

    implicit none

    ! Provides a set of Element-by-element stiffness matrix & RHS vector of internal force
    ! for all types of elements, all Strain Theory, and all constitutive models.

    type :: StiffnessMatrix_
        real(8),allocatable     :: Amat(:,:),bvec(:)   
        type(ShapeFunction_)    :: ShapeFunc
        type(Stress_),pointer   :: Stress
        type(Strain_),pointer   :: Strain


        integer :: TheoryID,ElemID,GpID
        
        character*40 :: StrainTheory
        
        ! Please input one of following keyphrases

        ! Finite_Elasticity
        ! Finite_ElastoPlasticity
        ! Infinitesimal_Elasticity
        ! Infinitesimal_ElastoPlasticity
        ! Small_strain
    contains
        procedure,public :: init    => initStiffnessMatrix
        procedure,public :: update  => updateStiffnessMatrix
    end type

contains

! ######################################
subroutine initStiffnessMatrix(obj,FEMDomain,Stress,Strain,withInit)
    class(StiffnessMatrix_),intent(inout)::obj
    !character(*),intent(in) :: StrainTheory
    class(FEMDomain_),intent(in) :: FEMDomain
    class(Stress_),target,intent(in) :: Stress
    class(Strain_),target,intent(in) :: Strain
    logical,optional,intent(in) :: withInit
    integer :: NumOfDim,NumOfNodePerElem

    obj%Stress => Stress
    obj%Strain => Strain
    ! create Stress/Strain measure objects
    !obj%StrainTheory = StrainTheory
    !call obj%Stress%init(StrainTheory)
    !call obj%Stress%init(StrainTheory)

    ! create a ShapeFunction object 
    NumOfDim         = size(FEMDomain%Mesh%NodCoord,2)
    NumOfNodePerElem = size(FEMDomain%Mesh%ElemNod,2)
    call obj%ShapeFunc%getType(NumOfDim=NumOfDim,NumOfNodePerElem=NumOfNodePerElem)
    call obj%ShapeFunc%setType()

    obj%ElemID=1
    obj%GpID=1

end subroutine
! ######################################

! ######################################
subroutine updateStiffnessMatrix(obj,Mesh,ElemID,MeshID)
    class(StiffnessMatrixClass_),intent(inout) :: obj
    class(Mesh_),intent(in) :: Mesh 
    integer,optional,intent(in) :: ElemID,MeshID
    integer :: ElemID_out,MeshID_out

    ! get element ID and Gauss-point-id
    if(present(ElemID))then
        ElemID_out=ElemID
    else
        ElemID_out=obj%ElemID
    endif
    if(present(GpID))then
        GpID_out=GpID
    else
        GpID_out=obj%GpID
    endif

    ! get all objects related to a shape function
    call obj%ShapeFunc%update(ElemType=obj%ShapeFunc%ElemType,&
        NodCoord=Mesh%NodCoordInit,NodCoord=Mesh%NodCoord_n,&
        ElemNod=Mesh%ElemNod,ElemID=ElemID_out,GpID=GpID_out)

    ! create strain tensor


    ! create stress tensor


    ! create stiffness matrix
    


    ! update element ID and Gauss-point-id
    obj%GpID = obj%GpID +1
    if(obj%GpID > size(obj%ShapeFunc%NumOfGp) )then
        ! go to next element
        obj%GpID = 1
        obj%ElemID =obj%ElemID + 1 
    else
        ! go to next Gauss point in the same element
        obj%GpID = obj%GpID + 1
    endif
end subroutine
! ######################################

end module