Compare commits

...

1 Commits

Author SHA1 Message Date
256dafeea5 ENH: fvMatrix: adding setValues for patch
Speedup in offloading
2025-03-05 09:11:47 +00:00
4 changed files with 118 additions and 4 deletions

View File

@ -613,7 +613,7 @@ void Foam::epsilonWallFunctionFvPatchScalarField::manipulateMatrix
return;
}
matrix.setValues(patch().faceCells(), patchInternalField());
matrix.setValues(patch().index(), patchInternalField()());
fvPatchField<scalar>::manipulateMatrix(matrix);
}

View File

@ -603,7 +603,7 @@ void Foam::omegaWallFunctionFvPatchScalarField::manipulateMatrix
return;
}
matrix.setValues(patch().faceCells(), patchInternalField());
matrix.setValues(patch().index(), patchInternalField());
fvPatchField<scalar>::manipulateMatrix(matrix);
}

View File

@ -6,7 +6,7 @@
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2011-2017 OpenFOAM Foundation
Copyright (C) 2016-2024 OpenCFD Ltd.
Copyright (C) 2016-2025 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@ -1006,6 +1006,111 @@ void Foam::fvMatrix<Type>::setValues
}
template<class Type>
void Foam::fvMatrix<Type>::setValues
(
const label setPatchi,
const UList<Type>& values
)
{
// this->setValuesFromList(cellLabels, values);
const fvMesh& mesh = psi_.mesh();
const auto& cellLabels = mesh.boundaryMesh()[setPatchi].faceCells();
const cellList& cells = mesh.cells();
const labelUList& own = mesh.owner();
const labelUList& nei = mesh.neighbour();
scalarField& Diag = diag();
Field<Type>& psi =
const_cast
<
GeometricField<Type, fvPatchField, volMesh>&
>(psi_).primitiveFieldRef();
// Following actions:
// - adjust local field psi
// - set local matrix to be diagonal (so adjust source)
// - cut connections to neighbours
// - make (on non-adjusted cells) contribution explicit
if (symmetric() || asymmetric())
{
forAll(cellLabels, i)
{
const label celli = cellLabels[i];
const Type& value = values[i];
for (const label facei : cells[celli])
{
const label patchi = mesh.boundaryMesh().patchID(facei);
if (patchi == -1)
{
if (symmetric())
{
if (celli == own[facei])
{
source_[nei[facei]] -= upper()[facei]*value;
}
else
{
source_[own[facei]] -= upper()[facei]*value;
}
upper()[facei] = 0.0;
}
else
{
if (celli == own[facei])
{
source_[nei[facei]] -= lower()[facei]*value;
}
else
{
source_[own[facei]] -= upper()[facei]*value;
}
upper()[facei] = 0.0;
lower()[facei] = 0.0;
}
}
else if (patchi != setPatchi)
{
if (internalCoeffs_[patchi].size())
{
const label patchFacei =
mesh.boundaryMesh()[patchi].whichFace(facei);
internalCoeffs_[patchi][patchFacei] = Zero;
boundaryCoeffs_[patchi][patchFacei] = Zero;
}
}
}
}
// Can explictly zero out contribution from setPatchi
if (internalCoeffs_[setPatchi].size())
{
internalCoeffs_[setPatchi] = Zero;
boundaryCoeffs_[setPatchi] = Zero;
}
}
// Note: above loop might have affected source terms on adjusted cells
// so make sure to adjust them afterwards
forAll(cellLabels, i)
{
const label celli = cellLabels[i];
const Type& value = values[i];
psi[celli] = value;
source_[celli] = value*Diag[celli];
}
}
template<class Type>
void Foam::fvMatrix<Type>::setReference
(

View File

@ -6,7 +6,7 @@
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2011-2017 OpenFOAM Foundation
Copyright (C) 2016-2023 OpenCFD Ltd.
Copyright (C) 2016-2025 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@ -541,6 +541,15 @@ public:
const UIndirectList<Type>& values
);
//- Set solution in cells next to the given patch to the specified
//- values and eliminate the corresponding equations from the
//- matrix.
void setValues
(
const label patchi,
const UList<Type>& values
);
//- Set reference level for solution
void setReference
(