diff --git a/applications/solvers/compressible/rhoPimpleFoam/createFields.H b/applications/solvers/compressible/rhoPimpleFoam/createFields.H index d1ade4b457277fa1a0c35dfa3dd135c7b6b9917c..070f651a999296d7214d5f86e7fec2e021df2b58 100644 --- a/applications/solvers/compressible/rhoPimpleFoam/createFields.H +++ b/applications/solvers/compressible/rhoPimpleFoam/createFields.H @@ -39,15 +39,8 @@ #include "compressibleCreatePhi.H" - dimensionedScalar rhoMax - ( - mesh.solutionDict().subDict("PIMPLE").lookup("rhoMax") - ); - - dimensionedScalar rhoMin - ( - mesh.solutionDict().subDict("PIMPLE").lookup("rhoMin") - ); + dimensionedScalar rhoMax(pimple.dict().lookup("rhoMax")); + dimensionedScalar rhoMin(pimple.dict().lookup("rhoMin")); Info<< "Creating turbulence model\n" << endl; autoPtr<compressible::turbulenceModel> turbulence diff --git a/applications/solvers/compressible/rhoPimpleFoam/rhoPimpleFoam.C b/applications/solvers/compressible/rhoPimpleFoam/rhoPimpleFoam.C index 94f3f54de4577b0cce4c749b831133b5ec42c398..0336ceb74d708531aa00f5a6520bb3bb2197f08e 100644 --- a/applications/solvers/compressible/rhoPimpleFoam/rhoPimpleFoam.C +++ b/applications/solvers/compressible/rhoPimpleFoam/rhoPimpleFoam.C @@ -46,10 +46,13 @@ int main(int argc, char *argv[]) #include "setRootCase.H" #include "createTime.H" #include "createMesh.H" + + pimpleControl pimple(mesh); + #include "createFields.H" #include "initContinuityErrs.H" - pimpleControl pimple(mesh); + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // Info<< "\nStarting time loop\n" << endl; diff --git a/applications/solvers/compressible/rhoPimpleFoam/rhoPorousMRFPimpleFoam/rhoPorousMRFPimpleFoam.C b/applications/solvers/compressible/rhoPimpleFoam/rhoPorousMRFPimpleFoam/rhoPorousMRFPimpleFoam.C index 5bfbc84d5602851615dbc7626b2e969bb11a3638..8de8a412c350931914bad79d0434dcb051d63a43 100644 --- a/applications/solvers/compressible/rhoPimpleFoam/rhoPorousMRFPimpleFoam/rhoPorousMRFPimpleFoam.C +++ b/applications/solvers/compressible/rhoPimpleFoam/rhoPorousMRFPimpleFoam/rhoPorousMRFPimpleFoam.C @@ -48,12 +48,13 @@ int main(int argc, char *argv[]) #include "setRootCase.H" #include "createTime.H" #include "createMesh.H" + + pimpleControl pimple(mesh); + #include "createFields.H" #include "createZones.H" #include "initContinuityErrs.H" - pimpleControl pimple(mesh); - // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // Info<< "\nStarting time loop\n" << endl; diff --git a/applications/solvers/compressible/rhoSimpleFoam/createFields.H b/applications/solvers/compressible/rhoSimpleFoam/createFields.H index aa3de6d6fbfd9c462d57057451c9f723cede8221..27bfb8313317147b91ca84655b61e7086cf19975 100644 --- a/applications/solvers/compressible/rhoSimpleFoam/createFields.H +++ b/applications/solvers/compressible/rhoSimpleFoam/createFields.H @@ -42,17 +42,10 @@ label pRefCell = 0; scalar pRefValue = 0.0; - setRefCell(p, mesh.solutionDict().subDict("SIMPLE"), pRefCell, pRefValue); + setRefCell(p, simple.dict(), pRefCell, pRefValue); - dimensionedScalar rhoMax - ( - mesh.solutionDict().subDict("SIMPLE").lookup("rhoMax") - ); - - dimensionedScalar rhoMin - ( - mesh.solutionDict().subDict("SIMPLE").lookup("rhoMin") - ); + dimensionedScalar rhoMax(simple.dict().lookup("rhoMax")); + dimensionedScalar rhoMin(simple.dict().lookup("rhoMin")); Info<< "Creating turbulence model\n" << endl; autoPtr<compressible::RASModel> turbulence diff --git a/applications/solvers/compressible/rhoSimpleFoam/rhoPorousMRFSimpleFoam/createZones.H b/applications/solvers/compressible/rhoSimpleFoam/rhoPorousMRFSimpleFoam/createZones.H index 78a96429f6da7e213139d7c33c387ae137bd6642..0ed5afa2745897eea93992ba7cad5c8e6a5c6fc2 100644 --- a/applications/solvers/compressible/rhoSimpleFoam/rhoPorousMRFSimpleFoam/createZones.H +++ b/applications/solvers/compressible/rhoSimpleFoam/rhoPorousMRFSimpleFoam/createZones.H @@ -9,13 +9,7 @@ if (pZones.size()) { // nUCorrectors for pressureImplicitPorosity - if (mesh.solutionDict().subDict("SIMPLE").found("nUCorrectors")) - { - nUCorr = readInt - ( - mesh.solutionDict().subDict("SIMPLE").lookup("nUCorrectors") - ); - } + simple.dict().readIfPresent("nUCorrectors", nUCorr); if (nUCorr > 0) { diff --git a/applications/solvers/compressible/rhoSimpleFoam/rhoPorousMRFSimpleFoam/rhoPorousMRFSimpleFoam.C b/applications/solvers/compressible/rhoSimpleFoam/rhoPorousMRFSimpleFoam/rhoPorousMRFSimpleFoam.C index 5273f50eaa2ee32c0836f503faf0e9620093cc23..1cb421e5f41f9c306b3808b078994737cc903e68 100644 --- a/applications/solvers/compressible/rhoSimpleFoam/rhoPorousMRFSimpleFoam/rhoPorousMRFSimpleFoam.C +++ b/applications/solvers/compressible/rhoSimpleFoam/rhoPorousMRFSimpleFoam/rhoPorousMRFSimpleFoam.C @@ -45,12 +45,13 @@ int main(int argc, char *argv[]) #include "setRootCase.H" #include "createTime.H" #include "createMesh.H" + + simpleControl simple(mesh); + #include "createFields.H" #include "createZones.H" #include "initContinuityErrs.H" - simpleControl simple(mesh); - // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // Info<< "\nStarting time loop\n" << endl; diff --git a/applications/solvers/compressible/rhoSimpleFoam/rhoSimpleFoam.C b/applications/solvers/compressible/rhoSimpleFoam/rhoSimpleFoam.C index 454da314411c1cfd8e9fcff8a99df841a5214f21..e87a35fab27c22ecf7562a0dd4d204dd14b1f4ad 100644 --- a/applications/solvers/compressible/rhoSimpleFoam/rhoSimpleFoam.C +++ b/applications/solvers/compressible/rhoSimpleFoam/rhoSimpleFoam.C @@ -42,11 +42,12 @@ int main(int argc, char *argv[]) #include "setRootCase.H" #include "createTime.H" #include "createMesh.H" - #include "createFields.H" - #include "initContinuityErrs.H" simpleControl simple(mesh); + #include "createFields.H" + #include "initContinuityErrs.H" + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // Info<< "\nStarting time loop\n" << endl; diff --git a/applications/solvers/compressible/rhoSimplecFoam/createFields.H b/applications/solvers/compressible/rhoSimplecFoam/createFields.H index fab7b70048f6e147427cd3ba75ea545b88cd2e8f..46a382864e72740185c60ca49560ff95f2a2bfdb 100644 --- a/applications/solvers/compressible/rhoSimplecFoam/createFields.H +++ b/applications/solvers/compressible/rhoSimplecFoam/createFields.H @@ -41,17 +41,10 @@ label pRefCell = 0; scalar pRefValue = 0.0; - setRefCell(p, mesh.solutionDict().subDict("SIMPLE"), pRefCell, pRefValue); + setRefCell(p, simple.dict(), pRefCell, pRefValue); - dimensionedScalar rhoMax - ( - mesh.solutionDict().subDict("SIMPLE").lookup("rhoMax") - ); - - dimensionedScalar rhoMin - ( - mesh.solutionDict().subDict("SIMPLE").lookup("rhoMin") - ); + dimensionedScalar rhoMax(simple.dict().lookup("rhoMax")); + dimensionedScalar rhoMin(simple.dict().lookup("rhoMin")); Info<< "Creating turbulence model\n" << endl; autoPtr<compressible::RASModel> turbulence diff --git a/applications/solvers/compressible/rhoSimplecFoam/rhoSimplecFoam.C b/applications/solvers/compressible/rhoSimplecFoam/rhoSimplecFoam.C index 278e689bc27c2ee64eb69ceeb12094c01dd1b532..937358e0f5a83619655efca3ded9aece15e90838 100644 --- a/applications/solvers/compressible/rhoSimplecFoam/rhoSimplecFoam.C +++ b/applications/solvers/compressible/rhoSimplecFoam/rhoSimplecFoam.C @@ -44,11 +44,12 @@ int main(int argc, char *argv[]) #include "setRootCase.H" #include "createTime.H" #include "createMesh.H" - #include "createFields.H" - #include "initContinuityErrs.H" simpleControl simple(mesh); + #include "createFields.H" + #include "initContinuityErrs.H" + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // Info<< "\nStarting time loop\n" << endl; diff --git a/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.C b/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.C index 8707d021ade2e0ea7b9ead32bcd52ddd2b0a4642..87c3f13090bf012ef6f41d39361664e04167ea2a 100644 --- a/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.C +++ b/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.C @@ -59,36 +59,37 @@ bool Foam::pimpleControl::criteriaSatisfied() bool firstIter = corr_ == 1; bool achieved = true; - const dictionary& solverDict = mesh_.solverPerformanceDict(); + bool checked = false; // safety that some checks were indeed performed + const dictionary& solverDict = mesh_.solverPerformanceDict(); forAllConstIter(dictionary, solverDict, iter) { const word& variableName = iter().keyword(); - label fieldI = applyToField(variableName); + const label fieldI = applyToField(variableName); if (fieldI != -1) { const List<lduMatrix::solverPerformance> sp(iter().stream()); const scalar residual = sp.last().initialResidual(); + checked = true; + if (firstIter) { residualControl_[fieldI].initialResidual = sp.first().initialResidual(); } - bool absCheck = residual < residualControl_[fieldI].absTol; - + const bool absCheck = residual < residualControl_[fieldI].absTol; bool relCheck = false; scalar relative = 0.0; if (!firstIter) { - scalar iniRes = + const scalar iniRes = residualControl_[fieldI].initialResidual + ROOTVSMALL; relative = residual/iniRes; - relCheck = relative < residualControl_[fieldI].relTol; } @@ -110,7 +111,7 @@ bool Foam::pimpleControl::criteriaSatisfied() } } - return achieved; + return checked && achieved; } @@ -129,7 +130,13 @@ Foam::pimpleControl::pimpleControl(fvMesh& mesh) if (nOuterCorr_ > 1) { Info<< nl; - if (!residualControl_.empty()) + if (residualControl_.empty()) + { + Info<< algorithmName_ << ": no residual control data found. " + << "Calculations will employ " << nOuterCorr_ + << " corrector loops" << nl << endl; + } + else { Info<< algorithmName_ << ": max iterations = " << nOuterCorr_ << endl; @@ -142,12 +149,6 @@ Foam::pimpleControl::pimpleControl(fvMesh& mesh) } Info<< endl; } - else - { - Info<< algorithmName_ << ": no residual control data found. " << nl - << "Calculations will employ " << nOuterCorr_ - << " corrector loops" << nl << endl; - } } else { diff --git a/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.H b/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.H index 54831aa97d9bcee309dd2295019ae8fa5579bc28..3b891a5aa93097e3041aa042b97ee8482b3c17f6 100644 --- a/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.H +++ b/src/finiteVolume/cfdTools/general/solutionControl/pimpleControl/pimpleControl.H @@ -69,10 +69,10 @@ protected: // Protected Member Functions - //- Read constrols from fvSolution dictionary + //- Read controls from fvSolution dictionary virtual void read(); - //- Return true if all convergence checks are satified + //- Return true if all convergence checks are satisfied virtual bool criteriaSatisfied(); //- Disallow default bitwise copy construct diff --git a/src/finiteVolume/cfdTools/general/solutionControl/simpleControl/simpleControl.C b/src/finiteVolume/cfdTools/general/solutionControl/simpleControl/simpleControl.C index f40f19e04af6ba8ad3886ea425edc0a95120e683..d2b603a5e01961e43e2ef3fa3c4344de0a3497ce 100644 --- a/src/finiteVolume/cfdTools/general/solutionControl/simpleControl/simpleControl.C +++ b/src/finiteVolume/cfdTools/general/solutionControl/simpleControl/simpleControl.C @@ -50,17 +50,20 @@ bool Foam::simpleControl::criteriaSatisfied() } bool achieved = true; - const dictionary& solverDict = mesh_.solverPerformanceDict(); + bool checked = false; // safety that some checks were indeed performed + const dictionary& solverDict = mesh_.solverPerformanceDict(); forAllConstIter(dictionary, solverDict, iter) { const word& variableName = iter().keyword(); - label fieldI = applyToField(variableName); + const label fieldI = applyToField(variableName); if (fieldI != -1) { const List<lduMatrix::solverPerformance> sp(iter().stream()); const scalar residual = sp.first().initialResidual(); + checked = true; + bool absCheck = residual < residualControl_[fieldI].absTol; achieved = achieved && absCheck; @@ -75,7 +78,7 @@ bool Foam::simpleControl::criteriaSatisfied() } } - return achieved; + return checked && achieved; } @@ -90,7 +93,13 @@ Foam::simpleControl::simpleControl(fvMesh& mesh) Info<< nl; - if (residualControl_.size() > 0) + if (residualControl_.empty()) + { + Info<< algorithmName_ << ": no convergence criteria found. " + << "Calculations will run for " << mesh_.time().endTime().value() + << " steps." << nl << endl; + } + else { Info<< algorithmName_ << ": convergence criteria" << nl; forAll(residualControl_, i) @@ -101,12 +110,6 @@ Foam::simpleControl::simpleControl(fvMesh& mesh) } Info<< endl; } - else - { - Info<< algorithmName_ << ": no convergence criteria found. " - << "Calculations will run for " << mesh_.time().endTime().value() - << " steps." << nl << endl; - } } diff --git a/src/finiteVolume/cfdTools/general/solutionControl/simpleControl/simpleControl.H b/src/finiteVolume/cfdTools/general/solutionControl/simpleControl/simpleControl.H index e4a2e69cbaea328c943ee04522ccf310983c3d02..ee718ce424b884e6c894e2c1acdb12e5888397ca 100644 --- a/src/finiteVolume/cfdTools/general/solutionControl/simpleControl/simpleControl.H +++ b/src/finiteVolume/cfdTools/general/solutionControl/simpleControl/simpleControl.H @@ -59,10 +59,10 @@ protected: // Protected Member Functions - //- Read constrols from fvSolution dictionary + //- Read controls from fvSolution dictionary void read(); - //- Return true if all convergence checks are satified + //- Return true if all convergence checks are satisfied bool criteriaSatisfied(); //- Disallow default bitwise copy construct diff --git a/src/finiteVolume/cfdTools/general/solutionControl/solutionControl/solutionControl.H b/src/finiteVolume/cfdTools/general/solutionControl/solutionControl/solutionControl.H index 75565551a290e5b4d9a6dd736f73ed8b188457bc..82dd73dd9a11d9ee814f391f2dde40d82f08957d 100644 --- a/src/finiteVolume/cfdTools/general/solutionControl/solutionControl/solutionControl.H +++ b/src/finiteVolume/cfdTools/general/solutionControl/solutionControl/solutionControl.H @@ -40,7 +40,7 @@ namespace Foam { /*---------------------------------------------------------------------------*\ - Class solutionControl Declaration + Class solutionControl Declaration \*---------------------------------------------------------------------------*/ class solutionControl @@ -78,19 +78,19 @@ protected: //- Flag to indicate to solve for momentum bool momentumPredictor_; - //- Flag to indictae to solve using transonic algorithm + //- Flag to indicate to solve using transonic algorithm bool transonic_; // Protected Member Functions - //- Read constrols from fvSolution dictionary + //- Read controls from fvSolution dictionary virtual void read(const bool absTolOnly); //- Return index of field in residualControl_ if present virtual label applyToField(const word& fieldName) const; - //- Return true if all convergence checks are satified + //- Return true if all convergence checks are satisfied virtual bool criteriaSatisfied() = 0; //- Store previous iteration fields @@ -142,7 +142,7 @@ public: //- Flag to indicate to solve for momentum inline bool momentumPredictor() const; - //- Flag to indictae to solve using transonic algorithm + //- Flag to indicate to solve using transonic algorithm inline bool transonic() const; }; diff --git a/src/finiteVolume/fields/fvPatchFields/derived/mappedField/mappedFieldFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/derived/mappedField/mappedFieldFvPatchField.C index 19aeaa4a5a1b2d4d78a5db22ba9778e02863b1d7..ae597b4bfccd5b97ef7a2cda69a9623c62b4d16f 100644 --- a/src/finiteVolume/fields/fvPatchFields/derived/mappedField/mappedFieldFvPatchField.C +++ b/src/finiteVolume/fields/fvPatchFields/derived/mappedField/mappedFieldFvPatchField.C @@ -227,7 +227,6 @@ void mappedFieldFvPatchField<Type>::updateCoeffs() const fieldType& nbrField = sampleField(); - const mapDistribute& distMap = mappedPatchBase::map(); newValues = nbrField.boundaryField()[nbrPatchID]; this->distribute(newValues); diff --git a/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/SurfaceFilmModel/SurfaceFilmModel.C b/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/SurfaceFilmModel/SurfaceFilmModel.C index 36dca28f6a4fcc09a01204b36abd82060d122f76..d080a624a2f68ca809fbcac43d5bdeaa1716ab1b 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/SurfaceFilmModel/SurfaceFilmModel.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/SurfaceFilmModel/SurfaceFilmModel.C @@ -114,8 +114,8 @@ bool Foam::SurfaceFilmModel<CloudType>::transferParcel "bool Foam::SurfaceFilmModel<CloudType>::transferParcel" "(" "parcelType&, " - "const label, " - "const bool&" + "const polyPatch&, " + "bool&" ")" ); @@ -156,11 +156,9 @@ void Foam::SurfaceFilmModel<CloudType>::inject(TrackData& td) const label filmPatchI = filmPatches[i]; const label primaryPatchI = primaryPatches[i]; - const mappedPatchBase& mapPatch = filmModel.mappedPatches()[filmPatchI]; - const labelList& injectorCellsPatch = pbm[primaryPatchI].faceCells(); - cacheFilmFields(filmPatchI, primaryPatchI, mapPatch, filmModel); + cacheFilmFields(filmPatchI, primaryPatchI, filmModel); const vectorField& Cf = mesh.C().boundaryField()[primaryPatchI]; const vectorField& Sf = mesh.Sf().boundaryField()[primaryPatchI]; @@ -172,13 +170,11 @@ void Foam::SurfaceFilmModel<CloudType>::inject(TrackData& td) { const label cellI = injectorCellsPatch[j]; - // The position is at the cell centre, which could be - // in any tet of the decomposed cell, so arbitrarily - // choose the first face of the cell as the tetFace - // and the first point on the face after the base - // point as the tetPt. The tracking will - // pick the cell consistent with the motion in the - // first tracking step. + // The position could bein any tet of the decomposed cell, + // so arbitrarily choose the first face of the cell as the + // tetFace and the first point on the face after the base + // point as the tetPt. The tracking will pick the cell + // consistent with the motion in the first tracking step. const label tetFaceI = this->owner().mesh().cells()[cellI][0]; const label tetPtI = 1; @@ -208,14 +204,22 @@ void Foam::SurfaceFilmModel<CloudType>::inject(TrackData& td) setParcelProperties(*pPtr, j); - // Check new parcel properties -// td.cloud().checkParcelProperties(*pPtr, 0.0, true); - td.cloud().checkParcelProperties(*pPtr, 0.0, false); - - // Add the new parcel to the cloud - td.cloud().addParticle(pPtr); - - nParcelsInjected_++; + if (pPtr->nParticle() > 0.001) + { + // Check new parcel properties + // td.cloud().checkParcelProperties(*pPtr, 0.0, true); + td.cloud().checkParcelProperties(*pPtr, 0.0, false); + + // Add the new parcel to the cloud + td.cloud().addParticle(pPtr); + + nParcelsInjected_++; + } + else + { + // TODO: cache mass and re-distribute? + delete pPtr; + } } } } @@ -227,26 +231,25 @@ void Foam::SurfaceFilmModel<CloudType>::cacheFilmFields ( const label filmPatchI, const label primaryPatchI, - const mappedPatchBase& mapPatch, const regionModels::surfaceFilmModels::surfaceFilmModel& filmModel ) { massParcelPatch_ = filmModel.cloudMassTrans().boundaryField()[filmPatchI]; - mapPatch.distribute(massParcelPatch_); + filmModel.toPrimary(filmPatchI, massParcelPatch_); diameterParcelPatch_ = filmModel.cloudDiameterTrans().boundaryField()[filmPatchI]; - mapPatch.distribute(diameterParcelPatch_); + filmModel.toPrimary(filmPatchI, diameterParcelPatch_); UFilmPatch_ = filmModel.Us().boundaryField()[filmPatchI]; - mapPatch.distribute(UFilmPatch_); + filmModel.toPrimary(filmPatchI, UFilmPatch_); rhoFilmPatch_ = filmModel.rho().boundaryField()[filmPatchI]; - mapPatch.distribute(rhoFilmPatch_); + filmModel.toPrimary(filmPatchI, rhoFilmPatch_); deltaFilmPatch_[primaryPatchI] = filmModel.delta().boundaryField()[filmPatchI]; - mapPatch.distribute(deltaFilmPatch_[primaryPatchI]); + filmModel.toPrimary(filmPatchI, deltaFilmPatch_[primaryPatchI]); } diff --git a/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/SurfaceFilmModel/SurfaceFilmModel.H b/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/SurfaceFilmModel/SurfaceFilmModel.H index ae35db7ec57e9babb1e9a5d22f2442605efd9f0c..967e748f56c8385483aca4dd3c2f4f280fa42da6 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/SurfaceFilmModel/SurfaceFilmModel.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/SurfaceFilmModel/SurfaceFilmModel/SurfaceFilmModel.H @@ -116,7 +116,6 @@ protected: ( const label filmPatchI, const label primaryPatchI, - const mappedPatchBase& mapPatch, const regionModels::surfaceFilmModels::surfaceFilmModel& filmModel ); diff --git a/src/lagrangian/intermediate/submodels/Thermodynamic/SurfaceFilmModel/ThermoSurfaceFilm/ThermoSurfaceFilm.C b/src/lagrangian/intermediate/submodels/Thermodynamic/SurfaceFilmModel/ThermoSurfaceFilm/ThermoSurfaceFilm.C index c6f4b4054a84ce8434935a81a179c3495890079c..6a6c60db3984390169d526e356537dd40f29575a 100644 --- a/src/lagrangian/intermediate/submodels/Thermodynamic/SurfaceFilmModel/ThermoSurfaceFilm/ThermoSurfaceFilm.C +++ b/src/lagrangian/intermediate/submodels/Thermodynamic/SurfaceFilmModel/ThermoSurfaceFilm/ThermoSurfaceFilm.C @@ -643,7 +643,6 @@ void Foam::ThermoSurfaceFilm<CloudType>::cacheFilmFields ( const label filmPatchI, const label primaryPatchI, - const mappedPatchBase& mapPatch, const regionModels::surfaceFilmModels::surfaceFilmModel& filmModel ) { @@ -651,15 +650,14 @@ void Foam::ThermoSurfaceFilm<CloudType>::cacheFilmFields ( filmPatchI, primaryPatchI, - mapPatch, filmModel ); TFilmPatch_ = filmModel.Ts().boundaryField()[filmPatchI]; - mapPatch.distribute(TFilmPatch_); + filmModel.toPrimary(filmPatchI, TFilmPatch_); CpFilmPatch_ = filmModel.Cp().boundaryField()[filmPatchI]; - mapPatch.distribute(CpFilmPatch_); + filmModel.toPrimary(filmPatchI, CpFilmPatch_); } diff --git a/src/lagrangian/intermediate/submodels/Thermodynamic/SurfaceFilmModel/ThermoSurfaceFilm/ThermoSurfaceFilm.H b/src/lagrangian/intermediate/submodels/Thermodynamic/SurfaceFilmModel/ThermoSurfaceFilm/ThermoSurfaceFilm.H index 66bd1395682b2b38de27006916ed5ab74e42604a..bddbfcc66e9f28034472ff045a00e984850fc896 100644 --- a/src/lagrangian/intermediate/submodels/Thermodynamic/SurfaceFilmModel/ThermoSurfaceFilm/ThermoSurfaceFilm.H +++ b/src/lagrangian/intermediate/submodels/Thermodynamic/SurfaceFilmModel/ThermoSurfaceFilm/ThermoSurfaceFilm.H @@ -227,7 +227,6 @@ protected: ( const label filmPatchI, const label primaryPatchI, - const mappedPatchBase& distMap, const regionModels::surfaceFilmModels::surfaceFilmModel& filmModel ); diff --git a/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolation.C b/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolation.C index aa638ebd3876a9ee9e7439cd4dc2fec1e6829d8c..535583a9e13578de3a750ce3804e15122273fc17 100644 --- a/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolation.C +++ b/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolation.C @@ -119,6 +119,37 @@ void Foam::AMIInterpolation<SourcePatch, TargetPatch>::checkPatches } +template<class SourcePatch, class TargetPatch> +bool Foam::AMIInterpolation<SourcePatch, TargetPatch>::distributed +( + const primitivePatch& srcPatch, + const primitivePatch& tgtPatch +) +{ + if (Pstream::parRun()) + { + List<label> facesPresentOnProc(Pstream::nProcs(), 0); + if ((srcPatch.size() > 0) || (tgtPatch.size() > 0)) + { + facesPresentOnProc[Pstream::myProcNo()] = 1; + } + else + { + facesPresentOnProc[Pstream::myProcNo()] = 0; + } + + Pstream::gatherList(facesPresentOnProc); + Pstream::scatterList(facesPresentOnProc); + if (sum(facesPresentOnProc) > 1) + { + return true; + } + } + + return false; +} + + template<class SourcePatch, class TargetPatch> Foam::label Foam::AMIInterpolation<SourcePatch, TargetPatch>::calcOverlappingProcs @@ -1160,7 +1191,7 @@ void Foam::AMIInterpolation<SourcePatch, TargetPatch>::update { static label patchI = 0; - if (Pstream::parRun()) + if (Pstream::parRun() && distributed(srcPatch, tgtPatch)) { // convert local addressing to global addressing globalIndex globalSrcFaces(srcPatch.size()); diff --git a/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolation.H b/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolation.H index 8ad3be39ba079b7f9d4aa2782220acc563603bea..b9d73f24ee3446bae541fea490636b7d0a56df8d 100644 --- a/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolation.H +++ b/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolation.H @@ -167,6 +167,13 @@ class AMIInterpolation // Parallel functionality + //- Return true if faces are spread over multiple domains + bool distributed + ( + const primitivePatch& srcPatch, + const primitivePatch& tgtPatch + ); + label calcOverlappingProcs ( const List<treeBoundBoxList>& procBb, diff --git a/src/meshTools/mappedPatches/mappedPolyPatch/mappedPatchBase.H b/src/meshTools/mappedPatches/mappedPolyPatch/mappedPatchBase.H index 8ee8022f6c85c3d0ab63c49ec3ee0b652c273cfd..3afb9d8c4b67824509e38506fd377a4766d5885c 100644 --- a/src/meshTools/mappedPatches/mappedPolyPatch/mappedPatchBase.H +++ b/src/meshTools/mappedPatches/mappedPolyPatch/mappedPatchBase.H @@ -339,6 +339,26 @@ public: } + //- Wrapper around map/interpolate data distribution + template<class Type> + void reverseDistribute(List<Type>& lst) const + { + switch (mode_) + { + case NEARESTPATCHFACEAMI: + { + lst = AMI().interpolateToTarget(Field<Type>(lst.xfer())); + break; + } + default: + { + label cSize = patch_.size(); + map().reverseDistribute(cSize, lst); + } + } + } + + //- Return reference to the parallel distribution map const mapDistribute& map() const { diff --git a/src/regionModels/regionCoupling/derivedFvPatchFields/filmPyrolysisTemperatureCoupled/filmPyrolysisTemperatureCoupledFvPatchScalarField.C b/src/regionModels/regionCoupling/derivedFvPatchFields/filmPyrolysisTemperatureCoupled/filmPyrolysisTemperatureCoupledFvPatchScalarField.C index 8351d49d2da3ecc1cc8b04df86ad661bffffff0b..b0f8d1629a919d008f1267e6dcb99cc5562aef3b 100644 --- a/src/regionModels/regionCoupling/derivedFvPatchFields/filmPyrolysisTemperatureCoupled/filmPyrolysisTemperatureCoupledFvPatchScalarField.C +++ b/src/regionModels/regionCoupling/derivedFvPatchFields/filmPyrolysisTemperatureCoupled/filmPyrolysisTemperatureCoupledFvPatchScalarField.C @@ -151,13 +151,11 @@ void Foam::filmPyrolysisTemperatureCoupledFvPatchScalarField::updateCoeffs() const label filmPatchI = filmModel.regionPatchID(patchI); - const mappedPatchBase& filmMap = filmModel.mappedPatches()[filmPatchI]; - scalarField deltaFilm = filmModel.delta().boundaryField()[filmPatchI]; - filmMap.distribute(deltaFilm); + filmModel.toPrimary(filmPatchI, deltaFilm); scalarField TFilm = filmModel.Ts().boundaryField()[filmPatchI]; - filmMap.distribute(TFilm); + filmModel.toPrimary(filmPatchI, TFilm); // Retrieve pyrolysis model @@ -166,10 +164,8 @@ void Foam::filmPyrolysisTemperatureCoupledFvPatchScalarField::updateCoeffs() const label pyrPatchI = pyrModel.regionPatchID(patchI); - const mappedPatchBase& pyrMap = pyrModel.mappedPatches()[pyrPatchI]; - scalarField TPyr = pyrModel.T().boundaryField()[pyrPatchI]; - pyrMap.distribute(TPyr); + pyrModel.toPrimary(pyrPatchI, TPyr); forAll(deltaFilm, i) diff --git a/src/regionModels/regionCoupling/derivedFvPatchFields/filmPyrolysisVelocityCoupled/filmPyrolysisVelocityCoupledFvPatchVectorField.C b/src/regionModels/regionCoupling/derivedFvPatchFields/filmPyrolysisVelocityCoupled/filmPyrolysisVelocityCoupledFvPatchVectorField.C index a516534fa81d8b88fa72f28159f6175a893169ed..29b3e345868bcc112d33535b76bb42e1f89448f6 100644 --- a/src/regionModels/regionCoupling/derivedFvPatchFields/filmPyrolysisVelocityCoupled/filmPyrolysisVelocityCoupledFvPatchVectorField.C +++ b/src/regionModels/regionCoupling/derivedFvPatchFields/filmPyrolysisVelocityCoupled/filmPyrolysisVelocityCoupledFvPatchVectorField.C @@ -154,13 +154,11 @@ void Foam::filmPyrolysisVelocityCoupledFvPatchVectorField::updateCoeffs() const label filmPatchI = filmModel.regionPatchID(patchI); - const mappedPatchBase& filmMap = filmModel.mappedPatches()[filmPatchI]; - scalarField deltaFilm = filmModel.delta().boundaryField()[filmPatchI]; - filmMap.distribute(deltaFilm); + filmModel.toPrimary(filmPatchI, deltaFilm); vectorField UFilm = filmModel.Us().boundaryField()[filmPatchI]; - filmMap.distribute(UFilm); + filmModel.toPrimary(filmPatchI, UFilm); // Retrieve pyrolysis model @@ -172,10 +170,8 @@ void Foam::filmPyrolysisVelocityCoupledFvPatchVectorField::updateCoeffs() const label pyrPatchI = pyrModel.regionPatchID(patchI); - const mappedPatchBase& pyrMap = pyrModel.mappedPatches()[pyrPatchI]; - scalarField phiPyr = pyrModel.phiGas().boundaryField()[pyrPatchI]; - pyrMap.distribute(phiPyr); + pyrModel.toPrimary(pyrPatchI, phiPyr); const surfaceScalarField& phi = diff --git a/src/regionModels/regionModel/regionModel/regionModel.C b/src/regionModels/regionModel/regionModel/regionModel.C index 1d74a9c6465fd62809fb415218797839a51b5f6d..f7f630147eb734424cf6ea8cab833d636df100c6 100644 --- a/src/regionModels/regionModel/regionModel/regionModel.C +++ b/src/regionModels/regionModel/regionModel/regionModel.C @@ -93,8 +93,6 @@ void Foam::regionModels::regionModel::initialise() DynamicList<label> primaryPatchIDs; DynamicList<label> intCoupledPatchIDs; const polyBoundaryMesh& rbm = regionMesh().boundaryMesh(); - const polyBoundaryMesh& pbm = primaryMesh().boundaryMesh(); - mappedPatches_.setSize(rbm.size()); forAll(rbm, patchI) { @@ -116,19 +114,6 @@ void Foam::regionModels::regionModel::initialise() const label primaryPatchI = mapPatch.samplePolyPatch().index(); primaryPatchIDs.append(primaryPatchI); - - mappedPatches_.set - ( - patchI, - new mappedPatchBase - ( - pbm[primaryPatchI], - regionMesh().name(), - mapPatch.mode(), - regionPatch.name(), - vector::zero - ) - ); } } @@ -212,8 +197,7 @@ Foam::regionModels::regionModel::regionModel(const fvMesh& mesh) regionMeshPtr_(NULL), coeffs_(dictionary::null), primaryPatchIDs_(), - intCoupledPatchIDs_(), - mappedPatches_() + intCoupledPatchIDs_() {} @@ -244,8 +228,7 @@ Foam::regionModels::regionModel::regionModel regionMeshPtr_(NULL), coeffs_(subOrEmptyDict(modelName + "Coeffs")), primaryPatchIDs_(), - intCoupledPatchIDs_(), - mappedPatches_() + intCoupledPatchIDs_() { if (active_) { @@ -290,8 +273,7 @@ Foam::regionModels::regionModel::regionModel regionMeshPtr_(NULL), coeffs_(dict.subOrEmptyDict(modelName + "Coeffs")), primaryPatchIDs_(), - intCoupledPatchIDs_(), - mappedPatches_() + intCoupledPatchIDs_() { if (active_) { diff --git a/src/regionModels/regionModel/regionModel/regionModel.H b/src/regionModels/regionModel/regionModel/regionModel.H index bc9fb54a335335be346beefd7807d3784dd7090a..2af98421d108216d76b5606f0ff7d3bf4abc28cc 100644 --- a/src/regionModels/regionModel/regionModel/regionModel.H +++ b/src/regionModels/regionModel/regionModel/regionModel.H @@ -117,9 +117,6 @@ protected: //- List of patch IDs internally coupled with the primary region labelList intCoupledPatchIDs_; - //- List of patch map info - PtrList<mappedPatchBase> mappedPatches_; - // Protected member functions @@ -212,13 +209,29 @@ public: // primary region inline const labelList& intCoupledPatchIDs() const; - //- Return the list of patch map info - inline const PtrList<mappedPatchBase>& mappedPatches() const; - //- Return region ID corresponding to primaryPatchID inline label regionPatchID(const label primaryPatchID) const; + // Helper + + //- Convert a local region field to the primary region + template<class Type> + void toPrimary + ( + const label regionPatchI, + List<Type>& regionField + ) const; + + //- Convert a primary region field to the local region + template<class Type> + void toRegion + ( + const label regionPatchI, + List<Type>& primaryFieldField + ) const; + + // Evolution //- Pre-evolve region @@ -249,6 +262,12 @@ public: // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +#ifdef NoRepository + #include "regionModelTemplates.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + #endif // ************************************************************************* // diff --git a/src/regionModels/regionModel/regionModel/regionModelI.H b/src/regionModels/regionModel/regionModel/regionModelI.H index 197e663d503e2a5dd72eaab257018a5184cebe99..a0e43403f7021bed6682847a1d1d82337304ca5f 100644 --- a/src/regionModels/regionModel/regionModel/regionModelI.H +++ b/src/regionModels/regionModel/regionModel/regionModelI.H @@ -132,13 +132,6 @@ Foam::regionModels::regionModel::intCoupledPatchIDs() const } -inline const Foam::PtrList<Foam::mappedPatchBase>& -Foam::regionModels::regionModel::mappedPatches() const -{ - return mappedPatches_; -} - - inline Foam::label Foam::regionModels::regionModel::regionPatchID ( const label primaryPatchID diff --git a/src/regionModels/regionModel/regionModel/regionModelTemplates.C b/src/regionModels/regionModel/regionModel/regionModelTemplates.C new file mode 100644 index 0000000000000000000000000000000000000000..977da7dd8167df5a3b5acf703cc09f434602c5b6 --- /dev/null +++ b/src/regionModels/regionModel/regionModel/regionModelTemplates.C @@ -0,0 +1,80 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation + \\/ 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 3 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, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +template<class Type> +void Foam::regionModels::regionModel::toPrimary +( + const label regionPatchI, + List<Type>& regionField +) const +{ + forAll(intCoupledPatchIDs_, i) + { + if (intCoupledPatchIDs_[i] == regionPatchI) + { + const mappedPatchBase& mpb = + refCast<const mappedPatchBase> + ( + regionMesh().boundaryMesh()[regionPatchI] + ); + mpb.reverseDistribute(regionField); + return; + } + } + + FatalErrorIn("const void toPrimary(const label, List<Type>&) const") + << "Region patch ID " << regionPatchI << " not found in region mesh" + << abort(FatalError); +} + + +template<class Type> +void Foam::regionModels::regionModel::toRegion +( + const label regionPatchI, + List<Type>& primaryField +) const +{ + forAll(intCoupledPatchIDs_, i) + { + if (intCoupledPatchIDs_[i] == regionPatchI) + { + const mappedPatchBase& mpb = + refCast<const mappedPatchBase> + ( + regionMesh().boundaryMesh()[regionPatchI] + ); + mpb.distribute(primaryField); + return; + } + } + + FatalErrorIn("const void toRegion(const label, List<Type>&) const") + << "Region patch ID " << regionPatchI << " not found in region mesh" + << abort(FatalError); +} + + +// ************************************************************************* // diff --git a/src/regionModels/surfaceFilmModels/derivedFvPatchFields/wallFunctions/alphatFilmWallFunction/alphatFilmWallFunctionFvPatchScalarField.C b/src/regionModels/surfaceFilmModels/derivedFvPatchFields/wallFunctions/alphatFilmWallFunction/alphatFilmWallFunctionFvPatchScalarField.C index 8b8ef3be1fbbb1001e5188696705ad0ce5de078f..fd3be5ac38564d18c5fb6e02478b04c3d0d65822 100644 --- a/src/regionModels/surfaceFilmModels/derivedFvPatchFields/wallFunctions/alphatFilmWallFunction/alphatFilmWallFunctionFvPatchScalarField.C +++ b/src/regionModels/surfaceFilmModels/derivedFvPatchFields/wallFunctions/alphatFilmWallFunction/alphatFilmWallFunctionFvPatchScalarField.C @@ -158,11 +158,9 @@ void alphatFilmWallFunctionFvPatchScalarField::updateCoeffs() const label filmPatchI = filmModel.regionPatchID(patchI); - const mappedPatchBase& filmMap = filmModel.mappedPatches()[filmPatchI]; - tmp<volScalarField> mDotFilm(filmModel.primaryMassTrans()); scalarField mDotFilmp = mDotFilm().boundaryField()[filmPatchI]; - filmMap.distribute(mDotFilmp); + filmModel.toPrimary(filmPatchI, mDotFilmp); // Retrieve RAS turbulence model const RASModel& rasModel = db().lookupObject<RASModel>("RASProperties"); diff --git a/src/regionModels/surfaceFilmModels/derivedFvPatchFields/wallFunctions/mutkFilmWallFunction/mutkFilmWallFunctionFvPatchScalarField.C b/src/regionModels/surfaceFilmModels/derivedFvPatchFields/wallFunctions/mutkFilmWallFunction/mutkFilmWallFunctionFvPatchScalarField.C index 8cd0aaf5aa455cf2374442535a03457fc8ef16b9..7374f80e034b2191b6dceeb2500308642c87d1a8 100644 --- a/src/regionModels/surfaceFilmModels/derivedFvPatchFields/wallFunctions/mutkFilmWallFunction/mutkFilmWallFunctionFvPatchScalarField.C +++ b/src/regionModels/surfaceFilmModels/derivedFvPatchFields/wallFunctions/mutkFilmWallFunction/mutkFilmWallFunctionFvPatchScalarField.C @@ -70,11 +70,9 @@ tmp<scalarField> mutkFilmWallFunctionFvPatchScalarField::calcUTau const label filmPatchI = filmModel.regionPatchID(patchI); - const mappedPatchBase& filmMap = filmModel.mappedPatches()[filmPatchI]; - tmp<volScalarField> mDotFilm(filmModel.primaryMassTrans()); scalarField mDotFilmp = mDotFilm().boundaryField()[filmPatchI]; - filmMap.distribute(mDotFilmp); + filmModel.toPrimary(filmPatchI, mDotFilmp); // Retrieve RAS turbulence model diff --git a/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayer.C b/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayer.C index 461fbd10ae9da1509c56a4474a207959bfcc1cd2..a448083f997ce136619e8e4bfab473af3ef6629d 100644 --- a/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayer.C +++ b/src/regionModels/surfaceFilmModels/kinematicSingleLayer/kinematicSingleLayer.C @@ -827,7 +827,7 @@ void kinematicSingleLayer::preEvolveRegion() // availableMass_ = mass(); availableMass_ = netMass(); cloudMassTrans_ == dimensionedScalar("zero", dimMass, 0.0); - cloudDiameterTrans_ == dimensionedScalar("zero", dimLength, -1.0); + cloudDiameterTrans_ == dimensionedScalar("zero", dimLength, 0.0); } diff --git a/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/drippingInjection/drippingInjection.C b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/drippingInjection/drippingInjection.C index 076e6abb231a74b092748953034069ac39ac7c8c..e271674b10d551e594e5752a71427aca98eae0ba 100644 --- a/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/drippingInjection/drippingInjection.C +++ b/src/regionModels/surfaceFilmModels/submodels/kinematic/injectionModel/drippingInjection/drippingInjection.C @@ -139,7 +139,7 @@ void drippingInjection::correct { // Mass below minimum threshold - cannot be injected massToInject[cellI] = 0.0; - diameterToInject[cellI] = -1.0; + diameterToInject[cellI] = 0.0; } } } diff --git a/src/regionModels/surfaceFilmModels/thermoSingleLayer/thermoSingleLayer.C b/src/regionModels/surfaceFilmModels/thermoSingleLayer/thermoSingleLayer.C index c6c373500f5848da211c4df8f04527ca2d4cdbb5..c405d98fa9fc20206f80cf1ad33f7cca8289f4f8 100644 --- a/src/regionModels/surfaceFilmModels/thermoSingleLayer/thermoSingleLayer.C +++ b/src/regionModels/surfaceFilmModels/thermoSingleLayer/thermoSingleLayer.C @@ -705,12 +705,11 @@ tmp<DimensionedField<scalar, volMesh> > thermoSingleLayer::Srho() const forAll(intCoupledPatchIDs(), i) { const label filmPatchI = intCoupledPatchIDs()[i]; - const mappedPatchBase& filmMap = mappedPatches_[filmPatchI]; scalarField patchMass = primaryMassPCTrans_.boundaryField()[filmPatchI]; - filmMap.distribute(patchMass); + toPrimary(filmPatchI, patchMass); const label primaryPatchI = primaryPatchIDs()[i]; const unallocLabelList& cells = @@ -761,12 +760,11 @@ tmp<DimensionedField<scalar, volMesh> > thermoSingleLayer::Srho forAll(intCoupledPatchIDs_, i) { const label filmPatchI = intCoupledPatchIDs_[i]; - const mappedPatchBase& filmMap = mappedPatches_[filmPatchI]; scalarField patchMass = primaryMassPCTrans_.boundaryField()[filmPatchI]; - filmMap.distribute(patchMass); + toPrimary(filmPatchI, patchMass); const label primaryPatchI = primaryPatchIDs()[i]; const unallocLabelList& cells = @@ -812,12 +810,11 @@ tmp<DimensionedField<scalar, volMesh> > thermoSingleLayer::Sh() const forAll(intCoupledPatchIDs_, i) { const label filmPatchI = intCoupledPatchIDs_[i]; - const mappedPatchBase& filmMap = mappedPatches_[filmPatchI]; scalarField patchEnergy = primaryEnergyPCTrans_.boundaryField()[filmPatchI]; - filmMap.distribute(patchEnergy); + toPrimary(filmPatchI, patchEnergy); const label primaryPatchI = primaryPatchIDs()[i]; const unallocLabelList& cells =