diff --git a/applications/test/ODE/Test-ODE.C b/applications/test/ODE/Test-ODE.C index 4222fa4cc4b5431b46000894acda1ec4adec6956..ae203742591af2e1f7693e484582b4c25b71454c 100644 --- a/applications/test/ODE/Test-ODE.C +++ b/applications/test/ODE/Test-ODE.C @@ -142,7 +142,7 @@ int main(int argc, char *argv[]) scalar dxNext = dxEst; odeSolver->relTol() = relTol; - odeSolver->solve(ode, x, y, dxNext); + odeSolver->solve(x, y, dxNext); Info<< scientific << setw(13) << relTol; Info<< fixed << setw(11) << dxEst; @@ -165,7 +165,7 @@ int main(int argc, char *argv[]) scalar dxEst = 0.5; odeSolver->relTol() = 1e-4; - odeSolver->solve(ode, x, xEnd, y, dxEst); + odeSolver->solve(x, xEnd, y, dxEst); Info<< nl << "Analytical: y(2.0) = " << yEnd << endl; Info << "Numerical: y(2.0) = " << y << ", dxEst = " << dxEst << endl; diff --git a/src/ODE/Make/files b/src/ODE/Make/files index 7c361626eda507cc5a56ed4e2945c5420cab5dc2..912b36fecbb13edd176e25f9eac5f28a085b3dbd 100644 --- a/src/ODE/Make/files +++ b/src/ODE/Make/files @@ -8,11 +8,11 @@ ODESolvers/Trapezoid/Trapezoid.C ODESolvers/RKF45/RKF45.C ODESolvers/RKCK45/RKCK45.C ODESolvers/RKDP45/RKDP45.C -ODESolvers/Rosenbrock21/Rosenbrock21.C -ODESolvers/Rosenbrock32/Rosenbrock32.C -ODESolvers/Rosenbrock43/Rosenbrock43.C -ODESolvers/rodas32/rodas32.C -ODESolvers/rodas43/rodas43.C +ODESolvers/Rosenbrock12/Rosenbrock12.C +ODESolvers/Rosenbrock23/Rosenbrock23.C +ODESolvers/Rosenbrock34/Rosenbrock34.C +ODESolvers/rodas23/rodas23.C +ODESolvers/rodas34/rodas34.C ODESolvers/SIBS/SIBS.C ODESolvers/SIBS/SIMPR.C ODESolvers/SIBS/polyExtrapolate.C diff --git a/src/ODE/ODESolvers/Euler/Euler.C b/src/ODE/ODESolvers/Euler/Euler.C index 1a6edf576cc3c09ec083f896cf5cd693fbc26964..1496099ae89349248e61d33bbc8fe7b51d22d761 100644 --- a/src/ODE/ODESolvers/Euler/Euler.C +++ b/src/ODE/ODESolvers/Euler/Euler.C @@ -49,7 +49,6 @@ Foam::Euler::Euler(const ODESystem& ode, const dictionary& dict) Foam::scalar Foam::Euler::solve ( - const ODESystem& ode, const scalar x0, const scalarField& y0, const scalarField& dydx0, @@ -75,13 +74,12 @@ Foam::scalar Foam::Euler::solve void Foam::Euler::solve ( - const ODESystem& odes, scalar& x, scalarField& y, scalar& dxTry ) const { - adaptiveSolver::solve(odes, x, y, dxTry); + adaptiveSolver::solve(odes_, x, y, dxTry); } diff --git a/src/ODE/ODESolvers/Euler/Euler.H b/src/ODE/ODESolvers/Euler/Euler.H index 90f67f4b4c23debb45d3fb20268660aa30e43b9a..3cefc425be0751a2bb5e4eefe0a09ddc53d186bf 100644 --- a/src/ODE/ODESolvers/Euler/Euler.H +++ b/src/ODE/ODESolvers/Euler/Euler.H @@ -84,7 +84,6 @@ public: //- Solve a single step dx and return the error scalar solve ( - const ODESystem& ode, const scalar x0, const scalarField& y0, const scalarField& dydx0, @@ -95,7 +94,6 @@ public: //- Solve the ODE system and the update the state void solve ( - const ODESystem& ode, scalar& x, scalarField& y, scalar& dxTry diff --git a/src/ODE/ODESolvers/EulerSI/EulerSI.C b/src/ODE/ODESolvers/EulerSI/EulerSI.C index 1785101758d58a0dc8a27f5862f9a24cb90908c5..9b28f733eafc6e8de72b23c475196b7ab1cb76b9 100644 --- a/src/ODE/ODESolvers/EulerSI/EulerSI.C +++ b/src/ODE/ODESolvers/EulerSI/EulerSI.C @@ -54,7 +54,6 @@ Foam::EulerSI::EulerSI(const ODESystem& ode, const dictionary& dict) Foam::scalar Foam::EulerSI::solve ( - const ODESystem& ode, const scalar x0, const scalarField& y0, const scalarField& dydx0, @@ -62,7 +61,7 @@ Foam::scalar Foam::EulerSI::solve scalarField& y ) const { - ode.jacobian(x0, y0, dfdx_, dfdy_); + odes_.jacobian(x0, y0, dfdx_, dfdy_); for (register label i=0; i<n_; i++) { @@ -95,13 +94,12 @@ Foam::scalar Foam::EulerSI::solve void Foam::EulerSI::solve ( - const ODESystem& odes, scalar& x, scalarField& y, scalar& dxTry ) const { - adaptiveSolver::solve(odes, x, y, dxTry); + adaptiveSolver::solve(odes_, x, y, dxTry); } diff --git a/src/ODE/ODESolvers/EulerSI/EulerSI.H b/src/ODE/ODESolvers/EulerSI/EulerSI.H index 392e818e8720ac1e243d5bb7592ccd4bef095bc0..656e3df0a4d0aa995d04d035a1ec2c8dcc168860 100644 --- a/src/ODE/ODESolvers/EulerSI/EulerSI.H +++ b/src/ODE/ODESolvers/EulerSI/EulerSI.H @@ -91,7 +91,6 @@ public: //- Solve a single step dx and return the error scalar solve ( - const ODESystem& ode, const scalar x0, const scalarField& y0, const scalarField& dydx0, @@ -102,7 +101,6 @@ public: //- Solve the ODE system and the update the state void solve ( - const ODESystem& ode, scalar& x, scalarField& y, scalar& dxTry diff --git a/src/ODE/ODESolvers/ODESolver/ODESolver.C b/src/ODE/ODESolvers/ODESolver/ODESolver.C index f4dd3588ebde081a55935fd36a0d35548d863fbc..c5dc36e38e4e7908fa578243d4efc066961b763a 100644 --- a/src/ODE/ODESolvers/ODESolver/ODESolver.C +++ b/src/ODE/ODESolvers/ODESolver/ODESolver.C @@ -38,6 +38,7 @@ namespace Foam Foam::ODESolver::ODESolver(const ODESystem& ode, const dictionary& dict) : + odes_(ode), n_(ode.nEqns()), absTol_(n_, dict.lookupOrDefault<scalar>("absTol", SMALL)), relTol_(n_, dict.lookupOrDefault<scalar>("relTol", 1e-4)), @@ -52,6 +53,7 @@ Foam::ODESolver::ODESolver const scalarField& relTol ) : + odes_(ode), n_(ode.nEqns()), absTol_(absTol), relTol_(relTol), @@ -82,48 +84,70 @@ Foam::scalar Foam::ODESolver::normalizeError void Foam::ODESolver::solve ( - const ODESystem& ode, + scalar& x, + scalarField& y, + stepState& step +) const +{ + solve(x, y, step.dxTry); +} + + +void Foam::ODESolver::solve +( const scalar xStart, const scalar xEnd, scalarField& y, - scalar& dxEst + scalar& dxTry ) const { + stepState step(dxTry); scalar x = xStart; - bool truncated = false; for (label nStep=0; nStep<maxSteps_; nStep++) { - // Store previous iteration dxEst - scalar dxEst0 = dxEst; + // Store previous iteration dxTry + scalar dxTry0 = step.dxTry; + + step.reject = false; - // Check if this is a truncated step and set dxEst to integrate to xEnd - if ((x + dxEst - xEnd)*(x + dxEst - xStart) > 0) + // Check if this is a truncated step and set dxTry to integrate to xEnd + if ((x + step.dxTry - xEnd)*(x + step.dxTry - xStart) > 0) { - truncated = true; - dxEst = xEnd - x; + step.last = true; + step.dxTry = xEnd - x; } - // Integrate as far as possible up to dxEst - solve(ode, x, y, dxEst); + // Integrate as far as possible up to step.dxTry + solve(x, y, step); // Check if reached xEnd if ((x - xEnd)*(xEnd - xStart) >= 0) { - if (nStep > 0 && truncated) + if (nStep > 0 && step.last) { - dxEst = dxEst0; + step.dxTry = dxTry0; } + dxTry = step.dxTry; + return; } + + step.first = false; + + // If the step.dxTry was reject set step.prevReject + if (step.reject) + { + step.prevReject = true; + } } FatalErrorIn ( "ODESolver::solve" - "(const ODESystem& ode, const scalar xStart, const scalar xEnd," - "scalarField& y, scalar& dxEst) const" + "(const scalar xStart, const scalar xEnd," + "scalarField& y, scalar& dxTry) const" ) << "Integration steps greater than maximum " << maxSteps_ << exit(FatalError); } diff --git a/src/ODE/ODESolvers/ODESolver/ODESolver.H b/src/ODE/ODESolvers/ODESolver/ODESolver.H index bd767a906387e065e84079b95e30b6cc01fc96e6..de4ef399f89cfee927dd7eec2496e96452f7e6f7 100644 --- a/src/ODE/ODESolvers/ODESolver/ODESolver.H +++ b/src/ODE/ODESolvers/ODESolver/ODESolver.H @@ -55,6 +55,9 @@ protected: // Protected data + //- Reference to ODESystem + const ODESystem& odes_; + //- Size of the ODESystem label n_; @@ -90,6 +93,30 @@ public: //- Runtime type information TypeName("ODESolver"); + class stepState + { + public: + + const bool forward; + scalar dxTry; + scalar dxDid; + bool first; + bool last; + bool reject; + bool prevReject; + + stepState(const scalar dx) + : + forward(dx > 0 ? true : false), + dxTry(dx), + dxDid(0), + first(true), + last(false), + reject(false), + prevReject(false) + {} + }; + // Declare run-time constructor selection table @@ -150,17 +177,31 @@ public: // Update the state and return an estimate for the next step in dxTry virtual void solve ( - const ODESystem& ode, scalar& x, scalarField& y, scalar& dxTry - ) const = 0; + ) const //= 0; + { + stepState step(dxTry); + solve(x, y, step); + dxTry = step.dxTry; + } + + //- Solve the ODE system as far as possible upto dxTry + // adjusting the step as necessary to provide a solution within + // the specified tolerance. + // Update the state and return an estimate for the next step in dxTry + virtual void solve + ( + scalar& x, + scalarField& y, + stepState& step + ) const; //- Solve the ODE system from xStart to xEnd, update the state // and return an estimate for the next step in dxTry virtual void solve ( - const ODESystem& ode, const scalar xStart, const scalar xEnd, scalarField& y, diff --git a/src/ODE/ODESolvers/RKCK45/RKCK45.C b/src/ODE/ODESolvers/RKCK45/RKCK45.C index 2de3cdf99e77d8d592871c83aefd4df61a38573a..30ae91de1a283437c8ac241e40f1631841831e98 100644 --- a/src/ODE/ODESolvers/RKCK45/RKCK45.C +++ b/src/ODE/ODESolvers/RKCK45/RKCK45.C @@ -89,7 +89,6 @@ Foam::RKCK45::RKCK45(const ODESystem& ode, const dictionary& dict) Foam::scalar Foam::RKCK45::solve ( - const ODESystem& odes, const scalar x0, const scalarField& y0, const scalarField& dydx0, @@ -102,21 +101,21 @@ Foam::scalar Foam::RKCK45::solve yTemp_[i] = y0[i] + a21*dx*dydx0[i]; } - odes.derivatives(x0 + c2*dx, yTemp_, k2_); + odes_.derivatives(x0 + c2*dx, yTemp_, k2_); forAll(yTemp_, i) { yTemp_[i] = y0[i] + dx*(a31*dydx0[i] + a32*k2_[i]); } - odes.derivatives(x0 + c3*dx, yTemp_, k3_); + odes_.derivatives(x0 + c3*dx, yTemp_, k3_); forAll(yTemp_, i) { yTemp_[i] = y0[i] + dx*(a41*dydx0[i] + a42*k2_[i] + a43*k3_[i]); } - odes.derivatives(x0 + c4*dx, yTemp_, k4_); + odes_.derivatives(x0 + c4*dx, yTemp_, k4_); forAll(yTemp_, i) { @@ -124,7 +123,7 @@ Foam::scalar Foam::RKCK45::solve + dx*(a51*dydx0[i] + a52*k2_[i] + a53*k3_[i] + a54*k4_[i]); } - odes.derivatives(x0 + c5*dx, yTemp_, k5_); + odes_.derivatives(x0 + c5*dx, yTemp_, k5_); forAll(yTemp_, i) { @@ -133,7 +132,7 @@ Foam::scalar Foam::RKCK45::solve *(a61*dydx0[i] + a62*k2_[i] + a63*k3_[i] + a64*k4_[i] + a65*k5_[i]); } - odes.derivatives(x0 + c6*dx, yTemp_, k6_); + odes_.derivatives(x0 + c6*dx, yTemp_, k6_); forAll(y, i) { @@ -154,13 +153,12 @@ Foam::scalar Foam::RKCK45::solve void Foam::RKCK45::solve ( - const ODESystem& odes, scalar& x, scalarField& y, scalar& dxTry ) const { - adaptiveSolver::solve(odes, x, y, dxTry); + adaptiveSolver::solve(odes_, x, y, dxTry); } diff --git a/src/ODE/ODESolvers/RKCK45/RKCK45.H b/src/ODE/ODESolvers/RKCK45/RKCK45.H index a6b551a475a2ea6df493b53a56827204ee772dc1..5402c6efbd0a7c1822d62c7032bb54cc46da69ac 100644 --- a/src/ODE/ODESolvers/RKCK45/RKCK45.H +++ b/src/ODE/ODESolvers/RKCK45/RKCK45.H @@ -34,10 +34,7 @@ Description Cash, J.R., Karp, A.H. ACM Transactions on Mathematical Software, vol. 16, 1990, pp. 201–222. - \endverbatim - Based on code from: - \verbatim "Solving Ordinary Differential Equations I: Nonstiff Problems, second edition", Hairer, E., @@ -110,7 +107,6 @@ public: //- Solve a single step dx and return the error scalar solve ( - const ODESystem& ode, const scalar x0, const scalarField& y0, const scalarField& dydx0, @@ -121,7 +117,6 @@ public: //- Solve the ODE system and the update the state void solve ( - const ODESystem& ode, scalar& x, scalarField& y, scalar& dxTry diff --git a/src/ODE/ODESolvers/RKDP45/RKDP45.C b/src/ODE/ODESolvers/RKDP45/RKDP45.C index cf319dca8bd9b5b8ef2467fcee5ab59a335c262d..f9a3a78836eed98d7accad411c3c9f64f4528baa 100644 --- a/src/ODE/ODESolvers/RKDP45/RKDP45.C +++ b/src/ODE/ODESolvers/RKDP45/RKDP45.C @@ -94,7 +94,6 @@ Foam::RKDP45::RKDP45(const ODESystem& ode, const dictionary& dict) Foam::scalar Foam::RKDP45::solve ( - const ODESystem& odes, const scalar x0, const scalarField& y0, const scalarField& dydx0, @@ -107,21 +106,21 @@ Foam::scalar Foam::RKDP45::solve yTemp_[i] = y0[i] + a21*dx*dydx0[i]; } - odes.derivatives(x0 + c2*dx, yTemp_, k2_); + odes_.derivatives(x0 + c2*dx, yTemp_, k2_); forAll(yTemp_, i) { yTemp_[i] = y0[i] + dx*(a31*dydx0[i] + a32*k2_[i]); } - odes.derivatives(x0 + c3*dx, yTemp_, k3_); + odes_.derivatives(x0 + c3*dx, yTemp_, k3_); forAll(yTemp_, i) { yTemp_[i] = y0[i] + dx*(a41*dydx0[i] + a42*k2_[i] + a43*k3_[i]); } - odes.derivatives(x0 + c4*dx, yTemp_, k4_); + odes_.derivatives(x0 + c4*dx, yTemp_, k4_); forAll(yTemp_, i) { @@ -129,7 +128,7 @@ Foam::scalar Foam::RKDP45::solve + dx*(a51*dydx0[i] + a52*k2_[i] + a53*k3_[i] + a54*k4_[i]); } - odes.derivatives(x0 + c5*dx, yTemp_, k5_); + odes_.derivatives(x0 + c5*dx, yTemp_, k5_); forAll(yTemp_, i) { @@ -138,7 +137,7 @@ Foam::scalar Foam::RKDP45::solve *(a61*dydx0[i] + a62*k2_[i] + a63*k3_[i] + a64*k4_[i] + a65*k5_[i]); } - odes.derivatives(x0 + dx, yTemp_, k6_); + odes_.derivatives(x0 + dx, yTemp_, k6_); forAll(y, i) { @@ -147,7 +146,7 @@ Foam::scalar Foam::RKDP45::solve } // Reuse k2_ for the derivative of the new state - odes.derivatives(x0 + dx, y, k2_); + odes_.derivatives(x0 + dx, y, k2_); forAll(err_, i) { @@ -163,13 +162,12 @@ Foam::scalar Foam::RKDP45::solve void Foam::RKDP45::solve ( - const ODESystem& odes, scalar& x, scalarField& y, scalar& dxTry ) const { - adaptiveSolver::solve(odes, x, y, dxTry); + adaptiveSolver::solve(odes_, x, y, dxTry); } diff --git a/src/ODE/ODESolvers/RKDP45/RKDP45.H b/src/ODE/ODESolvers/RKDP45/RKDP45.H index 95ae212e661ac0bda12e1c10b8ce89421325dca4..e9ac93592a17b92d0c5af7ea10eea430ff8c0b14 100644 --- a/src/ODE/ODESolvers/RKDP45/RKDP45.H +++ b/src/ODE/ODESolvers/RKDP45/RKDP45.H @@ -34,10 +34,7 @@ Description Prince, P. J., Journal of Computational and Applied Mathematics, 6 (1), 1980: pp. 19-26. - \endverbatim - Based on code from: - \verbatim "Solving Ordinary Differential Equations I: Nonstiff Problems, second edition", Hairer, E., @@ -114,7 +111,6 @@ public: //- Solve a single step dx and return the error scalar solve ( - const ODESystem& ode, const scalar x0, const scalarField& y0, const scalarField& dydx0, @@ -125,7 +121,6 @@ public: //- Solve the ODE system and the update the state void solve ( - const ODESystem& ode, scalar& x, scalarField& y, scalar& dxTry diff --git a/src/ODE/ODESolvers/RKF45/RKF45.C b/src/ODE/ODESolvers/RKF45/RKF45.C index 661c618255eada4baf4106b112a3f1cefb22760f..92804e06342a68308cdedd6a9b0cd57942f208ab 100644 --- a/src/ODE/ODESolvers/RKF45/RKF45.C +++ b/src/ODE/ODESolvers/RKF45/RKF45.C @@ -90,7 +90,6 @@ Foam::RKF45::RKF45(const ODESystem& ode, const dictionary& dict) Foam::scalar Foam::RKF45::solve ( - const ODESystem& odes, const scalar x0, const scalarField& y0, const scalarField& dydx0, @@ -103,21 +102,21 @@ Foam::scalar Foam::RKF45::solve yTemp_[i] = y0[i] + a21*dx*dydx0[i]; } - odes.derivatives(x0 + c2*dx, yTemp_, k2_); + odes_.derivatives(x0 + c2*dx, yTemp_, k2_); forAll(yTemp_, i) { yTemp_[i] = y0[i] + dx*(a31*dydx0[i] + a32*k2_[i]); } - odes.derivatives(x0 + c3*dx, yTemp_, k3_); + odes_.derivatives(x0 + c3*dx, yTemp_, k3_); forAll(yTemp_, i) { yTemp_[i] = y0[i] + dx*(a41*dydx0[i] + a42*k2_[i] + a43*k3_[i]); } - odes.derivatives(x0 + c4*dx, yTemp_, k4_); + odes_.derivatives(x0 + c4*dx, yTemp_, k4_); forAll(yTemp_, i) { @@ -125,7 +124,7 @@ Foam::scalar Foam::RKF45::solve + dx*(a51*dydx0[i] + a52*k2_[i] + a53*k3_[i] + a54*k4_[i]); } - odes.derivatives(x0 + c5*dx, yTemp_, k5_); + odes_.derivatives(x0 + c5*dx, yTemp_, k5_); forAll(yTemp_, i) { @@ -134,7 +133,7 @@ Foam::scalar Foam::RKF45::solve *(a61*dydx0[i] + a62*k2_[i] + a63*k3_[i] + a64*k4_[i] + a65*k5_[i]); } - odes.derivatives(x0 + c6*dx, yTemp_, k6_); + odes_.derivatives(x0 + c6*dx, yTemp_, k6_); // Calculate the 5th-order solution forAll(y, i) @@ -159,13 +158,12 @@ Foam::scalar Foam::RKF45::solve void Foam::RKF45::solve ( - const ODESystem& odes, scalar& x, scalarField& y, scalar& dxTry ) const { - adaptiveSolver::solve(odes, x, y, dxTry); + adaptiveSolver::solve(odes_, x, y, dxTry); } diff --git a/src/ODE/ODESolvers/RKF45/RKF45.H b/src/ODE/ODESolvers/RKF45/RKF45.H index df91ed78083e1803af809ced4698eb2b8a9c182d..7567adc9590570e2509645fd6d3aca85a8c095c2 100644 --- a/src/ODE/ODESolvers/RKF45/RKF45.H +++ b/src/ODE/ODESolvers/RKF45/RKF45.H @@ -34,8 +34,6 @@ Description Fehlberg, E., NASA Technical Report 315, 1969. - Based on code from: - \verbatim "Solving Ordinary Differential Equations I: Nonstiff Problems, second edition", Hairer, E., @@ -48,31 +46,6 @@ Description and allows to perform an adapdive step-size control using these two order without the need of re-evaluation. - \f{align}{ - k_1 &= h f(t_k, y_k) \\ - k_2 &= h f(t_k + \frac{1}{4}h, y_k + \frac{1}{4}k_1) \\ - k_3 &= h f(t_k + \frac{3}{8}h, y_k + \frac{3}{32}k_1 + \frac{9}{32}k_2) \\ - k_4 &= h f(t_k + \frac{12}{13}h, y_k + \frac{1932}{2197}k_1 - \frac{7200}{2197}k_2 + \frac{7296}{2197}k_3) - \\ - k_5 &= h f(t_k + h, y_k + \frac{439}{216}k_1 - 8k_2 + \frac{3680}{513}k_3 - - \frac{845}{4104}k_4) \\ - k_6 &= h f(t_k + \frac{1}{2}h, y_k - \frac{8}{27}k_1 + 2k_2 - - \frac{3544}{2565}k_3 + \frac{1859}{4104}k_4 - \frac{11}{40}k_5) \\ - \f} - - Which yields the following update-steps for the 4th and 5th order: - - \f{align}{ - \Delta_4 &= \frac{25}{216}k_1 + \frac{1408}{2565}k_3 + - \frac{2197}{4101}k_4 - \frac{1}{5}k_5 \\ - \Delta_5 &= \frac{16}{135}k_1 + \frac{6656}{12825}k_3 + - \frac{9}{50}k_5 + \frac{2}{55}k_6 - \f} - - The difference between the 5th and 4th order (\f$\epsilon = \left|\Delta_5 - - \Delta_4\right|\f$) can be used to determine if the stepsize \f$h\f$ needs - to be adjusted. - SourceFiles RKF45.C @@ -138,7 +111,6 @@ public: //- Solve a single step dx and return the error scalar solve ( - const ODESystem& ode, const scalar x0, const scalarField& y0, const scalarField& dydx0, @@ -149,7 +121,6 @@ public: //- Solve the ODE system and the update the state void solve ( - const ODESystem& ode, scalar& x, scalarField& y, scalar& dxTry diff --git a/src/ODE/ODESolvers/Rosenbrock21/Rosenbrock21.C b/src/ODE/ODESolvers/Rosenbrock12/Rosenbrock12.C similarity index 77% rename from src/ODE/ODESolvers/Rosenbrock21/Rosenbrock21.C rename to src/ODE/ODESolvers/Rosenbrock12/Rosenbrock12.C index 13371a8e90a2bb909aa71107087a1d38606b14e0..f69e6a9cdeb20c9900dbfd651b34e57590606770 100644 --- a/src/ODE/ODESolvers/Rosenbrock21/Rosenbrock21.C +++ b/src/ODE/ODESolvers/Rosenbrock12/Rosenbrock12.C @@ -23,33 +23,33 @@ License \*---------------------------------------------------------------------------*/ -#include "Rosenbrock21.H" +#include "Rosenbrock12.H" #include "addToRunTimeSelectionTable.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // namespace Foam { - defineTypeNameAndDebug(Rosenbrock21, 0); - addToRunTimeSelectionTable(ODESolver, Rosenbrock21, dictionary); + defineTypeNameAndDebug(Rosenbrock12, 0); + addToRunTimeSelectionTable(ODESolver, Rosenbrock12, dictionary); const scalar - Rosenbrock21::gamma = 1 + 1.0/std::sqrt(2.0), - Rosenbrock21::a21 = 1.0/gamma, - Rosenbrock21::c2 = 1.0, - Rosenbrock21::c21 = -2.0/gamma, - Rosenbrock21::b1 = (3.0/2.0)/gamma, - Rosenbrock21::b2 = (1.0/2.0)/gamma, - Rosenbrock21::e1 = b1 - 1.0/gamma, - Rosenbrock21::e2 = b2, - Rosenbrock21::d1 = gamma, - Rosenbrock21::d2 = -gamma; + Rosenbrock12::gamma = 1 + 1.0/std::sqrt(2.0), + Rosenbrock12::a21 = 1.0/gamma, + Rosenbrock12::c2 = 1.0, + Rosenbrock12::c21 = -2.0/gamma, + Rosenbrock12::b1 = (3.0/2.0)/gamma, + Rosenbrock12::b2 = (1.0/2.0)/gamma, + Rosenbrock12::e1 = b1 - 1.0/gamma, + Rosenbrock12::e2 = b2, + Rosenbrock12::d1 = gamma, + Rosenbrock12::d2 = -gamma; } // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // -Foam::Rosenbrock21::Rosenbrock21(const ODESystem& ode, const dictionary& dict) +Foam::Rosenbrock12::Rosenbrock12(const ODESystem& ode, const dictionary& dict) : ODESolver(ode, dict), adaptiveSolver(ode, dict), @@ -66,9 +66,8 @@ Foam::Rosenbrock21::Rosenbrock21(const ODESystem& ode, const dictionary& dict) // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // -Foam::scalar Foam::Rosenbrock21::solve +Foam::scalar Foam::Rosenbrock12::solve ( - const ODESystem& ode, const scalar x0, const scalarField& y0, const scalarField& dydx0, @@ -76,7 +75,7 @@ Foam::scalar Foam::Rosenbrock21::solve scalarField& y ) const { - ode.jacobian(x0, y0, dfdx_, dfdy_); + odes_.jacobian(x0, y0, dfdx_, dfdy_); for (register label i=0; i<n_; i++) { @@ -104,7 +103,7 @@ Foam::scalar Foam::Rosenbrock21::solve y[i] = y0[i] + a21*k1_[i]; } - ode.derivatives(x0 + c2*dx, y, dydx_); + odes_.derivatives(x0 + c2*dx, y, dydx_); forAll(k2_, i) { @@ -124,15 +123,14 @@ Foam::scalar Foam::Rosenbrock21::solve } -void Foam::Rosenbrock21::solve +void Foam::Rosenbrock12::solve ( - const ODESystem& odes, scalar& x, scalarField& y, scalar& dxTry ) const { - adaptiveSolver::solve(odes, x, y, dxTry); + adaptiveSolver::solve(odes_, x, y, dxTry); } diff --git a/src/ODE/ODESolvers/Rosenbrock21/Rosenbrock21.H b/src/ODE/ODESolvers/Rosenbrock12/Rosenbrock12.H similarity index 90% rename from src/ODE/ODESolvers/Rosenbrock21/Rosenbrock21.H rename to src/ODE/ODESolvers/Rosenbrock12/Rosenbrock12.H index a29207e1290cdb16b10f391218ee3ea42c3018bc..7635e9a250028d2e0b1fc9170f878390a733f36d 100644 --- a/src/ODE/ODESolvers/Rosenbrock21/Rosenbrock21.H +++ b/src/ODE/ODESolvers/Rosenbrock12/Rosenbrock12.H @@ -22,7 +22,7 @@ License along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. Class - Foam::Rosenbrock21 + Foam::Rosenbrock12 Description L-stable embedded Rosenbrock ODE solver of order (1)2. @@ -39,12 +39,12 @@ Description \endverbatim SourceFiles - Rosenbrock21.C + Rosenbrock12.C \*---------------------------------------------------------------------------*/ -#ifndef Rosenbrock21_H -#define Rosenbrock21_H +#ifndef Rosenbrock12_H +#define Rosenbrock12_H #include "ODESolver.H" #include "adaptiveSolver.H" @@ -55,10 +55,10 @@ namespace Foam { /*---------------------------------------------------------------------------*\ - Class Rosenbrock21 Declaration + Class Rosenbrock12 Declaration \*---------------------------------------------------------------------------*/ -class Rosenbrock21 +class Rosenbrock12 : public ODESolver, public adaptiveSolver @@ -87,13 +87,13 @@ class Rosenbrock21 public: //- Runtime type information - TypeName("Rosenbrock21"); + TypeName("Rosenbrock12"); // Constructors //- Construct from ODE - Rosenbrock21(const ODESystem& ode, const dictionary& dict); + Rosenbrock12(const ODESystem& ode, const dictionary& dict); // Member Functions @@ -101,7 +101,6 @@ public: //- Solve a single step dx and return the error scalar solve ( - const ODESystem& ode, const scalar x0, const scalarField& y0, const scalarField& dydx0, @@ -112,7 +111,6 @@ public: //- Solve the ODE system and the update the state void solve ( - const ODESystem& ode, scalar& x, scalarField& y, scalar& dxTry diff --git a/src/ODE/ODESolvers/Rosenbrock32/Rosenbrock32.C b/src/ODE/ODESolvers/Rosenbrock23/Rosenbrock23.C similarity index 69% rename from src/ODE/ODESolvers/Rosenbrock32/Rosenbrock32.C rename to src/ODE/ODESolvers/Rosenbrock23/Rosenbrock23.C index e471e3ffe18da6b1ed605462c5dde0976260bbb2..035502714ea2003976ecac8678c9d83e570dfda2 100644 --- a/src/ODE/ODESolvers/Rosenbrock32/Rosenbrock32.C +++ b/src/ODE/ODESolvers/Rosenbrock23/Rosenbrock23.C @@ -23,45 +23,45 @@ License \*---------------------------------------------------------------------------*/ -#include "Rosenbrock32.H" +#include "Rosenbrock23.H" #include "addToRunTimeSelectionTable.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // namespace Foam { - defineTypeNameAndDebug(Rosenbrock32, 0); - addToRunTimeSelectionTable(ODESolver, Rosenbrock32, dictionary); + defineTypeNameAndDebug(Rosenbrock23, 0); + addToRunTimeSelectionTable(ODESolver, Rosenbrock23, dictionary); const scalar - Rosenbrock32::a21 = 1, - Rosenbrock32::a31 = 1, - Rosenbrock32::a32 = 0, + Rosenbrock23::a21 = 1, + Rosenbrock23::a31 = 1, + Rosenbrock23::a32 = 0, - Rosenbrock32::c21 = -1.0156171083877702091975600115545, - Rosenbrock32::c31 = 4.0759956452537699824805835358067, - Rosenbrock32::c32 = 9.2076794298330791242156818474003, + Rosenbrock23::c21 = -1.0156171083877702091975600115545, + Rosenbrock23::c31 = 4.0759956452537699824805835358067, + Rosenbrock23::c32 = 9.2076794298330791242156818474003, - Rosenbrock32::b1 = 1, - Rosenbrock32::b2 = 6.1697947043828245592553615689730, - Rosenbrock32::b3 = -0.4277225654321857332623837380651, + Rosenbrock23::b1 = 1, + Rosenbrock23::b2 = 6.1697947043828245592553615689730, + Rosenbrock23::b3 = -0.4277225654321857332623837380651, - Rosenbrock32::e1 = 0.5, - Rosenbrock32::e2 = -2.9079558716805469821718236208017, - Rosenbrock32::e3 = 0.2235406989781156962736090927619, + Rosenbrock23::e1 = 0.5, + Rosenbrock23::e2 = -2.9079558716805469821718236208017, + Rosenbrock23::e3 = 0.2235406989781156962736090927619, - Rosenbrock32::gamma = 0.43586652150845899941601945119356, - Rosenbrock32::c2 = 0.43586652150845899941601945119356, + Rosenbrock23::gamma = 0.43586652150845899941601945119356, + Rosenbrock23::c2 = 0.43586652150845899941601945119356, - Rosenbrock32::d1 = 0.43586652150845899941601945119356, - Rosenbrock32::d2 = 0.24291996454816804366592249683314, - Rosenbrock32::d3 = 2.1851380027664058511513169485832; + Rosenbrock23::d1 = 0.43586652150845899941601945119356, + Rosenbrock23::d2 = 0.24291996454816804366592249683314, + Rosenbrock23::d3 = 2.1851380027664058511513169485832; } // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // -Foam::Rosenbrock32::Rosenbrock32(const ODESystem& ode, const dictionary& dict) +Foam::Rosenbrock23::Rosenbrock23(const ODESystem& ode, const dictionary& dict) : ODESolver(ode, dict), adaptiveSolver(ode, dict), @@ -79,9 +79,8 @@ Foam::Rosenbrock32::Rosenbrock32(const ODESystem& ode, const dictionary& dict) // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // -Foam::scalar Foam::Rosenbrock32::solve +Foam::scalar Foam::Rosenbrock23::solve ( - const ODESystem& ode, const scalar x0, const scalarField& y0, const scalarField& dydx0, @@ -89,7 +88,7 @@ Foam::scalar Foam::Rosenbrock32::solve scalarField& y ) const { - ode.jacobian(x0, y0, dfdx_, dfdy_); + odes_.jacobian(x0, y0, dfdx_, dfdy_); for (register label i=0; i<n_; i++) { @@ -117,7 +116,7 @@ Foam::scalar Foam::Rosenbrock32::solve y[i] = y0[i] + a21*k1_[i]; } - ode.derivatives(x0 + c2*dx, y, dydx_); + odes_.derivatives(x0 + c2*dx, y, dydx_); forAll(k2_, i) { @@ -146,15 +145,14 @@ Foam::scalar Foam::Rosenbrock32::solve } -void Foam::Rosenbrock32::solve +void Foam::Rosenbrock23::solve ( - const ODESystem& odes, scalar& x, scalarField& y, scalar& dxTry ) const { - adaptiveSolver::solve(odes, x, y, dxTry); + adaptiveSolver::solve(odes_, x, y, dxTry); } diff --git a/src/ODE/ODESolvers/Rosenbrock32/Rosenbrock32.H b/src/ODE/ODESolvers/Rosenbrock23/Rosenbrock23.H similarity index 91% rename from src/ODE/ODESolvers/Rosenbrock32/Rosenbrock32.H rename to src/ODE/ODESolvers/Rosenbrock23/Rosenbrock23.H index 8cd2e50dbd9818aabcf0cb30b9455dd777c83ff5..1c740d74585c203aa4e92c5dd917f659be409f80 100644 --- a/src/ODE/ODESolvers/Rosenbrock32/Rosenbrock32.H +++ b/src/ODE/ODESolvers/Rosenbrock23/Rosenbrock23.H @@ -22,7 +22,7 @@ License along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. Class - Foam::Rosenbrock32 + Foam::Rosenbrock23 Description L-stable embedded Rosenbrock ODE solver of order (3)4. @@ -42,12 +42,12 @@ Description \endverbatim SourceFiles - Rosenbrock32.C + Rosenbrock23.C \*---------------------------------------------------------------------------*/ -#ifndef Rosenbrock32_H -#define Rosenbrock32_H +#ifndef Rosenbrock23_H +#define Rosenbrock23_H #include "ODESolver.H" #include "adaptiveSolver.H" @@ -58,10 +58,10 @@ namespace Foam { /*---------------------------------------------------------------------------*\ - Class Rosenbrock32 Declaration + Class Rosenbrock23 Declaration \*---------------------------------------------------------------------------*/ -class Rosenbrock32 +class Rosenbrock23 : public ODESolver, public adaptiveSolver @@ -91,13 +91,13 @@ class Rosenbrock32 public: //- Runtime type information - TypeName("Rosenbrock32"); + TypeName("Rosenbrock23"); // Constructors //- Construct from ODE - Rosenbrock32(const ODESystem& ode, const dictionary& dict); + Rosenbrock23(const ODESystem& ode, const dictionary& dict); // Member Functions @@ -105,7 +105,6 @@ public: //- Solve a single step dx and return the error scalar solve ( - const ODESystem& ode, const scalar x0, const scalarField& y0, const scalarField& dydx0, @@ -116,7 +115,6 @@ public: //- Solve the ODE system and the update the state void solve ( - const ODESystem& ode, scalar& x, scalarField& y, scalar& dxTry diff --git a/src/ODE/ODESolvers/Rosenbrock43/Rosenbrock43.C b/src/ODE/ODESolvers/Rosenbrock34/Rosenbrock34.C similarity index 60% rename from src/ODE/ODESolvers/Rosenbrock43/Rosenbrock43.C rename to src/ODE/ODESolvers/Rosenbrock34/Rosenbrock34.C index 061390fdbc9e343251ac7d04da11001fdcdbedc4..65bf3ced87c0a5a13630d42175fc3ba20f8a4e9c 100644 --- a/src/ODE/ODESolvers/Rosenbrock43/Rosenbrock43.C +++ b/src/ODE/ODESolvers/Rosenbrock34/Rosenbrock34.C @@ -23,89 +23,89 @@ License \*---------------------------------------------------------------------------*/ -#include "Rosenbrock43.H" +#include "Rosenbrock34.H" #include "addToRunTimeSelectionTable.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // namespace Foam { - defineTypeNameAndDebug(Rosenbrock43, 0); - addToRunTimeSelectionTable(ODESolver, Rosenbrock43, dictionary); + defineTypeNameAndDebug(Rosenbrock34, 0); + addToRunTimeSelectionTable(ODESolver, Rosenbrock34, dictionary); const scalar - // L-Stable constants from Hairer et. al. - Rosenbrock43::a21 = 2, - Rosenbrock43::a31 = 1.867943637803922, - Rosenbrock43::a32 = 0.2344449711399156, - - Rosenbrock43::c21 = -7.137615036412310, - Rosenbrock43::c31 = 2.580708087951457, - Rosenbrock43::c32 = 0.6515950076447975, - Rosenbrock43::c41 = -2.137148994382534, - Rosenbrock43::c42 = -0.3214669691237626, - Rosenbrock43::c43 = -0.6949742501781779, - - Rosenbrock43::b1 = 2.255570073418735, - Rosenbrock43::b2 = 0.2870493262186792, - Rosenbrock43::b3 = 0.435317943184018, - Rosenbrock43::b4 = 1.093502252409163, - - Rosenbrock43::e1 = -0.2815431932141155, - Rosenbrock43::e2 = -0.0727619912493892, - Rosenbrock43::e3 = -0.1082196201495311, - Rosenbrock43::e4 = -1.093502252409163, - - Rosenbrock43::gamma = 0.57282, - Rosenbrock43::c2 = 1.14564, - Rosenbrock43::c3 = 0.65521686381559, - - Rosenbrock43::d1 = 0.57282, - Rosenbrock43::d2 = -1.769193891319233, - Rosenbrock43::d3 = 0.7592633437920482, - Rosenbrock43::d4 = -0.1049021087100450; - // Constants by Shampine // More accurate than the L-Stable coefficients for small step-size // but less stable for large step-size + Rosenbrock34::a21 = 2, + Rosenbrock34::a31 = 48.0/25.0, + Rosenbrock34::a32 = 6.0/25.0, + + Rosenbrock34::c21 = -8, + Rosenbrock34::c31 = 372.0/25.0, + Rosenbrock34::c32 = 12.0/5.0, + + Rosenbrock34::c41 = -112.0/125.0, + Rosenbrock34::c42 = -54.0/125.0, + Rosenbrock34::c43 = -2.0/5.0, + + Rosenbrock34::b1 = 19.0/9.0, + Rosenbrock34::b2 = 1.0/2.0, + Rosenbrock34::b3 = 25.0/108.0, + Rosenbrock34::b4 = 125.0/108.0, + + Rosenbrock34::e1 = 34.0/108.0, + Rosenbrock34::e2 = 7.0/36.0, + Rosenbrock34::e3 = 0, + Rosenbrock34::e4 = 125.0/108.0, + + Rosenbrock34::gamma = 1.0/2.0, + Rosenbrock34::c2 = 1, + Rosenbrock34::c3 = 3.0/5.0, + + Rosenbrock34::d1 = 1.0/2.0, + Rosenbrock34::d2 = -3.0/2.0, + Rosenbrock34::d3 = 605.0/250.0, + Rosenbrock34::d4 = 29.0/250.0; + /* - Rosenbrock43::a21 = 2, - Rosenbrock43::a31 = 48.0/25.0, - Rosenbrock43::a32 = 6.0/25.0, - - Rosenbrock43::c21 = -8, - Rosenbrock43::c31 = 372.0/25.0, - Rosenbrock43::c32 = 12.0/5.0, - - Rosenbrock43::c41 = -112.0/125.0, - Rosenbrock43::c42 = -54.0/125.0, - Rosenbrock43::c43 = -2.0/5.0, - - Rosenbrock43::b1 = 19.0/9.0, - Rosenbrock43::b2 = 1.0/2.0, - Rosenbrock43::b3 = 25.0/108.0, - Rosenbrock43::b4 = 125.0/108.0, - - Rosenbrock43::e1 = 34.0/108.0, - Rosenbrock43::e2 = 7.0/36.0, - Rosenbrock43::e3 = 0, - Rosenbrock43::e4 = 125.0/108.0, - - Rosenbrock43::gamma = 1.0/2.0, - Rosenbrock43::c2 = 1, - Rosenbrock43::c3 = 3.0/5.0, - - Rosenbrock43::d1 = 1.0/2.0, - Rosenbrock43::d2 = -3.0/2.0, - Rosenbrock43::d3 = 605.0/250.0, - Rosenbrock43::d4 = 29.0/250.0; + // L-Stable constants from Hairer et. al. + Rosenbrock34::a21 = 2, + Rosenbrock34::a31 = 1.867943637803922, + Rosenbrock34::a32 = 0.2344449711399156, + + Rosenbrock34::c21 = -7.137615036412310, + Rosenbrock34::c31 = 2.580708087951457, + Rosenbrock34::c32 = 0.6515950076447975, + Rosenbrock34::c41 = -2.137148994382534, + Rosenbrock34::c42 = -0.3214669691237626, + Rosenbrock34::c43 = -0.6949742501781779, + + Rosenbrock34::b1 = 2.255570073418735, + Rosenbrock34::b2 = 0.2870493262186792, + Rosenbrock34::b3 = 0.435317943184018, + Rosenbrock34::b4 = 1.093502252409163, + + Rosenbrock34::e1 = -0.2815431932141155, + Rosenbrock34::e2 = -0.0727619912493892, + Rosenbrock34::e3 = -0.1082196201495311, + Rosenbrock34::e4 = -1.093502252409163, + + Rosenbrock34::gamma = 0.57282, + Rosenbrock34::c2 = 1.14564, + Rosenbrock34::c3 = 0.65521686381559, + + Rosenbrock34::d1 = 0.57282, + Rosenbrock34::d2 = -1.769193891319233, + Rosenbrock34::d3 = 0.7592633437920482, + Rosenbrock34::d4 = -0.1049021087100450; */ } // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // -Foam::Rosenbrock43::Rosenbrock43(const ODESystem& ode, const dictionary& dict) +Foam::Rosenbrock34::Rosenbrock34(const ODESystem& ode, const dictionary& dict) : ODESolver(ode, dict), adaptiveSolver(ode, dict), @@ -124,9 +124,8 @@ Foam::Rosenbrock43::Rosenbrock43(const ODESystem& ode, const dictionary& dict) // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // -Foam::scalar Foam::Rosenbrock43::solve +Foam::scalar Foam::Rosenbrock34::solve ( - const ODESystem& ode, const scalar x0, const scalarField& y0, const scalarField& dydx0, @@ -134,7 +133,7 @@ Foam::scalar Foam::Rosenbrock43::solve scalarField& y ) const { - ode.jacobian(x0, y0, dfdx_, dfdy_); + odes_.jacobian(x0, y0, dfdx_, dfdy_); for (register label i=0; i<n_; i++) { @@ -162,7 +161,7 @@ Foam::scalar Foam::Rosenbrock43::solve y[i] = y0[i] + a21*k1_[i]; } - ode.derivatives(x0 + c2*dx, y, dydx_); + odes_.derivatives(x0 + c2*dx, y, dydx_); forAll(k2_, i) { @@ -177,7 +176,7 @@ Foam::scalar Foam::Rosenbrock43::solve y[i] = y0[i] + a31*k1_[i] + a32*k2_[i]; } - ode.derivatives(x0 + c3*dx, y, dydx_); + odes_.derivatives(x0 + c3*dx, y, dydx_); forAll(k3_, i) { @@ -206,15 +205,14 @@ Foam::scalar Foam::Rosenbrock43::solve } -void Foam::Rosenbrock43::solve +void Foam::Rosenbrock34::solve ( - const ODESystem& odes, scalar& x, scalarField& y, scalar& dxTry ) const { - adaptiveSolver::solve(odes, x, y, dxTry); + adaptiveSolver::solve(odes_, x, y, dxTry); } diff --git a/src/ODE/ODESolvers/Rosenbrock43/Rosenbrock43.H b/src/ODE/ODESolvers/Rosenbrock34/Rosenbrock34.H similarity index 90% rename from src/ODE/ODESolvers/Rosenbrock43/Rosenbrock43.H rename to src/ODE/ODESolvers/Rosenbrock34/Rosenbrock34.H index f519f84b351e686a2c1aa46d7489ea2deb989592..17da8dad05f60b39b52331539b29ec00ebb2ab36 100644 --- a/src/ODE/ODESolvers/Rosenbrock43/Rosenbrock43.H +++ b/src/ODE/ODESolvers/Rosenbrock34/Rosenbrock34.H @@ -22,12 +22,11 @@ License along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. Class - Foam::Rosenbrock43 + Foam::Rosenbrock34 Description L-stable embedded Rosenbrock ODE solver of order (3)4. - Based on code from: \verbatim "Solving Ordinary Differential Equations II: Stiff and Differential-Algebraic Problems, second edition", @@ -37,7 +36,7 @@ Description Springer-Verlag, Berlin. 1996. \endverbatim - Also provided are the constants from: + The default constants are from: \verbatim "Implementation of Rosenbrock Methods" Shampine, L. F., @@ -46,13 +45,15 @@ Description with which the scheme is more accurate than with the L-Stable coefficients for small step-size but less stable for large step-size. + The L-Stable scheme constants are provided commented-out in Rosenbrock34.C + SourceFiles - Rosenbrock43.C + Rosenbrock34.C \*---------------------------------------------------------------------------*/ -#ifndef Rosenbrock43_H -#define Rosenbrock43_H +#ifndef Rosenbrock34_H +#define Rosenbrock34_H #include "ODESolver.H" #include "adaptiveSolver.H" @@ -63,10 +64,10 @@ namespace Foam { /*---------------------------------------------------------------------------*\ - Class Rosenbrock43 Declaration + Class Rosenbrock34 Declaration \*---------------------------------------------------------------------------*/ -class Rosenbrock43 +class Rosenbrock34 : public ODESolver, public adaptiveSolver @@ -98,13 +99,13 @@ class Rosenbrock43 public: //- Runtime type information - TypeName("Rosenbrock43"); + TypeName("Rosenbrock34"); // Constructors //- Construct from ODE - Rosenbrock43(const ODESystem& ode, const dictionary& dict); + Rosenbrock34(const ODESystem& ode, const dictionary& dict); // Member Functions @@ -112,7 +113,6 @@ public: //- Solve a single step dx and return the error scalar solve ( - const ODESystem& ode, const scalar x0, const scalarField& y0, const scalarField& dydx0, @@ -123,7 +123,6 @@ public: //- Solve the ODE system and the update the state void solve ( - const ODESystem& ode, scalar& x, scalarField& y, scalar& dxTry diff --git a/src/ODE/ODESolvers/SIBS/SIBS.C b/src/ODE/ODESolvers/SIBS/SIBS.C index eae8552a470b5dc8eeb298e88a114189db113eef..b6b6cf2c1d423272d9b673c1260d791de6c9fdf2 100644 --- a/src/ODE/ODESolvers/SIBS/SIBS.C +++ b/src/ODE/ODESolvers/SIBS/SIBS.C @@ -70,13 +70,12 @@ Foam::SIBS::SIBS(const ODESystem& ode, const dictionary& dict) void Foam::SIBS::solve ( - const ODESystem& ode, scalar& x, scalarField& y, scalar& dxTry ) const { - ode.derivatives(x, y, dydx0_); + odes_.derivatives(x, y, dydx0_); scalar h = dxTry; bool exitflag = false; @@ -124,7 +123,7 @@ void Foam::SIBS::solve label k = 0; yTemp_ = y; - ode.jacobian(x, y, dfdx_, dfdy_); + odes_.jacobian(x, y, dfdx_, dfdy_); if (x != xNew_ || h != dxTry) { @@ -151,7 +150,7 @@ void Foam::SIBS::solve << exit(FatalError); } - SIMPR(ode, x, yTemp_, dydx0_, dfdx_, dfdy_, h, nSeq_[k], ySeq_); + SIMPR(x, yTemp_, dydx0_, dfdx_, dfdy_, h, nSeq_[k], ySeq_); scalar xest = sqr(h/nSeq_[k]); polyExtrapolate(k, xest, ySeq_, y, yErr_, x_p_, d_p_); diff --git a/src/ODE/ODESolvers/SIBS/SIBS.H b/src/ODE/ODESolvers/SIBS/SIBS.H index 03664fd53ab3d910be516fa94c63d3d6c4d41f80..0ef0a1d40cd61783d49231085ba3aa82863d5ccb 100644 --- a/src/ODE/ODESolvers/SIBS/SIBS.H +++ b/src/ODE/ODESolvers/SIBS/SIBS.H @@ -84,7 +84,6 @@ class SIBS void SIMPR ( - const ODESystem& ode, const scalar xStart, const scalarField& y, const scalarField& dydx, @@ -123,7 +122,6 @@ public: void solve ( - const ODESystem& ode, scalar& x, scalarField& y, scalar& dxTry diff --git a/src/ODE/ODESolvers/SIBS/SIMPR.C b/src/ODE/ODESolvers/SIBS/SIMPR.C index 36402a202d2604675fbfb785bf9844e3dc5b5067..d21a931e1d9decfca0c04ddf97efdf70c28a64bc 100644 --- a/src/ODE/ODESolvers/SIBS/SIMPR.C +++ b/src/ODE/ODESolvers/SIBS/SIMPR.C @@ -29,7 +29,6 @@ License void Foam::SIBS::SIMPR ( - const ODESystem& ode, const scalar xStart, const scalarField& y, const scalarField& dydx, @@ -72,7 +71,7 @@ void Foam::SIBS::SIMPR scalar x = xStart + h; - ode.derivatives(x, ytemp, yEnd); + odes_.derivatives(x, ytemp, yEnd); for (register label nn=2; nn<=nSteps; nn++) { @@ -90,7 +89,7 @@ void Foam::SIBS::SIMPR x += h; - ode.derivatives(x, ytemp, yEnd); + odes_.derivatives(x, ytemp, yEnd); } for (register label i=0; i<n_; i++) { diff --git a/src/ODE/ODESolvers/Trapezoid/Trapezoid.C b/src/ODE/ODESolvers/Trapezoid/Trapezoid.C index 8a2c2814335091d008b4051fc5c36cb7e69e6b24..027308434d43015a45c5d87ca568326edf927460 100644 --- a/src/ODE/ODESolvers/Trapezoid/Trapezoid.C +++ b/src/ODE/ODESolvers/Trapezoid/Trapezoid.C @@ -49,7 +49,6 @@ Foam::Trapezoid::Trapezoid(const ODESystem& ode, const dictionary& dict) Foam::scalar Foam::Trapezoid::solve ( - const ODESystem& ode, const scalar x0, const scalarField& y0, const scalarField& dydx0, @@ -64,7 +63,7 @@ Foam::scalar Foam::Trapezoid::solve } // Evaluate the system for the predicted state - ode.derivatives(x0 + dx, y, err_); + odes_.derivatives(x0 + dx, y, err_); // Update the state as the average between the prediction and the correction // and estimate the error from the difference @@ -80,13 +79,12 @@ Foam::scalar Foam::Trapezoid::solve void Foam::Trapezoid::solve ( - const ODESystem& odes, scalar& x, scalarField& y, scalar& dxTry ) const { - adaptiveSolver::solve(odes, x, y, dxTry); + adaptiveSolver::solve(odes_, x, y, dxTry); } diff --git a/src/ODE/ODESolvers/Trapezoid/Trapezoid.H b/src/ODE/ODESolvers/Trapezoid/Trapezoid.H index 327dbe44bcee6b4d322b59c44652981f92d02a91..c52d80f51de2fe2c22a0efbe0932b27071ddd8a2 100644 --- a/src/ODE/ODESolvers/Trapezoid/Trapezoid.H +++ b/src/ODE/ODESolvers/Trapezoid/Trapezoid.H @@ -74,7 +74,6 @@ public: //- Solve a single step dx and return the error scalar solve ( - const ODESystem& ode, const scalar x0, const scalarField& y0, const scalarField& dydx0, @@ -85,7 +84,6 @@ public: //- Solve the ODE system and the update the state void solve ( - const ODESystem& ode, scalar& x, scalarField& y, scalar& dxTry diff --git a/src/ODE/ODESolvers/adaptiveSolver/adaptiveSolver.C b/src/ODE/ODESolvers/adaptiveSolver/adaptiveSolver.C index 13951ae7b3447fdc59d1afcd394c38e62b65628a..ee49a70d88e423eb9a1454b57a3a06eeccf467ac 100644 --- a/src/ODE/ODESolvers/adaptiveSolver/adaptiveSolver.C +++ b/src/ODE/ODESolvers/adaptiveSolver/adaptiveSolver.C @@ -64,7 +64,7 @@ void Foam::adaptiveSolver::solve do { // Solve step and provide error estimate - err = solve(odes, x, y, dydx0_, dx, yTemp_); + err = solve(x, y, dydx0_, dx, yTemp_); // If error is large reduce dx if (err > 1) diff --git a/src/ODE/ODESolvers/adaptiveSolver/adaptiveSolver.H b/src/ODE/ODESolvers/adaptiveSolver/adaptiveSolver.H index d86bb88ce13f33fc9dfe2e1d33a8b47b8685303b..0d7dcb035c2c312ceb3d383bc2fc8e24cd19ced9 100644 --- a/src/ODE/ODESolvers/adaptiveSolver/adaptiveSolver.H +++ b/src/ODE/ODESolvers/adaptiveSolver/adaptiveSolver.H @@ -77,7 +77,6 @@ public: //- Solve a single step dx and return the error virtual scalar solve ( - const ODESystem& ode, const scalar x0, const scalarField& y0, const scalarField& dydx0, diff --git a/src/ODE/ODESolvers/rodas32/rodas32.C b/src/ODE/ODESolvers/rodas23/rodas23.C similarity index 80% rename from src/ODE/ODESolvers/rodas32/rodas32.C rename to src/ODE/ODESolvers/rodas23/rodas23.C index 6221788ea6424d0ec3d0d3d1953ebd20af598a7b..e37bc3b00e05c5bd0671337d7f0ef03bf3412d19 100644 --- a/src/ODE/ODESolvers/rodas32/rodas32.C +++ b/src/ODE/ODESolvers/rodas23/rodas23.C @@ -23,35 +23,35 @@ License \*---------------------------------------------------------------------------*/ -#include "rodas32.H" +#include "rodas23.H" #include "addToRunTimeSelectionTable.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // namespace Foam { - defineTypeNameAndDebug(rodas32, 0); - addToRunTimeSelectionTable(ODESolver, rodas32, dictionary); + defineTypeNameAndDebug(rodas23, 0); + addToRunTimeSelectionTable(ODESolver, rodas23, dictionary); const scalar - rodas32::c3 = 1, - rodas32::d1 = 1.0/2.0, - rodas32::d2 = 3.0/2.0, - rodas32::a31 = 2, - rodas32::a41 = 2, - rodas32::c21 = 4, - rodas32::c31 = 1, - rodas32::c32 = -1, - rodas32::c41 = 1, - rodas32::c42 = -1, - rodas32::c43 = -8.0/3.0, - rodas32::gamma = 1.0/2.0; + rodas23::c3 = 1, + rodas23::d1 = 1.0/2.0, + rodas23::d2 = 3.0/2.0, + rodas23::a31 = 2, + rodas23::a41 = 2, + rodas23::c21 = 4, + rodas23::c31 = 1, + rodas23::c32 = -1, + rodas23::c41 = 1, + rodas23::c42 = -1, + rodas23::c43 = -8.0/3.0, + rodas23::gamma = 1.0/2.0; } // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // -Foam::rodas32::rodas32(const ODESystem& ode, const dictionary& dict) +Foam::rodas23::rodas23(const ODESystem& ode, const dictionary& dict) : ODESolver(ode, dict), adaptiveSolver(ode, dict), @@ -70,9 +70,8 @@ Foam::rodas32::rodas32(const ODESystem& ode, const dictionary& dict) // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // -Foam::scalar Foam::rodas32::solve +Foam::scalar Foam::rodas23::solve ( - const ODESystem& ode, const scalar x0, const scalarField& y0, const scalarField& dydx0, @@ -80,7 +79,7 @@ Foam::scalar Foam::rodas32::solve scalarField& y ) const { - ode.jacobian(x0, y0, dfdx_, dfdy_); + odes_.jacobian(x0, y0, dfdx_, dfdy_); for (register label i=0; i<n_; i++) { @@ -117,7 +116,7 @@ Foam::scalar Foam::rodas32::solve y[i] = y0[i] + dy_[i]; } - ode.derivatives(x0 + dx, y, dydx_); + odes_.derivatives(x0 + dx, y, dydx_); forAll(k3_, i) { @@ -133,7 +132,7 @@ Foam::scalar Foam::rodas32::solve y[i] = y0[i] + dy_[i]; } - ode.derivatives(x0 + dx, y, dydx_); + odes_.derivatives(x0 + dx, y, dydx_); forAll(err_, i) { @@ -151,15 +150,14 @@ Foam::scalar Foam::rodas32::solve } -void Foam::rodas32::solve +void Foam::rodas23::solve ( - const ODESystem& odes, scalar& x, scalarField& y, scalar& dxTry ) const { - adaptiveSolver::solve(odes, x, y, dxTry); + adaptiveSolver::solve(odes_, x, y, dxTry); } diff --git a/src/ODE/ODESolvers/rodas32/rodas32.H b/src/ODE/ODESolvers/rodas23/rodas23.H similarity index 92% rename from src/ODE/ODESolvers/rodas32/rodas32.H rename to src/ODE/ODESolvers/rodas23/rodas23.H index 5cd05e9a658053bf9dc113a457a9e8efce7d8e02..eceb512bbbd72e3a9495ca3600546d4b39078e2f 100644 --- a/src/ODE/ODESolvers/rodas32/rodas32.H +++ b/src/ODE/ODESolvers/rodas23/rodas23.H @@ -22,7 +22,7 @@ License along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. Class - Foam::rodas32 + Foam::rodas23 Description L-stable, stiffly-accurate embedded Rosenbrock ODE solver of order (2)3. @@ -42,12 +42,12 @@ Description \endverbatim SourceFiles - rodas32.C + rodas23.C \*---------------------------------------------------------------------------*/ -#ifndef rodas32_H -#define rodas32_H +#ifndef rodas23_H +#define rodas23_H #include "ODESolver.H" #include "adaptiveSolver.H" @@ -58,10 +58,10 @@ namespace Foam { /*---------------------------------------------------------------------------*\ - Class rodas32 Declaration + Class rodas23 Declaration \*---------------------------------------------------------------------------*/ -class rodas32 +class rodas23 : public ODESolver, public adaptiveSolver @@ -91,13 +91,13 @@ class rodas32 public: //- Runtime type information - TypeName("rodas32"); + TypeName("rodas23"); // Constructors //- Construct from ODE - rodas32(const ODESystem& ode, const dictionary& dict); + rodas23(const ODESystem& ode, const dictionary& dict); // Member Functions @@ -105,7 +105,6 @@ public: //- Solve a single step dx and return the error scalar solve ( - const ODESystem& ode, const scalar x0, const scalarField& y0, const scalarField& dydx0, @@ -116,7 +115,6 @@ public: //- Solve the ODE system and the update the state void solve ( - const ODESystem& ode, scalar& x, scalarField& y, scalar& dxTry diff --git a/src/ODE/ODESolvers/rodas43/rodas43.C b/src/ODE/ODESolvers/rodas34/rodas34.C similarity index 67% rename from src/ODE/ODESolvers/rodas43/rodas43.C rename to src/ODE/ODESolvers/rodas34/rodas34.C index 92b78a7ab46aa2b21e24ac0802bcb5fce77750c2..5d3ca9ac352745f7785f81033a9153051c48a6ed 100644 --- a/src/ODE/ODESolvers/rodas43/rodas43.C +++ b/src/ODE/ODESolvers/rodas34/rodas34.C @@ -23,56 +23,56 @@ License \*---------------------------------------------------------------------------*/ -#include "rodas43.H" +#include "rodas34.H" #include "addToRunTimeSelectionTable.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // namespace Foam { - defineTypeNameAndDebug(rodas43, 0); - addToRunTimeSelectionTable(ODESolver, rodas43, dictionary); + defineTypeNameAndDebug(rodas34, 0); + addToRunTimeSelectionTable(ODESolver, rodas34, dictionary); const scalar - rodas43::c2 = 0.386, - rodas43::c3 = 0.21, - rodas43::c4 = 0.63, - rodas43::d1 = 0.25, - rodas43::d2 = -0.1043, - rodas43::d3 = 0.1035, - rodas43::d4 = -0.3620000000000023e-01, - rodas43::a21 = 0.1544e1, - rodas43::a31 = 0.9466785280815826, - rodas43::a32 = 0.2557011698983284, - rodas43::a41 = 0.3314825187068521e1, - rodas43::a42 = 0.2896124015972201e1, - rodas43::a43 = 0.9986419139977817, - rodas43::a51 = 0.1221224509226641e1, - rodas43::a52 = 0.6019134481288629e1, - rodas43::a53 = 0.1253708332932087e2, - rodas43::a54 = -0.6878860361058950, - rodas43::c21 = -0.56688e1, - rodas43::c31 = -0.2430093356833875e1, - rodas43::c32 = -0.2063599157091915, - rodas43::c41 = -0.1073529058151375, - rodas43::c42 = -0.9594562251023355e1, - rodas43::c43 = -0.2047028614809616e2, - rodas43::c51 = 0.7496443313967647e1, - rodas43::c52 = -0.1024680431464352e2, - rodas43::c53 = -0.3399990352819905e2, - rodas43::c54 = 0.1170890893206160e2, - rodas43::c61 = 0.8083246795921522e1, - rodas43::c62 = -0.7981132988064893e1, - rodas43::c63 = -0.3152159432874371e2, - rodas43::c64 = 0.1631930543123136e2, - rodas43::c65 = -0.6058818238834054e1, - rodas43::gamma = 0.25; + rodas34::c2 = 0.386, + rodas34::c3 = 0.21, + rodas34::c4 = 0.63, + rodas34::d1 = 0.25, + rodas34::d2 = -0.1043, + rodas34::d3 = 0.1035, + rodas34::d4 = -0.3620000000000023e-01, + rodas34::a21 = 0.1544e1, + rodas34::a31 = 0.9466785280815826, + rodas34::a32 = 0.2557011698983284, + rodas34::a41 = 0.3314825187068521e1, + rodas34::a42 = 0.2896124015972201e1, + rodas34::a43 = 0.9986419139977817, + rodas34::a51 = 0.1221224509226641e1, + rodas34::a52 = 0.6019134481288629e1, + rodas34::a53 = 0.1253708332932087e2, + rodas34::a54 = -0.6878860361058950, + rodas34::c21 = -0.56688e1, + rodas34::c31 = -0.2430093356833875e1, + rodas34::c32 = -0.2063599157091915, + rodas34::c41 = -0.1073529058151375, + rodas34::c42 = -0.9594562251023355e1, + rodas34::c43 = -0.2047028614809616e2, + rodas34::c51 = 0.7496443313967647e1, + rodas34::c52 = -0.1024680431464352e2, + rodas34::c53 = -0.3399990352819905e2, + rodas34::c54 = 0.1170890893206160e2, + rodas34::c61 = 0.8083246795921522e1, + rodas34::c62 = -0.7981132988064893e1, + rodas34::c63 = -0.3152159432874371e2, + rodas34::c64 = 0.1631930543123136e2, + rodas34::c65 = -0.6058818238834054e1, + rodas34::gamma = 0.25; } // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // -Foam::rodas43::rodas43(const ODESystem& ode, const dictionary& dict) +Foam::rodas34::rodas34(const ODESystem& ode, const dictionary& dict) : ODESolver(ode, dict), adaptiveSolver(ode, dict), @@ -93,9 +93,8 @@ Foam::rodas43::rodas43(const ODESystem& ode, const dictionary& dict) // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // -Foam::scalar Foam::rodas43::solve +Foam::scalar Foam::rodas34::solve ( - const ODESystem& ode, const scalar x0, const scalarField& y0, const scalarField& dydx0, @@ -103,7 +102,7 @@ Foam::scalar Foam::rodas43::solve scalarField& y ) const { - ode.jacobian(x0, y0, dfdx_, dfdy_); + odes_.jacobian(x0, y0, dfdx_, dfdy_); for (register label i=0; i<n_; i++) { @@ -131,7 +130,7 @@ Foam::scalar Foam::rodas43::solve y[i] = y0[i] + a21*k1_[i]; } - ode.derivatives(x0 + c2*dx, y, dydx_); + odes_.derivatives(x0 + c2*dx, y, dydx_); forAll(k2_, i) { @@ -146,7 +145,7 @@ Foam::scalar Foam::rodas43::solve y[i] = y0[i] + a31*k1_[i] + a32*k2_[i]; } - ode.derivatives(x0 + c3*dx, y, dydx_); + odes_.derivatives(x0 + c3*dx, y, dydx_); forAll(k3_, i) { @@ -161,7 +160,7 @@ Foam::scalar Foam::rodas43::solve y[i] = y0[i] + a41*k1_[i] + a42*k2_[i] + a43*k3_[i]; } - ode.derivatives(x0 + c4*dx, y, dydx_); + odes_.derivatives(x0 + c4*dx, y, dydx_); forAll(k4_, i) { @@ -178,7 +177,7 @@ Foam::scalar Foam::rodas43::solve y[i] = y0[i] + dy_[i]; } - ode.derivatives(x0 + dx, y, dydx_); + odes_.derivatives(x0 + dx, y, dydx_); forAll(k5_, i) { @@ -195,7 +194,7 @@ Foam::scalar Foam::rodas43::solve y[i] = y0[i] + dy_[i]; } - ode.derivatives(x0 + dx, y, dydx_); + odes_.derivatives(x0 + dx, y, dydx_); forAll(err_, i) { @@ -214,15 +213,14 @@ Foam::scalar Foam::rodas43::solve } -void Foam::rodas43::solve +void Foam::rodas34::solve ( - const ODESystem& odes, scalar& x, scalarField& y, scalar& dxTry ) const { - adaptiveSolver::solve(odes, x, y, dxTry); + adaptiveSolver::solve(odes_, x, y, dxTry); } diff --git a/src/ODE/ODESolvers/rodas43/rodas43.H b/src/ODE/ODESolvers/rodas34/rodas34.H similarity index 92% rename from src/ODE/ODESolvers/rodas43/rodas43.H rename to src/ODE/ODESolvers/rodas34/rodas34.H index e77c0b423b285550779b1f19d45309cd3ed0e840..68631bb020bb753a37d746bd5dd624b06b97c408 100644 --- a/src/ODE/ODESolvers/rodas43/rodas43.H +++ b/src/ODE/ODESolvers/rodas34/rodas34.H @@ -22,7 +22,7 @@ License along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. Class - Foam::rodas43 + Foam::rodas34 Description L-stable, stiffly-accurate embedded Rosenbrock ODE solver of order (3)4. @@ -38,12 +38,12 @@ Description \endverbatim SourceFiles - rodas43.C + rodas34.C \*---------------------------------------------------------------------------*/ -#ifndef rodas43_H -#define rodas43_H +#ifndef rodas34_H +#define rodas34_H #include "ODESolver.H" #include "adaptiveSolver.H" @@ -54,10 +54,10 @@ namespace Foam { /*---------------------------------------------------------------------------*\ - Class rodas43 Declaration + Class rodas34 Declaration \*---------------------------------------------------------------------------*/ -class rodas43 +class rodas34 : public ODESolver, public adaptiveSolver @@ -92,13 +92,13 @@ class rodas43 public: //- Runtime type information - TypeName("rodas43"); + TypeName("rodas34"); // Constructors //- Construct from ODE - rodas43(const ODESystem& ode, const dictionary& dict); + rodas34(const ODESystem& ode, const dictionary& dict); // Member Functions @@ -106,7 +106,6 @@ public: //- Solve a single step dx and return the error scalar solve ( - const ODESystem& ode, const scalar x0, const scalarField& y0, const scalarField& dydx0, @@ -117,7 +116,6 @@ public: //- Solve the ODE system and the update the state void solve ( - const ODESystem& ode, scalar& x, scalarField& y, scalar& dxTry diff --git a/src/ODE/ODESolvers/seulex/seulex.C b/src/ODE/ODESolvers/seulex/seulex.C index 69227f19638adb94d6c44481069d585acaa74f06..cc788f93082fa0dda41b16ca13ce417ecd2937a2 100644 --- a/src/ODE/ODESolvers/seulex/seulex.C +++ b/src/ODE/ODESolvers/seulex/seulex.C @@ -35,14 +35,13 @@ namespace Foam addToRunTimeSelectionTable(ODESolver, seulex, dictionary); const scalar - seulex::EPS = VSMALL, - seulex::STEPFAC1 = 0.6, - seulex::STEPFAC2 = 0.93, - seulex::STEPFAC3 = 0.1, - seulex::STEPFAC4 = 4.0, - seulex::STEPFAC5 = 0.5, - seulex::KFAC1 = 0.7, - seulex::KFAC2 = 0.9; + seulex::stepFactor1_ = 0.6, + seulex::stepFactor2_ = 0.93, + seulex::stepFactor3_ = 0.1, + seulex::stepFactor4_ = 4.0, + seulex::stepFactor5_ = 0.5, + seulex::kFactor1_ = 0.7, + seulex::kFactor2_ = 0.9; } @@ -51,150 +50,222 @@ namespace Foam Foam::seulex::seulex(const ODESystem& ode, const dictionary& dict) : ODESolver(ode, dict), - ode_(ode), - nSeq_(IMAXX), - cost_(IMAXX), + jacRedo_(min(1.0e-4, min(relTol_))), + nSeq_(iMaxx_), + cpu_(iMaxx_), + coeff_(iMaxx_, iMaxx_), + theta_(2.0*jacRedo_), + table_(kMaxx_, n_), dfdx_(n_), - factrl_(IMAXX), - table_(KMAXX,n_), - fSave_((IMAXX-1)*(IMAXX+1)/2 + 2,n_), dfdy_(n_), - calcJac_(false), - dense_(false), a_(n_), - coeff_(IMAXX,IMAXX), - pivotIndices_(n_, 0.0), - hOpt_(IMAXX), - work_(IMAXX), - ySaved_(n_), + pivotIndices_(n_), + dxOpt_(iMaxx_), + temp_(iMaxx_), + y0_(n_), ySequence_(n_), scale_(n_), - del_(n_), + dy_(n_), yTemp_(n_), - dyTemp_(n_), - delTemp_(n_) + dydx_(n_) { - const scalar costfunc = 1.0, costjac = 5.0, costlu = 1.0, costsolve = 1.0; + // The CPU time factors for the major parts of the algorithm + const scalar cpuFunc = 1.0, cpuJac = 5.0, cpuLU = 1.0, cpuSolve = 1.0; - jacRedo_ = min(1.0e-4, min(relTol_)); - theta_ = 2.0*jacRedo_; nSeq_[0] = 2; nSeq_[1] = 3; - for (label i = 2; i < IMAXX; i++) + for (int i=2; i<iMaxx_; i++) { nSeq_[i] = 2*nSeq_[i-2]; } - cost_[0] = costjac + costlu + nSeq_[0]*(costfunc + costsolve); + cpu_[0] = cpuJac + cpuLU + nSeq_[0]*(cpuFunc + cpuSolve); - for (label k=0;k<KMAXX;k++) + for (int k=0; k<kMaxx_; k++) { - cost_[k+1] = cost_[k] + (nSeq_[k+1]-1)*(costfunc + costsolve) + costlu; + cpu_[k+1] = cpu_[k] + (nSeq_[k+1]-1)*(cpuFunc + cpuSolve) + cpuLU; } - hnext_ =- VGREAT; - - //NOTE: the first element of relTol_ and absTol_ are used here. - scalar logfact =- log10(relTol_[0] + absTol_[0])*0.6 + 0.5; - - kTarg_ = min(1, min(KMAXX - 1, label(logfact))); - - for (label k = 0; k < IMAXX; k++) + // Set the extrapolation coefficients array + for (int k=0; k<iMaxx_; k++) { - for (label l = 0; l < k; l++) + for (int l=0; l<k; l++) { scalar ratio = scalar(nSeq_[k])/nSeq_[l]; coeff_[k][l] = 1.0/(ratio - 1.0); } } - - factrl_[0] = 1.0; - for (label k = 0; k < IMAXX - 1; k++) - { - factrl_[k+1] = (k+1)*factrl_[k]; - } } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -void Foam::seulex::solve +bool Foam::seulex::seul ( - const ODESystem& ode, - scalar& x, + const scalar x0, + const scalarField& y0, + const scalar dxTot, + const label k, scalarField& y, - scalar& dxTry + const scalarField& scale ) const { - step(dxTry, x, y); - dxTry = hnext_; + label nSteps = nSeq_[k]; + scalar dx = dxTot/nSteps; + + for (label i=0; i<n_; i++) + { + for (label j=0; j<n_; j++) + { + a_[i][j] = -dfdy_[i][j]; + } + + a_[i][i] += 1.0/dx; + } + + LUDecompose(a_, pivotIndices_); + + scalar xnew = x0 + dx; + odes_.derivatives(xnew, y0, dy_); + LUBacksubstitute(a_, pivotIndices_, dy_); + + yTemp_ = y0; + + for (label nn=1; nn<nSteps; nn++) + { + yTemp_ += dy_; + xnew += dx; + + if (nn == 1 && k<=1) + { + scalar dy1 = 0.0; + for (label i=0; i<n_; i++) + { + dy1 += sqr(dy_[i]/scale[i]); + } + dy1 = sqrt(dy1); + + odes_.derivatives(x0 + dx, yTemp_, dydx_); + for (label i=0; i<n_; i++) + { + dy_[i] = dydx_[i] - dy_[i]/dx; + } + + LUBacksubstitute(a_, pivotIndices_, dy_); + + scalar dy2 = 0.0; + for (label i=0; i<n_; i++) + { + dy2 += sqr(dy_[i]/scale[i]); + } + dy2 = sqrt(dy2); + theta_ = dy2/min(1.0, dy1 + SMALL); + + if (theta_ > 1.0) + { + return false; + } + } + + odes_.derivatives(xnew, yTemp_, dy_); + LUBacksubstitute(a_, pivotIndices_, dy_); + } + + for (label i=0; i<n_; i++) + { + y[i] = yTemp_[i] + dy_[i]; + } + + return true; } -void Foam::seulex::step(const scalar& htry, scalar& x, scalarField& y) const +void Foam::seulex::extrapolate +( + const label k, + scalarRectangularMatrix& table, + scalarField& y +) const { - static bool first_step = true, last_step = false; - static bool forward, reject = false, prev_reject = false; - static scalar errold; - label i, k; - scalar fac, h, hnew, err; - bool firstk; + for (int j=k-1; j>0; j--) + { + for (label i=0; i<n_; i++) + { + table[j-1][i] = + table[j][i] + coeff_[k][j]*(table[j][i] - table[j-1][i]); + } + } - work_[0] = 1.e30; - h = htry; - forward = h > 0 ? true : false; + for (int i=0; i<n_; i++) + { + y[i] = table[0][i] + coeff_[k][0]*(table[0][i] - y[i]); + } +} - ySaved_ = y; - if (h != hnext_ && !first_step) +void Foam::seulex::solve +( + scalar& x, + scalarField& y, + stepState& step +) const +{ + temp_[0] = GREAT; + scalar dx = step.dxTry; + y0_ = y; + dxOpt_[0] = mag(0.1*dx); + + if (step.first || step.prevReject) { - last_step = true; + theta_ = 2.0*jacRedo_; } - if (reject) + if (step.first) { - prev_reject = true; - last_step = false; - theta_=2.0*jacRedo_; + // NOTE: the first element of relTol_ and absTol_ are used here. + scalar logTol = -log10(relTol_[0] + absTol_[0])*0.6 + 0.5; + kTarg_ = max(1, min(kMaxx_ - 1, int(logTol))); } - for (i = 0; i < n_; i++) + forAll(scale_, i) { scale_[i] = absTol_[i] + relTol_[i]*mag(y[i]); } - reject = false; - firstk = true; - hnew = mag(h); + bool jacUpdated = false; - if (theta_ > jacRedo_ && !calcJac_) + if (theta_ > jacRedo_) { - ode_.jacobian(x, y, dfdx_, dfdy_); - calcJac_ = true; + odes_.jacobian(x, y, dfdx_, dfdy_); + jacUpdated = true; } - while (firstk || reject) + int k; + scalar dxNew = mag(dx); + bool firstk = true; + + while (firstk || step.reject) { - h = forward ? hnew : -hnew; + dx = step.forward ? dxNew : -dxNew; firstk = false; - reject = false; + step.reject = false; - if (mag(h) <= mag(x)*EPS) + if (mag(dx) <= mag(x)*SMALL) { - WarningIn("seulex::step(const scalar") - << "step size underflow in step :" << h << endl; + WarningIn("seulex::solve(scalar& x, scalarField& y, stepState&") + << "step size underflow :" << dx << endl; } - label ipt=-1; - for (k = 0; k <= kTarg_ + 1; k++) + scalar errOld; + + for (k=0; k<=kTarg_+1; k++) { - bool success = dy(x, ySaved_, h, k, ySequence_, ipt, scale_); + bool success = seul(x, y0_, dx, k, ySequence_, scale_); if (!success) { - reject = true; - hnew = mag(h)*STEPFAC5; + step.reject = true; + dxNew = mag(dx)*stepFactor5_; break; } @@ -204,45 +275,55 @@ void Foam::seulex::step(const scalar& htry, scalar& x, scalarField& y) const } else { - for (i = 0; i < n_; i++) + forAll(ySequence_, i) + { table_[k-1][i] = ySequence_[i]; + } } + if (k != 0) { - polyextr(k, table_, y); - err = 0.0; - for (i = 0; i < n_; i++) + extrapolate(k, table_, y); + scalar err = 0.0; + forAll(scale_, i) { - scale_[i] = absTol_[i] + relTol_[i]*mag(ySaved_[i]); + scale_[i] = absTol_[i] + relTol_[i]*mag(y0_[i]); err += sqr((y[i] - table_[0][i])/scale_[i]); } err = sqrt(err/n_); - if (err > 1.0/EPS || (k > 1 && err >= errold)) + if (err > 1.0/SMALL || (k > 1 && err >= errOld)) { - reject = true; - hnew = mag(h)*STEPFAC5; + step.reject = true; + dxNew = mag(dx)*stepFactor5_; break; } - errold = min(4.0*err, 1.0); + errOld = min(4*err, 1); scalar expo = 1.0/(k + 1); - scalar facmin = pow(STEPFAC3, expo); + scalar facmin = pow(stepFactor3_, expo); + scalar fac; if (err == 0.0) { fac = 1.0/facmin; } else { - fac = STEPFAC2/pow(err/STEPFAC1, expo); - fac = max(facmin/STEPFAC4, min(1.0/facmin, fac)); + fac = stepFactor2_/pow(err/stepFactor1_, expo); + fac = max(facmin/stepFactor4_, min(1.0/facmin, fac)); } - hOpt_[k] = mag(h*fac); - work_[k] = cost_[k]/hOpt_[k]; + dxOpt_[k] = mag(dx*fac); + temp_[k] = cpu_[k]/dxOpt_[k]; - if ((first_step || last_step) && err <= 1.0) + if ((step.first || step.last) && err <= 1.0) { break; } - if (k == kTarg_-1 && !prev_reject && !first_step && !last_step) + + if + ( + k == kTarg_ - 1 + && !step.prevReject + && !step.first && !step.last + ) { if (err <= 1.0) { @@ -250,16 +331,17 @@ void Foam::seulex::step(const scalar& htry, scalar& x, scalarField& y) const } else if (err > nSeq_[kTarg_]*nSeq_[kTarg_ + 1]*4.0) { - reject = true; + step.reject = true; kTarg_ = k; - if (kTarg_>1 && work_[k-1] < KFAC1*work_[k]) + if (kTarg_>1 && temp_[k-1] < kFactor1_*temp_[k]) { kTarg_--; } - hnew = hOpt_[kTarg_]; + dxNew = dxOpt_[kTarg_]; break; } } + if (k == kTarg_) { if (err <= 1.0) @@ -268,51 +350,55 @@ void Foam::seulex::step(const scalar& htry, scalar& x, scalarField& y) const } else if (err > nSeq_[k + 1]*2.0) { - reject = true; - if (kTarg_>1 && work_[k-1] < KFAC1*work_[k]) + step.reject = true; + if (kTarg_>1 && temp_[k-1] < kFactor1_*temp_[k]) { kTarg_--; } - hnew = hOpt_[kTarg_]; + dxNew = dxOpt_[kTarg_]; break; } } + if (k == kTarg_+1) { if (err > 1.0) { - reject = true; - if (kTarg_ > 1 && work_[kTarg_-1] < KFAC1*work_[kTarg_]) + step.reject = true; + if + ( + kTarg_ > 1 + && temp_[kTarg_-1] < kFactor1_*temp_[kTarg_] + ) { kTarg_--; } - hnew = hOpt_[kTarg_]; + dxNew = dxOpt_[kTarg_]; } break; } } } - if (reject) + if (step.reject) { - prev_reject = true; - if (!calcJac_) + step.prevReject = true; + if (!jacUpdated) { theta_ = 2.0*jacRedo_; - if (theta_ > jacRedo_ && !calcJac_) + if (theta_ > jacRedo_ && !jacUpdated) { - ode_.jacobian(x, y, dfdx_, dfdy_); - calcJac_ = true; + odes_.jacobian(x, y, dfdx_, dfdy_); + jacUpdated = true; } } } } - calcJac_ = false; + jacUpdated = false; - x += h; - hdid_ = h; - first_step = false; + step.dxDid = dx; + x += dx; label kopt; if (k == 1) @@ -322,180 +408,56 @@ void Foam::seulex::step(const scalar& htry, scalar& x, scalarField& y) const else if (k <= kTarg_) { kopt=k; - if (work_[k-1] < KFAC1*work_[k]) + if (temp_[k-1] < kFactor1_*temp_[k]) { kopt = k - 1; } - else if (work_[k] < KFAC2*work_[k - 1]) + else if (temp_[k] < kFactor2_*temp_[k - 1]) { - kopt = min(k + 1, KMAXX - 1); + kopt = min(k + 1, kMaxx_ - 1); } } else { kopt = k - 1; - if (k > 2 && work_[k-2] < KFAC1*work_[k - 1]) + if (k > 2 && temp_[k-2] < kFactor1_*temp_[k - 1]) { kopt = k - 2; } - if (work_[k] < KFAC2*work_[kopt]) + if (temp_[k] < kFactor2_*temp_[kopt]) { - kopt = min(k, KMAXX - 1); + kopt = min(k, kMaxx_ - 1); } } - if (prev_reject) + if (step.prevReject) { kTarg_ = min(kopt, k); - hnew = min(mag(h), hOpt_[kTarg_]); - prev_reject = false; + dxNew = min(mag(dx), dxOpt_[kTarg_]); + step.prevReject = false; } else { if (kopt <= k) { - hnew = hOpt_[kopt]; + dxNew = dxOpt_[kopt]; } else { - if (k < kTarg_ && work_[k] < KFAC2*work_[k - 1]) + if (k < kTarg_ && temp_[k] < kFactor2_*temp_[k - 1]) { - hnew = hOpt_[k]*cost_[kopt + 1]/cost_[k]; + dxNew = dxOpt_[k]*cpu_[kopt + 1]/cpu_[k]; } else { - hnew = hOpt_[k]*cost_[kopt]/cost_[k]; + dxNew = dxOpt_[k]*cpu_[kopt]/cpu_[k]; } } kTarg_ = kopt; } - if (forward) - { - hnext_ = hnew; - } - else - { - hnext_ =- hnew; - } -} - - -bool Foam::seulex::dy -( - const scalar& x, - scalarField& y, - const scalar htot, - const label k, - scalarField& yend, - label& ipt, - scalarField& scale -) const -{ - label nstep = nSeq_[k]; - scalar h = htot/nstep; - for (label i = 0; i < n_; i++) - { - for (label j = 0; j < n_; j++) a_[i][j] = -dfdy_[i][j]; - a_[i][i] += 1.0/h; - } - LUDecompose(a_, pivotIndices_); - scalar xnew = x + h; - - ode_.derivatives(xnew, y, del_); - - yTemp_ = y; - - LUBacksubstitute(a_, pivotIndices_, del_); - - if (dense_ && nstep == k + 1) - { - ipt++; - for (label i = 0; i < n_; i++) - { - fSave_[ipt][i] = del_[i]; - } - } - for (label nn = 1; nn < nstep; nn++) - { - for (label i=0;i<n_;i++) - { - yTemp_[i] += del_[i]; - } - xnew += h; - - ode_.derivatives(xnew, yTemp_, yend); - - if (nn == 1 && k<=1) - { - scalar del1=0.0; - for (label i = 0; i < n_; i++) - { - del1 += sqr(del_[i]/scale[i]); - } - del1 = sqrt(del1); - - ode_.derivatives(x+h, yTemp_, dyTemp_); - for (label i=0;i<n_;i++) - { - del_[i] = dyTemp_[i] - del_[i]/h; - } - - LUBacksubstitute(a_, pivotIndices_, del_); - - scalar del2 = 0.0; - for (label i = 0; i <n_ ; i++) - { - del2 += sqr(del_[i]/scale[i]); - } - del2 = sqrt(del2); - theta_ = del2 / min(1.0, del1 + SMALL); - - if (theta_ > 1.0) - { - return false; - } - } - - delTemp_ = yend; - LUBacksubstitute(a_, pivotIndices_, delTemp_); - del_ = delTemp_; - - if (dense_ && nn >= nstep-k-1) - { - ipt++; - for (label i=0;i<n_;i++) - { - fSave_[ipt][i]=del_[i]; - } - } - } - - yend = yTemp_ + del_; - return true; + step.dxTry = step.forward ? dxNew : -dxNew; } -void Foam::seulex::polyextr -( - const label k, - scalarRectangularMatrix& table, - scalarField& last -) const -{ - label l=last.size(); - for (label j = k - 1; j > 0; j--) - { - for (label i=0; i<l; i++) - { - table[j-1][i] = - table[j][i] + coeff_[k][j]*(table[j][i] - table[j-1][i]); - } - } - for (label i = 0; i < l; i++) - { - last[i] = table[0][i] + coeff_[k][0]*(table[0][i] - last[i]); - } -} - // ************************************************************************* // diff --git a/src/ODE/ODESolvers/seulex/seulex.H b/src/ODE/ODESolvers/seulex/seulex.H index 71be1b3b3f144d49c3c21c943c66cd8796060df3..c3cd5401983bd100a4c6b967ffa41dc1ffa161e1 100644 --- a/src/ODE/ODESolvers/seulex/seulex.H +++ b/src/ODE/ODESolvers/seulex/seulex.H @@ -28,7 +28,7 @@ Description An extrapolation-algorithm, based on the linearly implicit Euler method with step size control and order selection. - The implementation is based on the SEULEX code in + The implementation is based on the SEULEX algorithm in \verbatim "Solving Ordinary Differential Equations II: Stiff and Differential-Algebraic Problems, second edition", @@ -47,8 +47,6 @@ SourceFiles #define seulex_H #include "ODESolver.H" - -#include "scalarFieldField.H" #include "scalarMatrices.H" #include "labelField.H" @@ -65,64 +63,65 @@ class seulex : public ODESolver { - // Private data - //- seulex constants - static const scalar EPS; - - static const label KMAXX=12, IMAXX = KMAXX + 1; + // Static constants - static const scalar - STEPFAC1, STEPFAC2, STEPFAC3, STEPFAC4, STEPFAC5, KFAC1, KFAC2; + static const label kMaxx_ = 12; + static const label iMaxx_ = kMaxx_ + 1; + static const scalar + stepFactor1_, stepFactor2_, stepFactor3_, + stepFactor4_, stepFactor5_, + kFactor1_, kFactor2_; - //- Reference to ODESystem - const ODESystem& ode_; + // Evaluated constants - // Temporary fields - mutable label kTarg_; - mutable labelField nSeq_; - mutable scalarField cost_, dfdx_, factrl_; - mutable scalarRectangularMatrix table_, fSave_; - mutable scalarSquareMatrix dfdy_; - mutable scalar jacRedo_, theta_; - mutable bool calcJac_, dense_; - mutable scalarSquareMatrix a_, coeff_; + scalar jacRedo_; + labelField nSeq_; + scalarField cpu_; + scalarSquareMatrix coeff_; + // Temporary storage + // held to avoid dynamic memory allocation between calls + // and to transfer internal values between functions - mutable scalar hnext_, hdid_; + mutable scalar theta_; + mutable label kTarg_; + mutable scalarRectangularMatrix table_; - mutable labelList pivotIndices_; + mutable scalarField dfdx_; + mutable scalarSquareMatrix dfdy_; + mutable scalarSquareMatrix a_; + mutable labelList pivotIndices_; - // Fields space for "step" function - mutable scalarField hOpt_ ,work_, ySaved_, ySequence_, scale_; + // Fields space for "solve" function + mutable scalarField dxOpt_, temp_; + mutable scalarField y0_, ySequence_, scale_; - // Fields used in "dy" function - mutable scalarField del_, yTemp_, dyTemp_, delTemp_; + // Fields used in "seul" function + mutable scalarField dy_, yTemp_, dydx_; // Private Member Functions - void step(const scalar& htry, scalar& x, scalarField& y) const; - - bool dy + //- Computes the j-th line of the extrapolation table + bool seul ( - const scalar& x, - scalarField& y, - const scalar htot, + const scalar x0, + const scalarField& y0, + const scalar dxTot, const label k, - scalarField& yend, - label& ipt, - scalarField& scale + scalarField& y, + const scalarField& scale ) const; - - void polyextr + //- Polynomial extrpolation + void extrapolate ( const label k, scalarRectangularMatrix& table, - scalarField& last + scalarField& y ) const; @@ -139,13 +138,14 @@ public: // Member Functions - void solve - ( - const ODESystem& ode, - scalar& x, - scalarField& y, - scalar& dxTry - ) const; + + //- Solve the ODE system and the update the state + void solve + ( + scalar& x, + scalarField& y, + stepState& step + ) const; }; diff --git a/src/postProcessing/functionObjects/field/Make/options b/src/postProcessing/functionObjects/field/Make/options index e95ea37c7876c2daeafaf58798c39db0e616abc7..de6d19ef29068e561374d756e9bb1d53718325b3 100644 --- a/src/postProcessing/functionObjects/field/Make/options +++ b/src/postProcessing/functionObjects/field/Make/options @@ -6,15 +6,16 @@ EXE_INC = \ -I$(LIB_SRC)/sampling/lnInclude \ -I$(LIB_SRC)/transportModels \ -I$(LIB_SRC)/turbulenceModels \ - -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude + -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \ + -I$(LIB_SRC)/surfMesh/lnInclude LIB_LIBS = \ -lfiniteVolume \ -lmeshTools \ + -lsurfMesh \ -llagrangian \ -lfileFormats \ -lsampling \ -lincompressibleTransportModels \ -lcompressibleTurbulenceModel \ -lincompressibleTurbulenceModel - diff --git a/src/postProcessing/functionObjects/field/nearWallFields/nearWallFields.C b/src/postProcessing/functionObjects/field/nearWallFields/nearWallFields.C index 67271ff7cbb0425bced06401595a8df7c12e9c7a..83ede96387df08faacf31575b09ca91ff1c20fbd 100644 --- a/src/postProcessing/functionObjects/field/nearWallFields/nearWallFields.C +++ b/src/postProcessing/functionObjects/field/nearWallFields/nearWallFields.C @@ -33,7 +33,7 @@ License namespace Foam { -defineTypeNameAndDebug(nearWallFields, 0); + defineTypeNameAndDebug(nearWallFields, 0); } @@ -72,8 +72,8 @@ void Foam::nearWallFields::calcAddressing() label patchI = iter.key(); const fvPatch& patch = mesh.boundary()[patchI]; - vectorField nf = patch.nf(); - vectorField faceCellCentres = patch.patch().faceCellCentres(); + vectorField nf(patch.nf()); + vectorField faceCellCentres(patch.patch().faceCellCentres()); forAll(patch, patchFaceI) { diff --git a/src/thermophysicalModels/chemistryModel/chemistrySolver/ode/ode.C b/src/thermophysicalModels/chemistryModel/chemistrySolver/ode/ode.C index afb86830866626eeac5c944184a5436569217113..3ca485902ed18b062415a5a63b711218b657dcb5 100644 --- a/src/thermophysicalModels/chemistryModel/chemistrySolver/ode/ode.C +++ b/src/thermophysicalModels/chemistryModel/chemistrySolver/ode/ode.C @@ -70,14 +70,7 @@ void Foam::ode<ChemistryModel>::solve cTp_[nSpecie] = T; cTp_[nSpecie+1] = p; - odeSolver_->solve - ( - *this, - 0, - deltaT, - cTp_, - subDeltaT - ); + odeSolver_->solve(0, deltaT, cTp_, subDeltaT); for (register int i=0; i<nSpecie; i++) { diff --git a/tutorials/combustion/chemFoam/README b/tutorials/combustion/chemFoam/README index 2cd8c89273293ba04ca4114a55f86b1ac3c62feb..4af18c90e136f35b44b6c373f4939421f9822ba7 100644 --- a/tutorials/combustion/chemFoam/README +++ b/tutorials/combustion/chemFoam/README @@ -8,4 +8,4 @@ ic8h18 : iso-Octane combustion, 874 species, 3796 reactions Results interpreted in 'validation' sub-folder, where OpenFOAM results are compared against those predicted by CHEMKIN II. -Overall the best performing ODE solver is seulex followed closely by rodas32. +Overall the best performing ODE solver is seulex followed closely by rodas23. diff --git a/tutorials/combustion/chemFoam/h2/constant/chemistryProperties b/tutorials/combustion/chemFoam/h2/constant/chemistryProperties index b00cac494d4cf528afe6947d96595c7a8058ce49..bf097e0ba39679d2ec60ded2d59bb8ffe51fa227 100644 --- a/tutorials/combustion/chemFoam/h2/constant/chemistryProperties +++ b/tutorials/combustion/chemFoam/h2/constant/chemistryProperties @@ -33,7 +33,7 @@ EulerImplicitCoeffs odeCoeffs { - solver seulex; //rodas32; + solver seulex; absTol 1e-12; relTol 1e-1; } diff --git a/tutorials/multiphase/interDyMFoam/ras/floatingObject/system/decomposeParDict b/tutorials/multiphase/interDyMFoam/ras/floatingObject/system/decomposeParDict index 7c7ca43b9a15e074a7ed2e70a9390cd45270d578..0548a40b126dfbd72a03816fa8bc3fc04ed3cb6e 100644 --- a/tutorials/multiphase/interDyMFoam/ras/floatingObject/system/decomposeParDict +++ b/tutorials/multiphase/interDyMFoam/ras/floatingObject/system/decomposeParDict @@ -15,9 +15,9 @@ FoamFile } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -numberOfSubdomains 4; +numberOfSubdomains 8; -method hierarchical; +method scotch; simpleCoeffs {