third entry in mesh_ipNeighborhood stores the neighbor_index that points from each neighbor back to the central ip; needed in nonlocal model

This commit is contained in:
Christoph Kords 2012-10-24 14:03:02 +00:00
parent 13b55275b1
commit 93cc466749
1 changed files with 30 additions and 3 deletions

View File

@ -52,7 +52,7 @@ module mesh
mesh_nodeTwins !< node twins are surface nodes that lie exactly on opposite sides of the mesh (surfaces nodes with equal coordinate values in two dimensions) mesh_nodeTwins !< node twins are surface nodes that lie exactly on opposite sides of the mesh (surfaces nodes with equal coordinate values in two dimensions)
integer(pInt), dimension(:,:,:,:), allocatable, public :: & integer(pInt), dimension(:,:,:,:), allocatable, public :: &
mesh_ipNeighborhood !< 6 or less neighboring IPs as [element_num, IP_index] mesh_ipNeighborhood !< 6 or less neighboring IPs as [element_num, IP_index, neighbor_index that points to me]
real(pReal), dimension(:,:), allocatable, public :: & real(pReal), dimension(:,:), allocatable, public :: &
mesh_ipVolume, & !< volume associated with IP (initially!) mesh_ipVolume, & !< volume associated with IP (initially!)
@ -3448,6 +3448,8 @@ end subroutine mesh_build_sharedElems
!*********************************************************** !***********************************************************
subroutine mesh_build_ipNeighborhood subroutine mesh_build_ipNeighborhood
use math, only: math_mul3x3
implicit none implicit none
integer(pInt) myElem, & ! my CP element index integer(pInt) myElem, & ! my CP element index
myIP, & myIP, &
@ -3463,13 +3465,16 @@ integer(pInt) myElem, &
dir, & ! direction of periodicity dir, & ! direction of periodicity
matchingElem, & ! CP elem number of matching element matchingElem, & ! CP elem number of matching element
matchingFace, & ! face ID of matching element matchingFace, & ! face ID of matching element
a, anchor a, anchor, &
neighboringIP, &
neighboringElem, &
pointingToMe
integer(pInt), dimension(FE_maxmaxNnodesAtIP) :: & integer(pInt), dimension(FE_maxmaxNnodesAtIP) :: &
linkedNodes = 0_pInt, & linkedNodes = 0_pInt, &
matchingNodes matchingNodes
logical checkTwins logical checkTwins
allocate(mesh_ipNeighborhood(2,mesh_maxNipNeighbors,mesh_maxNips,mesh_NcpElems)) allocate(mesh_ipNeighborhood(3,mesh_maxNipNeighbors,mesh_maxNips,mesh_NcpElems))
mesh_ipNeighborhood = 0_pInt mesh_ipNeighborhood = 0_pInt
@ -3583,6 +3588,28 @@ checkCandidateIP: do candidateIP = 1_pInt,FE_Nips(neighboringType)
enddo enddo
enddo enddo
enddo enddo
do myElem = 1_pInt,mesh_NcpElems ! loop over cpElems
myType = mesh_element(2,myElem) ! get elemType
do myIP = 1_pInt,FE_Nips(myType) ! loop over IPs of elem
do neighbor = 1_pInt,FE_NipNeighbors(myType) ! loop over neighbors of IP
neighboringElem = mesh_ipNeighborhood(1,neighbor,myIP,myElem)
neighboringIP = mesh_ipNeighborhood(2,neighbor,myIP,myElem)
if (neighboringElem > 0_pInt .and. neighboringIP > 0_pInt) then ! if neighbor exists ...
neighboringType = mesh_element(2,neighboringElem)
do pointingToMe = 1_pInt,FE_NipNeighbors(neighboringType) ! find neighboring index that points from my neighbor to myself
if ( myElem == mesh_ipNeighborhood(1,pointingToMe,neighboringIP,neighboringElem) &
.and. myIP == mesh_ipNeighborhood(2,pointingToMe,neighboringIP,neighboringElem)) then ! possible candidate
if (math_mul3x3(mesh_ipAreaNormal(1:3,neighbor,myIP,myElem),&
mesh_ipAreaNormal(1:3,pointingToMe,neighboringIP,neighboringElem)) < 0.0_pReal) then ! area normals have opposite orientation (we have to check that because of special case for single element with two ips and periodicity. In this case the neighbor is identical in two different directions.)
mesh_ipNeighborhood(3,neighbor,myIP,myElem) = pointingToMe ! found match
exit ! so no need to search further
endif
endif
enddo
endif
enddo
enddo
enddo
end subroutine mesh_build_ipNeighborhood end subroutine mesh_build_ipNeighborhood