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
2327namespace 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