@@ -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
0 commit comments