diff --git a/applications/utilities/mesh/manipulation/createPatch/createPatch.C b/applications/utilities/mesh/manipulation/createPatch/createPatch.C index a993ecf92ae31cf47dcd94125b5e2cee77ebfbb8..7bd992fdc1f2149bc14443e62487f3be459186d6 100644 --- a/applications/utilities/mesh/manipulation/createPatch/createPatch.C +++ b/applications/utilities/mesh/manipulation/createPatch/createPatch.C @@ -225,6 +225,8 @@ void dumpCyclicMatch(const fileName& prefix, const polyMesh& mesh) // Dump halves { OFstream str(prefix+cycPatch.name()+"_half0.obj"); + Pout<< "Dumping cycPatch.name() half0 faces to " << str.name() + << endl; meshTools::writeOBJ ( str, @@ -241,6 +243,8 @@ void dumpCyclicMatch(const fileName& prefix, const polyMesh& mesh) } { OFstream str(prefix+cycPatch.name()+"_half1.obj"); + Pout<< "Dumping cycPatch.name() half1 faces to " << str.name() + << endl; meshTools::writeOBJ ( str, @@ -262,6 +266,9 @@ void dumpCyclicMatch(const fileName& prefix, const polyMesh& mesh) OFstream str(prefix+cycPatch.name()+"_match.obj"); label vertI = 0; + Pout<< "Dumping cyclic match as lines between face centres to " + << str.name() << endl; + for (label faceI = 0; faceI < halfSize; faceI++) { const point& fc0 = mesh.faceCentres()[cycPatch.start()+faceI]; @@ -773,6 +780,8 @@ int main(int argc, char *argv[]) autoPtr<mapPolyMesh> map = meshMod.changeMesh(mesh, true); mesh.movePoints(map().preMotionPoints()); + dumpCyclicMatch("coupled_", mesh); + // Synchronise points. if (!pointSync) { @@ -890,6 +899,8 @@ int main(int argc, char *argv[]) filterPatches(mesh); + dumpCyclicMatch("final_", mesh); + // Set the precision of the points data to 10 IOstream::defaultPrecision(10); diff --git a/applications/utilities/mesh/manipulation/createPatch/createPatchDict b/applications/utilities/mesh/manipulation/createPatch/createPatchDict index 5f3597f21af7ebb740e5dac56e5076c26fee4953..9052daa0a8d56c2ab9c82be8d3ccc42511089532 100644 --- a/applications/utilities/mesh/manipulation/createPatch/createPatchDict +++ b/applications/utilities/mesh/manipulation/createPatch/createPatchDict @@ -1,77 +1,96 @@ -/*---------------------------------------------------------------------------*\ +/*--------------------------------*- C++ -*----------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | -| \\ / O peration | Version: 1.0 | -| \\ / A nd | Web: http://www.openfoam.org | +| \\ / O peration | Version: 1.5 | +| \\ / A nd | Web: http://www.OpenFOAM.org | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ - FoamFile { - version 2.0; - format ascii; - - root ""; - case ""; - instance "system"; - local ""; - - class dictionary; - object createPatcheDict; + version 2.0; + format ascii; + class dictionary; + object createPatchDict; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +// This application/dictionary controls: +// - optional: create new patches from boundary faces (either given as +// a set of patches or as a faceSet) +// - always: order faces on coupled patches such that they are opposite. This +// is done for all coupled faces, not just for any patches created. +// - optional: synchronise points on coupled patches. + +// 1. Create cyclic: +// - specify where the faces should come from +// - specify the type of cyclic. If a rotational specify the rotationAxis +// and centre to make matching easier +// - pointSync true to guarantee points to line up. + +// 2. Correct incorrect cyclic: +// This will usually fail upon loading: +// "face 0 area does not match neighbour 2 by 0.0100005%" +// " -- possible face ordering problem." +// - change patch type from 'cyclic' to 'patch' in the polyMesh/boundary file. +// - loosen match tolerance to get case to load +// - regenerate cyclic as above + + // Tolerance used in matching faces. Absolute tolerance is span of -// face times this factor. -matchTolerance 1E-6; +// face times this factor. To load incorrectly matches meshes set this +// to a higher value. +matchTolerance 1E-3; -// Do a synchronisation of coupled points. +// Do a synchronisation of coupled points after creation of any patches. pointSync true; - // Patches to create. -// If no patches does a coupled point and face synchronisation anyway. patches ( { // Name of new patch name sidePatches; - // Dictionary for new patch - dictionary - { + // Type of new patch + dictionary + { type cyclic; - // Optional: used when matching and synchronising points. + + // Optional: explicitly set transformation tensor. + // Used when matching and synchronising points. //transform translational; //separationVector (-2289 0 0); - } + transform rotational; + rotationAxis (1 0 0); + rotationCentre (0 0 0); + } - // How to construct: either 'patches' or 'set' + // How to construct: either from 'patches' or 'set' constructFrom patches; // If constructFrom = patches : names of patches - //patches (periodic-1 periodic-2); - patches (outlet-side1 outlet-side2); + patches (periodic-1 periodic-2); // If constructFrom = set : name of faceSet set f0; } - //{ - // name bottom; - // // Dictionary for new patch - // dictionary - // { - // type patch; - // } - // - // constructFrom set; - // - // patches (half0 half1); - // - // set bottomFaces; - //} + { + name bottom; + + // Type of new patch + dictionary + { + type wall; + } + + constructFrom set; + + patches (); + + set bottomFaces; + } ); diff --git a/src/OpenFOAM/meshes/MeshObject/MeshObject.H b/src/OpenFOAM/meshes/MeshObject/MeshObject.H index 3bf11b5f6a3f588596ce5d6a65295135db4ee250..eac6096c793cabeaca7c8a4826ffd736e9a6122c 100644 --- a/src/OpenFOAM/meshes/MeshObject/MeshObject.H +++ b/src/OpenFOAM/meshes/MeshObject/MeshObject.H @@ -104,12 +104,12 @@ public: ); - // Destructor - - static bool Delete(const Mesh& mesh); + // Destructors virtual ~MeshObject(); + static bool Delete(const Mesh& mesh); + // Member Functions diff --git a/src/OpenFOAM/meshes/polyMesh/polyPatches/basic/coupled/coupledPolyPatch.C b/src/OpenFOAM/meshes/polyMesh/polyPatches/basic/coupled/coupledPolyPatch.C index 73aff8a1fd2c711402e5ddd3a201583166df211b..5fbaa3fa95f10fa529c2b933ba840f2579aed1b4 100644 --- a/src/OpenFOAM/meshes/polyMesh/polyPatches/basic/coupled/coupledPolyPatch.C +++ b/src/OpenFOAM/meshes/polyMesh/polyPatches/basic/coupled/coupledPolyPatch.C @@ -320,9 +320,9 @@ void Foam::coupledPolyPatch::calcTransformTensors if (debug) { - Pout<< " rotation " << sum(mag(forwardT_ - forwardT_[0])) - << " more than local tolerance " << error - << ". Assuming uniform rotation." << endl; + Pout<< " difference in rotation less than" + << " local tolerance " + << error << ". Assuming uniform rotation." << endl; } } } diff --git a/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.C b/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.C index 171fb099f1a08ce774a19e2421c94ee83249cdb4..c2458833dac92a1c02c2039354303d95458216f8 100644 --- a/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.C +++ b/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.C @@ -34,6 +34,7 @@ License #include "matchPoints.H" #include "EdgeMap.H" #include "Time.H" +#include "transformList.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // @@ -89,6 +90,9 @@ void Foam::cyclicPolyPatch::calcTransforms() { const pointField& points = this->points(); + // Determine geometric quantities on the two halves + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + primitivePatch half0 ( SubList<face> @@ -199,15 +203,69 @@ void Foam::cyclicPolyPatch::calcTransforms() } - // Calculate transformation tensors - calcTransformTensors - ( - half0Ctrs, - half1Ctrs, - half0Normals, - half1Normals, - half0Tols - ); + // See if transformation is prescribed + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + switch (transform_) + { + case ROTATIONAL: + { + // Specified single rotation tensor. + + // Get best fitting face and its opposite number + label face0 = getConsistentRotationFace(half0Ctrs); + label face1 = face0; + + vector n0 = + ( + (half0Ctrs[face0] - rotationCentre_) + ^ rotationAxis_ + ); + vector n1 = + ( + (half1Ctrs[face1] - rotationCentre_) + ^ -rotationAxis_ + ); + n0 /= mag(n0) + VSMALL; + n1 /= mag(n1) + VSMALL; + + if (debug) + { + Pout<< "cyclicPolyPatch::calcTransforms :" + << " Specified rotation :" + << " n0:" << n0 << " n1:" << n1 << endl; + } + + // Calculate transformation tensors from face0,1 only. + // Note: can use tight tolerance now. + calcTransformTensors + ( + pointField(1, half0Ctrs[face0]), + pointField(1, half1Ctrs[face1]), + vectorField(1, n0), + vectorField(1, n1), + scalarField(1, half0Tols[face0]), + 1E-4 + ); + + break; + } + + default: + { + // Calculate transformation tensors from all faces. + calcTransformTensors + ( + half0Ctrs, + half1Ctrs, + half0Normals, + half1Normals, + half0Tols + ); + + break; + } + } } } @@ -402,6 +460,7 @@ void Foam::cyclicPolyPatch::getCentresAndAnchors const faceList& half0Faces, const faceList& half1Faces, + pointField& ppPoints, pointField& half0Ctrs, pointField& half1Ctrs, pointField& anchors0, @@ -442,6 +501,8 @@ void Foam::cyclicPolyPatch::getCentresAndAnchors anchors0[faceI] = Foam::transform(reverseT, anchors0[faceI]); } + ppPoints = Foam::transform(reverseT, pp.points()); + break; } //- Problem: usually specified translation is not accurate enough @@ -501,6 +562,7 @@ void Foam::cyclicPolyPatch::getCentresAndAnchors anchors0[faceI] ); } + ppPoints = Foam::transform(reverseT, pp.points()); } else { @@ -524,6 +586,7 @@ void Foam::cyclicPolyPatch::getCentresAndAnchors half0Ctrs += ctr1 - ctr0; anchors0 += ctr1 - ctr0; + ppPoints = pp.points() + ctr1 - ctr0; } break; } @@ -1079,7 +1142,7 @@ bool Foam::cyclicPolyPatch::order faceList half1Faces(IndirectList<face>(pp, half1ToPatch)); // Get geometric quantities - pointField half0Ctrs, half1Ctrs, anchors0; + pointField half0Ctrs, half1Ctrs, anchors0, ppPoints; scalarField tols; getCentresAndAnchors ( @@ -1087,6 +1150,7 @@ bool Foam::cyclicPolyPatch::order half0Faces, half1Faces, + ppPoints, half0Ctrs, half1Ctrs, anchors0, @@ -1108,6 +1172,44 @@ bool Foam::cyclicPolyPatch::order { Pout<< "cyclicPolyPatch::order : test if already ordered:" << matchedAll << endl; + + // Dump halves + fileName nm0("match1_"+name()+"_half0_faces.obj"); + Pout<< "cyclicPolyPatch::order : Writing half0" + << " faces to OBJ file " << nm0 << endl; + writeOBJ(nm0, half0Faces, ppPoints); + + fileName nm1("match1_"+name()+"_half1_faces.obj"); + Pout<< "cyclicPolyPatch::order : Writing half1" + << " faces to OBJ file " << nm1 << endl; + writeOBJ(nm1, half1Faces, pp.points()); + + OFstream ccStr + ( + boundaryMesh().mesh().time().path() + /"match1_"+ name() + "_faceCentres.obj" + ); + Pout<< "cyclicPolyPatch::order : " + << "Dumping currently found cyclic match as lines between" + << " corresponding face centres to file " << ccStr.name() + << endl; + + // Recalculate untransformed face centres + //pointField rawHalf0Ctrs = calcFaceCentres(half0Faces, pp.points()); + label vertI = 0; + + forAll(half1Ctrs, i) + { + //if (from1To0[i] != -1) + { + // Write edge between c1 and c0 + //const point& c0 = rawHalf0Ctrs[from1To0[i]]; + //const point& c0 = half0Ctrs[from1To0[i]]; + const point& c0 = half0Ctrs[i]; + const point& c1 = half1Ctrs[i]; + writeOBJ(ccStr, c0, c1, vertI); + } + } } @@ -1133,6 +1235,7 @@ bool Foam::cyclicPolyPatch::order half0Faces, half1Faces, + ppPoints, half0Ctrs, half1Ctrs, anchors0, @@ -1153,6 +1256,42 @@ bool Foam::cyclicPolyPatch::order { Pout<< "cyclicPolyPatch::order : test if pairwise ordered:" << matchedAll << endl; + // Dump halves + fileName nm0("match2_"+name()+"_half0_faces.obj"); + Pout<< "cyclicPolyPatch::order : Writing half0" + << " faces to OBJ file " << nm0 << endl; + writeOBJ(nm0, half0Faces, ppPoints); + + fileName nm1("match2_"+name()+"_half1_faces.obj"); + Pout<< "cyclicPolyPatch::order : Writing half1" + << " faces to OBJ file " << nm1 << endl; + writeOBJ(nm1, half1Faces, pp.points()); + + OFstream ccStr + ( + boundaryMesh().mesh().time().path() + /"match2_"+name()+"_faceCentres.obj" + ); + Pout<< "cyclicPolyPatch::order : " + << "Dumping currently found cyclic match as lines between" + << " corresponding face centres to file " << ccStr.name() + << endl; + + // Recalculate untransformed face centres + //pointField rawHalf0Ctrs = calcFaceCentres(half0Faces, pp.points()); + label vertI = 0; + + forAll(half1Ctrs, i) + { + if (from1To0[i] != -1) + { + // Write edge between c1 and c0 + //const point& c0 = rawHalf0Ctrs[from1To0[i]]; + const point& c0 = half0Ctrs[from1To0[i]]; + const point& c1 = half1Ctrs[i]; + writeOBJ(ccStr, c0, c1, vertI); + } + } } } @@ -1209,6 +1348,7 @@ bool Foam::cyclicPolyPatch::order half0Faces, half1Faces, + ppPoints, half0Ctrs, half1Ctrs, anchors0, @@ -1229,8 +1369,43 @@ bool Foam::cyclicPolyPatch::order { Pout<< "cyclicPolyPatch::order : test if baffles:" << matchedAll << endl; - } + // Dump halves + fileName nm0("match3_"+name()+"_half0_faces.obj"); + Pout<< "cyclicPolyPatch::order : Writing half0" + << " faces to OBJ file " << nm0 << endl; + writeOBJ(nm0, half0Faces, ppPoints); + + fileName nm1("match3_"+name()+"_half1_faces.obj"); + Pout<< "cyclicPolyPatch::order : Writing half1" + << " faces to OBJ file " << nm1 << endl; + writeOBJ(nm1, half1Faces, pp.points()); + + OFstream ccStr + ( + boundaryMesh().mesh().time().path() + /"match3_"+ name() + "_faceCentres.obj" + ); + Pout<< "cyclicPolyPatch::order : " + << "Dumping currently found cyclic match as lines between" + << " corresponding face centres to file " << ccStr.name() + << endl; + + // Recalculate untransformed face centres + //pointField rawHalf0Ctrs = calcFaceCentres(half0Faces, pp.points()); + label vertI = 0; + forAll(half1Ctrs, i) + { + if (from1To0[i] != -1) + { + // Write edge between c1 and c0 + //const point& c0 = rawHalf0Ctrs[from1To0[i]]; + const point& c0 = half0Ctrs[from1To0[i]]; + const point& c1 = half1Ctrs[i]; + writeOBJ(ccStr, c0, c1, vertI); + } + } + } } } @@ -1259,6 +1434,7 @@ bool Foam::cyclicPolyPatch::order half0Faces, half1Faces, + ppPoints, half0Ctrs, half1Ctrs, anchors0, @@ -1279,6 +1455,42 @@ bool Foam::cyclicPolyPatch::order { Pout<< "cyclicPolyPatch::order : automatic ordering result:" << matchedAll << endl; + // Dump halves + fileName nm0("match4_"+name()+"_half0_faces.obj"); + Pout<< "cyclicPolyPatch::order : Writing half0" + << " faces to OBJ file " << nm0 << endl; + writeOBJ(nm0, half0Faces, ppPoints); + + fileName nm1("match4_"+name()+"_half1_faces.obj"); + Pout<< "cyclicPolyPatch::order : Writing half1" + << " faces to OBJ file " << nm1 << endl; + writeOBJ(nm1, half1Faces, pp.points()); + + OFstream ccStr + ( + boundaryMesh().mesh().time().path() + /"match4_"+ name() + "_faceCentres.obj" + ); + Pout<< "cyclicPolyPatch::order : " + << "Dumping currently found cyclic match as lines between" + << " corresponding face centres to file " << ccStr.name() + << endl; + + // Recalculate untransformed face centres + //pointField rawHalf0Ctrs = calcFaceCentres(half0Faces, pp.points()); + label vertI = 0; + + forAll(half1Ctrs, i) + { + if (from1To0[i] != -1) + { + // Write edge between c1 and c0 + //const point& c0 = rawHalf0Ctrs[from1To0[i]]; + const point& c0 = half0Ctrs[from1To0[i]]; + const point& c1 = half1Ctrs[i]; + writeOBJ(ccStr, c0, c1, vertI); + } + } } } diff --git a/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.H b/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.H index 7db828985fb8e37dcb78820e0d1dec0989484893..af363e8a36cfe84ff636000370b60c84620c9abf 100644 --- a/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.H +++ b/src/OpenFOAM/meshes/polyMesh/polyPatches/constraint/cyclic/cyclicPolyPatch.H @@ -141,6 +141,7 @@ private: const faceList& half0Faces, const faceList& half1Faces, + pointField& ppPoints, pointField& half0Ctrs, pointField& half1Ctrs, pointField& anchors0, diff --git a/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C b/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C index 71707195f37e79af5bd4eeb3d9edc539ed4ca70c..d981c4eda52c9a24ff5864edf79b383aed0d3a1d 100644 --- a/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C +++ b/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C @@ -152,6 +152,11 @@ Foam::label Foam::autoLayerDriver::mergePatchFacesUndo { mesh.movePoints(map().preMotionPoints()); } + else + { + // Delete mesh volumes. + mesh.clearOut(); + } faceCombiner.updateMesh(map); @@ -301,6 +306,11 @@ Foam::label Foam::autoLayerDriver::mergePatchFacesUndo { mesh.movePoints(map().preMotionPoints()); } + else + { + // Delete mesh volumes. + mesh.clearOut(); + } faceCombiner.updateMesh(map); @@ -363,6 +373,11 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::autoLayerDriver::doRemovePoints { mesh.movePoints(map().preMotionPoints()); } + else + { + // Delete mesh volumes. + mesh.clearOut(); + } pointRemover.updateMesh(map); meshRefiner_.updateMesh(map, labelList(0)); @@ -411,6 +426,11 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::autoLayerDriver::doRestorePoints { mesh.movePoints(map().preMotionPoints()); } + else + { + // Delete mesh volumes. + mesh.clearOut(); + } pointRemover.updateMesh(map); meshRefiner_.updateMesh(map, labelList(0)); @@ -2782,6 +2802,10 @@ void Foam::autoLayerDriver::addLayers const_cast<Time&>(mesh.time())++; Info<< "Writing shrunk mesh to " << mesh.time().timeName() << endl; + + // See comment in autoSnapDriver why we should not remove meshPhi + // using mesh.clearPout(). + mesh.write(); } @@ -2970,6 +2994,11 @@ void Foam::autoLayerDriver::addLayers { mesh.movePoints(map().preMotionPoints()); } + else + { + // Delete mesh volumes. + mesh.clearOut(); + } meshRefiner_.updateMesh(map, labelList(0)); diff --git a/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.C b/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.C index 3a6c79987c2ae84937b402759e40458616255be0..fdf89f4123b23c22d5e092eedb01e906ace6c6aa 100644 --- a/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.C +++ b/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.C @@ -930,6 +930,7 @@ void Foam::autoSnapDriver::preSmoothPatch const_cast<Time&>(mesh.time())++; Pout<< "Writing patch smoothed mesh to time " << mesh.time().timeName() << endl; + mesh.write(); } @@ -1220,6 +1221,11 @@ void Foam::autoSnapDriver::smoothDisplacement const_cast<Time&>(mesh.time())++; Pout<< "Writing smoothed mesh to time " << mesh.time().timeName() << endl; + + // Moving mesh creates meshPhi. Can be cleared out by a mesh.clearOut + // but this will also delete all pointMesh but not pointFields which + // gives an illegal situation. + mesh.write(); Pout<< "Writing displacement field ..." << endl; diff --git a/src/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C b/src/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C index 15b78e96536f4396fda7f05e8c6adfd133a5ac8f..7b2ecfc395226c9d680f63fdf5301ab98afaa148 100644 --- a/src/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C +++ b/src/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C @@ -458,6 +458,11 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::createBaffles { mesh_.movePoints(map().preMotionPoints()); } + else + { + // Delete mesh volumes. + mesh_.clearOut(); + } //- Redo the intersections on the newly create baffle faces. Note that // this changes also the cell centre positions. @@ -1448,6 +1453,11 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::mergeBaffles { mesh_.movePoints(map().preMotionPoints()); } + else + { + // Delete mesh volumes. + mesh_.clearOut(); + } // Update intersections. Recalculate intersections on merged faces since // this seems to give problems? Note: should not be nessecary since @@ -2405,6 +2415,11 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::dupNonManifoldPoints() { mesh_.movePoints(map().preMotionPoints()); } + else + { + // Delete mesh volumes. + mesh_.clearOut(); + } // Update intersections. Is mapping only (no faces created, positions stay // same) so no need to recalculate intersections. @@ -2828,6 +2843,11 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::zonify { mesh_.movePoints(map().preMotionPoints()); } + else + { + // Delete mesh volumes. + mesh_.clearOut(); + } return map; } diff --git a/src/autoMesh/autoHexMesh/meshRefinement/meshRefinementRefine.C b/src/autoMesh/autoHexMesh/meshRefinement/meshRefinementRefine.C index b457f0f5c7f5f919e9cbf0807b07fa46155a6af5..72e752f40b9e9ddeb9d9b56b4ba43e6535caced8 100644 --- a/src/autoMesh/autoHexMesh/meshRefinement/meshRefinementRefine.C +++ b/src/autoMesh/autoHexMesh/meshRefinement/meshRefinementRefine.C @@ -835,7 +835,7 @@ Foam::label Foam::meshRefinement::markSurfaceCurvatureRefinement // minLevel) and cache per cell the max surface level and the local normal // on that surface. labelList cellMaxLevel(mesh_.nCells(), -1); - vectorField cellMaxNormal(mesh_.nCells()); + vectorField cellMaxNormal(mesh_.nCells(), vector::zero); { // Per segment the normals of the surfaces @@ -1226,6 +1226,11 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::refine { mesh_.movePoints(map().preMotionPoints()); } + else + { + // Delete mesh volumes. + mesh_.clearOut(); + } // Update intersection info updateMesh(map, getChangedFaces(map, cellsToRefine)); diff --git a/src/dynamicMesh/motionSmoother/motionSmoother.C b/src/dynamicMesh/motionSmoother/motionSmoother.C index e82103bdb935f31242bf5e0a191131ea8d1de836..efdd09d359a59f6de923ba4154e7ac1d1eb2bf9e 100644 --- a/src/dynamicMesh/motionSmoother/motionSmoother.C +++ b/src/dynamicMesh/motionSmoother/motionSmoother.C @@ -780,9 +780,6 @@ Foam::tmp<Foam::scalarField> Foam::motionSmoother::movePoints tmp<scalarField> tsweptVol = mesh_.movePoints(newPoints); - //!!! Workaround for movePoints bug - const_cast<polyBoundaryMesh&>(mesh_.boundaryMesh()).movePoints(newPoints); - pp_.movePoints(mesh_.points()); return tsweptVol; diff --git a/src/finiteVolume/Make/files b/src/finiteVolume/Make/files index 7bf27115a57beb33d3ce99c1b17b5204e9b60038..2f301c040687b8da341e9e392dcbaa202a1c2c5f 100644 --- a/src/finiteVolume/Make/files +++ b/src/finiteVolume/Make/files @@ -186,10 +186,8 @@ $(schemes)/harmonic/harmonic.C $(schemes)/localBlended/localBlended.C $(schemes)/localMax/localMax.C $(schemes)/localMin/localMin.C -//$(schemes)/linearFit/linearFit.C -//$(schemes)/linearFit/linearFitData.C -$(schemes)/quadraticFit/quadraticFit.C -$(schemes)/quadraticFit/quadraticFitData.C +$(schemes)/linearFit/linearFit.C +$(schemes)/quadraticLinearFit/quadraticLinearFit.C limitedSchemes = $(surfaceInterpolation)/limitedSchemes $(limitedSchemes)/limitedSurfaceInterpolationScheme/limitedSurfaceInterpolationSchemes.C diff --git a/src/finiteVolume/fvMesh/extendedStencil/extendedStencil.H b/src/finiteVolume/fvMesh/extendedStencil/extendedStencil.H index 12d3179e62fc1f2a7ffdca439e0164887a952816..25ba241f1ec200ccf228de732c4b1642c88ade18 100644 --- a/src/finiteVolume/fvMesh/extendedStencil/extendedStencil.H +++ b/src/finiteVolume/fvMesh/extendedStencil/extendedStencil.H @@ -131,7 +131,6 @@ public: const GeometricField<Type, fvPatchField, volMesh>& fld, const List<List<scalar> >& stencilWeights ); - }; diff --git a/src/finiteVolume/fvMesh/extendedStencil/extendedStencilMeshObjects/centredCFCStencilObject.H b/src/finiteVolume/fvMesh/extendedStencil/extendedStencilMeshObjects/centredCFCStencilObject.H index 704f9a92d459394366abf605d3f301276495c0b0..e36be07993bc097c65eb82bb6e0785ea2d59f73e 100644 --- a/src/finiteVolume/fvMesh/extendedStencil/extendedStencilMeshObjects/centredCFCStencilObject.H +++ b/src/finiteVolume/fvMesh/extendedStencil/extendedStencilMeshObjects/centredCFCStencilObject.H @@ -70,10 +70,9 @@ public: {} - // Destructor - - virtual ~centredCFCStencilObject() - {} + //- Destructor + virtual ~centredCFCStencilObject() + {} }; diff --git a/src/finiteVolume/fvMesh/extendedStencil/extendedStencilTemplates.C b/src/finiteVolume/fvMesh/extendedStencil/extendedStencilTemplates.C index 480cf15a2a9412224c5e465dafde0fb9fc766b31..ec024775d357d0417d9c0af09e4097593b245bdd 100644 --- a/src/finiteVolume/fvMesh/extendedStencil/extendedStencilTemplates.C +++ b/src/finiteVolume/fvMesh/extendedStencil/extendedStencilTemplates.C @@ -135,19 +135,22 @@ Foam::extendedStencil::weightedSum { fvsPatchField<Type>& pSfCorr = bSfCorr[patchi]; - label faceI = pSfCorr.patch().patch().start(); - - forAll(pSfCorr, i) + if (pSfCorr.coupled()) { - const List<Type>& stField = stencilFld[faceI]; - const List<scalar>& stWeight = stencilWeights[faceI]; + label faceI = pSfCorr.patch().patch().start(); - forAll(stField, j) + forAll(pSfCorr, i) { - pSfCorr[i] += stField[j]*stWeight[j]; - } + const List<Type>& stField = stencilFld[faceI]; + const List<scalar>& stWeight = stencilWeights[faceI]; - faceI++; + forAll(stField, j) + { + pSfCorr[i] += stField[j]*stWeight[j]; + } + + faceI++; + } } } diff --git a/src/finiteVolume/fvMesh/extendedStencil/extendedUpwindStencilTemplates.C b/src/finiteVolume/fvMesh/extendedStencil/extendedUpwindStencilTemplates.C index 1cfa79eaa55ff6154579a2db7cbc7f200d6ae20d..00cd58e17d793060bc99dd7149c0e1f84c2ceffe 100644 --- a/src/finiteVolume/fvMesh/extendedStencil/extendedUpwindStencilTemplates.C +++ b/src/finiteVolume/fvMesh/extendedStencil/extendedUpwindStencilTemplates.C @@ -102,32 +102,35 @@ Foam::extendedUpwindStencil::weightedSum { fvsPatchField<Type>& pSfCorr = bSfCorr[patchi]; - label faceI = pSfCorr.patch().patch().start(); - - forAll(pSfCorr, i) + if (pSfCorr.coupled()) { - if (phi[faceI] > 0) - { - // Flux out of owner. Use upwind (= owner side) stencil. - const List<Type>& stField = ownFld[faceI]; - const List<scalar>& stWeight = ownWeights[faceI]; + label faceI = pSfCorr.patch().patch().start(); - forAll(stField, j) + forAll(pSfCorr, i) + { + if (phi[faceI] > 0) { - pSfCorr[i] += stField[j]*stWeight[j]; + // Flux out of owner. Use upwind (= owner side) stencil. + const List<Type>& stField = ownFld[faceI]; + const List<scalar>& stWeight = ownWeights[faceI]; + + forAll(stField, j) + { + pSfCorr[i] += stField[j]*stWeight[j]; + } } - } - else - { - const List<Type>& stField = neiFld[faceI]; - const List<scalar>& stWeight = neiWeights[faceI]; - - forAll(stField, j) + else { - pSfCorr[i] += stField[j]*stWeight[j]; + const List<Type>& stField = neiFld[faceI]; + const List<scalar>& stWeight = neiWeights[faceI]; + + forAll(stField, j) + { + pSfCorr[i] += stField[j]*stWeight[j]; + } } + faceI++; } - faceI++; } } diff --git a/src/finiteVolume/fvMesh/extendedStencil/faceStencil/cellFaceCellStencil.H b/src/finiteVolume/fvMesh/extendedStencil/faceStencil/cellFaceCellStencil.H index 93e9d9117aba8dd73803079c0683c05751290d1f..67179e46079ca9af3c9edea03f6b80b8391777a0 100644 --- a/src/finiteVolume/fvMesh/extendedStencil/faceStencil/cellFaceCellStencil.H +++ b/src/finiteVolume/fvMesh/extendedStencil/faceStencil/cellFaceCellStencil.H @@ -68,7 +68,6 @@ public: //- Construct from mesh explicit cellFaceCellStencil(const polyMesh& mesh); - }; diff --git a/src/finiteVolume/fvMesh/fvMesh.C b/src/finiteVolume/fvMesh/fvMesh.C index 3c2e6756ac4c65f454aee953bdf4604391f8a5f9..ff714d00eb6ad2eae99b4fba1f98ca659e07d33d 100644 --- a/src/finiteVolume/fvMesh/fvMesh.C +++ b/src/finiteVolume/fvMesh/fvMesh.C @@ -42,9 +42,9 @@ License #include "extendedLeastSquaresVectors.H" #include "extendedLeastSquaresVectors.H" #include "leastSquaresVectors.H" -//#include "linearFitData.H" -#include "quadraticFitData.H" -//#include "quadraticFitSnGradData.H" +#include "CentredFitData.H" +#include "linearFitPolynomial.H" +#include "quadraticLinearFitPolynomial.H" #include "skewCorrectionVectors.H" #include "centredCECStencilObject.H" @@ -89,15 +89,13 @@ void Foam::fvMesh::clearGeom() // Mesh motion flux cannot be deleted here because the old-time flux // needs to be saved. - // Things geometry dependent that are not updated. volPointInterpolation::Delete(*this); extendedLeastSquaresVectors::Delete(*this); extendedLeastSquaresVectors::Delete(*this); leastSquaresVectors::Delete(*this); - //linearFitData::Delete(*this); - quadraticFitData::Delete(*this); - //quadraticFitSnGradData::Delete(*this); + CentredFitData<linearFitPolynomial>::Delete(*this); + CentredFitData<quadraticLinearFitPolynomial>::Delete(*this); skewCorrectionVectors::Delete(*this); } @@ -112,9 +110,8 @@ void Foam::fvMesh::clearAddressing() extendedLeastSquaresVectors::Delete(*this); extendedLeastSquaresVectors::Delete(*this); leastSquaresVectors::Delete(*this); - //linearFitData::Delete(*this); - quadraticFitData::Delete(*this); - //quadraticFitSnGradData::Delete(*this); + CentredFitData<linearFitPolynomial>::Delete(*this); + CentredFitData<quadraticLinearFitPolynomial>::Delete(*this); skewCorrectionVectors::Delete(*this); centredCECStencilObject::Delete(*this); @@ -299,7 +296,6 @@ Foam::fvMesh::~fvMesh() // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // -// Helper function for construction from pieces void Foam::fvMesh::addFvPatches ( const List<polyPatch*> & p, @@ -487,6 +483,30 @@ void Foam::fvMesh::mapFields(const mapPolyMesh& meshMap) } +// Temporary helper function to call move points on +// MeshObjects +template<class Type> +void MeshObjectMovePoints(const Foam::fvMesh& mesh) +{ + if + ( + mesh.db().objectRegistry::foundObject<Type> + ( + Type::typeName + ) + ) + { + const_cast<Type&> + ( + mesh.db().objectRegistry::lookupObject<Type> + ( + Type::typeName + ) + ).movePoints(); + } +} + + Foam::tmp<Foam::scalarField> Foam::fvMesh::movePoints(const pointField& p) { // Grab old time volumes if the time has been incremented @@ -577,133 +597,12 @@ Foam::tmp<Foam::scalarField> Foam::fvMesh::movePoints(const pointField& p) // Hack until proper callbacks. Below are all the fvMesh MeshObjects with a // movePoints function. - - // volPointInterpolation - if - ( - db().objectRegistry::foundObject<volPointInterpolation> - ( - volPointInterpolation::typeName - ) - ) - { - const_cast<volPointInterpolation&> - ( - db().objectRegistry::lookupObject<volPointInterpolation> - ( - volPointInterpolation::typeName - ) - ).movePoints(); - } - - // extendedLeastSquaresVectors - if - ( - db().objectRegistry::foundObject<extendedLeastSquaresVectors> - ( - extendedLeastSquaresVectors::typeName - ) - ) - { - const_cast<extendedLeastSquaresVectors&> - ( - db().objectRegistry::lookupObject<extendedLeastSquaresVectors> - ( - extendedLeastSquaresVectors::typeName - ) - ).movePoints(); - } - - // leastSquaresVectors - if - ( - db().objectRegistry::foundObject<leastSquaresVectors> - ( - leastSquaresVectors::typeName - ) - ) - { - const_cast<leastSquaresVectors&> - ( - db().objectRegistry::lookupObject<leastSquaresVectors> - ( - leastSquaresVectors::typeName - ) - ).movePoints(); - } - - //// linearFitData - //if - //( - // db().objectRegistry::foundObject<linearFitData> - // ( - // linearFitData::typeName - // ) - //) - //{ - // const_cast<linearFitData&> - // ( - // db().objectRegistry::lookupObject<linearFitData> - // ( - // linearFitData::typeName - // ) - // ).movePoints(); - //} - - // quadraticFitData - if - ( - db().objectRegistry::foundObject<quadraticFitData> - ( - quadraticFitData::typeName - ) - ) - { - const_cast<quadraticFitData&> - ( - db().objectRegistry::lookupObject<quadraticFitData> - ( - quadraticFitData::typeName - ) - ).movePoints(); - } - - //// quadraticFitSnGradData - //if - //( - // db().objectRegistry::foundObject<quadraticFitSnGradData> - // ( - // quadraticFitSnGradData::typeName - // ) - //) - //{ - // const_cast<quadraticFitSnGradData&> - // ( - // db().objectRegistry::lookupObject<quadraticFitSnGradData> - // ( - // quadraticFitSnGradData::typeName - // ) - // ).movePoints(); - //} - - // skewCorrectionVectors - if - ( - db().objectRegistry::foundObject<skewCorrectionVectors> - ( - skewCorrectionVectors::typeName - ) - ) - { - const_cast<skewCorrectionVectors&> - ( - db().objectRegistry::lookupObject<skewCorrectionVectors> - ( - skewCorrectionVectors::typeName - ) - ).movePoints(); - } - + MeshObjectMovePoints<volPointInterpolation>(*this); + MeshObjectMovePoints<extendedLeastSquaresVectors>(*this); + MeshObjectMovePoints<leastSquaresVectors>(*this); + MeshObjectMovePoints<CentredFitData<linearFitPolynomial> >(*this); + MeshObjectMovePoints<CentredFitData<quadraticLinearFitPolynomial> >(*this); + MeshObjectMovePoints<skewCorrectionVectors>(*this); return tsweptVols; } diff --git a/src/finiteVolume/interpolation/surfaceInterpolation/schemes/quadraticFit/quadraticFitData.C b/src/finiteVolume/interpolation/surfaceInterpolation/schemes/CentredFitScheme/CentredFitData.C similarity index 55% rename from src/finiteVolume/interpolation/surfaceInterpolation/schemes/quadraticFit/quadraticFitData.C rename to src/finiteVolume/interpolation/surfaceInterpolation/schemes/CentredFitScheme/CentredFitData.C index 868d33b6f3f132b872d08d4c11a8464810f70a21..dea1b41143792cd55dc44e47ae0455d04eed511c 100644 --- a/src/finiteVolume/interpolation/surfaceInterpolation/schemes/quadraticFit/quadraticFitData.C +++ b/src/finiteVolume/interpolation/surfaceInterpolation/schemes/CentredFitScheme/CentredFitData.C @@ -24,125 +24,78 @@ License \*---------------------------------------------------------------------------*/ -#include "quadraticFitData.H" +#include "CentredFitData.H" #include "surfaceFields.H" #include "volFields.H" #include "SVD.H" #include "syncTools.H" #include "extendedCentredStencil.H" -// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // - -namespace Foam -{ - defineTypeNameAndDebug(quadraticFitData, 0); -} - - // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // -Foam::quadraticFitData::quadraticFitData +template<class Polynomial> +Foam::CentredFitData<Polynomial>::CentredFitData ( const fvMesh& mesh, const extendedCentredStencil& stencil, const scalar linearLimitFactor, - const scalar cWeight + const scalar centralWeight ) : - MeshObject<fvMesh, quadraticFitData>(mesh), + MeshObject<fvMesh, CentredFitData<Polynomial> >(mesh), + stencil_(stencil), linearLimitFactor_(linearLimitFactor), - centralWeight_(cWeight), + centralWeight_(centralWeight), # ifdef SPHERICAL_GEOMETRY dim_(2), # else dim_(mesh.nGeometricD()), # endif - minSize_ - ( - dim_ == 1 ? 3 : - dim_ == 2 ? 6 : - dim_ == 3 ? 7 : 0 - ), - fit_(mesh.nInternalFaces()) + minSize_(Polynomial::nTerms(dim_)), + coeffs_(mesh.nFaces()) { if (debug) { - Info << "Contructing quadraticFitData" << endl; + Info<< "Contructing CentredFitData<Polynomial>" << endl; } - // check input - if (centralWeight_ < 1 - SMALL) + // Check input + if (linearLimitFactor > 1) { - FatalErrorIn("quadraticFitData::quadraticFitData") - << "centralWeight requested = " << centralWeight_ + FatalErrorIn("CentredFitData<Polynomial>::CentredFitData") + << "linearLimitFactor requested = " << linearLimitFactor << " 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 cell to write out - surfaceScalarField interpPolySize - ( - IOobject - ( - "quadraticFitInterpPolySize", - "constant", - mesh, - IOobject::NO_READ, - IOobject::NO_WRITE - ), - mesh, - dimensionedScalar("quadraticFitInterpPolySize", 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(mesh.nFaces()); - stencil.collectData - ( - mesh.C(), - stencilPoints - ); - - // find the fit coefficients for every face in the mesh - - for(label faci = 0; faci < mesh.nInternalFaces(); faci++) - { - interpPolySize[faci] = calcFit(stencilPoints[faci], faci); - } + calcFit(); if (debug) { - Info<< "quadraticFitData::quadraticFitData() :" + Info<< "CentredFitData<Polynomial>::CentredFitData() :" << "Finished constructing polynomialFit data" << endl; - - interpPolySize.write(); } } // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // -void Foam::quadraticFitData::findFaceDirs +template<class Polynomial> +void Foam::CentredFitData<Polynomial>::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 + const label facei ) { - idir = mesh.Sf()[faci]; + idir = mesh.faceAreas()[facei]; idir /= mag(idir); # ifndef SPHERICAL_GEOMETRY - if (mesh.nGeometricD() <= 2) // find the normal direcion + if (mesh.nGeometricD() <= 2) // find the normal direction { if (mesh.directions()[0] == -1) { @@ -157,14 +110,14 @@ void Foam::quadraticFitData::findFaceDirs kdir = vector(0, 0, 1); } } - else // 3D so find a direction in the place of the face + 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]]; + const face& f = mesh.faces()[facei]; + kdir = mesh.points()[f[0]] - mesh.faceCentres()[facei]; } # else // Spherical geometry so kdir is the radial direction - kdir = mesh.Cf()[faci]; + kdir = mesh.faceCentres()[facei]; # endif if (mesh.nGeometricD() == 3) @@ -189,94 +142,125 @@ void Foam::quadraticFitData::findFaceDirs } -Foam::label Foam::quadraticFitData::calcFit +template<class Polynomial> +void Foam::CentredFitData<Polynomial>::calcFit() +{ + const fvMesh& mesh = this->mesh(); + + // Get the cell/face centres in stencil order. + // Centred face stencils no good for triangles of tets. + // Need bigger stencils + List<List<point> > stencilPoints(mesh.nFaces()); + stencil_.collectData(mesh.C(), stencilPoints); + + // find the fit coefficients for every face in the mesh + + const surfaceScalarField& w = this->mesh().surfaceInterpolation::weights(); + + for(label facei = 0; facei < mesh.nInternalFaces(); facei++) + { + calcFit(stencilPoints[facei], w[facei], facei); + } + + const surfaceScalarField::GeometricBoundaryField& bw = w.boundaryField(); + + forAll(bw, patchi) + { + const fvsPatchScalarField& pw = bw[patchi]; + + if (pw.coupled()) + { + label facei = pw.patch().patch().start(); + + forAll(pw, i) + { + calcFit(stencilPoints[facei], pw[i], facei); + facei++; + } + } + } +} + + +template<class Polynomial> +Foam::label Foam::CentredFitData<Polynomial>::calcFit ( const List<point>& C, - const label faci + const scalar wLin, + const label facei ) { vector idir(1,0,0); vector jdir(0,1,0); vector kdir(0,0,1); - findFaceDirs(idir, jdir, kdir, mesh(), faci); + findFaceDirs(idir, jdir, kdir, this->mesh(), facei); + // Setup the point weights scalarList wts(C.size(), scalar(1)); wts[0] = centralWeight_; wts[1] = centralWeight_; - point p0 = mesh().faceCentres()[faci]; - scalar scale = 0; + // Reference point + point p0 = this->mesh().faceCentres()[facei]; + + // p0 -> p vector in the face-local coordinate system + vector d; - // calculate the matrix of the polynomial components + // Local coordinate scaling + scalar scale = 1; + + // Matrix of the polynomial components scalarRectangularMatrix B(C.size(), minSize_, scalar(0)); for(label ip = 0; ip < C.size(); ip++) { const point& p = C[ip]; - scalar px = (p - p0)&idir; - scalar py = (p - p0)&jdir; + d.x() = (p - p0)&idir; + d.y() = (p - p0)&jdir; # ifndef SPHERICAL_GEOMETRY - scalar pz = (p - p0)&kdir; + d.z() = (p - p0)&kdir; # else - scalar pz = mag(p) - mag(p0); + d.z() = mag(p) - mag(p0); # endif if (ip == 0) { - scale = max(max(mag(px), mag(py)), mag(pz)); + scale = cmptMax(cmptMag((d))); } - px /= scale; - py /= scale; - pz /= scale; - - label is = 0; - - B[ip][is++] = wts[0]*wts[ip]; - B[ip][is++] = wts[0]*wts[ip]*px; - B[ip][is++] = wts[ip]*sqr(px); + // Scale the radius vector + d /= scale; - if (dim_ >= 2) - { - B[ip][is++] = wts[ip]*py; - B[ip][is++] = wts[ip]*px*py; - //B[ip][is++] = wts[ip]*sqr(py); - } - if (dim_ == 3) - { - B[ip][is++] = wts[ip]*pz; - B[ip][is++] = wts[ip]*px*pz; - //B[ip][is++] = wts[ip]*py*pz; - //B[ip][is++] = wts[ip]*sqr(pz); - } + Polynomial::addCoeffs + ( + B[ip], + d, + wts[ip], + dim_ + ); } // Set the fit label stencilSize = C.size(); - fit_[faci].setSize(stencilSize); + coeffs_[facei].setSize(stencilSize); scalarList singVals(minSize_); label nSVDzeros = 0; - const GeometricField<scalar, fvsPatchField, surfaceMesh>& w = - mesh().surfaceInterpolation::weights(); - bool goodFit = false; for(int iIt = 0; iIt < 10 && !goodFit; iIt++) { SVD svd(B, SMALL); - scalar fit0 = wts[0]*wts[0]*svd.VSinvUt()[0][0]; - scalar fit1 = wts[0]*wts[1]*svd.VSinvUt()[0][1]; - - //goodFit = (fit0 > 0 && fit1 > 0); + scalar fit0 = wts[0]*svd.VSinvUt()[0][0]; + scalar fit1 = wts[1]*svd.VSinvUt()[0][1]; goodFit = - (mag(fit0 - w[faci])/w[faci] < linearLimitFactor_) - && (mag(fit1 - (1 - w[faci]))/(1 - w[faci]) < linearLimitFactor_); + (mag(fit0 - wLin) < linearLimitFactor_*wLin) + && (mag(fit1 - (1 - wLin)) < linearLimitFactor_*(1 - wLin)); - //scalar w0Err = fit0/w[faci]; - //scalar w1Err = fit1/(1 - w[faci]); + //scalar w0Err = fit0/wLin; + //scalar w1Err = fit1/(1 - wLin); //goodFit = // (w0Err > linearLimitFactor_ && w0Err < (1 + linearLimitFactor_)) @@ -284,12 +268,12 @@ Foam::label Foam::quadraticFitData::calcFit if (goodFit) { - fit_[faci][0] = fit0; - fit_[faci][1] = fit1; + coeffs_[facei][0] = fit0; + coeffs_[facei][1] = fit1; for(label i=2; i<stencilSize; i++) { - fit_[faci][i] = wts[0]*wts[i]*svd.VSinvUt()[0][i]; + coeffs_[facei][i] = wts[i]*svd.VSinvUt()[0][i]; } singVals = svd.S(); @@ -300,12 +284,6 @@ Foam::label Foam::quadraticFitData::calcFit wts[0] *= 10; wts[1] *= 10; - for(label i = 0; i < B.n(); i++) - { - B[i][0] *= 10; - B[i][1] *= 10; - } - for(label j = 0; j < B.m(); j++) { B[0][j] *= 10; @@ -327,40 +305,54 @@ Foam::label Foam::quadraticFitData::calcFit // ( // min // ( - // min(alpha - beta*mag(fit_[faci][0] - w[faci])/w[faci], 1), - // min(alpha - beta*mag(fit_[faci][1] - (1 - w[faci]))/(1 - w[faci]), 1) + // min(alpha - beta*mag(coeffs_[facei][0] - wLin)/wLin, 1), + // min(alpha - beta*mag(coeffs_[facei][1] - (1 - wLin)) + // /(1 - wLin), 1) // ), 0 // ); - // Remove the uncorrected linear coefficients - fit_[faci][0] -= w[faci]; - fit_[faci][1] -= 1 - w[faci]; + //Info<< wLin << " " << coeffs_[facei][0] + // << " " << (1 - wLin) << " " << coeffs_[facei][1] << endl; + + // Remove the uncorrected linear ocefficients + coeffs_[facei][0] -= wLin; + coeffs_[facei][1] -= 1 - wLin; // if (limiter < 0.99) // { // for(label i = 0; i < stencilSize; i++) // { - // fit_[faci][i] *= limiter; + // coeffs_[facei][i] *= limiter; // } // } } else { - Pout<< "Could not fit face " << faci - << " " << fit_[faci][0] << " " << w[faci] - << " " << fit_[faci][1] << " " << 1 - w[faci]<< endl; + if (debug) + { + WarningIn + ( + "CentredFitData<Polynomial>::calcFit" + "(const List<point>& C, const label facei" + ) << "Could not fit face " << facei + << ", reverting to linear." << nl + << " Weights " + << coeffs_[facei][0] << " " << wLin << nl + << " Linear weights " + << coeffs_[facei][1] << " " << 1 - wLin << endl; + } - fit_[faci] = 0; + coeffs_[facei] = 0; } return minSize_ - nSVDzeros; } -bool Foam::quadraticFitData::movePoints() +template<class Polynomial> +bool Foam::CentredFitData<Polynomial>::movePoints() { - notImplemented("quadraticFitData::movePoints()"); - + calcFit(); return true; } diff --git a/src/finiteVolume/interpolation/surfaceInterpolation/schemes/quadraticFit/quadraticFitData.H b/src/finiteVolume/interpolation/surfaceInterpolation/schemes/CentredFitScheme/CentredFitData.H similarity index 75% rename from src/finiteVolume/interpolation/surfaceInterpolation/schemes/quadraticFit/quadraticFitData.H rename to src/finiteVolume/interpolation/surfaceInterpolation/schemes/CentredFitScheme/CentredFitData.H index f0da60901daf96db6f4ab3bcbe623eec8e09ad07..1630e06a927419c0747d33988a7d48ab48ec8483 100644 --- a/src/finiteVolume/interpolation/surfaceInterpolation/schemes/quadraticFit/quadraticFitData.H +++ b/src/finiteVolume/interpolation/surfaceInterpolation/schemes/CentredFitScheme/CentredFitData.H @@ -23,18 +23,18 @@ License Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Class - Foam::quadraticFitData + Foam::CentredFitData Description Data for the quadratic fit correction interpolation scheme SourceFiles - quadraticFitData.C + CentredFitData.C \*---------------------------------------------------------------------------*/ -#ifndef quadraticFitData_H -#define quadraticFitData_H +#ifndef CentredFitData_H +#define CentredFitData_H #include "MeshObject.H" #include "fvMesh.H" @@ -47,15 +47,19 @@ namespace Foam class extendedCentredStencil; /*---------------------------------------------------------------------------*\ - Class quadraticFitData Declaration + Class CentredFitData Declaration \*---------------------------------------------------------------------------*/ -class quadraticFitData +template<class Polynomial> +class CentredFitData : - public MeshObject<fvMesh, quadraticFitData> + public MeshObject<fvMesh, CentredFitData<Polynomial> > { // Private data + //- The stencil the fit is based on + const extendedCentredStencil& stencil_; + //- Factor the fit is allowed to deviate from linear. // This limits the amount of high-order correction and increases // stability on bad meshes @@ -72,7 +76,7 @@ class quadraticFitData //- For each cell in the mesh store the values which multiply the // values of the stencil to obtain the gradient for each direction - List<scalarList> fit_; + List<scalarList> coeffs_; // Private member functions @@ -87,17 +91,28 @@ class quadraticFitData const label faci ); - label calcFit(const List<point>&, const label faci); + //- Calculate the fit for the all the mesh faces + // and set the coefficients + void calcFit(); + + //- Calculate the fit for the specified face and set the coefficients + label calcFit + ( + const List<point>&, // Stencil points + const scalar wLin, // Linear weight + const label faci // Current face index + ); public: - TypeName("quadraticFitData"); + TypeName("CentredFitData"); // Constructors - explicit quadraticFitData + //- Construct from components + CentredFitData ( const fvMesh& mesh, const extendedCentredStencil& stencil, @@ -107,16 +122,16 @@ public: //- Destructor - virtual ~quadraticFitData() + virtual ~CentredFitData() {} // Member functions //- Return reference to fit coefficients - const List<scalarList>& fit() const + const List<scalarList>& coeffs() const { - return fit_; + return coeffs_; } //- Delete the data when the mesh moves not implemented @@ -130,6 +145,12 @@ public: // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +#ifdef NoRepository +# include "CentredFitData.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + #endif // ************************************************************************* // diff --git a/src/finiteVolume/interpolation/surfaceInterpolation/schemes/quadraticFit/quadraticFit.H b/src/finiteVolume/interpolation/surfaceInterpolation/schemes/CentredFitScheme/CentredFitScheme.H similarity index 56% rename from src/finiteVolume/interpolation/surfaceInterpolation/schemes/quadraticFit/quadraticFit.H rename to src/finiteVolume/interpolation/surfaceInterpolation/schemes/CentredFitScheme/CentredFitScheme.H index c1308c6ba3eb1c42bac70877201126aaa630e268..6c5ad7aa022eabf2767fed22e6208bb6e1fc3685 100644 --- a/src/finiteVolume/interpolation/surfaceInterpolation/schemes/quadraticFit/quadraticFit.H +++ b/src/finiteVolume/interpolation/surfaceInterpolation/schemes/CentredFitScheme/CentredFitScheme.H @@ -23,23 +23,19 @@ License Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Class - Foam::quadraticFit + Foam::CentredFitScheme Description - Quadratic fit interpolation scheme which applies an explicit correction to - linear. - -SourceFiles - quadraticFit.C + Centred fit surface interpolation scheme which applies an explicit + correction to linear. \*---------------------------------------------------------------------------*/ -#ifndef quadraticFit_H -#define quadraticFit_H +#ifndef CentredFitScheme_H +#define CentredFitScheme_H -#include "quadraticFitData.H" +#include "CentredFitData.H" #include "linear.H" -#include "centredCFCStencilObject.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -47,11 +43,11 @@ namespace Foam { /*---------------------------------------------------------------------------*\ - Class quadraticFit Declaration + Class CentredFitScheme Declaration \*---------------------------------------------------------------------------*/ -template<class Type> -class quadraticFit +template<class Type, class Polynomial, class Stencil> +class CentredFitScheme : public linear<Type> { @@ -69,31 +65,31 @@ class quadraticFit // Private Member Functions //- Disallow default bitwise copy construct - quadraticFit(const quadraticFit&); + CentredFitScheme(const CentredFitScheme&); //- Disallow default bitwise assignment - void operator=(const quadraticFit&); + void operator=(const CentredFitScheme&); public: //- Runtime type information - TypeName("quadraticFit"); + TypeName("CentredFitScheme"); // Constructors //- Construct from mesh and Istream - quadraticFit(const fvMesh& mesh, Istream& is) + CentredFitScheme(const fvMesh& mesh, Istream& is) : linear<Type>(mesh), linearLimitFactor_(readScalar(is)), - centralWeight_(readScalar(is)) + centralWeight_(1000) {} //- Construct from mesh, faceFlux and Istream - quadraticFit + CentredFitScheme ( const fvMesh& mesh, const surfaceScalarField& faceFlux, @@ -102,7 +98,7 @@ public: : linear<Type>(mesh), linearLimitFactor_(readScalar(is)), - centralWeight_(readScalar(is)) + centralWeight_(1000) {} @@ -123,13 +119,13 @@ public: { const fvMesh& mesh = this->mesh(); - const extendedCentredStencil& stencil = - centredCFCStencilObject::New + const extendedCentredStencil& stencil = Stencil::New ( mesh ); - const quadraticFitData& cfd = quadraticFitData::New + const CentredFitData<Polynomial>& cfd = + CentredFitData<Polynomial>::New ( mesh, stencil, @@ -137,7 +133,7 @@ public: centralWeight_ ); - const List<scalarList>& f = cfd.fit(); + const List<scalarList>& f = cfd.coeffs(); return stencil.weightedSum(vf, f); } @@ -148,6 +144,34 @@ public: } // End namespace Foam +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// Add the patch constructor functions to the hash tables + +#define makeCentredFitSurfaceInterpolationTypeScheme(SS, POLYNOMIAL, STENCIL, TYPE) \ + \ +typedef CentredFitScheme<TYPE, POLYNOMIAL, STENCIL> \ + CentredFitScheme##TYPE##POLYNOMIAL##STENCIL##_; \ +defineTemplateTypeNameAndDebugWithName \ + (CentredFitScheme##TYPE##POLYNOMIAL##STENCIL##_, #SS, 0); \ + \ +surfaceInterpolationScheme<TYPE>::addMeshConstructorToTable \ +<CentredFitScheme<TYPE, POLYNOMIAL, STENCIL> > \ + add##SS##STENCIL##TYPE##MeshConstructorToTable_; \ + \ +surfaceInterpolationScheme<TYPE>::addMeshFluxConstructorToTable \ +<CentredFitScheme<TYPE, POLYNOMIAL, STENCIL> > \ + add##SS##STENCIL##TYPE##MeshFluxConstructorToTable_; + +#define makeCentredFitSurfaceInterpolationScheme(SS, POLYNOMIAL, STENCIL) \ + \ +makeCentredFitSurfaceInterpolationTypeScheme(SS,POLYNOMIAL,STENCIL,scalar) \ +makeCentredFitSurfaceInterpolationTypeScheme(SS,POLYNOMIAL,STENCIL,vector) \ +makeCentredFitSurfaceInterpolationTypeScheme(SS,POLYNOMIAL,STENCIL,sphericalTensor) \ +makeCentredFitSurfaceInterpolationTypeScheme(SS,POLYNOMIAL,STENCIL,symmTensor)\ +makeCentredFitSurfaceInterpolationTypeScheme(SS,POLYNOMIAL,STENCIL,tensor) + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #endif diff --git a/src/finiteVolume/interpolation/surfaceInterpolation/schemes/linearFit/linearFit.C b/src/finiteVolume/interpolation/surfaceInterpolation/schemes/linearFit/linearFit.C index a7dead621f9dfa472a2ad370487a990511a72e2c..beff7881b270bbda13da67a64ac03e14ca6395bb 100644 --- a/src/finiteVolume/interpolation/surfaceInterpolation/schemes/linearFit/linearFit.C +++ b/src/finiteVolume/interpolation/surfaceInterpolation/schemes/linearFit/linearFit.C @@ -24,13 +24,26 @@ License \*---------------------------------------------------------------------------*/ -#include "linearFit.H" +#include "CentredFitScheme.H" +#include "linearFitPolynomial.H" +#include "centredCFCStencilObject.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam { - makeSurfaceInterpolationScheme(linearFit); + defineTemplateTypeNameAndDebug + ( + CentredFitData<linearFitPolynomial>, + 0 + ); + + makeCentredFitSurfaceInterpolationScheme + ( + linearFit, + linearFitPolynomial, + centredCFCStencilObject + ); } // ************************************************************************* // diff --git a/src/finiteVolume/interpolation/surfaceInterpolation/schemes/linearFit/linearFit.H b/src/finiteVolume/interpolation/surfaceInterpolation/schemes/linearFit/linearFit.H deleted file mode 100644 index 882f3e94bcc2dc046c226062820b1144a1a4e5ff..0000000000000000000000000000000000000000 --- a/src/finiteVolume/interpolation/surfaceInterpolation/schemes/linearFit/linearFit.H +++ /dev/null @@ -1,138 +0,0 @@ -/*---------------------------------------------------------------------------*\ - ========= | - \\ / F ield | OpenFOAM: The Open Source CFD Toolbox - \\ / O peration | - \\ / A nd | Copyright (C) 1991-2007 OpenCFD Ltd. - \\/ M anipulation | -------------------------------------------------------------------------------- -License - This file is part of OpenFOAM. - - OpenFOAM is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - OpenFOAM is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - for more details. - - You should have received a copy of the GNU General Public License - along with OpenFOAM; if not, write to the Free Software Foundation, - Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -Class - linearFit - -Description - Linear fit interpolation scheme which applies an explicit correction to - linear. - -SourceFiles - linearFit.C - -\*---------------------------------------------------------------------------*/ - -#ifndef linearFit_H -#define linearFit_H - -#include "linear.H" -#include "linearFitData.H" -#include "extendedStencil.H" - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -namespace Foam -{ - -/*---------------------------------------------------------------------------*\ - Class linearFit Declaration -\*---------------------------------------------------------------------------*/ - -template<class Type> -class linearFit -: - public linear<Type> -{ - // Private Data - const scalar centralWeight_; - - // Private Member Functions - - //- Disallow default bitwise copy construct - linearFit(const linearFit&); - - //- Disallow default bitwise assignment - void operator=(const linearFit&); - - -public: - - //- Runtime type information - TypeName("linearFit"); - - - // Constructors - - //- Construct from mesh and Istream - linearFit(const fvMesh& mesh, Istream& is) - : - linear<Type>(mesh), - centralWeight_(readScalar(is)) - {} - - - //- Construct from mesh, faceFlux and Istream - linearFit - ( - const fvMesh& mesh, - const surfaceScalarField& faceFlux, - Istream& is - ) - : - linear<Type>(mesh), - centralWeight_(readScalar(is)) - {} - - - // Member Functions - - //- Return true if this scheme uses an explicit correction - virtual bool corrected() const - { - return true; - } - - //- Return the explicit correction to the face-interpolate - virtual tmp<GeometricField<Type, fvsPatchField, surfaceMesh> > - correction - ( - const GeometricField<Type, fvPatchField, volMesh>& vf - ) const - { - const fvMesh& mesh = this->mesh(); - - const linearFitData& cfd = linearFitData::New - ( - mesh, - centralWeight_ - ); - - const extendedStencil& stencil = cfd.stencil(); - const List<scalarList>& f = cfd.fit(); - - return stencil.weightedSum(vf, f); - } -}; - - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -} // End namespace Foam - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -#endif - -// ************************************************************************* // diff --git a/src/finiteVolume/interpolation/surfaceInterpolation/schemes/linearFit/linearFitData.C b/src/finiteVolume/interpolation/surfaceInterpolation/schemes/linearFit/linearFitData.C deleted file mode 100644 index 996d915e1cc56aad3734772bbf7be4e5667f0e90..0000000000000000000000000000000000000000 --- a/src/finiteVolume/interpolation/surfaceInterpolation/schemes/linearFit/linearFitData.C +++ /dev/null @@ -1,371 +0,0 @@ -/*---------------------------------------------------------------------------*\ - ========= | - \\ / F ield | OpenFOAM: The Open Source CFD Toolbox - \\ / O peration | - \\ / A nd | Copyright (C) 1991-2007 OpenCFD Ltd. - \\/ M anipulation | -------------------------------------------------------------------------------- -License - This file is part of OpenFOAM. - - OpenFOAM is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - OpenFOAM is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - for more details. - - You should have received a copy of the GNU General Public License - along with OpenFOAM; if not, write to the Free Software Foundation, - Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -\*---------------------------------------------------------------------------*/ - -#include "linearFitData.H" -#include "surfaceFields.H" -#include "volFields.H" -#include "SVD.H" -#include "syncTools.H" - - -// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // - -namespace Foam -{ - defineTypeNameAndDebug(linearFitData, 0); -} - - -// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // - -static int count = 0; - -Foam::linearFitData::linearFitData -( - const fvMesh& mesh, - const scalar cWeight -) -: - MeshObject<fvMesh, linearFitData>(mesh), - centralWeight_(cWeight), -# ifdef SPHERICAL_GEOMETRY - dim_(2), -# else - dim_(mesh.nGeometricD()), -# endif - minSize_ - ( - dim_ == 1 ? 2 : - dim_ == 2 ? 3 : - dim_ == 3 ? 4 : 0 - ), - stencil_(mesh), - fit_(mesh.nInternalFaces()) -{ - if (debug) - { - Info << "Contructing linearFitData" << endl; - } - - // check input - if (centralWeight_ < 1 - SMALL) - { - FatalErrorIn("linearFitData::linearFitData") - << "centralWeight requested = " << centralWeight_ - << " should not be less than one" - << exit(FatalError); - } - - if (minSize_ == 0) - { - FatalErrorIn("linearFitSnGradData") - << " dimension must be 1,2 or 3, not" << dim_ << exit(FatalError); - } - - // store the polynomial size for each cell to write out - surfaceScalarField interpPolySize - ( - IOobject - ( - "linearFitInterpPolySize", - "constant", - mesh, - IOobject::NO_READ, - IOobject::NO_WRITE - ), - mesh, - dimensionedScalar("linearFitInterpPolySize", 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++) - { - interpPolySize[faci] = calcFit(stencilPoints[faci], faci); - } - - Pout<< "count = " << count << endl; - - if (debug) - { - Info<< "linearFitData::linearFitData() :" - << "Finished constructing polynomialFit data" - << endl; - - interpPolySize.write(); - } -} - - -// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // - -void Foam::linearFitData::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 = mesh.C()[mesh.neighbour()[faci]] - mesh.C()[mesh.owner()[faci]]; - idir /= mag(idir); - -# ifndef SPHERICAL_GEOMETRY - if (mesh.nGeometricD() <= 2) // find the normal direcion - { - if (mesh.directions()[0] == -1) - { - kdir = vector(1, 0, 0); - } - else if (mesh.directions()[1] == -1) - { - kdir = vector(0, 1, 0); - } - else - { - kdir = vector(0, 0, 1); - } - } - else // 3D so find a direction in the place 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::label Foam::linearFitData::calcFit -( - const List<point>& C, - const label faci -) -{ - vector idir(1,0,0); - vector jdir(0,1,0); - vector kdir(0,0,1); - findFaceDirs(idir, jdir, kdir, mesh(), faci); - - scalarList wts(C.size(), scalar(1)); - wts[0] = centralWeight_; - wts[1] = centralWeight_; - - point p0 = mesh().faceCentres()[faci]; - scalar scale = 0; - - // calculate the matrix of the polynomial components - scalarRectangularMatrix B(C.size(), minSize_, scalar(0)); - - for(label ip = 0; ip < C.size(); ip++) - { - const point& p = C[ip]; - - scalar px = (p - p0)&idir; - scalar py = (p - p0)&jdir; -# ifndef SPHERICAL_GEOMETRY - scalar pz = (p - p0)&kdir; -# else - scalar pz = mag(p) - mag(p0); -# endif - - if (ip == 0) - { - scale = max(max(mag(px), mag(py)), mag(pz)); - } - - px /= scale; - py /= scale; - pz /= scale; - - label is = 0; - - B[ip][is++] = wts[0]*wts[ip]; - B[ip][is++] = wts[0]*wts[ip]*px; - - if (dim_ >= 2) - { - B[ip][is++] = wts[ip]*py; - } - if (dim_ == 3) - { - B[ip][is++] = wts[ip]*pz; - } - } - - // Set the fit - label stencilSize = C.size(); - fit_[faci].setSize(stencilSize); - scalarList singVals(minSize_); - label nSVDzeros = 0; - - const GeometricField<scalar, fvsPatchField, surfaceMesh>& w = - mesh().surfaceInterpolation::weights(); - - bool goodFit = false; - for(int iIt = 0; iIt < 10 && !goodFit; iIt++) - { - SVD svd(B, SMALL); - - scalar fit0 = wts[0]*wts[0]*svd.VSinvUt()[0][0]; - scalar fit1 = wts[0]*wts[1]*svd.VSinvUt()[0][1]; - - //goodFit = (fit0 > 0 && fit1 > 0); - - goodFit = - (mag(fit0 - w[faci])/w[faci] < 0.5) - && (mag(fit1 - (1 - w[faci]))/(1 - w[faci]) < 0.5); - - //scalar w0Err = fit0/w[faci]; - //scalar w1Err = fit1/(1 - w[faci]); - - //goodFit = - // (w0Err > 0.5 && w0Err < 1.5) - // && (w1Err > 0.5 && w1Err < 1.5); - - if (goodFit) - { - fit_[faci][0] = fit0; - fit_[faci][1] = fit1; - - for(label i=2; i<stencilSize; i++) - { - fit_[faci][i] = wts[0]*wts[i]*svd.VSinvUt()[0][i]; - } - - singVals = svd.S(); - nSVDzeros = svd.nZeros(); - } - else // (not good fit so increase weight in the centre and for linear) - { - wts[0] *= 10; - wts[1] *= 10; - - for(label i = 0; i < B.n(); i++) - { - B[i][0] *= 10; - B[i][1] *= 10; - } - - for(label j = 0; j < B.m(); j++) - { - B[0][j] *= 10; - B[1][j] *= 10; - } - } - } - - // static const scalar L = 0.1; - // static const scalar R = 0.2; - - // static const scalar beta = 1.0/(R - L); - // static const scalar alpha = R*beta; - - if (goodFit) - { - if ((mag(fit_[faci][0] - w[faci])/w[faci] < 0.15) - && (mag(fit_[faci][1] - (1 - w[faci]))/(1 - w[faci]) < 0.15)) - { - count++; - //Pout<< "fit " << mag(fit_[faci][0] - w[faci])/w[faci] << " " << mag(fit_[faci][1] - (1 - w[faci]))/(1 - w[faci]) << endl; - } - - // scalar limiter = - // max - // ( - // min - // ( - // min(alpha - beta*mag(fit_[faci][0] - w[faci])/w[faci], 1), - // min(alpha - beta*mag(fit_[faci][1] - (1 - w[faci]))/(1 - w[faci]), 1) - // ), 0 - // ); - - // Remove the uncorrected linear coefficients - fit_[faci][0] -= w[faci]; - fit_[faci][1] -= 1 - w[faci]; - - // if (limiter < 0.99) - // { - // for(label i = 0; i < stencilSize; i++) - // { - // fit_[faci][i] *= limiter; - // } - // } - } - else - { - Pout<< "Could not fit face " << faci - << " " << fit_[faci][0] << " " << w[faci] - << " " << fit_[faci][1] << " " << 1 - w[faci]<< endl; - fit_[faci] = 0; - } - - return minSize_ - nSVDzeros; -} - - -bool Foam::linearFitData::movePoints() -{ - notImplemented("linearFitData::movePoints()"); - - return true; -} - - -// ************************************************************************* // diff --git a/src/finiteVolume/interpolation/surfaceInterpolation/schemes/linearFit/linearFitData.H b/src/finiteVolume/interpolation/surfaceInterpolation/schemes/linearFit/linearFitData.H deleted file mode 100644 index 7a2bc7d28e31888f059dec2e35e862daf72fc95c..0000000000000000000000000000000000000000 --- a/src/finiteVolume/interpolation/surfaceInterpolation/schemes/linearFit/linearFitData.H +++ /dev/null @@ -1,140 +0,0 @@ -/*---------------------------------------------------------------------------*\ - ========= | - \\ / F ield | OpenFOAM: The Open Source CFD Toolbox - \\ / O peration | - \\ / A nd | Copyright (C) 1991-2007 OpenCFD Ltd. - \\/ M anipulation | -------------------------------------------------------------------------------- -License - This file is part of OpenFOAM. - - OpenFOAM is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - OpenFOAM is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - for more details. - - You should have received a copy of the GNU General Public License - along with OpenFOAM; if not, write to the Free Software Foundation, - Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -Class - linearFitData - -Description - Data for the linear fit correction interpolation scheme - -SourceFiles - linearFitData.C - -\*---------------------------------------------------------------------------*/ - -#ifndef linearFitData_H -#define linearFitData_H - -#include "MeshObject.H" -#include "fvMesh.H" -#include "extendedStencil.H" - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -namespace Foam -{ - -class globalIndex; - -/*---------------------------------------------------------------------------*\ - Class linearFitData Declaration -\*---------------------------------------------------------------------------*/ - -class linearFitData -: - public MeshObject<fvMesh, linearFitData> -{ - // Private data - - //- weights for central stencil - const scalar centralWeight_; - - //- dimensionality of the geometry - const label dim_; - - //- minimum stencil size - const label minSize_; - - //- Extended stencil addressing - extendedStencil stencil_; - - //- For each cell in the mesh store the values which multiply the - // values of the stencil to obtain the gradient for each direction - List<scalarList> fit_; - - - // Private member functions - - //- Find the normal direction and i, j and k directions for face faci - static void 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 - ); - - label calcFit(const List<point>&, const label faci); - - -public: - - TypeName("linearFitData"); - - - // Constructors - - explicit linearFitData - ( - const fvMesh& mesh, - scalar cWeightDim - ); - - - // Destructor - - virtual ~linearFitData() - {} - - - // Member functions - - - //- Return reference to the stencil - const extendedStencil& stencil() const - { - return stencil_; - } - - //- Return reference to fit coefficients - const List<scalarList>& fit() const - { - return fit_; - } - - //- Delete the data when the mesh moves not implemented - virtual bool movePoints(); -}; - - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -} // End namespace Foam - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -#endif - -// ************************************************************************* // diff --git a/src/finiteVolume/interpolation/surfaceInterpolation/schemes/linearFit/linearFitPolynomial.H b/src/finiteVolume/interpolation/surfaceInterpolation/schemes/linearFit/linearFitPolynomial.H new file mode 100644 index 0000000000000000000000000000000000000000..70275f9ee17fe008de2b6296c7842c8566fd9198 --- /dev/null +++ b/src/finiteVolume/interpolation/surfaceInterpolation/schemes/linearFit/linearFitPolynomial.H @@ -0,0 +1,98 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2008 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2 of the License, or (at your + option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM; if not, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Class + Foam::linearFitPolynomial + +Description + Linear polynomial for interpolation fitting. + Can be used with the CentredFit scheme to crate a linear surface + interpolation scheme + +\*---------------------------------------------------------------------------*/ + +#ifndef linearFitPolynomial_H +#define linearFitPolynomial_H + +#include "vector.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class linearFitPolynomial Declaration +\*---------------------------------------------------------------------------*/ + +class linearFitPolynomial +{ +public: + + // Member functions + + static label nTerms(const direction dim) + { + return + ( + dim == 1 ? 2 : + dim == 2 ? 3 : + dim == 3 ? 4 : 0 + ); + } + + static void addCoeffs + ( + scalar* coeffs, + const vector& d, + const scalar weight, + const direction dim + ) + { + register label curIdx = 0; + + coeffs[curIdx++] = weight; + coeffs[curIdx++] = weight*d.x(); + + if (dim >= 2) + { + coeffs[curIdx++] = weight*d.y(); + } + if (dim == 3) + { + coeffs[curIdx++] = weight*d.z(); + } + } +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/finiteVolume/interpolation/surfaceInterpolation/schemes/quadraticFit/quadraticFit.C b/src/finiteVolume/interpolation/surfaceInterpolation/schemes/quadraticLinearFit/quadraticLinearFit.C similarity index 78% rename from src/finiteVolume/interpolation/surfaceInterpolation/schemes/quadraticFit/quadraticFit.C rename to src/finiteVolume/interpolation/surfaceInterpolation/schemes/quadraticLinearFit/quadraticLinearFit.C index a215576330b96524c911ddbcc13a622c877fc3d2..0ecd5ece93bb10b829d2d4a3cc6da821e61592c6 100644 --- a/src/finiteVolume/interpolation/surfaceInterpolation/schemes/quadraticFit/quadraticFit.C +++ b/src/finiteVolume/interpolation/surfaceInterpolation/schemes/quadraticLinearFit/quadraticLinearFit.C @@ -24,13 +24,26 @@ License \*---------------------------------------------------------------------------*/ -#include "quadraticFit.H" +#include "CentredFitScheme.H" +#include "quadraticLinearFitPolynomial.H" +#include "centredCFCStencilObject.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam { - makeSurfaceInterpolationScheme(quadraticFit); + defineTemplateTypeNameAndDebug + ( + CentredFitData<quadraticLinearFitPolynomial>, + 0 + ); + + makeCentredFitSurfaceInterpolationScheme + ( + quadraticLinearFit, + quadraticLinearFitPolynomial, + centredCFCStencilObject + ); } // ************************************************************************* // diff --git a/src/finiteVolume/interpolation/surfaceInterpolation/schemes/quadraticLinearFit/quadraticLinearFitPolynomial.H b/src/finiteVolume/interpolation/surfaceInterpolation/schemes/quadraticLinearFit/quadraticLinearFitPolynomial.H new file mode 100644 index 0000000000000000000000000000000000000000..4250e71c1e211771aafc912a30bfcd156faa4cd6 --- /dev/null +++ b/src/finiteVolume/interpolation/surfaceInterpolation/schemes/quadraticLinearFit/quadraticLinearFitPolynomial.H @@ -0,0 +1,104 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2008 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2 of the License, or (at your + option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM; if not, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Class + Foam::quadraticLinearFitPolynomial + +Description + Quadratic/linear polynomial for interpolation fitting: + quadratic normal to the face, + linear in the plane of the face for consistency with 2nd-order Gauss. + + Can be used with the CentredFit scheme to crate a quadratic surface + interpolation scheme + +\*---------------------------------------------------------------------------*/ + +#ifndef quadraticLinearFitPolynomial_H +#define quadraticLinearFitPolynomial_H + +#include "vector.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class quadraticLinearFitPolynomial Declaration +\*---------------------------------------------------------------------------*/ + +class quadraticLinearFitPolynomial +{ +public: + + // Member functions + + static label nTerms(const direction dim) + { + return + ( + dim == 1 ? 3 : + dim == 2 ? 5 : + dim == 3 ? 7 : 0 + ); + } + + static void addCoeffs + ( + scalar* coeffs, + const vector& d, + const scalar weight, + const direction dim + ) + { + register label curIdx = 0; + + coeffs[curIdx++] = weight; + coeffs[curIdx++] = weight*d.x(); + coeffs[curIdx++] = weight*sqr(d.x()); + + if (dim >= 2) + { + coeffs[curIdx++] = weight*d.y(); + coeffs[curIdx++] = weight*d.x()*d.y(); + } + if (dim == 3) + { + coeffs[curIdx++] = weight*d.z(); + coeffs[curIdx++] = weight*d.x()*d.z(); + } + } +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/meshTools/searchableSurface/distributedTriSurfaceMesh.C b/src/meshTools/searchableSurface/distributedTriSurfaceMesh.C index a42408e9bcbdab58611442c28a92ad2f05a1d01c..adfe29401e4a1e08219e506538121b7a6a559838 100644 --- a/src/meshTools/searchableSurface/distributedTriSurfaceMesh.C +++ b/src/meshTools/searchableSurface/distributedTriSurfaceMesh.C @@ -2192,9 +2192,10 @@ bool Foam::distributedTriSurfaceMesh::writeObject // Make sure dictionary goes to same directory as surface const_cast<fileName&>(dict_.instance()) = searchableSurface::instance(); + // Dictionary needs to be written in ascii - binary output not supported. return triSurfaceMesh::writeObject(fmt, ver, cmp) - && dict_.writeObject(fmt, ver, cmp); + && dict_.writeObject(IOstream::ASCII, ver, cmp); }