Loading...
Searching...
No Matches
processorGAMGInterfaceField.C
Go to the documentation of this file.
1/*---------------------------------------------------------------------------*\
2 ========= |
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4 \\ / O peration |
5 \\ / A nd | www.openfoam.com
6 \\/ M anipulation |
7-------------------------------------------------------------------------------
8 Copyright (C) 2011-2017 OpenFOAM Foundation
9 Copyright (C) 2019-2025 OpenCFD Ltd.
10-------------------------------------------------------------------------------
11License
12 This file is part of OpenFOAM.
13
14 OpenFOAM is free software: you can redistribute it and/or modify it
15 under the terms of the GNU General Public License as published by
16 the Free Software Foundation, either version 3 of the License, or
17 (at your option) any later version.
18
19 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
20 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22 for more details.
23
24 You should have received a copy of the GNU General Public License
25 along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
26
27\*---------------------------------------------------------------------------*/
28
31#include "lduMatrix.H"
32
33// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
34
35namespace Foam
36{
39 (
43 );
45 (
49 );
51 (
55 );
56}
57
58
59// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
60
61Foam::processorGAMGInterfaceField::processorGAMGInterfaceField
62(
63 const GAMGInterface& GAMGCp,
64 const lduInterfaceField& fineInterface
65)
66:
67 GAMGInterfaceField(GAMGCp, fineInterface),
68 procInterface_(refCast<const processorGAMGInterface>(GAMGCp)),
69 doTransform_(false),
70 rank_(0),
71 sendRequest_(-1),
72 recvRequest_(-1)
73{
74 const auto& p = refCast<const processorLduInterfaceField>(fineInterface);
75
76 doTransform_ = p.doTransform();
77 rank_ = p.rank();
78}
79
80
81Foam::processorGAMGInterfaceField::processorGAMGInterfaceField
82(
83 const GAMGInterface& GAMGCp,
84 const bool doTransform,
85 const int rank
86)
87:
88 GAMGInterfaceField(GAMGCp, doTransform, rank),
89 procInterface_(refCast<const processorGAMGInterface>(GAMGCp)),
90 doTransform_(doTransform),
91 rank_(rank),
92 sendRequest_(-1),
93 recvRequest_(-1)
94{}
95
96
97Foam::processorGAMGInterfaceField::processorGAMGInterfaceField
98(
99 const GAMGInterface& GAMGCp,
100 Istream& is
101)
102:
103 GAMGInterfaceField(GAMGCp, is),
104 procInterface_(refCast<const processorGAMGInterface>(GAMGCp)),
105 doTransform_(readBool(is)),
106 rank_(readLabel(is))
107{}
108
109
110// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
111
113{
114 const bool ok = UPstream::finishedRequest(recvRequest_);
115 if (ok)
116 {
117 recvRequest_ = -1;
118 if (UPstream::finishedRequest(sendRequest_)) sendRequest_ = -1;
119 }
120 return ok;
121}
122
123
125(
127 const bool,
128 const lduAddressing& lduAddr,
129 const label patchId,
130 const solveScalarField& psiInternal,
131 const scalarField&,
132 const direction,
133 const Pstream::commsTypes commsType
134) const
135{
136 procInterface_.interfaceInternalField(psiInternal, scalarSendBuf_);
137
138 if
139 (
142 )
143 {
144 // Fast path.
145 scalarRecvBuf_.resize_nocopy(scalarSendBuf_.size());
146
147 recvRequest_ = UPstream::nRequests();
149 (
151 procInterface_.neighbProcNo(),
152 scalarRecvBuf_,
153 procInterface_.tag(),
154 comm()
155 );
156
157 sendRequest_ = UPstream::nRequests();
159 (
161 procInterface_.neighbProcNo(),
162 scalarSendBuf_,
163 procInterface_.tag(),
164 comm()
165 );
166 }
167 else
168 {
169 procInterface_.compressedSend(commsType, scalarSendBuf_);
170 }
171
172 this->updatedMatrix(false);
173}
174
175
177(
178 solveScalarField& result,
179 const bool add,
180 const lduAddressing& lduAddr,
181 const label patchId,
182 const solveScalarField&,
183 const scalarField& coeffs,
184 const direction cmpt,
185 const Pstream::commsTypes commsType
186) const
187{
188 if (this->updatedMatrix())
189 {
190 return;
191 }
192
193 const labelUList& faceCells = lduAddr.patchAddr(patchId);
194
195 if
196 (
199 )
200 {
201 // Fast path: consume straight from receive buffer
202
203 // Require receive data.
204 // Only update the send request state.
205 UPstream::waitRequest(recvRequest_); recvRequest_ = -1;
206 if (UPstream::finishedRequest(sendRequest_)) sendRequest_ = -1;
207 }
208 else
209 {
210 scalarRecvBuf_.resize_nocopy(coeffs.size());
211 procInterface_.compressedReceive(commsType, scalarRecvBuf_);
212 }
213
214
215 // Transform according to the transformation tensor
216 transformCoupleField(scalarRecvBuf_, cmpt);
217
218 // Multiply the field by coefficients and add into the result
219 addToInternalField(result, !add, faceCells, coeffs, scalarRecvBuf_);
220
221 this->updatedMatrix(true);
222}
223
224
226{
227 //GAMGInterfaceField::write(os);
228 os << token::SPACE << doTransform()
229 << token::SPACE << rank();
230}
231
232
233// ************************************************************************* //
Macros for easy insertion into run-time selection tables.
#define addToRunTimeSelectionTable(baseType, thisType, argNames)
Add to construction table with typeName as the key.
Abstract base class for GAMG agglomerated interface fields.
Abstract base class for GAMG agglomerated interfaces.
An Istream is an abstract base class for all input systems (streams, files, token lists etc)....
Definition Istream.H:60
An Ostream is an abstract base class for all output systems (streams, files, token lists,...
Definition Ostream.H:59
static std::streamsize read(const UPstream::commsTypes commsType, const int fromProcNo, Type *buffer, std::streamsize count, const int tag=UPstream::msgType(), const int communicator=UPstream::worldComm, UPstream::Request *req=nullptr)
Receive buffer contents (contiguous types) from given processor.
void size(const label n)
Older name for setAddressableSize.
Definition UList.H:118
static bool write(const UPstream::commsTypes commsType, const int toProcNo, const Type *buffer, std::streamsize count, const int tag=UPstream::msgType(), const int communicator=UPstream::worldComm, UPstream::Request *req=nullptr, const UPstream::sendModes sendMode=UPstream::sendModes::normal)
Write buffer contents (contiguous types only) to given processor.
static label nRequests() noexcept
Number of outstanding requests (on the internal list of requests).
commsTypes
Communications types.
Definition UPstream.H:81
@ nonBlocking
"nonBlocking" (immediate) : (MPI_Isend, MPI_Irecv)
Definition UPstream.H:84
static bool floatTransfer
Should compact transfer be used in which floats replace doubles reducing the bandwidth requirement at...
Definition UPstream.H:1024
static bool finishedRequest(const label i)
Non-blocking comms: has request i finished? Corresponds to MPI_Test().
static void waitRequest(const label i)
Wait until request i has finished. Corresponds to MPI_Wait().
Smooth ATC in cells next to a set of patches supplied by type.
Definition faceCells.H:55
The class contains the addressing required by the lduMatrix: upper, lower and losort.
virtual const labelUList & patchAddr(const label patchNo) const =0
Return patch to internal addressing given patch number.
An abstract base class for implicitly-coupled interface fields e.g. processor and cyclic patch fields...
bool updatedMatrix() const noexcept
Whether matrix has been updated.
void addToInternalField(Field< Type > &result, const bool add, const labelUList &faceCells, const scalarField &coeffs, const Field< Type > &vals) const
Add/subtract weighted contributions to internal field.
An abstract base class for implicitly-coupled interfaces e.g. processor and cyclic patches.
GAMG agglomerated processor interface field.
virtual bool doTransform() const
Does the interface field perform the transformation.
virtual void initInterfaceMatrixUpdate(solveScalarField &result, const bool add, const lduAddressing &lduAddr, const label patchId, const solveScalarField &psiInternal, const scalarField &coeffs, const direction cmpt, const Pstream::commsTypes commsType) const
Initialise neighbour matrix update.
virtual int rank() const
Return rank of component for transform.
virtual void write(Ostream &) const
Write to stream.
virtual void updateInterfaceMatrix(solveScalarField &result, const bool add, const lduAddressing &lduAddr, const label patchId, const solveScalarField &psiInternal, const scalarField &coeffs, const direction cmpt, const Pstream::commsTypes commsType) const
Update result field based on interface functionality.
virtual label comm() const
Processor interface functions.
virtual bool ready() const
Are all (receive) data available?
GAMG agglomerated processor interface.
void transformCoupleField(Field< Type > &f) const
Transform given patch field.
@ SPACE
Space [isspace].
Definition token.H:144
#define defineTypeNameAndDebug(Type, DebugSwitch)
Define the typeName and debug information.
Definition className.H:142
volScalarField & p
OBJstream os(runTime.globalPath()/outputName)
label patchId(-1)
Namespace for OpenFOAM.
Type & refCast(U &obj)
A dynamic_cast (for references) to Type reference.
Definition typeInfo.H:172
label readLabel(const char *buf)
Parse entire buffer as a label, skipping leading/trailing whitespace.
Definition label.H:63
Field< scalar > scalarField
Specialisation of Field<T> for scalar.
void add(DimensionedField< scalar, GeoMesh > &result, const dimensioned< scalar > &dt1, const DimensionedField< scalar, GeoMesh > &f2)
Field< solveScalar > solveScalarField
uint8_t direction
Definition direction.H:49
UList< label > labelUList
A UList of labels.
Definition UList.H:75
bool readBool(Istream &is)
Read bool from stream using Foam::Switch(Istream&).
Definition bool.C:72
dict add("bounds", meshBb)