From b060541248f7b50c52823ec1a5da5d36d35d68b4 Mon Sep 17 00:00:00 2001 From: Steven Roberts Date: Sat, 11 May 2024 23:29:56 -0400 Subject: [PATCH] Feature: New Low Order Methods (#439) - Adds new 1st-3rd order MRI methods. Most are from the literature, but the rest are trivial to derive, e.g., Euler-based schemes. - Adds some of the base ERK and IRK method tables too. Note that some cannot be equipped with reasonable embeddings. - Fixes an MRI reallocation bug when switching coupling coefficients to one with more stages - Fixes a workspace size bug for MRIStep - Makes `MRIStepSetOrder` consistent with `ARKStepSetOrder` and `ERKStepSetOrder` so that a negative value sets the default order and a positive value out of range prints an error (when method initialization occurs not when `SetOrder` is called). --------- Co-authored-by: Daniel R. Reynolds Co-authored-by: David Gardner --- CHANGELOG.md | 18 + doc/arkode/guide/source/Butcher.rst | 193 +++++++++++ doc/arkode/guide/source/Constants.rst | 63 ++++ .../MRIStep_c_interface/MRIStepCoupling.rst | 52 +-- doc/shared/RecentChanges.rst | 20 ++ .../backward_euler_dirk_stab_region.png | Bin 0 -> 22474 bytes ...xplicit_midpoint_euler_erk_stab_region.png | Bin 0 -> 26029 bytes .../arkode/forward_euler_erk_stab_region.png | Bin 0 -> 21530 bytes .../implicit_midpoint_dirk_stab_region.png | Bin 0 -> 17997 bytes .../implicit_trapezoidal_dirk_stab_region.png | Bin 0 -> 18255 bytes .../arkode/ralston_euler_erk_stab_region.png | Bin 0 -> 25417 bytes doc/shared/sundials.bib | 45 +++ include/arkode/arkode_arkstep.h | 2 + include/arkode/arkode_butcher_dirk.h | 5 +- include/arkode/arkode_butcher_erk.h | 5 +- include/arkode/arkode_erkstep.h | 1 + include/arkode/arkode_mristep.h | 23 +- src/arkode/arkode_arkstep.c | 2 + src/arkode/arkode_butcher_dirk.def | 46 ++- src/arkode/arkode_butcher_erk.def | 95 +++-- src/arkode/arkode_erkstep.c | 1 + src/arkode/arkode_mri_tables.def | 178 +++++++++- src/arkode/arkode_mristep.c | 185 +++++----- src/arkode/arkode_mristep_io.c | 2 +- src/arkode/fmod/farkode_mod.f90 | 15 +- src/arkode/fmod/farkode_mristep_mod.f90 | 23 +- test/answers | 2 +- .../CXX_serial/ark_test_dahlquist_ark_0_0.out | 222 ++++++++++++ .../CXX_serial/ark_test_dahlquist_ark_0_1.out | 222 ++++++++++++ .../CXX_serial/ark_test_dahlquist_ark_1_0.out | 222 ++++++++++++ .../CXX_serial/ark_test_dahlquist_ark_1_1.out | 222 ++++++++++++ .../CXX_serial/ark_test_dahlquist_ark_2_0.out | 222 ++++++++++++ .../CXX_serial/ark_test_dahlquist_ark_2_1.out | 222 ++++++++++++ .../CXX_serial/ark_test_dahlquist_erk_0.out | 105 ++++++ .../CXX_serial/ark_test_dahlquist_erk_1.out | 105 ++++++ .../CXX_serial/ark_test_dahlquist_mri.cpp | 82 ++--- .../CXX_serial/ark_test_dahlquist_mri.out | 327 +++++++++++++++++- 37 files changed, 2706 insertions(+), 221 deletions(-) create mode 100644 doc/shared/figs/arkode/backward_euler_dirk_stab_region.png create mode 100644 doc/shared/figs/arkode/explicit_midpoint_euler_erk_stab_region.png create mode 100644 doc/shared/figs/arkode/forward_euler_erk_stab_region.png create mode 100644 doc/shared/figs/arkode/implicit_midpoint_dirk_stab_region.png create mode 100644 doc/shared/figs/arkode/implicit_trapezoidal_dirk_stab_region.png create mode 100644 doc/shared/figs/arkode/ralston_euler_erk_stab_region.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 45619e61e3..c27937e5a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,24 @@ Added "Resize" capability, as well as missing `SetRootDirection` and Deprecated `ARKStepSetOptimalParams` function; added instructions to user guide for users who wish to retain the current functionality. +Added the following Runge-Kutta Butcher tables +* `ARKODE_FORWARD_EULER_1_1` +* `ARKODE_RALSTON_EULER_2_1_2` +* `ARKODE_EXPLICIT_MIDPOINT_EULER_2_1_2` +* `ARKODE_BACKWARD_EULER_1_1` +* `ARKODE_IMPLICIT_MIDPOINT_1_2` +* `ARKODE_IMPLICIT_TRAPEZOIDAL_2_2` + +Added the following MRI coupling tables +* `ARKODE_MRI_GARK_FORWARD_EULER` +* `ARKODE_MRI_GARK_RALSTON2` +* `ARKODE_MRI_GARK_RALSTON3` +* `ARKODE_MRI_GARK_BACKWARD_EULER` +* `ARKODE_MRI_GARK_IMPLICIT_MIDPOINT` +* `ARKODE_IMEX_MRI_GARK_EULER` +* `ARKODE_IMEX_MRI_GARK_TRAPEZOIDAL` +* `ARKODE_IMEX_MRI_GARK_MIDPOINT` + Updated the CMake variable `HIP_PLATFORM` default to `amd` as the previous default, `hcc`, is no longer recognized in ROCm 5.7.0 or newer. The new default is also valid in older version of ROCm (at least back to version 4.3.1). diff --git a/doc/arkode/guide/source/Butcher.rst b/doc/arkode/guide/source/Butcher.rst index 015b500a04..3d44dbecdc 100644 --- a/doc/arkode/guide/source/Butcher.rst +++ b/doc/arkode/guide/source/Butcher.rst @@ -150,6 +150,37 @@ specified via a unique ID and name: with values specified for each method below (e.g., ``ARKODE_HEUN_EULER_2_1_2``). +.. _Butcher.Forward_Euler: + +Forward-Euler-1-1 +^^^^^^^^^^^^^^^^^ + +.. index:: Forward-Euler-1-1 ERK method + +Accessible via the constant ``ARKODE_FORWARD_EULER_1_1`` to +:c:func:`ARKStepSetTableNum`, :c:func:`ERKStepSetTableNum` or +:c:func:`ARKodeButcherTable_LoadERK`. +Accessible via the string ``"ARKODE_FORWARD_EULER_1_1"`` to +:c:func:`ARKStepSetTableName`, :c:func:`ERKStepSetTableName` or +:c:func:`ARKodeButcherTable_LoadERKByName`. +This is the default 1st order explicit method (from :cite:p:`Euler:68`). + +.. math:: + + \renewcommand{\arraystretch}{1.5} + \begin{array}{r|c} + 0 & 0 \\ + \hline + 1 & 1 + \end{array} + +.. figure:: /figs/arkode/forward_euler_erk_stab_region.png + :scale: 50 % + :align: center + + Linear stability region for the forward Euler method. + + .. _Butcher.Heun_Euler: Heun-Euler-2-1-2 @@ -184,6 +215,74 @@ This is the default 2nd order explicit method. region is outlined in blue; the embedding's region is in red. +.. _Butcher.Ralston_Euler: + +Ralston-Euler-2-1-2 +^^^^^^^^^^^^^^^^^^^^ + +.. index:: Ralston-Euler-2-1-2 ERK method + +Accessible via the constant ``ARKODE_RALSTON_EULER_2_1_2`` to +:c:func:`ARKStepSetTableNum`, :c:func:`ERKStepSetTableNum` or +:c:func:`ARKodeButcherTable_LoadERK`. +Accessible via the string ``"ARKODE_RALSTON_EULER_2_1_2"`` to +:c:func:`ARKStepSetTableName`, :c:func:`ERKStepSetTableName` or +:c:func:`ARKodeButcherTable_LoadERKByName` +(primary method from :cite:p:`Ralston:62`). + +.. math:: + + \renewcommand{\arraystretch}{1.5} + \begin{array}{r|cc} + 0 & 0 & 0 \\ + \frac{2}{3} & \frac{2}{3} & 0 \\ + \hline + 2 & \frac{1}{4} & \frac{3}{4} \\ + 1 & 1 & 0 + \end{array} + +.. figure:: /figs/arkode/ralston_euler_erk_stab_region.png + :scale: 50 % + :align: center + + Linear stability region for the Ralston-Euler method. The method's + region is outlined in blue; the embedding's region is in red. + + +.. _Butcher.Explicit_Midpoint_Euler: + +Explicit-Midpoint-Euler-2-1-2 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. index:: Explicit-Midpoint-Euler-2-1-2 ERK method + +Accessible via the constant ``ARKODE_EXPLICIT_MIDPOINT_EULER_2_1_2`` to +:c:func:`ARKStepSetTableNum`, :c:func:`ERKStepSetTableNum` or +:c:func:`ARKodeButcherTable_LoadERK`. +Accessible via the string ``"ARKODE_EXPLICIT_MIDPOINT_EULER_2_1_2"`` to +:c:func:`ARKStepSetTableName`, :c:func:`ERKStepSetTableName` or +:c:func:`ARKodeButcherTable_LoadERKByName` +(primary method from :cite:p:`Runge:95`). + +.. math:: + + \renewcommand{\arraystretch}{1.5} + \begin{array}{r|cc} + 0 & 0 & 0 \\ + \frac{1}{2} & \frac{1}{2} & 0 \\ + \hline + 2 & 0 & 1 \\ + 1 & 1 & 0 + \end{array} + +.. figure:: /figs/arkode/explicit_midpoint_euler_erk_stab_region.png + :scale: 50 % + :align: center + + Linear stability region for the Explicit-Midpoint-Euler method. The method's + region is outlined in blue; the embedding's region is in red. + + .. _Butcher.ARK2_ERK: ARK2-ERK-3-1-2 @@ -1123,6 +1222,37 @@ specified via a unique ID and name: with values specified for each method below (e.g., ``ARKODE_SDIRK_2_1_2``). +.. _Butcher.Backward-Euler: + +Backward-Euler-1-1 +^^^^^^^^^^^^^^^^^^ + +.. index:: Backward-Euler-1-1 method + +Accessible via the constant ``ARKODE_BACKWARD_EULER_1_1`` to +:c:func:`ARKStepSetTableNum` or +:c:func:`ARKodeButcherTable_LoadDIRK`. +Accessible via the string ``"ARKODE_BACKWARD_EULER_1_1"`` to +:c:func:`ARKStepSetTableName` or +:c:func:`ARKodeButcherTable_LoadDIRKByName`. +This is the default 1st order implicit method. The method is A-, L-, and B-stable. + +.. math:: + + \renewcommand{\arraystretch}{1.5} + \begin{array}{r|c} + 1 & 1 \\ + \hline + 1 & 1 + \end{array} + +.. figure:: /figs/arkode/backward_euler_dirk_stab_region.png + :scale: 50 % + :align: center + + Linear stability region for the backward Euler method. + + .. _Butcher.SDIRK-2-1: SDIRK-2-1-2 @@ -1194,6 +1324,69 @@ implicit portion of the ARK2 method from :cite:p:`giraldo2013implicit`). region is outlined in blue; the embedding's region is in red. +.. _Butcher.Implicit_Midpoint: + +Implicit-Midpoint-1-2 +^^^^^^^^^^^^^^^^^^^^^ + +.. index:: Implicit-Midpoint-1-2 method + +Accessible via the constant ``ARKODE_IMPLICIT_MIDPOINT_1_2`` to +:c:func:`ARKStepSetTableNum` or +:c:func:`ARKodeButcherTable_LoadDIRK`. +Accessible via the string ``"ARKODE_IMPLICIT_MIDPOINT_1_2"`` to +:c:func:`ARKStepSetTableName` or +:c:func:`ARKodeButcherTable_LoadDIRKByName`. +The method is A- and B-stable. + +.. math:: + + \renewcommand{\arraystretch}{1.5} + \begin{array}{r|c} + \frac{1}{2} & \frac{1}{2} \\ + \hline + 2 & 1 + \end{array} + +.. figure:: /figs/arkode/implicit_midpoint_dirk_stab_region.png + :scale: 50 % + :align: center + + Linear stability region for the implicit midpoint method. + + +.. _Butcher.Implicit_Trapezoidal: + +Implicit-Trapezoidal-2-2 +^^^^^^^^^^^^^^^^^^^^^^^^ + +.. index:: Implicit-Trapezoidal-2-2 method + +Accessible via the constant ``ARKODE_IMPLICIT_TRAPEZOIDAL_2_2`` to +:c:func:`ARKStepSetTableNum` or +:c:func:`ARKodeButcherTable_LoadDIRK`. +Accessible via the string ``"ARKODE_IMPLICIT_TRAPEZOIDAL_2_2"`` to +:c:func:`ARKStepSetTableName` or +:c:func:`ARKodeButcherTable_LoadDIRKByName`. +The method is A-stable. + +.. math:: + + \renewcommand{\arraystretch}{1.5} + \begin{array}{r|cc} + 0 & 0 & 0 \\ + 1 & \frac{1}{2} & \frac{1}{2} \\ + \hline + 2 & \frac{1}{2} & \frac{1}{2} + \end{array} + +.. figure:: /figs/arkode/implicit_trapezoidal_dirk_stab_region.png + :scale: 50 % + :align: center + + Linear stability region for the implicit trapezoidal method. + + .. _Butcher.Billington: Billington-3-3-2 diff --git a/doc/arkode/guide/source/Constants.rst b/doc/arkode/guide/source/Constants.rst index 69affcfaa9..088dbbdda8 100644 --- a/doc/arkode/guide/source/Constants.rst +++ b/doc/arkode/guide/source/Constants.rst @@ -74,8 +74,16 @@ contains the ARKODE output constants. +-----------------------------------------------+------------------------------------------------------------+ | **Explicit Butcher table specification** | | +-----------------------------------------------+------------------------------------------------------------+ + | :index:`ARKODE_FORWARD_EULER_1_1` | Use the Forward-Euler-1-1 ERK method. | + +-----------------------------------------------+------------------------------------------------------------+ | :index:`ARKODE_HEUN_EULER_2_1_2` | Use the Heun-Euler-2-1-2 ERK method. | +-----------------------------------------------+------------------------------------------------------------+ + | :index:`ARKODE_RALSTON_EULER_2_1_2` | Use the Ralston-Euler-2-1-2 ERK method. | + +-----------------------------------------------+------------------------------------------------------------+ + | :index:`ARKODE_EXPLICIT_MIDPOINT_EULER_2_1_2` | Use the Explicit-Midpoint-Euler-2-1-2 ERK method. | + +-----------------------------------------------+------------------------------------------------------------+ + | :index:`ARKODE_ARK2_ERK_3_1_2` | Use the ARK2-ERK-3-1-2 ERK method. | + +-----------------------------------------------+------------------------------------------------------------+ | :index:`ARKODE_BOGACKI_SHAMPINE_4_2_3` | Use the Bogacki-Shampine-4-2-3 ERK method. | +-----------------------------------------------+------------------------------------------------------------+ | :index:`ARKODE_ARK324L2SA_ERK_4_2_3` | Use the ARK-4-2-3 ERK method. | @@ -116,6 +124,9 @@ contains the ARKODE output constants. +-----------------------------------------------+------------------------------------------------------------+ | :index:`ARKODE_VERNER_16_8_9` | Use the Verner-16-8-9 ERK method. | +-----------------------------------------------+------------------------------------------------------------+ + | :index:`ARKSTEP_DEFAULT_ERK_1` | Use ARKStep's default first-order ERK method | + | | (ARKODE_FORWARD_EULER_1_1). | + +-----------------------------------------------+------------------------------------------------------------+ | :index:`ARKSTEP_DEFAULT_ERK_2` | Use ARKStep's default second-order ERK method | | | (ARKODE_HEUN_EULER_2_1_2). | +-----------------------------------------------+------------------------------------------------------------+ @@ -140,6 +151,9 @@ contains the ARKODE output constants. | :index:`ARKSTEP_DEFAULT_ERK_9` | Use ARKStep's default ninth-order ERK method | | | (ARKODE_VERNER_16_8_9). | +-----------------------------------------------+------------------------------------------------------------+ + | :index:`ERKSTEP_DEFAULT_1` | Use ERKStep's default first-order ERK method | + | | (ARKODE_FORWARD_EULER_1_1). | + +-----------------------------------------------+------------------------------------------------------------+ | :index:`ERKSTEP_DEFAULT_2` | Use ERKStep's default second-order ERK method | | | (ARKODE_HEUN_EULER_2_1_2). | +-----------------------------------------------+------------------------------------------------------------+ @@ -168,8 +182,16 @@ contains the ARKODE output constants. +-----------------------------------------------+------------------------------------------------------------+ | **Implicit Butcher table specification** | | +-----------------------------------------------+------------------------------------------------------------+ + | :index:`ARKODE_BACKWARD_EULER_1_1` | Use the Backward-Euler-1-1 SDIRK method. | + +-----------------------------------------------+------------------------------------------------------------+ | :index:`ARKODE_SDIRK_2_1_2` | Use the SDIRK-2-1-2 SDIRK method. | +-----------------------------------------------+------------------------------------------------------------+ + | :index:`ARKODE_ARK2_DIRK_3_1_2` | Use the ARK2-DIRK-3-1-2 SDIRK method. | + +-----------------------------------------------+------------------------------------------------------------+ + | :index:`ARKODE_IMPLICIT_MIDPOINT_1_2` | Use the Implicit-Midpoint-1-2 SDIRK method. | + +-----------------------------------------------+------------------------------------------------------------+ + | :index:`ARKODE_IMPLICIT_TRAPEZOIDAL_2_2` | Use the Implicit-Trapezoidal-2-2 ESDIRK method. | + +-----------------------------------------------+------------------------------------------------------------+ | :index:`ARKODE_BILLINGTON_3_3_2` | Use the Billington-3-3-2 SDIRK method. | +-----------------------------------------------+------------------------------------------------------------+ | :index:`ARKODE_ESDIRK324L2SA_4_2_3` | Use the ESDIRK324L2SA-4-2-3 ESDIRK method. | @@ -214,6 +236,9 @@ contains the ARKODE output constants. +-----------------------------------------------+------------------------------------------------------------+ | :index:`ARKODE_ESDIRK547L2SA2_7_4_5` | Use the ESDIRK547L2SA2-7-4-5 ESDIRK method. | +-----------------------------------------------+------------------------------------------------------------+ + | :index:`ARKSTEP_DEFAULT_DIRK_1` | Use ARKStep's default first-order DIRK method | + | | (ARKODE_BACKWARD_EULER_1_1). | + +-----------------------------------------------+------------------------------------------------------------+ | :index:`ARKSTEP_DEFAULT_DIRK_2` | Use ARKStep's default second-order DIRK method | | | (ARKODE_SDIRK_2_1_2). | +-----------------------------------------------+------------------------------------------------------------+ @@ -230,6 +255,9 @@ contains the ARKODE output constants. +-----------------------------------------------+------------------------------------------------------------+ | **ImEx Butcher table specification** | | +-----------------------------------------------+------------------------------------------------------------+ + | ARKODE_ARK2_ERK_3_1_2 & | Use the :index:`ARK-3-1-2 ARK method`. | + | ARKODE_ARK2_DIRK_3_1_2 | | + +-----------------------------------------------+------------------------------------------------------------+ | ARKODE_ARK324L2SA_ERK_4_2_3 & | Use the :index:`ARK-4-2-3 ARK method`. | | ARKODE_ARK324L2SA_DIRK_4_2_3 | | +-----------------------------------------------+------------------------------------------------------------+ @@ -299,30 +327,59 @@ contains the ARKODE output constants. +-----------------------------------------------+------------------------------------------------------------+ | **MRI coupling table specification** | | +-----------------------------------------------+------------------------------------------------------------+ + | :index:`ARKODE_MRI_GARK_FORWARD_EULER` | Use the forward Euler MRI-GARK method. | + +-----------------------------------------------+------------------------------------------------------------+ + | :index:`ARKODE_MRI_GARK_ERK22b` | Use the ERK22b MRI-GARK method. | + +-----------------------------------------------+------------------------------------------------------------+ + | :index:`ARKODE_MRI_GARK_ERK22a` | Use the ERK22a MRI-GARK method. | + +-----------------------------------------------+------------------------------------------------------------+ + | :index:`ARKODE_MRI_GARK_RALSTON2` | Use the second order Ralston MRI-GARK method. | + +-----------------------------------------------+------------------------------------------------------------+ | :index:`ARKODE_MIS_MW3` | Use the Knoth-Wolke-3 MIS method. | +-----------------------------------------------+------------------------------------------------------------+ | :index:`ARKODE_MRI_GARK_ERK33a` | Use the ERK33a MRI-GARK method. | +-----------------------------------------------+------------------------------------------------------------+ + | :index:`ARKODE_MRI_GARK_RALSTON3` | Use the third order Ralston MRI-GARK method. | + +-----------------------------------------------+------------------------------------------------------------+ | :index:`ARKODE_MRI_GARK_ERK45a` | Use the ERK45a MRI-GARK method. | +-----------------------------------------------+------------------------------------------------------------+ + | :index:`ARKODE_MRI_GARK_BACKWARD_EULER` | Use the backward Euler MRI-GARK method. | + +-----------------------------------------------+------------------------------------------------------------+ | :index:`ARKODE_MRI_GARK_IRK21a` | Use the IRK21a MRI-GARK method. | +-----------------------------------------------+------------------------------------------------------------+ + | :index:`ARKODE_MRI_GARK_IMPLICIT_MIDPOINT` | Use the implicit midpoint MRI-GARK method. | + +-----------------------------------------------+------------------------------------------------------------+ | :index:`ARKODE_MRI_GARK_ESDIRK34a` | Use the ESDIRK34a MRI-GARK method. | +-----------------------------------------------+------------------------------------------------------------+ | :index:`ARKODE_MRI_GARK_ESDIRK46a` | Use the ESDIRK46a MRI-GARK method. | +-----------------------------------------------+------------------------------------------------------------+ + | :index:`ARKODE_IMEX_MRI_GARK_EULER` | Use the Euler IMEX-MRI-GARK method. | + +-----------------------------------------------+------------------------------------------------------------+ + | :index:`ARKODE_IMEX_MRI_GARK_TRAPEZOIDAL` | Use the trapezoidal rule IMEX-MRI-GARK method. | + +-----------------------------------------------+------------------------------------------------------------+ + | :index:`ARKODE_IMEX_MRI_GARK_MIDPOINT` | Use the midpoint rule IMEX-MRI-GARK method. | + +-----------------------------------------------+------------------------------------------------------------+ | :index:`ARKODE_IMEX_MRI_GARK3a` | Use the IMEX-MRI-GARK3a method. | +-----------------------------------------------+------------------------------------------------------------+ | :index:`ARKODE_IMEX_MRI_GARK3b` | Use the IMEX-MRI-GARK3b method. | +-----------------------------------------------+------------------------------------------------------------+ | :index:`ARKODE_IMEX_MRI_GARK4` | Use the IMEX-MRI-GARK4 method. | +-----------------------------------------------+------------------------------------------------------------+ + | :index:`MRISTEP_DEFAULT_EXPL_TABLE_1` | Use MRIStep's default 1st-order explicit method | + | | (MRI_GARK_FORWARD_EULER). | + +-----------------------------------------------+------------------------------------------------------------+ + | :index:`MRISTEP_DEFAULT_EXPL_TABLE_2` | Use MRIStep's default 2nd-order explicit method | + | | (MRI_GARK_ERK22b). | + +-----------------------------------------------+------------------------------------------------------------+ | :index:`MRISTEP_DEFAULT_EXPL_TABLE_3` | Use MRIStep's default 3rd-order explicit method | | | (MIS_MW3). | +-----------------------------------------------+------------------------------------------------------------+ | :index:`MRISTEP_DEFAULT_EXPL_TABLE_4` | Use MRIStep's default 4th-order explicit method | | | (MRI_GARK_ERK45a). | +-----------------------------------------------+------------------------------------------------------------+ + | :index:`MRISTEP_DEFAULT_IMPL_SD_TABLE_1` | Use MRIStep's default 1st-order solve-decoupled implicit | + | | method (MRI_GARK_BACKWARD_EULER). | + +-----------------------------------------------+------------------------------------------------------------+ | :index:`MRISTEP_DEFAULT_IMPL_SD_TABLE_2` | Use MRIStep's default 2nd-order solve-decoupled implicit | | | method (MRI_GARK_IRK21a). | +-----------------------------------------------+------------------------------------------------------------+ @@ -332,6 +389,12 @@ contains the ARKODE output constants. | :index:`MRISTEP_DEFAULT_IMPL_SD_TABLE_4` | Use MRIStep's default 4th-order solve-decoupled implicit | | | method (MRI_GARK_ESDIRK46a). | +-----------------------------------------------+------------------------------------------------------------+ + | :index:`MRISTEP_DEFAULT_IMEX_SD_TABLE_1` | Use MRIStep's default 1st-order solve-decoupled ImEx | + | | method (IMEX_MRI_GARK_EULER). | + +-----------------------------------------------+------------------------------------------------------------+ + | :index:`MRISTEP_DEFAULT_IMEX_SD_TABLE_2` | Use MRIStep's default 2nd-order solve-decoupled ImEx | + | | method (ARKODE_IMEX_MRI_GARK_TRAPEZOIDAL). | + +-----------------------------------------------+------------------------------------------------------------+ | :index:`MRISTEP_DEFAULT_IMEX_SD_TABLE_3` | Use MRIStep's default 3rd-order solve-decoupled ImEx | | | method (IMEX_MRI_GARK3b). | +-----------------------------------------------+------------------------------------------------------------+ diff --git a/doc/arkode/guide/source/Usage/MRIStep_c_interface/MRIStepCoupling.rst b/doc/arkode/guide/source/Usage/MRIStep_c_interface/MRIStepCoupling.rst index cb8a725b4d..a948bd6dbb 100644 --- a/doc/arkode/guide/source/Usage/MRIStep_c_interface/MRIStepCoupling.rst +++ b/doc/arkode/guide/source/Usage/MRIStep_c_interface/MRIStepCoupling.rst @@ -304,36 +304,46 @@ with values specified for each method below (e.g., ``ARKODE_MIS_KW3``). .. table:: Explicit MRI-GARK coupling tables. The default method for each order is marked with an asterisk (:math:`^*`). - ========================== =========== ===================== - Table name Order Reference - ========================== =========== ===================== - ``ARKODE_MIS_KW3`` :math:`3^*` :cite:p:`Schlegel:09` - ``ARKODE_MRI_GARK_ERK33a`` 3 :cite:p:`Sandu:19` - ``ARKODE_MRI_GARK_ERK45a`` :math:`4^*` :cite:p:`Sandu:19` - ========================== =========== ===================== + ================================= =========== ===================== + Table name Order Reference + ================================= =========== ===================== + ``ARKODE_MRI_GARK_FORWARD_EULER`` :math:`1^*` + ``ARKODE_MRI_GARK_ERK22b`` :math:`2^*` :cite:p:`Sandu:19` + ``ARKODE_MRI_GARK_ERK22a`` 2 :cite:p:`Sandu:19` + ``ARKODE_MRI_GARK_RALSTON2`` 2 :cite:p:`Roberts:22` + ``ARKODE_MIS_KW3`` :math:`3^*` :cite:p:`Schlegel:09` + ``ARKODE_MRI_GARK_ERK33a`` 3 :cite:p:`Sandu:19` + ``ARKODE_MRI_GARK_RALSTON3`` 3 :cite:p:`Roberts:22` + ``ARKODE_MRI_GARK_ERK45a`` :math:`4^*` :cite:p:`Sandu:19` + ================================= =========== ===================== .. table:: Diagonally-implicit, solve-decoupled MRI-GARK coupling tables. The default method for each order is marked with an asterisk (:math:`^*`). - ============================= =========== =============== ================== - Table name Order Implicit Solves Reference - ============================= =========== =============== ================== - ``ARKODE_MRI_GARK_IRK21a`` :math:`2^*` 1 :cite:p:`Sandu:19` - ``ARKODE_MRI_GARK_ESDIRK34a`` :math:`3^*` 3 :cite:p:`Sandu:19` - ``ARKODE_MRI_GARK_ESDIRK46a`` :math:`4^*` 5 :cite:p:`Sandu:19` - ============================= =========== =============== ================== + ===================================== =========== =============== ================== + Table name Order Implicit Solves Reference + ===================================== =========== =============== ================== + ``ARKODE_MRI_GARK_BACKWARD_EULER`` :math:`1^*` 1 + ``ARKODE_MRI_GARK_IRK21a`` :math:`2^*` 1 :cite:p:`Sandu:19` + ``ARKODE_MRI_GARK_IMPLICIT_MIDPOINT`` 2 2 + ``ARKODE_MRI_GARK_ESDIRK34a`` :math:`3^*` 3 :cite:p:`Sandu:19` + ``ARKODE_MRI_GARK_ESDIRK46a`` :math:`4^*` 5 :cite:p:`Sandu:19` + ===================================== =========== =============== ================== .. table:: Diagonally-implicit, solve-decoupled IMEX-MRI-GARK coupling tables. The default method for each order is marked with an asterisk (:math:`^*`). - =========================== =========== =============== =================== - Table name Order Implicit Solves Reference - =========================== =========== =============== =================== - ``ARKODE_IMEX_MRI_GARK3a`` :math:`3^*` 2 :cite:p:`ChiRen:21` - ``ARKODE_IMEX_MRI_GARK3b`` 3 2 :cite:p:`ChiRen:21` - ``ARKODE_IMEX_MRI_GARK4`` :math:`4^*` 5 :cite:p:`ChiRen:21` - =========================== =========== =============== =================== + ==================================== =========== =============== =================== + Table name Order Implicit Solves Reference + ==================================== =========== =============== =================== + ``ARKODE_IMEX_MRI_GARK_EULER`` :math:`1^*` 1 + ``ARKODE_IMEX_MRI_GARK_TRAPEZOIDAL`` :math:`2^*` 1 + ``ARKODE_IMEX_MRI_GARK_MIDPOINT`` 2 2 + ``ARKODE_IMEX_MRI_GARK3a`` :math:`3^*` 2 :cite:p:`ChiRen:21` + ``ARKODE_IMEX_MRI_GARK3b`` 3 2 :cite:p:`ChiRen:21` + ``ARKODE_IMEX_MRI_GARK4`` :math:`4^*` 5 :cite:p:`ChiRen:21` + ==================================== =========== =============== =================== diff --git a/doc/shared/RecentChanges.rst b/doc/shared/RecentChanges.rst index 9212d1ff37..ef560561bf 100644 --- a/doc/shared/RecentChanges.rst +++ b/doc/shared/RecentChanges.rst @@ -15,6 +15,26 @@ for users who wish to retain the current functionality. Added CMake infrastructure that enables externally maintained addons/plugins to be *optionally* built with SUNDIALS. See :ref:`Contributing` for details. +Added the following Runge-Kutta Butcher tables + +* ``ARKODE_FORWARD_EULER_1_1`` +* ``ARKODE_RALSTON_EULER_2_1_2`` +* ``ARKODE_EXPLICIT_MIDPOINT_EULER_2_1_2`` +* ``ARKODE_BACKWARD_EULER_1_1`` +* ``ARKODE_IMPLICIT_MIDPOINT_1_2`` +* ``ARKODE_IMPLICIT_TRAPEZOIDAL_2_2`` + +Added the following MRI coupling tables + +* ``ARKODE_MRI_GARK_FORWARD_EULER`` +* ``ARKODE_MRI_GARK_RALSTON2`` +* ``ARKODE_MRI_GARK_RALSTON3`` +* ``ARKODE_MRI_GARK_BACKWARD_EULER`` +* ``ARKODE_MRI_GARK_IMPLICIT_MIDPOINT`` +* ``ARKODE_IMEX_MRI_GARK_EULER`` +* ``ARKODE_IMEX_MRI_GARK_TRAPEZOIDAL`` +* ``ARKODE_IMEX_MRI_GARK_MIDPOINT`` + **Bug Fixes** Updated the CMake variable ``HIP_PLATFORM`` default to ``amd`` as the previous diff --git a/doc/shared/figs/arkode/backward_euler_dirk_stab_region.png b/doc/shared/figs/arkode/backward_euler_dirk_stab_region.png new file mode 100644 index 0000000000000000000000000000000000000000..388c85f0e0906ea013c5c301dd0859869780779a GIT binary patch literal 22474 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 literal 0 HcmV?d00001 diff --git a/doc/shared/figs/arkode/explicit_midpoint_euler_erk_stab_region.png b/doc/shared/figs/arkode/explicit_midpoint_euler_erk_stab_region.png new file mode 100644 index 0000000000000000000000000000000000000000..c3f7e7b937833c5e42272dcf65d72d646a9625a8 GIT binary patch literal 26029 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 literal 0 HcmV?d00001 diff --git a/doc/shared/figs/arkode/implicit_midpoint_dirk_stab_region.png b/doc/shared/figs/arkode/implicit_midpoint_dirk_stab_region.png new file mode 100644 index 0000000000000000000000000000000000000000..94695afff9a9db17201070f762d74a76ddddf80e GIT binary patch literal 17997 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 literal 0 HcmV?d00001 diff --git a/doc/shared/figs/arkode/implicit_trapezoidal_dirk_stab_region.png b/doc/shared/figs/arkode/implicit_trapezoidal_dirk_stab_region.png new file mode 100644 index 0000000000000000000000000000000000000000..da400133124299d48e9a792a4f063546015c828a GIT binary patch literal 18255 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

AcL0e>%7VpzEMx`5+|+$6@r7GuhZMGs|C= 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 YjP}cQ(fw?Yjyy(eHQHu)h3XRifB(1uqW}N^ literal 0 HcmV?d00001 diff --git a/doc/shared/sundials.bib b/doc/shared/sundials.bib index 3516b83111..b4b5cf0343 100644 --- a/doc/shared/sundials.bib +++ b/doc/shared/sundials.bib @@ -1795,6 +1795,15 @@ @article{DorPri:80 doi = {10.1016/0771-050X(80)90013-3} } +@book{Euler:68 + author = {Leonhard Euler}, + title = {Institutiones calculi integralis}, + volume = {Volumen Primum}, + year = {1768}, + publisher = {B. G. Teubner Verlag}, + note = {reprinted in Opera Omnia Series 1, Volume 11} +} + @article{HaSo:05, title={Explicit, time reversible, adaptive step size control}, author={Hairer, Ernst and S{\"o}derlind, Gustaf}, @@ -1943,6 +1952,42 @@ @article{Mclachlan:92 publisher = {IOP Publishing} } +@article{Ralston:62, + author = {Ralston, Anthony}, + title = {{Runge--Kutta} methods with minimum error bounds}, + journal = {Mathematics of Computation}, + volume = {16}, + number = {80}, + pages = {431–437}, + year = {1962}, + publisher = {American Mathematical Society}, + doi = {10.1090/s0025-5718-1962-0150954-0} +} + +@article{Roberts:22, + author = {Roberts, Steven and Popov, Andrey A and Sarshar, Arash and Sandu, Adrian}, + title = {A Fast Time-Stepping Strategy for Dynamical Systems Equipped with a Surrogate Model}, + journal = {SIAM Journal on Scientific Computing}, + volume = {44}, + number = {3}, + pages = {A1405--A1427}, + year = {2022}, + publisher = {SIAM}, + doi = {10.1137/20M1386281} +} + +@Article{Runge:95, + author = {Runge, C.}, + title = {Ueber die numerische Aufl{\"o}sung von Differentialgleichungen}, + journal = {Mathematische Annalen}, + volume = {46}, + number = {2}, + pages = {167-178}, + year = {1895}, + publisher = {Springer}, + doi = {10.1007/BF01446807} +} + @article{Sandu:19, author = {Sandu, A.}, title = {A Class of Multirate Infinitesimal GARK Methods}, diff --git a/include/arkode/arkode_arkstep.h b/include/arkode/arkode_arkstep.h index 8c43ee198b..f7a6f112f5 100644 --- a/include/arkode/arkode_arkstep.h +++ b/include/arkode/arkode_arkstep.h @@ -35,6 +35,7 @@ extern "C" { /* Default Butcher tables for each method/order */ /* explicit */ +static const int ARKSTEP_DEFAULT_ERK_1 = ARKODE_FORWARD_EULER_1_1; static const int ARKSTEP_DEFAULT_ERK_2 = ARKODE_HEUN_EULER_2_1_2; static const int ARKSTEP_DEFAULT_ERK_3 = ARKODE_BOGACKI_SHAMPINE_4_2_3; static const int ARKSTEP_DEFAULT_ERK_4 = ARKODE_ZONNEVELD_5_3_4; @@ -45,6 +46,7 @@ static const int ARKSTEP_DEFAULT_ERK_8 = ARKODE_FEHLBERG_13_7_8; static const int ARKSTEP_DEFAULT_ERK_9 = ARKODE_VERNER_16_8_9; /* implicit */ +static const int ARKSTEP_DEFAULT_DIRK_1 = ARKODE_BACKWARD_EULER_1_1; static const int ARKSTEP_DEFAULT_DIRK_2 = ARKODE_SDIRK_2_1_2; static const int ARKSTEP_DEFAULT_DIRK_3 = ARKODE_ARK324L2SA_DIRK_4_2_3; static const int ARKSTEP_DEFAULT_DIRK_4 = ARKODE_SDIRK_5_3_4; diff --git a/include/arkode/arkode_butcher_dirk.h b/include/arkode/arkode_butcher_dirk.h index fa60103e89..ffa4908c91 100644 --- a/include/arkode/arkode_butcher_dirk.h +++ b/include/arkode/arkode_butcher_dirk.h @@ -51,7 +51,10 @@ typedef enum ARKODE_ESDIRK547L2SA_7_4_5, ARKODE_ESDIRK547L2SA2_7_4_5, ARKODE_ARK2_DIRK_3_1_2, - ARKODE_MAX_DIRK_NUM = ARKODE_ARK2_DIRK_3_1_2 + ARKODE_BACKWARD_EULER_1_1, + ARKODE_IMPLICIT_MIDPOINT_1_2, + ARKODE_IMPLICIT_TRAPEZOIDAL_2_2, + ARKODE_MAX_DIRK_NUM = ARKODE_IMPLICIT_TRAPEZOIDAL_2_2 } ARKODE_DIRKTableID; /* Accessor routine to load built-in DIRK table */ diff --git a/include/arkode/arkode_butcher_erk.h b/include/arkode/arkode_butcher_erk.h index bb99368b41..764b67bbfe 100644 --- a/include/arkode/arkode_butcher_erk.h +++ b/include/arkode/arkode_butcher_erk.h @@ -49,7 +49,10 @@ typedef enum ARKODE_VERNER_10_6_7, ARKODE_VERNER_13_7_8, ARKODE_VERNER_16_8_9, - ARKODE_MAX_ERK_NUM = ARKODE_VERNER_16_8_9 + ARKODE_FORWARD_EULER_1_1, + ARKODE_RALSTON_EULER_2_1_2, + ARKODE_EXPLICIT_MIDPOINT_EULER_2_1_2, + ARKODE_MAX_ERK_NUM = ARKODE_EXPLICIT_MIDPOINT_EULER_2_1_2 } ARKODE_ERKTableID; /* Accessor routine to load built-in ERK table */ diff --git a/include/arkode/arkode_erkstep.h b/include/arkode/arkode_erkstep.h index 73f2a474c6..ed93a240b9 100644 --- a/include/arkode/arkode_erkstep.h +++ b/include/arkode/arkode_erkstep.h @@ -32,6 +32,7 @@ extern "C" { /* Default Butcher tables for each order */ +static const int ERKSTEP_DEFAULT_1 = ARKODE_FORWARD_EULER_1_1; static const int ERKSTEP_DEFAULT_2 = ARKODE_HEUN_EULER_2_1_2; static const int ERKSTEP_DEFAULT_3 = ARKODE_BOGACKI_SHAMPINE_4_2_3; static const int ERKSTEP_DEFAULT_4 = ARKODE_ZONNEVELD_5_3_4; diff --git a/include/arkode/arkode_mristep.h b/include/arkode/arkode_mristep.h index 1191e0a39d..000bae135a 100644 --- a/include/arkode/arkode_mristep.h +++ b/include/arkode/arkode_mristep.h @@ -52,17 +52,32 @@ typedef enum ARKODE_IMEX_MRI_GARK3a, ARKODE_IMEX_MRI_GARK3b, ARKODE_IMEX_MRI_GARK4, - ARKODE_MAX_MRI_NUM = ARKODE_IMEX_MRI_GARK4 + ARKODE_MRI_GARK_FORWARD_EULER, + ARKODE_MRI_GARK_RALSTON2, + ARKODE_MRI_GARK_ERK22a, + ARKODE_MRI_GARK_ERK22b, + ARKODE_MRI_GARK_RALSTON3, + ARKODE_MRI_GARK_BACKWARD_EULER, + ARKODE_MRI_GARK_IMPLICIT_MIDPOINT, + ARKODE_IMEX_MRI_GARK_EULER, + ARKODE_IMEX_MRI_GARK_TRAPEZOIDAL, + ARKODE_IMEX_MRI_GARK_MIDPOINT, + ARKODE_MAX_MRI_NUM = ARKODE_IMEX_MRI_GARK_MIDPOINT, } ARKODE_MRITableID; /* Default MRI coupling tables for each order */ +static const int MRISTEP_DEFAULT_EXPL_1 = ARKODE_MRI_GARK_FORWARD_EULER; +static const int MRISTEP_DEFAULT_EXPL_2 = ARKODE_MRI_GARK_ERK22b; +static const int MRISTEP_DEFAULT_EXPL_3 = ARKODE_MIS_KW3; +static const int MRISTEP_DEFAULT_EXPL_4 = ARKODE_MRI_GARK_ERK45a; -static const int MRISTEP_DEFAULT_3 = ARKODE_MIS_KW3; -static const int MRISTEP_DEFAULT_EXPL_3 = ARKODE_MIS_KW3; -static const int MRISTEP_DEFAULT_EXPL_4 = ARKODE_MRI_GARK_ERK45a; +static const int MRISTEP_DEFAULT_IMPL_SD_1 = ARKODE_MRI_GARK_BACKWARD_EULER; static const int MRISTEP_DEFAULT_IMPL_SD_2 = ARKODE_MRI_GARK_IRK21a; static const int MRISTEP_DEFAULT_IMPL_SD_3 = ARKODE_MRI_GARK_ESDIRK34a; static const int MRISTEP_DEFAULT_IMPL_SD_4 = ARKODE_MRI_GARK_ESDIRK46a; + +static const int MRISTEP_DEFAULT_IMEX_SD_1 = ARKODE_IMEX_MRI_GARK_EULER; +static const int MRISTEP_DEFAULT_IMEX_SD_2 = ARKODE_IMEX_MRI_GARK_TRAPEZOIDAL; static const int MRISTEP_DEFAULT_IMEX_SD_3 = ARKODE_IMEX_MRI_GARK3b; static const int MRISTEP_DEFAULT_IMEX_SD_4 = ARKODE_IMEX_MRI_GARK4; diff --git a/src/arkode/arkode_arkstep.c b/src/arkode/arkode_arkstep.c index 5e181982c1..70275484ec 100644 --- a/src/arkode/arkode_arkstep.c +++ b/src/arkode/arkode_arkstep.c @@ -2159,6 +2159,7 @@ int arkStep_SetButcherTables(ARKodeMem ark_mem) { switch (step_mem->q) { + case (1): itable = ARKSTEP_DEFAULT_DIRK_1; break; case (2): itable = ARKSTEP_DEFAULT_DIRK_2; break; case (3): itable = ARKSTEP_DEFAULT_DIRK_3; break; case (4): itable = ARKSTEP_DEFAULT_DIRK_4; break; @@ -2176,6 +2177,7 @@ int arkStep_SetButcherTables(ARKodeMem ark_mem) { switch (step_mem->q) { + case (1): itable = ARKSTEP_DEFAULT_ERK_1; break; case (2): etable = ARKSTEP_DEFAULT_ERK_2; break; case (3): etable = ARKSTEP_DEFAULT_ERK_3; break; case (4): etable = ARKSTEP_DEFAULT_ERK_4; break; diff --git a/src/arkode/arkode_butcher_dirk.def b/src/arkode/arkode_butcher_dirk.def index 2ce5444f8c..40d13e60bd 100644 --- a/src/arkode/arkode_butcher_dirk.def +++ b/src/arkode/arkode_butcher_dirk.def @@ -34,7 +34,11 @@ imeth type A-stable L-stable QP ----------------------------------------------------------------- + ARKODE_BACKWARD_EULER_1_1 SDIRK Y Y Y ARKODE_SDIRK_2_1_2 SDIRK Y N Y + ARKODE_ARK2_DIRK_3_1_2 ESDIRK Y Y Y + ARKODE_IMPLICIT_MIDPOINT_1_2 SDIRK Y N Y + ARKODE_IMPLICIT_TRAPEZOIDAL_2_2 ESDIRK Y N Y ARKODE_BILLINGTON_3_3_2 SDIRK N N N ARKODE_TRBDF2_3_3_2 ESDIRK N N Y ARKODE_KVAERNO_4_2_3 ESDIRK Y Y N @@ -57,7 +61,6 @@ ARKODE_ARK548L2SAb_DIRK_8_4_5* ESDIRK Y Y N ARKODE_ESDIRK547L2SA_7_4_5 ESDIRK Y Y N ARKODE_ESDIRK547L2SA2_7_4_5 ESDIRK Y Y N - ARKODE_ARK2_DIRK_3_1_2 ESDIRK Y Y Y ----------------------------------------------------------------- */ @@ -65,6 +68,19 @@ ARK_BUTCHER_TABLE(ARKODE_DIRK_NONE, { return NULL; }) +ARK_BUTCHER_TABLE(ARKODE_BACKWARD_EULER_1_1, { /* Backward Euler (L,B stable) */ + ARKodeButcherTable B = ARKodeButcherTable_Alloc(1, SUNFALSE); + B->q = 1; + B->p = 0; + + B->A[0][0] = SUN_RCONST(1.0); + + B->b[0] = SUN_RCONST(1.0); + + B->c[0] = SUN_RCONST(1.0); + return B; + }) + ARK_BUTCHER_TABLE(ARKODE_SDIRK_2_1_2, { /* SDIRK-2-1 (A,B stable) */ ARKodeButcherTable B = ARKodeButcherTable_Alloc(2, SUNTRUE); B->q = 2; @@ -119,6 +135,34 @@ ARK_BUTCHER_TABLE(ARKODE_ARK2_DIRK_3_1_2, { /* ARK2 Implicit Table (A,L stable) return B; }) +ARK_BUTCHER_TABLE(ARKODE_IMPLICIT_MIDPOINT_1_2, { /* Implicit Midpoint Rule (A,B stable) */ + ARKodeButcherTable B = ARKodeButcherTable_Alloc(1, SUNFALSE); + B->q = 2; + B->p = 0; + + B->A[0][0] = SUN_RCONST(0.5); + + B->b[0] = SUN_RCONST(1.0); + + B->c[0] = SUN_RCONST(0.5); + return B; + }) + +ARK_BUTCHER_TABLE(ARKODE_IMPLICIT_TRAPEZOIDAL_2_2, { /* Implicit Trapezoidal Rule (A stable) */ + ARKodeButcherTable B = ARKodeButcherTable_Alloc(2, SUNFALSE); + B->q = 2; + B->p = 0; + + B->A[1][0] = SUN_RCONST(0.5); + B->A[1][1] = SUN_RCONST(0.5); + + B->b[0] = SUN_RCONST(0.5); + B->b[1] = SUN_RCONST(0.5); + + B->c[1] = SUN_RCONST(1.0); + return B; + }) + ARK_BUTCHER_TABLE(ARKODE_BILLINGTON_3_3_2, { /* Billington-SDIRK */ ARKodeButcherTable B = ARKodeButcherTable_Alloc(3, SUNTRUE); diff --git a/src/arkode/arkode_butcher_erk.def b/src/arkode/arkode_butcher_erk.def index 5fe439bbab..a29292e27d 100644 --- a/src/arkode/arkode_butcher_erk.def +++ b/src/arkode/arkode_butcher_erk.def @@ -36,38 +36,50 @@ are known precisely enough for use in quad precision (128-bit) calculations. - imeth QP - -------------------------------------- - ARKODE_HEUN_EULER_2_1_2 Y - ARKODE_BOGACKI_SHAMPINE_4_2_3 Y - ARKODE_ARK324L2SA_ERK_4_2_3* N - ARKODE_SHU_OSHER_3_2_3 Y - ARKODE_SOFRONIOU_SPALETTA_5_3_4 Y - ARKODE_ZONNEVELD_5_3_4 Y - ARKODE_ARK436L2SA_ERK_6_3_4* N - ARKODE_ARK437L2SA_ERK_7_3_4* N - ARKODE_SAYFY_ABURUB_6_3_4 N - ARKODE_CASH_KARP_6_4_5 Y - ARKODE_FEHLBERG_6_4_5 Y - ARKODE_DORMAND_PRINCE_7_4_5 Y - ARKODE_ARK548L2SA_ERK_8_4_5* N - ARKODE_ARK548L2SAb_ERK_8_4_5* N - ARKODE_VERNER_8_5_6 Y - ARKODE_FEHLBERG_13_7_8 Y - ARKODE_ARK2_ERK_3_1_2 Y - ARKODE_VERNER_9_5_6 Y - ARKODE_VERNER_10_6_7 Y - ARKODE_VERNER_13_7_8 Y - ARKODE_VERNER_16_8_9 Y - -------------------------------------- - ARKODE_KNOTH_WOLKE_3_3^ Y - -------------------------------------- + imeth QP + --------------------------------------- + ARKODE_FORWARD_EULER_1_1 Y + ARKODE_HEUN_EULER_2_1_2 Y + ARKODE_RALSTON_EULER_2_1_2 Y + ARKODE_EXPLICIT_MIDPOINT_EULER_2_1_2 Y + ARKODE_BOGACKI_SHAMPINE_4_2_3 Y + ARKODE_ARK324L2SA_ERK_4_2_3* N + ARKODE_SHU_OSHER_3_2_3 Y + ARKODE_SOFRONIOU_SPALETTA_5_3_4 Y + ARKODE_ZONNEVELD_5_3_4 Y + ARKODE_ARK436L2SA_ERK_6_3_4* N + ARKODE_ARK437L2SA_ERK_7_3_4* N + ARKODE_SAYFY_ABURUB_6_3_4 N + ARKODE_CASH_KARP_6_4_5 Y + ARKODE_FEHLBERG_6_4_5 Y + ARKODE_DORMAND_PRINCE_7_4_5 Y + ARKODE_ARK548L2SA_ERK_8_4_5* N + ARKODE_ARK548L2SAb_ERK_8_4_5* N + ARKODE_VERNER_8_5_6 Y + ARKODE_FEHLBERG_13_7_8 Y + ARKODE_ARK2_ERK_3_1_2 Y + ARKODE_VERNER_9_5_6 Y + ARKODE_VERNER_10_6_7 Y + ARKODE_VERNER_13_7_8 Y + ARKODE_VERNER_16_8_9 Y + --------------------------------------- + ARKODE_KNOTH_WOLKE_3_3^ Y + --------------------------------------- */ ARK_BUTCHER_TABLE(ARKODE_ERK_NONE, { return NULL; }) +ARK_BUTCHER_TABLE(ARKODE_FORWARD_EULER_1_1, { /* Euler-ERK */ + ARKodeButcherTable B = ARKodeButcherTable_Alloc(1, SUNFALSE); + B->q = 1; + B->p = 0; + + B->b[0] = SUN_RCONST(1.0); + return B; + }) + ARK_BUTCHER_TABLE(ARKODE_HEUN_EULER_2_1_2, { /* Heun-Euler-ERK */ ARKodeButcherTable B = ARKodeButcherTable_Alloc(2, SUNTRUE); B->q = 2; @@ -84,6 +96,37 @@ ARK_BUTCHER_TABLE(ARKODE_HEUN_EULER_2_1_2, { /* Heun-Euler-ERK */ return B; }) +ARK_BUTCHER_TABLE(ARKODE_RALSTON_EULER_2_1_2, { /* Ralston-Euler-ERK */ + ARKodeButcherTable B = ARKodeButcherTable_Alloc(2, SUNTRUE); + B->q = 2; + B->p = 1; + + B->A[1][0] = SUN_RCONST(2.0) / SUN_RCONST(3.0); + + B->b[0] = SUN_RCONST(1.0) / SUN_RCONST(4.0); + B->b[1] = SUN_RCONST(3.0) / SUN_RCONST(4.0); + + B->d[0] = SUN_RCONST(1.0); + + B->c[1] = SUN_RCONST(2.0) / SUN_RCONST(3.0); + return B; + }) + +ARK_BUTCHER_TABLE(ARKODE_EXPLICIT_MIDPOINT_EULER_2_1_2, { /* Explicit-Midpoint-Euler-ERK */ + ARKodeButcherTable B = ARKodeButcherTable_Alloc(2, SUNTRUE); + B->q = 2; + B->p = 1; + + B->A[1][0] = SUN_RCONST(1.0) / SUN_RCONST(2.0); + + B->b[1] = SUN_RCONST(1.0); + + B->d[0] = SUN_RCONST(1.0); + + B->c[1] = SUN_RCONST(1.0) / SUN_RCONST(2.0); + return B; + }) + ARK_BUTCHER_TABLE(ARKODE_ARK2_ERK_3_1_2, { /* ARK2 Explicit Table */ ARKodeButcherTable B = ARKodeButcherTable_Alloc(3, SUNTRUE); diff --git a/src/arkode/arkode_erkstep.c b/src/arkode/arkode_erkstep.c index adf22daadb..2432784596 100644 --- a/src/arkode/arkode_erkstep.c +++ b/src/arkode/arkode_erkstep.c @@ -838,6 +838,7 @@ int erkStep_SetButcherTable(ARKodeMem ark_mem) /* select method based on order */ switch (step_mem->q) { + case (1): etable = ERKSTEP_DEFAULT_1; break; case (2): etable = ERKSTEP_DEFAULT_2; break; case (3): etable = ERKSTEP_DEFAULT_3; break; case (4): etable = ERKSTEP_DEFAULT_4; break; diff --git a/src/arkode/arkode_mri_tables.def b/src/arkode/arkode_mri_tables.def index 13c5635b43..999ef71f95 100644 --- a/src/arkode/arkode_mri_tables.def +++ b/src/arkode/arkode_mri_tables.def @@ -31,24 +31,49 @@ are known precisely enough for use in quad precision (128-bit) calculations. - imeth order type QP - ------------------------------------------------ - ARKODE_MIS_KW3 3 E Y - ARKODE_MRI_GARK_ERK33a 3 E Y - ARKODE_MRI_GARK_ERK45a 4 E Y - ARKODE_MRI_GARK_IRK21a 2 ID Y - ARKODE_MRI_GARK_ESDIRK34a 3 ID Y - ARKODE_MRI_GARK_ESDIRK46a 4 ID Y - ARKODE_IMEX_MRI_GARK3a 3 ID Y - ARKODE_IMEX_MRI_GARK3b 3 ID Y - ARKODE_IMEX_MRI_GARK4 4 ID Y - ------------------------------------------------ + imeth order type QP + ----------------------------------------------------- + ARKODE_MRI_GARK_FORWARD_EULER 1 E Y + ARKODE_MRI_GARK_RALSTON2 2 E Y + ARKODE_MIS_KW3 3 E Y + ARKODE_MRI_GARK_ERK22a 2 E Y + ARKODE_MRI_GARK_ERK22b 2 E Y + ARKODE_MRI_GARK_ERK33a 3 E Y + ARKODE_MRI_GARK_RALSTON3 3 E Y + ARKODE_MRI_GARK_ERK45a 4 E Y + ARKODE_MRI_GARK_BACKWARD_EULER 1 ID Y + ARKODE_MRI_GARK_IRK21a 2 ID Y + ARKODE_MRI_GARK_IMPLICIT_MIDPOINT 2 ID Y + ARKODE_MRI_GARK_ESDIRK34a 3 ID Y + ARKODE_MRI_GARK_ESDIRK46a 4 ID Y + ARKODE_IMEX_MRI_GARK_EULER 1 ID Y + ARKODE_IMEX_MRI_GARK_TRAPEZOIDAL 2 ID Y + ARKODE_IMEX_MRI_GARK_MIDPOINT 2 ID Y + ARKODE_IMEX_MRI_GARK3a 3 ID Y + ARKODE_IMEX_MRI_GARK3b 3 ID Y + ARKODE_IMEX_MRI_GARK4 4 ID Y + ----------------------------------------------------- */ + ARK_MRI_TABLE(ARKODE_MRI_NONE, { return NULL; }) +ARK_MRI_TABLE(ARKODE_MRI_GARK_FORWARD_EULER, { + ARKodeButcherTable B = ARKodeButcherTable_LoadERK(ARKODE_FORWARD_EULER_1_1); + MRIStepCoupling C = MRIStepCoupling_MIStoMRI(B, 1, 0); + ARKodeButcherTable_Free(B); + return C; + }) + +ARK_MRI_TABLE(ARKODE_MRI_GARK_RALSTON2, { /* Roberts et al., SISC 44:A1405 - A1427, 2022 */ + ARKodeButcherTable B = ARKodeButcherTable_LoadERK(ARKODE_RALSTON_EULER_2_1_2); + MRIStepCoupling C = MRIStepCoupling_MIStoMRI(B, 2, 0); + ARKodeButcherTable_Free(B); + return C; + }) + ARK_MRI_TABLE(ARKODE_MIS_KW3, { /* Schlegel et al., JCAM 226:345-357, 2009 */ ARKodeButcherTable B = ARKodeButcherTable_LoadERK(ARKODE_KNOTH_WOLKE_3_3); MRIStepCoupling C = MRIStepCoupling_MIStoMRI(B, 3, 0); @@ -56,6 +81,20 @@ ARK_MRI_TABLE(ARKODE_MIS_KW3, { /* Schlegel et al., JCAM 226:345-357, 2009 */ return C; }) +ARK_MRI_TABLE(ARKODE_MRI_GARK_ERK22a, { /* A. Sandu, SINUM 57:2300-2327, 2019 */ + ARKodeButcherTable B = ARKodeButcherTable_LoadERK(ARKODE_EXPLICIT_MIDPOINT_EULER_2_1_2); + MRIStepCoupling C = MRIStepCoupling_MIStoMRI(B, 2, 0); + ARKodeButcherTable_Free(B); + return C; + }) + +ARK_MRI_TABLE(ARKODE_MRI_GARK_ERK22b, { /* A. Sandu, SINUM 57:2300-2327, 2019 */ + ARKodeButcherTable B = ARKodeButcherTable_LoadERK(ARKODE_HEUN_EULER_2_1_2); + MRIStepCoupling C = MRIStepCoupling_MIStoMRI(B, 2, 0); + ARKodeButcherTable_Free(B); + return C; + }) + ARK_MRI_TABLE(ARKODE_MRI_GARK_ERK33a, { /* A. Sandu, SINUM 57:2300-2327, 2019 */ MRIStepCoupling C = MRIStepCoupling_Alloc(2, 4, MRISTEP_EXPLICIT); @@ -77,6 +116,31 @@ ARK_MRI_TABLE(ARKODE_MRI_GARK_ERK33a, { /* A. Sandu, SINUM 57:2300-2327, 2019 */ return C; }) +ARK_MRI_TABLE(ARKODE_MRI_GARK_RALSTON3, { /* Roberts et al., SISC 44:A1405 - A1427, 2022 */ + MRIStepCoupling C = MRIStepCoupling_Alloc(2, 4, MRISTEP_EXPLICIT); + + C->q = 3; + C->p = 0; + + C->c[1] = ONE/TWO; + C->c[2] = SUN_RCONST(3.0)/SUN_RCONST(4.0); + C->c[3] = ONE; + + C->W[0][1][0] = ONE/TWO; + C->W[0][2][0] = -SUN_RCONST(11.0)/SUN_RCONST(4.0); + C->W[0][2][1] = SUN_RCONST(3.0); + C->W[0][3][0] = SUN_RCONST(47.0)/SUN_RCONST(36.0); + C->W[0][3][1] = -ONE/SUN_RCONST(6.0); + C->W[0][3][2] = -SUN_RCONST(8.0)/SUN_RCONST(9.0); + + C->W[1][2][0] = SUN_RCONST(9.0)/TWO; + C->W[1][2][1] = -SUN_RCONST(9.0)/TWO; + C->W[1][3][0] = -SUN_RCONST(13.0)/SUN_RCONST(6.0); + C->W[1][3][1] = -ONE/TWO; + C->W[1][3][2] = SUN_RCONST(8.0)/SUN_RCONST(3.0); + return C; + }) + ARK_MRI_TABLE(ARKODE_MRI_GARK_ERK45a, { /* A. Sandu, SINUM 57:2300-2327, 2019 */ MRIStepCoupling C = MRIStepCoupling_Alloc(2, 6, MRISTEP_EXPLICIT); @@ -122,6 +186,21 @@ ARK_MRI_TABLE(ARKODE_MRI_GARK_ERK45a, { /* A. Sandu, SINUM 57:2300-2327, 2019 */ return C; }) +ARK_MRI_TABLE(ARKODE_MRI_GARK_BACKWARD_EULER, { + MRIStepCoupling C = MRIStepCoupling_Alloc(1, 3, MRISTEP_IMPLICIT); + + C->q = 1; + C->p = 0; + + C->c[1] = ONE; + C->c[2] = ONE; + + C->G[0][1][0] = ONE; + C->G[0][2][0] = -ONE; + C->G[0][2][2] = ONE; + return C; + }) + ARK_MRI_TABLE(ARKODE_MRI_GARK_IRK21a, { /* A. Sandu, SINUM 57:2300-2327, 2019 */ MRIStepCoupling C; ARKodeButcherTable B = ARKodeButcherTable_Alloc(3, SUNFALSE); @@ -143,6 +222,23 @@ ARK_MRI_TABLE(ARKODE_MRI_GARK_IRK21a, { /* A. Sandu, SINUM 57:2300-2327, 2019 */ return C; }) +ARK_MRI_TABLE(ARKODE_MRI_GARK_IMPLICIT_MIDPOINT, { + MRIStepCoupling C = MRIStepCoupling_Alloc(1, 4, MRISTEP_IMPLICIT); + + C->q = 2; + C->p = 0; + + C->c[1] = ONE/TWO; + C->c[2] = ONE/TWO; + C->c[3] = ONE; + + C->G[0][1][0] = ONE/TWO; + C->G[0][2][0] = -ONE/TWO; + C->G[0][2][2] = ONE/TWO; + C->G[0][3][2] = ONE/TWO; + return C; + }) + ARK_MRI_TABLE(ARKODE_MRI_GARK_ESDIRK34a, { /* A. Sandu, SINUM 57:2300-2327, 2019 */ MRIStepCoupling C = MRIStepCoupling_Alloc(1, 7, MRISTEP_IMPLICIT); sunrealtype beta = SUN_RCONST(0.4358665215084589994160194511935568425); @@ -257,6 +353,64 @@ ARK_MRI_TABLE(ARKODE_MRI_GARK_ESDIRK46a, { /* A. Sandu, SINUM 57:2300-2327, 2019 return C; }) +ARK_MRI_TABLE(ARKODE_IMEX_MRI_GARK_EULER, { + MRIStepCoupling C = MRIStepCoupling_Alloc(1, 3, MRISTEP_IMEX); + + C->q = 1; + C->p = 0; + + C->c[1] = ONE; + C->c[2] = ONE; + + C->W[0][1][0] = ONE; + + C->G[0][1][0] = ONE; + C->G[0][2][0] = -ONE; + C->G[0][2][2] = ONE; + return C; + }) + +ARK_MRI_TABLE(ARKODE_IMEX_MRI_GARK_TRAPEZOIDAL, { + MRIStepCoupling C = MRIStepCoupling_Alloc(1, 4, MRISTEP_IMEX); + + C->q = 2; + C->p = 0; + + C->c[1] = ONE; + C->c[2] = ONE; + C->c[3] = ONE; + + C->W[0][1][0] = ONE; + C->W[0][3][0] = -ONE/TWO; + C->W[0][3][2] = ONE/TWO; + + C->G[0][1][0] = ONE; + C->G[0][2][0] = -ONE/TWO; + C->G[0][2][2] = ONE/TWO; + return C; + }) + +ARK_MRI_TABLE(ARKODE_IMEX_MRI_GARK_MIDPOINT, { + MRIStepCoupling C = MRIStepCoupling_Alloc(1, 4, MRISTEP_IMEX); + + C->q = 2; + C->p = 0; + + C->c[1] = ONE/TWO; + C->c[2] = ONE/TWO; + C->c[3] = ONE; + + C->W[0][1][0] = ONE/TWO; + C->W[0][3][0] = -ONE/TWO; + C->W[0][3][2] = ONE; + + C->G[0][1][0] = ONE/TWO; + C->G[0][2][0] = -ONE/TWO; + C->G[0][2][2] = ONE/TWO; + C->G[0][3][2] = ONE/TWO; + return C; + }) + ARK_MRI_TABLE(ARKODE_IMEX_MRI_GARK3a, { /* R. Chinomona & D. Reynolds SINUM 43(5):A3082-A3113, 2021 */ MRIStepCoupling C = MRIStepCoupling_Alloc(1, 8, MRISTEP_IMEX); sunrealtype beta = SUN_RCONST(0.4358665215084589994160194511935568425); diff --git a/src/arkode/arkode_mristep.c b/src/arkode/arkode_mristep.c index cea390373e..78f34da788 100644 --- a/src/arkode/arkode_mristep.c +++ b/src/arkode/arkode_mristep.c @@ -90,8 +90,7 @@ void* MRIStepCreate(ARKRhsFn fse, ARKRhsFn fsi, sunrealtype t0, N_Vector y0, } /* Allocate ARKodeMRIStepMem structure, and initialize to zero */ - step_mem = NULL; - step_mem = (ARKodeMRIStepMem)malloc(sizeof(struct ARKodeMRIStepMemRec)); + step_mem = (ARKodeMRIStepMem)calloc(1, sizeof(*step_mem)); if (step_mem == NULL) { arkProcessError(ark_mem, ARK_MEM_FAIL, __LINE__, __func__, __FILE__, @@ -99,7 +98,6 @@ void* MRIStepCreate(ARKRhsFn fse, ARKRhsFn fsi, sunrealtype t0, N_Vector y0, ARKodeFree((void**)&ark_mem); return (NULL); } - memset(step_mem, 0, sizeof(struct ARKodeMRIStepMemRec)); /* Attach step_mem structure and function pointers to ark_mem */ ark_mem->step_attachlinsol = mriStep_AttachLinsol; @@ -917,23 +915,23 @@ int mriStep_Init(ARKodeMem ark_mem, int init_type) return (ARK_ILL_INPUT); } - /* Retrieve/store method and embedding orders now that tables are finalized */ - step_mem->stages = step_mem->MRIC->stages; - step_mem->q = step_mem->MRIC->q; - step_mem->p = step_mem->MRIC->p; - /* allocate/fill derived quantities from MRIC structure */ /* stage map */ if (step_mem->stage_map) { free(step_mem->stage_map); - step_mem->stage_map = NULL; ark_mem->liw -= step_mem->stages; } - step_mem->stage_map = (int*)calloc(step_mem->stages, sizeof(int)); - ark_mem->liw += step_mem->stages; - + step_mem->stage_map = (int*)calloc(step_mem->MRIC->stages, + sizeof(*step_mem->stage_map)); + if (step_mem->stage_map == NULL) + { + arkProcessError(ark_mem, ARK_MEM_FAIL, __LINE__, __func__, __FILE__, + MSG_ARK_MEM_FAIL); + return (ARK_MEM_FAIL); + } + ark_mem->liw += step_mem->MRIC->stages; retval = mriStepCoupling_GetStageMap(step_mem->MRIC, step_mem->stage_map, &(step_mem->nstages_active)); if (retval != ARK_SUCCESS) @@ -947,12 +945,18 @@ int mriStep_Init(ARKodeMem ark_mem, int init_type) if (step_mem->stagetypes) { free(step_mem->stagetypes); - step_mem->stagetypes = NULL; ark_mem->liw -= step_mem->stages; } - step_mem->stagetypes = (int*)calloc(step_mem->stages, sizeof(int)); - ark_mem->liw += step_mem->stages; - for (j = 0; j < step_mem->stages; j++) + step_mem->stagetypes = (int*)calloc(step_mem->MRIC->stages, + sizeof(*step_mem->stagetypes)); + if (step_mem->stagetypes == NULL) + { + arkProcessError(ark_mem, ARK_MEM_FAIL, __LINE__, __func__, __FILE__, + MSG_ARK_MEM_FAIL); + return (ARK_MEM_FAIL); + } + ark_mem->liw += step_mem->MRIC->stages; + for (j = 0; j < step_mem->MRIC->stages; j++) { step_mem->stagetypes[j] = mriStepCoupling_GetStageType(step_mem->MRIC, j); } @@ -961,23 +965,70 @@ int mriStep_Init(ARKodeMem ark_mem, int init_type) if (step_mem->Ae_row) { free(step_mem->Ae_row); - step_mem->Ae_row = NULL; ark_mem->lrw -= step_mem->stages; } - step_mem->Ae_row = (sunrealtype*)calloc(step_mem->stages, - sizeof(sunrealtype)); - ark_mem->lrw += step_mem->stages; + step_mem->Ae_row = (sunrealtype*)calloc(step_mem->MRIC->stages, + sizeof(*step_mem->Ae_row)); + if (step_mem->Ae_row == NULL) + { + arkProcessError(ark_mem, ARK_MEM_FAIL, __LINE__, __func__, __FILE__, + MSG_ARK_MEM_FAIL); + return (ARK_MEM_FAIL); + } + ark_mem->lrw += step_mem->MRIC->stages; /* implicit RK coefficient row */ if (step_mem->Ai_row) { free(step_mem->Ai_row); - step_mem->Ai_row = NULL; ark_mem->lrw -= step_mem->stages; } - step_mem->Ai_row = (sunrealtype*)calloc(step_mem->stages, - sizeof(sunrealtype)); - ark_mem->lrw += step_mem->stages; + step_mem->Ai_row = (sunrealtype*)calloc(step_mem->MRIC->stages, + sizeof(*step_mem->Ai_row)); + if (step_mem->Ai_row == NULL) + { + arkProcessError(ark_mem, ARK_MEM_FAIL, __LINE__, __func__, __FILE__, + MSG_ARK_MEM_FAIL); + return (ARK_MEM_FAIL); + } + ark_mem->lrw += step_mem->MRIC->stages; + + /* Allocate reusable arrays for fused vector interface */ + if (step_mem->cvals) + { + free(step_mem->cvals); + ark_mem->lrw -= step_mem->nfusedopvecs; + } + if (step_mem->Xvecs) + { + free(step_mem->Xvecs); + ark_mem->liw -= step_mem->nfusedopvecs; + } + step_mem->nfusedopvecs = 2 * step_mem->MRIC->stages + 2; + step_mem->cvals = (sunrealtype*)calloc(step_mem->nfusedopvecs, + sizeof(*step_mem->cvals)); + if (step_mem->cvals == NULL) + { + arkProcessError(ark_mem, ARK_MEM_FAIL, __LINE__, __func__, __FILE__, + MSG_ARK_MEM_FAIL); + return (ARK_MEM_FAIL); + } + ark_mem->lrw += step_mem->nfusedopvecs; + + step_mem->Xvecs = (N_Vector*)calloc(step_mem->nfusedopvecs, + sizeof(*step_mem->Xvecs)); + if (step_mem->Xvecs == NULL) + { + arkProcessError(ark_mem, ARK_MEM_FAIL, __LINE__, __func__, __FILE__, + MSG_ARK_MEM_FAIL); + return (ARK_MEM_FAIL); + } + ark_mem->liw += step_mem->nfusedopvecs; + + /* Retrieve/store method and embedding orders now that tables are finalized */ + step_mem->stages = step_mem->MRIC->stages; + step_mem->q = step_mem->MRIC->q; + step_mem->p = step_mem->MRIC->p; /* Allocate MRI RHS vector memory, update storage requirements */ /* Allocate Fse[0] ... Fse[nstages_active - 1] and */ @@ -1054,23 +1105,6 @@ int mriStep_Init(ARKodeMem ark_mem, int init_type) step_mem->lmem = NULL; } - /* Allocate reusable arrays for fused vector interface */ - step_mem->nfusedopvecs = 2 * step_mem->stages + 2; - if (step_mem->cvals == NULL) - { - step_mem->cvals = (sunrealtype*)calloc(step_mem->nfusedopvecs, - sizeof(sunrealtype)); - if (step_mem->cvals == NULL) { return (ARK_MEM_FAIL); } - ark_mem->lrw += (step_mem->nfusedopvecs); - } - if (step_mem->Xvecs == NULL) - { - step_mem->Xvecs = (N_Vector*)calloc(step_mem->nfusedopvecs, - sizeof(N_Vector)); - if (step_mem->Xvecs == NULL) { return (ARK_MEM_FAIL); } - ark_mem->liw += (step_mem->nfusedopvecs); /* pointers */ - } - /* Allocate inner stepper data */ retval = mriStepInnerStepper_AllocVecs(step_mem->stepper, step_mem->MRIC->nmat, ark_mem->ewt); @@ -1693,6 +1727,8 @@ int mriStep_SetCoupling(ARKodeMem ark_mem) { ARKodeMRIStepMem step_mem; sunindextype Cliw, Clrw; + int q_actual; + ARKODE_MRITableID table_id; /* access ARKodeMRIStepMem structure */ if (ark_mem->step_mem == NULL) @@ -1702,72 +1738,57 @@ int mriStep_SetCoupling(ARKodeMem ark_mem) return (ARK_MEM_NULL); } step_mem = (ARKodeMRIStepMem)ark_mem->step_mem; + q_actual = step_mem->q; /* if coupling has already been specified, just return */ if (step_mem->MRIC != NULL) { return (ARK_SUCCESS); } + if (q_actual < 1 || q_actual > 4) + { + arkProcessError(ark_mem, ARK_ILL_INPUT, __LINE__, __func__, __FILE__, + "No MRI method at requested order, using q=3."); + q_actual = 3; + } + /* select method based on order and type */ /**** ImEx methods ****/ if (step_mem->implicit_rhs && step_mem->explicit_rhs) { - switch (step_mem->q) + switch (q_actual) { - case 3: - step_mem->MRIC = MRIStepCoupling_LoadTable(MRISTEP_DEFAULT_IMEX_SD_3); - break; - case 4: - step_mem->MRIC = MRIStepCoupling_LoadTable(MRISTEP_DEFAULT_IMEX_SD_4); - break; - default: - arkProcessError(ark_mem, ARK_ILL_INPUT, __LINE__, __func__, __FILE__, - "No MRI method at requested order, using q=3."); - step_mem->MRIC = MRIStepCoupling_LoadTable(MRISTEP_DEFAULT_IMEX_SD_3); - break; + case 1: table_id = MRISTEP_DEFAULT_IMEX_SD_1; break; + case 2: table_id = MRISTEP_DEFAULT_IMEX_SD_2; break; + case 3: table_id = MRISTEP_DEFAULT_IMEX_SD_2; break; + case 4: table_id = MRISTEP_DEFAULT_IMEX_SD_2; break; } /**** implicit methods ****/ } else if (step_mem->implicit_rhs) { - switch (step_mem->q) + switch (q_actual) { - case 2: - step_mem->MRIC = MRIStepCoupling_LoadTable(MRISTEP_DEFAULT_IMPL_SD_3); - break; - case 3: - step_mem->MRIC = MRIStepCoupling_LoadTable(MRISTEP_DEFAULT_IMPL_SD_3); - break; - case 4: - step_mem->MRIC = MRIStepCoupling_LoadTable(MRISTEP_DEFAULT_IMPL_SD_4); - break; - default: - arkProcessError(ark_mem, ARK_ILL_INPUT, __LINE__, __func__, __FILE__, - "No MRI method at requested order, using q=3."); - step_mem->MRIC = MRIStepCoupling_LoadTable(MRISTEP_DEFAULT_IMPL_SD_3); - break; + case 1: table_id = MRISTEP_DEFAULT_IMPL_SD_1; break; + case 2: table_id = MRISTEP_DEFAULT_IMPL_SD_2; break; + case 3: table_id = MRISTEP_DEFAULT_IMPL_SD_3; break; + case 4: table_id = MRISTEP_DEFAULT_IMPL_SD_4; break; } /**** explicit methods ****/ } else { - switch (step_mem->q) + switch (q_actual) { - case 3: - step_mem->MRIC = MRIStepCoupling_LoadTable(MRISTEP_DEFAULT_EXPL_3); - break; - case 4: - step_mem->MRIC = MRIStepCoupling_LoadTable(MRISTEP_DEFAULT_EXPL_4); - break; - default: - arkProcessError(ark_mem, ARK_ILL_INPUT, __LINE__, __func__, __FILE__, - "No MRI method at requested order, using q=3."); - step_mem->MRIC = MRIStepCoupling_LoadTable(MRISTEP_DEFAULT_EXPL_3); - break; + case 1: table_id = MRISTEP_DEFAULT_EXPL_1; break; + case 2: table_id = MRISTEP_DEFAULT_EXPL_2; break; + case 3: table_id = MRISTEP_DEFAULT_EXPL_3; break; + case 4: table_id = MRISTEP_DEFAULT_EXPL_4; break; } } + step_mem->MRIC = MRIStepCoupling_LoadTable(table_id); if (step_mem->MRIC == NULL) { arkProcessError(ark_mem, ARK_INVALID_TABLE, __LINE__, __func__, __FILE__, @@ -2882,7 +2903,7 @@ int mriStepInnerStepper_AllocVecs(MRIStepInnerStepper stepper, int count, /* Allocate fused operation workspace arrays */ if (stepper->vecs == NULL) { - stepper->vecs = (N_Vector*)calloc(count + 1, sizeof(N_Vector)); + stepper->vecs = (N_Vector*)calloc(count + 1, sizeof(*stepper->vecs)); if (stepper->vecs == NULL) { mriStepInnerStepper_FreeVecs(stepper); @@ -2892,7 +2913,7 @@ int mriStepInnerStepper_AllocVecs(MRIStepInnerStepper stepper, int count, if (stepper->vals == NULL) { - stepper->vals = (sunrealtype*)calloc(count + 1, sizeof(sunrealtype)); + stepper->vals = (sunrealtype*)calloc(count + 1, sizeof(*stepper->vals)); if (stepper->vals == NULL) { mriStepInnerStepper_FreeVecs(stepper); diff --git a/src/arkode/arkode_mristep_io.c b/src/arkode/arkode_mristep_io.c index e4ca3abaa2..d803141044 100644 --- a/src/arkode/arkode_mristep_io.c +++ b/src/arkode/arkode_mristep_io.c @@ -333,7 +333,7 @@ int mriStep_SetOrder(ARKodeMem ark_mem, int ord) if (retval) { return (retval); } /* check for illegal inputs */ - if (ord < 3 || ord > 4) { step_mem->q = 3; } + if (ord <= 0) { step_mem->q = 3; } else { step_mem->q = ord; } /* Clear tables, the user is requesting a change in method or a reset to diff --git a/src/arkode/fmod/farkode_mod.f90 b/src/arkode/fmod/farkode_mod.f90 index beac179931..f6252c31f4 100644 --- a/src/arkode/fmod/farkode_mod.f90 +++ b/src/arkode/fmod/farkode_mod.f90 @@ -315,7 +315,10 @@ module farkode_mod enumerator :: ARKODE_ESDIRK547L2SA_7_4_5 enumerator :: ARKODE_ESDIRK547L2SA2_7_4_5 enumerator :: ARKODE_ARK2_DIRK_3_1_2 - enumerator :: ARKODE_MAX_DIRK_NUM = ARKODE_ARK2_DIRK_3_1_2 + enumerator :: ARKODE_BACKWARD_EULER_1_1 + enumerator :: ARKODE_IMPLICIT_MIDPOINT_1_2 + enumerator :: ARKODE_IMPLICIT_TRAPEZOIDAL_2_2 + enumerator :: ARKODE_MAX_DIRK_NUM = ARKODE_IMPLICIT_TRAPEZOIDAL_2_2 end enum integer, parameter, public :: ARKODE_DIRKTableID = kind(ARKODE_DIRK_NONE) public :: ARKODE_DIRK_NONE, ARKODE_MIN_DIRK_NUM, ARKODE_SDIRK_2_1_2, ARKODE_BILLINGTON_3_3_2, ARKODE_TRBDF2_3_3_2, & @@ -324,7 +327,7 @@ module farkode_mod ARKODE_ARK437L2SA_DIRK_7_3_4, ARKODE_ARK548L2SAb_DIRK_8_4_5, ARKODE_ESDIRK324L2SA_4_2_3, ARKODE_ESDIRK325L2SA_5_2_3, & ARKODE_ESDIRK32I5L2SA_5_2_3, ARKODE_ESDIRK436L2SA_6_3_4, ARKODE_ESDIRK43I6L2SA_6_3_4, ARKODE_QESDIRK436L2SA_6_3_4, & ARKODE_ESDIRK437L2SA_7_3_4, ARKODE_ESDIRK547L2SA_7_4_5, ARKODE_ESDIRK547L2SA2_7_4_5, ARKODE_ARK2_DIRK_3_1_2, & - ARKODE_MAX_DIRK_NUM + ARKODE_BACKWARD_EULER_1_1, ARKODE_IMPLICIT_MIDPOINT_1_2, ARKODE_IMPLICIT_TRAPEZOIDAL_2_2, ARKODE_MAX_DIRK_NUM public :: FARKodeButcherTable_LoadDIRK public :: FARKodeButcherTable_LoadDIRKByName ! typedef enum ARKODE_ERKTableID @@ -353,7 +356,10 @@ module farkode_mod enumerator :: ARKODE_VERNER_10_6_7 enumerator :: ARKODE_VERNER_13_7_8 enumerator :: ARKODE_VERNER_16_8_9 - enumerator :: ARKODE_MAX_ERK_NUM = ARKODE_VERNER_16_8_9 + enumerator :: ARKODE_FORWARD_EULER_1_1 + enumerator :: ARKODE_RALSTON_EULER_2_1_2 + enumerator :: ARKODE_EXPLICIT_MIDPOINT_EULER_2_1_2 + enumerator :: ARKODE_MAX_ERK_NUM = ARKODE_EXPLICIT_MIDPOINT_EULER_2_1_2 end enum integer, parameter, public :: ARKODE_ERKTableID = kind(ARKODE_ERK_NONE) public :: ARKODE_ERK_NONE, ARKODE_MIN_ERK_NUM, ARKODE_HEUN_EULER_2_1_2, ARKODE_BOGACKI_SHAMPINE_4_2_3, & @@ -361,7 +367,8 @@ module farkode_mod ARKODE_CASH_KARP_6_4_5, ARKODE_FEHLBERG_6_4_5, ARKODE_DORMAND_PRINCE_7_4_5, ARKODE_ARK548L2SA_ERK_8_4_5, & ARKODE_VERNER_8_5_6, ARKODE_FEHLBERG_13_7_8, ARKODE_KNOTH_WOLKE_3_3, ARKODE_ARK437L2SA_ERK_7_3_4, & ARKODE_ARK548L2SAb_ERK_8_4_5, ARKODE_ARK2_ERK_3_1_2, ARKODE_SOFRONIOU_SPALETTA_5_3_4, ARKODE_SHU_OSHER_3_2_3, & - ARKODE_VERNER_9_5_6, ARKODE_VERNER_10_6_7, ARKODE_VERNER_13_7_8, ARKODE_VERNER_16_8_9, ARKODE_MAX_ERK_NUM + ARKODE_VERNER_9_5_6, ARKODE_VERNER_10_6_7, ARKODE_VERNER_13_7_8, ARKODE_VERNER_16_8_9, ARKODE_FORWARD_EULER_1_1, & + ARKODE_RALSTON_EULER_2_1_2, ARKODE_EXPLICIT_MIDPOINT_EULER_2_1_2, ARKODE_MAX_ERK_NUM public :: FARKodeButcherTable_LoadERK public :: FARKodeButcherTable_LoadERKByName ! typedef enum ARKODE_SPRKMethodID diff --git a/src/arkode/fmod/farkode_mristep_mod.f90 b/src/arkode/fmod/farkode_mristep_mod.f90 index 1b7b8aef81..782c3c1df9 100644 --- a/src/arkode/fmod/farkode_mristep_mod.f90 +++ b/src/arkode/fmod/farkode_mristep_mod.f90 @@ -47,18 +47,35 @@ module farkode_mristep_mod enumerator :: ARKODE_IMEX_MRI_GARK3a enumerator :: ARKODE_IMEX_MRI_GARK3b enumerator :: ARKODE_IMEX_MRI_GARK4 - enumerator :: ARKODE_MAX_MRI_NUM = ARKODE_IMEX_MRI_GARK4 + enumerator :: ARKODE_MRI_GARK_FORWARD_EULER + enumerator :: ARKODE_MRI_GARK_RALSTON2 + enumerator :: ARKODE_MRI_GARK_ERK22a + enumerator :: ARKODE_MRI_GARK_ERK22b + enumerator :: ARKODE_MRI_GARK_RALSTON3 + enumerator :: ARKODE_MRI_GARK_BACKWARD_EULER + enumerator :: ARKODE_MRI_GARK_IMPLICIT_MIDPOINT + enumerator :: ARKODE_IMEX_MRI_GARK_EULER + enumerator :: ARKODE_IMEX_MRI_GARK_TRAPEZOIDAL + enumerator :: ARKODE_IMEX_MRI_GARK_MIDPOINT + enumerator :: ARKODE_MAX_MRI_NUM = ARKODE_IMEX_MRI_GARK_MIDPOINT end enum integer, parameter, public :: ARKODE_MRITableID = kind(ARKODE_MRI_NONE) public :: ARKODE_MRI_NONE, ARKODE_MIN_MRI_NUM, ARKODE_MIS_KW3, ARKODE_MRI_GARK_ERK33a, ARKODE_MRI_GARK_ERK45a, & ARKODE_MRI_GARK_IRK21a, ARKODE_MRI_GARK_ESDIRK34a, ARKODE_MRI_GARK_ESDIRK46a, ARKODE_IMEX_MRI_GARK3a, & - ARKODE_IMEX_MRI_GARK3b, ARKODE_IMEX_MRI_GARK4, ARKODE_MAX_MRI_NUM - integer(C_INT), parameter, public :: MRISTEP_DEFAULT_3 = ARKODE_MIS_KW3 + ARKODE_IMEX_MRI_GARK3b, ARKODE_IMEX_MRI_GARK4, ARKODE_MRI_GARK_FORWARD_EULER, ARKODE_MRI_GARK_RALSTON2, & + ARKODE_MRI_GARK_ERK22a, ARKODE_MRI_GARK_ERK22b, ARKODE_MRI_GARK_RALSTON3, ARKODE_MRI_GARK_BACKWARD_EULER, & + ARKODE_MRI_GARK_IMPLICIT_MIDPOINT, ARKODE_IMEX_MRI_GARK_EULER, ARKODE_IMEX_MRI_GARK_TRAPEZOIDAL, & + ARKODE_IMEX_MRI_GARK_MIDPOINT, ARKODE_MAX_MRI_NUM + integer(C_INT), parameter, public :: MRISTEP_DEFAULT_EXPL_1 = ARKODE_MRI_GARK_FORWARD_EULER + integer(C_INT), parameter, public :: MRISTEP_DEFAULT_EXPL_2 = ARKODE_MRI_GARK_ERK22b integer(C_INT), parameter, public :: MRISTEP_DEFAULT_EXPL_3 = ARKODE_MIS_KW3 integer(C_INT), parameter, public :: MRISTEP_DEFAULT_EXPL_4 = ARKODE_MRI_GARK_ERK45a + integer(C_INT), parameter, public :: MRISTEP_DEFAULT_IMPL_SD_1 = ARKODE_MRI_GARK_BACKWARD_EULER integer(C_INT), parameter, public :: MRISTEP_DEFAULT_IMPL_SD_2 = ARKODE_MRI_GARK_IRK21a integer(C_INT), parameter, public :: MRISTEP_DEFAULT_IMPL_SD_3 = ARKODE_MRI_GARK_ESDIRK34a integer(C_INT), parameter, public :: MRISTEP_DEFAULT_IMPL_SD_4 = ARKODE_MRI_GARK_ESDIRK46a + integer(C_INT), parameter, public :: MRISTEP_DEFAULT_IMEX_SD_1 = ARKODE_IMEX_MRI_GARK_EULER + integer(C_INT), parameter, public :: MRISTEP_DEFAULT_IMEX_SD_2 = ARKODE_IMEX_MRI_GARK_TRAPEZOIDAL integer(C_INT), parameter, public :: MRISTEP_DEFAULT_IMEX_SD_3 = ARKODE_IMEX_MRI_GARK3b integer(C_INT), parameter, public :: MRISTEP_DEFAULT_IMEX_SD_4 = ARKODE_IMEX_MRI_GARK4 diff --git a/test/answers b/test/answers index ea6ac15fdc..073b119355 160000 --- a/test/answers +++ b/test/answers @@ -1 +1 @@ -Subproject commit ea6ac15fdcd8615e25e52692bcd453e2f003f46b +Subproject commit 073b119355058ac88a2e4abc87acfb007bc211f6 diff --git a/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_ark_0_0.out b/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_ark_0_0.out index 0b5e75274c..0632b1dd9d 100644 --- a/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_ark_0_0.out +++ b/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_ark_0_0.out @@ -818,6 +818,111 @@ Fe RHS evals: expected: 68 -------------------- +======================== +ERK Table ID 22 + stages: 1 + order: 1 + explicit 1st stage: 1 + stiffly accurate: 0 + first same as last: 0 +======================== +-------------------- +Steps: 1 +Fe RHS evals: + actual: 1 + expected: 1 +-------------------- +Steps: 2 +Fe RHS evals: + actual: 2 + expected: 2 +-------------------- +Steps: 3 +Fe RHS evals: + actual: 3 + expected: 3 +-------------------- +Dense Output +Fe RHS evals: + actual: 4 + expected: 4 +-------------------- +Steps: 4 +Fe RHS evals: + actual: 4 + expected: 4 +-------------------- + +======================== +ERK Table ID 23 + stages: 2 + order: 2 + explicit 1st stage: 1 + stiffly accurate: 0 + first same as last: 0 +======================== +-------------------- +Steps: 1 +Fe RHS evals: + actual: 2 + expected: 2 +-------------------- +Steps: 2 +Fe RHS evals: + actual: 4 + expected: 4 +-------------------- +Steps: 3 +Fe RHS evals: + actual: 6 + expected: 6 +-------------------- +Dense Output +Fe RHS evals: + actual: 7 + expected: 7 +-------------------- +Steps: 4 +Fe RHS evals: + actual: 8 + expected: 8 +-------------------- + +======================== +ERK Table ID 24 + stages: 2 + order: 2 + explicit 1st stage: 1 + stiffly accurate: 0 + first same as last: 0 +======================== +-------------------- +Steps: 1 +Fe RHS evals: + actual: 2 + expected: 2 +-------------------- +Steps: 2 +Fe RHS evals: + actual: 4 + expected: 4 +-------------------- +Steps: 3 +Fe RHS evals: + actual: 6 + expected: 6 +-------------------- +Dense Output +Fe RHS evals: + actual: 7 + expected: 7 +-------------------- +Steps: 4 +Fe RHS evals: + actual: 8 + expected: 8 +-------------------- + ======================== Test implicit RK methods ======================== @@ -1797,6 +1902,123 @@ Fi RHS evals: expected: 17 -------------------- +======================== +DIRK Table ID 124 + stages: 1 + order: 1 + explicit 1st stage: 0 + stiffly accurate: 1 + first same as last: 0 +======================== +-------------------- +Steps: 1 +NLS iters: 1 +Fi RHS evals: + actual: 3 + expected: 3 +-------------------- +Steps: 2 +NLS iters: 2 +Fi RHS evals: + actual: 5 + expected: 5 +-------------------- +Steps: 3 +NLS iters: 3 +Fi RHS evals: + actual: 7 + expected: 7 +-------------------- +Dense Output +Fi RHS evals: + actual: 7 + expected: 7 +-------------------- +Steps: 4 +NLS iters: 4 +Fi RHS evals: + actual: 9 + expected: 9 +-------------------- + +======================== +DIRK Table ID 125 + stages: 1 + order: 2 + explicit 1st stage: 0 + stiffly accurate: 0 + first same as last: 0 +======================== +-------------------- +Steps: 1 +NLS iters: 1 +Fi RHS evals: + actual: 3 + expected: 3 +-------------------- +Steps: 2 +NLS iters: 2 +Fi RHS evals: + actual: 6 + expected: 6 +-------------------- +Steps: 3 +NLS iters: 3 +Fi RHS evals: + actual: 9 + expected: 9 +-------------------- +Dense Output +Fi RHS evals: + actual: 10 + expected: 10 +-------------------- +Steps: 4 +NLS iters: 4 +Fi RHS evals: + actual: 12 + expected: 12 +-------------------- + +======================== +DIRK Table ID 126 + stages: 2 + order: 2 + explicit 1st stage: 1 + stiffly accurate: 1 + first same as last: 1 +======================== +-------------------- +Steps: 1 +NLS iters: 1 +Fi RHS evals: + actual: 3 + expected: 3 +-------------------- +Steps: 2 +NLS iters: 2 +Fi RHS evals: + actual: 5 + expected: 5 +-------------------- +Steps: 3 +NLS iters: 3 +Fi RHS evals: + actual: 7 + expected: 7 +-------------------- +Dense Output +Fi RHS evals: + actual: 7 + expected: 7 +-------------------- +Steps: 4 +NLS iters: 4 +Fi RHS evals: + actual: 9 + expected: 9 +-------------------- + ===================== Test IMEX ARK methods ===================== diff --git a/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_ark_0_1.out b/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_ark_0_1.out index 63acf12fd8..2594d1cd48 100644 --- a/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_ark_0_1.out +++ b/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_ark_0_1.out @@ -818,6 +818,111 @@ Fe RHS evals: expected: 64 -------------------- +======================== +ERK Table ID 22 + stages: 1 + order: 1 + explicit 1st stage: 1 + stiffly accurate: 0 + first same as last: 0 +======================== +-------------------- +Steps: 1 +Fe RHS evals: + actual: 1 + expected: 1 +-------------------- +Steps: 2 +Fe RHS evals: + actual: 2 + expected: 2 +-------------------- +Steps: 3 +Fe RHS evals: + actual: 3 + expected: 3 +-------------------- +Dense Output +Fe RHS evals: + actual: 3 + expected: 3 +-------------------- +Steps: 4 +Fe RHS evals: + actual: 4 + expected: 4 +-------------------- + +======================== +ERK Table ID 23 + stages: 2 + order: 2 + explicit 1st stage: 1 + stiffly accurate: 0 + first same as last: 0 +======================== +-------------------- +Steps: 1 +Fe RHS evals: + actual: 2 + expected: 2 +-------------------- +Steps: 2 +Fe RHS evals: + actual: 4 + expected: 4 +-------------------- +Steps: 3 +Fe RHS evals: + actual: 6 + expected: 6 +-------------------- +Dense Output +Fe RHS evals: + actual: 6 + expected: 6 +-------------------- +Steps: 4 +Fe RHS evals: + actual: 8 + expected: 8 +-------------------- + +======================== +ERK Table ID 24 + stages: 2 + order: 2 + explicit 1st stage: 1 + stiffly accurate: 0 + first same as last: 0 +======================== +-------------------- +Steps: 1 +Fe RHS evals: + actual: 2 + expected: 2 +-------------------- +Steps: 2 +Fe RHS evals: + actual: 4 + expected: 4 +-------------------- +Steps: 3 +Fe RHS evals: + actual: 6 + expected: 6 +-------------------- +Dense Output +Fe RHS evals: + actual: 6 + expected: 6 +-------------------- +Steps: 4 +Fe RHS evals: + actual: 8 + expected: 8 +-------------------- + ======================== Test implicit RK methods ======================== @@ -1797,6 +1902,123 @@ Fi RHS evals: expected: 17 -------------------- +======================== +DIRK Table ID 124 + stages: 1 + order: 1 + explicit 1st stage: 0 + stiffly accurate: 1 + first same as last: 0 +======================== +-------------------- +Steps: 1 +NLS iters: 1 +Fi RHS evals: + actual: 2 + expected: 2 +-------------------- +Steps: 2 +NLS iters: 2 +Fi RHS evals: + actual: 4 + expected: 4 +-------------------- +Steps: 3 +NLS iters: 3 +Fi RHS evals: + actual: 6 + expected: 6 +-------------------- +Dense Output +Fi RHS evals: + actual: 6 + expected: 6 +-------------------- +Steps: 4 +NLS iters: 4 +Fi RHS evals: + actual: 8 + expected: 8 +-------------------- + +======================== +DIRK Table ID 125 + stages: 1 + order: 2 + explicit 1st stage: 0 + stiffly accurate: 0 + first same as last: 0 +======================== +-------------------- +Steps: 1 +NLS iters: 1 +Fi RHS evals: + actual: 2 + expected: 2 +-------------------- +Steps: 2 +NLS iters: 2 +Fi RHS evals: + actual: 4 + expected: 4 +-------------------- +Steps: 3 +NLS iters: 3 +Fi RHS evals: + actual: 6 + expected: 6 +-------------------- +Dense Output +Fi RHS evals: + actual: 6 + expected: 6 +-------------------- +Steps: 4 +NLS iters: 4 +Fi RHS evals: + actual: 8 + expected: 8 +-------------------- + +======================== +DIRK Table ID 126 + stages: 2 + order: 2 + explicit 1st stage: 1 + stiffly accurate: 1 + first same as last: 1 +======================== +-------------------- +Steps: 1 +NLS iters: 1 +Fi RHS evals: + actual: 3 + expected: 3 +-------------------- +Steps: 2 +NLS iters: 2 +Fi RHS evals: + actual: 5 + expected: 5 +-------------------- +Steps: 3 +NLS iters: 3 +Fi RHS evals: + actual: 7 + expected: 7 +-------------------- +Dense Output +Fi RHS evals: + actual: 7 + expected: 7 +-------------------- +Steps: 4 +NLS iters: 4 +Fi RHS evals: + actual: 9 + expected: 9 +-------------------- + ===================== Test IMEX ARK methods ===================== diff --git a/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_ark_1_0.out b/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_ark_1_0.out index 02af9aea19..c4acdc8074 100644 --- a/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_ark_1_0.out +++ b/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_ark_1_0.out @@ -818,6 +818,111 @@ Fe RHS evals: expected: 68 -------------------- +======================== +ERK Table ID 22 + stages: 1 + order: 1 + explicit 1st stage: 1 + stiffly accurate: 0 + first same as last: 0 +======================== +-------------------- +Steps: 1 +Fe RHS evals: + actual: 1 + expected: 1 +-------------------- +Steps: 2 +Fe RHS evals: + actual: 2 + expected: 2 +-------------------- +Steps: 3 +Fe RHS evals: + actual: 3 + expected: 3 +-------------------- +Dense Output +Fe RHS evals: + actual: 4 + expected: 4 +-------------------- +Steps: 4 +Fe RHS evals: + actual: 4 + expected: 4 +-------------------- + +======================== +ERK Table ID 23 + stages: 2 + order: 2 + explicit 1st stage: 1 + stiffly accurate: 0 + first same as last: 0 +======================== +-------------------- +Steps: 1 +Fe RHS evals: + actual: 2 + expected: 2 +-------------------- +Steps: 2 +Fe RHS evals: + actual: 4 + expected: 4 +-------------------- +Steps: 3 +Fe RHS evals: + actual: 6 + expected: 6 +-------------------- +Dense Output +Fe RHS evals: + actual: 7 + expected: 7 +-------------------- +Steps: 4 +Fe RHS evals: + actual: 8 + expected: 8 +-------------------- + +======================== +ERK Table ID 24 + stages: 2 + order: 2 + explicit 1st stage: 1 + stiffly accurate: 0 + first same as last: 0 +======================== +-------------------- +Steps: 1 +Fe RHS evals: + actual: 2 + expected: 2 +-------------------- +Steps: 2 +Fe RHS evals: + actual: 4 + expected: 4 +-------------------- +Steps: 3 +Fe RHS evals: + actual: 6 + expected: 6 +-------------------- +Dense Output +Fe RHS evals: + actual: 7 + expected: 7 +-------------------- +Steps: 4 +Fe RHS evals: + actual: 8 + expected: 8 +-------------------- + ======================== Test implicit RK methods ======================== @@ -1797,6 +1902,123 @@ Fi RHS evals: expected: 17 -------------------- +======================== +DIRK Table ID 124 + stages: 1 + order: 1 + explicit 1st stage: 0 + stiffly accurate: 1 + first same as last: 0 +======================== +-------------------- +Steps: 1 +NLS iters: 1 +Fi RHS evals: + actual: 3 + expected: 3 +-------------------- +Steps: 2 +NLS iters: 2 +Fi RHS evals: + actual: 5 + expected: 5 +-------------------- +Steps: 3 +NLS iters: 3 +Fi RHS evals: + actual: 7 + expected: 7 +-------------------- +Dense Output +Fi RHS evals: + actual: 7 + expected: 7 +-------------------- +Steps: 4 +NLS iters: 4 +Fi RHS evals: + actual: 9 + expected: 9 +-------------------- + +======================== +DIRK Table ID 125 + stages: 1 + order: 2 + explicit 1st stage: 0 + stiffly accurate: 0 + first same as last: 0 +======================== +-------------------- +Steps: 1 +NLS iters: 1 +Fi RHS evals: + actual: 3 + expected: 3 +-------------------- +Steps: 2 +NLS iters: 2 +Fi RHS evals: + actual: 6 + expected: 6 +-------------------- +Steps: 3 +NLS iters: 3 +Fi RHS evals: + actual: 9 + expected: 9 +-------------------- +Dense Output +Fi RHS evals: + actual: 10 + expected: 10 +-------------------- +Steps: 4 +NLS iters: 4 +Fi RHS evals: + actual: 12 + expected: 12 +-------------------- + +======================== +DIRK Table ID 126 + stages: 2 + order: 2 + explicit 1st stage: 1 + stiffly accurate: 1 + first same as last: 1 +======================== +-------------------- +Steps: 1 +NLS iters: 1 +Fi RHS evals: + actual: 3 + expected: 3 +-------------------- +Steps: 2 +NLS iters: 2 +Fi RHS evals: + actual: 5 + expected: 5 +-------------------- +Steps: 3 +NLS iters: 3 +Fi RHS evals: + actual: 7 + expected: 7 +-------------------- +Dense Output +Fi RHS evals: + actual: 7 + expected: 7 +-------------------- +Steps: 4 +NLS iters: 4 +Fi RHS evals: + actual: 9 + expected: 9 +-------------------- + ===================== Test IMEX ARK methods ===================== diff --git a/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_ark_1_1.out b/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_ark_1_1.out index 8e54df6754..6d307f1e20 100644 --- a/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_ark_1_1.out +++ b/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_ark_1_1.out @@ -818,6 +818,111 @@ Fe RHS evals: expected: 64 -------------------- +======================== +ERK Table ID 22 + stages: 1 + order: 1 + explicit 1st stage: 1 + stiffly accurate: 0 + first same as last: 0 +======================== +-------------------- +Steps: 1 +Fe RHS evals: + actual: 1 + expected: 1 +-------------------- +Steps: 2 +Fe RHS evals: + actual: 2 + expected: 2 +-------------------- +Steps: 3 +Fe RHS evals: + actual: 3 + expected: 3 +-------------------- +Dense Output +Fe RHS evals: + actual: 3 + expected: 3 +-------------------- +Steps: 4 +Fe RHS evals: + actual: 4 + expected: 4 +-------------------- + +======================== +ERK Table ID 23 + stages: 2 + order: 2 + explicit 1st stage: 1 + stiffly accurate: 0 + first same as last: 0 +======================== +-------------------- +Steps: 1 +Fe RHS evals: + actual: 2 + expected: 2 +-------------------- +Steps: 2 +Fe RHS evals: + actual: 4 + expected: 4 +-------------------- +Steps: 3 +Fe RHS evals: + actual: 6 + expected: 6 +-------------------- +Dense Output +Fe RHS evals: + actual: 6 + expected: 6 +-------------------- +Steps: 4 +Fe RHS evals: + actual: 8 + expected: 8 +-------------------- + +======================== +ERK Table ID 24 + stages: 2 + order: 2 + explicit 1st stage: 1 + stiffly accurate: 0 + first same as last: 0 +======================== +-------------------- +Steps: 1 +Fe RHS evals: + actual: 2 + expected: 2 +-------------------- +Steps: 2 +Fe RHS evals: + actual: 4 + expected: 4 +-------------------- +Steps: 3 +Fe RHS evals: + actual: 6 + expected: 6 +-------------------- +Dense Output +Fe RHS evals: + actual: 6 + expected: 6 +-------------------- +Steps: 4 +Fe RHS evals: + actual: 8 + expected: 8 +-------------------- + ======================== Test implicit RK methods ======================== @@ -1797,6 +1902,123 @@ Fi RHS evals: expected: 17 -------------------- +======================== +DIRK Table ID 124 + stages: 1 + order: 1 + explicit 1st stage: 0 + stiffly accurate: 1 + first same as last: 0 +======================== +-------------------- +Steps: 1 +NLS iters: 1 +Fi RHS evals: + actual: 2 + expected: 2 +-------------------- +Steps: 2 +NLS iters: 2 +Fi RHS evals: + actual: 4 + expected: 4 +-------------------- +Steps: 3 +NLS iters: 3 +Fi RHS evals: + actual: 6 + expected: 6 +-------------------- +Dense Output +Fi RHS evals: + actual: 6 + expected: 6 +-------------------- +Steps: 4 +NLS iters: 4 +Fi RHS evals: + actual: 8 + expected: 8 +-------------------- + +======================== +DIRK Table ID 125 + stages: 1 + order: 2 + explicit 1st stage: 0 + stiffly accurate: 0 + first same as last: 0 +======================== +-------------------- +Steps: 1 +NLS iters: 1 +Fi RHS evals: + actual: 2 + expected: 2 +-------------------- +Steps: 2 +NLS iters: 2 +Fi RHS evals: + actual: 4 + expected: 4 +-------------------- +Steps: 3 +NLS iters: 3 +Fi RHS evals: + actual: 6 + expected: 6 +-------------------- +Dense Output +Fi RHS evals: + actual: 6 + expected: 6 +-------------------- +Steps: 4 +NLS iters: 4 +Fi RHS evals: + actual: 8 + expected: 8 +-------------------- + +======================== +DIRK Table ID 126 + stages: 2 + order: 2 + explicit 1st stage: 1 + stiffly accurate: 1 + first same as last: 1 +======================== +-------------------- +Steps: 1 +NLS iters: 1 +Fi RHS evals: + actual: 3 + expected: 3 +-------------------- +Steps: 2 +NLS iters: 2 +Fi RHS evals: + actual: 5 + expected: 5 +-------------------- +Steps: 3 +NLS iters: 3 +Fi RHS evals: + actual: 7 + expected: 7 +-------------------- +Dense Output +Fi RHS evals: + actual: 7 + expected: 7 +-------------------- +Steps: 4 +NLS iters: 4 +Fi RHS evals: + actual: 9 + expected: 9 +-------------------- + ===================== Test IMEX ARK methods ===================== diff --git a/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_ark_2_0.out b/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_ark_2_0.out index 363b66b2ac..bf6e07f6c5 100644 --- a/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_ark_2_0.out +++ b/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_ark_2_0.out @@ -818,6 +818,111 @@ Fe RHS evals: expected: 68 -------------------- +======================== +ERK Table ID 22 + stages: 1 + order: 1 + explicit 1st stage: 1 + stiffly accurate: 0 + first same as last: 0 +======================== +-------------------- +Steps: 1 +Fe RHS evals: + actual: 1 + expected: 1 +-------------------- +Steps: 2 +Fe RHS evals: + actual: 2 + expected: 2 +-------------------- +Steps: 3 +Fe RHS evals: + actual: 3 + expected: 3 +-------------------- +Dense Output +Fe RHS evals: + actual: 4 + expected: 4 +-------------------- +Steps: 4 +Fe RHS evals: + actual: 4 + expected: 4 +-------------------- + +======================== +ERK Table ID 23 + stages: 2 + order: 2 + explicit 1st stage: 1 + stiffly accurate: 0 + first same as last: 0 +======================== +-------------------- +Steps: 1 +Fe RHS evals: + actual: 2 + expected: 2 +-------------------- +Steps: 2 +Fe RHS evals: + actual: 4 + expected: 4 +-------------------- +Steps: 3 +Fe RHS evals: + actual: 6 + expected: 6 +-------------------- +Dense Output +Fe RHS evals: + actual: 7 + expected: 7 +-------------------- +Steps: 4 +Fe RHS evals: + actual: 8 + expected: 8 +-------------------- + +======================== +ERK Table ID 24 + stages: 2 + order: 2 + explicit 1st stage: 1 + stiffly accurate: 0 + first same as last: 0 +======================== +-------------------- +Steps: 1 +Fe RHS evals: + actual: 2 + expected: 2 +-------------------- +Steps: 2 +Fe RHS evals: + actual: 4 + expected: 4 +-------------------- +Steps: 3 +Fe RHS evals: + actual: 6 + expected: 6 +-------------------- +Dense Output +Fe RHS evals: + actual: 7 + expected: 7 +-------------------- +Steps: 4 +Fe RHS evals: + actual: 8 + expected: 8 +-------------------- + ======================== Test implicit RK methods ======================== @@ -1797,6 +1902,123 @@ Fi RHS evals: expected: 17 -------------------- +======================== +DIRK Table ID 124 + stages: 1 + order: 1 + explicit 1st stage: 0 + stiffly accurate: 1 + first same as last: 0 +======================== +-------------------- +Steps: 1 +NLS iters: 1 +Fi RHS evals: + actual: 3 + expected: 3 +-------------------- +Steps: 2 +NLS iters: 2 +Fi RHS evals: + actual: 5 + expected: 5 +-------------------- +Steps: 3 +NLS iters: 3 +Fi RHS evals: + actual: 7 + expected: 7 +-------------------- +Dense Output +Fi RHS evals: + actual: 7 + expected: 7 +-------------------- +Steps: 4 +NLS iters: 4 +Fi RHS evals: + actual: 9 + expected: 9 +-------------------- + +======================== +DIRK Table ID 125 + stages: 1 + order: 2 + explicit 1st stage: 0 + stiffly accurate: 0 + first same as last: 0 +======================== +-------------------- +Steps: 1 +NLS iters: 1 +Fi RHS evals: + actual: 3 + expected: 3 +-------------------- +Steps: 2 +NLS iters: 2 +Fi RHS evals: + actual: 6 + expected: 6 +-------------------- +Steps: 3 +NLS iters: 3 +Fi RHS evals: + actual: 9 + expected: 9 +-------------------- +Dense Output +Fi RHS evals: + actual: 10 + expected: 10 +-------------------- +Steps: 4 +NLS iters: 4 +Fi RHS evals: + actual: 12 + expected: 12 +-------------------- + +======================== +DIRK Table ID 126 + stages: 2 + order: 2 + explicit 1st stage: 1 + stiffly accurate: 1 + first same as last: 1 +======================== +-------------------- +Steps: 1 +NLS iters: 1 +Fi RHS evals: + actual: 3 + expected: 3 +-------------------- +Steps: 2 +NLS iters: 2 +Fi RHS evals: + actual: 5 + expected: 5 +-------------------- +Steps: 3 +NLS iters: 3 +Fi RHS evals: + actual: 7 + expected: 7 +-------------------- +Dense Output +Fi RHS evals: + actual: 7 + expected: 7 +-------------------- +Steps: 4 +NLS iters: 4 +Fi RHS evals: + actual: 9 + expected: 9 +-------------------- + ===================== Test IMEX ARK methods ===================== diff --git a/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_ark_2_1.out b/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_ark_2_1.out index bf8edcf74b..0269da8178 100644 --- a/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_ark_2_1.out +++ b/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_ark_2_1.out @@ -818,6 +818,111 @@ Fe RHS evals: expected: 64 -------------------- +======================== +ERK Table ID 22 + stages: 1 + order: 1 + explicit 1st stage: 1 + stiffly accurate: 0 + first same as last: 0 +======================== +-------------------- +Steps: 1 +Fe RHS evals: + actual: 1 + expected: 1 +-------------------- +Steps: 2 +Fe RHS evals: + actual: 2 + expected: 2 +-------------------- +Steps: 3 +Fe RHS evals: + actual: 3 + expected: 3 +-------------------- +Dense Output +Fe RHS evals: + actual: 3 + expected: 3 +-------------------- +Steps: 4 +Fe RHS evals: + actual: 4 + expected: 4 +-------------------- + +======================== +ERK Table ID 23 + stages: 2 + order: 2 + explicit 1st stage: 1 + stiffly accurate: 0 + first same as last: 0 +======================== +-------------------- +Steps: 1 +Fe RHS evals: + actual: 2 + expected: 2 +-------------------- +Steps: 2 +Fe RHS evals: + actual: 4 + expected: 4 +-------------------- +Steps: 3 +Fe RHS evals: + actual: 6 + expected: 6 +-------------------- +Dense Output +Fe RHS evals: + actual: 6 + expected: 6 +-------------------- +Steps: 4 +Fe RHS evals: + actual: 8 + expected: 8 +-------------------- + +======================== +ERK Table ID 24 + stages: 2 + order: 2 + explicit 1st stage: 1 + stiffly accurate: 0 + first same as last: 0 +======================== +-------------------- +Steps: 1 +Fe RHS evals: + actual: 2 + expected: 2 +-------------------- +Steps: 2 +Fe RHS evals: + actual: 4 + expected: 4 +-------------------- +Steps: 3 +Fe RHS evals: + actual: 6 + expected: 6 +-------------------- +Dense Output +Fe RHS evals: + actual: 6 + expected: 6 +-------------------- +Steps: 4 +Fe RHS evals: + actual: 8 + expected: 8 +-------------------- + ======================== Test implicit RK methods ======================== @@ -1797,6 +1902,123 @@ Fi RHS evals: expected: 17 -------------------- +======================== +DIRK Table ID 124 + stages: 1 + order: 1 + explicit 1st stage: 0 + stiffly accurate: 1 + first same as last: 0 +======================== +-------------------- +Steps: 1 +NLS iters: 1 +Fi RHS evals: + actual: 2 + expected: 2 +-------------------- +Steps: 2 +NLS iters: 2 +Fi RHS evals: + actual: 4 + expected: 4 +-------------------- +Steps: 3 +NLS iters: 3 +Fi RHS evals: + actual: 6 + expected: 6 +-------------------- +Dense Output +Fi RHS evals: + actual: 6 + expected: 6 +-------------------- +Steps: 4 +NLS iters: 4 +Fi RHS evals: + actual: 8 + expected: 8 +-------------------- + +======================== +DIRK Table ID 125 + stages: 1 + order: 2 + explicit 1st stage: 0 + stiffly accurate: 0 + first same as last: 0 +======================== +-------------------- +Steps: 1 +NLS iters: 1 +Fi RHS evals: + actual: 2 + expected: 2 +-------------------- +Steps: 2 +NLS iters: 2 +Fi RHS evals: + actual: 4 + expected: 4 +-------------------- +Steps: 3 +NLS iters: 3 +Fi RHS evals: + actual: 6 + expected: 6 +-------------------- +Dense Output +Fi RHS evals: + actual: 6 + expected: 6 +-------------------- +Steps: 4 +NLS iters: 4 +Fi RHS evals: + actual: 8 + expected: 8 +-------------------- + +======================== +DIRK Table ID 126 + stages: 2 + order: 2 + explicit 1st stage: 1 + stiffly accurate: 1 + first same as last: 1 +======================== +-------------------- +Steps: 1 +NLS iters: 1 +Fi RHS evals: + actual: 3 + expected: 3 +-------------------- +Steps: 2 +NLS iters: 2 +Fi RHS evals: + actual: 5 + expected: 5 +-------------------- +Steps: 3 +NLS iters: 3 +Fi RHS evals: + actual: 7 + expected: 7 +-------------------- +Dense Output +Fi RHS evals: + actual: 7 + expected: 7 +-------------------- +Steps: 4 +NLS iters: 4 +Fi RHS evals: + actual: 9 + expected: 9 +-------------------- + ===================== Test IMEX ARK methods ===================== diff --git a/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_erk_0.out b/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_erk_0.out index 7e2256037c..0a8aaf3158 100644 --- a/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_erk_0.out +++ b/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_erk_0.out @@ -815,5 +815,110 @@ Fe RHS evals: expected: 68 -------------------- +======================== +ERK Table ID 22 + stages: 1 + order: 1 + explicit 1st stage: 1 + stiffly accurate: 0 + first same as last: 0 +======================== +-------------------- +Steps: 1 +Fe RHS evals: + actual: 1 + expected: 1 +-------------------- +Steps: 2 +Fe RHS evals: + actual: 2 + expected: 2 +-------------------- +Steps: 3 +Fe RHS evals: + actual: 3 + expected: 3 +-------------------- +Dense Output +Fe RHS evals: + actual: 4 + expected: 4 +-------------------- +Steps: 4 +Fe RHS evals: + actual: 4 + expected: 4 +-------------------- + +======================== +ERK Table ID 23 + stages: 2 + order: 2 + explicit 1st stage: 1 + stiffly accurate: 0 + first same as last: 0 +======================== +-------------------- +Steps: 1 +Fe RHS evals: + actual: 2 + expected: 2 +-------------------- +Steps: 2 +Fe RHS evals: + actual: 4 + expected: 4 +-------------------- +Steps: 3 +Fe RHS evals: + actual: 6 + expected: 6 +-------------------- +Dense Output +Fe RHS evals: + actual: 7 + expected: 7 +-------------------- +Steps: 4 +Fe RHS evals: + actual: 8 + expected: 8 +-------------------- + +======================== +ERK Table ID 24 + stages: 2 + order: 2 + explicit 1st stage: 1 + stiffly accurate: 0 + first same as last: 0 +======================== +-------------------- +Steps: 1 +Fe RHS evals: + actual: 2 + expected: 2 +-------------------- +Steps: 2 +Fe RHS evals: + actual: 4 + expected: 4 +-------------------- +Steps: 3 +Fe RHS evals: + actual: 6 + expected: 6 +-------------------- +Dense Output +Fe RHS evals: + actual: 7 + expected: 7 +-------------------- +Steps: 4 +Fe RHS evals: + actual: 8 + expected: 8 +-------------------- + All tests passed! diff --git a/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_erk_1.out b/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_erk_1.out index 74bc1b6a8d..3851797978 100644 --- a/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_erk_1.out +++ b/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_erk_1.out @@ -815,5 +815,110 @@ Fe RHS evals: expected: 64 -------------------- +======================== +ERK Table ID 22 + stages: 1 + order: 1 + explicit 1st stage: 1 + stiffly accurate: 0 + first same as last: 0 +======================== +-------------------- +Steps: 1 +Fe RHS evals: + actual: 1 + expected: 1 +-------------------- +Steps: 2 +Fe RHS evals: + actual: 2 + expected: 2 +-------------------- +Steps: 3 +Fe RHS evals: + actual: 3 + expected: 3 +-------------------- +Dense Output +Fe RHS evals: + actual: 3 + expected: 3 +-------------------- +Steps: 4 +Fe RHS evals: + actual: 4 + expected: 4 +-------------------- + +======================== +ERK Table ID 23 + stages: 2 + order: 2 + explicit 1st stage: 1 + stiffly accurate: 0 + first same as last: 0 +======================== +-------------------- +Steps: 1 +Fe RHS evals: + actual: 2 + expected: 2 +-------------------- +Steps: 2 +Fe RHS evals: + actual: 4 + expected: 4 +-------------------- +Steps: 3 +Fe RHS evals: + actual: 6 + expected: 6 +-------------------- +Dense Output +Fe RHS evals: + actual: 6 + expected: 6 +-------------------- +Steps: 4 +Fe RHS evals: + actual: 8 + expected: 8 +-------------------- + +======================== +ERK Table ID 24 + stages: 2 + order: 2 + explicit 1st stage: 1 + stiffly accurate: 0 + first same as last: 0 +======================== +-------------------- +Steps: 1 +Fe RHS evals: + actual: 2 + expected: 2 +-------------------- +Steps: 2 +Fe RHS evals: + actual: 4 + expected: 4 +-------------------- +Steps: 3 +Fe RHS evals: + actual: 6 + expected: 6 +-------------------- +Dense Output +Fe RHS evals: + actual: 6 + expected: 6 +-------------------- +Steps: 4 +Fe RHS evals: + actual: 8 + expected: 8 +-------------------- + All tests passed! diff --git a/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_mri.cpp b/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_mri.cpp index 579e76ddef..7e3d20ca84 100644 --- a/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_mri.cpp +++ b/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_mri.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -242,10 +243,8 @@ int run_tests(MRISTEP_METHOD_TYPE type, sunrealtype t0, int nsteps, // Evolve with various IMEX MRI methods // ------------------------------------ - // Methods to test (order most stages to least since reinit does not realloc) - int num_methods; - ARKODE_MRITableID* methods = nullptr; - bool* stiffly_accurate = nullptr; + // Methods to test paired with whether they are stiffly accurate + std::map methods; if (type == MRISTEP_EXPLICIT) { @@ -253,12 +252,14 @@ int run_tests(MRISTEP_METHOD_TYPE type, sunrealtype t0, int nsteps, cout << "Test explicit MRI methods\n"; cout << "=========================\n"; - num_methods = 3; - methods = new ARKODE_MRITableID[num_methods]; - - methods[0] = ARKODE_MIS_KW3; - methods[1] = ARKODE_MRI_GARK_ERK33a; - methods[2] = ARKODE_MRI_GARK_ERK45a; + methods.insert({{"ARKODE_MRI_GARK_FORWARD_EULER", false}, + {"ARKODE_MRI_GARK_ERK22a", false}, + {"ARKODE_MRI_GARK_ERK22b", false}, + {"ARKODE_MRI_GARK_RALSTON2", false}, + {"ARKODE_MIS_KW3", false}, + {"ARKODE_MRI_GARK_ERK33a", false}, + {"ARKODE_MRI_GARK_RALSTON3", false}, + {"ARKODE_MRI_GARK_ERK45a", false}}); } else if (type == MRISTEP_IMPLICIT) { @@ -266,18 +267,11 @@ int run_tests(MRISTEP_METHOD_TYPE type, sunrealtype t0, int nsteps, cout << "Test implicit MRI methods\n"; cout << "=========================\n"; - num_methods = 3; - methods = new ARKODE_MRITableID[num_methods]; - stiffly_accurate = new bool[num_methods]; - - methods[0] = ARKODE_MRI_GARK_IRK21a; - stiffly_accurate[0] = true; - - methods[1] = ARKODE_MRI_GARK_ESDIRK34a; - stiffly_accurate[1] = true; - - methods[2] = ARKODE_MRI_GARK_ESDIRK46a; - stiffly_accurate[2] = true; + methods.insert({{"ARKODE_MRI_GARK_BACKWARD_EULER", true}, + {"ARKODE_MRI_GARK_IRK21a", true}, + {"ARKODE_MRI_GARK_IMPLICIT_MIDPOINT", false}, + {"ARKODE_MRI_GARK_ESDIRK34a", true}, + {"ARKODE_MRI_GARK_ESDIRK46a", true}}); } else if (type == MRISTEP_IMEX) { @@ -285,31 +279,27 @@ int run_tests(MRISTEP_METHOD_TYPE type, sunrealtype t0, int nsteps, cout << "Test IMEX MRI methods\n"; cout << "=====================\n"; - num_methods = 3; - methods = new ARKODE_MRITableID[num_methods]; - stiffly_accurate = new bool[num_methods]; - - methods[0] = ARKODE_IMEX_MRI_GARK3a; - stiffly_accurate[0] = false; - - methods[1] = ARKODE_IMEX_MRI_GARK3b; - stiffly_accurate[1] = false; - - methods[2] = ARKODE_IMEX_MRI_GARK4; - stiffly_accurate[2] = false; + methods.insert({{"ARKODE_IMEX_MRI_GARK_EULER", true}, + {"ARKODE_IMEX_MRI_GARK_TRAPEZOIDAL", false}, + {"ARKODE_IMEX_MRI_GARK_MIDPOINT", false}, + {"ARKODE_IMEX_MRI_GARK3a", false}, + {"ARKODE_IMEX_MRI_GARK3b", false}, + {"ARKODE_IMEX_MRI_GARK4", false}}); } else { return 1; } - for (int i = 0; i < num_methods; i++) + for (const auto& pair : methods) { - cout << "\nTesting method " << i << "\n"; + std::string id = pair.first; + bool stiffly_accurate = pair.second; + cout << "\nTesting method " << id << "\n"; // ------------- // Select method // ------------- // Load method table - MRIStepCoupling C = MRIStepCoupling_LoadTable(methods[i]); + MRIStepCoupling C = MRIStepCoupling_LoadTableByName(id.c_str()); if (check_flag((void*)C, "MRIStepCoupling_LoadTable", 0)) { return 1; } MRIStepCoupling_Write(C, stdout); @@ -415,10 +405,12 @@ int run_tests(MRISTEP_METHOD_TYPE type, sunrealtype t0, int nsteps, cout << "\nComparing Solver Statistics:\n"; + int nstages_evaluated = nstages_stored; + if (stiffly_accurate) nstages_evaluated--; long int fe_evals = 0; if (type == MRISTEP_EXPLICIT || type == MRISTEP_IMEX) { - fe_evals = mri_nst * nstages_stored; + fe_evals = mri_nst * nstages_evaluated; } if (mri_nfse != fe_evals) @@ -430,17 +422,7 @@ int run_tests(MRISTEP_METHOD_TYPE type, sunrealtype t0, int nsteps, long int fi_evals = 0; if (type == MRISTEP_IMPLICIT || type == MRISTEP_IMEX) { - if (stiffly_accurate[i]) - { - // The last stage is implicit so it does not correspond to a column of - // zeros in the coupling matrix and is counted in "nstages_stored" - // however we do not evaluate the RHS functions after the solve since - // the methods is "FSAL" (the index map value and allocated space is - // used in the nonlinear for this stage). The RHS functions will be - // evaluated and stored at the start of the next step. - fi_evals = mri_nst * (nstages_stored - 1) + mri_nni; - } - else { fi_evals = mri_nst * nstages_stored + mri_nni; } + fi_evals = mri_nst * nstages_evaluated + mri_nni; } if (mri_nfsi != fi_evals) @@ -493,8 +475,6 @@ int run_tests(MRISTEP_METHOD_TYPE type, sunrealtype t0, int nsteps, SUNMatDestroy(A); } N_VDestroy(y); - delete[] methods; - delete[] stiffly_accurate; return numfails; } diff --git a/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_mri.out b/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_mri.out index 5e7243e3e8..e5f2a9b602 100644 --- a/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_mri.out +++ b/test/unit_tests/arkode/CXX_serial/ark_test_dahlquist_mri.out @@ -12,7 +12,7 @@ Dahlquist ODE test problem: Test explicit MRI methods ========================= -Testing method 0 +Testing method ARKODE_MIS_KW3 nmat = 1 stages = 4 method order (q) = 3 @@ -38,7 +38,57 @@ MRIStep Statistics: Comparing Solver Statistics: All checks passed -Testing method 1 +Testing method ARKODE_MRI_GARK_ERK22a + nmat = 1 + stages = 3 + method order (q) = 2 + embedding order (p) = 0 + c = 0 0.5 1 + W[0] = + 0 0 0 + 0.5 0 0 + -0.5 1 0 + + Stored stages = 2 + +MRIStep Statistics: + Time = 0.01 + y(t) = 0.980199 + y_n = 0.980199 + Error = -4.95647e-07 + Steps = 1 + Fe evals = 2 + Fi evals = 0 + +Comparing Solver Statistics: +All checks passed + +Testing method ARKODE_MRI_GARK_ERK22b + nmat = 1 + stages = 3 + method order (q) = 2 + embedding order (p) = 0 + c = 0 1 1 + W[0] = + 0 0 0 + 1 0 0 + -0.5 0.5 0 + + Stored stages = 2 + +MRIStep Statistics: + Time = 0.01 + y(t) = 0.980199 + y_n = 0.980199 + Error = -4.95856e-07 + Steps = 1 + Fe evals = 2 + Fi evals = 0 + +Comparing Solver Statistics: +All checks passed + +Testing method ARKODE_MRI_GARK_ERK33a nmat = 2 stages = 4 method order (q) = 3 @@ -70,7 +120,7 @@ MRIStep Statistics: Comparing Solver Statistics: All checks passed -Testing method 2 +Testing method ARKODE_MRI_GARK_ERK45a nmat = 2 stages = 6 method order (q) = 4 @@ -106,28 +156,109 @@ MRIStep Statistics: Comparing Solver Statistics: All checks passed +Testing method ARKODE_MRI_GARK_FORWARD_EULER + nmat = 1 + stages = 2 + method order (q) = 1 + embedding order (p) = 0 + c = 0 1 + W[0] = + 0 0 + 1 0 + + Stored stages = 1 + +MRIStep Statistics: + Time = 0.01 + y(t) = 0.980199 + y_n = 0.9801 + Error = 9.90058e-05 + Steps = 1 + Fe evals = 1 + Fi evals = 0 + +Comparing Solver Statistics: +All checks passed + +Testing method ARKODE_MRI_GARK_RALSTON2 + nmat = 1 + stages = 3 + method order (q) = 2 + embedding order (p) = 0 + c = 0 0.6666666666666666 1 + W[0] = + 0 0 0 + 0.6666666666666666 0 0 + -0.4166666666666666 0.75 0 + + Stored stages = 2 + +MRIStep Statistics: + Time = 0.01 + y(t) = 0.980199 + y_n = 0.980199 + Error = -4.9567e-07 + Steps = 1 + Fe evals = 2 + Fi evals = 0 + +Comparing Solver Statistics: +All checks passed + +Testing method ARKODE_MRI_GARK_RALSTON3 + nmat = 2 + stages = 4 + method order (q) = 3 + embedding order (p) = 0 + c = 0 0.5 0.75 1 + W[0] = + 0 0 0 0 + 0.5 0 0 0 + -2.75 3 0 0 + 1.305555555555556 -0.1666666666666667 -0.8888888888888888 0 + + W[1] = + 0 0 0 0 + 0 0 0 0 + 4.5 -4.5 0 0 + -2.166666666666667 -0.5 2.666666666666667 0 + + Stored stages = 3 + +MRIStep Statistics: + Time = 0.01 + y(t) = 0.980199 + y_n = 0.980199 + Error = 1.72143e-09 + Steps = 1 + Fe evals = 3 + Fi evals = 0 + +Comparing Solver Statistics: +All checks passed + ========================= Test implicit MRI methods ========================= -Testing method 0 +Testing method ARKODE_MRI_GARK_BACKWARD_EULER nmat = 1 stages = 3 - method order (q) = 2 + method order (q) = 1 embedding order (p) = 0 c = 0 1 1 G[0] = 0 0 0 1 0 0 - -0.5 0 0.5 + -1 0 1 Stored stages = 2 MRIStep Statistics: Time = 0.01 y(t) = 0.980199 - y_n = 0.980199 - Error = -8.22598e-10 + y_n = 0.980297 + Error = -9.80272e-05 Steps = 1 Fe evals = 0 Fi evals = 2 @@ -140,7 +271,7 @@ MRIStep Statistics: Comparing Solver Statistics: All checks passed -Testing method 1 +Testing method ARKODE_MRI_GARK_ESDIRK34a nmat = 1 stages = 7 method order (q) = 3 @@ -174,7 +305,7 @@ MRIStep Statistics: Comparing Solver Statistics: All checks passed -Testing method 2 +Testing method ARKODE_MRI_GARK_ESDIRK46a nmat = 2 stages = 11 method order (q) = 4 @@ -225,11 +356,72 @@ MRIStep Statistics: Comparing Solver Statistics: All checks passed +Testing method ARKODE_MRI_GARK_IMPLICIT_MIDPOINT + nmat = 1 + stages = 4 + method order (q) = 2 + embedding order (p) = 0 + c = 0 0.5 0.5 1 + G[0] = + 0 0 0 0 + 0.5 0 0 0 + -0.5 0 0.5 0 + 0 0 0.5 0 + + Stored stages = 2 + +MRIStep Statistics: + Time = 0.01 + y(t) = 0.980199 + y_n = 0.980199 + Error = 1.2304e-07 + Steps = 1 + Fe evals = 0 + Fi evals = 3 + NLS iters = 1 + NLS fails = 0 + LS setups = 1 + LS Fi evals = 0 + Ji evals = 1 + +Comparing Solver Statistics: +All checks passed + +Testing method ARKODE_MRI_GARK_IRK21a + nmat = 1 + stages = 3 + method order (q) = 2 + embedding order (p) = 0 + c = 0 1 1 + G[0] = + 0 0 0 + 1 0 0 + -0.5 0 0.5 + + Stored stages = 2 + +MRIStep Statistics: + Time = 0.01 + y(t) = 0.980199 + y_n = 0.980199 + Error = -8.22598e-10 + Steps = 1 + Fe evals = 0 + Fi evals = 2 + NLS iters = 1 + NLS fails = 0 + LS setups = 1 + LS Fi evals = 0 + Ji evals = 1 + +Comparing Solver Statistics: +All checks passed + ===================== Test IMEX MRI methods ===================== -Testing method 0 +Testing method ARKODE_IMEX_MRI_GARK3a nmat = 1 stages = 8 method order (q) = 3 @@ -274,7 +466,7 @@ MRIStep Statistics: Comparing Solver Statistics: All checks passed -Testing method 1 +Testing method ARKODE_IMEX_MRI_GARK3b nmat = 1 stages = 8 method order (q) = 3 @@ -319,7 +511,7 @@ MRIStep Statistics: Comparing Solver Statistics: All checks passed -Testing method 2 +Testing method ARKODE_IMEX_MRI_GARK4 nmat = 2 stages = 12 method order (q) = 4 @@ -400,5 +592,114 @@ MRIStep Statistics: Comparing Solver Statistics: All checks passed +Testing method ARKODE_IMEX_MRI_GARK_EULER + nmat = 1 + stages = 3 + method order (q) = 1 + embedding order (p) = 0 + c = 0 1 1 + W[0] = + 0 0 0 + 1 0 0 + 0 0 0 + + G[0] = + 0 0 0 + 1 0 0 + -1 0 1 + + Stored stages = 2 + +MRIStep Statistics: + Time = 0.01 + y(t) = 0.970446 + y_n = 0.970445 + Error = 4.82806e-07 + Steps = 1 + Fe evals = 1 + Fi evals = 2 + NLS iters = 1 + NLS fails = 0 + LS setups = 1 + LS Fi evals = 0 + Ji evals = 1 + +Comparing Solver Statistics: +All checks passed + +Testing method ARKODE_IMEX_MRI_GARK_MIDPOINT + nmat = 1 + stages = 4 + method order (q) = 2 + embedding order (p) = 0 + c = 0 0.5 0.5 1 + W[0] = + 0 0 0 0 + 0.5 0 0 0 + 0 0 0 0 + -0.5 0 1 0 + + G[0] = + 0 0 0 0 + 0.5 0 0 0 + -0.5 0 0.5 0 + 0 0 0.5 0 + + Stored stages = 2 + +MRIStep Statistics: + Time = 0.01 + y(t) = 0.970446 + y_n = 0.970446 + Error = -8.01486e-07 + Steps = 1 + Fe evals = 2 + Fi evals = 3 + NLS iters = 1 + NLS fails = 0 + LS setups = 1 + LS Fi evals = 0 + Ji evals = 1 + +Comparing Solver Statistics: +All checks passed + +Testing method ARKODE_IMEX_MRI_GARK_TRAPEZOIDAL + nmat = 1 + stages = 4 + method order (q) = 2 + embedding order (p) = 0 + c = 0 1 1 1 + W[0] = + 0 0 0 0 + 1 0 0 0 + 0 0 0 0 + -0.5 0 0.5 0 + + G[0] = + 0 0 0 0 + 1 0 0 0 + -0.5 0 0.5 0 + 0 0 0 0 + + Stored stages = 2 + +MRIStep Statistics: + Time = 0.01 + y(t) = 0.970446 + y_n = 0.970447 + Error = -9.8759e-07 + Steps = 1 + Fe evals = 2 + Fi evals = 3 + NLS iters = 1 + NLS fails = 0 + LS setups = 1 + LS Fi evals = 0 + Ji evals = 1 + +Comparing Solver Statistics: +All checks passed + All tests passed!