use definition from element

This commit is contained in:
Martin Diehl 2019-06-13 09:09:51 +02:00
parent 17761c1864
commit c7513b010b
2 changed files with 8 additions and 67 deletions

View File

@ -130,7 +130,7 @@ module element
6 & ! 3D 8node 6 & ! 3D 8node
] !< number of ip neighbors / cell faces in a specific cell type ] !< number of ip neighbors / cell faces in a specific cell type
!integer, dimension(maxval(cellType)), parameter, private :: NCELLNODESPERCELLFACE = & !integer, dimension(maxval(cellType)), parameter, private :: NCELLNODESPERCELLFACE = & ! Intel 16.0 complains
integer, dimension(4), parameter, private :: NCELLNODEPERCELLFACE = & integer, dimension(4), parameter, private :: NCELLNODEPERCELLFACE = &
[ & [ &
2, & ! 2D 3node 2, & ! 2D 3node

View File

@ -73,10 +73,6 @@ integer, dimension(:,:), allocatable :: &
mesh_cell2, & !< cell connectivity for each element,ip/cell mesh_cell2, & !< cell connectivity for each element,ip/cell
mesh_cell !< cell connectivity for each element,ip/cell mesh_cell !< cell connectivity for each element,ip/cell
integer, dimension(:,:,:), allocatable :: &
FE_cellface !< list of intra-cell cell node IDs that constitute the cell faces of a specific type of cell
! These definitions should actually reside in the FE-solver specific part (different for MARC/ABAQUS) ! These definitions should actually reside in the FE-solver specific part (different for MARC/ABAQUS)
! Hence, I suggest to prefix with "FE_" ! Hence, I suggest to prefix with "FE_"
@ -84,7 +80,6 @@ integer, dimension(:,:), allocatable :: &
FE_Ngeomtypes = 10, & FE_Ngeomtypes = 10, &
FE_Ncelltypes = 4, & FE_Ncelltypes = 4, &
FE_maxNcellnodesPerCell = 8, & FE_maxNcellnodesPerCell = 8, &
FE_maxNcellfaces = 6, &
FE_maxNcellnodesPerCellface = 4 FE_maxNcellnodesPerCellface = 4
integer, dimension(FE_Ngeomtypes), parameter :: FE_NmatchingNodes = & !< number of nodes that are needed for face matching in a specific type of element geometry integer, dimension(FE_Ngeomtypes), parameter :: FE_NmatchingNodes = & !< number of nodes that are needed for face matching in a specific type of element geometry
@ -1037,7 +1032,7 @@ end function mesh_build_cellnodes
subroutine mesh_build_ipVolumes subroutine mesh_build_ipVolumes
integer :: e,i,c,m,f,n integer :: e,i,c,m,f,n
real(pReal), dimension(FE_maxNcellnodesPerCellface,FE_maxNcellfaces) :: subvolume real(pReal), dimension(size(theMesh%elem%cellFace,1),size(theMesh%elem%cellFace,2)) :: subvolume
allocate(mesh_ipVolume(theMesh%elem%nIPs,theMesh%nElems),source=0.0_pReal) allocate(mesh_ipVolume(theMesh%elem%nIPs,theMesh%nElems),source=0.0_pReal)
c = theMesh%elem%cellType c = theMesh%elem%cellType
@ -1074,9 +1069,9 @@ subroutine mesh_build_ipVolumes
subvolume = 0.0_pReal subvolume = 0.0_pReal
forall(f = 1:FE_NipNeighbors(c), n = 1:m) & forall(f = 1:FE_NipNeighbors(c), n = 1:m) &
subvolume(n,f) = math_volTetrahedron(& subvolume(n,f) = math_volTetrahedron(&
mesh_cellnode(1:3,mesh_cell(FE_cellface( n ,f,c),i,e)), & mesh_cellnode(1:3,mesh_cell(theMesh%elem%cellface( n ,f),i,e)), &
mesh_cellnode(1:3,mesh_cell(FE_cellface(1+mod(n ,m),f,c),i,e)), & mesh_cellnode(1:3,mesh_cell(theMesh%elem%cellface(1+mod(n ,m),f),i,e)), &
mesh_cellnode(1:3,mesh_cell(FE_cellface(1+mod(n+1,m),f,c),i,e)), & mesh_cellnode(1:3,mesh_cell(theMesh%elem%cellface(1+mod(n+1,m),f),i,e)), &
mesh_ipCoordinates(1:3,i,e)) mesh_ipCoordinates(1:3,i,e))
mesh_ipVolume(i,e) = 0.5_pReal * sum(subvolume) ! each subvolume is based on four tetrahedrons, altough the face consists of only two triangles -> averaging factor two mesh_ipVolume(i,e) = 0.5_pReal * sum(subvolume) ! each subvolume is based on four tetrahedrons, altough the face consists of only two triangles -> averaging factor two
enddo enddo
@ -1215,7 +1210,7 @@ subroutine mesh_build_ipAreas
do i = 1,theMesh%elem%nIPs do i = 1,theMesh%elem%nIPs
do f = 1,FE_NipNeighbors(c) ! loop over cell faces do f = 1,FE_NipNeighbors(c) ! loop over cell faces
forall(n = 1:FE_NcellnodesPerCellface(c)) & forall(n = 1:FE_NcellnodesPerCellface(c)) &
nodePos(1:3,n) = mesh_cellnode(1:3,mesh_cell(FE_cellface(n,f,c),i,e)) nodePos(1:3,n) = mesh_cellnode(1:3,mesh_cell(theMesh%elem%cellface(n,f),i,e))
normal(1) = nodePos(2,2) - nodePos(2,1) ! x_normal = y_connectingVector normal(1) = nodePos(2,2) - nodePos(2,1) ! x_normal = y_connectingVector
normal(2) = -(nodePos(1,2) - nodePos(1,1)) ! y_normal = -x_connectingVector normal(2) = -(nodePos(1,2) - nodePos(1,1)) ! y_normal = -x_connectingVector
normal(3) = 0.0_pReal normal(3) = 0.0_pReal
@ -1228,7 +1223,7 @@ subroutine mesh_build_ipAreas
do i = 1,theMesh%elem%nIPs do i = 1,theMesh%elem%nIPs
do f = 1,FE_NipNeighbors(c) ! loop over cell faces do f = 1,FE_NipNeighbors(c) ! loop over cell faces
forall(n = 1:FE_NcellnodesPerCellface(c)) & forall(n = 1:FE_NcellnodesPerCellface(c)) &
nodePos(1:3,n) = mesh_cellnode(1:3,mesh_cell(FE_cellface(n,f,c),i,e)) nodePos(1:3,n) = mesh_cellnode(1:3,mesh_cell(theMesh%elem%cellface(n,f),i,e))
normal = math_cross(nodePos(1:3,2) - nodePos(1:3,1), & normal = math_cross(nodePos(1:3,2) - nodePos(1:3,1), &
nodePos(1:3,3) - nodePos(1:3,1)) nodePos(1:3,3) - nodePos(1:3,1))
mesh_ipArea(f,i,e) = norm2(normal) mesh_ipArea(f,i,e) = norm2(normal)
@ -1245,7 +1240,7 @@ subroutine mesh_build_ipAreas
do i = 1,theMesh%elem%nIPs do i = 1,theMesh%elem%nIPs
do f = 1,FE_NipNeighbors(c) ! loop over cell faces do f = 1,FE_NipNeighbors(c) ! loop over cell faces
forall(n = 1:FE_NcellnodesPerCellface(c)) & forall(n = 1:FE_NcellnodesPerCellface(c)) &
nodePos(1:3,n) = mesh_cellnode(1:3,mesh_cell(FE_cellface(n,f,c),i,e)) nodePos(1:3,n) = mesh_cellnode(1:3,mesh_cell(theMesh%elem%cellface(n,f),i,e))
forall(n = 1:FE_NcellnodesPerCellface(c)) & forall(n = 1:FE_NcellnodesPerCellface(c)) &
normals(1:3,n) = 0.5_pReal & normals(1:3,n) = 0.5_pReal &
* math_cross(nodePos(1:3,1+mod(n ,m)) - nodePos(1:3,n), & * math_cross(nodePos(1:3,1+mod(n ,m)) - nodePos(1:3,n), &
@ -1263,60 +1258,6 @@ subroutine mesh_build_ipAreas
end subroutine mesh_build_ipAreas end subroutine mesh_build_ipAreas
!--------------------------------------------------------------------------------------------------
!> @brief get properties of different types of finite elements
!> @details assign globals FE_cellface
!--------------------------------------------------------------------------------------------------
subroutine mesh_build_FEdata
integer :: me
allocate(FE_cellface(FE_maxNcellnodesPerCellface,FE_maxNcellfaces,FE_Ncelltypes), source=0)
! *** FE_cellface ***
me = 0
me = me + 1
FE_cellface(1:FE_NcellnodesPerCellface(me),1:FE_NipNeighbors(me),me) = & ! 2D 3node, VTK_TRIANGLE (5)
reshape(int([&
2,3, &
3,1, &
1,2 &
],pInt),[FE_NcellnodesPerCellface(me),FE_NipNeighbors(me)])
me = me + 1
FE_cellface(1:FE_NcellnodesPerCellface(me),1:FE_NipNeighbors(me),me) = & ! 2D 4node, VTK_QUAD (9)
reshape(int([&
2,3, &
4,1, &
3,4, &
1,2 &
],pInt),[FE_NcellnodesPerCellface(me),FE_NipNeighbors(me)])
me = me + 1
FE_cellface(1:FE_NcellnodesPerCellface(me),1:FE_NipNeighbors(me),me) = & ! 3D 4node, VTK_TETRA (10)
reshape(int([&
1,3,2, &
1,2,4, &
2,3,4, &
1,4,3 &
],pInt),[FE_NcellnodesPerCellface(me),FE_NipNeighbors(me)])
me = me + 1
FE_cellface(1:FE_NcellnodesPerCellface(me),1:FE_NipNeighbors(me),me) = & ! 3D 8node, VTK_HEXAHEDRON (12)
reshape(int([&
2,3,7,6, &
4,1,5,8, &
3,4,8,7, &
1,2,6,5, &
5,6,7,8, &
1,4,3,2 &
],pInt),[FE_NcellnodesPerCellface(me),FE_NipNeighbors(me)])
end subroutine mesh_build_FEdata
!-------------------------------------------------------------------------------------------------- !--------------------------------------------------------------------------------------------------
!> @brief Gives the FE to CP ID mapping by binary search through lookup array !> @brief Gives the FE to CP ID mapping by binary search through lookup array
!! valid questions (what) are 'elem', 'node' !! valid questions (what) are 'elem', 'node'