combine_util Subroutine

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

Called by

proc~~combine_util~~CalledByGraph proc~combine_util combine_util proc~combine_util->proc~combine_util proc~combine combine proc~combine->proc~combine_util proc~generate_fragment_list generate_fragment_list proc~generate_fragment_list->proc~combine proc~run_fragmented_calculation run_fragmented_calculation proc~run_fragmented_calculation->proc~combine proc~run_fragmented_calculation->proc~generate_fragment_list proc~run_calculation run_calculation proc~run_calculation->proc~run_fragmented_calculation proc~compute_energy_and_forces compute_energy_and_forces proc~compute_energy_and_forces->proc~run_calculation proc~run_multi_molecule_calculations run_multi_molecule_calculations proc~run_multi_molecule_calculations->proc~run_calculation program~main main program~main->proc~run_calculation program~main->proc~run_multi_molecule_calculations

Variables

Type Visibility Attributes Name Initial
integer(kind=default_int), private :: j

Source Code

   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.
      integer(default_int), intent(in) :: arr(:), n, r, index, i
      integer(default_int), intent(inout) :: data(:), out_array(:, :)
      integer(int64), intent(inout) :: count
      integer(default_int) :: j

      if (index > r) then
         count = count + 1_int64
         out_array(count, 1:r) = data(1:r)
         return
      end if

      do j = i, n
         data(index) = arr(j)
         call combine_util(arr, n, r, index + 1, data, j + 1, out_array, count)
      end do
   end subroutine combine_util