core_complete_plan_impl Subroutine

public subroutine core_complete_plan_impl(plan)

Build the tree, interaction lists and operators of a plan whose sources are prepared.

Arguments

Type IntentOptional Attributes Name
type(fmm_plan_type), intent(inout) :: plan

Calls

proc~~core_complete_plan_impl~~CallsGraph proc~core_complete_plan_impl core_complete_plan_impl proc~active_tree_child_count active_tree_child_count proc~core_complete_plan_impl->proc~active_tree_child_count proc~active_tree_child_idx active_tree_child_idx proc~core_complete_plan_impl->proc~active_tree_child_idx proc~active_tree_nnode active_tree_nnode proc~core_complete_plan_impl->proc~active_tree_nnode proc~active_tree_node_center active_tree_node_center proc~core_complete_plan_impl->proc~active_tree_node_center proc~active_tree_node_radius active_tree_node_radius proc~core_complete_plan_impl->proc~active_tree_node_radius proc~append_i32_buffer append_i32_buffer proc~core_complete_plan_impl->proc~append_i32_buffer proc~build_axis_powers build_axis_powers proc~core_complete_plan_impl->proc~build_axis_powers proc~build_periodic_shell_mean_plan build_periodic_shell_mean_plan proc~core_complete_plan_impl->proc~build_periodic_shell_mean_plan proc~build_periodic_shift_values build_periodic_shift_values proc~core_complete_plan_impl->proc~build_periodic_shift_values proc~build_periodic_zero_mode_height_plan build_periodic_zero_mode_height_plan proc~core_complete_plan_impl->proc~build_periodic_zero_mode_height_plan proc~compute_laplace_derivatives compute_laplace_derivatives proc~core_complete_plan_impl->proc~compute_laplace_derivatives proc~distance_to_source_bbox distance_to_source_bbox proc~core_complete_plan_impl->proc~distance_to_source_bbox proc~distance_to_source_bbox_periodic distance_to_source_bbox_periodic proc~core_complete_plan_impl->proc~distance_to_source_bbox_periodic proc~has_valid_target_box has_valid_target_box proc~core_complete_plan_impl->proc~has_valid_target_box proc~initialize_basis_tables initialize_basis_tables proc~core_complete_plan_impl->proc~initialize_basis_tables proc~nodes_well_separated nodes_well_separated proc~core_complete_plan_impl->proc~nodes_well_separated proc~octant_index octant_index proc~core_complete_plan_impl->proc~octant_index proc~periodic_source_proxy_half_size periodic_source_proxy_half_size proc~core_complete_plan_impl->proc~periodic_source_proxy_half_size proc~precompute_periodic2_ewald_data precompute_periodic2_ewald_data proc~core_complete_plan_impl->proc~precompute_periodic2_ewald_data proc~precompute_periodic_root_operator precompute_periodic_root_operator proc~core_complete_plan_impl->proc~precompute_periodic_root_operator proc~use_periodic2_cached_kneq0 use_periodic2_cached_kneq0 proc~core_complete_plan_impl->proc~use_periodic2_cached_kneq0 proc~periodic_shell_mean_point_excess periodic_shell_mean_point_excess proc~build_periodic_shell_mean_plan->proc~periodic_shell_mean_point_excess proc~reset_periodic_shell_mean_plan reset_periodic_shell_mean_plan proc~build_periodic_shell_mean_plan->proc~reset_periodic_shell_mean_plan proc~sort_real_ascending sort_real_ascending proc~build_periodic_zero_mode_height_plan->proc~sort_real_ascending proc~zero_mode_heights_coincide zero_mode_heights_coincide proc~build_periodic_zero_mode_height_plan->proc~zero_mode_heights_coincide proc~apply_periodic2_minimum_image apply_periodic2_minimum_image proc~distance_to_source_bbox_periodic->proc~apply_periodic2_minimum_image proc~nodes_well_separated->proc~active_tree_node_center proc~nodes_well_separated->proc~active_tree_node_radius proc~nodes_well_separated->proc~apply_periodic2_minimum_image proc~reset_periodic2_ewald_data reset_periodic2_ewald_data proc~precompute_periodic2_ewald_data->proc~reset_periodic2_ewald_data proc~resolve_periodic2_ewald_alpha resolve_periodic2_ewald_alpha proc~precompute_periodic2_ewald_data->proc~resolve_periodic2_ewald_alpha proc~use_periodic2_root_operator use_periodic2_root_operator proc~precompute_periodic2_ewald_data->proc~use_periodic2_root_operator proc~precompute_periodic_root_operator->proc~build_axis_powers proc~precompute_periodic_root_operator->proc~initialize_basis_tables proc~precompute_periodic_root_operator->proc~periodic_source_proxy_half_size proc~precompute_periodic_root_operator->proc~use_periodic2_cached_kneq0 proc~add_periodic2_exact_ewald_field_potential_single_source add_periodic2_exact_ewald_field_potential_single_source proc~precompute_periodic_root_operator->proc~add_periodic2_exact_ewald_field_potential_single_source proc~factor_tall_matrix_qr factor_tall_matrix_qr proc~precompute_periodic_root_operator->proc~factor_tall_matrix_qr proc~lookup_cell_cache lookup_cell_cache proc~precompute_periodic_root_operator->proc~lookup_cell_cache proc~mpi_allreduce_sum_real_dp_array mpi_allreduce_sum_real_dp_array proc~precompute_periodic_root_operator->proc~mpi_allreduce_sum_real_dp_array proc~mpi_bcast_i32_array mpi_bcast_i32_array proc~precompute_periodic_root_operator->proc~mpi_bcast_i32_array proc~mpi_bcast_real_dp_array mpi_bcast_real_dp_array proc~precompute_periodic_root_operator->proc~mpi_bcast_real_dp_array proc~mpi_get_rank_size mpi_get_rank_size proc~precompute_periodic_root_operator->proc~mpi_get_rank_size proc~mpi_is_root mpi_is_root proc~precompute_periodic_root_operator->proc~mpi_is_root proc~periodic_cache_fingerprint periodic_cache_fingerprint proc~precompute_periodic_root_operator->proc~periodic_cache_fingerprint proc~precompute_periodic_root_operator->proc~periodic_shell_mean_point_excess proc~prepare_regularized_qr prepare_regularized_qr proc~precompute_periodic_root_operator->proc~prepare_regularized_qr proc~publish_cell_cache_and_unlock publish_cell_cache_and_unlock proc~precompute_periodic_root_operator->proc~publish_cell_cache_and_unlock proc~solve_regularized_qr solve_regularized_qr proc~precompute_periodic_root_operator->proc~solve_regularized_qr proc~periodic2_ewald_exp_erfc periodic2_ewald_exp_erfc proc~add_periodic2_exact_ewald_field_potential_single_source->proc~periodic2_ewald_exp_erfc proc~acquire_file_lock acquire_file_lock proc~lookup_cell_cache->proc~acquire_file_lock proc~create_directories create_directories proc~lookup_cell_cache->proc~create_directories proc~read_periodic_operator_cache read_periodic_operator_cache proc~lookup_cell_cache->proc~read_periodic_operator_cache proc~release_file_lock release_file_lock proc~lookup_cell_cache->proc~release_file_lock proc~periodic_shell_mean_excess periodic_shell_mean_excess proc~periodic_shell_mean_point_excess->proc~periodic_shell_mean_excess proc~prepare_regularized_qr->proc~factor_tall_matrix_qr proc~publish_cell_cache_and_unlock->proc~release_file_lock proc~write_periodic_operator_cache write_periodic_operator_cache proc~publish_cell_cache_and_unlock->proc~write_periodic_operator_cache proc~use_periodic2_root_operator->proc~use_periodic2_cached_kneq0 proc~periodic_operator_checksum periodic_operator_checksum proc~read_periodic_operator_cache->proc~periodic_operator_checksum proc~atomic_rename atomic_rename proc~write_periodic_operator_cache->proc~atomic_rename proc~write_periodic_operator_cache->proc~periodic_operator_checksum

Called by

proc~~core_complete_plan_impl~~CalledByGraph proc~core_complete_plan_impl core_complete_plan_impl proc~core_build_panel_plan_impl core_build_panel_plan_impl proc~core_build_panel_plan_impl->proc~core_complete_plan_impl proc~core_build_plan_impl core_build_plan_impl proc~core_build_plan_impl->proc~core_complete_plan_impl

Source Code

  subroutine core_complete_plan_impl(plan)
    type(fmm_plan_type), intent(inout) :: plan
    integer(i32) :: nsrc, idx, zero_status, free_axis
    real(dp), allocatable :: source_heights(:, :)
    character(len=256) :: zero_message

    nsrc = plan%nsrc
    if (use_periodic2_cached_kneq0(plan)) then
      free_axis = 6_i32 - sum(plan%options%periodic_axes)
      allocate (source_heights(3, nsrc))
      do idx = 1_i32, nsrc
        if (plan%panel_source) then
          source_heights(:, idx) = plan%panel_geometry(idx)%vertex(free_axis, :)
        else
          source_heights(:, idx) = plan%src_pos(free_axis, idx)
        end if
      end do
      call build_periodic_zero_mode_height_plan( &
        source_heights, product(plan%options%periodic_len), plan%periodic_k0_plan, zero_status, zero_message &
        )
      if (zero_status /= periodic_zero_mode_ok) error stop 'cached periodic k0 plan: '//trim(zero_message)
      plan%periodic_k0_free_axis = free_axis
      plan%periodic_k0_ready = .true.
      deallocate (source_heights)
    end if

    call initialize_basis_tables(plan, plan%options%order)
    if (use_periodic2_cached_kneq0(plan)) call precompute_periodic_source_grid(plan)
    call build_source_tree(plan)
    call precompute_source_p2m_basis(plan)
    call build_target_topology(plan)
    call build_interactions(plan)
    call precompute_translation_operators(plan)
    call precompute_periodic_shell_mean(plan)
    call precompute_periodic2_ewald_data(plan)
    call precompute_periodic_root_operator(plan)
    call precompute_m2l_derivatives(plan)
    plan%built = .true.
  end subroutine core_complete_plan_impl