fmm_plan_type Derived Type

type, public :: fmm_plan_type


Inherits

type~~fmm_plan_type~~InheritsGraph type~fmm_plan_type fmm_plan_type type~fmm_options_type fmm_options_type type~fmm_plan_type->type~fmm_options_type options type~panel_geometry_type panel_geometry_type type~fmm_plan_type->type~panel_geometry_type panel_geometry type~periodic2_ewald_data_type periodic2_ewald_data_type type~fmm_plan_type->type~periodic2_ewald_data_type periodic_ewald type~periodic_shell_mean_plan_type periodic_shell_mean_plan_type type~fmm_plan_type->type~periodic_shell_mean_plan_type periodic_shell_mean type~periodic_zero_mode_plan_type periodic_zero_mode_plan_type type~fmm_plan_type->type~periodic_zero_mode_plan_type periodic_k0_plan type~mpi_context mpi_context type~fmm_options_type->type~mpi_context mpi type~panel_height_projection_type panel_height_projection_type type~periodic_zero_mode_plan_type->type~panel_height_projection_type panel

Inherited by

type~~fmm_plan_type~~InheritedByGraph type~fmm_plan_type fmm_plan_type type~field_solver_type field_solver_type type~field_solver_type->type~fmm_plan_type fmm_core_plan type~electrostatic_snapshot_type electrostatic_snapshot_type type~electrostatic_snapshot_type->type~field_solver_type nonzero_solver

Components

Type Visibility Attributes Name Initial
type(fmm_options_type), public :: options = fmm_options_type()
logical, public :: sources_ready = .false.

Options, src_pos and panel_geometry are set; enough for exact-direct evaluation.

logical, public :: built = .false.

Tree, interaction lists and operators are built as well (implies sources_ready).

integer(kind=i32), public :: nsrc = 0_i32
integer(kind=i32), public :: ncoef = 0_i32
integer(kind=i32), public :: nderiv = 0_i32
integer(kind=i32), public, allocatable :: alpha(:,:)
integer(kind=i32), public, allocatable :: alpha_degree(:)
real(kind=dp), public, allocatable :: alpha_factorial(:)
real(kind=dp), public, allocatable :: alpha_sign(:)
integer(kind=i32), public, allocatable :: alpha_map(:,:,:)
integer(kind=i32), public, allocatable :: alpha_plus_axis(:,:)
integer(kind=i32), public, allocatable :: deriv_alpha(:,:)
integer(kind=i32), public, allocatable :: deriv_degree(:)
real(kind=dp), public, allocatable :: deriv_factorial(:)
integer(kind=i32), public, allocatable :: deriv_map(:,:,:)
integer(kind=i32), public, allocatable :: alpha_beta_deriv_idx(:,:)
integer(kind=i32), public :: eval_term_count = 0_i32
integer(kind=i32), public, allocatable :: eval_exp(:,:)
integer(kind=i32), public, allocatable :: eval_deriv_idx(:,:)
real(kind=dp), public, allocatable :: eval_inv_factorial(:)
real(kind=dp), public, allocatable :: src_pos(:,:)
logical, public :: panel_source = .false.
type(panel_geometry_type), public, allocatable :: panel_geometry(:)
integer(kind=i32), public :: max_node = 0_i32
integer(kind=i32), public :: nnode = 0_i32
integer(kind=i32), public :: node_max_depth = 0_i32
integer(kind=i32), public, allocatable :: elem_order(:)
integer(kind=i32), public, allocatable :: node_start(:)
integer(kind=i32), public, allocatable :: node_count(:)
integer(kind=i32), public, allocatable :: child_count(:)
integer(kind=i32), public, allocatable :: child_idx(:,:)
integer(kind=i32), public, allocatable :: child_octant(:,:)
integer(kind=i32), public, allocatable :: node_depth(:)
integer(kind=i32), public, allocatable :: node_level_start(:)
integer(kind=i32), public, allocatable :: node_level_nodes(:)
real(kind=dp), public, allocatable :: node_center(:,:)
real(kind=dp), public, allocatable :: node_half_size(:,:)
real(kind=dp), public, allocatable :: node_radius(:)
logical, public :: target_tree_ready = .false.
integer(kind=i32), public :: target_max_node = 0_i32
integer(kind=i32), public :: target_nnode = 0_i32
integer(kind=i32), public :: target_node_max_depth = 0_i32
integer(kind=i32), public, allocatable :: target_child_count(:)
integer(kind=i32), public, allocatable :: target_child_idx(:,:)
integer(kind=i32), public, allocatable :: target_child_octant(:,:)
integer(kind=i32), public, allocatable :: target_node_depth(:)
integer(kind=i32), public, allocatable :: target_level_start(:)
integer(kind=i32), public, allocatable :: target_level_nodes(:)
real(kind=dp), public, allocatable :: target_node_center(:,:)
real(kind=dp), public, allocatable :: target_node_half_size(:,:)
real(kind=dp), public, allocatable :: target_node_radius(:)
integer(kind=i32), public :: nsource_leaf = 0_i32
integer(kind=i32), public, allocatable :: source_leaf_nodes(:)
integer(kind=i32), public :: nleaf = 0_i32
integer(kind=i32), public, allocatable :: leaf_nodes(:)
integer(kind=i32), public, allocatable :: leaf_slot_of_node(:)
integer(kind=i32), public, allocatable :: near_start(:)
integer(kind=i32), public, allocatable :: near_nodes(:)
integer(kind=i32), public, allocatable :: near_source_start(:)
integer(kind=i32), public, allocatable :: near_source_idx(:)
real(kind=dp), public, allocatable :: near_source_shift1(:)
real(kind=dp), public, allocatable :: near_source_shift2(:)
real(kind=dp), public, allocatable :: near_vx(:,:)

Panel sources only: the near-field panels in near_source_idx order as translated component arrays (vertex x/y/z per vertex, normal, edge lengths, outward edge normals per component, area), so a point evaluation reads its leaf's panels without gathering them from panel_geometry.

real(kind=dp), public, allocatable :: near_vy(:,:)

Panel sources only: the near-field panels in near_source_idx order as translated component arrays (vertex x/y/z per vertex, normal, edge lengths, outward edge normals per component, area), so a point evaluation reads its leaf's panels without gathering them from panel_geometry.

real(kind=dp), public, allocatable :: near_vz(:,:)

Panel sources only: the near-field panels in near_source_idx order as translated component arrays (vertex x/y/z per vertex, normal, edge lengths, outward edge normals per component, area), so a point evaluation reads its leaf's panels without gathering them from panel_geometry.

real(kind=dp), public, allocatable :: near_nx(:)
real(kind=dp), public, allocatable :: near_ny(:)
real(kind=dp), public, allocatable :: near_nz(:)
real(kind=dp), public, allocatable :: near_edge(:,:)
real(kind=dp), public, allocatable :: near_ox(:,:)
real(kind=dp), public, allocatable :: near_oy(:,:)
real(kind=dp), public, allocatable :: near_oz(:,:)
real(kind=dp), public, allocatable :: near_area(:)
real(kind=sp), public, allocatable :: near_sp_vx(:,:)

Single-precision counterparts used when options%near_field_single: vertices relative to the leaf center.

real(kind=sp), public, allocatable :: near_sp_vy(:,:)

Single-precision counterparts used when options%near_field_single: vertices relative to the leaf center.

real(kind=sp), public, allocatable :: near_sp_vz(:,:)

Single-precision counterparts used when options%near_field_single: vertices relative to the leaf center.

real(kind=sp), public, allocatable :: near_sp_nx(:)
real(kind=sp), public, allocatable :: near_sp_ny(:)
real(kind=sp), public, allocatable :: near_sp_nz(:)
real(kind=sp), public, allocatable :: near_sp_edge(:,:)
real(kind=sp), public, allocatable :: near_sp_ox(:,:)
real(kind=sp), public, allocatable :: near_sp_oy(:,:)
real(kind=sp), public, allocatable :: near_sp_oz(:,:)
real(kind=sp), public, allocatable :: near_sp_area(:)
real(kind=dp), public, allocatable :: near_leaf_center(:,:)
integer(kind=i32), public :: m2l_pair_count = 0_i32
integer(kind=i32), public :: m2l_build_count = 0_i32
integer(kind=i32), public :: m2l_visit_count = 0_i32
integer(kind=i32), public, allocatable :: m2l_target_nodes(:)
integer(kind=i32), public, allocatable :: m2l_source_nodes(:)
integer(kind=i32), public, allocatable :: m2l_shift_idx1(:)
integer(kind=i32), public, allocatable :: m2l_shift_idx2(:)
integer(kind=i32), public, allocatable :: m2l_target_start(:)
integer(kind=i32), public, allocatable :: m2l_pair_order(:)
integer(kind=i32), public, allocatable :: source_parent_of(:)
integer(kind=i32), public, allocatable :: parent_of(:)
integer(kind=i32), public, allocatable :: m2m_term_count(:)
integer(kind=i32), public, allocatable :: m2m_alpha_list(:,:)
integer(kind=i32), public, allocatable :: m2m_delta_list(:,:)
integer(kind=i32), public, allocatable :: l2l_term_count(:)
integer(kind=i32), public, allocatable :: l2l_gamma_list(:,:)
integer(kind=i32), public, allocatable :: l2l_delta_list(:,:)
real(kind=dp), public, allocatable :: shift_axis1(:)
real(kind=dp), public, allocatable :: shift_axis2(:)
type(periodic2_ewald_data_type), public :: periodic_ewald
logical, public :: periodic_root_operator_ready = .false.
integer(kind=i32), public :: periodic_root_target_count = 0_i32

遠方補正の (target anchor, source cell) 組の数。anchor は box を各軸 periodic_operator_anchor_cells に分けた 格子で、適応木とは独立に点評価で参照する。operator は panel を含む source cell だけを持ち、 組 k = (slot-1)*anchor_count + anchor で並ぶ。slot は periodic_operator_cell_slot(cell)、 0 のセルは operator を持たない(線源を置けない)。

integer(kind=i32), public :: periodic_operator_anchor_count = 0_i32
integer(kind=i32), public :: periodic_operator_anchor_cells(3) = 0_i32
integer(kind=i32), public :: periodic_operator_source_cells(3) = 0_i32
real(kind=dp), public :: periodic_anchor_half(3) = 0.0_dp
real(kind=dp), public :: periodic_source_half(3) = 0.0_dp
real(kind=dp), public, allocatable :: periodic_anchor_center(:,:)
integer(kind=i32), public :: periodic_operator_built_count = 0_i32
integer(kind=i32), public, allocatable :: periodic_operator_cell_slot(:)
integer(kind=i32), public, allocatable :: periodic_operator_cells(:)
integer(kind=i32), public :: periodic_operator_new_cell_count = 0_i32

今回の初期化で新たに作った source cell の数(cache にあったセルは数えない)。

integer(kind=i32), public :: periodic_root_source_count = 0_i32
integer(kind=i32), public, allocatable :: periodic_source_cell(:)
real(kind=dp), public, allocatable :: periodic_source_center(:,:)
real(kind=dp), public, allocatable :: periodic_source_p2m_basis(:,:)
real(kind=dp), public, allocatable :: periodic_root_operator(:,:,:)
logical, public :: periodic_cache_hit = .false.
integer(kind=i32), public :: periodic_operator_build_count = 0_i32
integer(kind=i32), public :: periodic_qr_preparation_count = 0_i32
integer(kind=i32), public :: periodic_operator_local_target_count = 0_i32
integer(kind=i32), public :: periodic_operator_thread_count = 0_i32
integer(kind=i32), public :: periodic_operator_class_count = 0_i32
integer(kind=i64), public :: periodic_operator_ewald_evaluation_count = 0_i64
character(len=16), public :: periodic_cache_fingerprint = ''
character(len=512), public :: periodic_cache_path = ''
logical, public :: periodic_k0_ready = .false.
integer(kind=i32), public :: periodic_k0_free_axis = 0_i32
type(periodic_zero_mode_plan_type), public :: periodic_k0_plan
type(periodic_shell_mean_plan_type), public :: periodic_shell_mean

有限画像殻の面平均のうち、対称な平均場を除いた滑らかな残り(cached_kneq0 で実行時に引く)。

real(kind=dp), public, allocatable :: m2l_deriv(:,:)
real(kind=dp), public, allocatable :: source_p2m_basis(:,:)
real(kind=dp), public, allocatable :: source_shift_monomial(:,:)
real(kind=dp), public, allocatable :: target_shift_monomial(:,:)

Source Code

  type :: fmm_plan_type
    type(fmm_options_type) :: options = fmm_options_type()
    !> Options, `src_pos` and `panel_geometry` are set; enough for exact-direct evaluation.
    logical :: sources_ready = .false.
    !> Tree, interaction lists and operators are built as well (implies `sources_ready`).
    logical :: built = .false.
    integer(i32) :: nsrc = 0_i32
    integer(i32) :: ncoef = 0_i32
    integer(i32) :: nderiv = 0_i32
    integer(i32), allocatable :: alpha(:, :)
    integer(i32), allocatable :: alpha_degree(:)
    real(dp), allocatable :: alpha_factorial(:)
    real(dp), allocatable :: alpha_sign(:)
    integer(i32), allocatable :: alpha_map(:, :, :)
    integer(i32), allocatable :: alpha_plus_axis(:, :)
    integer(i32), allocatable :: deriv_alpha(:, :)
    integer(i32), allocatable :: deriv_degree(:)
    real(dp), allocatable :: deriv_factorial(:)
    integer(i32), allocatable :: deriv_map(:, :, :)
    integer(i32), allocatable :: alpha_beta_deriv_idx(:, :)
    integer(i32) :: eval_term_count = 0_i32
    integer(i32), allocatable :: eval_exp(:, :)
    integer(i32), allocatable :: eval_deriv_idx(:, :)
    real(dp), allocatable :: eval_inv_factorial(:)
    real(dp), allocatable :: src_pos(:, :)
    logical :: panel_source = .false.
    type(panel_geometry_type), allocatable :: panel_geometry(:)
    integer(i32) :: max_node = 0_i32
    integer(i32) :: nnode = 0_i32
    integer(i32) :: node_max_depth = 0_i32
    integer(i32), allocatable :: elem_order(:)
    integer(i32), allocatable :: node_start(:), node_count(:)
    integer(i32), allocatable :: child_count(:), child_idx(:, :), child_octant(:, :)
    integer(i32), allocatable :: node_depth(:)
    integer(i32), allocatable :: node_level_start(:), node_level_nodes(:)
    real(dp), allocatable :: node_center(:, :)
    real(dp), allocatable :: node_half_size(:, :)
    real(dp), allocatable :: node_radius(:)
    logical :: target_tree_ready = .false.
    integer(i32) :: target_max_node = 0_i32
    integer(i32) :: target_nnode = 0_i32
    integer(i32) :: target_node_max_depth = 0_i32
    integer(i32), allocatable :: target_child_count(:), target_child_idx(:, :), target_child_octant(:, :)
    integer(i32), allocatable :: target_node_depth(:)
    integer(i32), allocatable :: target_level_start(:), target_level_nodes(:)
    real(dp), allocatable :: target_node_center(:, :)
    real(dp), allocatable :: target_node_half_size(:, :)
    real(dp), allocatable :: target_node_radius(:)
    integer(i32) :: nsource_leaf = 0_i32
    integer(i32), allocatable :: source_leaf_nodes(:)
    integer(i32) :: nleaf = 0_i32
    integer(i32), allocatable :: leaf_nodes(:)
    integer(i32), allocatable :: leaf_slot_of_node(:)
    integer(i32), allocatable :: near_start(:), near_nodes(:)
    integer(i32), allocatable :: near_source_start(:), near_source_idx(:)
    real(dp), allocatable :: near_source_shift1(:), near_source_shift2(:)
    !> Panel sources only: the near-field panels in `near_source_idx` order as translated component arrays
    !! (vertex x/y/z per vertex, normal, edge lengths, outward edge normals per component, area), so a
    !! point evaluation reads its leaf's panels without gathering them from `panel_geometry`.
    real(dp), allocatable :: near_vx(:, :), near_vy(:, :), near_vz(:, :)
    real(dp), allocatable :: near_nx(:), near_ny(:), near_nz(:)
    real(dp), allocatable :: near_edge(:, :), near_ox(:, :), near_oy(:, :), near_oz(:, :)
    real(dp), allocatable :: near_area(:)
    !> Single-precision counterparts used when options%near_field_single: vertices relative to the leaf center.
    real(sp), allocatable :: near_sp_vx(:, :), near_sp_vy(:, :), near_sp_vz(:, :)
    real(sp), allocatable :: near_sp_nx(:), near_sp_ny(:), near_sp_nz(:)
    real(sp), allocatable :: near_sp_edge(:, :), near_sp_ox(:, :), near_sp_oy(:, :), near_sp_oz(:, :)
    real(sp), allocatable :: near_sp_area(:)
    real(dp), allocatable :: near_leaf_center(:, :)
    integer(i32) :: m2l_pair_count = 0_i32
    integer(i32) :: m2l_build_count = 0_i32
    integer(i32) :: m2l_visit_count = 0_i32
    integer(i32), allocatable :: m2l_target_nodes(:), m2l_source_nodes(:)
    integer(i32), allocatable :: m2l_shift_idx1(:), m2l_shift_idx2(:)
    integer(i32), allocatable :: m2l_target_start(:), m2l_pair_order(:)
    integer(i32), allocatable :: source_parent_of(:)
    integer(i32), allocatable :: parent_of(:)
    integer(i32), allocatable :: m2m_term_count(:)
    integer(i32), allocatable :: m2m_alpha_list(:, :)
    integer(i32), allocatable :: m2m_delta_list(:, :)
    integer(i32), allocatable :: l2l_term_count(:)
    integer(i32), allocatable :: l2l_gamma_list(:, :)
    integer(i32), allocatable :: l2l_delta_list(:, :)
    real(dp), allocatable :: shift_axis1(:), shift_axis2(:)
    type(periodic2_ewald_data_type) :: periodic_ewald
    logical :: periodic_root_operator_ready = .false.
    !> 遠方補正の (target anchor, source cell) 組の数。anchor は box を各軸 periodic_operator_anchor_cells に分けた
    !! 格子で、適応木とは独立に点評価で参照する。operator は panel を含む source cell だけを持ち、
    !! 組 k = (slot-1)*anchor_count + anchor で並ぶ。slot は periodic_operator_cell_slot(cell)、
    !! 0 のセルは operator を持たない(線源を置けない)。
    integer(i32) :: periodic_root_target_count = 0_i32
    integer(i32) :: periodic_operator_anchor_count = 0_i32
    integer(i32) :: periodic_operator_anchor_cells(3) = 0_i32
    integer(i32) :: periodic_operator_source_cells(3) = 0_i32
    real(dp) :: periodic_anchor_half(3) = 0.0_dp
    real(dp) :: periodic_source_half(3) = 0.0_dp
    real(dp), allocatable :: periodic_anchor_center(:, :)
    integer(i32) :: periodic_operator_built_count = 0_i32
    integer(i32), allocatable :: periodic_operator_cell_slot(:)
    integer(i32), allocatable :: periodic_operator_cells(:)
    !> 今回の初期化で新たに作った source cell の数(cache にあったセルは数えない)。
    integer(i32) :: periodic_operator_new_cell_count = 0_i32
    integer(i32) :: periodic_root_source_count = 0_i32
    integer(i32), allocatable :: periodic_source_cell(:)
    real(dp), allocatable :: periodic_source_center(:, :), periodic_source_p2m_basis(:, :)
    real(dp), allocatable :: periodic_root_operator(:, :, :)
    logical :: periodic_cache_hit = .false.
    integer(i32) :: periodic_operator_build_count = 0_i32
    integer(i32) :: periodic_qr_preparation_count = 0_i32
    integer(i32) :: periodic_operator_local_target_count = 0_i32
    integer(i32) :: periodic_operator_thread_count = 0_i32
    integer(i32) :: periodic_operator_class_count = 0_i32
    integer(i64) :: periodic_operator_ewald_evaluation_count = 0_i64
    character(len=16) :: periodic_cache_fingerprint = ''
    character(len=512) :: periodic_cache_path = ''
    logical :: periodic_k0_ready = .false.
    integer(i32) :: periodic_k0_free_axis = 0_i32
    type(periodic_zero_mode_plan_type) :: periodic_k0_plan
    !> 有限画像殻の面平均のうち、対称な平均場を除いた滑らかな残り(cached_kneq0 で実行時に引く)。
    type(periodic_shell_mean_plan_type) :: periodic_shell_mean
    real(dp), allocatable :: m2l_deriv(:, :)
    real(dp), allocatable :: source_p2m_basis(:, :)
    real(dp), allocatable :: source_shift_monomial(:, :)
    real(dp), allocatable :: target_shift_monomial(:, :)
  end type fmm_plan_type