handle_node_results Subroutine

private subroutine handle_node_results(resources, results, results_received, coord_timer, n_pie_terms)

Uses

  • proc~~handle_node_results~2~~UsesGraph proc~handle_node_results~2 handle_node_results module~mqc_resources mqc_resources proc~handle_node_results~2->module~mqc_resources module~mqc_mpi_comms mqc_mpi_comms module~mqc_resources->module~mqc_mpi_comms pic_mpi_lib pic_mpi_lib module~mqc_mpi_comms->pic_mpi_lib

Arguments

Type IntentOptional Attributes Name
type(resources_t), intent(in) :: resources
type(calculation_result_t), intent(inout) :: results(:)
integer(kind=int64), intent(inout) :: results_received
type(timer_type), intent(in) :: coord_timer
integer(kind=int64), intent(in) :: n_pie_terms

Calls

proc~~handle_node_results~2~~CallsGraph proc~handle_node_results~2 handle_node_results abort_comm abort_comm proc~handle_node_results~2->abort_comm error error proc~handle_node_results~2->error get_elapsed_time get_elapsed_time proc~handle_node_results~2->get_elapsed_time info info proc~handle_node_results~2->info iprobe iprobe proc~handle_node_results~2->iprobe irecv irecv proc~handle_node_results~2->irecv proc~error_get_message error_t%error_get_message proc~handle_node_results~2->proc~error_get_message proc~result_irecv result_irecv proc~handle_node_results~2->proc~result_irecv to_char to_char proc~handle_node_results~2->to_char proc~result_irecv->irecv recv recv proc~result_irecv->recv

Called by

proc~~handle_node_results~2~~CalledByGraph proc~handle_node_results~2 handle_node_results proc~gmbe_pie_coordinator gmbe_pie_coordinator proc~gmbe_pie_coordinator->proc~handle_node_results~2 proc~gmbe_run_distributed gmbe_context_t%gmbe_run_distributed proc~gmbe_run_distributed->proc~gmbe_pie_coordinator

Variables

Type Visibility Attributes Name Initial
logical, private :: has_pending
type(request_t), private :: req
type(MPI_Status), private :: status
integer(kind=int64), private :: term_idx

Source Code

   subroutine handle_node_results(resources, results, results_received, coord_timer, n_pie_terms)
      use mqc_resources, only: resources_t
      type(resources_t), intent(in) :: resources
      type(calculation_result_t), intent(inout) :: results(:)
      integer(int64), intent(inout) :: results_received
      type(timer_type), intent(in) :: coord_timer
      integer(int64), intent(in) :: n_pie_terms

      integer(int64) :: term_idx
      type(MPI_Status) :: status
      logical :: has_pending
      type(request_t) :: req

      do
         call iprobe(resources%mpi_comms%world_comm, MPI_ANY_SOURCE, TAG_NODE_SCALAR_RESULT, has_pending, status)
         if (.not. has_pending) exit

         call irecv(resources%mpi_comms%world_comm, term_idx, status%MPI_SOURCE, TAG_NODE_SCALAR_RESULT, req)
         call wait(req)
      call result_irecv(results(term_idx), resources%mpi_comms%world_comm, status%MPI_SOURCE, TAG_NODE_SCALAR_RESULT, req)
         call wait(req)

         if (results(term_idx)%has_error) then
            call logger%error("PIE term "//to_char(term_idx)//" calculation failed: "// &
                              results(term_idx)%error%get_message())
            call abort_comm(resources%mpi_comms%world_comm, 1)
         end if

         results_received = results_received + 1
         if (mod(results_received, max(1_int64, n_pie_terms/10_int64)) == 0 .or. &
             results_received == n_pie_terms) then
            call logger%info("  Processed "//to_char(results_received)//"/"// &
                             to_char(n_pie_terms)//" PIE terms ["// &
                             to_char(coord_timer%get_elapsed_time())//" s]")
         end if
      end do
   end subroutine handle_node_results