Provides functions for computing fragment intersections, generating k-way intersections, and enumerating PIE (Principle of Inclusion-Exclusion) terms for GMBE calculations with overlapping molecular fragments. Find shared atoms between two fragments Generate all k-way intersections for GMBE Compute atom list for polymer (union of fragments) Generate intersections for polymers DFS-based PIE coefficient enumeration Print GMBE energy breakdown Print GMBE gradient information Print debug information about GMBE intersections
Find shared atoms between two fragments (for GMBE with overlapping fragments)
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(in) | :: | frag1_atoms(:) |
Atom indices in fragment 1 (0-indexed) |
||
| integer, | intent(in) | :: | n1 |
Number of atoms in fragment 1 |
||
| integer, | intent(in) | :: | frag2_atoms(:) |
Atom indices in fragment 2 (0-indexed) |
||
| integer, | intent(in) | :: | n2 |
Number of atoms in fragment 2 |
||
| integer, | intent(out), | allocatable | :: | intersection(:) |
Shared atom indices |
|
| integer, | intent(out) | :: | n_intersect |
Number of shared atoms |
Check if two atom sets are equal (assuming sorted)
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(in) | :: | set1(:) | |||
| integer, | intent(in) | :: | set2(:) | |||
| integer, | intent(in) | :: | n_atoms |
Compute the atom list for a polymer (union of atoms from base fragments) polymer(:) contains base fragment indices (1-based)
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(system_geometry_t), | intent(in) | :: | sys_geom | |||
| integer, | intent(in) | :: | polymer(:) |
Base fragment indices in this polymer |
||
| integer, | intent(in) | :: | polymer_size |
Number of base fragments in polymer |
||
| integer, | intent(out), | allocatable | :: | atom_list(:) |
Unique atoms in this polymer |
|
| integer, | intent(out) | :: | n_atoms |
Number of unique atoms |
Generate all k-way intersections for k=2 to min(max_intersection_level, n_monomers)
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(system_geometry_t), | intent(in) | :: | sys_geom | |||
| integer, | intent(in) | :: | monomers(:) |
Monomer indices |
||
| integer, | intent(inout) | :: | polymers(:,:) |
Output: monomers stored here |
||
| integer, | intent(in) | :: | n_monomers |
Number of monomers |
||
| integer, | intent(in) | :: | max_intersection_level |
Maximum k-way intersection depth |
||
| integer, | intent(out), | allocatable | :: | intersections(:,:) |
Intersection atom lists |
|
| integer, | intent(out), | allocatable | :: | intersection_sets(:,:) |
Which k-tuple created each intersection |
|
| integer, | intent(out), | allocatable | :: | intersection_levels(:) |
Level (k) of each intersection |
|
| integer, | intent(out) | :: | n_intersections |
Number of intersections found |
Generate all k-way intersections for polymers at any level (GMBE-N) This works with dynamically generated polymers, not just base fragments
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(system_geometry_t), | intent(in) | :: | sys_geom | |||
| integer, | intent(in) | :: | polymers(:,:) |
Polymer definitions (n_polymers, max_level) |
||
| integer, | intent(in) | :: | n_polymers | |||
| integer, | intent(in) | :: | max_level | |||
| integer, | intent(out), | allocatable | :: | intersections(:,:) | ||
| integer, | intent(out), | allocatable | :: | intersection_sets(:,:) | ||
| integer, | intent(out), | allocatable | :: | intersection_levels(:) | ||
| integer, | intent(out) | :: | n_intersections |
Enumerate all unique intersections via DFS and accumulate PIE coefficients This implements the GMBE(N) algorithm with inclusion-exclusion principle
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(system_geometry_t), | intent(in) | :: | sys_geom | |||
| integer, | intent(in) | :: | primaries(:,:) |
Primary polymers (n_primaries, polymer_level) |
||
| integer, | intent(in) | :: | n_primaries |
Number of primary polymers |
||
| integer, | intent(in) | :: | polymer_level |
Level of primaries (1=monomers, 2=dimers, etc.) |
||
| integer, | intent(in) | :: | max_k_level |
Maximum clique size (intersection depth limit) |
||
| integer, | intent(out), | allocatable | :: | pie_atom_sets(:,:) |
Unique atom sets (max_atoms, n_terms) |
|
| integer, | intent(out), | allocatable | :: | pie_coefficients(:) |
PIE coefficient for each term |
|
| integer(kind=int64), | intent(out) | :: | n_pie_terms |
Number of unique PIE terms |
||
| type(error_t), | intent(out) | :: | error |
Error status |
||
| integer(kind=int64), | intent(in), | optional | :: | initial_max_terms |
Initial PIE storage capacity |
Print GMBE energy breakdown using inclusion-exclusion principle
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| real(kind=dp), | intent(in) | :: | monomer_energy | |||
| integer, | intent(in) | :: | n_monomers | |||
| real(kind=dp), | intent(in), | optional | :: | level_energies(:) | ||
| integer, | intent(in), | optional | :: | level_counts(:) | ||
| integer, | intent(in) | :: | max_level | |||
| real(kind=dp), | intent(in) | :: | total_energy | |||
| logical, | intent(in) | :: | has_intersections |
Print GMBE gradient information
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| real(kind=dp), | intent(in) | :: | total_gradient(:,:) | |||
| type(system_geometry_t), | intent(in) | :: | sys_geom | |||
| integer, | intent(in) | :: | current_log_level |
Print debug information about GMBE intersections
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(in) | :: | n_intersections | |||
| integer, | intent(in) | :: | n_monomers | |||
| integer, | intent(in) | :: | intersection_sets(:,:) | |||
| integer, | intent(in) | :: | intersection_levels(:) | |||
| type(calculation_result_t), | intent(in) | :: | intersection_results(:) |
DFS helper: accumulate PIE coefficients for intersections
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(in) | :: | primary_atoms(:,:) |
Precomputed atom lists |
||
| integer, | intent(in) | :: | primary_n_atoms(:) |
Atom counts |
||
| integer, | intent(in) | :: | n_primaries | |||
| integer, | intent(in) | :: | max_atoms | |||
| integer, | intent(in) | :: | clique(:) |
Current clique |
||
| integer, | intent(in) | :: | clique_size |
Size of current clique |
||
| integer, | intent(in) | :: | current_atoms(:) |
Atoms in current intersection |
||
| integer, | intent(in) | :: | n_current_atoms |
Number of atoms in intersection |
||
| integer, | intent(in) | :: | candidates(:) |
Candidate primaries |
||
| integer, | intent(in) | :: | n_candidates | |||
| integer, | intent(in) | :: | max_k_level | |||
| integer, | intent(inout), | allocatable | :: | atom_sets(:,:) | ||
| integer, | intent(inout), | allocatable | :: | coefficients(:) | ||
| integer(kind=int64), | intent(inout) | :: | n_terms | |||
| integer(kind=int64), | intent(inout) | :: | max_terms | |||
| type(error_t), | intent(inout) | :: | error |
Error status |
Generate k-way intersections from arbitrary atom lists (not tied to sys_geom) max_k_level limits the maximum intersection order to prevent combinatorial explosion
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(in) | :: | atom_lists(:,:) |
(max_atoms, n_sets) |
||
| integer, | intent(in) | :: | n_atoms_list(:) |
Number of atoms in each set |
||
| integer, | intent(in) | :: | n_sets |
Number of sets (polymers) |
||
| integer, | intent(in) | :: | max_k_level |
Maximum intersection level to compute |
||
| integer, | intent(out), | allocatable | :: | intersections(:,:) | ||
| integer, | intent(out), | allocatable | :: | intersection_sets(:,:) | ||
| integer, | intent(out), | allocatable | :: | intersection_levels(:) | ||
| integer, | intent(out) | :: | n_intersections |
Helper to generate all k-way intersections at a specific level k
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(system_geometry_t), | intent(in) | :: | sys_geom | |||
| integer, | intent(in) | :: | monomers(:) | |||
| integer, | intent(in) | :: | n_monomers | |||
| integer, | intent(in) | :: | k | |||
| integer, | intent(inout) | :: | combination(:) | |||
| integer, | intent(in) | :: | max_atoms | |||
| integer, | intent(inout) | :: | temp_intersections(:,:) | |||
| integer, | intent(inout) | :: | temp_sets(:,:) | |||
| integer, | intent(inout) | :: | temp_levels(:) | |||
| integer, | intent(inout) | :: | intersection_count |
Generate all k-way intersections from atom lists
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(in) | :: | atom_lists(:,:) | |||
| integer, | intent(in) | :: | n_atoms_list(:) | |||
| integer, | intent(in) | :: | n_sets | |||
| integer, | intent(in) | :: | k | |||
| integer, | intent(inout) | :: | combination(:) | |||
| integer, | intent(in) | :: | max_atoms | |||
| integer, | intent(inout) | :: | temp_intersections(:,:) | |||
| integer, | intent(inout) | :: | temp_sets(:,:) | |||
| integer, | intent(inout) | :: | temp_levels(:) | |||
| integer, | intent(inout) | :: | intersection_count |
Grow PIE term storage arrays when capacity is exceeded.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(inout), | allocatable | :: | atom_sets(:,:) | ||
| integer, | intent(inout), | allocatable | :: | coefficients(:) | ||
| integer(kind=int64), | intent(inout) | :: | max_terms | |||
| integer, | intent(in) | :: | max_atoms | |||
| type(error_t), | intent(inout) | :: | error |
Compute intersection of two atom lists
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(in) | :: | atoms1(:) | |||
| integer, | intent(in) | :: | n1 | |||
| integer, | intent(in) | :: | atoms2(:) | |||
| integer, | intent(in) | :: | n2 | |||
| integer, | intent(out) | :: | intersection(:) | |||
| integer, | intent(out) | :: | n_intersect |