48 solveScalar* __restrict__ ApsiPtr = Apsi.
begin();
51 const solveScalar*
const __restrict__ psiPtr =
psi.begin();
53 const scalar*
const __restrict__ diagPtr =
diag().
begin();
55 const label*
const __restrict__ uPtr = addr.upperAddr().begin();
56 const label*
const __restrict__ lPtr = addr.lowerAddr().begin();
58 const scalar*
const __restrict__ upperPtr =
upper().
begin();
59 const scalar*
const __restrict__ lowerPtr =
lower().
begin();
81 const label*
const __restrict__ oStartPtr =
82 addr.ownerStartAddr().begin();
83 const label*
const __restrict__ loStartPtr =
84 addr.losortStartAddr().begin();
85 const label*
const __restrict__ lcsrPtr =
86 addr.lowerCSRAddr().begin();
90 const scalar*
const __restrict__ lowercsrPtr =
lowerCSR().
begin();
94 auto& val = ApsiPtr[
cell];
100 const label start = loStartPtr[
cell];
101 const label
end = loStartPtr[
cell+1];
103 for (label i = start; i <
end; i++)
105 const label nbrCell = lcsrPtr[i];
106 val += lowercsrPtr[i]*psiPtr[nbrCell];
111 const label start = oStartPtr[
cell];
112 const label
end = oStartPtr[
cell+1];
114 for (label i = start; i <
end; i++)
116 const label nbrCell = uPtr[i];
117 val += upperPtr[i]*psiPtr[nbrCell];
134 ApsiPtr[uPtr[
face]] += lowerPtr[
face]*psiPtr[lPtr[
face]];
135 ApsiPtr[lPtr[
face]] += upperPtr[
face]*psiPtr[uPtr[
face]];
164 solveScalar* __restrict__ TpsiPtr = Tpsi.
begin();
167 const solveScalar*
const __restrict__ psiPtr =
psi.
begin();
169 const scalar*
const __restrict__ diagPtr =
diag().begin();
171 const label*
const __restrict__ uPtr = lduAddr().upperAddr().begin();
172 const label*
const __restrict__ lPtr = lduAddr().lowerAddr().begin();
174 const scalar*
const __restrict__ lowerPtr =
lower().begin();
175 const scalar*
const __restrict__ upperPtr =
upper().begin();
190 const label nCells =
diag().size();
196 const label nFaces =
upper().size();
197 for (label face=0; face<nFaces; face++)
199 TpsiPtr[uPtr[face]] += upperPtr[face]*psiPtr[lPtr[face]];
200 TpsiPtr[lPtr[face]] += lowerPtr[face]*psiPtr[uPtr[face]];
204 updateMatrixInterfaces
226 solveScalar* __restrict__ sumAPtr = sumA.
begin();
228 const scalar* __restrict__ diagPtr =
diag().begin();
230 const label* __restrict__ uPtr = lduAddr().upperAddr().begin();
231 const label* __restrict__ lPtr = lduAddr().lowerAddr().begin();
233 const scalar* __restrict__ lowerPtr =
lower().begin();
234 const scalar* __restrict__ upperPtr =
upper().begin();
236 const label nCells =
diag().size();
237 const label nFaces =
upper().size();
244 for (label face=0; face<nFaces; face++)
246 sumAPtr[uPtr[face]] += lowerPtr[face];
247 sumAPtr[lPtr[face]] += upperPtr[face];
252 forAll(interfaces, patchi)
254 if (interfaces.
set(patchi))
256 const labelUList& pa = lduAddr().patchAddr(patchi);
257 const scalarField& pCoeffs = interfaceBouCoeffs[patchi];
261 sumAPtr[pa[face]] -= pCoeffs[face];
273 const FieldField<Field, scalar>& interfaceBouCoeffs,
278 solveScalar* __restrict__ rAPtr = rA.begin();
280 const solveScalar*
const __restrict__ psiPtr =
psi.
begin();
281 const scalar*
const __restrict__ diagPtr =
diag().begin();
282 const scalar*
const __restrict__ sourcePtr = source.begin();
284 const label*
const __restrict__ uPtr = lduAddr().upperAddr().begin();
285 const label*
const __restrict__ lPtr = lduAddr().lowerAddr().begin();
287 const scalar*
const __restrict__ upperPtr =
upper().begin();
288 const scalar*
const __restrict__ lowerPtr =
lower().begin();
314 const label nCells =
diag().size();
315 for (label cell=0; cell<nCells; cell++)
317 rAPtr[cell] = sourcePtr[cell] - diagPtr[cell]*psiPtr[cell];
321 const label nFaces =
upper().size();
323 for (label face=0; face<nFaces; face++)
325 rAPtr[uPtr[face]] -= lowerPtr[face]*psiPtr[lPtr[face]];
326 rAPtr[lPtr[face]] -= upperPtr[face]*psiPtr[uPtr[face]];
330 updateMatrixInterfaces
353 residual(trA.ref(),
psi, source, interfaceBouCoeffs, interfaces, cmpt);
362 if (lowerPtr_ || upperPtr_)
364 scalar* __restrict__ H1Ptr = tH1.ref().begin();
366 const label* __restrict__ uPtr = lduAddr().upperAddr().begin();
367 const label* __restrict__ lPtr = lduAddr().lowerAddr().begin();
369 const scalar* __restrict__ lowerPtr =
lower().begin();
370 const scalar* __restrict__ upperPtr =
upper().begin();
372 const label nFaces =
upper().size();
376 H1Ptr[uPtr[
face]] -= lowerPtr[
face];
377 H1Ptr[lPtr[
face]] -= upperPtr[
face];
UPtrList< const lduInterfaceField > lduInterfaceFieldPtrsList
List of coupled interface fields to be used in coupling.
const scalarField & diag() const
void size(const label n)
Older name for setAddressableSize.
void Tmul(solveScalarField &, const tmp< solveScalarField > &, const FieldField< Field, scalar > &, const lduInterfaceFieldPtrsList &, const direction cmpt) const
Matrix transpose multiplication with updated interfaces.
bool hasLowerCSR() const noexcept
A face is a list of labels corresponding to mesh vertices.
Field< solveScalar > solveScalarField
void residual(solveScalarField &rA, const solveScalarField &psi, const scalarField &source, const FieldField< Field, scalar > &interfaceBouCoeffs, const lduInterfaceFieldPtrsList &interfaces, const direction cmpt) const
static label nRequests() noexcept
Number of outstanding requests (on the internal list of requests)
Ostream & endl(Ostream &os)
Add newline and flush stream.
tmp< scalarField > H1() const
UList< label > labelUList
A UList of labels.
A field of fields is a PtrList of fields with reference counting.
#define forAll(list, i)
Loop across all elements in list.
void diag(pointPatchField< vector > &, const pointPatchField< tensor > &)
void Amul(solveScalarField &, const tmp< solveScalarField > &, const FieldField< Field, scalar > &, const lduInterfaceFieldPtrsList &, const direction cmpt) const
Matrix multiplication with updated interfaces.
Field< scalar > scalarField
Specialisation of Field<T> for scalar.
void updateMatrixInterfaces(const bool add, const FieldField< Field, scalar > &interfaceCoeffs, const lduInterfaceFieldPtrsList &interfaces, const solveScalarField &psiif, solveScalarField &result, const direction cmpt, const label startRequest) const
Update interfaced interfaces for matrix operations.
void initMatrixInterfaces(const bool add, const FieldField< Field, scalar > &interfaceCoeffs, const lduInterfaceFieldPtrsList &interfaces, const solveScalarField &psiif, solveScalarField &result, const direction cmpt) const
Initialise the update of interfaced interfaces for matrix operations.
const scalarField & lower() const
static tmp< T > New(Args &&... args)
Construct tmp with forwarding arguments.
void sumA(solveScalarField &, const FieldField< Field, scalar > &, const lduInterfaceFieldPtrsList &) const
Sum the coefficients on each row of the matrix.
iterator begin() noexcept
Return an iterator to begin traversing the UList.
int debug
Static debugging option.
string upper(const std::string &s)
Return string copy transformed with std::toupper on each character.
const scalarField & upper() const
const lduAddressing & lduAddr() const
Return the LDU addressing.
A cell is defined as a list of faces with extra functionality.
#define PoutInFunction
Report using Foam::Pout with FUNCTION_NAME prefix.
string lower(const std::string &s)
Return string copy transformed with std::tolower on each character.
void clear() const noexcept
If object pointer points to valid object: delete object and set pointer to nullptr.
const volScalarField & psi
A class for managing temporary objects.
const T * set(const label i) const
Return const pointer to element (can be nullptr), or nullptr for out-of-range access (ie...
static constexpr const zero Zero
Global zero (0)
const scalarField & lowerCSR() const