非周期計画の全ソース直接和で複数点の電場を計算する。
| Type | Intent | Optional | 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) | :: | e(:,:) |
subroutine core_eval_direct_points_impl(plan, state, target_pos, e) type(fmm_plan_type), intent(in) :: plan type(fmm_state_type), intent(in) :: state real(dp), intent(in) :: target_pos(:, :) real(dp), intent(out) :: e(:, :) integer(i32) :: i, ntarget real(dp) :: soft2 if (size(target_pos, 1) /= 3) error stop 'FMM core expects target_pos(3,m).' if (size(e, 1) /= 3 .or. size(e, 2) /= size(target_pos, 2)) then error stop 'FMM eval_direct_points expects e(3,m).' end if if (plan%options%use_periodic2) then error stop 'FMM exact-direct evaluation requires a non-periodic plan.' end if e = 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, e, ntarget, soft2) private(i) do i = 1_i32, ntarget call eval_direct_all_sources_scalar( & plan, state, target_pos(1, i), target_pos(2, i), target_pos(3, i), soft2, e(1, i), e(2, i), e(3, i) & ) end do !$omp end parallel do end subroutine core_eval_direct_points_impl