Konstantin8105/f4go

View on GitHub
testdata/feappv-master/elements/solid3d/iner3d.f

Summary

Maintainability
Test Coverage
!$Id:$
      subroutine iner3d(d,xl,vl,al,s,r, nel,ndf,ndm,nst)

!-----[--.----+----.----+----.-----------------------------------------]
!      Purpose: Compute inertial effects for 3-d elements
!               Includes effects of Rayleigh mass damping.

!      Inputs:
!         d(*)      - Material set parameters
!         xl(ndm,*) - Nodal coordinates for element
!         vl(ndf,*) - Velocity for element
!         al(ndf,*) - Acceleration for element
!         ctan3     - Mass tangent factor
!         nel       - Number of element nodes
!         ndf       - Number dof/node
!         ndm       - Spatial dimension of mesh
!         nst       - Size of element arrays

!      Outputs:
!         s(nst,*)  - Consistent or interpolated mass
!         r(ndf,*)  - Element inertial force
!-----[--.----+----.----+----.-----------------------------------------]
      implicit  none

      include  'eltran.h'   ! ctan(3)

      logical       :: tetfl
      integer       :: nel,ndf,ndm,nst, i,ii,i1, jj,j1, l,lint
      real (kind=8) :: xsj,dv,dvm, aj1,aj2,lfac,cfac
      real (kind=8) :: d(*),xl(ndm,nel),vl(ndf,nel),al(ndf,nel)
      real (kind=8) :: s(nst,nst),r(ndf,nel)
      real (kind=8) :: shp(4,8),sg(4,9),sv(5,16), cmass(8,8)

      save

!     Compute mass quadrature

      if(nel.eq.4) then
        tetfl = .true.
        l     =  2
        call tint3d (l,lint,sv)
      else
        tetfl = .false.
        l     = nint(d(5))
        call int3d(l,lint,sg)
      endif

!     Set mass interpolation factor between consistent (1) and lumped (0)

      cfac = d(7)
      lfac = 1.d0 - cfac
      dvm  = ctan(3) + d(77)*ctan(2)

!     Initialize mass

      do jj = 1,nel
        do ii = 1,nel
          cmass(ii,jj) = 0.0d0
        end do ! ii
      end do ! jj

      do l = 1,lint

!       Compute shape functions

        if(tetfl) then
          call tetshp(sv(1,l),xl,ndm,xsj,shp)
          dv = sv(5,l)*xsj*d(4)
        else
          call shp3d(sg(1,l),xsj,shp,xl,ndm)
          dv = sg(4,l)*xsj*d(4)
        endif

!       Compute mass

        do jj = 1,nel

!         Compute db = rho*shape*dv

          aj1 = shp(4,jj)*dv
          aj2 = cfac*aj1
          aj1 = lfac*aj1
          cmass(jj,jj) = cmass(jj,jj) + aj1
          do ii = 1,nel
            cmass(ii,jj) = cmass(ii,jj) + shp(4,ii)*aj2
          end do ! ii
        end do ! jj

      end do ! l

!     Compute inertial effect

      do ii = 1,nel
        do jj = 1,nel
          do i = 1,3
            r(i,ii) = r(i,ii) - (al(i,jj) + d(77)*vl(i,jj))*cmass(ii,jj)
          end do ! i
        end do ! jj
      end do ! ii

!     Expand mass into element array

      j1 = 0
      do jj = 1,nel
        i1 = 0
        do ii = 1,nel
          cmass(ii,jj) = cmass(ii,jj)*dvm
          do i = 1,ndm
            s(i1+i,j1+i) = s(i1+i,j1+i) + cmass(ii,jj)
          end do ! i
          i1 = i1 + ndf
        end do ! ii
        j1 = j1 + ndf
      end do ! jj

      end subroutine iner3d