op_obj_ApplyLaplacianDC Subroutine

private impure subroutine op_obj_ApplyLaplacianDC(this, rhs, bcs, varname)

Applies Dirichlet boundary conditions to the RHS of a Laplacian equation.

Type Bound

op_obj

Arguments

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

Differential operators utility

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

Right hand side

type(bc_set), intent(inout) :: bcs

Boundary conditions utility

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

Variable name


Calls

proc~~op_obj_applylaplaciandc~~CallsGraph proc~op_obj_applylaplaciandc op_obj%op_obj_ApplyLaplacianDC proc~bc_set_checkbcexists bc_set%bc_set_CheckBCExists proc~op_obj_applylaplaciandc->proc~bc_set_checkbcexists proc~bc_set_getbcpointer bc_set%bc_set_GetBCPointer proc~op_obj_applylaplaciandc->proc~bc_set_getbcpointer proc~bc_set_getbctype bc_set%bc_set_GetBCType proc~op_obj_applylaplaciandc->proc~bc_set_getbctype proc~bc_set_getextents bc_set%bc_set_GetExtents proc~op_obj_applylaplaciandc->proc~bc_set_getextents proc~bc_set_getsidedirbyregion bc_set%bc_set_GetSideDirByRegion proc~op_obj_applylaplaciandc->proc~bc_set_getsidedirbyregion proc~bc_set_getregionindex bc_set%bc_set_GetRegionIndex proc~bc_set_checkbcexists->proc~bc_set_getregionindex proc~region_obj_getbcindex region_obj%region_obj_GetBCIndex proc~bc_set_checkbcexists->proc~region_obj_getbcindex proc~bc_set_getbcpointer->proc~bc_set_getregionindex proc~bc_set_getbcpointer->proc~region_obj_getbcindex proc~bc_set_getbctype->proc~bc_set_getregionindex proc~bc_set_getbctype->proc~region_obj_getbcindex 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~region_obj_getbcindex->none~get~3 proc~region_obj_getbcindex->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~~op_obj_applylaplaciandc~~CalledByGraph proc~op_obj_applylaplaciandc op_obj%op_obj_ApplyLaplacianDC proc~cdifs_obj_computesolidvf cdifs_obj%cdifs_obj_ComputeSolidVF proc~cdifs_obj_computesolidvf->proc~op_obj_applylaplaciandc proc~grans_obj_computesolidvf grans_obj%grans_obj_ComputeSolidVF proc~grans_obj_computesolidvf->proc~op_obj_applylaplaciandc proc~cdifs_obj_advancesolutionrp cdifs_obj_AdvanceSolutionRP proc~cdifs_obj_advancesolutionrp->proc~cdifs_obj_computesolidvf proc~cdifs_obj_preparesolver cdifs_obj_PrepareSolver proc~cdifs_obj_preparesolver->proc~cdifs_obj_computesolidvf proc~grans_obj_preparesolver grans_obj_PrepareSolver 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->proc~grans_obj_computesolidvf 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_advancesolutionrp interface~cdifs_obj_advancesolution cdifs_obj%cdifs_obj_AdvanceSolution interface~cdifs_obj_advancesolution->proc~cdifs_obj_advancesolution

Source Code

    impure subroutine op_obj_ApplyLaplacianDC(this,rhs,bcs,varname)
      !> Applies Dirichlet boundary conditions to the RHS of a Laplacian
      ! equation.
      class(op_obj),        intent(inout) :: this                              !! Differential operators utility
      type(eulerian_obj_r), intent(inout) :: rhs                               !! Right hand side
      type(bc_set),         intent(inout) :: bcs                               !! Boundary conditions utility
      character(len=*),     intent(in)    :: varname                           !! Variable name
      ! Work variables
      type(extent_obj)  :: extents
      real(wp), pointer :: val(:,:,:)
      integer           :: n,m,id
      integer           :: i,j,k
      logical           :: found
      integer           :: dir
      integer           :: side


      ! Leave if no regions
      if (.not.allocated(bcs%region)) return

      ! Loop over regions
      do id=1,bcs%count

        ! Check Whether we have a BC for Volume Fraction
        found = bcs%CheckBCExists(bcs%region(id)%name,varname)
        if (.not.found) cycle
        if (bcs%GetBCType(bcs%region(id)%name,varname).ne.BC_DIRICHLET) cycle

        ! Get extents
        extents = bcs%GetExtents(bcs%region(id)%name)

        ! Get direction and side of BC
        call bcs%GetSideDirByRegion(bcs%region(id)%name,side,dir)

        ! Get a pointer to the BC values
        call bcs%GetBCPointer(bcs%region(id)%name,varname,val)

        ! Assuming zero gradient
        associate(lo => extents%lo, hi=>extents%hi)
          if (dir.eq.1) then
            do k=lo(3),hi(3)
              do j=lo(2),hi(2)
                do i=lo(1),hi(1)

                  do n=-this%st+1,this%st
                    do m=-this%st,this%st-1
                      if (side.eq.1 .and. (n+m.gt.0)) then
                        rhs%cell(i,j,k) = rhs%cell(i,j,k)  - this%c_d1dx1 (n,i)*this%c_d1dx1m(m,i+n)*val(i,j,k)
                      end if
                      if (side.eq.0 .and. (n+m.lt.0)) then
                        rhs%cell(i,j,k) = rhs%cell(i,j,k)  - this%c_d1dx1 (n,i)*this%c_d1dx1m(m,i+n)*val(i,j,k)
                      end if
                    end do
                  end do

                end do
              end do
            end do
          end if
          if (dir.eq.2) then
            do k=lo(3),hi(3)
              do j=lo(2),hi(2)
                do i=lo(1),hi(1)

                  do n=-this%st+1,this%st
                    do m=-this%st,this%st-1
                      if (side.eq.1 .and. (n+m.gt.0)) then
                        rhs%cell(i,j,k) = rhs%cell(i,j,k)  - this%c_d1dx2 (n,j)*this%c_d1dx2m(m,j+n)*val(i,j,k)
                      end if
                      if (side.eq.0 .and. (n+m.lt.0)) then
                        rhs%cell(i,j,k) = rhs%cell(i,j,k)  - this%c_d1dx2 (n,j)*this%c_d1dx2m(m,j+n)*val(i,j,k)
                      end if
                    end do
                  end do

                end do
              end do
            end do
          end if
          if (dir.eq.3) then
            do k=lo(3),hi(3)
              do j=lo(2),hi(2)
                do i=lo(1),hi(1)

                  do n=-this%st+1,this%st
                    do m=-this%st,this%st-1
                      if (side.eq.1 .and. (n+m.gt.0)) then
                        rhs%cell(i,j,k) = rhs%cell(i,j,k)  - this%c_d1dx3 (n,k)*this%c_d1dx3m(m,k+n)*val(i,j,k)
                      end if
                      if (side.eq.0 .and. (n+m.lt.0)) then
                        rhs%cell(i,j,k) = rhs%cell(i,j,k)  - this%c_d1dx3 (n,k)*this%c_d1dx3m(m,k+n)*val(i,j,k)
                      end if
                    end do
                  end do

                end do
              end do
            end do
          end if
        end associate

        val => null()
      end do

      return
    end subroutine op_obj_ApplyLaplacianDC