void Foam::CentredFitSnGradData<Polynomial>::calcFit() { const fvMesh& mesh = this->mesh(); // Get the cell/face centres in stencil order. // Centred face stencils no good for triangles or tets. // Need bigger stencils List<List<point>> stencilPoints(mesh.nFaces()); this->stencil().collectData(mesh.C(), stencilPoints); // find the fit coefficients for every face in the mesh const surfaceScalarField& w = mesh.surfaceInterpolation::weights(); const surfaceScalarField& dC = mesh.nonOrthDeltaCoeffs(); for (label facei = 0; facei < mesh.nInternalFaces(); facei++) { calcFit ( coeffs_[facei], stencilPoints[facei], w[facei], dC[facei], facei ); } const surfaceScalarField::Boundary& bw = w.boundaryField(); const surfaceScalarField::Boundary& bdC = dC.boundaryField(); forAll(bw, patchi) { const fvsPatchScalarField& pw = bw[patchi]; const fvsPatchScalarField& pdC = bdC[patchi]; if (pw.coupled()) { label facei = pw.patch().start(); forAll(pw, i) { calcFit ( coeffs_[facei], stencilPoints[facei], pw[i], pdC[i], facei ); facei++; } }
void Foam::UpwindFitData<Polynomial>::calcFit() { const fvMesh& mesh = this->mesh(); const surfaceScalarField& w = mesh.surfaceInterpolation::weights(); const surfaceScalarField::GeometricBoundaryField& bw = w.boundaryField(); // Owner stencil weights // ~~~~~~~~~~~~~~~~~~~~~ // Get the cell/face centres in stencil order. List<List<point> > stencilPoints(mesh.nFaces()); this->stencil().collectData ( this->stencil().ownMap(), this->stencil().ownStencil(), mesh.C(), stencilPoints ); // find the fit coefficients for every owner //Pout<< "-- Owner --" << endl; for (label facei = 0; facei < mesh.nInternalFaces(); facei++) { scalarList wts(stencilPoints[facei].size(), scalar(1)); FitData < UpwindFitData<Polynomial>, extendedUpwindCellToFaceStencil, Polynomial >::calcFit(owncoeffs_[facei], wts, stencilPoints[facei], w[facei], facei); //Pout<< " facei:" << facei // << " at:" << mesh.faceCentres()[facei] << endl; //forAll(owncoeffs_[facei], i) //{ // Pout<< " point:" << stencilPoints[facei][i] // << "\tweight:" << owncoeffs_[facei][i] // << endl; //} } forAll(bw, patchi) { const fvsPatchScalarField& pw = bw[patchi]; if (pw.coupled()) { label facei = pw.patch().start(); forAll(pw, i) { scalarList wts(stencilPoints[facei].size(), scalar(1)); FitData < UpwindFitData<Polynomial>, extendedUpwindCellToFaceStencil, Polynomial >::calcFit ( owncoeffs_[facei], wts, stencilPoints[facei], pw[i], facei ); facei++; } }
Foam::quadraticFitSnGradData::quadraticFitSnGradData ( const fvMesh& mesh, const scalar cWeight ) : MeshObject<fvMesh, quadraticFitSnGradData>(mesh), centralWeight_(cWeight), #ifdef SPHERICAL_GEOMETRY dim_(2), #else dim_(mesh.nGeometricD()), #endif minSize_ ( dim_ == 1 ? 3 : dim_ == 2 ? 6 : dim_ == 3 ? 9 : 0 ), stencil_(mesh), fit_(mesh.nInternalFaces()) { if (debug) { Info << "Contructing quadraticFitSnGradData" << endl; } // check input if (centralWeight_ < 1 - SMALL) { FatalErrorIn("quadraticFitSnGradData::quadraticFitSnGradData") << "centralWeight requested = " << centralWeight_ << " should not be less than one" << exit(FatalError); } if (minSize_ == 0) { FatalErrorIn("quadraticFitSnGradData") << " dimension must be 1,2 or 3, not" << dim_ << exit(FatalError); } // store the polynomial size for each face to write out surfaceScalarField snGradPolySize ( IOobject ( "quadraticFitSnGradPolySize", "constant", mesh, IOobject::NO_READ, IOobject::NO_WRITE ), mesh, dimensionedScalar("quadraticFitSnGradPolySize", dimless, scalar(0)) ); // Get the cell/face centres in stencil order. // Centred face stencils no good for triangles of tets. Need bigger stencils List<List<point> > stencilPoints(stencil_.stencil().size()); stencil_.collectData ( mesh.C(), stencilPoints ); // find the fit coefficients for every face in the mesh for(label faci = 0; faci < mesh.nInternalFaces(); faci++) { snGradPolySize[faci] = calcFit(stencilPoints[faci], faci); } if (debug) { snGradPolySize.write(); Info<< "quadraticFitSnGradData::quadraticFitSnGradData() :" << "Finished constructing polynomialFit data" << endl; } }