cdifs_obj_AdvanceSolutionCorrector Subroutine

subroutine cdifs_obj_AdvanceSolutionCorrector(this, it)

Perform corrector step: compute pressure at n+1 and divergence-free velocity at n+1.

Arguments

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

CDIFS solver

integer, intent(in) :: it

Subiterations


Calls

proc~~cdifs_obj_advancesolutioncorrector~~CallsGraph proc~cdifs_obj_advancesolutioncorrector cdifs_obj_AdvanceSolutionCorrector none~updateboundary bc_set%UpdateBoundary proc~cdifs_obj_advancesolutioncorrector->none~updateboundary proc~eulerian_obj_mean eulerian_obj_base%eulerian_obj_Mean proc~cdifs_obj_advancesolutioncorrector->proc~eulerian_obj_mean proc~eulerian_obj_updateghostcells eulerian_obj_base%eulerian_obj_UpdateGhostCells proc~cdifs_obj_advancesolutioncorrector->proc~eulerian_obj_updateghostcells proc~hypre_obj_setrhs hypre_obj%hypre_obj_SetRHS proc~cdifs_obj_advancesolutioncorrector->proc~hypre_obj_setrhs proc~hypre_obj_solve hypre_obj%hypre_obj_Solve proc~cdifs_obj_advancesolutioncorrector->proc~hypre_obj_solve proc~monitor_set_set monitor_set%monitor_set_Set proc~cdifs_obj_advancesolutioncorrector->proc~monitor_set_set proc~bc_set_updateboundaryscalar bc_set%bc_set_UpdateBoundaryScalar none~updateboundary->proc~bc_set_updateboundaryscalar proc~bc_set_updateboundaryvector bc_set%bc_set_UpdateBoundaryVector none~updateboundary->proc~bc_set_updateboundaryvector cell cell proc~eulerian_obj_mean->cell 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 proc~hypre_obj_setrhsij hypre_obj%hypre_obj_SetRHSIJ proc~hypre_obj_setrhs->proc~hypre_obj_setrhsij proc~hypre_obj_setrhss hypre_obj%hypre_obj_SetRHSS proc~hypre_obj_setrhs->proc~hypre_obj_setrhss proc~hypre_obj_solveij hypre_obj%hypre_obj_SolveIJ proc~hypre_obj_solve->proc~hypre_obj_solveij proc~hypre_obj_solves hypre_obj%hypre_obj_SolveS proc~hypre_obj_solve->proc~hypre_obj_solves proc~monitor_obj_setval monitor_obj%monitor_obj_SetVal proc~monitor_set_set->proc~monitor_obj_setval proc~monitor_set_getindex monitor_set%monitor_set_GetIndex proc~monitor_set_set->proc~monitor_set_getindex proc~parallel_obj_rankisroot parallel_obj%parallel_obj_RankIsRoot proc~monitor_set_set->proc~parallel_obj_rankisroot proc~bc_set_updateboundaryscalar->proc~eulerian_obj_updateghostcells proc~bc_set_checkbcexists bc_set%bc_set_CheckBCExists proc~bc_set_updateboundaryscalar->proc~bc_set_checkbcexists proc~bc_set_getbctype bc_set%bc_set_GetBCType proc~bc_set_updateboundaryscalar->proc~bc_set_getbctype proc~bc_set_updateboundarydirichlet bc_set%bc_set_UpdateBoundaryDirichlet proc~bc_set_updateboundaryscalar->proc~bc_set_updateboundarydirichlet proc~bc_set_updateboundaryneumann bc_set%bc_set_UpdateBoundaryNeumann proc~bc_set_updateboundaryscalar->proc~bc_set_updateboundaryneumann proc~bc_set_updateboundarysymmetryplus bc_set%bc_set_UpdateBoundarySymmetryPlus proc~bc_set_updateboundaryscalar->proc~bc_set_updateboundarysymmetryplus proc~bc_set_updateboundaryvector->proc~eulerian_obj_updateghostcells proc~bc_set_updateboundaryvector->proc~bc_set_checkbcexists proc~bc_set_updateboundaryvector->proc~bc_set_getbctype proc~bc_set_getsidedirbyregion bc_set%bc_set_GetSideDirByRegion proc~bc_set_updateboundaryvector->proc~bc_set_getsidedirbyregion proc~bc_set_updateboundaryvector->proc~bc_set_updateboundarydirichlet proc~bc_set_updateboundaryvector->proc~bc_set_updateboundaryneumann proc~bc_set_updateboundarysymmetryminus bc_set%bc_set_UpdateBoundarySymmetryMinus proc~bc_set_updateboundaryvector->proc~bc_set_updateboundarysymmetryminus proc~bc_set_updateboundaryvector->proc~bc_set_updateboundarysymmetryplus 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 hypre_ijvectorassemble hypre_ijvectorassemble proc~hypre_obj_setrhsij->hypre_ijvectorassemble hypre_ijvectorsetvalues hypre_ijvectorsetvalues proc~hypre_obj_setrhsij->hypre_ijvectorsetvalues hypre_structvectorassemble hypre_structvectorassemble proc~hypre_obj_setrhss->hypre_structvectorassemble hypre_structvectorsetvalues hypre_structvectorsetvalues proc~hypre_obj_setrhss->hypre_structvectorsetvalues proc~hypre_obj_solveij->proc~eulerian_obj_updateghostcells hypre_boomeramggetfinalreltvres hypre_boomeramggetfinalreltvres proc~hypre_obj_solveij->hypre_boomeramggetfinalreltvres hypre_boomeramggetnumiterations hypre_boomeramggetnumiterations proc~hypre_obj_solveij->hypre_boomeramggetnumiterations hypre_boomeramgsolve hypre_boomeramgsolve proc~hypre_obj_solveij->hypre_boomeramgsolve hypre_ijvectorgetvalues hypre_ijvectorgetvalues proc~hypre_obj_solveij->hypre_ijvectorgetvalues hypre_parcsrpcggetfinalrelative hypre_parcsrpcggetfinalrelative proc~hypre_obj_solveij->hypre_parcsrpcggetfinalrelative hypre_parcsrpcggetnumiterations hypre_parcsrpcggetnumiterations proc~hypre_obj_solveij->hypre_parcsrpcggetnumiterations hypre_parcsrpcgsolve hypre_parcsrpcgsolve proc~hypre_obj_solveij->hypre_parcsrpcgsolve 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 none~get~3 hashtbl_obj%Get proc~monitor_set_getindex->none~get~3 proc~hashtbl_obj_hashstring hashtbl_obj%hashtbl_obj_HashString proc~monitor_set_getindex->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 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_getsidedirbyregion->proc~bc_set_getregionindex proc~bc_set_updateboundarydirichlet->proc~bc_set_getsidedirbyregion proc~bc_set_getbcpointer bc_set%bc_set_GetBCPointer proc~bc_set_updateboundarydirichlet->proc~bc_set_getbcpointer proc~bc_set_getextents bc_set%bc_set_GetExtents proc~bc_set_updateboundarydirichlet->proc~bc_set_getextents proc~bc_set_updateboundaryneumann->proc~bc_set_getsidedirbyregion proc~bc_set_updateboundaryneumann->proc~bc_set_getextents proc~bc_set_updateboundarysymmetryminus->proc~bc_set_getsidedirbyregion proc~bc_set_updateboundarysymmetryminus->proc~bc_set_getextents proc~bc_set_updateboundarysymmetryplus->proc~bc_set_getsidedirbyregion proc~bc_set_updateboundarysymmetryplus->proc~bc_set_getextents proc~bc_set_getbcpointer->proc~bc_set_getregionindex proc~bc_set_getbcpointer->proc~region_obj_getbcindex proc~bc_set_getextents->proc~bc_set_getregionindex proc~bc_set_getregionindex->none~get~3 proc~bc_set_getregionindex->proc~hashtbl_obj_hashstring 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~region_obj_getbcindex->none~get~3 proc~region_obj_getbcindex->proc~hashtbl_obj_hashstring 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~~cdifs_obj_advancesolutioncorrector~~CalledByGraph proc~cdifs_obj_advancesolutioncorrector cdifs_obj_AdvanceSolutionCorrector proc~cdifs_obj_advancesolution cdifs_obj_AdvanceSolution proc~cdifs_obj_advancesolution->proc~cdifs_obj_advancesolutioncorrector interface~cdifs_obj_advancesolution cdifs_obj%cdifs_obj_AdvanceSolution interface~cdifs_obj_advancesolution->proc~cdifs_obj_advancesolution

Source Code

    subroutine cdifs_obj_AdvanceSolutionCorrector(this,it)
      !> Perform corrector step: compute pressure at n+1 and divergence-free
      ! velocity at n+1.
      implicit none
      class(cdifs_obj), intent(inout) :: this                                  !! CDIFS solver
      integer,          intent(in)    :: it                                    !! Subiterations
      ! Work variables
      integer :: i,j,k
      real(wp):: buffr,vol,dV
      real(wp):: intRHS
      integer :: dir

      ! Compute the right-hand side of the pressure poisson equation
      associate (lo => this%block%lo, hi => this%block%hi, op => this%op, &
        rho => this%rho, dt => this%timer%dt)

          this%rhs = 0.0_wp
          do k=lo(3),hi(3)
            do j=lo(2),hi(2)
              do i=lo(1),hi(1)

                this%rhs%cell(i,j,k) = this%rhs%cell(i,j,k) + (rho/dt)*( &
                      dot_product(this%DIV(:,i,j,k,1),this%V(1)%cell(i-op%st+1:i+op%st,j,k)) &
                    + dot_product(this%DIV(:,i,j,k,2),this%V(2)%cell(i,j-op%st+1:j+op%st,k)) &
                    + dot_product(this%DIV(:,i,j,k,3),this%V(3)%cell(i,j,k-op%st+1:k+op%st)) )

              end do
            end do
          end do

      end associate

      ! Compute integral of RHS -- needs to be close to machine precision
      associate ( lo => this%block%lo, hi => this%block%hi )

        intRHS = 0.0_wp
        vol    = 0.0_wp
        do k=lo(3),hi(3)
          do j=lo(2),hi(2)
            do i=lo(1),hi(1)
              dV     = this%block%axis(1)%dxm(i) &
                     * this%block%axis(2)%dxm(j) &
                     * this%block%axis(3)%dxm(k)
              vol    = vol + dV
              intRHS = intRHS + this%rhs%cell(i,j,k)*dV
            end do
          end do
        end do

        call this%parallel%sum(vol,   buffr); vol    = buffr
        call this%parallel%sum(intRHS,buffr); intRHS = buffr/vol
      end associate

      ! Compute the pressure correction
      !--------------------------------
      associate ( dP=>this%DP, rhs=>this%rhs, hypre=>this%hypre, bcs=>this%bcs)
        call hypre%SetRHS(rhs)
        call hypre%Solve(dP)
        dP%cell = dP%cell - dP%mean()

        call bcs%UpdateBoundary(dP)
      end associate


      ! Update pressure
      !--------------------------------
      associate ( dP=>this%DP, P=>this%P, bcs=>this%bcs)
        P = P + dP
        call bcs%UpdateBoundary(P)
      end associate

      associate ( V=>this%V, dP=>this%dP, rho=>this%rho,    &
        lo=>this%block%lo, hi=>this%block%hi, op=>this%op,  &
        bcs=>this%bcs, dt=>this%timer%dt)

        do k=lo(3),hi(3)
          do j=lo(2),hi(2)
            do i=lo(1),hi(1)
              V(1)%cell(i,j,k) = V(1)%cell(i,j,k) - (dt/rho) * dot_product(this%pGRAD(:,i,j,k,1),dP%cell(i-op%st:i+op%st-1,j,k))
              V(2)%cell(i,j,k) = V(2)%cell(i,j,k) - (dt/rho) * dot_product(this%pGRAD(:,i,j,k,2),dP%cell(i,j-op%st:j+op%st-1,k))
              V(3)%cell(i,j,k) = V(3)%cell(i,j,k) - (dt/rho) * dot_product(this%pGRAD(:,i,j,k,3),dP%cell(i,j,k-op%st:k+op%st-1))
            end do
          end do
        end do

        do dir=1,3
          call V(dir)%UpdateGhostCells
          call bcs%UpdateBoundary(V(dir))
        end do
      end associate

      ! Send diagnostics to pressure monitor
      call this%pmonitor%Set('Pressure', 1, this%timer%iter)
      call this%pmonitor%Set('Pressure', 2, this%timer%time)
      call this%pmonitor%Set('Pressure', 3, it             )
      call this%pmonitor%Set('Pressure', 4, this%hypre%rel )
      call this%pmonitor%Set('Pressure', 5, intRHS         )
      call this%pmonitor%Set('Pressure', 6, this%hypre%it  )

      ! Print pressure monitor
      call this%pmonitor%print()

      return
    end subroutine cdifs_obj_AdvanceSolutionCorrector