xref: /libCEED/python/tests/test-2-elemrestriction.py (revision c3a5a6094aa370d9b1d225615082a3e1f73f831f)
10ef72598Sjeremylt# Copyright (c) 2017, Lawrence Livermore National Security, LLC. Produced at
20ef72598Sjeremylt# the Lawrence Livermore National Laboratory. LLNL-CODE-734707. All Rights
30ef72598Sjeremylt# reserved. See files LICENSE and NOTICE for details.
40ef72598Sjeremylt#
50ef72598Sjeremylt# This file is part of CEED, a collection of benchmarks, miniapps, software
60ef72598Sjeremylt# libraries and APIs for efficient high-order finite element and spectral
70ef72598Sjeremylt# element discretizations for exascale applications. For more information and
80ef72598Sjeremylt# source code availability see http://github.com/ceed.
90ef72598Sjeremylt#
100ef72598Sjeremylt# The CEED research is supported by the Exascale Computing Project 17-SC-20-SC,
110ef72598Sjeremylt# a collaborative effort of two U.S. Department of Energy organizations (Office
120ef72598Sjeremylt# of Science and the National Nuclear Security Administration) responsible for
130ef72598Sjeremylt# the planning and preparation of a capable exascale ecosystem, including
140ef72598Sjeremylt# software, applications, hardware, advanced system engineering and early
150ef72598Sjeremylt# testbed platforms, in support of the nation's exascale computing imperative.
160ef72598Sjeremylt
170ef72598Sjeremylt# @file
180ef72598Sjeremylt# Test Ceed ElemRestriction functionality
190ef72598Sjeremylt
200ef72598Sjeremyltimport os
210ef72598Sjeremyltimport libceed
220ef72598Sjeremyltimport numpy as np
230ef72598Sjeremyltimport check
240ef72598Sjeremylt
250ef72598Sjeremylt# -------------------------------------------------------------------------------
260ef72598Sjeremylt# Test creation, use, and destruction of an element restriction
270ef72598Sjeremylt# -------------------------------------------------------------------------------
280ef72598Sjeremylt
290ef72598Sjeremylt
300ef72598Sjeremyltdef test_200(ceed_resource):
310ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
320ef72598Sjeremylt
33*c3a5a609SJeremy L Thompson    num_elem = 3
340ef72598Sjeremylt
35*c3a5a609SJeremy L Thompson    x = ceed.Vector(num_elem + 1)
36*c3a5a609SJeremy L Thompson    a = np.arange(10, 10 + num_elem + 1, dtype="float64")
370ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
380ef72598Sjeremylt
39*c3a5a609SJeremy L Thompson    ind = np.zeros(2 * num_elem, dtype="int32")
40*c3a5a609SJeremy L Thompson    for i in range(num_elem):
410ef72598Sjeremylt        ind[2 * i + 0] = i
420ef72598Sjeremylt        ind[2 * i + 1] = i + 1
43*c3a5a609SJeremy L Thompson    r = ceed.ElemRestriction(num_elem, 2, 1, 1, num_elem + 1, ind,
440ef72598Sjeremylt                             cmode=libceed.USE_POINTER)
450ef72598Sjeremylt
46*c3a5a609SJeremy L Thompson    y = ceed.Vector(2 * num_elem)
470ef72598Sjeremylt    y.set_value(0)
480ef72598Sjeremylt
490ef72598Sjeremylt    r.apply(x, y)
500ef72598Sjeremylt
510ef72598Sjeremylt    with y.array_read() as y_array:
52*c3a5a609SJeremy L Thompson        for i in range(2 * num_elem):
530ef72598Sjeremylt            assert 10 + (i + 1) // 2 == y_array[i]
540ef72598Sjeremylt
550ef72598Sjeremylt# -------------------------------------------------------------------------------
560ef72598Sjeremylt# Test creation, use, and destruction of a strided element restriction
570ef72598Sjeremylt# -------------------------------------------------------------------------------
580ef72598Sjeremylt
590ef72598Sjeremylt
600ef72598Sjeremyltdef test_201(ceed_resource):
610ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
620ef72598Sjeremylt
63*c3a5a609SJeremy L Thompson    num_elem = 3
640ef72598Sjeremylt
65*c3a5a609SJeremy L Thompson    x = ceed.Vector(2 * num_elem)
66*c3a5a609SJeremy L Thompson    a = np.arange(10, 10 + 2 * num_elem, dtype="float64")
670ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
680ef72598Sjeremylt
690ef72598Sjeremylt    strides = np.array([1, 2, 2], dtype="int32")
70*c3a5a609SJeremy L Thompson    r = ceed.StridedElemRestriction(num_elem, 2, 1, 2 * num_elem, strides)
710ef72598Sjeremylt
72*c3a5a609SJeremy L Thompson    y = ceed.Vector(2 * num_elem)
730ef72598Sjeremylt    y.set_value(0)
740ef72598Sjeremylt
750ef72598Sjeremylt    r.apply(x, y)
760ef72598Sjeremylt
770ef72598Sjeremylt    with y.array_read() as y_array:
78*c3a5a609SJeremy L Thompson        for i in range(2 * num_elem):
790ef72598Sjeremylt            assert 10 + i == y_array[i]
800ef72598Sjeremylt
810ef72598Sjeremylt# -------------------------------------------------------------------------------
820ef72598Sjeremylt# Test creation and destruction of a blocked element restriction
830ef72598Sjeremylt# -------------------------------------------------------------------------------
840ef72598Sjeremylt
850ef72598Sjeremylt
860ef72598Sjeremyltdef test_202(ceed_resource, capsys):
870ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
880ef72598Sjeremylt
89*c3a5a609SJeremy L Thompson    num_elem = 8
90*c3a5a609SJeremy L Thompson    elem_size = 2
91*c3a5a609SJeremy L Thompson    num_blk = 2
92*c3a5a609SJeremy L Thompson    blk_size = 5
930ef72598Sjeremylt
94*c3a5a609SJeremy L Thompson    x = ceed.Vector(num_elem + 1)
95*c3a5a609SJeremy L Thompson    a = np.arange(10, 10 + num_elem + 1, dtype="float64")
96*c3a5a609SJeremy L Thompson    x.set_array(a, cmode=libceed.COPY_VALUES)
970ef72598Sjeremylt
98*c3a5a609SJeremy L Thompson    ind = np.zeros(2 * num_elem, dtype="int32")
99*c3a5a609SJeremy L Thompson    for i in range(num_elem):
1000ef72598Sjeremylt        ind[2 * i + 0] = i
1010ef72598Sjeremylt        ind[2 * i + 1] = i + 1
102*c3a5a609SJeremy L Thompson    r = ceed.BlockedElemRestriction(num_elem, elem_size, blk_size, 1, 1,
103*c3a5a609SJeremy L Thompson                                    num_elem + 1, ind, cmode=libceed.COPY_VALUES)
1040ef72598Sjeremylt
105*c3a5a609SJeremy L Thompson    y = ceed.Vector(num_blk * blk_size * elem_size)
1060ef72598Sjeremylt    y.set_value(0)
1070ef72598Sjeremylt
108*c3a5a609SJeremy L Thompson    # NoTranspose
1090ef72598Sjeremylt    r.apply(x, y)
110*c3a5a609SJeremy L Thompson    layout = r.get_layout()
111*c3a5a609SJeremy L Thompson    with y.array_read() as y_array:
112*c3a5a609SJeremy L Thompson        for i in range(elem_size):
113*c3a5a609SJeremy L Thompson            for j in range(1):
114*c3a5a609SJeremy L Thompson                for k in range(num_elem):
115*c3a5a609SJeremy L Thompson                    block = int(k / blk_size)
116*c3a5a609SJeremy L Thompson                    elem = k % blk_size
117*c3a5a609SJeremy L Thompson                    indx = (i * blk_size + elem) * \
118*c3a5a609SJeremy L Thompson                        layout[0] + j * blk_size * layout[1] + \
119*c3a5a609SJeremy L Thompson                        block * blk_size * layout[2]
120*c3a5a609SJeremy L Thompson                assert y_array[indx] == a[ind[k * elem_size + i]]
1210ef72598Sjeremylt
1220ef72598Sjeremylt    x.set_value(0)
1230ef72598Sjeremylt    r.T.apply(y, x)
124*c3a5a609SJeremy L Thompson    with x.array_read() as x_array:
125*c3a5a609SJeremy L Thompson        for i in range(num_elem + 1):
126*c3a5a609SJeremy L Thompson            assert x_array[i] == (10 + i) * (2.0 if i >
127*c3a5a609SJeremy L Thompson                                             0 and i < num_elem else 1.0)
1280ef72598Sjeremylt
1290ef72598Sjeremylt# -------------------------------------------------------------------------------
1300ef72598Sjeremylt# Test creation, use, and destruction of a blocked element restriction
1310ef72598Sjeremylt# -------------------------------------------------------------------------------
1320ef72598Sjeremylt
1330ef72598Sjeremylt
134*c3a5a609SJeremy L Thompsondef test_208(ceed_resource):
1350ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
1360ef72598Sjeremylt
137*c3a5a609SJeremy L Thompson    num_elem = 8
138*c3a5a609SJeremy L Thompson    elem_size = 2
139*c3a5a609SJeremy L Thompson    num_blk = 2
140*c3a5a609SJeremy L Thompson    blk_size = 5
1410ef72598Sjeremylt
142*c3a5a609SJeremy L Thompson    x = ceed.Vector(num_elem + 1)
143*c3a5a609SJeremy L Thompson    a = np.arange(10, 10 + num_elem + 1, dtype="float64")
144*c3a5a609SJeremy L Thompson    x.set_array(a, cmode=libceed.COPY_VALUES)
1450ef72598Sjeremylt
146*c3a5a609SJeremy L Thompson    ind = np.zeros(2 * num_elem, dtype="int32")
147*c3a5a609SJeremy L Thompson    for i in range(num_elem):
1480ef72598Sjeremylt        ind[2 * i + 0] = i
1490ef72598Sjeremylt        ind[2 * i + 1] = i + 1
150*c3a5a609SJeremy L Thompson    r = ceed.BlockedElemRestriction(num_elem, elem_size, blk_size, 1, 1,
151*c3a5a609SJeremy L Thompson                                    num_elem + 1, ind, cmode=libceed.COPY_VALUES)
1520ef72598Sjeremylt
153*c3a5a609SJeremy L Thompson    y = ceed.Vector(blk_size * elem_size)
1540ef72598Sjeremylt    y.set_value(0)
1550ef72598Sjeremylt
156*c3a5a609SJeremy L Thompson    # NoTranspose
1570ef72598Sjeremylt    r.apply_block(1, x, y)
158*c3a5a609SJeremy L Thompson    layout = r.get_layout()
159*c3a5a609SJeremy L Thompson    with y.array_read() as y_array:
160*c3a5a609SJeremy L Thompson        for i in range(elem_size):
161*c3a5a609SJeremy L Thompson            for j in range(1):
162*c3a5a609SJeremy L Thompson                for k in range(blk_size, num_elem):
163*c3a5a609SJeremy L Thompson                    block = int(k / blk_size)
164*c3a5a609SJeremy L Thompson                    elem = k % blk_size
165*c3a5a609SJeremy L Thompson                    indx = (i * blk_size + elem) * layout[0] + j * blk_size * \
166*c3a5a609SJeremy L Thompson                        layout[1] + block * blk_size * \
167*c3a5a609SJeremy L Thompson                        layout[2] - blk_size * elem_size
168*c3a5a609SJeremy L Thompson                assert y_array[indx] == a[ind[k * elem_size + i]]
1690ef72598Sjeremylt
1700ef72598Sjeremylt    x.set_value(0)
1710ef72598Sjeremylt    r.T.apply_block(1, y, x)
172*c3a5a609SJeremy L Thompson    with x.array_read() as x_array:
173*c3a5a609SJeremy L Thompson        for i in range(blk_size, num_elem + 1):
174*c3a5a609SJeremy L Thompson            assert x_array[i] == (10 + i) * (2.0 if i >
175*c3a5a609SJeremy L Thompson                                             blk_size and i < num_elem else 1.0)
1760ef72598Sjeremylt
1770ef72598Sjeremylt# -------------------------------------------------------------------------------
1780ef72598Sjeremylt# Test getting the multiplicity of the indices in an element restriction
1790ef72598Sjeremylt# -------------------------------------------------------------------------------
1800ef72598Sjeremylt
1810ef72598Sjeremylt
1820ef72598Sjeremyltdef test_209(ceed_resource):
1830ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
1840ef72598Sjeremylt
185*c3a5a609SJeremy L Thompson    num_elem = 3
1860ef72598Sjeremylt
187*c3a5a609SJeremy L Thompson    ind = np.zeros(4 * num_elem, dtype="int32")
188*c3a5a609SJeremy L Thompson    for i in range(num_elem):
1890ef72598Sjeremylt        ind[4 * i + 0] = i * 3 + 0
1900ef72598Sjeremylt        ind[4 * i + 1] = i * 3 + 1
1910ef72598Sjeremylt        ind[4 * i + 2] = i * 3 + 2
1920ef72598Sjeremylt        ind[4 * i + 3] = i * 3 + 3
193*c3a5a609SJeremy L Thompson    r = ceed.ElemRestriction(num_elem, 4, 1, 1, 3 * num_elem + 1, ind,
1940ef72598Sjeremylt                             cmode=libceed.USE_POINTER)
1950ef72598Sjeremylt
1960ef72598Sjeremylt    mult = r.get_multiplicity()
1970ef72598Sjeremylt
1980ef72598Sjeremylt    with mult.array_read() as mult_array:
199*c3a5a609SJeremy L Thompson        for i in range(3 * num_elem + 1):
200*c3a5a609SJeremy L Thompson            val = 1 + (1 if (i > 0 and i < 3 * num_elem and i % 3 == 0) else 0)
2010ef72598Sjeremylt            assert val == mult_array[i]
2020ef72598Sjeremylt
2030ef72598Sjeremylt# -------------------------------------------------------------------------------
2040ef72598Sjeremylt# Test creation and view of an element restriction
2050ef72598Sjeremylt# -------------------------------------------------------------------------------
2060ef72598Sjeremylt
2070ef72598Sjeremylt
2080ef72598Sjeremyltdef test_210(ceed_resource, capsys):
2090ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
2100ef72598Sjeremylt
211*c3a5a609SJeremy L Thompson    num_elem = 3
2120ef72598Sjeremylt
213*c3a5a609SJeremy L Thompson    ind = np.zeros(2 * num_elem, dtype="int32")
214*c3a5a609SJeremy L Thompson    for i in range(num_elem):
2150ef72598Sjeremylt        ind[2 * i + 0] = i + 0
2160ef72598Sjeremylt        ind[2 * i + 1] = i + 1
217*c3a5a609SJeremy L Thompson    r = ceed.ElemRestriction(num_elem, 2, 1, 1, num_elem + 1, ind,
2180ef72598Sjeremylt                             cmode=libceed.USE_POINTER)
2190ef72598Sjeremylt
2200ef72598Sjeremylt    print(r)
2210ef72598Sjeremylt
2220ef72598Sjeremylt    stdout, stderr, ref_stdout = check.output(capsys)
2230ef72598Sjeremylt    assert not stderr
2240ef72598Sjeremylt    assert stdout == ref_stdout
2250ef72598Sjeremylt
2260ef72598Sjeremylt# -------------------------------------------------------------------------------
2270ef72598Sjeremylt# Test creation and view of a strided element restriction
2280ef72598Sjeremylt# -------------------------------------------------------------------------------
2290ef72598Sjeremylt
2300ef72598Sjeremylt
2310ef72598Sjeremyltdef test_211(ceed_resource, capsys):
2320ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
2330ef72598Sjeremylt
234*c3a5a609SJeremy L Thompson    num_elem = 3
2350ef72598Sjeremylt
2360ef72598Sjeremylt    strides = np.array([1, 2, 2], dtype="int32")
237*c3a5a609SJeremy L Thompson    r = ceed.StridedElemRestriction(num_elem, 2, 1, num_elem + 1, strides)
2380ef72598Sjeremylt
2390ef72598Sjeremylt    print(r)
2400ef72598Sjeremylt
2410ef72598Sjeremylt    stdout, stderr, ref_stdout = check.output(capsys)
2420ef72598Sjeremylt    assert not stderr
2430ef72598Sjeremylt    assert stdout == ref_stdout
2440ef72598Sjeremylt
2450ef72598Sjeremylt# -------------------------------------------------------------------------------
2460ef72598Sjeremylt# Test creation and view of a blocked strided element restriction
2470ef72598Sjeremylt# -------------------------------------------------------------------------------
2480ef72598Sjeremylt
2490ef72598Sjeremylt
2500ef72598Sjeremyltdef test_212(ceed_resource, capsys):
2510ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
2520ef72598Sjeremylt
253*c3a5a609SJeremy L Thompson    num_elem = 3
2540ef72598Sjeremylt
2550ef72598Sjeremylt    strides = np.array([1, 2, 2], dtype="int32")
256*c3a5a609SJeremy L Thompson    r = ceed.BlockedStridedElemRestriction(
257*c3a5a609SJeremy L Thompson        num_elem, 2, 2, 1, num_elem + 1, strides)
2580ef72598Sjeremylt
2590ef72598Sjeremylt    print(r)
2600ef72598Sjeremylt
2610ef72598Sjeremylt    stdout, stderr, ref_stdout = check.output(capsys)
2620ef72598Sjeremylt    assert not stderr
2630ef72598Sjeremylt    assert stdout == ref_stdout
2640ef72598Sjeremylt
2650ef72598Sjeremylt# -------------------------------------------------------------------------------
266