Axis-aligned bounding box of each element, taken over the boundary nodes (geometry%x%boundary) which are evaluated on the element faces (reference coordinate = +/-1) and so reach the true element boundary, edges and corners. See BuildElementBBoxes_2D for why the interior nodes alone are insufficient (Gauss interior nodes under-cover the element).
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(SEMHex), | intent(in) | :: | geometry | |||
| integer, | intent(in) | :: | N | |||
| integer, | intent(in) | :: | nElem | |||
| real(kind=prec), | intent(out) | :: | bbMin(1:3,1:nElem) | |||
| real(kind=prec), | intent(out) | :: | bbMax(1:3,1:nElem) |
subroutine BuildElementBBoxes_3D(geometry,N,nElem,bbMin,bbMax)
!! Axis-aligned bounding box of each element, taken over the boundary nodes
!! (geometry%x%boundary) which are evaluated on the element faces (reference
!! coordinate = +/-1) and so reach the true element boundary, edges and
!! corners. See BuildElementBBoxes_2D for why the interior nodes alone are
!! insufficient (Gauss interior nodes under-cover the element).
implicit none
type(SEMHex),intent(in) :: geometry
integer,intent(in) :: N,nElem
real(prec),intent(out) :: bbMin(1:3,1:nElem),bbMax(1:3,1:nElem)
! Local
integer :: iEl,i,j,iSide
real(prec) :: xv,yv,zv
do iEl = 1,nElem
bbMin(1,iEl) = huge(1.0_prec)
bbMin(2,iEl) = huge(1.0_prec)
bbMin(3,iEl) = huge(1.0_prec)
bbMax(1,iEl) = -huge(1.0_prec)
bbMax(2,iEl) = -huge(1.0_prec)
bbMax(3,iEl) = -huge(1.0_prec)
do iSide = 1,6
do j = 1,N+1
do i = 1,N+1
xv = geometry%x%boundary(i,j,iSide,iEl,1,1)
yv = geometry%x%boundary(i,j,iSide,iEl,1,2)
zv = geometry%x%boundary(i,j,iSide,iEl,1,3)
if(xv < bbMin(1,iEl)) bbMin(1,iEl) = xv
if(yv < bbMin(2,iEl)) bbMin(2,iEl) = yv
if(zv < bbMin(3,iEl)) bbMin(3,iEl) = zv
if(xv > bbMax(1,iEl)) bbMax(1,iEl) = xv
if(yv > bbMax(2,iEl)) bbMax(2,iEl) = yv
if(zv > bbMax(3,iEl)) bbMax(3,iEl) = zv
enddo
enddo
enddo
enddo
endsubroutine BuildElementBBoxes_3D