hypre_obj_SolveS Subroutine

private impure subroutine hypre_obj_SolveS(this, sol)

Solves the system Ax=b and return the solution, Struct interface.

Type Bound

hypre_obj

Arguments

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

Hypre machinery

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

Solution vector


Calls

proc~~hypre_obj_solves~~CallsGraph proc~hypre_obj_solves hypre_obj%hypre_obj_SolveS hypre_structpcggetfinalrelative hypre_structpcggetfinalrelative proc~hypre_obj_solves->hypre_structpcggetfinalrelative hypre_structpcggetnumiterations hypre_structpcggetnumiterations proc~hypre_obj_solves->hypre_structpcggetnumiterations hypre_structpcgsolve hypre_structpcgsolve proc~hypre_obj_solves->hypre_structpcgsolve hypre_structpfmggetfinalrelativ hypre_structpfmggetfinalrelativ proc~hypre_obj_solves->hypre_structpfmggetfinalrelativ hypre_structpfmggetnumiteration hypre_structpfmggetnumiteration proc~hypre_obj_solves->hypre_structpfmggetnumiteration hypre_structpfmgsolve hypre_structpfmgsolve proc~hypre_obj_solves->hypre_structpfmgsolve hypre_structsmggetfinalrelative hypre_structsmggetfinalrelative proc~hypre_obj_solves->hypre_structsmggetfinalrelative hypre_structsmggetnumiterations hypre_structsmggetnumiterations proc~hypre_obj_solves->hypre_structsmggetnumiterations hypre_structsmgsolve hypre_structsmgsolve proc~hypre_obj_solves->hypre_structsmgsolve hypre_structvectorgetboxvalues hypre_structvectorgetboxvalues proc~hypre_obj_solves->hypre_structvectorgetboxvalues

Called by

proc~~hypre_obj_solves~~CalledByGraph proc~hypre_obj_solves hypre_obj%hypre_obj_SolveS proc~hypre_obj_solve hypre_obj%hypre_obj_Solve proc~hypre_obj_solve->proc~hypre_obj_solves proc~cdifs_obj_advancesolutioncorrector cdifs_obj_AdvanceSolutionCorrector proc~cdifs_obj_advancesolutioncorrector->proc~hypre_obj_solve proc~cdifs_obj_computesolidvf cdifs_obj%cdifs_obj_ComputeSolidVF proc~cdifs_obj_computesolidvf->proc~hypre_obj_solve proc~grans_obj_computesolidvf grans_obj%grans_obj_ComputeSolidVF proc~grans_obj_computesolidvf->proc~hypre_obj_solve proc~marker_set_computesolidvolfrac marker_set%marker_set_ComputeSolidVolFrac proc~marker_set_computesolidvolfrac->proc~hypre_obj_solve proc~cdifs_obj_advancesolution cdifs_obj_AdvanceSolution proc~cdifs_obj_advancesolution->proc~cdifs_obj_advancesolutioncorrector proc~cdifs_obj_advancesolutionrp cdifs_obj_AdvanceSolutionRP proc~cdifs_obj_advancesolution->proc~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_advancesolution cdifs_obj%cdifs_obj_AdvanceSolution interface~cdifs_obj_advancesolution->proc~cdifs_obj_advancesolution 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

Source Code

    impure subroutine hypre_obj_SolveS(this,sol)
      !> Solves the system Ax=b and return the solution, Struct interface.
      implicit none
      class(hypre_obj),     intent(inout) :: this                              !! Hypre machinery
      type(eulerian_obj_r), intent(inout) :: sol                               !! Solution vector
      ! Work variables
      integer :: ierr
      integer :: nval
      integer :: i,j,k,m
      real(wp), allocatable :: values(:)

      ! Number of grid points
      nval=(this%block%hi(3)-this%block%lo(3)+1) &
          *(this%block%hi(2)-this%block%lo(2)+1) &
          *(this%block%hi(1)-this%block%lo(1)+1)

      select case (this%solver_name)
      case (HYPRE_SOL_S_PCG_NONE)
        call HYPRE_StructPCGSolve(this%solver,this%matrix,this%rhs,this%sol, ierr)
        call HYPRE_StructPCGGetNumIterations(this%solver,this%it,ierr)
        call HYPRE_StructPCGGetFinalRelative(this%solver,this%rel,ierr)
      case (HYPRE_SOL_S_SMG_NONE)
        call HYPRE_StructSMGSolve(this%solver,this%matrix,this%rhs,this%sol, ierr)
        call HYPRE_StructSMGGetNumIterations(this%solver,this%it,ierr)
        call HYPRE_StructSMGGetFinalRelative(this%solver,this%rel,ierr)
      case (HYPRE_SOL_S_PFMG_NONE)
        call HYPRE_StructPFMGSolve(this%solver,this%matrix,this%rhs,this%sol, ierr)
        call HYPRE_StructPFMGGetNumIteration(this%solver,this%it,ierr)
        call HYPRE_StructPFMGGetFinalRelativ(this%solver,this%rel,ierr)
      case default
        call this%parallel%Stop("HYPRE: Unknown solver")
      end select

      allocate(values(nval))

      ! Get the values
      call HYPRE_StructVectorGetBoxValues(this%sol,this%block%lo(1:this%dim),&
           this%block%hi(1:this%dim),values(1:nval),ierr)
      ! Loop over cell following Hypre convention (from bottom left, to top right)
      m=1
      do k=this%block%lo(3),this%block%hi(3)
        do j=this%block%lo(2),this%block%hi(2)
          do i=this%block%lo(1),this%block%hi(1)
            sol%cell(i,j,k)=values(m)
            m=m+1
          end do
        end do
      end do

      deallocate(values)

      return
    end subroutine hypre_obj_SolveS