bc_set_UpdateBoundarySymmetryMinus Subroutine

private impure subroutine bc_set_UpdateBoundarySymmetryMinus(this, region, var)

Updates ghostcells to enforce symmetry BC. Minus version.

           staggered           non-staggered
         (face-centerd)       (cell-centered)
interior   ---↑---        |       -------
                          |          ↑

(boundary)-----0-----------|---------------- ghost | ↓ cells ---↓--- | -------

Type Bound

bc_set

Arguments

Type IntentOptional Attributes Name
class(bc_set), intent(in) :: this

Boundary conditions utility

character(len=*), intent(in) :: region

Region name

type(eulerian_obj_r), intent(inout) :: var

Eulerian variable


Calls

proc~~bc_set_updateboundarysymmetryminus~~CallsGraph proc~bc_set_updateboundarysymmetryminus bc_set%bc_set_UpdateBoundarySymmetryMinus proc~bc_set_getextents bc_set%bc_set_GetExtents proc~bc_set_updateboundarysymmetryminus->proc~bc_set_getextents proc~bc_set_getsidedirbyregion bc_set%bc_set_GetSideDirByRegion proc~bc_set_updateboundarysymmetryminus->proc~bc_set_getsidedirbyregion proc~bc_set_getregionindex bc_set%bc_set_GetRegionIndex proc~bc_set_getextents->proc~bc_set_getregionindex proc~bc_set_getsidedirbyregion->proc~bc_set_getregionindex none~get~3 hashtbl_obj%Get proc~bc_set_getregionindex->none~get~3 proc~hashtbl_obj_hashstring hashtbl_obj%hashtbl_obj_HashString proc~bc_set_getregionindex->proc~hashtbl_obj_hashstring proc~hashtbl_obj_get_int4 hashtbl_obj%hashtbl_obj_Get_int4 none~get~3->proc~hashtbl_obj_get_int4 proc~hashtbl_obj_get_int8 hashtbl_obj%hashtbl_obj_Get_int8 none~get~3->proc~hashtbl_obj_get_int8 proc~hashtbl_obj_get_real_dp hashtbl_obj%hashtbl_obj_Get_real_dp none~get~3->proc~hashtbl_obj_get_real_dp proc~hashtbl_obj_get_real_sp hashtbl_obj%hashtbl_obj_Get_real_sp none~get~3->proc~hashtbl_obj_get_real_sp none~get~2 sllist_obj%Get proc~hashtbl_obj_get_int4->none~get~2 proc~hashtbl_obj_get_int8->none~get~2 proc~hashtbl_obj_get_real_dp->none~get~2 proc~hashtbl_obj_get_real_sp->none~get~2 proc~sllist_obj_get_int4 sllist_obj%sllist_obj_Get_int4 none~get~2->proc~sllist_obj_get_int4 proc~sllist_obj_get_int8 sllist_obj%sllist_obj_Get_int8 none~get~2->proc~sllist_obj_get_int8 proc~sllist_obj_get_real_dp sllist_obj%sllist_obj_Get_real_dp none~get~2->proc~sllist_obj_get_real_dp proc~sllist_obj_get_real_sp sllist_obj%sllist_obj_Get_real_sp none~get~2->proc~sllist_obj_get_real_sp proc~sllist_obj_get_int4->proc~sllist_obj_get_int4 proc~sllist_obj_get_int8->proc~sllist_obj_get_int8 proc~sllist_obj_get_real_dp->proc~sllist_obj_get_real_dp proc~sllist_obj_get_real_sp->proc~sllist_obj_get_real_sp

Called by

proc~~bc_set_updateboundarysymmetryminus~~CalledByGraph proc~bc_set_updateboundarysymmetryminus bc_set%bc_set_UpdateBoundarySymmetryMinus proc~bc_set_updateboundaryvector bc_set%bc_set_UpdateBoundaryVector proc~bc_set_updateboundaryvector->proc~bc_set_updateboundarysymmetryminus none~updateboundary bc_set%UpdateBoundary none~updateboundary->proc~bc_set_updateboundaryvector proc~cdifs_obj_advancesolutioncorrector cdifs_obj_AdvanceSolutionCorrector proc~cdifs_obj_advancesolutioncorrector->none~updateboundary proc~cdifs_obj_advancesolutionib cdifs_obj_AdvanceSolutionIB proc~cdifs_obj_advancesolutionib->none~updateboundary proc~cdifs_obj_advancesolutionpredictor cdifs_obj_AdvanceSolutionPredictor proc~cdifs_obj_advancesolutionpredictor->none~updateboundary proc~cdifs_obj_computesolidvf cdifs_obj%cdifs_obj_ComputeSolidVF proc~cdifs_obj_computesolidvf->none~updateboundary proc~respart_set_updatenormals ResPart_set%ResPart_set_UpdateNormals proc~cdifs_obj_computesolidvf->proc~respart_set_updatenormals proc~cdifs_obj_preparesolver cdifs_obj_PrepareSolver proc~cdifs_obj_preparesolver->none~updateboundary proc~cdifs_obj_preparesolver->proc~cdifs_obj_computesolidvf proc~cdifs_obj_preparesolverbcs cdifs_obj_PrepareSolverBCS proc~cdifs_obj_preparesolver->proc~cdifs_obj_preparesolverbcs proc~cdifs_obj_preparesolverbcs->none~updateboundary proc~grans_obj_computesolidvf grans_obj%grans_obj_ComputeSolidVF proc~grans_obj_computesolidvf->none~updateboundary proc~grans_obj_computesolidvf->proc~respart_set_updatenormals proc~grans_obj_preparesolver grans_obj_PrepareSolver proc~grans_obj_preparesolver->none~updateboundary proc~grans_obj_preparesolver->proc~grans_obj_computesolidvf interface~grans_obj_writeoutputdata grans_obj%grans_obj_WriteOutputData proc~grans_obj_preparesolver->interface~grans_obj_writeoutputdata proc~grans_obj_writeoutputdata grans_obj_WriteOutputData proc~grans_obj_writeoutputdata->none~updateboundary proc~grans_obj_writeoutputdata->proc~grans_obj_computesolidvf proc~marker_set_updatenormals marker_set%marker_set_UpdateNormals proc~marker_set_updatenormals->none~updateboundary 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 interface~grans_obj_writeoutputdata->proc~grans_obj_writeoutputdata proc~cdifs_obj_advancesolution cdifs_obj_AdvanceSolution proc~cdifs_obj_advancesolution->proc~cdifs_obj_advancesolutioncorrector proc~cdifs_obj_advancesolution->proc~cdifs_obj_advancesolutionib proc~cdifs_obj_advancesolution->proc~cdifs_obj_advancesolutionpredictor proc~cdifs_obj_advancesolutionrp cdifs_obj_AdvanceSolutionRP proc~cdifs_obj_advancesolution->proc~cdifs_obj_advancesolutionrp proc~cdifs_obj_advancesolutionrp->proc~cdifs_obj_computesolidvf proc~respart_set_updatenormals->proc~marker_set_updatenormals interface~cdifs_obj_advancesolution cdifs_obj%cdifs_obj_AdvanceSolution interface~cdifs_obj_advancesolution->proc~cdifs_obj_advancesolution

Source Code

    impure subroutine bc_set_UpdateBoundarySymmetryMinus(this,region,var)
      !> Updates ghostcells to enforce symmetry BC.
      !  Minus version.
      !
      !                staggered           non-staggered
      !              (face-centerd)       (cell-centered)
      !     interior   ---↑---        |       -------
      !                               |          ↑
      !    (boundary)-----0-----------|----------------
      !      ghost                    |          ↓
      !      cells     ---↓---        |       -------
      !
      class(bc_set),        intent(in)    :: this                              !! Boundary conditions utility
      character(len=*),     intent(in)    :: region                            !! Region name
      type(eulerian_obj_r), intent(inout) :: var                               !! Eulerian variable
      ! Work variables
      type(extent_obj) :: extents
      integer          :: i,j,k,n
      integer          :: shift(3)
      integer          :: mirror(3)
      integer          :: increment
      integer          :: dir
      integer          :: side

      ! Get extents
      extents = this%GetExtents(region)

      ! Get direction and side of BC
      call this%GetSideDirByRegion(region,side,dir)

      select case (side)
      case (BC_RIGHT)
        increment =  1
      case (BC_LEFT)
        increment = -1
      end select

      if (dir.eq.var%staggering) then
        ! Treatment for face-centered fields in dir-direction
        select case (side)
        case (BC_RIGHT)
          associate(lo => extents%lo, hi=>extents%hi)
            do k=lo(3),hi(3)
              do j=lo(2),hi(2)
                do i=lo(1),hi(1)
                  shift  = 0
                  mirror = 0

                  ! Treatment for point on the boundary
                  shift(dir) = shift(dir) + increment
                  var%cell(i+shift(1),j+shift(2),k+shift(3)) = 0.0_wp

                  ! Treatment for points beyond the boundary
                  do n=2,this%block%ngc
                    shift(dir)  = shift(dir)  + increment
                    mirror(dir) = -shift(dir) + increment
                    var%cell(i+shift(1),j+shift(2),k+shift(3)) = -var%cell(i+mirror(1),j+mirror(2),k+mirror(3))
                  end do
                end do
              end do
            end do
          end associate
        case (BC_LEFT)
          associate(lo => extents%lo, hi=>extents%hi)
            do k=lo(3),hi(3)
              do j=lo(2),hi(2)
                do i=lo(1),hi(1)
                  shift  = 0
                  mirror = 0

                  ! Treatment for point on the boundary
                  var%cell(i+shift(1),j+shift(2),k+shift(3)) = 0.0_wp

                  ! Treatment for points beyond the boundary
                  do n=1,this%block%ngc
                    shift(dir)  = shift(dir)  + increment
                    mirror(dir) = -shift(dir)
                    var%cell(i+shift(1),j+shift(2),k+shift(3)) = -var%cell(i+mirror(1),j+mirror(2),k+mirror(3))
                  end do
                end do
              end do
            end do
          end associate
        end select

      else

        ! Treatment for cell-centered fields in dir-direction
        associate(lo => extents%lo, hi=>extents%hi)
          do k=lo(3),hi(3)
            do j=lo(2),hi(2)
              do i=lo(1),hi(1)
                shift  = 0
                mirror = 0
                do n=1,this%block%ngc
                  shift(dir)  = shift(dir)  + increment
                  mirror(dir) = -shift(dir) + increment
                  var%cell(i+shift(1),j+shift(2),k+shift(3)) = -var%cell(i+mirror(1),j+mirror(2),k+mirror(3))
                end do
              end do
            end do
          end do
        end associate

      end if

      return
    end subroutine bc_set_UpdateBoundarySymmetryMinus