|
7 | 7 |
|
8 | 8 | from conftest import assert_blocking, assert_structure, opts_tiling, skipif |
9 | 9 | from devito import ( # noqa |
10 | | - Buffer, ConditionalDimension, Constant, CustomDimension, DefaultDimension, Dimension, |
11 | | - Eq, Function, Ge, Grid, Gt, Inc, Le, Lt, Ne, Operator, SpaceDimension, SparseFunction, |
12 | | - SparseTimeFunction, SubDimension, SubDomain, TimeFunction, configuration, dimensions, |
13 | | - floor, norm, sin, sum, switchconfig |
| 10 | + Buffer, CondEq, ConditionalDimension, Constant, CustomDimension, DefaultDimension, |
| 11 | + Dimension, Eq, Function, Ge, Grid, Gt, Inc, Le, Lt, Ne, Operator, SpaceDimension, |
| 12 | + SparseFunction, SparseTimeFunction, SubDimension, SubDomain, TimeFunction, |
| 13 | + configuration, dimensions, floor, norm, sin, sum, switchconfig |
14 | 14 | ) |
15 | 15 | from devito.exceptions import InvalidArgument |
16 | 16 | from devito.ir import SymbolRegistry |
@@ -2074,6 +2074,39 @@ def test_factor_and_condition(self): |
2074 | 2074 | for t in range(buffer_size): |
2075 | 2075 | assert np.all(usaved.data[t] == t*factor + bounds[0] - 1) |
2076 | 2076 |
|
| 2077 | + @pytest.mark.parametrize('factor', [1, 2, 3]) |
| 2078 | + @pytest.mark.parametrize('relation', [Or, 'strict']) |
| 2079 | + def test_factor_and_condeq_overlap(self, factor, relation): |
| 2080 | + """ |
| 2081 | + A snapshot at `t == nt - 1` via an implicit CondEq ConditionalDimension |
| 2082 | + only adds an extra slot when `nt - 1` is not on the subsampling grid. |
| 2083 | + Otherwise it must write the slot of the subsampled point, rather than |
| 2084 | + shift past it (and out of bounds for `factor == 1`). |
| 2085 | + """ |
| 2086 | + grid = Grid(shape=(4, 4)) |
| 2087 | + time = grid.time_dim |
| 2088 | + |
| 2089 | + nt = 10 |
| 2090 | + last = nt - 1 |
| 2091 | + nsave = (last + factor - 1) // factor + 1 |
| 2092 | + |
| 2093 | + ctsnap = ConditionalDimension(name='ctsnap', parent=time, |
| 2094 | + condition=CondEq(time, last), |
| 2095 | + relation=relation) |
| 2096 | + ct0 = ConditionalDimension(name='ct0', parent=time, factor=factor, |
| 2097 | + relation=Or) |
| 2098 | + |
| 2099 | + u = TimeFunction(name='u', grid=grid, save=nt) |
| 2100 | + usave = TimeFunction(name='usave', grid=grid, time_dim=ct0, save=nsave) |
| 2101 | + u.data[:] = np.arange(nt).reshape(nt, 1, 1) |
| 2102 | + |
| 2103 | + Operator(Eq(usave, u))(time_m=0, time_M=last - 1) |
| 2104 | + Operator(Eq(usave, u, implicit_dims=ctsnap))(time_m=last, time_M=last) |
| 2105 | + |
| 2106 | + expected = factor * np.arange(nsave) |
| 2107 | + expected[-1] = last |
| 2108 | + assert np.all(usave.data[:, 1, 1] == expected) |
| 2109 | + |
2077 | 2110 | def test_blocking_w_guard(self): |
2078 | 2111 | grid = Grid(shape=(8, 8, 8)) |
2079 | 2112 | x, y, z = grid.dimensions |
|
0 commit comments