WIP: Linear multistep Patankar schemes#182
Conversation
|
All the onestep MPRK/SSPMPRK and also the multistep Patankar schemes can be interpreted as sequences of MPE steps with slightly modified input data. Before continuing this PR we should implement a function like |
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
Coverage Report for CI Build 28241095053Coverage increased (+0.9%) to 98.233%Details
Uncovered Changes
Coverage RegressionsNo coverage regressions found. Coverage Stats
💛 - Coveralls |
| export MPLM22 | ||
|
|
||
| export prob_pds_linmod, prob_pds_linmod_inplace, prob_pds_nonlinmod, | ||
| prob_pds_robertson, prob_pds_brusselator, prob_pds_sir, |
There was a problem hiding this comment.
The new problems need to be added here, to be found in the tests.
…tegrators.jl into sk/patankar_multistep
…tegrators.jl into sk/patankar_multistep
…athematics/PositiveIntegrators.jl into sk/patankar_multistep
…athematics/PositiveIntegrators.jl into sk/patankar_multistep
|
The authors of the original paper kindly shared their code; consequently, the current out-of-place implementations of MPLM22, MPLM33, and MPLM43 yield the same results as those in the paper. However, the implementation of the startup phase for these m-step methods is quite cumbersome and difficult to maintain. To achieve the required accuracy for the starting values, the authors utilize a sub-stepping strategy (dt/4) with nested lower-order MPLM schemes. This currently necessitates a redundant implementation: one for the standard Should we keep this sub-stepping strategy? If so, is there a way to eliminate the "double implementation"? Alternatively, we could use MPRK or MPDeC one-step schemes to compute the initial values. Since these are available for all orders, the reduced time step would not be necessary. However, this would also require implementations of these methods that can be integrated into the MPLM @ranocha @JoshuaLampert Do you have any suggestions? |
…tegrators.jl into sk/patankar_multistep
| β10, P10) | ||
| lincomb!(d10, β1, d, β2, d2, β3, d3, β4, d4, β5, d5, β6, d6, β7, d7, β8, d8, β9, d9, | ||
| β10, d10) | ||
| @.. broadcast=false linsolve.b=α1 * uprev + α2 * uprevprev + α3 * uprev3 + α4 * uprev4 + |
There was a problem hiding this comment.
Currently, the multistep coefficients of all MPLM schemes are based on the original paper and are hardcoded. We should decide between two directions:
Simplify code by keeping original coefficients
If we restrict the implementation strictly to the coefficients of the original paper, the code can be significantly simplified since many of these coefficients are zero. For instance, for MPLM106 we have α1 = ... = α9 = 0. This means the current implementation
@.. broadcast=false linsolve.b=α1 * uprev + α2 * uprevprev + α3 * uprev3 + α4 * uprev4 +
α5 * uprev5 + α6 * uprev6 + α7 * uprev7 + α8 * uprev8 +
α9 * uprev9 + α10 * uprev10could be simplified to
@.. broadcast=false linsolve.b = uprev10Allow for user-defined coefficients
Alternatively, we could allow users to specify custom multistep coefficients. In this case, we would need to introduce a constructor likeMPLM106(α, β).
Technical detail: In each step, the denominators of the Patankar weights are computed via recursive use of lower-order MPLM schemes. The coefficients of these underlying schemes would remain fixed.
…error in diffusion benchmark
…iagonal error in diffusion benchmark" This reverts commit d66fb4f.
This implements #107.
Ensure that dt remains constant for all times (no changes by callbacks allowed), see AB3 (and other multistep methods) fails to reinitialize after callback / discontinuity becauseintegrator.derivative_discontinuityis reset too early SciML/DifferentialEquations.jl#1154