Skip to content

Commit f29f5b9

Browse files
committed
UEqn Laplacian
1 parent 2a5b3a3 commit f29f5b9

File tree

2 files changed

+177
-7
lines changed

2 files changed

+177
-7
lines changed

src/dfGenMatrixIncompressible/GenMatrix_U.C

Lines changed: 139 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ GenMatrix_U(
5858
// // fvm.upper() = fvm.lower() + rhoPhi.primitiveField();
5959
// fvm.upper() = -weights.primitiveField()*rhoPhi.primitiveField() + rhoPhi.primitiveField();
6060
// fvm.negSumDiag();
61-
// fvm.diag() += rDeltaT*rho.primitiveField()*mesh.Vsc(); // 再加上瞬态项
61+
// fvm.diag() += rDeltaT*rho.primitiveField()*mesh.Vsc();
6262
// fvm.source() = rDeltaT
6363
// *rho.oldTime().primitiveField()
6464
// *U.oldTime().primitiveField()*mesh.Vsc();
@@ -95,11 +95,11 @@ GenMatrix_U(
9595
diagPtr[celli] = 0.0; // vector::zero;
9696
}
9797

98-
// 然后从 off-diagonal 项累积到对角线
98+
//
9999
for (label facei = 0; facei < nFaces; facei++)
100100
{
101-
diagPtr[l[facei]] -= lowerPtr[facei]; // 从下三角累积
102-
diagPtr[u[facei]] -= upperPtr[facei]; // 从上三角累积
101+
diagPtr[l[facei]] -= lowerPtr[facei];
102+
diagPtr[u[facei]] -= upperPtr[facei];
103103
}
104104

105105
for (label celli = 0; celli < nCells; celli++)
@@ -125,10 +125,142 @@ GenMatrix_U(
125125
fvm += fvc::surfaceIntegrate(rhoPhi*gcs.interpScheme().correction(U));
126126
}
127127

128-
// -------------------------------------------------------
128+
// --------------------------------------------------------------------------------------------------------------
129+
130+
Info << "UEqn gaussLaplacianSchemeFvmLaplacian" << endl;
131+
132+
const volScalarField alphaEff = turbulence.alpha()*rho*turbulence.nuEff();
133+
// tmp<fv::snGradScheme<vector>> tsnGradScheme_(new fv::orthogonalSnGrad<vector>(mesh)); // 正交修正方案
134+
tmp<fv::snGradScheme<vector>> tsnGradScheme_(new fv::correctedSnGrad<vector>(mesh)); // 对应snGradSchemes{default corrected;}
129135

136+
surfaceScalarField alphaEfff = fvc::interpolate(alphaEff); ///
137+
138+
// gammaMagSf = alphaEfff * magSf
139+
GeometricField<scalar, fvsPatchField, surfaceMesh> gammaMagSf
140+
(
141+
alphaEfff * mesh.magSf()
142+
);
143+
144+
const surfaceScalarField& deltaCoeffs = tsnGradScheme_().deltaCoeffs(U);
145+
//
146+
tmp<fvVectorMatrix> tfvm_Laplacian
147+
(
148+
new fvVectorMatrix
149+
(
150+
U,
151+
deltaCoeffs.dimensions()*gammaMagSf.dimensions()*U.dimensions()
152+
)
153+
);
154+
fvVectorMatrix& fvm_laplace = tfvm_Laplacian.ref();
130155

156+
// interField
157+
// fvm_laplace.upper() = deltaCoeffs.primitiveField()*gammaMagSf.primitiveField();
158+
// fvm_laplace.negSumDiag();
159+
160+
vector* __restrict__ sourcePtrs = fvm_laplace.source().begin();
161+
scalar* __restrict__ diagPtrs = fvm_laplace.diag().begin();
162+
scalar* __restrict__ lowerPtrs = fvm_laplace.lower().begin();
163+
scalar* __restrict__ upperPtrs = fvm_laplace.upper().begin();
131164

165+
const labelUList& ls = fvm_laplace.lduAddr().lowerAddr();
166+
const labelUList& us = fvm_laplace.lduAddr().upperAddr();
167+
168+
// 获取场数据指针
169+
const scalar* const __restrict__ gammaMagSfPtrs = gammaMagSf.primitiveField().begin();
170+
const scalar* const __restrict__ deltaCoeffsPtrs = deltaCoeffs.primitiveField().begin();
171+
const scalar* const __restrict__ meshVPtrs = mesh.V().begin();
172+
173+
const label nFacess = fvm_laplace.lower().size();
174+
const label nCellss = fvm_laplace.diag().size();
175+
176+
// 初始化矩阵
177+
for (label celli = 0; celli < nCellss; celli++)
178+
{
179+
diagPtrs[celli] = 0.0;
180+
sourcePtrs[celli] = vector::zero;
181+
}
182+
183+
// 设置内部场矩阵系数
184+
for (label facei = 0; facei < nFacess; facei++)
185+
{
186+
scalar coeffs = deltaCoeffsPtrs[facei] * gammaMagSfPtrs[facei];
187+
upperPtrs[facei] = +coeffs;
188+
lowerPtrs[facei] = +coeffs;
189+
}
190+
191+
// 对角线求和
192+
for (label facei = 0; facei < nFacess; facei++)
193+
{
194+
diagPtrs[ls[facei]] -= lowerPtrs[facei];
195+
diagPtrs[us[facei]] -= upperPtrs[facei];
196+
}
197+
198+
// ------------------------------------
199+
forAll(U.boundaryField(), patchi)
200+
{
201+
const fvPatchVectorField& pvf = U.boundaryField()[patchi];
202+
const fvsPatchScalarField& pGamma = gammaMagSf.boundaryField()[patchi];
203+
const fvsPatchScalarField& pDeltaCoeffs = deltaCoeffs.boundaryField()[patchi];
204+
205+
if (pvf.coupled())
206+
{
207+
fvm_laplace.internalCoeffs()[patchi] =
208+
pGamma * pvf.gradientInternalCoeffs(pDeltaCoeffs);
209+
fvm_laplace.boundaryCoeffs()[patchi] =
210+
-pGamma * pvf.gradientBoundaryCoeffs(pDeltaCoeffs);
211+
}
212+
else
213+
{
214+
fvm_laplace.internalCoeffs()[patchi] = pGamma * pvf.gradientInternalCoeffs();
215+
fvm_laplace.boundaryCoeffs()[patchi] = -pGamma * pvf.gradientBoundaryCoeffs();
216+
}
217+
}
218+
219+
// 非正交修正,否则不需要
220+
if (mesh.fluxRequired(U.name()))
221+
{
222+
fvm_laplace.faceFluxCorrectionPtr() = new
223+
GeometricField<vector, fvsPatchField, surfaceMesh>
224+
(
225+
gammaMagSf * tsnGradScheme_().correction(U)
226+
);
227+
228+
fvm_laplace.source() -=
229+
mesh.V() *
230+
fvc::div
231+
(
232+
*fvm_laplace.faceFluxCorrectionPtr()
233+
)().primitiveField();
234+
}
235+
else
236+
{
237+
fvm_laplace.source() -=
238+
mesh.V() *
239+
fvc::div
240+
(
241+
gammaMagSf * tsnGradScheme_().correction(U)
242+
)().primitiveField();
243+
}
244+
245+
fvm -= fvm_laplace;
246+
247+
// --------------------------------------------------------------------------------------------------------------
248+
249+
250+
251+
252+
253+
254+
255+
256+
257+
258+
259+
260+
261+
262+
263+
132264
// -------------------------------------------------------
133265
// interFoam
134266
// const alphaField& alpha;
@@ -141,7 +273,8 @@ GenMatrix_U(
141273
// + MRF.DDt(rho, U)
142274
// + turbulence.divDevRhoReff(rho, U)
143275
- fvc::div((turbulence.alpha()*rho*turbulence.nuEff())*dev2(T(fvc::grad(U))))
144-
- fvm::laplacian(turbulence.alpha()*rho*turbulence.nuEff(), U)
276+
277+
// - fvm::laplacian(turbulence.alpha()*rho*turbulence.nuEff(), U)
145278
// - fvOptions(rho, U)
146279
);
147280

src/dfGenMatrixIncompressible/gaussGrad.C

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,4 +323,41 @@ gaussGradSchemeGrad
323323

324324
} // End namespace Foam
325325

326-
// ************************************************************************* //
326+
// ************************************************************************* //
327+
328+
// template<class Type>
329+
// tmp
330+
// <
331+
// GeometricField
332+
// <
333+
// typename outerProduct<vector,Type>::type, fvPatchField, volMesh
334+
// >
335+
// >
336+
// grad
337+
// (
338+
// const GeometricField<Type, fvPatchField, volMesh>& vf
339+
// )
340+
// {
341+
// return fvc::grad(vf, "grad(" + vf.name() + ')');
342+
// }
343+
344+
// template<class Type>
345+
// tmp
346+
// <
347+
// GeometricField
348+
// <
349+
// typename outerProduct<vector,Type>::type, fvPatchField, volMesh
350+
// >
351+
// >
352+
// grad
353+
// (
354+
// const GeometricField<Type, fvPatchField, volMesh>& vf,
355+
// const word& name
356+
// )
357+
// {
358+
// return fv::gradScheme<Type>::New
359+
// (
360+
// vf.mesh(),
361+
// vf.mesh().gradScheme(name)
362+
// )().grad(vf, name);
363+
// }

0 commit comments

Comments
 (0)