diff --git a/applications/solvers/combustion/reactingFoam/LTSReactingFoam/setRDeltaT.H b/applications/solvers/combustion/reactingFoam/LTSReactingFoam/setRDeltaT.H
new file mode 100644
index 000000000..6e771864a
--- /dev/null
+++ b/applications/solvers/combustion/reactingFoam/LTSReactingFoam/setRDeltaT.H
@@ -0,0 +1,123 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2013-2015 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 .
+
+\*---------------------------------------------------------------------------*/
+
+{
+ const dictionary& pimpleDict = pimple.dict();
+
+ // Maximum flow Courant number
+ scalar maxCo(readScalar(pimpleDict.lookup("maxCo")));
+
+ // Maximum time scale
+ scalar maxDeltaT(pimpleDict.lookupOrDefault("maxDeltaT", GREAT));
+
+ // Smoothing parameter (0-1) when smoothing iterations > 0
+ scalar rDeltaTSmoothingCoeff
+ (
+ pimpleDict.lookupOrDefault("rDeltaTSmoothingCoeff", 0.1)
+ );
+
+ // Damping coefficient (1-0)
+ scalar rDeltaTDampingCoeff
+ (
+ pimpleDict.lookupOrDefault("rDeltaTDampingCoeff", 1)
+ );
+
+ // Maximum change in cell temperature per iteration
+ // (relative to previous value)
+ scalar alphaTemp(pimpleDict.lookupOrDefault("alphaTemp", 0.05));
+
+
+ Info<< "Time scales min/max:" << endl;
+
+ // Cache old reciprocal time scale field
+ volScalarField rDeltaT0("rDeltaT0", rDeltaT);
+
+ // Flow time scale
+ {
+ rDeltaT.dimensionedInternalField() =
+ (
+ fvc::surfaceSum(mag(phi))().dimensionedInternalField()
+ /((2*maxCo)*mesh.V()*rho.dimensionedInternalField())
+ );
+
+ // Limit the largest time scale
+ rDeltaT.max(1/maxDeltaT);
+
+ Info<< " Flow = "
+ << gMin(1/rDeltaT.internalField()) << ", "
+ << gMax(1/rDeltaT.internalField()) << endl;
+ }
+
+ // Reaction source time scale
+ if (alphaTemp < 1.0)
+ {
+ volScalarField::DimensionedInternalField rDeltaTT
+ (
+ mag(reaction->Sh())/(alphaTemp*rho*thermo.Cp()*T)
+ );
+
+ Info<< " Temperature = "
+ << gMin(1/(rDeltaTT.field() + VSMALL)) << ", "
+ << gMax(1/(rDeltaTT.field() + VSMALL)) << endl;
+
+ rDeltaT.dimensionedInternalField() = max
+ (
+ rDeltaT.dimensionedInternalField(),
+ rDeltaTT
+ );
+ }
+
+ // Update tho boundary values of the reciprocal time-step
+ rDeltaT.correctBoundaryConditions();
+
+ // Spatially smooth the time scale field
+ if (rDeltaTSmoothingCoeff < 1.0)
+ {
+ fvc::smooth(rDeltaT, rDeltaTSmoothingCoeff);
+ }
+
+ // Limit rate of change of time scale
+ // - reduce as much as required
+ // - only increase at a fraction of old time scale
+ if
+ (
+ rDeltaTDampingCoeff < 1.0
+ && runTime.timeIndex() > runTime.startTimeIndex() + 1
+ )
+ {
+ rDeltaT = max
+ (
+ rDeltaT,
+ (scalar(1.0) - rDeltaTDampingCoeff)*rDeltaT0
+ );
+ }
+
+ Info<< " Overall = "
+ << gMin(1/rDeltaT.internalField())
+ << ", " << gMax(1/rDeltaT.internalField()) << endl;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/compressible/rhoPimpleFoam/rhoLTSPimpleFoam/setRDeltaT.H b/applications/solvers/compressible/rhoPimpleFoam/rhoLTSPimpleFoam/setRDeltaT.H
new file mode 100644
index 000000000..d56283d13
--- /dev/null
+++ b/applications/solvers/compressible/rhoPimpleFoam/rhoLTSPimpleFoam/setRDeltaT.H
@@ -0,0 +1,83 @@
+{
+ const dictionary& pimpleDict = pimple.dict();
+
+ scalar maxCo
+ (
+ pimpleDict.lookupOrDefault("maxCo", 0.8)
+ );
+
+ scalar rDeltaTSmoothingCoeff
+ (
+ pimpleDict.lookupOrDefault("rDeltaTSmoothingCoeff", 0.02)
+ );
+
+ scalar rDeltaTDampingCoeff
+ (
+ pimpleDict.lookupOrDefault("rDeltaTDampingCoeff", 1.0)
+ );
+
+ scalar maxDeltaT
+ (
+ pimpleDict.lookupOrDefault("maxDeltaT", GREAT)
+ );
+
+ volScalarField rDeltaT0("rDeltaT0", rDeltaT);
+
+ // Set the reciprocal time-step from the local Courant number
+ rDeltaT.dimensionedInternalField() = max
+ (
+ 1/dimensionedScalar("maxDeltaT", dimTime, maxDeltaT),
+ fvc::surfaceSum(mag(phi))().dimensionedInternalField()
+ /((2*maxCo)*mesh.V()*rho.dimensionedInternalField())
+ );
+
+ if (pimple.transonic())
+ {
+ surfaceScalarField phid
+ (
+ "phid",
+ fvc::interpolate(psi)*(fvc::interpolate(U) & mesh.Sf())
+ );
+
+ rDeltaT.dimensionedInternalField() = max
+ (
+ rDeltaT.dimensionedInternalField(),
+ fvc::surfaceSum(mag(phid))().dimensionedInternalField()
+ /((2*maxCo)*mesh.V()*psi.dimensionedInternalField())
+ );
+ }
+
+ // Update tho boundary values of the reciprocal time-step
+ rDeltaT.correctBoundaryConditions();
+
+ Info<< "Flow time scale min/max = "
+ << gMin(1/rDeltaT.internalField())
+ << ", " << gMax(1/rDeltaT.internalField()) << endl;
+
+ if (rDeltaTSmoothingCoeff < 1.0)
+ {
+ fvc::smooth(rDeltaT, rDeltaTSmoothingCoeff);
+ }
+
+ Info<< "Smoothed flow time scale min/max = "
+ << gMin(1/rDeltaT.internalField())
+ << ", " << gMax(1/rDeltaT.internalField()) << endl;
+
+ // Limit rate of change of time scale
+ // - reduce as much as required
+ // - only increase at a fraction of old time scale
+ if
+ (
+ rDeltaTDampingCoeff < 1.0
+ && runTime.timeIndex() > runTime.startTimeIndex() + 1
+ )
+ {
+ rDeltaT =
+ rDeltaT0
+ *max(rDeltaT/rDeltaT0, scalar(1) - rDeltaTDampingCoeff);
+
+ Info<< "Damped flow time scale min/max = "
+ << gMin(1/rDeltaT.internalField())
+ << ", " << gMax(1/rDeltaT.internalField()) << endl;
+ }
+}
diff --git a/applications/solvers/lagrangian/coalChemistryFoam/LTSCoalChemistryFoam/setRDeltaT.H b/applications/solvers/lagrangian/coalChemistryFoam/LTSCoalChemistryFoam/setRDeltaT.H
new file mode 100644
index 000000000..e9697c790
--- /dev/null
+++ b/applications/solvers/lagrangian/coalChemistryFoam/LTSCoalChemistryFoam/setRDeltaT.H
@@ -0,0 +1,134 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2011-2015 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 .
+
+\*---------------------------------------------------------------------------*/
+
+{
+ const dictionary& pimpleDict = pimple.dict();
+
+ // Maximum flow Courant number
+ scalar maxCo(readScalar(pimpleDict.lookup("maxCo")));
+
+ // Maximum time scale
+ scalar maxDeltaT(pimpleDict.lookupOrDefault("maxDeltaT", GREAT));
+
+ // Smoothing parameter (0-1) when smoothing iterations > 0
+ scalar rDeltaTSmoothingCoeff
+ (
+ pimpleDict.lookupOrDefault("rDeltaTSmoothingCoeff", 0.1)
+ );
+
+ // Damping coefficient (1-0)
+ scalar rDeltaTDampingCoeff
+ (
+ pimpleDict.lookupOrDefault("rDeltaTDampingCoeff", 0.2)
+ );
+
+ // Maximum change in cell temperature per iteration
+ // (relative to previous value)
+ scalar alphaTemp(pimpleDict.lookupOrDefault("alphaTemp", 0.05));
+
+
+ Info<< "Time scales min/max:" << endl;
+
+ // Cache old reciprocal time scale field
+ volScalarField rDeltaT0("rDeltaT0", rDeltaT);
+
+ // Flow time scale
+ {
+ rDeltaT.dimensionedInternalField() =
+ (
+ fvc::surfaceSum(mag(phi))().dimensionedInternalField()
+ /((2*maxCo)*mesh.V()*rho.dimensionedInternalField())
+ );
+
+ // Limit the largest time scale
+ rDeltaT.max(1/maxDeltaT);
+
+ Info<< " Flow = "
+ << gMin(1/rDeltaT.internalField()) << ", "
+ << gMax(1/rDeltaT.internalField()) << endl;
+ }
+
+ // Reaction source time scale
+ if (alphaTemp < 1.0)
+ {
+ volScalarField::DimensionedInternalField rDeltaTT
+ (
+ mag
+ (
+ (coalParcels.hsTrans() + limestoneParcels.hsTrans())
+ /(mesh.V()*runTime.deltaT())
+ + combustion->Sh()()
+ )
+ /(
+ alphaTemp
+ *rho.dimensionedInternalField()
+ *thermo.Cp()().dimensionedInternalField()
+ *T.dimensionedInternalField()
+ )
+ );
+
+ Info<< " Temperature = "
+ << gMin(1/(rDeltaTT.field() + VSMALL)) << ", "
+ << gMax(1/(rDeltaTT.field() + VSMALL)) << endl;
+
+ rDeltaT.dimensionedInternalField() = max
+ (
+ rDeltaT.dimensionedInternalField(),
+ rDeltaTT
+ );
+ }
+
+ // Update tho boundary values of the reciprocal time-step
+ rDeltaT.correctBoundaryConditions();
+
+ // Spatially smooth the time scale field
+ if (rDeltaTSmoothingCoeff < 1.0)
+ {
+ fvc::smooth(rDeltaT, rDeltaTSmoothingCoeff);
+ }
+
+ // Limit rate of change of time scale
+ // - reduce as much as required
+ // - only increase at a fraction of old time scale
+ if
+ (
+ rDeltaTDampingCoeff < 1.0
+ && runTime.timeIndex() > runTime.startTimeIndex() + 1
+ )
+ {
+ rDeltaT = max
+ (
+ rDeltaT,
+ (scalar(1.0) - rDeltaTDampingCoeff)*rDeltaT0
+ );
+ }
+
+ Info<< " Overall = "
+ << gMin(1/rDeltaT.internalField())
+ << ", " << gMax(1/rDeltaT.internalField()) << endl;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/lagrangian/reactingParcelFoam/LTSReactingParcelFoam/setRDeltaT.H b/applications/solvers/lagrangian/reactingParcelFoam/LTSReactingParcelFoam/setRDeltaT.H
new file mode 100644
index 000000000..caa9b4167
--- /dev/null
+++ b/applications/solvers/lagrangian/reactingParcelFoam/LTSReactingParcelFoam/setRDeltaT.H
@@ -0,0 +1,132 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2011-2015 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 .
+
+\*---------------------------------------------------------------------------*/
+
+{
+ const dictionary& pimpleDict = pimple.dict();
+
+ // Maximum flow Courant number
+ scalar maxCo(readScalar(pimpleDict.lookup("maxCo")));
+
+ // Maximum time scale
+ scalar maxDeltaT(pimpleDict.lookupOrDefault("maxDeltaT", GREAT));
+
+ // Smoothing parameter (0-1) when smoothing iterations > 0
+ scalar rDeltaTSmoothingCoeff
+ (
+ pimpleDict.lookupOrDefault("rDeltaTSmoothingCoeff", 0.1)
+ );
+
+ // Damping coefficient (1-0)
+ scalar rDeltaTDampingCoeff
+ (
+ pimpleDict.lookupOrDefault("rDeltaTDampingCoeff", 0.2)
+ );
+
+ // Maximum change in cell temperature per iteration
+ // (relative to previous value)
+ scalar alphaTemp(pimpleDict.lookupOrDefault("alphaTemp", 0.05));
+
+
+ Info<< "Time scales min/max:" << endl;
+
+ // Cache old reciprocal time scale field
+ volScalarField rDeltaT0("rDeltaT0", rDeltaT);
+
+ // Flow time scale
+ {
+ rDeltaT.dimensionedInternalField() =
+ (
+ fvc::surfaceSum(mag(phi))().dimensionedInternalField()
+ /((2*maxCo)*mesh.V()*rho.dimensionedInternalField())
+ );
+
+ // Limit the largest time scale
+ rDeltaT.max(1/maxDeltaT);
+
+ Info<< " Flow = "
+ << gMin(1/rDeltaT.internalField()) << ", "
+ << gMax(1/rDeltaT.internalField()) << endl;
+ }
+
+ // Reaction source time scale
+ {
+ volScalarField::DimensionedInternalField rDeltaTT
+ (
+ mag
+ (
+ parcels.hsTrans()/(mesh.V()*runTime.deltaT())
+ + combustion->Sh()()
+ )
+ /(
+ alphaTemp
+ *rho.dimensionedInternalField()
+ *thermo.Cp()().dimensionedInternalField()
+ *T.dimensionedInternalField()
+ )
+ );
+
+ Info<< " Temperature = "
+ << gMin(1/(rDeltaTT.field() + VSMALL)) << ", "
+ << gMax(1/(rDeltaTT.field() + VSMALL)) << endl;
+
+ rDeltaT.dimensionedInternalField() = max
+ (
+ rDeltaT.dimensionedInternalField(),
+ rDeltaTT
+ );
+ }
+
+ // Update tho boundary values of the reciprocal time-step
+ rDeltaT.correctBoundaryConditions();
+
+ // Spatially smooth the time scale field
+ if (rDeltaTSmoothingCoeff < 1.0)
+ {
+ fvc::smooth(rDeltaT, rDeltaTSmoothingCoeff);
+ }
+
+ // Limit rate of change of time scale
+ // - reduce as much as required
+ // - only increase at a fraction of old time scale
+ if
+ (
+ rDeltaTDampingCoeff < 1.0
+ && runTime.timeIndex() > runTime.startTimeIndex() + 1
+ )
+ {
+ rDeltaT = max
+ (
+ rDeltaT,
+ (scalar(1.0) - rDeltaTDampingCoeff)*rDeltaT0
+ );
+ }
+
+ Info<< " Overall = "
+ << gMin(1/rDeltaT.internalField())
+ << ", " << gMax(1/rDeltaT.internalField()) << endl;
+}
+
+
+// ************************************************************************* //