| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| type(fmm_options_type), | public | :: | options | = | fmm_options_type() | ||
| logical, | public | :: | sources_ready | = | .false. |
Options, |
|
| logical, | public | :: | built | = | .false. |
Tree, interaction lists and operators are built as well (implies |
|
| 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 |
||
| real(kind=dp), | public, | allocatable | :: | near_vy(:,:) |
Panel sources only: the near-field panels in |
||
| real(kind=dp), | public, | allocatable | :: | near_vz(:,:) |
Panel sources only: the near-field panels in |
||
| 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(:,:) |
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