Init_QuadTreeMesh2D Subroutine

public subroutine Init_QuadTreeMesh2D(this, mesh)

Initialize the forest with one root per base-mesh element (all leaves at level 0). The base geometry (node coordinates) is copied so leaf geometry can be regenerated after any amount of refinement without holding a reference to the mesh. Requires a single-rank mesh (a decomposed mesh only stores its local elements); a rank-replicated forest over a decomposed base is built by gathering the global tables and calling InitGlobal.

Arguments

TypeIntentOptionalAttributesName
class(QuadTreeMesh2D), intent(out) :: this
type(Mesh2D), intent(in) :: mesh

Contents

Source Code


Source Code

  subroutine Init_QuadTreeMesh2D(this,mesh)
    !! Initialize the forest with one root per base-mesh element (all leaves at level 0). The
    !! base geometry (node coordinates) is copied so leaf geometry can be regenerated after any
    !! amount of refinement without holding a reference to the mesh. Requires a single-rank
    !! mesh (a decomposed mesh only stores its local elements); a rank-replicated forest over a
    !! decomposed base is built by gathering the global tables and calling InitGlobal.
    implicit none
    class(QuadTreeMesh2D),intent(out) :: this
    type(Mesh2D),intent(in) :: mesh
    ! Local
    integer :: r,s
    integer,allocatable :: nbr(:,:),nbrSide(:,:),flip(:,:),bc(:,:),mat(:)

    if(mesh%decomp%nRanks > 1) then
      print*,__FILE__,':',__LINE__, &
        ' : Error : QuadTreeMesh2D%Init requires a single-rank mesh; gather the global base'// &
        ' tables and call InitGlobal for a decomposed base mesh.'
      stop 1
    endif

    allocate(nbr(1:4,1:mesh%nElem),nbrSide(1:4,1:mesh%nElem))
    allocate(flip(1:4,1:mesh%nElem),bc(1:4,1:mesh%nElem))
    allocate(mat(1:mesh%nElem))
    do r = 1,mesh%nElem
      do s = 1,4
        nbr(s,r) = mesh%sideInfo(3,s,r)
        nbrSide(s,r) = mesh%sideInfo(4,s,r)/10
        flip(s,r) = mod(mesh%sideInfo(4,s,r),10)
        bc(s,r) = mesh%sideInfo(5,s,r)
      enddo
      mat(r) = mesh%elemMaterial(r)
    enddo

    call this%InitGlobal(mesh%nElem,mesh%nGeo,mesh%quadrature, &
                         mesh%nodeCoords,nbr,nbrSide,flip,bc,mat)

    deallocate(nbr,nbrSide,flip,bc,mat)

  endsubroutine Init_QuadTreeMesh2D