grans_obj_PrepareSolverOperators Subroutine

subroutine grans_obj_PrepareSolverOperators(this)

Uses

  • proc~~grans_obj_preparesolveroperators~~UsesGraph proc~grans_obj_preparesolveroperators grans_obj_PrepareSolverOperators module~leapdiffop leapDiffOp proc~grans_obj_preparesolveroperators->module~leapdiffop module~leapbc leapBC module~leapdiffop->module~leapbc module~leapblock leapBlock module~leapdiffop->module~leapblock module~leapeulerian leapEulerian module~leapdiffop->module~leapeulerian module~leapkinds leapKinds module~leapdiffop->module~leapkinds module~leapparallel leapParallel module~leapdiffop->module~leapparallel module~leapbc->module~leapblock module~leapbc->module~leapeulerian module~leapbc->module~leapkinds module~leapbc->module~leapparallel iso_fortran_env iso_fortran_env module~leapbc->iso_fortran_env module~leapio leapIO module~leapbc->module~leapio module~leaputils leapUtils module~leapbc->module~leaputils mpi_f08 mpi_f08 module~leapbc->mpi_f08 module~leapblock->module~leapkinds module~leapblock->module~leapparallel module~leapblock->iso_fortran_env module~leapio_hdf5 leapIO_hdf5 module~leapblock->module~leapio_hdf5 module~leapblock->mpi_f08 module~leapeulerian->module~leapblock module~leapeulerian->module~leapkinds module~leapeulerian->module~leapparallel module~leapeulerian->iso_fortran_env module~leapeulerian->module~leapio module~leapeulerian->module~leaputils module~leapeulerian->mpi_f08 module~leapkinds->iso_fortran_env module~leapparallel->module~leapkinds module~leapparallel->iso_fortran_env module~leapparallel->mpi_f08 module~leapio->module~leapio_hdf5 module~leapio_h5hut leapIO_h5hut module~leapio->module~leapio_h5hut module~leapio_silo leapIO_silo module~leapio->module~leapio_silo module~leapio_xdmf leapIO_xdmf module~leapio->module~leapio_xdmf module~leapio_hdf5->module~leapkinds module~leapio_hdf5->module~leapparallel module~leapio_hdf5->module~leaputils hdf5 hdf5 module~leapio_hdf5->hdf5 module~leaputils->module~leapkinds module~leapio_h5hut->module~leapkinds module~leapio_h5hut->module~leapparallel module~leapio_h5hut->module~leapio_hdf5 module~leapio_silo->module~leapkinds module~leapio_silo->module~leapparallel module~leapio_silo->module~leaputils module~leapio_silo->mpi_f08 module~leapio_xdmf->module~leapkinds module~leapio_xdmf->module~leaputils

Prepares operators used by GRANS. This subroutine also builds the volume fraction Poisson operator with the specified boundary conditions.

Arguments

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

GRANS solver


Calls

proc~~grans_obj_preparesolveroperators~~CallsGraph proc~grans_obj_preparesolveroperators grans_obj_PrepareSolverOperators none~get~4 parser_obj%Get proc~grans_obj_preparesolveroperators->none~get~4 proc~bc_set_checkbcexists bc_set%bc_set_CheckBCExists proc~grans_obj_preparesolveroperators->proc~bc_set_checkbcexists proc~bc_set_getbctype bc_set%bc_set_GetBCType proc~grans_obj_preparesolveroperators->proc~bc_set_getbctype proc~bc_set_getextents bc_set%bc_set_GetExtents proc~grans_obj_preparesolveroperators->proc~bc_set_getextents proc~bc_set_getsidedirbyregion bc_set%bc_set_GetSideDirByRegion proc~grans_obj_preparesolveroperators->proc~bc_set_getsidedirbyregion proc~hypre_obj_selectsolver hypre_obj%hypre_obj_SelectSolver proc~grans_obj_preparesolveroperators->proc~hypre_obj_selectsolver proc~hypre_obj_setup hypre_obj%hypre_obj_Setup proc~grans_obj_preparesolveroperators->proc~hypre_obj_setup proc~op_obj_init op_obj%op_obj_Init proc~grans_obj_preparesolveroperators->proc~op_obj_init proc~parser_obj_read0d parser_obj%parser_obj_read0D none~get~4->proc~parser_obj_read0d proc~parser_obj_read1d parser_obj%parser_obj_read1D none~get~4->proc~parser_obj_read1d 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_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 proc~hypre_obj_setupgrids hypre_obj%hypre_obj_SetupGridS proc~hypre_obj_setup->proc~hypre_obj_setupgrids proc~hypre_obj_setupmatrixij hypre_obj%hypre_obj_SetupMatrixIJ proc~hypre_obj_setup->proc~hypre_obj_setupmatrixij proc~hypre_obj_setupmatrixs hypre_obj%hypre_obj_SetupMatrixS proc~hypre_obj_setup->proc~hypre_obj_setupmatrixs proc~hypre_obj_setuppointersij hypre_obj%hypre_obj_SetupPointersIJ proc~hypre_obj_setup->proc~hypre_obj_setuppointersij proc~hypre_obj_setuprhsij hypre_obj%hypre_obj_SetupRHSIJ proc~hypre_obj_setup->proc~hypre_obj_setuprhsij proc~hypre_obj_setuprhss hypre_obj%hypre_obj_SetupRHSS proc~hypre_obj_setup->proc~hypre_obj_setuprhss proc~hypre_obj_setuprowsij hypre_obj%hypre_obj_SetupRowsIJ proc~hypre_obj_setup->proc~hypre_obj_setuprowsij proc~hypre_obj_setupsolij hypre_obj%hypre_obj_SetupSolIJ proc~hypre_obj_setup->proc~hypre_obj_setupsolij proc~hypre_obj_setupsolijver hypre_obj%hypre_obj_SetupSolIJver proc~hypre_obj_setup->proc~hypre_obj_setupsolijver proc~hypre_obj_setupsols hypre_obj%hypre_obj_SetupSolS proc~hypre_obj_setup->proc~hypre_obj_setupsols proc~hypre_obj_setupsolvers hypre_obj%hypre_obj_SetupSolverS proc~hypre_obj_setup->proc~hypre_obj_setupsolvers proc~hypre_obj_setupstencils hypre_obj%hypre_obj_SetupStencilS proc~hypre_obj_setup->proc~hypre_obj_setupstencils 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 hypre_structgridassemble hypre_structgridassemble proc~hypre_obj_setupgrids->hypre_structgridassemble hypre_structgridcreate hypre_structgridcreate proc~hypre_obj_setupgrids->hypre_structgridcreate hypre_structgridsetextents hypre_structgridsetextents proc~hypre_obj_setupgrids->hypre_structgridsetextents hypre_structgridsetperiodic hypre_structgridsetperiodic proc~hypre_obj_setupgrids->hypre_structgridsetperiodic hypre_ijmatrixassemble hypre_ijmatrixassemble proc~hypre_obj_setupmatrixij->hypre_ijmatrixassemble hypre_ijmatrixcreate hypre_ijmatrixcreate proc~hypre_obj_setupmatrixij->hypre_ijmatrixcreate hypre_ijmatrixgetobject hypre_ijmatrixgetobject proc~hypre_obj_setupmatrixij->hypre_ijmatrixgetobject hypre_ijmatrixinitialize hypre_ijmatrixinitialize proc~hypre_obj_setupmatrixij->hypre_ijmatrixinitialize hypre_ijmatrixsetobjecttype hypre_ijmatrixsetobjecttype proc~hypre_obj_setupmatrixij->hypre_ijmatrixsetobjecttype proc~hypre_obj_buildmatrixij hypre_obj%hypre_obj_BuildMatrixIJ proc~hypre_obj_setupmatrixij->proc~hypre_obj_buildmatrixij hypre_structmatrixassemble hypre_structmatrixassemble proc~hypre_obj_setupmatrixs->hypre_structmatrixassemble hypre_structmatrixcreate hypre_structmatrixcreate proc~hypre_obj_setupmatrixs->hypre_structmatrixcreate hypre_structmatrixinitialize hypre_structmatrixinitialize proc~hypre_obj_setupmatrixs->hypre_structmatrixinitialize proc~hypre_obj_buildmatrixs hypre_obj%hypre_obj_BuildMatrixS proc~hypre_obj_setupmatrixs->proc~hypre_obj_buildmatrixs hypre_setexecutionpolicy hypre_setexecutionpolicy proc~hypre_obj_setuppointersij->hypre_setexecutionpolicy hypre_setmemorylocation hypre_setmemorylocation proc~hypre_obj_setuppointersij->hypre_setmemorylocation hypre_setspgemmusevendor hypre_setspgemmusevendor proc~hypre_obj_setuppointersij->hypre_setspgemmusevendor proc~device_malloc_managed device_malloc_managed proc~hypre_obj_setuppointersij->proc~device_malloc_managed hypre_ijvectorassemble hypre_ijvectorassemble proc~hypre_obj_setuprhsij->hypre_ijvectorassemble hypre_ijvectorcreate hypre_ijvectorcreate proc~hypre_obj_setuprhsij->hypre_ijvectorcreate hypre_ijvectorgetobject hypre_ijvectorgetobject proc~hypre_obj_setuprhsij->hypre_ijvectorgetobject hypre_ijvectorinitialize hypre_ijvectorinitialize proc~hypre_obj_setuprhsij->hypre_ijvectorinitialize hypre_ijvectorsetobjecttype hypre_ijvectorsetobjecttype proc~hypre_obj_setuprhsij->hypre_ijvectorsetobjecttype hypre_ijvectorsetvalues hypre_ijvectorsetvalues proc~hypre_obj_setuprhsij->hypre_ijvectorsetvalues hypre_structvectorassemble hypre_structvectorassemble proc~hypre_obj_setuprhss->hypre_structvectorassemble hypre_structvectorcreate hypre_structvectorcreate proc~hypre_obj_setuprhss->hypre_structvectorcreate hypre_structvectorinitialize hypre_structvectorinitialize proc~hypre_obj_setuprhss->hypre_structvectorinitialize proc~eulerian_obj_init eulerian_obj_base%eulerian_obj_Init proc~hypre_obj_setuprowsij->proc~eulerian_obj_init proc~eulerian_obj_updateghostcells eulerian_obj_base%eulerian_obj_UpdateGhostCells proc~hypre_obj_setuprowsij->proc~eulerian_obj_updateghostcells proc~hypre_obj_setupsolij->hypre_ijvectorassemble proc~hypre_obj_setupsolij->hypre_ijvectorcreate proc~hypre_obj_setupsolij->hypre_ijvectorgetobject proc~hypre_obj_setupsolij->hypre_ijvectorinitialize proc~hypre_obj_setupsolij->hypre_ijvectorsetobjecttype proc~hypre_obj_setupsolij->hypre_ijvectorsetvalues hypre_boomeramgcreate hypre_boomeramgcreate proc~hypre_obj_setupsolijver->hypre_boomeramgcreate hypre_boomeramgsetagginterptype hypre_boomeramgsetagginterptype proc~hypre_obj_setupsolijver->hypre_boomeramgsetagginterptype hypre_boomeramgsetaggnumlevels hypre_boomeramgsetaggnumlevels proc~hypre_obj_setupsolijver->hypre_boomeramgsetaggnumlevels hypre_boomeramgsetcoarsentype hypre_boomeramgsetcoarsentype proc~hypre_obj_setupsolijver->hypre_boomeramgsetcoarsentype hypre_boomeramgsetinterptype hypre_boomeramgsetinterptype proc~hypre_obj_setupsolijver->hypre_boomeramgsetinterptype hypre_boomeramgsetkeeptransp hypre_boomeramgsetkeeptransp proc~hypre_obj_setupsolijver->hypre_boomeramgsetkeeptransp hypre_boomeramgsetmaxiter hypre_boomeramgsetmaxiter proc~hypre_obj_setupsolijver->hypre_boomeramgsetmaxiter hypre_boomeramgsetmaxlevels hypre_boomeramgsetmaxlevels proc~hypre_obj_setupsolijver->hypre_boomeramgsetmaxlevels hypre_boomeramgsetnumsweeps hypre_boomeramgsetnumsweeps proc~hypre_obj_setupsolijver->hypre_boomeramgsetnumsweeps hypre_boomeramgsetpmaxelmts hypre_boomeramgsetpmaxelmts proc~hypre_obj_setupsolijver->hypre_boomeramgsetpmaxelmts hypre_boomeramgsetprintlevel hypre_boomeramgsetprintlevel proc~hypre_obj_setupsolijver->hypre_boomeramgsetprintlevel hypre_boomeramgsetrap2 hypre_boomeramgsetrap2 proc~hypre_obj_setupsolijver->hypre_boomeramgsetrap2 hypre_boomeramgsetrelaxorder hypre_boomeramgsetrelaxorder proc~hypre_obj_setupsolijver->hypre_boomeramgsetrelaxorder hypre_boomeramgsetrelaxtype hypre_boomeramgsetrelaxtype proc~hypre_obj_setupsolijver->hypre_boomeramgsetrelaxtype hypre_boomeramgsettol hypre_boomeramgsettol proc~hypre_obj_setupsolijver->hypre_boomeramgsettol hypre_boomeramgsetup hypre_boomeramgsetup proc~hypre_obj_setupsolijver->hypre_boomeramgsetup hypre_parcsrpcgcreate hypre_parcsrpcgcreate proc~hypre_obj_setupsolijver->hypre_parcsrpcgcreate hypre_parcsrpcgsetlogging hypre_parcsrpcgsetlogging proc~hypre_obj_setupsolijver->hypre_parcsrpcgsetlogging hypre_parcsrpcgsetmaxiter hypre_parcsrpcgsetmaxiter proc~hypre_obj_setupsolijver->hypre_parcsrpcgsetmaxiter hypre_parcsrpcgsetprecond hypre_parcsrpcgsetprecond proc~hypre_obj_setupsolijver->hypre_parcsrpcgsetprecond hypre_parcsrpcgsettol hypre_parcsrpcgsettol proc~hypre_obj_setupsolijver->hypre_parcsrpcgsettol hypre_parcsrpcgsettwonorm hypre_parcsrpcgsettwonorm proc~hypre_obj_setupsolijver->hypre_parcsrpcgsettwonorm hypre_parcsrpcgsetup hypre_parcsrpcgsetup proc~hypre_obj_setupsolijver->hypre_parcsrpcgsetup proc~hypre_obj_setupsols->hypre_structvectorassemble proc~hypre_obj_setupsols->hypre_structvectorcreate proc~hypre_obj_setupsols->hypre_structvectorinitialize hypre_structvectorsetboxvalues hypre_structvectorsetboxvalues proc~hypre_obj_setupsols->hypre_structvectorsetboxvalues hypre_structpcgcreate hypre_structpcgcreate proc~hypre_obj_setupsolvers->hypre_structpcgcreate hypre_structpcgsetlogging hypre_structpcgsetlogging proc~hypre_obj_setupsolvers->hypre_structpcgsetlogging hypre_structpcgsetmaxiter hypre_structpcgsetmaxiter proc~hypre_obj_setupsolvers->hypre_structpcgsetmaxiter hypre_structpcgsetprintlevel hypre_structpcgsetprintlevel proc~hypre_obj_setupsolvers->hypre_structpcgsetprintlevel hypre_structpcgsettol hypre_structpcgsettol proc~hypre_obj_setupsolvers->hypre_structpcgsettol hypre_structpcgsetup hypre_structpcgsetup proc~hypre_obj_setupsolvers->hypre_structpcgsetup hypre_structpfmgcreate hypre_structpfmgcreate proc~hypre_obj_setupsolvers->hypre_structpfmgcreate hypre_structpfmgsetlogging hypre_structpfmgsetlogging proc~hypre_obj_setupsolvers->hypre_structpfmgsetlogging hypre_structpfmgsetmaxiter hypre_structpfmgsetmaxiter proc~hypre_obj_setupsolvers->hypre_structpfmgsetmaxiter hypre_structpfmgsetprintlevel hypre_structpfmgsetprintlevel proc~hypre_obj_setupsolvers->hypre_structpfmgsetprintlevel hypre_structpfmgsetraptype hypre_structpfmgsetraptype proc~hypre_obj_setupsolvers->hypre_structpfmgsetraptype hypre_structpfmgsetrelaxtype hypre_structpfmgsetrelaxtype proc~hypre_obj_setupsolvers->hypre_structpfmgsetrelaxtype hypre_structpfmgsettol hypre_structpfmgsettol proc~hypre_obj_setupsolvers->hypre_structpfmgsettol hypre_structpfmgsetup hypre_structpfmgsetup proc~hypre_obj_setupsolvers->hypre_structpfmgsetup hypre_structsmgcreate hypre_structsmgcreate proc~hypre_obj_setupsolvers->hypre_structsmgcreate hypre_structsmgsetlogging hypre_structsmgsetlogging proc~hypre_obj_setupsolvers->hypre_structsmgsetlogging hypre_structsmgsetmaxiter hypre_structsmgsetmaxiter proc~hypre_obj_setupsolvers->hypre_structsmgsetmaxiter hypre_structsmgsetnumpostrelax hypre_structsmgsetnumpostrelax proc~hypre_obj_setupsolvers->hypre_structsmgsetnumpostrelax hypre_structsmgsetnumprerelax hypre_structsmgsetnumprerelax proc~hypre_obj_setupsolvers->hypre_structsmgsetnumprerelax hypre_structsmgsetprintlevel hypre_structsmgsetprintlevel proc~hypre_obj_setupsolvers->hypre_structsmgsetprintlevel hypre_structsmgsettol hypre_structsmgsettol proc~hypre_obj_setupsolvers->hypre_structsmgsettol hypre_structsmgsetup hypre_structsmgsetup proc~hypre_obj_setupsolvers->hypre_structsmgsetup hypre_structstencilcreate hypre_structstencilcreate proc~hypre_obj_setupstencils->hypre_structstencilcreate hypre_structstencilsetelement hypre_structstencilsetelement proc~hypre_obj_setupstencils->hypre_structstencilsetelement none~assigndefault parser_obj%AssignDefault proc~parser_obj_read0d->none~assigndefault proc~parser_obj_fetchlabelid parser_obj%parser_obj_FetchLabelID proc~parser_obj_read0d->proc~parser_obj_fetchlabelid proc~parser_obj_read1d->none~assigndefault proc~parser_obj_read1d->proc~parser_obj_fetchlabelid proc~region_obj_getbcindex->none~get~3 proc~region_obj_getbcindex->proc~hashtbl_obj_hashstring proc~parser_obj_assigndefault0d parser_obj%parser_obj_AssignDefault0D none~assigndefault->proc~parser_obj_assigndefault0d proc~parser_obj_assigndefault1d parser_obj%parser_obj_AssignDefault1D none~assigndefault->proc~parser_obj_assigndefault1d 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 interface~cudamallocmanaged cudaMallocManaged proc~device_malloc_managed->interface~cudamallocmanaged proc~eulerian_obj_updateghostcells_x eulerian_obj_base%eulerian_obj_UpdateGhostCells_x proc~eulerian_obj_updateghostcells->proc~eulerian_obj_updateghostcells_x proc~eulerian_obj_updateghostcells_y eulerian_obj_base%eulerian_obj_UpdateGhostCells_y proc~eulerian_obj_updateghostcells->proc~eulerian_obj_updateghostcells_y proc~eulerian_obj_updateghostcells_z eulerian_obj_base%eulerian_obj_UpdateGhostCells_z proc~eulerian_obj_updateghostcells->proc~eulerian_obj_updateghostcells_z hypre_ijmatrixaddtovalues hypre_ijmatrixaddtovalues proc~hypre_obj_buildmatrixij->hypre_ijmatrixaddtovalues hypre_structmatrixsetvalues hypre_structmatrixsetvalues proc~hypre_obj_buildmatrixs->hypre_structmatrixsetvalues cell cell proc~eulerian_obj_updateghostcells_x->cell mpi_irecv mpi_irecv proc~eulerian_obj_updateghostcells_x->mpi_irecv mpi_isend mpi_isend proc~eulerian_obj_updateghostcells_x->mpi_isend mpi_waitall mpi_waitall proc~eulerian_obj_updateghostcells_x->mpi_waitall proc~eulerian_obj_updateghostcells_y->cell proc~eulerian_obj_updateghostcells_y->mpi_irecv proc~eulerian_obj_updateghostcells_y->mpi_isend proc~eulerian_obj_updateghostcells_y->mpi_waitall proc~eulerian_obj_updateghostcells_z->cell proc~eulerian_obj_updateghostcells_z->mpi_irecv proc~eulerian_obj_updateghostcells_z->mpi_isend proc~eulerian_obj_updateghostcells_z->mpi_waitall 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~~grans_obj_preparesolveroperators~~CalledByGraph proc~grans_obj_preparesolveroperators grans_obj_PrepareSolverOperators proc~grans_obj_preparesolver grans_obj_PrepareSolver proc~grans_obj_preparesolver->proc~grans_obj_preparesolveroperators interface~grans_obj_preparesolver grans_obj%grans_obj_PrepareSolver interface~grans_obj_preparesolver->proc~grans_obj_preparesolver

Source Code

    subroutine grans_obj_PrepareSolverOperators(this)
      !> Prepares operators used by GRANS.
      ! This subroutine also builds the volume fraction Poisson operator
      ! with the specified boundary conditions.
      use leapDiffOp
      implicit none
      class(grans_obj), intent(inout) :: this                                  !! GRANS solver
      ! Work variables
      integer               :: scheme_order
      character(str64)      :: hypre_solver
      integer               :: hypre_max_it
      real(wp)              :: hypre_res_tol
      real(wp), allocatable :: GRAD(:,:,:,:,:)
      real(wp), allocatable :: DIV (:,:,:,:,:)
      type(extent_obj)      :: extents
      integer               :: bcdir
      integer               :: side
      integer               :: slo(3)
      integer               :: shi(3)
      integer               :: i,j,k,m,n

      ! Get information from input
      call this%parser%Get("Scheme order",       scheme_order,  default = 2            )
      call this%parser%Get('VF solver',          hypre_solver , default = "IJ-AMG-NONE")
      call this%parser%Get('VF Max Iterm',       hypre_max_it , default = 30           )
      call this%parser%Get('VF Convergence Tol', hypre_res_tol, default = 1.0e-10_wp   )

      ! Initialize basic differential operators
      call this%op%Initialize(this%block,this%parallel,order=scheme_order)

      ! Intialize volume fraction solver
      call this%VFSolver%Initialize(this%block,this%parallel)
      call this%VFSolver%SelectSolver(hypre_solver,MaxTol=hypre_res_tol,MaxIt=hypre_max_it)

      ! Use differential operators to build the laplacian inside HYPRE
      associate (lo => this%block%lo, hi => this%block%hi, st => this%op%st, bcs => this%bcs)
        allocate(GRAD(-st:st-1,lo(1)-st+1:hi(1)+st,lo(2)-st+1:hi(2)+st,lo(3)-st+1:hi(3)+st,3))
        allocate(DIV (-st+1:st,lo(1)     :hi(1)   ,lo(2)     :hi(2)   ,lo(3)     :hi(3)   ,3))
        GRAD = 0.0_wp
        DIV  = 0.0_wp

        ! Define GRAD
        do k=lo(3)-st+1,hi(3)+st
          do j=lo(2)-st+1,hi(2)+st
            do i=lo(1)-st+1,hi(1)+st
              do m=-st,st-1
                GRAD(m,i,j,k,1) = GRAD(m,i,j,k,1) + this%op%c_d1dx1m(m,i)
                GRAD(m,i,j,k,2) = GRAD(m,i,j,k,2) + this%op%c_d1dx2m(m,j)
                GRAD(m,i,j,k,3) = GRAD(m,i,j,k,3) + this%op%c_d1dx3m(m,k)
              end do
            end do
          end do
        end do

        ! Apply BC
        do n=1,bcs%count
          ! Check whether we have a boundary condition on this region
          if (bcs%CheckBCExists(bcs%region(n)%name, 'ibVF')) then

            select case ( bcs%GetBCType(bcs%region(n)%name, 'ibVF') )
            case (BC_NEUMANN, BC_SYMMETRY)
                ! Get direction and side of BC
                call bcs%GetSideDirByRegion(bcs%region(n)%name,side,bcdir)

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

                slo = extents%lo
                shi = extents%hi

                select case (side)
                case (BC_LEFT)
                  slo(bcdir) = slo(bcdir) - min(st-1,this%block%ngc)
                case (BC_RIGHT)
                  slo(bcdir) = slo(bcdir) + 1
                  shi(bcdir) = shi(bcdir) + min(st,this%block%ngc)
                end select

                do k=slo(3),shi(3)
                  do j=slo(2),shi(2)
                    do i=slo(1),shi(1)
                      GRAD(:,i,j,k,bcdir) = 0.0_wp
                    end do
                  end do
                end do

            case default
              ! Do nothing
            end select
          end if
        end do

        ! Define DIV
        do k=lo(3),hi(3)
          do j=lo(2),hi(2)
            do i=lo(1),hi(1)
              do n=-st+1,st
                DIV(n,i,j,k,1) = DIV(n,i,j,k,1) + this%op%c_d1dx1(n,i)
                DIV(n,i,j,k,2) = DIV(n,i,j,k,2) + this%op%c_d1dx2(n,j)
                DIV(n,i,j,k,3) = DIV(n,i,j,k,3) + this%op%c_d1dx3(n,k)
              end do
            end do
          end do
        end do

      end associate

      this%VFSolver%stm = 2*this%op%st-1
      associate (lo => this%block%lo, hi => this%block%hi, stm =>this%VFSolver%stm)
        allocate(this%VFSolver%mat(lo(1):hi(1),lo(2):hi(2),lo(3):hi(3),3,-stm:stm),source=0.0_wp)
      end associate

      associate (lo => this%block%lo, hi => this%block%hi, st => this%op%st)
        do k=lo(3),hi(3)
          do j=lo(2),hi(2)
            do i=lo(1),hi(1)
              do n= -st+1,st
                do m=-st,st-1
                 this%VFSolver%mat(i,j,k,1,n+m) = this%VFSolver%mat(i,j,k,1,n+m) + DIV(n,i,j,k,1)*GRAD(m,i+n,j,k,1)
                 this%VFSolver%mat(i,j,k,2,n+m) = this%VFSolver%mat(i,j,k,2,n+m) + DIV(n,i,j,k,2)*GRAD(m,i,j+n,k,2)
                 this%VFSolver%mat(i,j,k,3,n+m) = this%VFSolver%mat(i,j,k,3,n+m) + DIV(n,i,j,k,3)*GRAD(m,i,j,k+n,3)
                end do
              end do

            end do
          end do
        end do
      end associate

      deallocate(GRAD,DIV)

      call this%VFSolver%Setup()

      return
    end subroutine grans_obj_PrepareSolverOperators