Drain results from remote node coordinators and update tracking state.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mbe_context_t), | intent(in) | :: | ctx | |||
| type(calculation_result_t), | intent(inout) | :: | results(:) | |||
| integer(kind=int64), | intent(inout) | :: | results_received | |||
| type(timer_type), | intent(in) | :: | coord_timer |
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| integer(kind=int64), | private | :: | fragment_idx | ||||
| logical, | private | :: | has_pending | ||||
| type(request_t), | private | :: | req | ||||
| type(MPI_Status), | private | :: | status |
subroutine handle_node_results(ctx, results, results_received, coord_timer) !! Drain results from remote node coordinators and update tracking state. use mqc_many_body_expansion, only: mbe_context_t type(mbe_context_t), intent(in) :: ctx type(calculation_result_t), intent(inout) :: results(:) integer(int64), intent(inout) :: results_received type(timer_type), intent(in) :: coord_timer integer(int64) :: fragment_idx type(MPI_Status) :: status logical :: has_pending type(request_t) :: req do call iprobe(ctx%resources%mpi_comms%world_comm, MPI_ANY_SOURCE, TAG_NODE_SCALAR_RESULT, has_pending, status) if (.not. has_pending) exit call irecv(ctx%resources%mpi_comms%world_comm, fragment_idx, status%MPI_SOURCE, TAG_NODE_SCALAR_RESULT, req) call wait(req) call result_irecv(results(fragment_idx), ctx%resources%mpi_comms%world_comm, status%MPI_SOURCE, & TAG_NODE_SCALAR_RESULT, req) call wait(req) if (results(fragment_idx)%has_error) then call logger%error("Fragment "//to_char(fragment_idx)//" calculation failed: "// & results(fragment_idx)%error%get_message()) call abort_comm(ctx%resources%mpi_comms%world_comm, 1) end if results_received = results_received + 1 if (mod(results_received, max(1_int64, ctx%total_fragments/10)) == 0 .or. & results_received == ctx%total_fragments) then call logger%info(" Processed "//to_char(results_received)//"/"// & to_char(ctx%total_fragments)//" fragments ["// & to_char(coord_timer%get_elapsed_time())//" s]") end if end do end subroutine handle_node_results