load_BC_intern_1D Subroutine

private subroutine load_BC_intern_1D(tree, me, xbounds, nSides)

Load internal BC property for 1D Line.

Arguments

Type IntentOptional Attributes Name
type(treelmesh_type), intent(in) :: tree
type(tem_BC_prop_type), intent(inout) :: me

Boundary condition construct to load the data into

logical, intent(in) :: xbounds

Set boundaries east and west in X direction?

integer, intent(in), optional :: nSides

Required sides to set, defaults to 26.


Calls

proc~~load_bc_intern_1d~~CallsGraph proc~load_bc_intern_1d load_BC_intern_1D proc~tem_coordofid tem_CoordOfId proc~load_bc_intern_1d->proc~tem_coordofid proc~tem_firstidatlevel tem_FirstIdAtLevel proc~load_bc_intern_1d->proc~tem_firstidatlevel proc~tem_idofcoord tem_IdOfCoord proc~load_bc_intern_1d->proc~tem_idofcoord proc~tem_levelof tem_LevelOf proc~tem_coordofid->proc~tem_levelof

Called by

proc~~load_bc_intern_1d~~CalledByGraph proc~load_bc_intern_1d load_BC_intern_1D proc~init_tem_bc_prop init_tem_bc_prop proc~init_tem_bc_prop->proc~load_bc_intern_1d

Source Code

  subroutine load_BC_intern_1D( tree, me, xbounds, nSides )
    ! ---------------------------------------------------------------------------
    type(treelmesh_type), intent(in) :: tree
    !> Boundary condition construct to load the data into
    type(tem_BC_prop_type), intent(inout) :: me
    !> Set boundaries east and west in X direction?
    logical, intent(in) :: xbounds
    !> Required sides to set, defaults to 26.
    integer, intent(in), optional :: nSides
    ! ---------------------------------------------------------------------------
    integer :: nelems
    integer :: iElem
    integer :: neigh_coord(4)
    integer :: my_coord(4)
    integer(kind=long_k) :: tID, west_ID, east_ID
    integer(kind=long_k) :: firstID, lastID
    ! ---------------------------------------------------------------------------

    if (present(nSides)) then
      me%nSides = nSides
    else
      me%nSides = 26
    end if

    if (xbounds) then
      me%nBCtypes = 2
    else
      me%nBCtypes = 0
    end if

    firstID = -1_long_k
    lastID = -1_long_k

    nElems = int(tree%global%nElems)
    if (nElems < 2**tree%global%minLevel .or. xbounds) then
      ! If the line does not span the complete cube axis, set the first and
      ! last ID here. This will be used for a proper periodicity at the
      ! truncated end. Without truncation, these two IDs are negative and no
      ! element will match the test below, thus resulting in usual full cube
      ! behavior.
      firstID = tem_firstIdAtLevel(tree%global%minlevel)
      lastID = tem_IdOfCoord(                               &
        & coord  = [ nelems-1, 0, 0, tree%global%minlevel], &
        & offset = firstID                                  )
    end if

    allocate(me%BC_label(me%nBCtypes))
    if (xbounds) then
      me%BC_label(1) = 'west'
      me%BC_label(2) = 'east'
    end if

    allocate(me%boundary_ID(me%nSides, me%Property%nElems))
    me%boundary_ID = 0_long_k
    do iElem=1,me%Property%nElems
      tID = tree%treeID(me%Property%ElemID(iElem))
      my_coord = tem_coordofID(tID)

      ! Neighbor in the west
      if (tID /= firstID) then
        neigh_coord = my_coord + [-1, 0, 0, 0]
        west_ID = -tem_IdOfCoord(neigh_coord)
      else
        if (xbounds) then
          west_ID = 1
        else
          west_ID = -lastID
        end if
        me%boundary_ID(q__W, iElem) = west_ID
      end if

      ! Neighbor in the east
      if (tID /= lastID) then
        neigh_coord = my_coord + [1, 0, 0, 0]
        east_ID = -tem_IdOfCoord(neigh_coord)
      else
        if (xbounds) then
          east_ID = 2
        else
          east_ID = -firstID
        end if
        me%boundary_ID(q__E, iElem) = east_ID
      end if

      me%boundary_ID(q__B, iElem) = -tID
      me%boundary_ID(q__T, iElem) = -tID
      me%boundary_ID(q__S, iElem) = -tID
      me%boundary_ID(q__N, iElem) = -tID
      if (me%nSides > 6) then
        me%boundary_ID(q_BS, iElem) = -tID
        me%boundary_ID(q_TS, iElem) = -tID
        me%boundary_ID(q_BN, iElem) = -tID
        me%boundary_ID(q_TN, iElem) = -tID
        ! Neighbors in the west
        me%boundary_ID(q_BW, iElem) = west_ID
        me%boundary_ID(q_TW, iElem) = west_ID
        me%boundary_ID(q_SW, iElem) = west_ID
        me%boundary_ID(q_NW, iElem) = west_ID
        ! Neighbors in the east
        me%boundary_ID(q_BE, iElem) = east_ID
        me%boundary_ID(q_TE, iElem) = east_ID
        me%boundary_ID(q_SE, iElem) = east_ID
        me%boundary_ID(q_NE, iElem) = east_ID
        if (me%nSides > 18) then
          ! Neighbors in the west
          me%boundary_ID(qBSW, iElem) = west_ID
          me%boundary_ID(qTSW, iElem) = west_ID
          me%boundary_ID(qBNW, iElem) = west_ID
          me%boundary_ID(qTNW, iElem) = west_ID
          ! Neighbors in the east
          me%boundary_ID(qBSE, iElem) = east_ID
          me%boundary_ID(qTSE, iElem) = east_ID
          me%boundary_ID(qBNE, iElem) = east_ID
          me%boundary_ID(qTNE, iElem) = east_ID
        end if
      end if
    end do

  end subroutine load_BC_intern_1D