diff --git a/src/mesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshConformToSurface.C b/src/mesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshConformToSurface.C index 1fb7e963a8490524fa8e06fd2654bf82daca8ae9..0a0c24178a61362ef02134aea959209f1c7983e5 100644 --- a/src/mesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshConformToSurface.C +++ b/src/mesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshConformToSurface.C @@ -95,7 +95,8 @@ void Foam::conformalVoronoiMesh::buildSurfaceConformation else { WarningIn("buildSurfaceConformation(reconformationMode reconfMode)") - << "Unknown reconformationMode " << reconfMode << endl; + << "Unknown reconformationMode " << reconfMode + << " not building conformation" << endl; return; } @@ -118,9 +119,11 @@ void Foam::conformalVoronoiMesh::buildSurfaceConformation // Initial surface protrusion conformation - nearest surface point { - Info<< "EDGE DISTANCE COEFFS HARD-CODED." << endl; - scalar edgeSearchDistCoeffSqr = sqr(1.1); - scalar surfacePtReplaceDistCoeffSqr = sqr(0.5); + scalar edgeSearchDistCoeffSqr = + cvMeshControls().edgeSearchDistCoeffSqrInitial(reconfMode); + + scalar surfacePtReplaceDistCoeffSqr = + cvMeshControls().surfacePtReplaceDistCoeffSqrInitial(reconfMode); DynamicList<pointIndexHit> surfaceHits; DynamicList<label> hitSurfaces; @@ -203,17 +206,21 @@ void Foam::conformalVoronoiMesh::buildSurfaceConformation label iterationNo = 0; - label maxIterations = 10; - - Info<< nl << "MAX ITERATIONS HARD CODED TO "<< maxIterations << endl; + label maxIterations = + cvMeshControls().maxConformationIterations(reconfMode); - scalar iterationToIntialHitRatioLimit = 0.01; + scalar iterationToIntialHitRatioLimit = + cvMeshControls().iterationToIntialHitRatioLimit(reconfMode); label hitLimit = label(iterationToIntialHitRatioLimit*initialTotalHits); - Info<< "STOPPING ITERATIONS WHEN TOTAL NUMBER OF HITS DROPS BELOW " - << iterationToIntialHitRatioLimit << " (HARD CODED) OF INITIAL HITS (" - << hitLimit << ")" + Info<< nl << "Stopping iterations when: " << nl + <<" total number of hits drops below " + << iterationToIntialHitRatioLimit << " of initial hits (" + << hitLimit << ")" << nl + << " or " << nl + << " maximum number of iterations (" + << maxIterations << ") is reached" << endl; // Set totalHits to a large enough positive value to enter the while loop on @@ -227,9 +234,11 @@ void Foam::conformalVoronoiMesh::buildSurfaceConformation && iterationNo < maxIterations ) { - Info<< "EDGE DISTANCE COEFFS HARD-CODED." << endl; - scalar edgeSearchDistCoeffSqr = sqr(1.25); - scalar surfacePtReplaceDistCoeffSqr = sqr(0.7); + scalar edgeSearchDistCoeffSqr = + cvMeshControls().edgeSearchDistCoeffSqrIteration(reconfMode); + + scalar surfacePtReplaceDistCoeffSqr = + cvMeshControls().surfacePtReplaceDistCoeffSqrIteration(reconfMode); DynamicList<pointIndexHit> surfaceHits; DynamicList<label> hitSurfaces; diff --git a/src/mesh/conformalVoronoiMesh/cvControls/cvControls.C b/src/mesh/conformalVoronoiMesh/cvControls/cvControls.C index 71b8dc5a5d88bfcad5273a70faeefc580cbe7aa8..20ad3929e7cdccec24191fb7bd2741e6196c9de6 100644 --- a/src/mesh/conformalVoronoiMesh/cvControls/cvControls.C +++ b/src/mesh/conformalVoronoiMesh/cvControls/cvControls.C @@ -91,6 +91,124 @@ Foam::cvControls::cvControls readLabel(surfDict.lookup("surfaceConformationRebuildFrequency")) ); + // Controls for coarse surface conformation + + const dictionary& coarseDict + ( + surfDict.subDict("coarseConformationControls") + ); + + const dictionary& coarseInitialDict + ( + coarseDict.subDict("initial") + ); + + const dictionary& coarseIterationDict + ( + coarseDict.subDict("iteration") + ); + + edgeSearchDistCoeffSqr_coarse_initial_ = sqr + ( + readScalar + ( + coarseInitialDict.lookup("edgeSearchDistCoeff") + ) + ); + + edgeSearchDistCoeffSqr_coarse_iteration_ = sqr + ( + readScalar + ( + coarseIterationDict.lookup("edgeSearchDistCoeff") + ) + ); + + surfacePtReplaceDistCoeffSqr_coarse_initial_ = sqr + ( + readScalar + ( + coarseInitialDict.lookup("surfacePtReplaceDistCoeff") + ) + ); + + surfacePtReplaceDistCoeffSqr_coarse_iteration_ = sqr + ( + readScalar + ( + coarseIterationDict.lookup("surfacePtReplaceDistCoeff") + ) + ); + + maxConformationIterations_coarse_ = readLabel + ( + coarseDict.lookup("maxIterations") + ); + + iterationToIntialHitRatioLimit_coarse_ = readScalar + ( + coarseDict.lookup("iterationToIntialHitRatioLimit") + ); + + // Controls for fine surface conformation + + const dictionary& fineDict + ( + surfDict.subDict("fineConformationControls") + ); + + const dictionary& fineInitialDict + ( + fineDict.subDict("initial") + ); + + const dictionary& fineIterationDict + ( + fineDict.subDict("iteration") + ); + + edgeSearchDistCoeffSqr_fine_initial_ = sqr + ( + readScalar + ( + fineInitialDict.lookup("edgeSearchDistCoeff") + ) + ); + + edgeSearchDistCoeffSqr_fine_iteration_ = sqr + ( + readScalar + ( + fineIterationDict.lookup("edgeSearchDistCoeff") + ) + ); + + surfacePtReplaceDistCoeffSqr_fine_initial_ = sqr + ( + readScalar + ( + fineInitialDict.lookup("surfacePtReplaceDistCoeff") + ) + ); + + surfacePtReplaceDistCoeffSqr_fine_iteration_ = sqr + ( + readScalar + ( + fineIterationDict.lookup("surfacePtReplaceDistCoeff") + ) + ); + + maxConformationIterations_fine_ = readLabel + ( + fineDict.lookup("maxIterations") + ); + + iterationToIntialHitRatioLimit_fine_ = readScalar + ( + fineDict.lookup("iterationToIntialHitRatioLimit") + ); + // Motion control controls const dictionary& motionDict(cvMeshDict_.subDict("motionControl")); @@ -196,6 +314,188 @@ Foam::cvControls::cvControls } +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +Foam::scalar Foam::cvControls::edgeSearchDistCoeffSqrInitial +( + int reconfMode +) const +{ + if (reconfMode == conformalVoronoiMesh::rmCoarse) + { + return edgeSearchDistCoeffSqr_coarse_initial_; + } + + else if (reconfMode == conformalVoronoiMesh::rmFine) + { + return edgeSearchDistCoeffSqr_fine_initial_; + } + else + { + FatalErrorIn + ( + "Foam::cvControls::edgeSearchDistCoeffSqrInitial" + "(" + "int reconfMode" + ") const" + ) << "Unknown reconformationMode " << reconfMode + << exit(FatalError); + } + + return 0; +} + + +Foam::scalar Foam::cvControls::edgeSearchDistCoeffSqrIteration +( + int reconfMode +) const +{ + if (reconfMode == conformalVoronoiMesh::rmCoarse) + { + return edgeSearchDistCoeffSqr_coarse_iteration_; + } + + else if (reconfMode == conformalVoronoiMesh::rmFine) + { + return edgeSearchDistCoeffSqr_fine_iteration_; + } + else + { + FatalErrorIn + ( + "Foam::cvControls::edgeSearchDistCoeffSqrIteration" + "(" + "int reconfMode" + ") const" + ) << "Unknown reconformationMode " << reconfMode + << exit(FatalError); + } + + return 0; +} + + +Foam::scalar Foam::cvControls::surfacePtReplaceDistCoeffSqrInitial +( + int reconfMode +) const +{ + if (reconfMode == conformalVoronoiMesh::rmCoarse) + { + return surfacePtReplaceDistCoeffSqr_coarse_initial_; + } + + else if (reconfMode == conformalVoronoiMesh::rmFine) + { + return surfacePtReplaceDistCoeffSqr_fine_initial_; + } + else + { + FatalErrorIn + ( + "Foam::cvControls::surfacePtReplaceDistCoeffSqrInitial" + "(" + "int reconfMode" + ") const" + ) << "Unknown reconformationMode " << reconfMode + << exit(FatalError); + } + + return 0; +} + + +Foam::scalar Foam::cvControls::surfacePtReplaceDistCoeffSqrIteration +( + int reconfMode +) const +{ + if (reconfMode == conformalVoronoiMesh::rmCoarse) + { + return surfacePtReplaceDistCoeffSqr_coarse_iteration_; + } + + else if (reconfMode == conformalVoronoiMesh::rmFine) + { + return surfacePtReplaceDistCoeffSqr_fine_iteration_; + } + else + { + FatalErrorIn + ( + "Foam::cvControls::surfacePtReplaceDistCoeffSqrIteration" + "(" + "int reconfMode" + ") const" + ) << "Unknown reconformationMode " << reconfMode + << exit(FatalError); + } + + return 0; +} + + +Foam::label Foam::cvControls::maxConformationIterations +( + int reconfMode +) const +{ + if (reconfMode == conformalVoronoiMesh::rmCoarse) + { + return maxConformationIterations_coarse_; + } + + else if (reconfMode == conformalVoronoiMesh::rmFine) + { + return maxConformationIterations_fine_; + } + else + { + FatalErrorIn + ( + "Foam::cvControls::maxConformationIterations" + "(" + "int reconfMode" + ") const" + ) << "Unknown reconformationMode " << reconfMode + << exit(FatalError); + } + + return 0; +} + + +Foam::scalar Foam::cvControls::iterationToIntialHitRatioLimit +( + int reconfMode +) const +{ + if (reconfMode == conformalVoronoiMesh::rmCoarse) + { + return iterationToIntialHitRatioLimit_coarse_; + } + + else if (reconfMode == conformalVoronoiMesh::rmFine) + { + return iterationToIntialHitRatioLimit_fine_; + } + else + { + FatalErrorIn + ( + "Foam::cvControls::iterationToIntialHitRatioLimit" + "(" + "int reconfMode" + ") const" + ) << "Unknown reconformationMode " << reconfMode + << exit(FatalError); + } + + return 0; +} + + // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // Foam::cvControls::~cvControls() diff --git a/src/mesh/conformalVoronoiMesh/cvControls/cvControls.H b/src/mesh/conformalVoronoiMesh/cvControls/cvControls.H index 6c893782a705f629f4d5587506fa6af3fdc1b1bb..75ec2e8378538d4d74abcb783460960c89143225 100644 --- a/src/mesh/conformalVoronoiMesh/cvControls/cvControls.H +++ b/src/mesh/conformalVoronoiMesh/cvControls/cvControls.H @@ -107,6 +107,80 @@ class cvControls label surfaceConformationRebuildFrequency_; + // Controls for coarse surface conformation + + //- Distance to search for feature edges near to + // surface protrusions - fraction of the local target + // cell size. Coarse conformation, initial protrusion + // tests. + scalar edgeSearchDistCoeffSqr_coarse_initial_; + + //- Distance to search for feature edges near to + // surface protrusions - fraction of the local target + // cell size. Coarse conformation, iteration + // protrusion tests. + scalar edgeSearchDistCoeffSqr_coarse_iteration_; + + //- Proximity to a feature edge where a surface hit is + // not created, only the edge conformation is created + // - fraction of the local target cell size. Coarse + // conformation, initial protrusion tests. + scalar surfacePtReplaceDistCoeffSqr_coarse_initial_; + + //- Proximity to a feature edge where a surface hit is + // not created, only the edge conformation is created + // - fraction of the local target cell size. Coarse + // conformation, iteration protrusion tests. + scalar surfacePtReplaceDistCoeffSqr_coarse_iteration_; + + //- Maximum allowed number coarse surface conformation + // iterations. + label maxConformationIterations_coarse_; + + //- Termination criterion for coarse surface + // conformation iterations. When the number of + // surface protrusions drops below this ratio of the + // initial number of protrusions. + scalar iterationToIntialHitRatioLimit_coarse_; + + + // Controls for fine surface conformation + + //- Distance to search for feature edges near to + // surface protrusions - fraction of the local target + // cell size. Fine conformation, initial protrusion + // tests. + scalar edgeSearchDistCoeffSqr_fine_initial_; + + //- Distance to search for feature edges near to + // surface protrusions - fraction of the local target + // cell size. Fine conformation, iteration protrusion + // tests. + scalar edgeSearchDistCoeffSqr_fine_iteration_; + + //- Proximity to a feature edge where a surface hit is + // not created, only the edge conformation is created + // - fraction of the local target cell size. Fine + // conformation, initial protrusion tests. + scalar surfacePtReplaceDistCoeffSqr_fine_initial_; + + //- Proximity to a feature edge where a surface hit is + // not created, only the edge conformation is created + // - fraction of the local target cell size. Fine + // conformation, iteration protrusion tests. + scalar surfacePtReplaceDistCoeffSqr_fine_iteration_; + + //- Maximum allowed number fine surface conformation + // iterations. + label maxConformationIterations_fine_; + + //- Termination criterion for fine surface conformation + // iterations. When the number of surface protrusions + // drops below this ratio of the initial number of + // protrusions. + scalar iterationToIntialHitRatioLimit_fine_; + + // Motion control controls //- Switch to control the output of obj files for debug @@ -255,6 +329,31 @@ public: //- Return the surfaceConformationRebuildFrequency inline label surfaceConformationRebuildFrequency() const; + //- Return the edgeSearchDistCoeffSqr for initial + // conformation for the given reconformationMode. + scalar edgeSearchDistCoeffSqrInitial(int reconfMode) const; + + //- Return the edgeSearchDistCoeffSqr for conformation + // iterations for the given reconformationMode. + scalar edgeSearchDistCoeffSqrIteration(int reconfMode) const; + + //- Return the surfacePtReplaceDistCoeffSqr for initial + // conformation for the given reconformationMode. + scalar surfacePtReplaceDistCoeffSqrInitial(int reconfMode) const; + + //- Return the surfacePtReplaceDistCoeffSqr for + // conformation iterations for the given + // reconformationMode. + scalar surfacePtReplaceDistCoeffSqrIteration(int reconfMode) const; + + //- Return the maxConformationIterations for the given + // reconformationMode. + label maxConformationIterations(int reconfMode) const; + + //- Return the iterationToIntialHitRatioLimit for the + // given reconformationMode. + scalar iterationToIntialHitRatioLimit(int reconfMode) const; + //- Return the objOutput Switch inline Switch objOutput() const;