NeoFOAM
WIP Prototype of a modern OpenFOAM core
Loading...
Searching...
No Matches
fullDuplexCommBuffer.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: MIT
2// SPDX-FileCopyrightText: 2023 NeoFOAM authors
3#pragma once
4
5#include <vector>
6#include <string>
7#include <span>
8
11
12namespace NeoFOAM
13{
14
15#ifdef NF_WITH_MPI_SUPPORT
16
17namespace mpi
18{
19
28class FullDuplexCommBuffer
29{
30public:
31
35 FullDuplexCommBuffer() = default;
36
43 FullDuplexCommBuffer(
44 MPIEnvironment mpiEnviron,
45 std::vector<std::size_t> sendSize,
46 std::vector<std::size_t> receiveSize
47 )
48 : send_(mpiEnviron, sendSize), receive_(mpiEnviron, receiveSize) {};
49
54 inline bool isCommInit() const { return send_.isCommInit() && receive_.isCommInit(); }
55
61 template<typename valueType>
62 void initComm(std::string commName)
63 {
64 send_.initComm<valueType>(commName);
65 receive_.initComm<valueType>(commName);
66 }
67
74 template<typename valueType>
75 std::span<valueType> getSend(const size_t rank)
76 {
77 return send_.get<valueType>(rank);
78 }
79
86 template<typename valueType>
87 std::span<const valueType> getSend(const size_t rank) const
88 {
89 return send_.get<valueType>(rank);
90 }
91
98 template<typename valueType>
99 std::span<valueType> getReceive(const size_t rank)
100 {
101 return receive_.get<valueType>(rank);
102 }
103
110 template<typename valueType>
111 std::span<const valueType> getReceive(const size_t rank) const
112 {
113 return receive_.get<valueType>(rank);
114 }
115
119 inline void startComm()
120 {
121 send_.send();
122 receive_.receive();
123 }
124
129 inline bool isComplete() { return send_.isComplete() && receive_.isComplete(); }
130
134 inline void waitComplete()
135 {
136 send_.waitComplete();
137 receive_.waitComplete();
138 }
139
143 inline void finaliseComm()
144 {
145 send_.finaliseComm();
146 receive_.finaliseComm();
147 }
148
149private:
150
151 HalfDuplexCommBuffer send_;
152 HalfDuplexCommBuffer receive_;
153};
154
155} // namespace mpi
156
157#endif
158
159}