diff --git a/applications/modules/VoFSolver/VoFSolver.C b/applications/modules/VoFSolver/VoFSolver.C index 099c960340..df7fccd34f 100644 --- a/applications/modules/VoFSolver/VoFSolver.C +++ b/applications/modules/VoFSolver/VoFSolver.C @@ -197,9 +197,6 @@ Foam::scalar Foam::solvers::VoFSolver::maxDeltaT() const void Foam::solvers::VoFSolver::preSolve() { - // Read the controls - readControls(); - if ((mesh.dynamic() || MRF.size()) && !Uf.valid()) { Info<< "Constructing face momentum Uf" << endl; diff --git a/applications/modules/compressibleMultiphaseVoF/compressibleMultiphaseVoF.C b/applications/modules/compressibleMultiphaseVoF/compressibleMultiphaseVoF.C index a15dbeee35..efead45ac7 100644 --- a/applications/modules/compressibleMultiphaseVoF/compressibleMultiphaseVoF.C +++ b/applications/modules/compressibleMultiphaseVoF/compressibleMultiphaseVoF.C @@ -92,9 +92,6 @@ Foam::solvers::compressibleMultiphaseVoF::compressibleMultiphaseVoF momentumTransport(momentumTransport_()) { - // Read the controls - readControls(); - if (correctPhi || mesh.topoChanging()) { rAU = new volScalarField diff --git a/applications/modules/compressibleVoF/compressibleVoF.C b/applications/modules/compressibleVoF/compressibleVoF.C index d9b391e8fd..9999558f61 100644 --- a/applications/modules/compressibleVoF/compressibleVoF.C +++ b/applications/modules/compressibleVoF/compressibleVoF.C @@ -109,9 +109,6 @@ Foam::solvers::compressibleVoF::compressibleVoF(fvMesh& mesh) mixture(mixture_) { - // Read the controls - readControls(); - if (correctPhi || mesh.topoChanging()) { rAU = new volScalarField diff --git a/applications/modules/fluidSolver/fluidSolver.C b/applications/modules/fluidSolver/fluidSolver.C index 810ab3fca2..ad13d91d25 100644 --- a/applications/modules/fluidSolver/fluidSolver.C +++ b/applications/modules/fluidSolver/fluidSolver.C @@ -40,41 +40,44 @@ namespace solvers } -// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // +// * * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * // -void Foam::solvers::fluidSolver::readControls(const bool construct) +bool Foam::solvers::fluidSolver::dependenciesModified() const { - if (construct || runTime.controlDict().modified()) - { - maxCo = - runTime.controlDict().lookupOrDefault("maxCo", vGreat); - - maxDeltaT_ = - runTime.controlDict().found("maxDeltaT") - ? runTime.userTimeToTime - ( - runTime.controlDict().lookup("maxDeltaT") - ) - : vGreat; - } - - if (construct || mesh.solution().modified()) - { - correctPhi = pimple.dict().lookupOrDefault - ( - "correctPhi", - mesh.dynamic() - ); - - checkMeshCourantNo = pimple.dict().lookupOrDefault - ( - "checkMeshCourantNo", - false - ); - } + return runTime.controlDict().modified() || mesh.solution().modified(); } +bool Foam::solvers::fluidSolver::read() +{ + solver::read(); + + maxCo = + runTime.controlDict().lookupOrDefault("maxCo", vGreat); + + maxDeltaT_ = + runTime.controlDict().found("maxDeltaT") + ? runTime.userTimeToTime + ( + runTime.controlDict().lookup("maxDeltaT") + ) + : vGreat; + + correctPhi = pimple.dict().lookupOrDefault + ( + "correctPhi", + mesh.dynamic() + ); + + checkMeshCourantNo = pimple.dict().lookupOrDefault + ( + "checkMeshCourantNo", + false + ); + + return true; +} + void Foam::solvers::fluidSolver::meshCourantNo() const { if (checkMeshCourantNo) @@ -210,7 +213,7 @@ Foam::solvers::fluidSolver::fluidSolver(fvMesh& mesh) CoNum(CoNum_) { // Read the controls - readControls(true); + read(); } diff --git a/applications/modules/fluidSolver/fluidSolver.H b/applications/modules/fluidSolver/fluidSolver.H index db48b9b387..12fc677de3 100644 --- a/applications/modules/fluidSolver/fluidSolver.H +++ b/applications/modules/fluidSolver/fluidSolver.H @@ -92,15 +92,18 @@ class fluidSolver protected: + //- Return true if the solver's dependencies have been modified + virtual bool dependenciesModified() const; + + //- Read controls + virtual bool read(); + //- Switch to correct the flux after mesh change bool correctPhi; //- Current maximum Courant number for time-step control scalar CoNum_; - //- Read controls - void readControls(const bool construct = false); - //- Check mesh Courant numbers for moving mesh cases void meshCourantNo() const; diff --git a/applications/modules/incompressibleDenseParticleFluid/incompressibleDenseParticleFluid.C b/applications/modules/incompressibleDenseParticleFluid/incompressibleDenseParticleFluid.C index 75b833f809..b2fcecf6fd 100644 --- a/applications/modules/incompressibleDenseParticleFluid/incompressibleDenseParticleFluid.C +++ b/applications/modules/incompressibleDenseParticleFluid/incompressibleDenseParticleFluid.C @@ -245,9 +245,6 @@ Foam::solvers::incompressibleDenseParticleFluid:: void Foam::solvers::incompressibleDenseParticleFluid::preSolve() { - // Read the controls - readControls(); - if (mesh.dynamic() && !Ucf.valid()) { Info<< "Constructing face momentum Ucf" << endl; diff --git a/applications/modules/incompressibleDriftFlux/incompressibleDriftFlux.C b/applications/modules/incompressibleDriftFlux/incompressibleDriftFlux.C index a0b660549c..2fe782b86f 100644 --- a/applications/modules/incompressibleDriftFlux/incompressibleDriftFlux.C +++ b/applications/modules/incompressibleDriftFlux/incompressibleDriftFlux.C @@ -122,9 +122,6 @@ Foam::solvers::incompressibleDriftFlux::incompressibleDriftFlux(fvMesh& mesh) compressible::momentumTransportModel::New(rho, U, rhoPhi, mixture) ) { - // Read the controls - readControls(); - if (transient()) { correctCoNum(); diff --git a/applications/modules/incompressibleFluid/incompressibleFluid.C b/applications/modules/incompressibleFluid/incompressibleFluid.C index 1aad253f4b..f1a3a83306 100644 --- a/applications/modules/incompressibleFluid/incompressibleFluid.C +++ b/applications/modules/incompressibleFluid/incompressibleFluid.C @@ -162,9 +162,6 @@ Foam::solvers::incompressibleFluid::~incompressibleFluid() void Foam::solvers::incompressibleFluid::preSolve() { - // Read the controls - readControls(); - if ((mesh.dynamic() || MRF.size()) && !Uf.valid()) { Info<< "Constructing face momentum Uf" << endl; diff --git a/applications/modules/incompressibleMultiphaseVoF/incompressibleMultiphaseVoF.C b/applications/modules/incompressibleMultiphaseVoF/incompressibleMultiphaseVoF.C index f82cd6c066..346bbcf13e 100644 --- a/applications/modules/incompressibleMultiphaseVoF/incompressibleMultiphaseVoF.C +++ b/applications/modules/incompressibleMultiphaseVoF/incompressibleMultiphaseVoF.C @@ -99,9 +99,6 @@ Foam::solvers::incompressibleMultiphaseVoF::incompressibleMultiphaseVoF momentumTransport(momentumTransport_()) { - // Read the controls - readControls(); - if (correctPhi || mesh.topoChanging()) { rAU = new volScalarField diff --git a/applications/modules/incompressibleVoF/incompressibleVoF.C b/applications/modules/incompressibleVoF/incompressibleVoF.C index 65686cf618..fe57ef96dc 100644 --- a/applications/modules/incompressibleVoF/incompressibleVoF.C +++ b/applications/modules/incompressibleVoF/incompressibleVoF.C @@ -84,9 +84,6 @@ Foam::solvers::incompressibleVoF::incompressibleVoF(fvMesh& mesh) mixture ) { - // Read the controls - readControls(); - if (correctPhi || mesh.topoChanging()) { rAU = new volScalarField diff --git a/applications/modules/isothermalFilm/isothermalFilm.C b/applications/modules/isothermalFilm/isothermalFilm.C index 27ad68ef0b..754f4f29a9 100644 --- a/applications/modules/isothermalFilm/isothermalFilm.C +++ b/applications/modules/isothermalFilm/isothermalFilm.C @@ -51,74 +51,6 @@ namespace solvers // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // -void Foam::solvers::isothermalFilm::readControls(const bool construct) -{ - if (construct || runTime.controlDict().modified()) - { - maxCo = - runTime.controlDict().lookupOrDefault("maxCo", vGreat); - - maxDeltaT_ = - runTime.controlDict().found("maxDeltaT") - ? runTime.userTimeToTime - ( - runTime.controlDict().lookup("maxDeltaT") - ) - : vGreat; - } -} - - -void Foam::solvers::isothermalFilm::correctCoNum() -{ - const scalarField sumPhi(fvc::surfaceSum(mag(phi))().primitiveField()); - - CoNum = 0.5*gMax(sumPhi/mesh.V().field())*runTime.deltaTValue(); - - const scalar meanCoNum = - 0.5*(gSum(sumPhi)/gSum(mesh.V().field()))*runTime.deltaTValue(); - - Info<< "Courant Number mean: " << meanCoNum - << " max: " << CoNum << endl; -} - - -void Foam::solvers::isothermalFilm::continuityErrors() -{ - const dimensionedScalar mass = fvc::domainIntegrate(rho()*delta()*magSf); - - correctContinuityError(); - - if (mass.value() > small) - { - const volScalarField::Internal massContErr - ( - runTime.deltaT()*magSf*contErr() - ); - - const scalar sumLocalContErr = - (fvc::domainIntegrate(mag(massContErr))/mass).value(); - - const scalar globalContErr = - (fvc::domainIntegrate(massContErr)/mass).value(); - - Info<< "time step continuity errors : sum local = " << sumLocalContErr - << ", global = " << globalContErr; - - if (pimple.finalPisoIter() && pimple.finalIter()) - { - cumulativeContErr += globalContErr; - - Info<< ", cumulative = " << cumulativeContErr; - } - - Info<< endl; - } -} - - -// * * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * // - bool Foam::solvers::isothermalFilm::initFilmMesh() { // Search for film wall patches @@ -236,6 +168,81 @@ Foam::wordList Foam::solvers::isothermalFilm::alphaTypes() const } +void Foam::solvers::isothermalFilm::correctCoNum() +{ + const scalarField sumPhi(fvc::surfaceSum(mag(phi))().primitiveField()); + + CoNum = 0.5*gMax(sumPhi/mesh.V().field())*runTime.deltaTValue(); + + const scalar meanCoNum = + 0.5*(gSum(sumPhi)/gSum(mesh.V().field()))*runTime.deltaTValue(); + + Info<< "Courant Number mean: " << meanCoNum + << " max: " << CoNum << endl; +} + + +void Foam::solvers::isothermalFilm::continuityErrors() +{ + const dimensionedScalar mass = fvc::domainIntegrate(rho()*delta()*magSf); + + correctContinuityError(); + + if (mass.value() > small) + { + const volScalarField::Internal massContErr + ( + runTime.deltaT()*magSf*contErr() + ); + + const scalar sumLocalContErr = + (fvc::domainIntegrate(mag(massContErr))/mass).value(); + + const scalar globalContErr = + (fvc::domainIntegrate(massContErr)/mass).value(); + + Info<< "time step continuity errors : sum local = " << sumLocalContErr + << ", global = " << globalContErr; + + if (pimple.finalPisoIter() && pimple.finalIter()) + { + cumulativeContErr += globalContErr; + + Info<< ", cumulative = " << cumulativeContErr; + } + + Info<< endl; + } +} + + +// * * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * // + +bool Foam::solvers::isothermalFilm::dependenciesModified() const +{ + return runTime.controlDict().modified(); +} + + +bool Foam::solvers::isothermalFilm::read() +{ + solver::read(); + + maxCo = + runTime.controlDict().lookupOrDefault("maxCo", vGreat); + + maxDeltaT_ = + runTime.controlDict().found("maxDeltaT") + ? runTime.userTimeToTime + ( + runTime.controlDict().lookup("maxDeltaT") + ) + : vGreat; + + return true; +} + + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // Foam::solvers::isothermalFilm::isothermalFilm @@ -402,7 +409,7 @@ Foam::solvers::isothermalFilm::isothermalFilm ) { // Read the controls - readControls(true); + read(); mesh.schemes().setFluxRequired(alpha.name()); momentumTransport->validate(); @@ -451,7 +458,6 @@ Foam::scalar Foam::solvers::isothermalFilm::maxDeltaT() const void Foam::solvers::isothermalFilm::preSolve() { - readControls(); correctCoNum(); } diff --git a/applications/modules/isothermalFilm/isothermalFilm.H b/applications/modules/isothermalFilm/isothermalFilm.H index a79d9c24ea..96bf6fbda2 100644 --- a/applications/modules/isothermalFilm/isothermalFilm.H +++ b/applications/modules/isothermalFilm/isothermalFilm.H @@ -243,8 +243,11 @@ protected: // Protected Member Functions + //- Return true if the solver's dependencies have been modified + virtual bool dependenciesModified() const; + //- Read controls - void readControls(const bool construct = false); + virtual bool read(); public: diff --git a/applications/modules/isothermalFluid/isothermalFluid.C b/applications/modules/isothermalFluid/isothermalFluid.C index 24116474d6..f81ce8bbf3 100644 --- a/applications/modules/isothermalFluid/isothermalFluid.C +++ b/applications/modules/isothermalFluid/isothermalFluid.C @@ -186,9 +186,6 @@ Foam::solvers::isothermalFluid::isothermalFluid U(U_), phi(phi_) { - // Read the controls - readControls(true); - mesh.schemes().setFluxRequired(p.name()); momentumTransport->validate(); @@ -268,9 +265,6 @@ Foam::solvers::isothermalFluid::~isothermalFluid() void Foam::solvers::isothermalFluid::preSolve() { - // Read the controls - readControls(); - if ((mesh.dynamic() || MRF.size()) && !rhoUf.valid()) { Info<< "Constructing face momentum rhoUf" << endl; diff --git a/applications/modules/multiphaseEuler/multiphaseEuler/multiphaseEuler.C b/applications/modules/multiphaseEuler/multiphaseEuler/multiphaseEuler.C index 9102336450..baa70283cd 100644 --- a/applications/modules/multiphaseEuler/multiphaseEuler/multiphaseEuler.C +++ b/applications/modules/multiphaseEuler/multiphaseEuler/multiphaseEuler.C @@ -45,24 +45,23 @@ namespace solvers // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // -void Foam::solvers::multiphaseEuler::readControls(const bool construct) +bool Foam::solvers::multiphaseEuler::read() { - fluidSolver::readControls(construct); + fluidSolver::read(); - if (construct || mesh.solution().modified()) - { - predictMomentum = - pimple.dict().lookupOrDefault("momentumPredictor", false); + predictMomentum = + pimple.dict().lookupOrDefault("momentumPredictor", false); - faceMomentum = - pimple.dict().lookupOrDefault("faceMomentum", false); + faceMomentum = + pimple.dict().lookupOrDefault("faceMomentum", false); - dragCorrection = - pimple.dict().lookupOrDefault("dragCorrection", false); + dragCorrection = + pimple.dict().lookupOrDefault("dragCorrection", false); - nEnergyCorrectors = - pimple.dict().lookupOrDefault("nEnergyCorrectors", 1); - } + nEnergyCorrectors = + pimple.dict().lookupOrDefault("nEnergyCorrectors", 1); + + return true; } @@ -187,7 +186,7 @@ Foam::solvers::multiphaseEuler::multiphaseEuler(fvMesh& mesh) phi(phi_) { // Read the controls - readControls(true); + read(); mesh.schemes().setFluxRequired(p_rgh.name()); @@ -208,9 +207,6 @@ Foam::solvers::multiphaseEuler::~multiphaseEuler() void Foam::solvers::multiphaseEuler::preSolve() { - // Read the controls - readControls(); - if (transient()) { correctCoNum(); diff --git a/applications/modules/multiphaseEuler/multiphaseEuler/multiphaseEuler.H b/applications/modules/multiphaseEuler/multiphaseEuler/multiphaseEuler.H index 4b4a692495..34bf2c36ac 100644 --- a/applications/modules/multiphaseEuler/multiphaseEuler/multiphaseEuler.H +++ b/applications/modules/multiphaseEuler/multiphaseEuler/multiphaseEuler.H @@ -152,7 +152,7 @@ protected: autoPtr divU; //- Read controls - void readControls(const bool construct = false); + virtual bool read(); private: diff --git a/applications/modules/shockFluid/shockFluid.C b/applications/modules/shockFluid/shockFluid.C index 6a10753d0f..e34996cecd 100644 --- a/applications/modules/shockFluid/shockFluid.C +++ b/applications/modules/shockFluid/shockFluid.C @@ -183,9 +183,6 @@ Foam::solvers::shockFluid::shockFluid(fvMesh& mesh) U(U_), phi(phi_) { - // Read the controls - readControls(true); - thermo.validate(type(), "e"); if (momentumTransport.valid()) @@ -240,9 +237,6 @@ Foam::solvers::shockFluid::~shockFluid() void Foam::solvers::shockFluid::preSolve() { - // Read the controls - readControls(); - { const surfaceScalarField amaxSf ( diff --git a/applications/modules/solid/solid.C b/applications/modules/solid/solid.C index 68493b777d..7f4f57a04a 100644 --- a/applications/modules/solid/solid.C +++ b/applications/modules/solid/solid.C @@ -43,24 +43,6 @@ namespace solvers // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // -void Foam::solvers::solid::readControls(const bool construct) -{ - if (construct || runTime.controlDict().modified()) - { - maxDi = - runTime.controlDict().lookupOrDefault("maxDi", 1.0); - - maxDeltaT_ = - runTime.controlDict().found("maxDeltaT") - ? runTime.userTimeToTime - ( - runTime.controlDict().lookup("maxDeltaT") - ) - : vGreat; - } -} - - void Foam::solvers::solid::correctDiNum() { const volScalarField kappa @@ -92,6 +74,33 @@ void Foam::solvers::solid::correctDiNum() } +// * * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * // + +bool Foam::solvers::solid::dependenciesModified() const +{ + return runTime.controlDict().modified(); +} + + +bool Foam::solvers::solid::read() +{ + solver::read(); + + maxDi = + runTime.controlDict().lookupOrDefault("maxDi", 1.0); + + maxDeltaT_ = + runTime.controlDict().found("maxDeltaT") + ? runTime.userTimeToTime + ( + runTime.controlDict().lookup("maxDeltaT") + ) + : vGreat; + + return true; +} + + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // Foam::solvers::solid::solid @@ -136,7 +145,7 @@ Foam::solvers::solid::solid(fvMesh& mesh) solid(mesh, solidThermo::New(mesh)) { // Read the controls - readControls(true); + read(); } @@ -163,9 +172,6 @@ Foam::scalar Foam::solvers::solid::maxDeltaT() const void Foam::solvers::solid::preSolve() { - // Read the controls - readControls(); - fvModels().preUpdateMesh(); // Update the mesh for topology change, mesh to mesh mapping diff --git a/applications/modules/solid/solid.H b/applications/modules/solid/solid.H index c4f4d34e77..52d553877c 100644 --- a/applications/modules/solid/solid.H +++ b/applications/modules/solid/solid.H @@ -87,8 +87,11 @@ protected: // Protected Member Functions + //- Return true if the solver's dependencies have been modified + virtual bool dependenciesModified() const; + //- Read controls - virtual void readControls(const bool construct = false); + virtual bool read(); private: diff --git a/applications/modules/solidDisplacement/solidDisplacement.C b/applications/modules/solidDisplacement/solidDisplacement.C index b8893ef4db..d70f869e8b 100644 --- a/applications/modules/solidDisplacement/solidDisplacement.C +++ b/applications/modules/solidDisplacement/solidDisplacement.C @@ -43,19 +43,24 @@ namespace solvers } -// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // +// * * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * // -void Foam::solvers::solidDisplacement::readControls(const bool construct) +bool Foam::solvers::solidDisplacement::dependenciesModified() const { - solid::readControls(construct); + return solid::dependenciesModified() || mesh.solution().modified(); +} - if (construct || mesh.solution().modified()) - { - nCorr = pimple.dict().lookupOrDefault("nCorrectors", 1); - convergenceTolerance = pimple.dict().lookupOrDefault("D", 0); - pimple.dict().lookup("compactNormalStress") >> compactNormalStress; - accFac = pimple.dict().lookupOrDefault("accelerationFactor", 1); - } + +bool Foam::solvers::solidDisplacement::read() +{ + solid::read(); + + nCorr = pimple.dict().lookupOrDefault("nCorrectors", 1); + convergenceTolerance = pimple.dict().lookupOrDefault("D", 0); + pimple.dict().lookup("compactNormalStress") >> compactNormalStress; + accFac = pimple.dict().lookupOrDefault("accelerationFactor", 1); + + return true; } @@ -140,7 +145,7 @@ Foam::solvers::solidDisplacement::solidDisplacement(fvMesh& mesh) mesh.schemes().setFluxRequired(D.name()); // Read the controls - readControls(true); + read(); } diff --git a/applications/modules/solidDisplacement/solidDisplacement.H b/applications/modules/solidDisplacement/solidDisplacement.H index 2449b8d2f5..e26cf34667 100644 --- a/applications/modules/solidDisplacement/solidDisplacement.H +++ b/applications/modules/solidDisplacement/solidDisplacement.H @@ -123,8 +123,11 @@ protected: // Protected Member Functions + //- Return true if the solver's dependencies have been modified + virtual bool dependenciesModified() const; + //- Read controls - virtual void readControls(const bool construct = false); + virtual bool read(); public: diff --git a/src/OpenFOAM/db/Time/TimeIO.C b/src/OpenFOAM/db/Time/TimeIO.C index 3e2ff2d114..6456e91b8a 100644 --- a/src/OpenFOAM/db/Time/TimeIO.C +++ b/src/OpenFOAM/db/Time/TimeIO.C @@ -240,21 +240,7 @@ void Foam::Time::readModifiedObjects() Pstream::parRun() ); - // Time handling is special since controlDict_ is the one dictionary - // that is not registered to any database. - - if (controlDict_.readIfModified()) - { - readDict(); - functionObjects_.read(); - } - - bool registryModified = objectRegistry::modified(); - - if (registryModified) - { - objectRegistry::readModifiedObjects(); - } + objectRegistry::readModifiedObjects(); } } diff --git a/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.C b/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.C index 586168ddcb..a2d3a32e39 100644 --- a/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.C +++ b/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.C @@ -58,6 +58,13 @@ Foam::functionObject* Foam::functionObjectList::remove } +bool Foam::functionObjectList::writeData(Ostream&) const +{ + NotImplemented; + return false; +} + + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // Foam::functionObjectList::functionObjectList @@ -66,6 +73,15 @@ Foam::functionObjectList::functionObjectList const bool execution ) : + regIOobject + ( + IOobject + ( + "functionObjectList", + t.system(), + t + ) + ), PtrList(), digests_(), indices_(), @@ -83,6 +99,15 @@ Foam::functionObjectList::functionObjectList const bool execution ) : + regIOobject + ( + IOobject + ( + "functionObjectList", + t.system(), + t + ) + ), PtrList(), digests_(), indices_(), @@ -312,6 +337,19 @@ Foam::scalar Foam::functionObjectList::maxDeltaT() const } +bool Foam::functionObjectList::dependenciesModified() const +{ + if (&parentDict_ == &time_.controlDict()) + { + return time_.controlDict().modified(); + } + else + { + return false; + } +} + + bool Foam::functionObjectList::read() { bool ok = true; diff --git a/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.H b/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.H index 1a039a2261..5e8305f104 100644 --- a/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.H +++ b/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.H @@ -40,6 +40,7 @@ SourceFiles #ifndef functionObjectList_H #define functionObjectList_H +#include "regIOobject.H" #include "PtrList.H" #include "functionObject.H" #include "SHA1Digest.H" @@ -62,6 +63,7 @@ class argList; class functionObjectList : + public regIOobject, private PtrList { // Private Data @@ -93,6 +95,9 @@ class functionObjectList // Returns a nullptr (and index -1) if it didn't exist functionObject* remove(const word&, label& oldIndex); + //- Dummy write for regIOobject + virtual bool writeData(Ostream&) const; + public: @@ -161,8 +166,11 @@ public: //- Find the ID of a given function object by name label findObjectID(const word& name) const; + //- Return true if the functionObjects dependencies have been modified + virtual bool dependenciesModified() const; + //- Read and set the function objects if their data have changed - bool read(); + virtual bool read(); //- Called at the start of the time-loop bool start(); diff --git a/src/OpenFOAM/db/objectRegistry/objectRegistry.C b/src/OpenFOAM/db/objectRegistry/objectRegistry.C index 4a977faf24..9d1dff7b28 100644 --- a/src/OpenFOAM/db/objectRegistry/objectRegistry.C +++ b/src/OpenFOAM/db/objectRegistry/objectRegistry.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | Website: https://openfoam.org - \\ / A nd | Copyright (C) 2011-2021 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2023 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -502,8 +502,28 @@ bool Foam::objectRegistry::modified() const } -void Foam::objectRegistry::readModifiedObjects() +bool Foam::objectRegistry::dependenciesModified() const { + dependents_.setSize(size()); + + label count=0; + forAllConstIter(HashTable, *this, iter) + { + if (iter()->dependenciesModified()) + { + dependents_[count++] = iter(); + } + } + dependents_.setSize(count); + + return count != 0; +} + + +bool Foam::objectRegistry::readIfModified() +{ + bool modified = false; + for (iterator iter = begin(); iter != end(); ++iter) { if (objectRegistry::debug) @@ -513,15 +533,37 @@ void Foam::objectRegistry::readModifiedObjects() << iter.key() << endl; } - iter()->readIfModified(); + modified = modified || iter()->readIfModified(); } + + return modified; } -bool Foam::objectRegistry::readIfModified() +bool Foam::objectRegistry::read() { - readModifiedObjects(); - return true; + bool readOk = true; + + forAll(dependents_, i) + { + dependents_[i]->read(); + } + + return readOk; +} + + +void Foam::objectRegistry::readModifiedObjects() +{ + dependenciesModified(); + + const bool modified = readIfModified(); + + // If any objects have been modified and re-read, read the dependants + if (modified) + { + objectRegistry::read(); + } } diff --git a/src/OpenFOAM/db/objectRegistry/objectRegistry.H b/src/OpenFOAM/db/objectRegistry/objectRegistry.H index 074ce905fe..bc87339200 100644 --- a/src/OpenFOAM/db/objectRegistry/objectRegistry.H +++ b/src/OpenFOAM/db/objectRegistry/objectRegistry.H @@ -80,6 +80,8 @@ class objectRegistry // available mutable HashSet temporaryObjects_; + mutable List dependents_; + // Private Member Functions @@ -270,12 +272,18 @@ public: //- Return true if any of the object's files have been modified virtual bool modified() const; - //- Read the objects that have been modified - void readModifiedObjects(); + //- Cache pointers to objects who's dependencies have been modified + virtual bool dependenciesModified() const; //- Read object if modified virtual bool readIfModified(); + //- Read dependent objects + virtual bool read(); + + //- Read the objects that have been modified + void readModifiedObjects(); + // Writing diff --git a/src/OpenFOAM/db/regIOobject/regIOobject.H b/src/OpenFOAM/db/regIOobject/regIOobject.H index c52f4df3e5..31879e320c 100644 --- a/src/OpenFOAM/db/regIOobject/regIOobject.H +++ b/src/OpenFOAM/db/regIOobject/regIOobject.H @@ -283,6 +283,12 @@ public: // have been modified. (modified state is cached by Time) virtual bool modified() const; + //- Return true if the object's dependencies have been modified + virtual bool dependenciesModified() const + { + return false; + } + //- Read object if modified (as set by call to modified) virtual bool readIfModified(); diff --git a/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/singleRegionConvergenceControl/singleRegionConvergenceControl.C b/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/singleRegionConvergenceControl/singleRegionConvergenceControl.C index 333603984e..5f394b4d63 100644 --- a/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/singleRegionConvergenceControl/singleRegionConvergenceControl.C +++ b/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/singleRegionConvergenceControl/singleRegionConvergenceControl.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | Website: https://openfoam.org - \\ / A nd | Copyright (C) 2018-2019 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2018-2023 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -34,28 +34,9 @@ namespace Foam } -// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // +// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // -Foam::singleRegionConvergenceControl::singleRegionConvergenceControl -( - const singleRegionSolutionControl& control -) -: - convergenceControl(control), - mesh_(control.mesh()), - residualControl_() -{} - - -// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // - -Foam::singleRegionConvergenceControl::~singleRegionConvergenceControl() -{} - - -// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // - -bool Foam::singleRegionConvergenceControl::readResidualControls() +bool Foam::singleRegionConvergenceControl::read() { const dictionary residualDict ( @@ -112,6 +93,29 @@ bool Foam::singleRegionConvergenceControl::readResidualControls() } +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::singleRegionConvergenceControl::singleRegionConvergenceControl +( + const singleRegionSolutionControl& control +) +: + convergenceControl(control), + mesh_(control.mesh()), + residualControl_() +{ + read(); +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::singleRegionConvergenceControl::~singleRegionConvergenceControl() +{} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + void Foam::singleRegionConvergenceControl::printResidualControls() const { Info<< nl; diff --git a/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/singleRegionConvergenceControl/singleRegionConvergenceControl.H b/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/singleRegionConvergenceControl/singleRegionConvergenceControl.H index a983e9d74e..2a20064e46 100644 --- a/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/singleRegionConvergenceControl/singleRegionConvergenceControl.H +++ b/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/singleRegionConvergenceControl/singleRegionConvergenceControl.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | Website: https://openfoam.org - \\ / A nd | Copyright (C) 2018-2020 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2018-2023 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -62,6 +62,12 @@ protected: List residualControl_; + // Protected Member Functions + + //- Read controls + virtual bool read(); + + public: // Static Data Members @@ -87,9 +93,6 @@ public: // IO - //- Read residual controls - bool readResidualControls(); - //- Print the residual controls void printResidualControls() const; diff --git a/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/singleRegionCorrectorConvergenceControl/singleRegionCorrectorConvergenceControl.C b/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/singleRegionCorrectorConvergenceControl/singleRegionCorrectorConvergenceControl.C index 42df8e8680..3cebb356da 100644 --- a/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/singleRegionCorrectorConvergenceControl/singleRegionCorrectorConvergenceControl.C +++ b/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/singleRegionCorrectorConvergenceControl/singleRegionCorrectorConvergenceControl.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | Website: https://openfoam.org - \\ / A nd | Copyright (C) 2018-2019 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2018-2023 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -35,31 +35,9 @@ namespace Foam } -// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // +// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // -Foam::singleRegionCorrectorConvergenceControl:: -singleRegionCorrectorConvergenceControl -( - const singleRegionSolutionControl& control, - const word& loopName -) -: - correctorConvergenceControl(control, loopName), - mesh_(control.mesh()), - corrResidualControl_() -{} - - -// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // - -Foam::singleRegionCorrectorConvergenceControl:: -~singleRegionCorrectorConvergenceControl() -{} - - -// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // - -bool Foam::singleRegionCorrectorConvergenceControl::readCorrResidualControls() +bool Foam::singleRegionCorrectorConvergenceControl::read() { const dictionary residualDict ( @@ -125,6 +103,32 @@ bool Foam::singleRegionCorrectorConvergenceControl::readCorrResidualControls() } +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::singleRegionCorrectorConvergenceControl:: +singleRegionCorrectorConvergenceControl +( + const singleRegionSolutionControl& control, + const word& loopName +) +: + correctorConvergenceControl(control, loopName), + mesh_(control.mesh()), + corrResidualControl_() +{ + read(); +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::singleRegionCorrectorConvergenceControl:: +~singleRegionCorrectorConvergenceControl() +{} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + void Foam::singleRegionCorrectorConvergenceControl::printCorrResidualControls ( const label n diff --git a/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/singleRegionCorrectorConvergenceControl/singleRegionCorrectorConvergenceControl.H b/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/singleRegionCorrectorConvergenceControl/singleRegionCorrectorConvergenceControl.H index 82675951ce..37622e92c4 100644 --- a/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/singleRegionCorrectorConvergenceControl/singleRegionCorrectorConvergenceControl.H +++ b/src/finiteVolume/cfdTools/general/solutionControl/convergenceControl/singleRegionCorrectorConvergenceControl/singleRegionCorrectorConvergenceControl.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | Website: https://openfoam.org - \\ / A nd | Copyright (C) 2018-2020 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2018-2023 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -68,6 +68,12 @@ protected: HashTable