subtract_mean Subroutine

private subroutine subtract_mean(mg, iv, include_ghostcells)

Uses

  • proc~~subtract_mean~2~~UsesGraph proc~subtract_mean~2 subtract_mean mpi mpi proc~subtract_mean~2->mpi

Arguments

Type IntentOptional Attributes Name
type(mg_t), intent(inout) :: mg
integer, intent(in) :: iv
logical, intent(in) :: include_ghostcells

Calls

proc~~subtract_mean~2~~CallsGraph proc~subtract_mean~2 subtract_mean mpi_allreduce mpi_allreduce proc~subtract_mean~2->mpi_allreduce proc~get_sum~2 get_sum proc~subtract_mean~2->proc~get_sum~2

Called by

proc~~subtract_mean~2~~CalledByGraph proc~subtract_mean~2 subtract_mean proc~mg_fas_fmg~2 mg_fas_fmg proc~mg_fas_fmg~2->proc~subtract_mean~2 proc~mg_fas_vcycle~2 mg_fas_vcycle proc~mg_fas_fmg~2->proc~mg_fas_vcycle~2 proc~mg_fas_vcycle~2->proc~subtract_mean~2 proc~diffusion_solve_acoeff~2 diffusion_solve_acoeff proc~diffusion_solve_acoeff~2->proc~mg_fas_fmg~2 proc~diffusion_solve_acoeff~2->proc~mg_fas_vcycle~2 proc~diffusion_solve_vcoeff~2 diffusion_solve_vcoeff proc~diffusion_solve_vcoeff~2->proc~mg_fas_fmg~2 proc~diffusion_solve_vcoeff~2->proc~mg_fas_vcycle~2 proc~diffusion_solve~2 diffusion_solve proc~diffusion_solve~2->proc~mg_fas_fmg~2 proc~diffusion_solve~2->proc~mg_fas_vcycle~2

Source Code

  subroutine subtract_mean(mg, iv, include_ghostcells)
    use mpi
    type(mg_t), intent(inout) :: mg
    integer, intent(in)       :: iv
    logical, intent(in)       :: include_ghostcells
    integer                   :: i, id, lvl, nc, ierr
    real(dp)                  :: sum_iv, mean_iv, volume

    nc = mg%box_size
    sum_iv = get_sum(mg, iv)
    call mpi_allreduce(sum_iv, mean_iv, 1, mpi_double, mpi_sum, mg%comm, ierr)

    ! Divide by total grid volume to get mean
    volume = nc**1 * product(mg%dr(:, 1)) * size(mg%lvls(1)%ids)
    mean_iv = mean_iv / volume

    do lvl = mg%lowest_lvl, mg%highest_lvl
       nc = mg%box_size_lvl(lvl)

       do i = 1, size(mg%lvls(lvl)%my_ids)
          id = mg%lvls(lvl)%my_ids(i)
          if (include_ghostcells) then
             mg%boxes(id)%cc(:, iv) = mg%boxes(id)%cc(:, iv) - mean_iv
          else
             mg%boxes(id)%cc(1:nc, iv) = mg%boxes(id)%cc(1:nc, iv) - mean_iv
          end if
       end do
    end do
  end subroutine subtract_mean