ida 0.1.1

A pure Rust port of the Implicit Differential-Algebraic solver from the Sundials suite.
Documentation
use super::*;

#[test]
fn test_restore1() {
    let problem = Dummy {};
    let mut ida: Ida<_, linear::Dense<_>, nonlinear::Newton<_>, _> = Ida::new(
        problem,
        array![0., 0., 0.],
        array![0., 0., 0.],
        TolControlSS::new(1e-4, 1e-4),
    );

    let saved_t = 1.2123749601869230e-03;

    // Set preconditions:
    {
        ida.nlp.ida_tn = 1.9051606517223076e-03;
        ida.ida_ns = 1;
        ida.ida_kk = 2;
        ida.ida_hh = 6.9278569153538464e-04;
        #[rustfmt::skip]
            ida.ida_phi.assign(&array![
                [ 9.9995150785077214e-01, 3.2239271870584518e-05, 1.6252877357362511e-05, ],
                [ -2.7707635503825098e-05, 9.7313256739903617e-06, 1.7976309829765466e-05, ],
                [ 3.4935651154088256e-09, -1.0880124117276491e-05, 1.0876630551341415e-05, ],
                [ 5.6694097544747856e-10, 2.1378758881496850e-08, -2.1945701078189652e-08, ],
                [ -1.3875550771817554e-10, 1.3559268269012917e-06, -1.3557880688400603e-06, ],
                [ -1.1465196356066767e-10, 2.0021935974335382e-07, -2.0010470777979317e-07, ]
            ]);
        ida.ida_psi.assign(&array![
            6.9278569153538464e-04,
            1.0391785373030770e-03,
            1.3855713830707693e-03,
            7.7938390297730776e-04,
            3.4639284576769232e-04,
            0.0000000000000000e+00
        ]);
        ida.ida_cvals.assign(&array![
            1.0000000000000000e+00,
            1.0000000000000000e+00,
            1.0000000000000000e+00,
            0.0000000000000000e+00,
            0.0000000000000000e+00,
            0.0000000000000000e+00
        ]);
        ida.ida_beta.assign(&array![
            1.0000000000000000e+00,
            2.0000000000000000e+00,
            3.0000000000000000e+00,
            4.8000000000000007e+00,
            1.5000000000000000e+01,
            0.0000000000000000e+00
        ]);
    }

    // Call the function under test
    ida.restore(saved_t);

    //--- IDARestore After: saved_t=1.2123749601869230e-03 tn=1.2123749601869230e-03 ns=1 kk=2
    #[rustfmt::skip]
        let phi_after = array![
            [ 9.9995150785077214e-01, 3.2239271870584518e-05, 1.6252877357362511e-05, ],
            [ -1.3853817751912549e-05, 4.8656628369951808e-06, 8.9881549148827332e-06, ],
            [ 1.1645217051362752e-09, -3.6267080390921635e-06, 3.6255435171138049e-06, ],
            [ 5.6694097544747856e-10, 2.1378758881496850e-08, -2.1945701078189652e-08, ],
            [ -1.3875550771817554e-10, 1.3559268269012917e-06, -1.3557880688400603e-06, ],
            [ -1.1465196356066767e-10, 2.0021935974335382e-07, -2.0010470777979317e-07, ]
        ];
    let psi_after = array![
        3.4639284576769237e-04,
        6.9278569153538464e-04,
        1.3855713830707693e-03,
        7.7938390297730776e-04,
        3.4639284576769232e-04,
        0.0000000000000000e+00
    ];
    let cvals_after = array![
        5.0000000000000000e-01,
        3.3333333333333331e-01,
        1.0000000000000000e+00,
        0.0000000000000000e+00,
        0.0000000000000000e+00,
        0.0000000000000000e+00
    ];
    let beta_after = array![
        1.0000000000000000e+00,
        2.0000000000000000e+00,
        3.0000000000000000e+00,
        4.8000000000000007e+00,
        1.5000000000000000e+01,
        0.0000000000000000e+00
    ];

    assert_nearly_eq!(ida.nlp.ida_tn, saved_t);
    assert_eq!(ida.ida_ns, 1);
    assert_eq!(ida.ida_kk, 2);
    assert_nearly_eq!(ida.ida_cvals, cvals_after);
    assert_nearly_eq!(ida.ida_beta, beta_after);
    assert_nearly_eq!(ida.ida_psi, psi_after);
    assert_nearly_eq!(ida.ida_phi, phi_after);
}