Coulomb FMM コアで共有する型定義。
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| real(kind=dp), | public, | parameter | :: | inv_sqrt_pi | = | 0.56418958354775628695d0 | |
| real(kind=dp), | public, | parameter | :: | periodic_operator_proxy_shell_scale | = | 1.5_dp | |
| real(kind=dp), | public, | parameter | :: | periodic_operator_source_radius_ratio | = | 0.4_dp | |
| real(kind=dp), | public, | parameter | :: | periodic_operator_target_radius_ratio | = | 0.5_dp |
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| real(kind=dp), | public | :: | theta | = | 0.5d0 | ||
| integer(kind=i32), | public | :: | leaf_max | = | 16_i32 | ||
| integer(kind=i32), | public | :: | order | = | 4_i32 | ||
| logical, | public | :: | near_field_single | = | .false. |
Panel sources only: keep the per-leaf near-field tables in single precision (relative to the leaf center) and sum them with the single-precision SIMD kernel. Off by default; results then differ at the 1e-6 level. |
|
| real(kind=dp), | public | :: | softening | = | 0.0d0 | ||
| logical, | public | :: | use_periodic2 | = | .false. | ||
| character(len=16), | public | :: | periodic_far_correction | = | 'none' | ||
| integer(kind=i32), | public | :: | periodic_axes(2) | = | 0_i32 | ||
| real(kind=dp), | public | :: | periodic_len(2) | = | 0.0d0 | ||
| integer(kind=i32), | public | :: | periodic_image_layers | = | 1_i32 | ||
| real(kind=dp), | public | :: | periodic_ewald_alpha | = | 0.0d0 | ||
| integer(kind=i32), | public | :: | periodic_ewald_layers | = | 4_i32 | ||
| character(len=256), | public | :: | periodic_cache_dir | = | '' | ||
| real(kind=dp), | public | :: | periodic_generation_tolerance | = | 1.0d-8 | ||
| integer(kind=i32), | public | :: | periodic_operator_source_cells(3) | = | -1_i32 |
cached_kneq0 の遠方補正が使う source セルと target anchor の box 格子の各軸の分割数。負なら box と周期長から 自動で選ぶ(anchor は半対角線が短い周期長の 0.5 倍以下、source は 0.4 倍以下になるほぼ立方体のセルで、 source の分割数は anchor の 2^k 倍)。粗いと作成は速いが、粒子層の高さが周期長に近いとき非零モードに 面平均が漏れる。 |
|
| integer(kind=i32), | public | :: | periodic_operator_anchor_cells(3) | = | -1_i32 | ||
| real(kind=dp), | public | :: | target_box_min(3) | = | 0.0d0 | ||
| real(kind=dp), | public | :: | target_box_max(3) | = | 0.0d0 | ||
| type(mpi_context), | public | :: | mpi |
cached_kneq0 の root operator を rank で分担して作るときの MPI 文脈。呼び出し側(runtime)が渡す。 既定は単一 rank で、collective は何もしない(C ABI・テスト・非 MPI build)。 |
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| logical, | public | :: | ready | = | .false. | ||
| integer(kind=i32), | public | :: | axis1 | = | 0_i32 | ||
| integer(kind=i32), | public | :: | axis2 | = | 0_i32 | ||
| integer(kind=i32), | public | :: | axis_free | = | 0_i32 | ||
| integer(kind=i32), | public | :: | nimg | = | 0_i32 | ||
| integer(kind=i32), | public | :: | img_outer | = | 0_i32 | ||
| integer(kind=i32), | public | :: | kmax | = | 0_i32 | ||
| real(kind=dp), | public | :: | alpha | = | 0.0d0 | ||
| real(kind=dp), | public | :: | soft2 | = | 0.0d0 | ||
| real(kind=dp), | public | :: | cell_area | = | 0.0d0 | ||
| real(kind=dp), | public | :: | k0_pref | = | 0.0d0 | ||
| integer(kind=i32), | public | :: | screen_count | = | 0_i32 | ||
| integer(kind=i32), | public | :: | inner_count | = | 0_i32 | ||
| integer(kind=i32), | public | :: | k_count | = | 0_i32 | ||
| real(kind=dp), | public, | allocatable | :: | screen_shift1(:) | |||
| real(kind=dp), | public, | allocatable | :: | screen_shift2(:) | |||
| real(kind=dp), | public, | allocatable | :: | inner_shift1(:) | |||
| real(kind=dp), | public, | allocatable | :: | inner_shift2(:) | |||
| real(kind=dp), | public, | allocatable | :: | k1(:) | |||
| real(kind=dp), | public, | allocatable | :: | k2(:) | |||
| real(kind=dp), | public, | allocatable | :: | kmag(:) | |||
| real(kind=dp), | public, | allocatable | :: | karg0(:) | |||
| real(kind=dp), | public, | allocatable | :: | kpref1(:) | |||
| real(kind=dp), | public, | allocatable | :: | kpref2(:) | |||
| real(kind=dp), | public, | allocatable | :: | kprefz(:) |
| 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 | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| logical, | public | :: | ready | = | .false. | ||
| integer(kind=i32), | public | :: | update_count | = | 0_i32 | ||
| real(kind=dp), | public, | pointer | :: | src_q(:) | => | null() | |
| real(kind=dp), | public, | pointer | :: | multipole(:,:) | => | null() | |
| real(kind=dp), | public, | pointer | :: | local(:,:) | => | null() | |
| integer(kind=i32), | public, | pointer | :: | multipole_active(:) | => | null() | |
| integer(kind=i32), | public, | pointer | :: | local_active(:) | => | null() | |
| real(kind=dp), | public, | allocatable | :: | periodic_multipole(:,:) | |||
| real(kind=dp), | public, | allocatable | :: | anchor_local(:,:) |
遠方補正の anchor ごとの局所展開。点評価で、点を含む anchor の展開を葉の局所展開に加える。 |
||
| integer(kind=i32), | public, | allocatable | :: | anchor_local_active(:) | |||
| type(periodic_zero_mode_state_type), | public | :: | periodic_k0_state | ||||
| type(periodic_shell_mean_state_type), | public | :: | periodic_shell_mean_state |
Expand all box faces by the same padding, with proxy corner radius = scale * cell half diagonal.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| real(kind=dp), | intent(in) | :: | half(3) |
periodic2 Ewald 用の補助データを初期状態へ戻す。 intent(out) deallocates every allocatable component and applies the type's default values.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(periodic2_ewald_data_type), | intent(out) | :: | data |
リセット対象の補助データ。 |
FMM plan を初期状態へ戻す。 The plan owns only allocatable storage (no pointers), so intent(out) deallocates every component and applies the type's default values; there is no second list of fields to keep in sync.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(fmm_plan_type), | intent(out) | :: | plan |
リセット対象の FMM plan。 |
FMM state のポインタ成分を未関連状態へ初期化する。
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(fmm_state_type), | intent(inout) | :: | state |
初期化対象の FMM state。 |
FMM state を初期状態へ戻す。
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(fmm_state_type), | intent(inout) | :: | state |
リセット対象の FMM state。 |