block_obj_UpdateExtents Subroutine

private impure subroutine block_obj_UpdateExtents(this)

Updates the dimensional extents of the block.

Type Bound

block_obj

Arguments

Type IntentOptional Attributes Name
class(block_obj), intent(inout) :: this

A block object


Calls

proc~~block_obj_updateextents~~CallsGraph proc~block_obj_updateextents block_obj%block_obj_UpdateExtents proc~axis_obj_init axis_obj%axis_obj_Init proc~block_obj_updateextents->proc~axis_obj_init

Called by

proc~~block_obj_updateextents~~CalledByGraph proc~block_obj_updateextents block_obj%block_obj_UpdateExtents proc~block_obj_updategridghostcells block_obj%block_obj_UpdateGridGhostCells proc~block_obj_updategridghostcells->proc~block_obj_updateextents proc~block_obj_partition block_obj%block_obj_Partition proc~block_obj_partition->proc~block_obj_updategridghostcells proc~block_obj_read block_obj%block_obj_Read proc~block_obj_read->proc~block_obj_updategridghostcells proc~block_obj_setupuniformgrid block_obj%block_obj_SetupUniformGrid proc~block_obj_setupuniformgrid->proc~block_obj_updategridghostcells proc~collision_obj_setupcollisionblock2 collision_obj%collision_obj_SetupCollisionBlock2 proc~collision_obj_setupcollisionblock2->proc~block_obj_updategridghostcells proc~collision_obj_setupcollisionblock2->proc~block_obj_setupuniformgrid none~initialize~6 block_obj%Initialize proc~collision_obj_setupcollisionblock2->none~initialize~6 proc~block_obj_init2 block_obj%block_obj_Init2 proc~block_obj_init2->proc~block_obj_setupuniformgrid proc~cdifs_obj_preparesolverblock cdifs_obj_PrepareSolverBlock proc~cdifs_obj_preparesolverblock->proc~block_obj_partition proc~cdifs_obj_preparesolverblock->none~initialize~6 proc~collision_obj_setupcollisionblock collision_obj%collision_obj_SetupCollisionBlock proc~collision_obj_setupcollisionblock->proc~block_obj_setupuniformgrid proc~collision_obj_setupcollisionblock->none~initialize~6 proc~grans_obj_preparesolverblock grans_obj_PrepareSolverBlock proc~grans_obj_preparesolverblock->proc~block_obj_partition proc~grans_obj_preparesolverblock->none~initialize~6 none~initialize~6->proc~block_obj_init2 proc~cdifs_obj_preparesolver cdifs_obj_PrepareSolver proc~cdifs_obj_preparesolver->proc~cdifs_obj_preparesolverblock proc~cdifs_obj_preparesolver->proc~collision_obj_setupcollisionblock proc~grans_obj_preparesolver grans_obj_PrepareSolver proc~grans_obj_preparesolver->proc~grans_obj_preparesolverblock proc~grans_obj_preparesolvercollision grans_obj_PrepareSolverCollision proc~grans_obj_preparesolver->proc~grans_obj_preparesolvercollision proc~grans_obj_preparesolvercollision->proc~collision_obj_setupcollisionblock interface~cdifs_obj_preparesolver cdifs_obj%cdifs_obj_PrepareSolver interface~cdifs_obj_preparesolver->proc~cdifs_obj_preparesolver interface~grans_obj_preparesolver grans_obj%grans_obj_PrepareSolver interface~grans_obj_preparesolver->proc~grans_obj_preparesolver

Source Code

    impure subroutine block_obj_UpdateExtents(this)
      !> Updates the dimensional extents of the block.
      implicit none
      class(block_obj), intent(inout) :: this                                  !! A block object
      ! Work variables
      integer       :: dir
      integer       :: hi_b,lo_b,i_b
      integer       :: Nblock(3)
      integer       :: nsize
      real(wp),     &
        allocatable :: buff(:)

      associate (lo => this%lo,  hi => this%hi, ngc=> this%ngc,&
        axis => this%axis)
        do dir=1,3
          this%xhi(dir) = axis(dir)%x(hi(dir)+1)
          this%xlo(dir) = axis(dir)%x(lo(dir)  )
        end do
      end associate

      if (this%is_partitioned) then
        do dir=1,3
          ! High/low bounds and index of current block
          lo_b = 1
          hi_b = this%parallel%np(dir)
          i_b  = this%parallel%rank%dir(dir)

          ! Initialize partition axis
          call this%axis_partition(dir)%Initialize(lo_b,hi_b,ngc=0)

          ! Add values
          ! - Low bound
          this%axis_partition(dir)%x(i_b) = this%xlo(dir)
          ! - High bound
          if (i_b.eq.hi_b) this%axis_partition(dir)%x(i_b+1) = this%xhi(dir)

          Nblock      = this%parallel%np
          Nblock(dir) = 1
          nsize       = Nblock(1)*Nblock(2)*Nblock(3)

          allocate(buff(hi_b + 1))
          call this%parallel%Sum(this%axis_partition(dir)%x,buff)
          this%axis_partition(dir)%x=buff/nsize
          deallocate(buff)
        end do
      else
        do dir=1,3
          ! High/low bounds and index of current block
          lo_b = 1
          hi_b = 1
          i_b  = 1

          ! Initialize partition axis
          call this%axis_partition(dir)%Initialize(lo_b,hi_b,ngc=0)

          this%axis_partition(dir)%x(i_b)   = this%xlo(dir)
          this%axis_partition(dir)%x(i_b+1) = this%xhi(dir)
        end do
      end if

      ! Global min and max
      do dir=1,3
        this%pmin(dir) = minval(this%axis_partition(dir)%x(:))
        this%pmax(dir) = maxval(this%axis_partition(dir)%x(:))
      end do

      ! Convenience min and max
      this%xmin = this%pmin(1); this%xmax = this%pmax(1)
      this%ymin = this%pmin(2); this%ymax = this%pmax(2)
      this%zmin = this%pmin(3); this%zmax = this%pmax(3)

      return
    end subroutine block_obj_UpdateExtents