box_ahelmh Subroutine

private subroutine box_ahelmh(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_ahelmh(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
    real(dp)                  :: idr2(2*2), a0(2*2), u0, u(2*2), a(2*2)

    ! Duplicate 1/dr^2 array to multiply neighbor values
    idr2(1:2*2:2) = 1/mg%dr(:, mg%boxes(id)%lvl)**2
    idr2(2:2*2:2) = idr2(1:2*2:2)

    associate (cc => mg%boxes(id)%cc, n => mg_iphi, i_eps1 => mg_iveps1,&
        i_eps2 => mg_iveps2)
      do j = 1, nc
         do i = 1, nc
            a0(1:2)     = cc(i, j, i_eps1)
            a0(3:4)     = cc(i, j, i_eps2)
            a(1:2) = cc(i-1:i+1:2, j, i_eps1)
            a(3:4) = cc(i, j-1:j+1:2, i_eps2)
            u0     = cc(i, j, n)
            u(1:2) = cc(i-1:i+1:2, j, n)
            u(3:4) = cc(i, j-1:j+1:2, n)

            cc(i, j, i_out) = sum(2 * idr2 * a0(:)*a(:)/(a0(:) + a(:)) * (u(:) &
               - u0)) - ahelmholtz_lambda * u0
         end do
      end do
    end associate
  end subroutine box_ahelmh