cdifs_obj_AdvanceSolutionIB Subroutine

subroutine cdifs_obj_AdvanceSolutionIB(this)

Performs intermediate IB step>

Arguments

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

CDIFS solver


Calls

proc~~cdifs_obj_advancesolutionib~~CallsGraph proc~cdifs_obj_advancesolutionib cdifs_obj_AdvanceSolutionIB none~updateboundary bc_set%UpdateBoundary proc~cdifs_obj_advancesolutionib->none~updateboundary proc~eulerian_obj_updateghostcells eulerian_obj_base%eulerian_obj_UpdateGhostCells proc~cdifs_obj_advancesolutionib->proc~eulerian_obj_updateghostcells proc~op_obj_intrp1 op_obj%op_obj_intrp1 proc~cdifs_obj_advancesolutionib->proc~op_obj_intrp1 proc~op_obj_intrp2 op_obj%op_obj_intrp2 proc~cdifs_obj_advancesolutionib->proc~op_obj_intrp2 proc~op_obj_intrp3 op_obj%op_obj_intrp3 proc~cdifs_obj_advancesolutionib->proc~op_obj_intrp3 proc~respart_set_getibforcing ResPart_set%ResPart_set_GetIBForcing proc~cdifs_obj_advancesolutionib->proc~respart_set_getibforcing proc~respart_set_updatesdf ResPart_set%ResPart_set_UpdateSDF proc~cdifs_obj_advancesolutionib->proc~respart_set_updatesdf 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 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~eulerian_obj_init eulerian_obj_base%eulerian_obj_Init proc~op_obj_intrp1->proc~eulerian_obj_init proc~op_obj_intrp2->proc~eulerian_obj_init proc~op_obj_intrp3->proc~eulerian_obj_init proc~marker_set_getibforcing marker_set%marker_set_GetIBForcing proc~respart_set_getibforcing->proc~marker_set_getibforcing proc~marker_set_updatesdf marker_set%marker_set_UpdateSDF proc~respart_set_updatesdf->proc~marker_set_updatesdf 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 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 proc~marker_set_getibforcing->proc~eulerian_obj_init markers markers proc~marker_set_getibforcing->markers p p proc~marker_set_getibforcing->p proc~eulerian_obj_final eulerian_obj_base%eulerian_obj_Final proc~marker_set_getibforcing->proc~eulerian_obj_final proc~marker_set_filter marker_set%marker_set_Filter proc~marker_set_getibforcing->proc~marker_set_filter proc~marker_set_updatesdf->proc~eulerian_obj_init proc~marker_set_updatesdf->proc~eulerian_obj_final proc~marker_set_updatesdf->proc~marker_set_filter 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~marker_set_filter->markers extrapolate extrapolate proc~marker_set_filter->extrapolate f f proc~marker_set_filter->f n n proc~marker_set_filter->n proc~eulerian_obj_addupghostcells eulerian_obj_base%eulerian_obj_AddUpGhostCells proc~marker_set_filter->proc~eulerian_obj_addupghostcells v v proc~marker_set_filter->v proc~bc_set_getbcpointer->proc~bc_set_getregionindex proc~bc_set_getbcpointer->proc~region_obj_getbcindex proc~bc_set_getextents->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~eulerian_obj_addupghostcells->proc~eulerian_obj_updateghostcells proc~eulerian_obj_addupghostcells_x eulerian_obj_base%eulerian_obj_AddUpGhostCells_x proc~eulerian_obj_addupghostcells->proc~eulerian_obj_addupghostcells_x proc~eulerian_obj_addupghostcells_y eulerian_obj_base%eulerian_obj_AddUpGhostCells_y proc~eulerian_obj_addupghostcells->proc~eulerian_obj_addupghostcells_y proc~eulerian_obj_addupghostcells_z eulerian_obj_base%eulerian_obj_AddUpGhostCells_z proc~eulerian_obj_addupghostcells->proc~eulerian_obj_addupghostcells_z 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 proc~eulerian_obj_addupghostcells_x->cell proc~eulerian_obj_addupghostcells_x->mpi_irecv proc~eulerian_obj_addupghostcells_x->mpi_isend proc~eulerian_obj_addupghostcells_x->mpi_waitall proc~eulerian_obj_addupghostcells_y->cell proc~eulerian_obj_addupghostcells_y->mpi_irecv proc~eulerian_obj_addupghostcells_y->mpi_isend proc~eulerian_obj_addupghostcells_y->mpi_waitall proc~eulerian_obj_addupghostcells_z->cell proc~eulerian_obj_addupghostcells_z->mpi_irecv proc~eulerian_obj_addupghostcells_z->mpi_isend proc~eulerian_obj_addupghostcells_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~~cdifs_obj_advancesolutionib~~CalledByGraph proc~cdifs_obj_advancesolutionib cdifs_obj_AdvanceSolutionIB proc~cdifs_obj_advancesolution cdifs_obj_AdvanceSolution proc~cdifs_obj_advancesolution->proc~cdifs_obj_advancesolutionib interface~cdifs_obj_advancesolution cdifs_obj%cdifs_obj_AdvanceSolution interface~cdifs_obj_advancesolution->proc~cdifs_obj_advancesolution

Source Code

    subroutine cdifs_obj_AdvanceSolutionIB(this)
      !> Performs intermediate IB step>
      implicit none
      class(cdifs_obj), intent(inout) :: this                                  !! CDIFS solver
      ! Work variable
      integer :: i,j,k
      integer :: dir

      ! Build forcing
      associate ( V => this%V, Vm => this%Vm, rho => this%rho, &
        ibS => this%ibS, ibF => this%ibF, op => this%op,         &
        dt=>this%timer%dt)

        ! Update SDF
        ibS = 0.0_wp
        if (this%use_RP) call this%RP%UpdateSDF(ibS)
        if (this%use_IB) call this%IB%UpdateSDF(ibS)
        call this%bcs%UpdateBoundary(this%ibS)

        ! Interpolate velocities
        Vm(1)= op%intrp1(V(1)); call Vm(1)%UpdateGhostCells
        Vm(2)= op%intrp2(V(2)); call Vm(2)%UpdateGhostCells
        Vm(3)= op%intrp3(V(3)); call Vm(3)%UpdateGhostCells

        ! Recompute the forcing
        ibF(1) = 0.0_wp; ibF(2) = 0.0_wp; ibF(3) = 0.0_wp
        if (this%use_RP) call this%RP%GetIBForcing(Vm(1),Vm(2),Vm(3),rho,ibS,ibF,dt)
        if (this%use_IB) call this%IB%GetIBForcing(Vm(1),Vm(2),Vm(3),rho,ibS,ibF,dt)
        call this%bcs%UpdateBoundary(this%ibF)

      end associate

      ! Apply forcing
      associate ( V => this%V, ibF => this%ibF, 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)
              if (this%maskV(1)%cell(i,j,k)>0) &
                V(1)%cell(i,j,k) = V(1)%cell(i,j,k) + dt/rho * dot_product(op%c_intrp1m(:,i),ibF(1)%cell(i-op%st:i+op%st-1,j,k))
              if (this%maskV(2)%cell(i,j,k)>0) &
                V(2)%cell(i,j,k) = V(2)%cell(i,j,k) + dt/rho * dot_product(op%c_intrp2m(:,j),ibF(2)%cell(i,j-op%st:j+op%st-1,k))
              if (this%maskV(3)%cell(i,j,k)>0) &
                V(3)%cell(i,j,k) = V(3)%cell(i,j,k) + dt/rho * dot_product(op%c_intrp3m(:,k),ibF(3)%cell(i,j,k-op%st:k+op%st-1))
            end do
          end do
        end do

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

      return
    end subroutine cdifs_obj_AdvanceSolutionIB