Skip to content

Commit 6f5759d

Browse files
committed
U
1 parent b8dfc36 commit 6f5759d

File tree

4 files changed

+850
-158
lines changed

4 files changed

+850
-158
lines changed

src/dfGenMatrixIncompressible/GenFvMatrix.H

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,4 +202,6 @@ void check_fvmatrix_equal(const fvScalarMatrix& answer, const fvScalarMatrix& ch
202202
} // End namespace Foam
203203

204204

205+
206+
205207
// ************************************************************************* //

src/dfGenMatrixIncompressible/GenMatrix_U.C

Lines changed: 125 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@
1919

2020
#include "gaussGrad.H"
2121
#include "extrapolatedCalculatedFvPatchField.H"
22+
#include <mpi.h>
23+
24+
double UEqn_build_pre_time = 0., UEqn_build_item1_intern_time = 0., UEqn_build_item1_bound_time = 0., UEqn_build_item2_intern_time = 0., UEqn_build_item2_bound_time = 0., UEqn_build_item3_time = 0., UEqn_build_item3_last_time = 0;
25+
double startU, endU;
2226

2327
namespace Foam{
2428

@@ -252,6 +256,9 @@ GenMatrix_U(
252256
const volScalarField& p,
253257
incompressible::turbulenceModel& turbulence
254258
){
259+
UEqn_build_pre_time = 0., UEqn_build_item1_intern_time = 0., UEqn_build_item1_bound_time = 0., UEqn_build_item2_intern_time = 0., UEqn_build_item2_bound_time = 0., UEqn_build_item3_time = 0., UEqn_build_item3_last_time = 0;
260+
startU = MPI_Wtime();
261+
255262
word name("div("+rhoPhi.name()+','+U.name()+')');
256263

257264
const fvMesh& mesh = U.mesh();
@@ -276,8 +283,29 @@ GenMatrix_U(
276283
);
277284
fvVectorMatrix& fvm = tfvm_DDT.ref();
278285

286+
// -------------
279287
scalar rDeltaT = 1.0/mesh.time().deltaTValue();
280288

289+
Info << "UEqn gaussLaplacianSchemeFvmLaplacian" << endl;
290+
291+
const volScalarField alphaEff = turbulence.alpha()*rho*turbulence.nuEff();
292+
// tmp<fv::snGradScheme<vector>> tsnGradScheme_(new fv::orthogonalSnGrad<vector>(mesh)); // 正交修正方案
293+
tmp<fv::snGradScheme<vector>> tsnGradScheme_(new fv::correctedSnGrad<vector>(mesh)); // 对应snGradSchemes{default corrected;}
294+
295+
surfaceScalarField alphaEfff = fvc::interpolate(alphaEff); ///
296+
297+
// gammaMagSf = alphaEfff * magSf
298+
GeometricField<scalar, fvsPatchField, surfaceMesh> gammaMagSf
299+
(
300+
alphaEfff * mesh.magSf()
301+
);
302+
303+
const surfaceScalarField& deltaCoeffs = tsnGradScheme_().deltaCoeffs(U);
304+
// -------------
305+
306+
endU = MPI_Wtime();
307+
UEqn_build_pre_time += endU - startU;
308+
281309
// interField
282310
// fvm.lower() = -weights.primitiveField()*rhoPhi.primitiveField();
283311
// // fvm.upper() = fvm.lower() + rhoPhi.primitiveField();
@@ -289,6 +317,13 @@ GenMatrix_U(
289317
// *U.oldTime().primitiveField()*mesh.Vsc();
290318

291319

320+
// interField
321+
// fvm_laplace.upper() = deltaCoeffs.primitiveField()*gammaMagSf.primitiveField();
322+
// fvm_laplace.negSumDiag();
323+
// fvm -=fvm_laplace;
324+
325+
startU = MPI_Wtime();
326+
292327
vector* __restrict__ sourcePtr = fvm.source().begin();
293328
scalar* __restrict__ diagPtr = fvm.diag().begin();
294329
scalar* __restrict__ lowerPtr = fvm.lower().begin();
@@ -297,6 +332,9 @@ GenMatrix_U(
297332
const labelUList& l = fvm.lduAddr().lowerAddr();
298333
const labelUList& u = fvm.lduAddr().upperAddr();
299334

335+
const scalar* const __restrict__ gammaMagSfPtr = gammaMagSf.primitiveField().begin();
336+
const scalar* const __restrict__ deltaCoeffsPtr = deltaCoeffs.primitiveField().begin();
337+
300338
const scalar* const __restrict__ weightsPtr = weights.primitiveField().begin();
301339
const scalar* const __restrict__ rhoPhiPtr = rhoPhi.primitiveField().begin();
302340
const scalar* const __restrict__ rhoPtr = rho.primitiveField().begin();
@@ -308,31 +346,43 @@ GenMatrix_U(
308346
const label nFaces = fvm.lower().size();
309347
const label nCells = fvm.diag().size();
310348

349+
for (label celli = 0; celli < nCells; celli++)
350+
{
351+
diagPtr[celli] = 0.0;
352+
}
353+
311354
for (label facei = 0; facei < nFaces; facei++)
312355
{
313356
scalar flux = weightsPtr[facei] * rhoPhiPtr[facei];
314357
lowerPtr[facei] = -flux;
315358
upperPtr[facei] = -flux + rhoPhiPtr[facei];
359+
360+
diagPtr[l[facei]] += flux;
361+
diagPtr[u[facei]] += flux - rhoPhiPtr[facei];
316362
}
317363

318364
for (label celli = 0; celli < nCells; celli++)
319365
{
320-
diagPtr[celli] = 0.0; // vector::zero;
366+
diagPtr[celli] += rDeltaT * rhoPtr[celli] * meshVscPtr[celli];
367+
sourcePtr[celli] = rDeltaT * rhoOldTimePtr[celli] * UOldTimePtr[celli] * meshVscPtr[celli];
321368
}
322369

323-
//
324370
for (label facei = 0; facei < nFaces; facei++)
325371
{
326-
diagPtr[l[facei]] -= lowerPtr[facei];
327-
diagPtr[u[facei]] -= upperPtr[facei];
328-
}
372+
scalar coeffs = deltaCoeffsPtr[facei] * gammaMagSfPtr[facei];
329373

330-
for (label celli = 0; celli < nCells; celli++)
331-
{
332-
diagPtr[celli] += rDeltaT * rhoPtr[celli] * meshVscPtr[celli];
333-
sourcePtr[celli] = rDeltaT * rhoOldTimePtr[celli] * UOldTimePtr[celli] * meshVscPtr[celli];
374+
upperPtr[facei] -= coeffs;
375+
lowerPtr[facei] -= coeffs;
376+
377+
diagPtr[l[facei]] += coeffs;
378+
diagPtr[u[facei]] += coeffs;
334379
}
335380

381+
endU = MPI_Wtime();
382+
UEqn_build_item1_intern_time += endU - startU;
383+
384+
startU = MPI_Wtime();
385+
336386
// boundaryField
337387
forAll(U.boundaryField(), patchi)
338388
{
@@ -350,77 +400,11 @@ GenMatrix_U(
350400
fvm += fvc::surfaceIntegrate(rhoPhi*gcs.interpScheme().correction(U));
351401
}
352402

403+
endU = MPI_Wtime();
404+
UEqn_build_item1_bound_time += endU - startU;
353405
// --------------------------------------------------------------------------------------------------------------
406+
startU = MPI_Wtime();
354407

355-
Info << "UEqn gaussLaplacianSchemeFvmLaplacian" << endl;
356-
357-
const volScalarField alphaEff = turbulence.alpha()*rho*turbulence.nuEff();
358-
// tmp<fv::snGradScheme<vector>> tsnGradScheme_(new fv::orthogonalSnGrad<vector>(mesh)); // 正交修正方案
359-
tmp<fv::snGradScheme<vector>> tsnGradScheme_(new fv::correctedSnGrad<vector>(mesh)); // 对应snGradSchemes{default corrected;}
360-
361-
surfaceScalarField alphaEfff = fvc::interpolate(alphaEff); ///
362-
363-
// gammaMagSf = alphaEfff * magSf
364-
GeometricField<scalar, fvsPatchField, surfaceMesh> gammaMagSf
365-
(
366-
alphaEfff * mesh.magSf()
367-
);
368-
369-
const surfaceScalarField& deltaCoeffs = tsnGradScheme_().deltaCoeffs(U);
370-
//
371-
tmp<fvVectorMatrix> tfvm_Laplacian
372-
(
373-
new fvVectorMatrix
374-
(
375-
U,
376-
deltaCoeffs.dimensions()*gammaMagSf.dimensions()*U.dimensions()
377-
)
378-
);
379-
fvVectorMatrix& fvm_laplace = tfvm_Laplacian.ref();
380-
381-
// interField
382-
// fvm_laplace.upper() = deltaCoeffs.primitiveField()*gammaMagSf.primitiveField();
383-
// fvm_laplace.negSumDiag();
384-
385-
vector* __restrict__ sourcePtrs = fvm_laplace.source().begin();
386-
scalar* __restrict__ diagPtrs = fvm_laplace.diag().begin();
387-
scalar* __restrict__ lowerPtrs = fvm_laplace.lower().begin();
388-
scalar* __restrict__ upperPtrs = fvm_laplace.upper().begin();
389-
390-
const labelUList& ls = fvm_laplace.lduAddr().lowerAddr();
391-
const labelUList& us = fvm_laplace.lduAddr().upperAddr();
392-
393-
// 获取场数据指针
394-
const scalar* const __restrict__ gammaMagSfPtrs = gammaMagSf.primitiveField().begin();
395-
const scalar* const __restrict__ deltaCoeffsPtrs = deltaCoeffs.primitiveField().begin();
396-
const scalar* const __restrict__ meshVPtrs = mesh.V().begin();
397-
398-
const label nFacess = fvm_laplace.lower().size();
399-
const label nCellss = fvm_laplace.diag().size();
400-
401-
// 初始化矩阵
402-
for (label celli = 0; celli < nCellss; celli++)
403-
{
404-
diagPtrs[celli] = 0.0;
405-
sourcePtrs[celli] = vector::zero;
406-
}
407-
408-
// 设置内部场矩阵系数
409-
for (label facei = 0; facei < nFacess; facei++)
410-
{
411-
scalar coeffs = deltaCoeffsPtrs[facei] * gammaMagSfPtrs[facei];
412-
upperPtrs[facei] = +coeffs;
413-
lowerPtrs[facei] = +coeffs;
414-
}
415-
416-
// 对角线求和
417-
for (label facei = 0; facei < nFacess; facei++)
418-
{
419-
diagPtrs[ls[facei]] -= lowerPtrs[facei];
420-
diagPtrs[us[facei]] -= upperPtrs[facei];
421-
}
422-
423-
// ------------------------------------
424408
forAll(U.boundaryField(), patchi)
425409
{
426410
const fvPatchVectorField& pvf = U.boundaryField()[patchi];
@@ -429,47 +413,70 @@ GenMatrix_U(
429413

430414
if (pvf.coupled())
431415
{
432-
fvm_laplace.internalCoeffs()[patchi] =
416+
fvm.internalCoeffs()[patchi] -=
433417
pGamma * pvf.gradientInternalCoeffs(pDeltaCoeffs);
434-
fvm_laplace.boundaryCoeffs()[patchi] =
418+
fvm.boundaryCoeffs()[patchi] -=
435419
-pGamma * pvf.gradientBoundaryCoeffs(pDeltaCoeffs);
436420
}
437421
else
438422
{
439-
fvm_laplace.internalCoeffs()[patchi] = pGamma * pvf.gradientInternalCoeffs();
440-
fvm_laplace.boundaryCoeffs()[patchi] = -pGamma * pvf.gradientBoundaryCoeffs();
423+
fvm.internalCoeffs()[patchi] -= pGamma * pvf.gradientInternalCoeffs();
424+
fvm.boundaryCoeffs()[patchi] -= -pGamma * pvf.gradientBoundaryCoeffs();
441425
}
442426
}
443427

444-
// 非正交修正,否则不需要
445428
if (mesh.fluxRequired(U.name()))
446429
{
447-
fvm_laplace.faceFluxCorrectionPtr() = new
448-
GeometricField<vector, fvsPatchField, surfaceMesh>
430+
tmp<GeometricField<vector, fvsPatchField, surfaceMesh>> tCorrection
449431
(
450432
gammaMagSf * tsnGradScheme_().correction(U)
451433
);
452434

453-
fvm_laplace.source() -=
454-
mesh.V() *
455-
fvc::div
456-
(
457-
*fvm_laplace.faceFluxCorrectionPtr()
458-
)().primitiveField();
435+
tmp<GeometricField<vector, fvPatchField, volMesh>> tDivCorrection
436+
(
437+
fvc::div(tCorrection())
438+
);
439+
440+
const vector* const __restrict__ divCorrectionPtrs =
441+
tDivCorrection().primitiveField().begin();
442+
443+
for (label celli = 0; celli < nCells; celli++)
444+
{
445+
sourcePtr[celli] += meshVscPtr[celli] * divCorrectionPtrs[celli];
446+
}
447+
448+
fvm.faceFluxCorrectionPtr() = new
449+
GeometricField<vector, fvsPatchField, surfaceMesh>
450+
(
451+
-tCorrection
452+
);
459453
}
460454
else
461455
{
462-
fvm_laplace.source() -=
463-
mesh.V() *
464-
fvc::div
465-
(
466-
gammaMagSf * tsnGradScheme_().correction(U)
467-
)().primitiveField();
456+
tmp<GeometricField<vector, fvsPatchField, surfaceMesh>> tCorrection
457+
(
458+
gammaMagSf * tsnGradScheme_().correction(U)
459+
);
460+
461+
tmp<GeometricField<vector, fvPatchField, volMesh>> tDivCorrection
462+
(
463+
fvc::div(tCorrection())
464+
);
465+
466+
const vector* const __restrict__ divCorrectionPtrs =
467+
tDivCorrection().primitiveField().begin();
468+
469+
for (label celli = 0; celli < nCells; celli++)
470+
{
471+
sourcePtr[celli] += meshVscPtr[celli] * divCorrectionPtrs[celli];
472+
}
468473
}
469474

470-
fvm -= fvm_laplace;
475+
endU = MPI_Wtime();
476+
UEqn_build_item2_bound_time += endU - startU;
471477

472478
// --------------------------------------------------------------------------------------------------------------
479+
startU = MPI_Wtime();
473480

474481
Info << "UEqn Calculating grad(U) using extracted functions" << endl;
475482
tmp<surfaceInterpolationScheme<vector>> tinterpScheme =
@@ -485,9 +492,14 @@ GenMatrix_U(
485492
const volTensorField& gradU = tgGradU();
486493
// const volScalarField alphaEff = turbulence.alpha()*rho*turbulence.nuEff();
487494

495+
endU = MPI_Wtime();
496+
UEqn_build_item3_time += endU - startU;
488497

498+
startU = MPI_Wtime();
489499

490500
// -------------------------------------------------------
501+
502+
// -------------------------------------------------------
491503
// interFoam
492504
// const alphaField& alpha;
493505

@@ -500,6 +512,7 @@ GenMatrix_U(
500512
// + turbulence.divDevRhoReff(rho, U)
501513
// - fvc::div((turbulence.alpha()*rho*turbulence.nuEff())*dev2(T(fvc::grad(U))))
502514
- fvc::div((turbulence.alpha()*rho*turbulence.nuEff())*dev2(T(gradU)))
515+
// - fvc::div((turbulence.alpha()*rho*turbulence.nuEff())*dev2T_gradU)
503516

504517
// - fvm::laplacian(turbulence.alpha()*rho*turbulence.nuEff(), U)
505518
// - fvOptions(rho, U)
@@ -514,6 +527,20 @@ GenMatrix_U(
514527
// -fvc::grad(p)
515528
// );
516529

530+
endU = MPI_Wtime();
531+
UEqn_build_item3_last_time += endU - startU;
532+
533+
Info<< "========Time Spent in UEqn build once=================="<< endl;
534+
Info << "U pre Time : " << UEqn_build_pre_time << endl;
535+
Info << "U item1 intern Time : " << UEqn_build_item1_intern_time << endl;
536+
Info << "U item1 bound Time : " << UEqn_build_item1_bound_time << endl;
537+
// Info << "U item2 intern Time : " << UEqn_build_item2_intern_time << endl;
538+
Info << "U item2 bound Time : " << UEqn_build_item2_bound_time << endl;
539+
Info << "U item3 Time : " << UEqn_build_item3_time << endl;
540+
Info << "U item3 last Time : " << UEqn_build_item3_last_time << endl;
541+
Info<< "============================================"<<nl<< endl;
542+
543+
// return tfvm_DDT;
517544
return tfvm;
518545
}
519546

0 commit comments

Comments
 (0)