本文整理汇总了C++中lduMatrix::lduAddr方法的典型用法代码示例。如果您正苦于以下问题:C++ lduMatrix::lduAddr方法的具体用法?C++ lduMatrix::lduAddr怎么用?C++ lduMatrix::lduAddr使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类lduMatrix
的用法示例。
在下文中一共展示了lduMatrix::lduAddr方法的8个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1:
void Foam::DILUPreconditioner::calcReciprocalD
(
scalarField& rD,
const lduMatrix& matrix
)
{
scalar* __restrict__ rDPtr = rD.begin();
const label* const __restrict__ uPtr =
matrix.lduAddr().upperAddr().begin();
const label* const __restrict__ lPtr =
matrix.lduAddr().lowerAddr().begin();
const scalar* const __restrict__ upperPtr = matrix.upper().begin();
const scalar* const __restrict__ lowerPtr = matrix.lower().begin();
register label nFaces = matrix.upper().size();
for (register label face=0; face<nFaces; face++)
{
rDPtr[uPtr[face]] -= upperPtr[face]*lowerPtr[face]/rDPtr[lPtr[face]];
}
// Calculate the reciprocal of the preconditioned diagonal
register label nCells = rD.size();
for (register label cell=0; cell<nCells; cell++)
{
rDPtr[cell] = 1.0/rDPtr[cell];
}
}
示例2:
void Foam::DILUPreconditioner::calcReciprocalD
(
scalarField& rD,
const lduMatrix& matrix
)
{
scalar* __restrict__ rDPtr = rD.begin();
const label* const __restrict__ uPtr = matrix.lduAddr().upperAddr().begin();
const label* const __restrict__ lPtr = matrix.lduAddr().lowerAddr().begin();
const scalar* const __restrict__ upperPtr = matrix.upper().begin();
const scalar* const __restrict__ lowerPtr = matrix.lower().begin();
label nFaces = matrix.upper().size();
for (label face=0; face<nFaces; face++)
{
Pout<< "Adapting diagonal for cell:" << uPtr[face]
<< " contributions from cell " << lPtr[face]
<< " from " << rDPtr[uPtr[face]];
rDPtr[uPtr[face]] -= upperPtr[face]*lowerPtr[face]/rDPtr[lPtr[face]];
Pout<< " to " << rDPtr[uPtr[face]] << endl;
}
// Calculate the reciprocal of the preconditioned diagonal
label nCells = rD.size();
for (label cell=0; cell<nCells; cell++)
{
rDPtr[cell] = 1.0/rDPtr[cell];
}
}
示例3: forAll
Foam::symGaussSeidelPrecon::symGaussSeidelPrecon
(
const lduMatrix& matrix,
const FieldField<Field, scalar>& coupleBouCoeffs,
const FieldField<Field, scalar>& coupleIntCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
const dictionary& dict
)
:
lduPreconditioner
(
matrix,
coupleBouCoeffs,
coupleIntCoeffs,
interfaces
),
mBouCoeffs_(coupleBouCoeffs.size()),
bPrime_(matrix.lduAddr().size())
{
forAll(mBouCoeffs_, i)
{
if (interfaces_.set(i))
{
mBouCoeffs_.set(i, -coupleBouCoeffs_[i]);
}
}
}
示例4:
void Foam::coupledGaussSeidelPrecon::reverseSweepTranspose
(
const lduMatrix& matrix,
scalarField& x,
scalarField& bPrime
) const
{
const scalarField& diag = matrix.diag();
const scalarField& lower = matrix.lower();
const scalarField& upper = matrix.upper();
const labelList& upperAddr = matrix.lduAddr().upperAddr();
const labelList& ownStartAddr = matrix.lduAddr().ownerStartAddr();
const label nRows = x.size();
label fStart, fEnd;
for (register label rowI = nRows - 1; rowI >= 0; rowI--)
{
// lRow is equal to rowI
scalar& curX = x[rowI];
// Grab the accumulated neighbour side
curX = bPrime[rowI];
// Start and end of this row
fStart = ownStartAddr[rowI];
fEnd = ownStartAddr[rowI + 1];
// Accumulate the owner product side
for (register label curCoeff = fStart; curCoeff < fEnd; curCoeff++)
{
// Transpose multiplication. HJ, 19/Jan/2009
curX -= lower[curCoeff]*x[upperAddr[curCoeff]];
}
// Finish current x
curX /= diag[rowI];
// Distribute the neighbour side using current x
for (register label curCoeff = fStart; curCoeff < fEnd; curCoeff++)
{
// Transpose multiplication. HJ, 19/Jan/2009
bPrime[upperAddr[curCoeff]] -= upper[curCoeff]*curX;
}
}
}
示例5: readLabel
Foam::amgPrecon::amgPrecon
(
const lduMatrix& matrix,
const FieldField<Field, scalar>& coupleBouCoeffs,
const FieldField<Field, scalar>& coupleIntCoeffs,
const lduInterfaceFieldPtrsList& interfaceFields,
const dictionary& dict
)
:
lduPreconditioner
(
matrix,
coupleBouCoeffs,
coupleIntCoeffs,
interfaceFields
),
cycle_(amgCycle::cycleNames_.read(dict.lookup("cycle"))),
nPreSweeps_(readLabel(dict.lookup("nPreSweeps"))),
nPostSweeps_(readLabel(dict.lookup("nPostSweeps"))),
nMaxLevels_(readLabel(dict.lookup("nMaxLevels"))),
scale_(dict.lookup("scale")),
amgPtr_
(
new amgCycle
(
autoPtr<amgLevel>
(
new fineAmgLevel
(
matrix,
coupleBouCoeffs,
coupleIntCoeffs,
interfaceFields,
dict,
dict.lookup("policy"),
readLabel(dict.lookup("groupSize")),
readLabel(dict.lookup("minCoarseEqns")),
dict.lookup("smoother")
)
)
)
),
xBuffer_(matrix.lduAddr().size())
{
// Make coarse levels
amgPtr_->makeCoarseLevels(nMaxLevels_);
}
示例6:
Foam::symGaussSeidelPrecon::symGaussSeidelPrecon
(
const lduMatrix& matrix,
const FieldField<Field, scalar>& coupleBouCoeffs,
const FieldField<Field, scalar>& coupleIntCoeffs,
const lduInterfaceFieldPtrsList& interfaces
)
:
lduPreconditioner
(
matrix,
coupleBouCoeffs,
coupleIntCoeffs,
interfaces
),
bPrime_(matrix.lduAddr().size())
{}
示例7: forAll
Foam::procLduMatrix::procLduMatrix
(
const lduMatrix& ldum,
const FieldField<Field, scalar>& interfaceCoeffs,
const lduInterfaceFieldPtrsList& interfaces
)
:
upperAddr_(ldum.lduAddr().upperAddr()),
lowerAddr_(ldum.lduAddr().lowerAddr()),
diag_(ldum.diag()),
upper_(ldum.upper()),
lower_(ldum.lower())
{
label nInterfaces = 0;
forAll(interfaces, i)
{
if (interfaces.set(i))
{
nInterfaces++;
}
}
interfaces_.setSize(nInterfaces);
nInterfaces = 0;
forAll(interfaces, i)
{
if (interfaces.set(i))
{
interfaces_.set
(
nInterfaces++,
new procLduInterface
(
interfaces[i],
interfaceCoeffs[i]
)
);
}
}
}
示例8: bPrime
void Foam::symGaussSeidelSmoother::smooth
(
const word& fieldName_,
scalarField& psi,
const lduMatrix& matrix_,
const scalarField& source,
const FieldField<Field, scalar>& interfaceBouCoeffs_,
const lduInterfaceFieldPtrsList& interfaces_,
const direction cmpt,
const label nSweeps
)
{
scalar* __restrict__ psiPtr = psi.begin();
const label nCells = psi.size();
scalarField bPrime(nCells);
scalar* __restrict__ bPrimePtr = bPrime.begin();
const scalar* const __restrict__ diagPtr = matrix_.diag().begin();
const scalar* const __restrict__ upperPtr =
matrix_.upper().begin();
const scalar* const __restrict__ lowerPtr =
matrix_.lower().begin();
const label* const __restrict__ uPtr =
matrix_.lduAddr().upperAddr().begin();
const label* const __restrict__ ownStartPtr =
matrix_.lduAddr().ownerStartAddr().begin();
// Parallel boundary initialisation. The parallel boundary is treated
// as an effective jacobi interface in the boundary.
// Note: there is a change of sign in the coupled
// interface update. The reason for this is that the
// internal coefficients are all located at the l.h.s. of
// the matrix whereas the "implicit" coefficients on the
// coupled boundaries are all created as if the
// coefficient contribution is of a source-kind (i.e. they
// have a sign as if they are on the r.h.s. of the matrix.
// To compensate for this, it is necessary to turn the
// sign of the contribution.
FieldField<Field, scalar>& mBouCoeffs =
const_cast<FieldField<Field, scalar>&>
(
interfaceBouCoeffs_
);
forAll(mBouCoeffs, patchi)
{
if (interfaces_.set(patchi))
{
mBouCoeffs[patchi].negate();
}
}
for (label sweep=0; sweep<nSweeps; sweep++)
{
bPrime = source;
matrix_.initMatrixInterfaces
(
mBouCoeffs,
interfaces_,
psi,
bPrime,
cmpt
);
matrix_.updateMatrixInterfaces
(
mBouCoeffs,
interfaces_,
psi,
bPrime,
cmpt
);
scalar psii;
label fStart;
label fEnd = ownStartPtr[0];
for (label celli=0; celli<nCells; celli++)
{
// Start and end of this row
fStart = fEnd;
fEnd = ownStartPtr[celli + 1];
// Get the accumulated neighbour side
psii = bPrimePtr[celli];
// Accumulate the owner product side
for (label facei=fStart; facei<fEnd; facei++)
{
psii -= upperPtr[facei]*psiPtr[uPtr[facei]];
}
//.........这里部分代码省略.........