Initialize the forest directly from GLOBAL base-mesh tables (one root per global base element, all leaves at level 0). This is the initialization path for a rank-replicated forest over a decomposed base mesh: every rank passes the same gathered tables and holds an identical forest. rootNbr carries global element ids (0 = physical boundary), rootNbrSide/rootFlip decode the base sideInfo(4) pairing, rootBC the base boundary-condition id per face, and rootMaterial the base material id per element.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(OctreeMesh3D), | intent(out) | :: | this | |||
| integer, | intent(in) | :: | nRoots | |||
| integer, | intent(in) | :: | nGeo | |||
| integer, | intent(in) | :: | quadrature | |||
| real(kind=prec), | intent(in) | :: | rootCoords(1:3,1:nGeo+1,1:nGeo+1,1:nGeo+1,1:nRoots) | |||
| integer, | intent(in) | :: | rootNbr(1:6,1:nRoots) | |||
| integer, | intent(in) | :: | rootNbrSide(1:6,1:nRoots) | |||
| integer, | intent(in) | :: | rootFlip(1:6,1:nRoots) | |||
| integer, | intent(in) | :: | rootBC(1:6,1:nRoots) | |||
| integer, | intent(in) | :: | rootMaterial(1:nRoots) |
subroutine InitGlobal_OctreeMesh3D(this,nRoots,nGeo,quadrature,rootCoords, &
rootNbr,rootNbrSide,rootFlip,rootBC,rootMaterial)
!! Initialize the forest directly from GLOBAL base-mesh tables (one root per global
!! base element, all leaves at level 0). This is the initialization path for a
!! rank-replicated forest over a decomposed base mesh: every rank passes the same
!! gathered tables and holds an identical forest. rootNbr carries global element ids
!! (0 = physical boundary), rootNbrSide/rootFlip decode the base sideInfo(4) pairing,
!! rootBC the base boundary-condition id per face, and rootMaterial the base material
!! id per element.
implicit none
class(OctreeMesh3D),intent(out) :: this
integer,intent(in) :: nRoots
integer,intent(in) :: nGeo
integer,intent(in) :: quadrature
real(prec),intent(in) :: rootCoords(1:3,1:nGeo+1,1:nGeo+1,1:nGeo+1,1:nRoots)
integer,intent(in) :: rootNbr(1:6,1:nRoots)
integer,intent(in) :: rootNbrSide(1:6,1:nRoots)
integer,intent(in) :: rootFlip(1:6,1:nRoots)
integer,intent(in) :: rootBC(1:6,1:nRoots)
integer,intent(in) :: rootMaterial(1:nRoots)
! Local
integer :: r
this%nGeo = nGeo
this%quadrature = quadrature
this%nRoots = nRoots
allocate(this%rootCoords(1:3,1:nGeo+1,1:nGeo+1,1:nGeo+1,1:nRoots))
this%rootCoords(1:3,1:nGeo+1,1:nGeo+1,1:nGeo+1,1:nRoots) = &
rootCoords(1:3,1:nGeo+1,1:nGeo+1,1:nGeo+1,1:nRoots)
allocate(this%rootNbr(1:6,1:nRoots))
allocate(this%rootNbrSide(1:6,1:nRoots))
allocate(this%rootFlip(1:6,1:nRoots))
allocate(this%rootBC(1:6,1:nRoots))
allocate(this%rootMaterial(1:nRoots))
this%rootNbr(1:6,1:nRoots) = rootNbr(1:6,1:nRoots)
this%rootNbrSide(1:6,1:nRoots) = rootNbrSide(1:6,1:nRoots)
this%rootFlip(1:6,1:nRoots) = rootFlip(1:6,1:nRoots)
this%rootBC(1:6,1:nRoots) = rootBC(1:6,1:nRoots)
this%rootMaterial(1:nRoots) = rootMaterial(1:nRoots)
! Roots are the first nRoots nodes.
this%capacity = max(8*this%nRoots,16)
this%nNodes = this%nRoots
allocate(this%level(1:this%capacity))
allocate(this%parent(1:this%capacity))
allocate(this%octant(1:this%capacity))
allocate(this%rootElem(1:this%capacity))
allocate(this%child(1:8,1:this%capacity))
this%level = 0
this%parent = 0
this%octant = 0
this%rootElem = 0
this%child = 0
do r = 1,this%nRoots
this%rootElem(r) = r
enddo
call this%RebuildLeaves()
endsubroutine InitGlobal_OctreeMesh3D