box_helmh Subroutine

private subroutine box_helmh(mg, id, nc, i_out)

Perform Helmholtz operator on a box

Arguments

Type IntentOptional Attributes Name
type(mg_t), intent(inout) :: mg
integer, intent(in) :: id
integer, intent(in) :: nc
integer, intent(in) :: i_out

Index of variable to store Helmholtz in


Source Code

  subroutine box_helmh(mg, id, nc, i_out)
    type(mg_t), intent(inout) :: mg
    integer, intent(in)       :: id
    integer, intent(in)       :: nc
    integer, intent(in)       :: i_out
    !< Index of variable to store Helmholtz in
    integer                   :: i, j, k
    real(dp)                  :: idr2(3)

    idr2 = 1 / mg%dr(:, mg%boxes(id)%lvl)**2

    associate (cc => mg%boxes(id)%cc, n => mg_iphi)
      do k = 1, nc
         do j = 1, nc
            do i = 1, nc
               cc(i, j, k, i_out) = idr2(1) * (cc(i-1, j, k, n) + cc(i+1, j, k,&
                   n) - 2 * cc(i, j, k, n)) + idr2(2) * (cc(i, j-1, k,&
                   n) + cc(i, j+1, k, n) - 2 * cc(i, j, k,&
                   n)) + idr2(3) * (cc(i, j, k-1, n) + cc(i, j, k+1,&
                   n) - 2 * cc(i, j, k, n)) - helmholtz_lambda * cc(i, j, k,&
                   n)
            end do
         end do
      end do
    end associate
  end subroutine box_helmh