mqc_combinatorics Module

Provides pure combinatorial functions for generating molecular fragments including binomial coefficients, combinations, and fragment counting Binomial coefficient calculation Calculate total number of fragments Generate sequential monomer indices Generate all fragments up to max level Generate all combinations of size r Generate next combination in sequence Initialize combination to [1,2,…,k] Generate next combination (alternate interface) Debug utility to print combinations Calculate minimal distances for all fragments


Uses

    • pic_types
  • module~~mqc_combinatorics~~UsesGraph module~mqc_combinatorics mqc_combinatorics pic_types pic_types module~mqc_combinatorics->pic_types

Used by

  • module~~mqc_combinatorics~~UsedByGraph module~mqc_combinatorics mqc_combinatorics module~mqc_frag_utils mqc_frag_utils module~mqc_frag_utils->module~mqc_combinatorics module~mqc_gmbe_utils mqc_gmbe_utils module~mqc_frag_utils->module~mqc_gmbe_utils module~mqc_gmbe_utils->module~mqc_combinatorics module~mqc_driver mqc_driver module~mqc_driver->module~mqc_frag_utils module~mqc_mbe mqc_mbe module~mqc_driver->module~mqc_mbe module~mqc_mbe_fragment_distribution_scheme mqc_mbe_fragment_distribution_scheme module~mqc_driver->module~mqc_mbe_fragment_distribution_scheme module~mqc_mbe->module~mqc_frag_utils module~mqc_mbe->module~mqc_gmbe_utils proc~compute_gmbe compute_gmbe proc~compute_gmbe->module~mqc_gmbe_utils proc~process_intersection_derivatives process_intersection_derivatives proc~process_intersection_derivatives->module~mqc_gmbe_utils module~mqc_mbe_fragment_distribution_scheme->module~mqc_mbe proc~compute_energy_and_forces compute_energy_and_forces proc~compute_energy_and_forces->module~mqc_driver program~main main program~main->module~mqc_driver module~mpi_fragment_work_smod mpi_fragment_work_smod module~mpi_fragment_work_smod->module~mqc_mbe_fragment_distribution_scheme module~mqc_gmbe_fragment_distribution_scheme mqc_gmbe_fragment_distribution_scheme module~mqc_gmbe_fragment_distribution_scheme->module~mqc_mbe_fragment_distribution_scheme module~mqc_hessian_distribution_scheme mqc_hessian_distribution_scheme module~mqc_hessian_distribution_scheme->module~mqc_mbe_fragment_distribution_scheme module~mqc_serial_fragment_processor mqc_serial_fragment_processor module~mqc_serial_fragment_processor->module~mqc_mbe_fragment_distribution_scheme module~mqc_unfragmented_workflow mqc_unfragmented_workflow module~mqc_unfragmented_workflow->module~mqc_mbe_fragment_distribution_scheme proc~gmbe_run_distributed gmbe_context_t%gmbe_run_distributed proc~gmbe_run_distributed->module~mqc_mbe_fragment_distribution_scheme proc~gmbe_run_distributed->module~mqc_gmbe_fragment_distribution_scheme proc~mbe_run_distributed mbe_context_t%mbe_run_distributed proc~mbe_run_distributed->module~mqc_mbe_fragment_distribution_scheme proc~mbe_run_serial mbe_context_t%mbe_run_serial proc~mbe_run_serial->module~mqc_mbe_fragment_distribution_scheme proc~gmbe_run_serial gmbe_context_t%gmbe_run_serial proc~gmbe_run_serial->module~mqc_gmbe_fragment_distribution_scheme

Functions

public pure function binomial(n, r) result(c)

Compute binomial coefficient C(n,r) = n! / (r! * (n-r)!)

Read more…

Arguments

Type IntentOptional Attributes Name
integer(kind=default_int), intent(in) :: n

Total number of items

integer(kind=default_int), intent(in) :: r

Number of items to choose

Return Value integer(kind=int64)

Binomial coefficient result

public pure function get_nfrags(n_monomers, max_level) result(n_expected_fragments)

Calculate total number of fragments for given system size and max level

Read more…

Arguments

Type IntentOptional Attributes Name
integer(kind=default_int), intent(in) :: n_monomers

Number of monomers in system

integer(kind=default_int), intent(in) :: max_level

Maximum fragment size

Return Value integer(kind=int64)

Total fragment count

public function next_combination(combination, k, n) result(has_next)

Generate next combination in lexicographic order Returns .true. if there’s a next combination, .false. if we’ve exhausted all

Arguments

Type IntentOptional Attributes Name
integer, intent(inout) :: combination(:)
integer, intent(in) :: k
integer, intent(in) :: n

Return Value logical


Subroutines

public subroutine calculate_fragment_distances(polymers, fragment_count, sys_geom, distances)

Calculate minimal atomic distance for each fragment For monomers (1-body), distance is 0.0 For n-mers (n >= 2), distance is the minimum distance between atoms in different constituent monomers

Arguments

Type IntentOptional Attributes Name
integer(kind=default_int), intent(in) :: polymers(:,:)
integer(kind=int64), intent(in) :: fragment_count
type(system_geometry_t), intent(in) :: sys_geom
real(kind=dp), intent(out) :: distances(:)

public recursive subroutine combine(arr, n, r, out_array, count)

Generate all combinations of size r from array arr of size n Uses int64 for count to handle large numbers of combinations that overflow int32.

Arguments

Type IntentOptional Attributes Name
integer(kind=default_int), intent(in) :: arr(:)
integer(kind=default_int), intent(in) :: n
integer(kind=default_int), intent(in) :: r
integer(kind=default_int), intent(inout) :: out_array(:,:)
integer(kind=int64), intent(inout) :: count

public pure subroutine create_monomer_list(monomers)

Generate a list of monomer indices from 1 to N

Arguments

Type IntentOptional Attributes Name
integer(kind=default_int), intent(inout), allocatable :: monomers(:)

public recursive subroutine generate_fragment_list(monomers, max_level, polymers, count)

Generate all possible fragments (combinations of monomers) up to max_level Uses int64 for count to handle large numbers of fragments that overflow int32.

Arguments

Type IntentOptional Attributes Name
integer(kind=default_int), intent(in) :: monomers(:)
integer(kind=default_int), intent(in) :: max_level
integer(kind=default_int), intent(inout) :: polymers(:,:)
integer(kind=int64), intent(inout) :: count

public pure subroutine get_next_combination(indices, k, n, has_next)

Generate next combination (updates indices in place) has_next = .true. if there’s a next combination

Arguments

Type IntentOptional Attributes Name
integer, intent(inout) :: indices(:)
integer, intent(in) :: k
integer, intent(in) :: n
logical, intent(out) :: has_next

public subroutine next_combination_init(combination, k)

Initialize combination to [1, 2, …, k]

Arguments

Type IntentOptional Attributes Name
integer, intent(inout) :: combination(:)
integer, intent(in) :: k

public subroutine print_combos(out_array, count, max_len)

Print combinations stored in out_array Uses int64 for count to handle large numbers of combinations that overflow int32.

Arguments

Type IntentOptional Attributes Name
integer(kind=default_int), intent(in) :: out_array(:,:)
integer(kind=int64), intent(in) :: count
integer(kind=default_int), intent(in) :: max_len

private recursive subroutine combine_util(arr, n, r, index, data, i, out_array, count)

Utility for generating combinations recursively Uses int64 for count to handle large numbers of combinations that overflow int32.

Arguments

Type IntentOptional Attributes Name
integer(kind=default_int), intent(in) :: arr(:)
integer(kind=default_int), intent(in) :: n
integer(kind=default_int), intent(in) :: r
integer(kind=default_int), intent(in) :: index
integer(kind=default_int), intent(inout) :: data(:)
integer(kind=default_int), intent(in) :: i
integer(kind=default_int), intent(inout) :: out_array(:,:)
integer(kind=int64), intent(inout) :: count