handle_local_worker_requests_group Subroutine

subroutine handle_local_worker_requests_group(ctx, fragment_queue, group_fragment_ids, group_polymers, worker_fragment_map, local_finished_workers)

Uses

  • proc~~handle_local_worker_requests_group~~UsesGraph proc~handle_local_worker_requests_group handle_local_worker_requests_group module~mqc_many_body_expansion mqc_many_body_expansion proc~handle_local_worker_requests_group->module~mqc_many_body_expansion module~mqc_config_adapter mqc_config_adapter module~mqc_many_body_expansion->module~mqc_config_adapter module~mqc_json_output_types mqc_json_output_types module~mqc_many_body_expansion->module~mqc_json_output_types module~mqc_method_config mqc_method_config module~mqc_many_body_expansion->module~mqc_method_config module~mqc_physical_fragment mqc_physical_fragment module~mqc_many_body_expansion->module~mqc_physical_fragment module~mqc_resources mqc_resources module~mqc_many_body_expansion->module~mqc_resources pic_types pic_types module~mqc_many_body_expansion->pic_types module~mqc_config_adapter->module~mqc_method_config module~mqc_config_adapter->module~mqc_physical_fragment module~mqc_config_adapter->pic_types module~mqc_calculation_keywords mqc_calculation_keywords module~mqc_config_adapter->module~mqc_calculation_keywords module~mqc_config_parser mqc_config_parser module~mqc_config_adapter->module~mqc_config_parser module~mqc_elements mqc_elements module~mqc_config_adapter->module~mqc_elements module~mqc_error mqc_error module~mqc_config_adapter->module~mqc_error pic_logger pic_logger module~mqc_config_adapter->pic_logger module~mqc_json_output_types->pic_types module~mqc_thermochemistry mqc_thermochemistry module~mqc_json_output_types->module~mqc_thermochemistry module~mqc_method_config->pic_types module~mqc_method_types mqc_method_types module~mqc_method_config->module~mqc_method_types module~mqc_physical_fragment->pic_types module~mqc_cgto mqc_cgto module~mqc_physical_fragment->module~mqc_cgto module~mqc_physical_fragment->module~mqc_elements module~mqc_physical_fragment->module~mqc_error module~mqc_geometry mqc_geometry module~mqc_physical_fragment->module~mqc_geometry module~mqc_physical_constants mqc_physical_constants module~mqc_physical_fragment->module~mqc_physical_constants module~mqc_xyz_reader mqc_xyz_reader module~mqc_physical_fragment->module~mqc_xyz_reader module~mqc_mpi_comms mqc_mpi_comms module~mqc_resources->module~mqc_mpi_comms module~mqc_calculation_keywords->pic_types module~mqc_calculation_defaults mqc_calculation_defaults module~mqc_calculation_keywords->module~mqc_calculation_defaults module~mqc_cgto->pic_types module~mqc_config_parser->module~mqc_physical_fragment module~mqc_config_parser->pic_types module~mqc_config_parser->module~mqc_error module~mqc_config_parser->module~mqc_geometry module~mqc_config_parser->module~mqc_method_types module~mqc_calc_types mqc_calc_types module~mqc_config_parser->module~mqc_calc_types module~mqc_config_parser->module~mqc_calculation_defaults module~mqc_elements->pic_types pic_ascii pic_ascii module~mqc_elements->pic_ascii module~mqc_geometry->pic_types module~mqc_method_types->pic_types pic_mpi_lib pic_mpi_lib module~mqc_mpi_comms->pic_mpi_lib module~mqc_physical_constants->pic_types module~mqc_thermochemistry->pic_types module~mqc_thermochemistry->module~mqc_elements module~mqc_thermochemistry->module~mqc_physical_constants module~mqc_thermochemistry->pic_logger pic_io pic_io module~mqc_thermochemistry->pic_io pic_lapack_interfaces pic_lapack_interfaces module~mqc_thermochemistry->pic_lapack_interfaces module~mqc_xyz_reader->pic_types module~mqc_xyz_reader->module~mqc_error module~mqc_xyz_reader->module~mqc_geometry module~mqc_calc_types->pic_types module~mqc_calculation_defaults->pic_types

Handle a single pending local worker request for a group shard, if any.

Arguments

Type IntentOptional Attributes Name
class(many_body_expansion_t), intent(in) :: ctx
type(queue_t), intent(inout) :: fragment_queue
integer(kind=int64), intent(in) :: group_fragment_ids(:)
integer, intent(in) :: group_polymers(:,:)
integer(kind=int64), intent(inout) :: worker_fragment_map(:)
integer, intent(inout) :: local_finished_workers

Calls

proc~~handle_local_worker_requests_group~~CallsGraph proc~handle_local_worker_requests_group handle_local_worker_requests_group iprobe iprobe proc~handle_local_worker_requests_group->iprobe irecv irecv proc~handle_local_worker_requests_group->irecv isend isend proc~handle_local_worker_requests_group->isend proc~queue_pop queue_pop proc~handle_local_worker_requests_group->proc~queue_pop proc~send_fragment_payload_from_row send_fragment_payload_from_row proc~handle_local_worker_requests_group->proc~send_fragment_payload_from_row proc~send_fragment_payload_from_row->isend proc~build_fragment_payload_from_row build_fragment_payload_from_row proc~send_fragment_payload_from_row->proc~build_fragment_payload_from_row

Called by

proc~~handle_local_worker_requests_group~~CalledByGraph proc~handle_local_worker_requests_group handle_local_worker_requests_group proc~global_coordinator_impl global_coordinator_impl proc~global_coordinator_impl->proc~handle_local_worker_requests_group proc~group_global_coordinator_impl group_global_coordinator_impl proc~group_global_coordinator_impl->proc~handle_local_worker_requests_group proc~global_coordinator global_coordinator proc~global_coordinator->proc~global_coordinator_impl proc~node_coordinator_impl node_coordinator_impl proc~node_coordinator_impl->proc~group_global_coordinator_impl interface~global_coordinator global_coordinator interface~global_coordinator->proc~global_coordinator proc~node_coordinator node_coordinator proc~node_coordinator->proc~node_coordinator_impl interface~node_coordinator node_coordinator interface~node_coordinator->proc~node_coordinator proc~mbe_run_distributed mbe_context_t%mbe_run_distributed proc~mbe_run_distributed->interface~global_coordinator proc~mbe_run_distributed->interface~node_coordinator proc~gmbe_run_distributed gmbe_context_t%gmbe_run_distributed proc~gmbe_run_distributed->interface~node_coordinator

Variables

Type Visibility Attributes Name Initial
integer(kind=int64), private :: fragment_idx
logical, private :: has_fragment
logical, private :: has_pending
integer(kind=int32), private :: local_dummy
integer(kind=int64), private :: local_idx
type(MPI_Status), private :: local_status
type(request_t), private :: req

Source Code

   subroutine handle_local_worker_requests_group(ctx, fragment_queue, group_fragment_ids, group_polymers, &
                                                 worker_fragment_map, local_finished_workers)
      !! Handle a single pending local worker request for a group shard, if any.
      use mqc_many_body_expansion, only: many_body_expansion_t
      class(many_body_expansion_t), intent(in) :: ctx
      type(queue_t), intent(inout) :: fragment_queue
      integer(int64), intent(in) :: group_fragment_ids(:)
      integer, intent(in) :: group_polymers(:, :)
      integer(int64), intent(inout) :: worker_fragment_map(:)
      integer, intent(inout) :: local_finished_workers

      integer(int64) :: local_idx, fragment_idx
      integer(int32) :: local_dummy
      type(MPI_Status) :: local_status
      logical :: has_pending, has_fragment
      type(request_t) :: req

      call iprobe(ctx%resources%mpi_comms%node_comm, MPI_ANY_SOURCE, TAG_WORKER_REQUEST, has_pending, local_status)
      if (.not. has_pending) return

      if (worker_fragment_map(local_status%MPI_SOURCE) /= 0) return

      call irecv(ctx%resources%mpi_comms%node_comm, local_dummy, local_status%MPI_SOURCE, TAG_WORKER_REQUEST, req)
      call wait(req)

      call queue_pop(fragment_queue, local_idx, has_fragment)
      if (has_fragment) then
         fragment_idx = group_fragment_ids(local_idx)
         call send_fragment_payload_from_row(ctx%resources%mpi_comms%node_comm, TAG_WORKER_FRAGMENT, fragment_idx, &
                                             group_polymers(local_idx, :), local_status%MPI_SOURCE)
         worker_fragment_map(local_status%MPI_SOURCE) = fragment_idx
      else
         call isend(ctx%resources%mpi_comms%node_comm, -1, local_status%MPI_SOURCE, TAG_WORKER_FINISH, req)
         call wait(req)
         local_finished_workers = local_finished_workers + 1
      end if
   end subroutine handle_local_worker_requests_group