|
1 | 1 | import numpy as np |
2 | 2 | import pytest |
| 3 | +from sympy import Or |
3 | 4 |
|
4 | 5 | from conftest import skipif |
5 | 6 | from devito import ( |
6 | | - ConditionalDimension, Constant, Eq, Grid, Operator, SubDimension, SubDomain, |
| 7 | + CondEq, ConditionalDimension, Constant, Eq, Grid, Operator, SubDimension, SubDomain, |
7 | 8 | TimeFunction, configuration, switchconfig |
8 | 9 | ) |
9 | 10 | from devito.arch.archinfo import AppleArm |
@@ -751,3 +752,36 @@ def test_buffer_reuse(): |
751 | 752 |
|
752 | 753 | assert all(np.all(usave.data[i-1] == i) for i in range(1, nt + 1)) |
753 | 754 | assert all(np.all(vsave.data[i-1] == i + 1) for i in range(1, nt + 1)) |
| 755 | + |
| 756 | + |
| 757 | +def test_multi_cond(): |
| 758 | + grid = Grid((3, 3)) |
| 759 | + nt = 5 |
| 760 | + |
| 761 | + x, y = grid.dimensions |
| 762 | + |
| 763 | + factor = 2 |
| 764 | + ntmod = (nt - 1) * factor + 1 |
| 765 | + |
| 766 | + ct1 = ConditionalDimension(name="ct1", parent=grid.time_dim, |
| 767 | + factor=factor, relation=Or) |
| 768 | + ctend = ConditionalDimension(name="ctend", parent=grid.time_dim, |
| 769 | + condition=CondEq(grid.time_dim, ntmod - 2), |
| 770 | + relation=Or) |
| 771 | + |
| 772 | + f = TimeFunction(grid=grid, name='f', time_order=0, |
| 773 | + space_order=0, save=nt, time_dim=ct1) |
| 774 | + T = TimeFunction(grid=grid, name='T', time_order=0, space_order=0) |
| 775 | + |
| 776 | + eqs = [Eq(T, grid.time_dim)] |
| 777 | + # this to save times from 0 to nt - 2 |
| 778 | + eqs.append(Eq(f, T)) |
| 779 | + # this to save the last time sample nt - 1 |
| 780 | + eqs.append(Eq(f.forward, T+1, implicit_dims=ctend)) |
| 781 | + |
| 782 | + # run operator with buffering |
| 783 | + op = Operator(eqs, opt=('streaming', 'buffering')) |
| 784 | + op.apply(time_m=0, time_M=ntmod-2) |
| 785 | + |
| 786 | + for i in range(nt): |
| 787 | + assert np.allclose(f.data[i], i*2) |
0 commit comments