Loading...
Searching...
No Matches
calculatedProcessorGAMGInterfaceField.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) 2019-2023 OpenCFD Ltd.
9-------------------------------------------------------------------------------
10License
11 This file is part of OpenFOAM.
12
13 OpenFOAM is free software: you can redistribute it and/or modify it
14 under the terms of the GNU General Public License as published by
15 the Free Software Foundation, either version 3 of the License, or
16 (at your option) any later version.
17
18 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
19 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
20 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21 for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
25
26\*---------------------------------------------------------------------------*/
27
30#include "lduMatrix.H"
31
32// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
33
34namespace Foam
35{
38 (
42 );
44 (
48 );
50 (
54 );
55}
56
57
58// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
59
60Foam::calculatedProcessorGAMGInterfaceField::
61calculatedProcessorGAMGInterfaceField
62(
63 const GAMGInterface& GAMGCp,
64 const lduInterfaceField& fineInterface
65)
66:
67 GAMGInterfaceField(GAMGCp, fineInterface),
68 procInterface_(refCast<const calculatedProcessorGAMGInterface>(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::calculatedProcessorGAMGInterfaceField::
82calculatedProcessorGAMGInterfaceField
83(
84 const GAMGInterface& GAMGCp,
85 const bool doTransform,
86 const int rank
87)
88:
89 GAMGInterfaceField(GAMGCp, doTransform, rank),
90 procInterface_(refCast<const calculatedProcessorGAMGInterface>(GAMGCp)),
91 doTransform_(doTransform),
92 rank_(rank),
93 sendRequest_(-1),
94 recvRequest_(-1)
95{}
96
97
98Foam::calculatedProcessorGAMGInterfaceField::
99calculatedProcessorGAMGInterfaceField
100(
101 const GAMGInterface& GAMGCp,
102 Istream& is
103)
104:
105 GAMGInterfaceField(GAMGCp, is),
106 procInterface_(refCast<const calculatedProcessorGAMGInterface>(GAMGCp)),
107 doTransform_(readBool(is)),
108 rank_(readLabel(is))
109{}
110
111
112// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
113
115(
117 const bool add,
118 const lduAddressing& lduAddr,
119 const label patchId,
120 const solveScalarField& psiInternal,
121 const scalarField&,
122 const direction,
123 const Pstream::commsTypes commsType
124) const
125{
126 procInterface_.interfaceInternalField(psiInternal, scalarSendBuf_);
127
128 if
129 (
132 )
133 {
134 // Fast path.
135 scalarRecvBuf_.resize_nocopy(scalarSendBuf_.size());
136
137 recvRequest_ = UPstream::nRequests();
139 (
141 procInterface_.neighbProcNo(),
142 scalarRecvBuf_,
143 procInterface_.tag(),
144 comm()
145 );
146
147 sendRequest_ = UPstream::nRequests();
149 (
151 procInterface_.neighbProcNo(),
152 scalarSendBuf_,
153 procInterface_.tag(),
154 comm()
155 );
156 }
157 else
158 {
159 procInterface_.compressedSend(commsType, scalarSendBuf_);
160 }
161
162 this->updatedMatrix(false);
163}
164
165
167(
168 solveScalarField& result,
169 const bool add,
170 const lduAddressing& lduAddr,
171 const label patchId,
172 const solveScalarField&,
173 const scalarField& coeffs,
174 const direction cmpt,
175 const Pstream::commsTypes commsType
176) const
177{
178 if (this->updatedMatrix())
179 {
180 return;
181 }
182
183 const labelUList& faceCells = lduAddr.patchAddr(patchId);
184
185 if
186 (
189 )
190 {
191 // Fast path: consume straight from receive buffer
192
193 // Require receive data.
194 // Only update the send request state.
195 UPstream::waitRequest(recvRequest_); recvRequest_ = -1;
196 if (UPstream::finishedRequest(sendRequest_)) sendRequest_ = -1;
197 }
198 else
199 {
200 scalarRecvBuf_.resize_nocopy(this->size());
201 procInterface_.compressedReceive(commsType, scalarRecvBuf_);
202 }
203
204
205 // Transform according to the transformation tensor
206 transformCoupleField(scalarRecvBuf_, cmpt);
207
208 // Multiply the field by coefficients and add into the result
209 addToInternalField(result, !add, faceCells, coeffs, scalarRecvBuf_);
210
211 this->updatedMatrix(true);
212}
213
214
216{
217 //GAMGInterfaceField::write(os);
218 os << token::SPACE << doTransform()
219 << token::SPACE << rank();
220}
221
222
223// ************************************************************************* //
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.
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().
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.
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.
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)