flagshyp.f90
来自「大应变超弹性平面分析程序」· F90 代码 · 共 1,766 行 · 第 1/5 页
F90
1,766 行
dsh0x (xi, et, ze) = 0
!
dsh1e (xi, et, ze) = 4 * (xi + et + ze) - 3
dsh2e (xi, et, ze) = 0
dsh3e (xi, et, ze) = 4 * et - 1
dsh4e (xi, et, ze) = 0
dsh5e (xi, et, ze) = - 4 * xi
dsh6e (xi, et, ze) = 4 * xi
dsh7e (xi, et, ze) = 4 * (1 - xi - 2 * et - ze)
dsh8e (xi, et, ze) = - 4 * ze
dsh9e (xi, et, ze) = 0
dsh0e (xi, et, ze) = 4 * ze
!
dsh1z (xi, et, ze) = 4 * (xi + et + ze) - 3
dsh2z (xi, et, ze) = 0
dsh3z (xi, et, ze) = 0
dsh4z (xi, et, ze) = 4 * ze - 1
dsh5z (xi, et, ze) = - 4 * xi
dsh6z (xi, et, ze) = 0
dsh7z (xi, et, ze) = - 4 * et
dsh8z (xi, et, ze) = 4 * (1 - xi - et - 2 * ze)
dsh9z (xi, et, ze) = 4 * xi
dsh0z (xi, et, ze) = 4 * et
!
! Constructs the data base. First Gauss point position and weight
!
DO ig = 1, 5
IF ( ig == 1 ) then
eledb (1, 11, ig) = - 0.1333333333333333d0
ELSE
eledb (1, 11, ig) = 0.075d0
END IF
xi = gauss (1, ig)
et = gauss (2, ig)
ze = gauss (3, ig)
eledb (2, 11, ig) = xi
eledb (3, 11, ig) = et
eledb (4, 11, ig) = ze
!
! Shape functions and derivatives
!
eledb (1, 1, ig) = shap1 (xi, et, ze)
eledb (2, 1, ig) = dsh1x (xi, et, ze)
eledb (3, 1, ig) = dsh1e (xi, et, ze)
eledb (4, 1, ig) = dsh1z (xi, et, ze)
eledb (1, 2, ig) = shap2 (xi, et, ze)
eledb (2, 2, ig) = dsh2x (xi, et, ze)
eledb (3, 2, ig) = dsh2e (xi, et, ze)
eledb (4, 2, ig) = dsh2z (xi, et, ze)
eledb (1, 3, ig) = shap3 (xi, et, ze)
eledb (2, 3, ig) = dsh3x (xi, et, ze)
eledb (3, 3, ig) = dsh3e (xi, et, ze)
eledb (4, 3, ig) = dsh3z (xi, et, ze)
eledb (1, 4, ig) = shap4 (xi, et, ze)
eledb (2, 4, ig) = dsh4x (xi, et, ze)
eledb (3, 4, ig) = dsh4e (xi, et, ze)
eledb (4, 4, ig) = dsh4z (xi, et, ze)
eledb (1, 5, ig) = shap5 (xi, et, ze)
eledb (2, 5, ig) = dsh5x (xi, et, ze)
eledb (3, 5, ig) = dsh5e (xi, et, ze)
eledb (4, 5, ig) = dsh5z (xi, et, ze)
eledb (1, 6, ig) = shap6 (xi, et, ze)
eledb (2, 6, ig) = dsh6x (xi, et, ze)
eledb (3, 6, ig) = dsh6e (xi, et, ze)
eledb (4, 6, ig) = dsh6z (xi, et, ze)
eledb (1, 7, ig) = shap7 (xi, et, ze)
eledb (2, 7, ig) = dsh7x (xi, et, ze)
eledb (3, 7, ig) = dsh7e (xi, et, ze)
eledb (4, 7, ig) = dsh7z (xi, et, ze)
eledb (1, 8, ig) = shap8 (xi, et, ze)
eledb (2, 8, ig) = dsh8x (xi, et, ze)
eledb (3, 8, ig) = dsh8e (xi, et, ze)
eledb (4, 8, ig) = dsh8z (xi, et, ze)
eledb (1, 9, ig) = shap9 (xi, et, ze)
eledb (2, 9, ig) = dsh9x (xi, et, ze)
eledb (3, 9, ig) = dsh9e (xi, et, ze)
eledb (4, 9, ig) = dsh9z (xi, et, ze)
eledb (1, 10, ig) = shap0 (xi, et, ze)
eledb (2, 10, ig) = dsh0x (xi, et, ze)
eledb (3, 10, ig) = dsh0e (xi, et, ze)
eledb (4, 10, ig) = dsh0z (xi, et, ze)
END DO
END SUBROUTINE tetr10db
!-----------------------------------------------------------------------
SUBROUTINE quad4db (eledb)
!-----------------------------------------------------------------------
!
! Four noded quadrilateral definintion
!
!-----------------------------------------------------------------------
!
IMPLICIT DOUBLE PRECISION (a - h, o - z)
PARAMETER (gauss = 0.577350269189626d0)
DIMENSION eledb (3, 5, 4), node (2, 4)
!
! Positions of the nodes (and Gauss points if multiplied by 0.577...
! in the parametric plane
!
DATA (node (i, 1), i = 1, 2) / - 1, - 1 /
DATA (node (i, 2), i = 1, 2) / 1, - 1 /
DATA (node (i, 3), i = 1, 2) / 1, 1 /
DATA (node (i, 4), i = 1, 2) / - 1, 1 /
!
! shape functions and derivatives ! obsolete under f95
!
shap (xi, et, in) = (1 + node (1, in) * xi) &
* (1 + node (2, in) * et) / 4.d0
dshx (xi, et, in) = node (1, in) * (1 + node (2, in) * et) / 4.d0
dshe (xi, et, in) = node (2, in) * (1 + node (1, in) * xi) / 4.d0
!
! constructs the data base. first positions of Gauss points
! and weights
!
DO ig = 1, 4
xi = float (node (1, ig) ) * gauss
et = float (node (2, ig) ) * gauss
eledb (1, 5, ig) = 1.d0
eledb (2, 5, ig) = xi
eledb (3, 5, ig) = et
!
! Shape functions and derivatives
!
DO in = 1, 4
eledb (1, in, ig) = shap (xi, et, in)
eledb (2, in, ig) = dshx (xi, et, in)
eledb (3, in, ig) = dshe (xi, et, in)
END DO
END DO
END SUBROUTINE quad4db
!-----------------------------------------------------------------------
SUBROUTINE hexa8db (eledb)
!-----------------------------------------------------------------------
!
! Eight noded hexahedron definintion
!
!-----------------------------------------------------------------------
!
IMPLICIT DOUBLE PRECISION (a - h, o - z)
PARAMETER (gauss = 0.577350269189626d0)
DIMENSION eledb (4, 9, 8), node (3, 8)
!
! Positions of the nodes (and Gauss points if multiplied by 0.577...
! in the parametric plane
!
DATA (node (i, 1), i = 1, 3) / - 1, - 1, - 1 /
DATA (node (i, 2), i = 1, 3) / 1, - 1, - 1 /
DATA (node (i, 3), i = 1, 3) / 1, 1, - 1 /
DATA (node (i, 4), i = 1, 3) / - 1, 1, - 1 /
DATA (node (i, 5), i = 1, 3) / - 1, - 1, 1 /
DATA (node (i, 6), i = 1, 3) / 1, - 1, 1 /
DATA (node (i, 7), i = 1, 3) / 1, 1, 1 /
DATA (node (i, 8), i = 1, 3) / - 1, 1, 1 /
!
! shape functions and derivatives ! obsolete under f95
!
shap (xi, et, ze, in) = (1 + node (1, in) * xi) &
* (1 + node (2, in) * et) &
* (1 + node (3, in) * ze) / 8.d0
dshx (xi, et, ze, in) = node (1, in) * (1 + node (2, in) * et) &
* (1 + node (3, in) * ze) / 8.d0
dshe (xi, et, ze, in) = node (2, in) * (1 + node (1, in) * xi) &
* (1 + node (3, in) * ze) / 8.d0
dshz (xi, et, ze, in) = node (3, in) * (1 + node (2, in) * et) &
* (1 + node (1, in) * xi) / 8.d0
!
! constructs the data base. First positions of Gauss points
! and weights
!
DO ig = 1, 8
eledb (1, 9, ig) = 1.d0
xi = float (node (1, ig) ) * gauss
et = float (node (2, ig) ) * gauss
ze = float (node (3, ig) ) * gauss
eledb (2, 9, ig) = xi
eledb (3, 9, ig) = et
eledb (4, 9, ig) = ze
!
! Shape functions and derivatives
!
DO in = 1, 8
eledb (1, in, ig) = shap (xi, et, ze, in)
eledb (2, in, ig) = dshx (xi, et, ze, in)
eledb (3, in, ig) = dshe (xi, et, ze, in)
eledb (4, in, ig) = dshz (xi, et, ze, in)
END DO
END DO
END SUBROUTINE hexa8db
!-----------------------------------------------------------------------
SUBROUTINE innodes (mpoin, ndime, npoin, x, icode, ldgof)
!-----------------------------------------------------------------------
!
! Reads initial nodal coordinates
!
! mpoin --> maximum number of nodes
! ndime --> number of dimensions
! npoin --> number of points
! x --> nodal coordinates
! icode --> boundary codes:
!
! 0: free
! 1: x fixed
! 2: y fixed
! 3: x+y fixed
! 4: z fixed
! 5: x+z fixed
! 6: y+z fixed
! 7: x+y+z fixed
!
! ldgof --> boundary code (1 or 0) for each degree of freedom
! corresponding to each node. Later degree of freedom
! numbers for each node.
!
!-----------------------------------------------------------------------
!
IMPLICIT DOUBLE PRECISION (a - h, o - z)
!b DIMENSION x (ndime, * ), icode ( * ), ldgof (ndime, * )
INTEGER, INTENT (IN) :: mpoin, ndime
INTEGER, INTENT (OUT) :: npoin
INTEGER, INTENT (OUT) :: icode (mpoin), ldgof (ndime, mpoin)
DOUBLE PRECISION, INTENT (OUT) :: x (ndime, mpoin)
!
! First reads in the total number of nodes
!
READ (1, *, err = 10) npoin
IF ( npoin > mpoin ) then
WRITE (6, 100) npoin
100 FORMAT('innodes: problem dimensions exceed maximum, ', &
& 'set mpoin to:',i10)
STOP 'innodes: dimensions exceed mpoin'
END IF
!
! Reads nodal coordinates and boundary codes
!
DO jp = 1, npoin
READ (1, *, err = 10) ip, icode (ip), &
(x (id, ip), id = 1, ndime)
END DO
!
! Initialises the degree of freedom array ldgof
!
DO ip = 1, npoin
ic = icode (ip)
DO id = 1, ndime
ic0 = ic
ic = ic / 2
ldgof (id, ip) = ic0 - ic * 2
END DO
END DO
RETURN
!
10 WRITE (6, '(a)') ' error reading nodal coordinates'
STOP 'innodes: dimensions exceed mpoin'
!
END SUBROUTINE innodes
!-----------------------------------------------------------------------
SUBROUTINE inelems (melem, nelem, nnode, lnods, matno, nmats)
!-----------------------------------------------------------------------
!
! Reads in the element connectivities
!
! melem --> maximum number of elements
! nelem --> number of elements
! nnode --> number of nodes per element
! lnods --> nodal conectivities of dimensions (nnode,nelem)
! matno --> material number of each element
! nmats --> number of materials
!
!-----------------------------------------------------------------------
!
IMPLICIT DOUBLE PRECISION (a - h, o - z)
DIMENSION lnods (nnode, * ), matno ( * )
!
! First reads the number of elements
!
READ (1, *, err = 10) nelem
IF ( nelem > melem ) then
WRITE (6, 100) nelem
100 FORMAT('inelems: problem dimensions exceed maximum, ', &
& 'set melem to:',i10)
STOP 'inelems: dimensions exceed melem'
END IF
nmats = 0
!
! Reads in element connectivities and material types
!
DO je = 1, nelem
READ (1, *, err = 10) ie, matno (ie), &
(lnods (in, ie), in = 1, nnode)
nmats = max (nmats, matno (ie) )
END DO
RETURN
!
10 WRITE (1, '(a)') ' Error reading element connectivities'
STOP 'inelems: dimensions exceed melem'
END SUBROUTINE inelems
!-----------------------------------------------------------------------
SUBROUTINE nodecon (npoin, nelem, nnode, lnods, nconn)
!-----------------------------------------------------------------------
!
! Determines the node to node connectivities and stores them
! in nconn as a linked list
!
! npoin --> number of mesh nodes
! nelem --> number of elements
! nnode --> number of nodes per element
! lnods --> element nodal connectivities
! nconn --> nodal connectivities as a linked list of dimensions
! (2,total number of node to node connexions):
!
! | number of nodes connected to node 1,.... |
! | position of next node conected to 1,.... |
!
!-----------------------------------------------------------------------
!
IMPLICIT DOUBLE PRECISION (a - h, o - z)
DIMENSION lnods (nnode, * ), nconn (2, * )
!
! Initialises the matrix nconn to zero and sets the first
! free position in nconn to npoin+1
!
DO ip = 1, npoin
nconn (1, ip) = 0
nconn (2, ip) = 0
END DO
nfree = npoin + 1
!
! Loop over the elements to examine all nodal connexions
!
DO ie = 1, nelem
DO in = 1, nnode
ip = lnods (in, ie)
DO jn = 1, nnode
jp = lnods (jn, ie)
IF ( jp /= ip ) then
!
! Node jp is connected to node ip. Jumps along the linked list
! until no more connections are found
!
naddr = nconn (2, ip)
nadd0 = ip
DO WHILE (naddr > 0)
kp = nconn (1, naddr)
IF ( kp == jp) goto 10
nadd0 = naddr
naddr = nconn (2, nadd0)
END DO
!
! Puts the new node jp as a connection to ip and creaes a new cell
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?