mqc_work_queue.f90 Source File

Simple int64 queue utilities shared across fragmentation schemes


Files dependent on this one

sourcefile~~mqc_work_queue.f90~~AfferentGraph sourcefile~mqc_work_queue.f90 mqc_work_queue.f90 sourcefile~mqc_gmbe_fragment_distribution_scheme.f90 mqc_gmbe_fragment_distribution_scheme.f90 sourcefile~mqc_gmbe_fragment_distribution_scheme.f90->sourcefile~mqc_work_queue.f90 sourcefile~mqc_mbe_fragment_distribution_scheme.f90 mqc_mbe_fragment_distribution_scheme.F90 sourcefile~mqc_gmbe_fragment_distribution_scheme.f90->sourcefile~mqc_mbe_fragment_distribution_scheme.f90 sourcefile~mqc_mbe_fragment_distribution_scheme.f90->sourcefile~mqc_work_queue.f90 sourcefile~mqc_mbe_mpi_fragment_distribution_scheme.f90 mqc_mbe_mpi_fragment_distribution_scheme.F90 sourcefile~mqc_mbe_mpi_fragment_distribution_scheme.f90->sourcefile~mqc_work_queue.f90 sourcefile~mqc_mbe_mpi_fragment_distribution_scheme.f90->sourcefile~mqc_mbe_fragment_distribution_scheme.f90 sourcefile~mqc_many_body_expansion.f90 mqc_many_body_expansion.f90 sourcefile~mqc_mbe_mpi_fragment_distribution_scheme.f90->sourcefile~mqc_many_body_expansion.f90 sourcefile~mqc_driver.f90 mqc_driver.f90 sourcefile~mqc_driver.f90->sourcefile~mqc_mbe_fragment_distribution_scheme.f90 sourcefile~mqc_driver.f90->sourcefile~mqc_many_body_expansion.f90 sourcefile~mqc_many_body_expansion.f90->sourcefile~mqc_gmbe_fragment_distribution_scheme.f90 sourcefile~mqc_many_body_expansion.f90->sourcefile~mqc_mbe_fragment_distribution_scheme.f90 sourcefile~mqc_mbe_fragment_distribution_scheme_hessian.f90 mqc_mbe_fragment_distribution_scheme_hessian.F90 sourcefile~mqc_mbe_fragment_distribution_scheme_hessian.f90->sourcefile~mqc_mbe_fragment_distribution_scheme.f90 sourcefile~mqc_serial_fragment_processor.f90 mqc_serial_fragment_processor.f90 sourcefile~mqc_serial_fragment_processor.f90->sourcefile~mqc_mbe_fragment_distribution_scheme.f90 sourcefile~mqc_unfragmented_workflow.f90 mqc_unfragmented_workflow.f90 sourcefile~mqc_unfragmented_workflow.f90->sourcefile~mqc_mbe_fragment_distribution_scheme.f90 sourcefile~main.f90 main.f90 sourcefile~main.f90->sourcefile~mqc_driver.f90 sourcefile~mqc_calculation_interface.f90 mqc_calculation_interface.f90 sourcefile~mqc_calculation_interface.f90->sourcefile~mqc_driver.f90

Source Code

!! Simple int64 queue utilities shared across fragmentation schemes
module mqc_work_queue
   use pic_types, only: int64
   implicit none
   private

   public :: queue_t
   public :: queue_init_from_list, queue_pop, queue_is_empty, queue_destroy

   type :: queue_t
      integer(int64), allocatable :: ids(:)
      integer(int64) :: head = 1
      integer(int64) :: count = 0
   end type queue_t

contains

   subroutine queue_init_from_list(queue, ids)
      type(queue_t), intent(out) :: queue
      integer(int64), intent(in) :: ids(:)

      queue%count = size(ids, kind=int64)
      if (queue%count > 0) then
         allocate (queue%ids(queue%count))
         queue%ids = ids
      end if
      queue%head = 1_int64
   end subroutine queue_init_from_list

   subroutine queue_pop(queue, item_idx, has_item)
      type(queue_t), intent(inout) :: queue
      integer(int64), intent(out) :: item_idx
      logical, intent(out) :: has_item

      if (queue%head > queue%count) then
         item_idx = -1_int64
         has_item = .false.
         return
      end if

      item_idx = queue%ids(queue%head)
      queue%head = queue%head + 1_int64
      has_item = .true.
   end subroutine queue_pop

   pure logical function queue_is_empty(queue)
      type(queue_t), intent(in) :: queue
      queue_is_empty = (queue%head > queue%count)
   end function queue_is_empty

   subroutine queue_destroy(queue)
      type(queue_t), intent(inout) :: queue
      if (allocated(queue%ids)) deallocate (queue%ids)
      queue%head = 1_int64
      queue%count = 0_int64
   end subroutine queue_destroy

end module mqc_work_queue