5.1.5.1. Misuse: Touching, not crossing

Description: Resets whose test_value coincides with a turning point of the test_variable risk missing detection of the reset point.

Note that:

  • all elements are in the same component;

  • the order values of resets are not shown; and

  • the units of variables are not shown.

component: TouchingNotCrossing
  ├─ math: x = sin(t*pi/2)
  ├─ variable: x
  └─ variable: y initially 0
      ├─ reset: rule 1
      │   ├─ when x == 1
      │   └─ then y = 1
      └─ reset: rule 2
          ├─ when x == -1
          └─ then y = 0

See CellML syntax

<variable name="t" units="dimensionless" />
<variable name="x" units="dimensionless" />
<variable name="y" units="dimensionless" initial_value="0" />

<math>
    <apply><eq/>
        <ci>x</ci>
        <apply><sin/>
            <apply><times/>
                <ci>t</ci>
                <apply><divide/>
                    <pi/>
                    <cn cellml:units="dimensionless">2</cn>
                </apply>
            </apply>
        </apply>
    </apply>
</math>

<!-- Reset rule 1: -->
<reset variable="y" test_variable="x">
    <test_value>
        <cn units="cellml:dimensionless">1</cn>
    </test_value>
    <reset_value>
        <cn units="cellml:dimensionless">1</cn>
    </reset_value>
</reset>

<!-- Reset rule 2: -->
<reset variable="y" test_variable="x">
    <test_value>
        <cn units="cellml:dimensionless">-1</cn>
    </test_value>
    <reset_value>
        <cn units="cellml:dimensionless">0</cn>
    </reset_value>
</reset>

A simulation with this model might proceed as follows:

t

0.0

0.1

0.9

1.0

1.1

2.9

3.0

3.3

x

0

0.156

0.988

1

0.988

-0.988

-1

0.988

y

0

0

0

0 → 1

1

1

1 → 0

0

However, it is easy for implementations to “miss” this type of reset in a simulation. For example, the following may occur in an implementation with adaptive step sizes that uses root finding to detect resets (i.e.: by searching for sign changes in x - 1):

t

0.0

0.4

0.9

1.1

1.7

x

0

0.588

0.988

0.988

0.454

y

0

0

0

0

0

0

x - 1

-1

-0.412

-0.12

-0.12

-0.546

This behaviour is expected to be common in implementations. For example, the popular adaptive solver https://computing.llnl.gov/projects/sundials/cvodeCVODE has a root finding mechanism that can be used to implement reset rules, but its documentation explicitly states it is unlikely to find roots where the sign does not change. As a result, this type of reset rule is probably best avoided.

5.1.5.1.1. Suggestions

TODO ?