16 #ifndef dealii_mpi_consensus_algorithm_h 17 #define dealii_mpi_consensus_algorithm_h 22 #include <deal.II/base/mpi.templates.h> 37 namespace ConsensusAlgorithms
61 template <
typename T1,
typename T2>
76 virtual std::vector<unsigned int>
90 std::vector<T1> & send_buffer);
104 std::vector<T2> & recv_buffer);
120 const std::vector<T1> &buffer_recv,
121 std::vector<T2> & request_buffer);
132 const std::vector<T2> &recv_buffer);
165 template <
typename T1,
typename T2>
226 template <
typename T1,
typename T2>
241 virtual ~
NBX() =
default;
250 #ifdef DEAL_II_WITH_MPI 316 check_global_state();
330 start_communication();
337 clean_up_and_end_communication();
363 template <
typename T1,
typename T2>
378 virtual ~
PEX() =
default;
387 #ifdef DEAL_II_WITH_MPI 431 answer_requests(
int index);
438 start_communication();
445 clean_up_and_end_communication();
452 template <
typename T1,
typename T2>
481 template <
typename T1,
typename T2>
517 template <
typename T1,
typename T2>
533 const std::function<std::vector<unsigned int>()>
534 &function_compute_targets,
535 const std::function<
void(
const unsigned int, std::vector<T1> &)>
536 &function_create_request =
537 [](
const unsigned int, std::vector<T1> &) {},
538 const std::function<void(
const unsigned int,
539 const std::vector<T1> &,
541 &function_answer_request = [](
const unsigned int,
542 const std::vector<T1> &,
543 std::vector<T2> &) {},
544 const std::function<void(const unsigned int, std::vector<T2> &)>
545 &function_prepare_buffer_for_answer =
546 [](
const unsigned int, std::vector<T2> &) {},
547 const std::function<void(const unsigned int, const std::vector<T2> &)>
548 &function_read_answer =
549 [](
const unsigned int,
const std::vector<T2> &) {});
554 std::vector<unsigned int>
562 std::vector<T1> & send_buffer)
override;
569 const std::vector<T1> &buffer_recv,
570 std::vector<T2> & request_buffer)
override;
577 std::vector<T2> & recv_buffer)
override;
584 const std::vector<T2> &recv_buffer)
override;
587 const std::function<std::vector<unsigned int>()>
588 function_compute_targets;
589 const std::function<void(const int, std::vector<T1> &)>
590 function_create_request;
592 void(
const unsigned int,
const std::vector<T1> &, std::vector<T2> &)>
594 const std::function<void(const int, std::vector<T2> &)>
595 function_prepare_buffer_for_answer;
596 const std::function<void(const int, const std::vector<T2> &)>
597 function_read_answer;
602 template <
typename T1,
typename T2>
604 const std::function<std::vector<unsigned int>()>
605 &function_compute_targets,
606 const std::function<
void(
const unsigned int, std::vector<T1> &)>
607 & function_create_request,
608 const std::function<
void(
const unsigned int,
609 const std::vector<T1> &,
610 std::vector<T2> &)> &function_answer_request,
611 const std::function<
void(
const unsigned int, std::vector<T2> &)>
612 &function_prepare_buffer_for_answer,
613 const std::function<
void(
const unsigned int,
const std::vector<T2> &)>
614 &function_read_answer)
615 : function_compute_targets(function_compute_targets)
616 , function_create_request(function_create_request)
617 , function_answer_request(function_answer_request)
618 , function_prepare_buffer_for_answer(function_prepare_buffer_for_answer)
619 , function_read_answer(function_read_answer)
624 template <
typename T1,
typename T2>
625 std::vector<unsigned int>
633 template <
typename T1,
typename T2>
636 std::vector<T1> & send_buffer)
643 template <
typename T1,
typename T2>
646 const unsigned int other_rank,
647 const std::vector<T1> &buffer_recv,
648 std::vector<T2> & request_buffer)
655 template <
typename T1,
typename T2>
658 const unsigned int other_rank,
659 std::vector<T2> & recv_buffer)
666 template <
typename T1,
typename T2>
669 const std::vector<T2> &recv_buffer)
std::vector< std::vector< T2 > > requests_buffers
void answer_request(const unsigned int other_rank, const std::vector< T1 > &buffer_recv, std::vector< T2 > &request_buffer) override
std::vector< std::vector< T1 > > send_buffers
std::vector< unsigned int > sources
virtual std::vector< unsigned int > compute_targets()=0
std::vector< unsigned int > targets
void create_request(const unsigned int other_rank, std::vector< T1 > &send_buffer) override
void read_answer(const unsigned int other_rank, const std::vector< T2 > &recv_buffer) override
const std::function< void(const int, std::vector< T2 > &)> function_prepare_buffer_for_answer
virtual void create_request(const unsigned int other_rank, std::vector< T1 > &send_buffer)
std::vector< std::vector< T2 > > recv_buffers
const std::function< void(const int, const std::vector< T2 > &)> function_read_answer
virtual void prepare_buffer_for_answer(const unsigned int other_rank, std::vector< T2 > &recv_buffer)
virtual void answer_request(const unsigned int other_rank, const std::vector< T1 > &buffer_recv, std::vector< T2 > &request_buffer)
std::vector< MPI_Request > send_requests
const std::function< void(const int, std::vector< T1 > &)> function_create_request
const std::function< void(const unsigned int, const std::vector< T1 > &, std::vector< T2 > &)> function_answer_request
MPI_Request barrier_request
const std::function< std::vector< unsigned int >)> function_compute_targets
#define DEAL_II_NAMESPACE_CLOSE
std::shared_ptr< Interface< T1, T2 > > consensus_algo
std::vector< unsigned int > targets
virtual void read_answer(const unsigned int other_rank, const std::vector< T2 > &recv_buffer)
std::vector< unsigned int > compute_targets() override
const unsigned int n_procs
std::vector< MPI_Request > send_and_recv_buffers
std::vector< std::vector< T1 > > send_buffers
Process< T1, T2 > & process
*braid_SplitCommworld & comm
std::vector< std::vector< T2 > > recv_buffers
#define DEAL_II_NAMESPACE_OPEN
std::vector< MPI_Request > recv_requests
std::vector< MPI_Request > requests_answers
std::vector< std::unique_ptr< std::vector< T2 > > > request_buffers
AnonymousProcess(const std::function< std::vector< unsigned int >()> &function_compute_targets, const std::function< void(const unsigned int, std::vector< T1 > &)> &function_create_request=[](const unsigned int, std::vector< T1 > &) {}, const std::function< void(const unsigned int, const std::vector< T1 > &, std::vector< T2 > &)> &function_answer_request=[](const unsigned int, const std::vector< T1 > &, std::vector< T2 > &) {}, const std::function< void(const unsigned int, std::vector< T2 > &)> &function_prepare_buffer_for_answer=[](const unsigned int, std::vector< T2 > &) {}, const std::function< void(const unsigned int, const std::vector< T2 > &)> &function_read_answer=[](const unsigned int, const std::vector< T2 > &) {})
std::vector< std::unique_ptr< MPI_Request > > request_requests
const unsigned int my_rank
virtual ~Process()=default
std::set< unsigned int > requesting_processes
void prepare_buffer_for_answer(const unsigned int other_rank, std::vector< T2 > &recv_buffer) override
const bool job_supports_mpi
void run(const Iterator &begin, const typename identity< Iterator >::type &end, Worker worker, Copier copier, const ScratchData &sample_scratch_data, const CopyData &sample_copy_data, const unsigned int queue_length, const unsigned int chunk_size)