core_eval_direct_potential_points_impl Subroutine

public subroutine core_eval_direct_potential_points_impl(plan, state, target_pos, phi)

非周期計画の全ソース直接和で複数点の電位を計算する。

Arguments

Type IntentOptional Attributes Name
type(fmm_plan_type), intent(in) :: plan
type(fmm_state_type), intent(in) :: state
real(kind=dp), intent(in) :: target_pos(:,:)
real(kind=dp), intent(out) :: phi(:)

Calls

proc~~core_eval_direct_potential_points_impl~~CallsGraph proc~core_eval_direct_potential_points_impl core_eval_direct_potential_points_impl proc~panel_potential_field panel_potential_field proc~core_eval_direct_potential_points_impl->proc~panel_potential_field proc~panel_on_surface_integrals panel_on_surface_integrals proc~panel_potential_field->proc~panel_on_surface_integrals

Source Code

  subroutine core_eval_direct_potential_points_impl(plan, state, target_pos, phi)
    type(fmm_plan_type), intent(in) :: plan
    type(fmm_state_type), intent(in) :: state
    real(dp), intent(in) :: target_pos(:, :)
    real(dp), intent(out) :: phi(:)
    integer(i32) :: i, ntarget
    real(dp) :: soft2

    if (size(target_pos, 1) /= 3) error stop 'FMM core expects target_pos(3,m).'
    if (size(phi) /= size(target_pos, 2)) then
      error stop 'FMM eval_direct_potential_points expects phi(m).'
    end if
    if (plan%options%use_periodic2) then
      error stop 'FMM exact-direct evaluation requires a non-periodic plan.'
    end if

    phi = 0.0_dp
    if (.not. plan%built .or. .not. state%ready) return
    ntarget = int(size(target_pos, 2), i32)
    soft2 = plan%options%softening*plan%options%softening

    !$omp parallel do default(none) schedule(static) &
    !$omp   shared(plan, state, target_pos, phi, ntarget, soft2) private(i)
    do i = 1_i32, ntarget
      call eval_direct_all_sources_potential_scalar( &
        plan, state, target_pos(1, i), target_pos(2, i), target_pos(3, i), soft2, phi(i) &
        )
    end do
    !$omp end parallel do
  end subroutine core_eval_direct_potential_points_impl