void Foam::quadraticFitSnGradData::findFaceDirs ( vector& idir, // value changed in return vector& jdir, // value changed in return vector& kdir, // value changed in return const fvMesh& mesh, const label faci ) { idir = mesh.Sf()[faci]; idir /= mag(idir); #ifndef SPHERICAL_GEOMETRY if (mesh.nGeometricD() <= 2) // find the normal direcion { if (mesh.geometricD()[0] == -1) { kdir = vector(1, 0, 0); } else if (mesh.geometricD()[1] == -1) { kdir = vector(0, 1, 0); } else { kdir = vector(0, 0, 1); } } else // 3D so find a direction in the plane of the face { const face& f = mesh.faces()[faci]; kdir = mesh.points()[f[0]] - mesh.points()[f[1]]; } #else // Spherical geometry so kdir is the radial direction kdir = mesh.Cf()[faci]; #endif if (mesh.nGeometricD() == 3) { // Remove the idir component from kdir and normalise kdir -= (idir & kdir)*idir; scalar magk = mag(kdir); if (magk < SMALL) { FatalErrorIn("findFaceDirs") << " calculated kdir = zero" << exit(FatalError); } else { kdir /= magk; } } jdir = kdir ^ idir; }
Foam::FitData<Form, ExtendedStencil, Polynomial>::FitData ( const fvMesh& mesh, const ExtendedStencil& stencil, const bool linearCorrection, const scalar linearLimitFactor, const scalar centralWeight ) : MeshObject<fvMesh, Form>(mesh), stencil_(stencil), linearCorrection_(linearCorrection), linearLimitFactor_(linearLimitFactor), centralWeight_(centralWeight), # ifdef SPHERICAL_GEOMETRY dim_(2), # else dim_(mesh.nGeometricD()), # endif minSize_(Polynomial::nTerms(dim_)) { // Check input if (linearLimitFactor <= SMALL || linearLimitFactor > 3) { FatalErrorIn("FitData<Polynomial>::FitData(..)") << "linearLimitFactor requested = " << linearLimitFactor << " should be between zero and 3" << exit(FatalError); } }
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; } }